diff --git a/public/intl/messages/ar-SA.json b/public/intl/messages/ar-SA.json index 375460426..cdf48aa80 100644 --- a/public/intl/messages/ar-SA.json +++ b/public/intl/messages/ar-SA.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "البيانات المجمعة", "confirm-delete": "هل أنت متأكد من حذف {target}?", - "confirm-leave": "هل أنت متأكد من مغادرة {target}?", - "confirm-remove": "هل انت متأكد من حذف {target}?", + "confirm-leave": "هل أنت متأكد من مغادرة {target}?", + "confirm-remove": "هل انت متأكد من حذف {target}?", "confirm-reset": "هل أنت متأكد من اعادة تعيين الإحصائيات لـ {target}؟", "delete-team-warning": "سيؤدي حذف الفريق أيضًا إلى حذف كافة مواقع الفريق", "delete-website-warning": "سيتم حذف كافة بيانات الموقع.", "error": "حدث خطأ ما.", - "event-log": "{event} في {url}", + "event-log": "{event} في {url}", "forbidden": "Forbidden", "go-to-settings": "الذهاب إلى الإعدادات", "incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "تم حذف المستخدم.", "viewed-page": "شوهدت الصفحة", - "visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}" + "visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}" } } diff --git a/public/intl/messages/be-BY.json b/public/intl/messages/be-BY.json index 8bf5cf12f..b9791cc37 100644 --- a/public/intl/messages/be-BY.json +++ b/public/intl/messages/be-BY.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Сабраныя дадзеныя", "confirm-delete": "Вы дакладна хочаце выдаліць {target}?", - "confirm-leave": "Вы дакладна хочаце пакінуць {target}?", - "confirm-remove": "Вы дакладна хочаце выдаліць {target}?", + "confirm-leave": "Вы дакладна хочаце пакінуць {target}?", + "confirm-remove": "Вы дакладна хочаце выдаліць {target}?", "confirm-reset": "Вы дакладна хочаце скінуць {target} статыстыку?", "delete-team-warning": "Выдаленне каманды таксама выдаліць усе сайты каманды.", "delete-website-warning": "Усе асацыяваныя дадзеныя будуць таксама выдалены.", "error": "Нешта пайшло не так.", - "event-log": "{event} на {url}", + "event-log": "{event} на {url}", "forbidden": "Forbidden", "go-to-settings": "Да налад", "incorrect-username-password": "Некарэктнае імя карыстальніка/пароль.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Карыстальнік выдалены.", "viewed-page": "Праглядзеў старонку", - "visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device}" + "visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device}" } } diff --git a/public/intl/messages/bg-BG.json b/public/intl/messages/bg-BG.json index a3585550e..35f6fd33b 100644 --- a/public/intl/messages/bg-BG.json +++ b/public/intl/messages/bg-BG.json @@ -298,13 +298,13 @@ "bad-request": "Невалидна заявка", "collected-data": "Събрани данни", "confirm-delete": "Сигурни ли сте, че искате да изтриете {target}?", - "confirm-leave": "Сигурни ли сте, че искате да напуснете {target}?", - "confirm-remove": "Сигурни ли сте, че искате да премахнете {target}?", + "confirm-leave": "Сигурни ли сте, че искате да напуснете {target}?", + "confirm-remove": "Сигурни ли сте, че искате да премахнете {target}?", "confirm-reset": "Сигурни ли сте, че искате да нулирате {target}?", "delete-team-warning": "Изтриването на екип ще изтрие и всички уебсайтове създадени от екипа.", "delete-website-warning": "Всички данни за уебсайта ще бъдат изтрити.", "error": "Възникна грешка.", - "event-log": "{event} на {url}", + "event-log": "{event} на {url}", "forbidden": "Забранено", "go-to-settings": "Отидете в настройките", "incorrect-username-password": "Неправилно потребителско име и/или парола.", @@ -338,6 +338,6 @@ "unauthorized": "Неоторизиран достъп", "user-deleted": "Потребителят е изтрит.", "viewed-page": "Страницата е видяна", - "visitor-log": "Посетител от {country}, използващ {browser} на {os} {device}" + "visitor-log": "Посетител от {country}, използващ {browser} на {os} {device}" } } diff --git a/public/intl/messages/bn-BD.json b/public/intl/messages/bn-BD.json index 61ba9651b..41f3553cc 100644 --- a/public/intl/messages/bn-BD.json +++ b/public/intl/messages/bn-BD.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "আপনি কি নিশ্চিত যে আপনি {target} মুছতে চান?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "আপনি কি নিশ্চিত যে আপনি {target} এর পরিসংখ্যান পুনরায় সেট করতে চান?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "সমস্ত সম্পর্কিত ডেটা পাশাপাশি মুছে ফেলা হবে।", "error": "কিছু ভুল হয়েছে।", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "সেটিংস এ যান", "incorrect-username-password": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।" + "visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।" } } diff --git a/public/intl/messages/bs-BA.json b/public/intl/messages/bs-BA.json index a6e3c7118..c451ff8ea 100644 --- a/public/intl/messages/bs-BA.json +++ b/public/intl/messages/bs-BA.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Jeste li sigurni da želite obrisati {target}?", - "confirm-leave": "Jeste li sigurni da želite napustiti {target}?", - "confirm-remove": "Jeste li sigurni da želite ukloniti {target}?", + "confirm-leave": "Jeste li sigurni da želite napustiti {target}?", + "confirm-remove": "Jeste li sigurni da želite ukloniti {target}?", "confirm-reset": "Jeste li sigurni da želite resetovati {target}?", "delete-team-warning": "Brisanje tima će također obrisati sve web stranice tima.", "delete-website-warning": "Svi podaci web stranice biće obrisani.", "error": "Nešto je pošlo po zlu.", - "event-log": "{event} na {url}", + "event-log": "{event} na {url}", "forbidden": "Forbidden", "go-to-settings": "Idi na postavke", "incorrect-username-password": "Pogrešno korisničko ime i/ili šifra.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Korisnik obrisan.", "viewed-page": "Pogledana stranica", - "visitor-log": "Posjetitelj iz {country} koristi {browser} na {os} {device}" + "visitor-log": "Posjetitelj iz {country} koristi {browser} na {os} {device}" } } diff --git a/public/intl/messages/ca-ES.json b/public/intl/messages/ca-ES.json index 18a43e615..710922e31 100644 --- a/public/intl/messages/ca-ES.json +++ b/public/intl/messages/ca-ES.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Dades recol·lectades", "confirm-delete": "Segur que vol esborrar {target}?", - "confirm-leave": "Segur que vol abandonar {target}?", - "confirm-remove": "Segur que vol eliminar {target}?", + "confirm-leave": "Segur que vol abandonar {target}?", + "confirm-remove": "Segur que vol eliminar {target}?", "confirm-reset": "Segur que vol restablir les estadístiques de {target}?", "delete-team-warning": "Al eliminar un equip també s'eliminaran tots els llocs web de l'equip.", "delete-website-warning": "També s'esborraran totes les dades relacionades.", "error": "S'ha produït un error.", - "event-log": "{event} a {url}", + "event-log": "{event} a {url}", "forbidden": "Forbidden", "go-to-settings": "Vés a la configuració", "incorrect-username-password": "Nom d'usuari o contrasenya incorrectes.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Usuari eliminat.", "viewed-page": "Pàgina vista", - "visitor-log": "Visitant de {country} usant {browser} a {os} {device}" + "visitor-log": "Visitant de {country} usant {browser} a {os} {device}" } } diff --git a/public/intl/messages/cs-CZ.json b/public/intl/messages/cs-CZ.json index d5e03a0bb..6ab0fc5e2 100644 --- a/public/intl/messages/cs-CZ.json +++ b/public/intl/messages/cs-CZ.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Opravdu smazat {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Všechna související data budou také smazána.", "error": "Něco se pokazilo.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Jít do nastavení", "incorrect-username-password": "Nesprávné jméno/heslo.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}" + "visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}" } } diff --git a/public/intl/messages/da-DK.json b/public/intl/messages/da-DK.json index 583f07024..187430d1e 100644 --- a/public/intl/messages/da-DK.json +++ b/public/intl/messages/da-DK.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Er du sikker på at du vil slette {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Er du sikker på at du ville nulstille {target}'s statistikker?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Alle tilknyttede data slettes også.", "error": "Noget gik galt.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Gå til betjeningspanel", "incorrect-username-password": "Ugyldigt brugernavn/adgangskode.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Besøgende fra {country} bruger {browser} på {os} {device}" + "visitor-log": "Besøgende fra {country} bruger {browser}{os} {device}" } } diff --git a/public/intl/messages/de-CH.json b/public/intl/messages/de-CH.json index 0698e4725..e69c4ee44 100644 --- a/public/intl/messages/de-CH.json +++ b/public/intl/messages/de-CH.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Gsammleti Date", "confirm-delete": "Sind Sie sich sicher, {target} zlösche?", - "confirm-leave": "Sind Sie sich sicher, {target} zverlah?", - "confirm-remove": "Sind Sie sich sicher, dass Sie {target} wänd entferne?", + "confirm-leave": "Sind Sie sich sicher, {target} zverlah?", + "confirm-remove": "Sind Sie sich sicher, dass Sie {target} wänd entferne?", "confirm-reset": "Sind Sie sicher, dass Sie d Statistike vo {target} zruggsetze wänd?", "delete-team-warning": "Es Team lösche dued ebefalls alli team Websiite lösche.", "delete-website-warning": "Alli dezueghörige Date werded ebefalls glöscht.", "error": "Es isch en Fehler ufträte.", - "event-log": "{event} uf {url}", + "event-log": "{event} uf {url}", "forbidden": "Forbidden", "go-to-settings": "Zu de Istellige", "incorrect-username-password": "Falsches Passwort oder Benutzername.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Bnutzer glöscht.", "viewed-page": "Siite agluegt", - "visitor-log": "Bsuecher us {country} nutzt {browser} uf {os} {device}" + "visitor-log": "Bsuecher us {country} nutzt {browser} uf {os} {device}" } } diff --git a/public/intl/messages/de-DE.json b/public/intl/messages/de-DE.json index 15e760086..255a17fe7 100644 --- a/public/intl/messages/de-DE.json +++ b/public/intl/messages/de-DE.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Gesammelte Daten", "confirm-delete": "Sind Sie sich sicher, {target} zu löschen?", - "confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?", - "confirm-remove": "Sind Sie sicher, {target} zu entfernen?", + "confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?", + "confirm-remove": "Sind Sie sicher, {target} zu entfernen?", "confirm-reset": "Sind Sie sicher, dass Sie die Statistiken von {target} zurücksetzen wollen?", "delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websites löschen.", "delete-website-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.", "error": "Es ist ein Fehler aufgetreten.", - "event-log": "{event} auf {url}", + "event-log": "{event} auf {url}", "forbidden": "Forbidden", "go-to-settings": "Zu den Einstellungen", "incorrect-username-password": "Falsches Passwort oder Benutzername.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Benutzer gelöscht.", "viewed-page": "Seite besucht", - "visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}" + "visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}" } } diff --git a/public/intl/messages/el-GR.json b/public/intl/messages/el-GR.json index a400edae0..5accbb9a9 100644 --- a/public/intl/messages/el-GR.json +++ b/public/intl/messages/el-GR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {target};", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Όλα τα σχετικά δεδομένα θα διαγραφούν επίσης.", "error": "Κάτι πήγε στραβά.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Μεταβείτε στις ρυθμίσεις", "incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitor from {country} using {browser} on {os} {device}" + "visitor-log": "Visitor from {country} using {browser} on {os} {device}" } } diff --git a/public/intl/messages/en-GB.json b/public/intl/messages/en-GB.json index 96a30444b..69d880096 100644 --- a/public/intl/messages/en-GB.json +++ b/public/intl/messages/en-GB.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Are you sure you want to delete {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are you sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "All associated data will be deleted as well.", "error": "Something went wrong.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Go to settings", "incorrect-username-password": "Incorrect username/password.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitor from {country} using {browser} on {os} {device}" + "visitor-log": "Visitor from {country} using {browser} on {os} {device}" } } diff --git a/public/intl/messages/en-US.json b/public/intl/messages/en-US.json index 79c9e284d..95664e4d9 100644 --- a/public/intl/messages/en-US.json +++ b/public/intl/messages/en-US.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Are you sure you want to delete {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are you sure you want to reset {target}?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "All website data will be deleted.", "error": "Something went wrong.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Go to settings", "incorrect-username-password": "Incorrect username and/or password.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitor from {country} using {browser} on {os} {device}" + "visitor-log": "Visitor from {country} using {browser} on {os} {device}" } } diff --git a/public/intl/messages/es-ES.json b/public/intl/messages/es-ES.json index 0396fe0c9..d6431adcc 100644 --- a/public/intl/messages/es-ES.json +++ b/public/intl/messages/es-ES.json @@ -299,13 +299,13 @@ "bad-request": "Bad request", "collected-data": "Datos obtenidos", "confirm-delete": "¿Seguro que quieres eliminar {target}?", - "confirm-leave": "¿Seguro que quieres abandonar {target}?", - "confirm-remove": "¿Estás seguro de que desea eliminar {target}?", + "confirm-leave": "¿Seguro que quieres abandonar {target}?", + "confirm-remove": "¿Estás seguro de que desea eliminar {target}?", "confirm-reset": "¿Seguro que quieres BORRAR las analíticas de {target}?", "delete-team-warning": "Al eliminar un equipo, también se eliminarán todos los sitios web del equipo.", "delete-website-warning": "Toda la información relacionada será eliminada.", "error": "Algo falló.", - "event-log": "{event} en {url}", + "event-log": "{event} en {url}", "forbidden": "Forbidden", "go-to-settings": "Ir a la configuración", "incorrect-username-password": "Nombre de usuario o contraseña incorrectos.", @@ -339,6 +339,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Usuario eliminado.", "viewed-page": "Página vista", - "visitor-log": "Visitante desde {country} usando {browser} en {os} {device}" + "visitor-log": "Visitante desde {country} usando {browser} en {os} {device}" } } diff --git a/public/intl/messages/fa-IR.json b/public/intl/messages/fa-IR.json index a6ffeb125..3213d391e 100644 --- a/public/intl/messages/fa-IR.json +++ b/public/intl/messages/fa-IR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "داده‌های جمع‌آوری شده", "confirm-delete": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید؟", - "confirm-leave": "آیا مطمئن هستید می‌خواهید از {target} خارج شوید؟", - "confirm-remove": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید؟", + "confirm-leave": "آیا مطمئن هستید می‌خواهید از {target} خارج شوید؟", + "confirm-remove": "آیا مطمئن هستید می‌خواهید {target} را حذف کنید؟", "confirm-reset": "آیا مطمئن هستید می‌خواهید {target} را بازنشانی کنید؟", "delete-team-warning": "با حذف تیم، تمامی وب‌سایت‌های تیم هم حذف خواهند شد.", "delete-website-warning": "همه‌ی داده‌های وب‌سایت هم حذف خواهد شد.", "error": "مشکلی پیش آمده است.", - "event-log": "{event} در {url}", + "event-log": "{event} در {url}", "forbidden": "Forbidden", "go-to-settings": "رفتن به تنظیمات", "incorrect-username-password": "نام کاربری / رمز نادرست است.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "کاربر حذف شد.", "viewed-page": "صفحه مشاهده شد", - "visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device}" + "visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device}" } } diff --git a/public/intl/messages/fi-FI.json b/public/intl/messages/fi-FI.json index aa186b255..45a695779 100644 --- a/public/intl/messages/fi-FI.json +++ b/public/intl/messages/fi-FI.json @@ -298,13 +298,13 @@ "bad-request": "Virheellinen pyyntö", "collected-data": "Kerätty data", "confirm-delete": "Haluatko varmasti poistaa sivuston {target}?", - "confirm-leave": "Haluatko varmasti poistua {target}?", - "confirm-remove": "Haluatko varmasti poistaa {target}?", + "confirm-leave": "Haluatko varmasti poistua {target}?", + "confirm-remove": "Haluatko varmasti poistaa {target}?", "confirm-reset": "Haluatko varmasti poistaa sivuston {target} tilastot?", "delete-team-warning": "Tiimin poistaminen poistaa myös kaikki tiimin sivustot.", "delete-website-warning": "Kaikki siihen liittyvät tiedot poistetaan.", "error": "Jotain meni pieleen.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Kielletty", "go-to-settings": "Mene asetuksiin", "incorrect-username-password": "Väärä käyttäjänimi/salasana.", @@ -338,6 +338,6 @@ "unauthorized": "Ei oikeuksia", "user-deleted": "Käyttäjä poistettu.", "viewed-page": "Katsottu sivu", - "visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}" + "visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}" } } diff --git a/public/intl/messages/fo-FO.json b/public/intl/messages/fo-FO.json index fee893230..2e95fbe8e 100644 --- a/public/intl/messages/fo-FO.json +++ b/public/intl/messages/fo-FO.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Ert tú sikkur at tú ynskir at strika {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Øll data ið er knýtt at verður eisini strika.", "error": "Okkurt bleiv gali.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Far til stillingar", "incorrect-username-password": "Skeivt brúkaranavn/loyniorð.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device}" + "visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device}" } } diff --git a/public/intl/messages/fr-FR.json b/public/intl/messages/fr-FR.json index 397d1835b..8b0796cea 100644 --- a/public/intl/messages/fr-FR.json +++ b/public/intl/messages/fr-FR.json @@ -300,13 +300,13 @@ "bad-request": "Bad request", "collected-data": "Donnée collectée", "confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?", - "confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?", - "confirm-remove": "Êtes-vous sûr de vouloir retirer {target} ?", + "confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?", + "confirm-remove": "Êtes-vous sûr de vouloir retirer {target} ?", "confirm-reset": "Êtes-vous sûr de vouloir réinitialiser les statistiques de {target} ?", "delete-team-warning": "Supprimer une équipe supprimera aussi tous les sites de cette équipe.", "delete-website-warning": "Toutes les données associées seront supprimées.", "error": "Un problème est survenu.", - "event-log": "{event} sur {url}", + "event-log": "{event} sur {url}", "forbidden": "Forbidden", "go-to-settings": "Aller aux paramètres", "incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.", @@ -340,6 +340,6 @@ "unauthorized": "Non authorisé!", "user-deleted": "Utilisateur supprimé.", "viewed-page": "Page vue", - "visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}" + "visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}" } } diff --git a/public/intl/messages/ga-ES.json b/public/intl/messages/ga-ES.json index 0d22d73a2..74f63aa8f 100644 --- a/public/intl/messages/ga-ES.json +++ b/public/intl/messages/ga-ES.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Datos recopilados", "confirm-delete": "Estás seguro/a de que queres eliminar {target}?", - "confirm-leave": "Estás seguro/a de que queres deixar {target}?", - "confirm-remove": "Estás seguro/a de que queres eliminar {target}?", + "confirm-leave": "Estás seguro/a de que queres deixar {target}?", + "confirm-remove": "Estás seguro/a de que queres eliminar {target}?", "confirm-reset": "Estás seguro/a de querer restablecer as estatísticas de {target}?", "delete-team-warning": "Eliminar un equipo tamén eliminará tódolos sitios web do equipo.", "delete-website-warning": "Tamén serán borrados tódolos datos asociados.", "error": "Houbo un fallo.", - "event-log": "{event} en {url}", + "event-log": "{event} en {url}", "forbidden": "Forbidden", "go-to-settings": "Ir aos axustes", "incorrect-username-password": "Credenciais incorrectas.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Usuario eliminado.", "viewed-page": "Páxina vista", - "visitor-log": "Visitante desde {country} usando {browser} en {os} {device}" + "visitor-log": "Visitante desde {country} usando {browser} en {os} {device}" } } diff --git a/public/intl/messages/he-IL.json b/public/intl/messages/he-IL.json index 417a8d757..719d74d89 100644 --- a/public/intl/messages/he-IL.json +++ b/public/intl/messages/he-IL.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "האם באמת למחוק את {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "כל המידע המקושר יימחק", "error": "משהו השתבש", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "להדרותג", "incorrect-username-password": "שם משתמש או סיסמה לא נכונים", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device}" + "visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device}" } } diff --git a/public/intl/messages/hi-IN.json b/public/intl/messages/hi-IN.json index d9cae257f..c16491c0a 100644 --- a/public/intl/messages/hi-IN.json +++ b/public/intl/messages/hi-IN.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "क्या आप वाकई में {target} हटाना चाहते हैं?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "सभी संबद्ध डेटा को भी हटा दिया जाएगा।", "error": "कुछ गलत हो गया।", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "समायोजन में जाइए", "incorrect-username-password": "ग़लत उपयोगकर्ता नाम / पासवर्ड।", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर" + "visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर" } } diff --git a/public/intl/messages/hr-HR.json b/public/intl/messages/hr-HR.json index 218d48543..664eaec73 100644 --- a/public/intl/messages/hr-HR.json +++ b/public/intl/messages/hr-HR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Jeste li sigurni da želite obrisati {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Jeste li sigurni da želite resetirati {target}'s statistiku?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "All website data will be deleted.", "error": "Something went wrong.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Idi u postavke", "incorrect-username-password": "Neispravno korisničke ime/lozinka.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitor from {country} using {browser} on {os} {device}" + "visitor-log": "Visitor from {country} using {browser} on {os} {device}" } } diff --git a/public/intl/messages/hu-HU.json b/public/intl/messages/hu-HU.json index b757d567f..4854c86c2 100644 --- a/public/intl/messages/hu-HU.json +++ b/public/intl/messages/hu-HU.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Biztos, hogy törölni szeretnéd {target} elemet?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Minden társított adat törlésre kerül.", "error": "Valami baj történt.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Tovább a beállításokhoz", "incorrect-username-password": "Érvénytelen felhasználónév/jelszó.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből." + "visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből." } } diff --git a/public/intl/messages/id-ID.json b/public/intl/messages/id-ID.json index bb4ecbc0a..a64a3c0e0 100644 --- a/public/intl/messages/id-ID.json +++ b/public/intl/messages/id-ID.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Data dikumpulkan", "confirm-delete": "Apakah kamu yakin ingin menghapus {target}?", - "confirm-leave": "Apakah Anda yakin ingin meninggalkan {target}?", - "confirm-remove": "Apakah Anda yakin ingin menghapus {target}?", + "confirm-leave": "Apakah Anda yakin ingin meninggalkan {target}?", + "confirm-remove": "Apakah Anda yakin ingin menghapus {target}?", "confirm-reset": "Anda yakin ingin mengatur ulang statistik {target}?", "delete-team-warning": "Menghapus tim juga akan menghapus semua situs web yang terkait.", "delete-website-warning": "Semua data terkait juga akan dihapus.", "error": "Ada yang salah.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Pergi ke pengaturan", "incorrect-username-password": "Nama pengguna/kata sandi salah.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Pengguna telah dihapus.", "viewed-page": "Halaman dilihat", - "visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}" + "visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}" } } diff --git a/public/intl/messages/it-IT.json b/public/intl/messages/it-IT.json index c06c1c1ae..b0bceb05a 100644 --- a/public/intl/messages/it-IT.json +++ b/public/intl/messages/it-IT.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Sei sicuro di voler eliminare {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Sei sicuro di voler azzerare le statistiche di {target}?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Saranno eliminati anche tutti i dati associati.", "error": "Si è verificato un errore.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Vai alle impostazioni", "incorrect-username-password": "Username o password non corretti.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Utenti da {country} tramite {browser} su {os} {device}" + "visitor-log": "Utenti da {country} tramite {browser} su {os} {device}" } } diff --git a/public/intl/messages/ja-JP.json b/public/intl/messages/ja-JP.json index 592873107..982de10e3 100644 --- a/public/intl/messages/ja-JP.json +++ b/public/intl/messages/ja-JP.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "収集されたデータ", "confirm-delete": "{target}を削除してもよろしいですか?", - "confirm-leave": "{target}から離脱してもよろしいですか?", - "confirm-remove": "{target}を削除してもよろしいですか?", + "confirm-leave": "{target}から離脱してもよろしいですか?", + "confirm-remove": "{target}を削除してもよろしいですか?", "confirm-reset": "{target}をリセットしてもよろしいですか?", "delete-team-warning": "チームを削除すると、そのチームが管理しているWebサイトもすべて削除されます。", "delete-website-warning": "Webサイトのデータがすべて削除されます。", "error": "未知のエラーが発生しました。", - "event-log": "{url}の{event}", + "event-log": "{url}{event}", "forbidden": "Forbidden", "go-to-settings": "設定に移動する", "incorrect-username-password": "ユーザー名またはパスワードが間違っています。", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "ユーザーが削除されました。", "viewed-page": "閲覧されたページ", - "visitor-log": "{os}({device})で{browser}を使用している{country}からの訪問者" + "visitor-log": "{os}({device})で{browser}を使用している{country}からの訪問者" } } diff --git a/public/intl/messages/km-KH.json b/public/intl/messages/km-KH.json index 1930cbb7a..cf1c8d411 100644 --- a/public/intl/messages/km-KH.json +++ b/public/intl/messages/km-KH.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "ទិន្នន័យដែលបានប្រមូលទុក", "confirm-delete": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?", - "confirm-leave": "តើអ្នកប្រាកដថាចង់ចាកចេញ {target} ទេ?", - "confirm-remove": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?", + "confirm-leave": "តើអ្នកប្រាកដថាចង់ចាកចេញ {target} ទេ?", + "confirm-remove": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?", "confirm-reset": "តើអ្នកប្រាកដថាចង់កំណត់ស្ថិតិរបស់ {target} ឡើងវិញទេ?", "delete-team-warning": "ពេលលុបក្រុម គេហទំព័ររបស់ក្រុមក៏នឹងត្រូវលប់ចោលទាំងអស់ផងដែរ។", "delete-website-warning": "ទិន្នន័យរបស់គេហទំព័រទាំងអស់នឹងត្រូវលុបចោល។", "error": "មាន​អ្វីមួយ​មិន​ប្រក្រតី។", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "ការកំណត់", "incorrect-username-password": "ឈ្មោះអ្នកប្រើឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "អ្នកប្រើប្រាស់ត្រូវបានលុបចោល។", "viewed-page": "ទំព័រដែលបានមើល", - "visitor-log": "អ្នកមើលពីប្រទេស {country} ប្រើប្រាស់កម្មវិធី {browser} លើឧបករណ៍ {os} {device}" + "visitor-log": "អ្នកមើលពីប្រទេស {country} ប្រើប្រាស់កម្មវិធី {browser} លើឧបករណ៍ {os} {device}" } } diff --git a/public/intl/messages/ko-KR.json b/public/intl/messages/ko-KR.json index e0ce4c7a1..176820d4a 100644 --- a/public/intl/messages/ko-KR.json +++ b/public/intl/messages/ko-KR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "수집된 데이터", "confirm-delete": "{target}을(를) 삭제하시겠습니까?", - "confirm-leave": "{target}을(를) 떠나시겠습니까?", - "confirm-remove": "{target}을(를) 제거하시겠습니까?", + "confirm-leave": "{target}을(를) 떠나시겠습니까?", + "confirm-remove": "{target}을(를) 제거하시겠습니까?", "confirm-reset": "{target}을(를) 초기화하시겠습니까?", "delete-team-warning": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다.", "delete-website-warning": "관련된 모든 데이터가 삭제됩니다.", "error": "문제가 발생했습니다.", - "event-log": "{event} - {url}", + "event-log": "{event} - {url}", "forbidden": "Forbidden", "go-to-settings": "설정으로 이동", "incorrect-username-password": "사용자 이름 또는 비밀번호를 잘못 입력했습니다.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "사용자를 삭제했습니다.", "viewed-page": "조회한 페이지", - "visitor-log": "{os} {device}에서 {browser}을(를) 사용하는 {country}의 방문자" + "visitor-log": "{os} {device}에서 {browser}을(를) 사용하는 {country}의 방문자" } } diff --git a/public/intl/messages/lt-LT.json b/public/intl/messages/lt-LT.json index 80e1834c6..1587b78b7 100644 --- a/public/intl/messages/lt-LT.json +++ b/public/intl/messages/lt-LT.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Ar esate tikri, jog norite ištrinti svetainę {target}?", - "confirm-leave": "Ar esate tikri, jog norite palikti {target}?", - "confirm-remove": "Ar esate tikri, jog norite ištrinti {target}?", + "confirm-leave": "Ar esate tikri, jog norite palikti {target}?", + "confirm-remove": "Ar esate tikri, jog norite ištrinti {target}?", "confirm-reset": "Are esate tikri, jog norite atstatyti svetainės {target} statistikos duomenis?", "delete-team-warning": "Ištrinant komandą bus ištrintos ir visos komandos svetainės.", "delete-website-warning": "Visi susiję duomenys taip pat bus ištrinti.", "error": "Kažkas įvyko ne taip.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Eiti į nustatymus", "incorrect-username-password": "Neteisingas vartotojo vardas/slaptažodis.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Vartotojas ištrintas.", "viewed-page": "Viewed page", - "visitor-log": "Lankytojas iš {country}, naudojantis {browser} sistemoje {os} {device}" + "visitor-log": "Lankytojas iš {country}, naudojantis {browser} sistemoje {os} {device}" } } diff --git a/public/intl/messages/mn-MN.json b/public/intl/messages/mn-MN.json index 6700da4f4..f0143b840 100644 --- a/public/intl/messages/mn-MN.json +++ b/public/intl/messages/mn-MN.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Цуглуулсан өгөгдөл", "confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?", - "confirm-leave": "Та {target}-с гарахдаа итгэлтэй байна уу?", - "confirm-remove": "Та {target}-г устгахдаа итгэлтэй байна уу?", + "confirm-leave": "Та {target}-с гарахдаа итгэлтэй байна уу?", + "confirm-remove": "Та {target}-г устгахдаа итгэлтэй байна уу?", "confirm-reset": "Та {target}-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?", "delete-team-warning": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно.", "delete-website-warning": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно.", "error": "Ямар нэг зүйл буруу боллоо.", - "event-log": "{url}-д {event}", + "event-log": "{url}{event}", "forbidden": "Forbidden", "go-to-settings": "Тохиргоо руу очих", "incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Хэрэглэгч устсан.", "viewed-page": "Үзсэн хуудас", - "visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон" + "visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон" } } diff --git a/public/intl/messages/ms-MY.json b/public/intl/messages/ms-MY.json index 005039ea2..c8b3ee831 100644 --- a/public/intl/messages/ms-MY.json +++ b/public/intl/messages/ms-MY.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Pastikah anda ingin memadam {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Semua data yang berkaitan juga akan dihapuskan.", "error": "Ada yang tidak kena.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Pergi ke tetapan", "incorrect-username-password": "Pengguna/kata laluan tidak betul.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Pelawat dari {country} mengguna {browser} pada {os} {device}" + "visitor-log": "Pelawat dari {country} mengguna {browser} pada {os} {device}" } } diff --git a/public/intl/messages/my-MM.json b/public/intl/messages/my-MM.json index 80fd4a18f..1b0893935 100644 --- a/public/intl/messages/my-MM.json +++ b/public/intl/messages/my-MM.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "{target} ကို ဖျက်ရန် သေချာပါသလား?", - "confirm-leave": "{target} ကို ထွက်ရန် သေချာပါသလား?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "{target} ကို ထွက်ရန် သေချာပါသလား?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "{target} ကို ဖျက်၍ပြန်စလုပ်ရန် သေချာပါသလား?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "ဝက်ဘ်ဆိုဒ် ဒေတာအကုန် ဖျက်မည်", "error": "မှားယွင်းမှုတစ်ခု ရှိသွားပါသည်", - "event-log": "{url} တွင် {event}", + "event-log": "{url} တွင် {event}", "forbidden": "Forbidden", "go-to-settings": "ဆက်တင်သို့ သွားရန်", "incorrect-username-password": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားနေသည်", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "အသုံးပြုသူ ဖျက်ပြီးပါပြီ", "viewed-page": "Viewed page", - "visitor-log": "{country} မှ {browser} ဖြင့် {os} {device} တွင် ဝင်ရောက်ကြည့်ရှုသူ" + "visitor-log": "{country} မှ {browser} ဖြင့် {os} {device} တွင် ဝင်ရောက်ကြည့်ရှုသူ" } } diff --git a/public/intl/messages/nb-NO.json b/public/intl/messages/nb-NO.json index 18ee844e8..d0b3606fe 100644 --- a/public/intl/messages/nb-NO.json +++ b/public/intl/messages/nb-NO.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Innsamlede data", "confirm-delete": "Er du sikker på at du vil slette {target}?", - "confirm-leave": "Er du sikker på at du vil forlate {target}?", - "confirm-remove": "Er du sikker på at du vil fjerne {target}?", + "confirm-leave": "Er du sikker på at du vil forlate {target}?", + "confirm-remove": "Er du sikker på at du vil fjerne {target}?", "confirm-reset": "Er du sikker på at du vil nullstille statistikken til {target}?", "delete-team-warning": "Å slette et team vil også slette alle teamets nettsteder.", "delete-website-warning": "Alle tilknyttede data vil også bli slettet.", "error": "Noe gikk galt.", - "event-log": "{event} på {url}", + "event-log": "{event}{url}", "forbidden": "Forbidden", "go-to-settings": "Gå til innstillinger", "incorrect-username-password": "Ugyldig brukernavn/passord.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Bruker slettet.", "viewed-page": "Vist side", - "visitor-log": "Besøkende fra {country} med {browser} på {os} {device}" + "visitor-log": "Besøkende fra {country} med {browser}{os} {device}" } } diff --git a/public/intl/messages/nl-NL.json b/public/intl/messages/nl-NL.json index e671719ef..2d3705165 100644 --- a/public/intl/messages/nl-NL.json +++ b/public/intl/messages/nl-NL.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Weet je zeker dat je {target} wilt verwijderen?", - "confirm-leave": "Weet je zeker dat je {target} wilt verlaten?", - "confirm-remove": "Weet je zeker dat je {target} wilt verwijderen?", + "confirm-leave": "Weet je zeker dat je {target} wilt verlaten?", + "confirm-remove": "Weet je zeker dat je {target} wilt verwijderen?", "confirm-reset": "Weet je zeker dat je de statistieken van {target} opnieuw wilt instellen?", "delete-team-warning": "Als een team wordt verwijderd, worden ook alle websites van dat team verwijderd.", "delete-website-warning": "Alle verwante gegevens zullen ook verwijderd worden.", "error": "Er is iets misgegaan.", - "event-log": "{event} op {url}", + "event-log": "{event} op {url}", "forbidden": "Forbidden", "go-to-settings": "Naar instellingen", "incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Gebruiker verwijderd", "viewed-page": "Bekeken pagina", - "visitor-log": "Bezoeker uit {country} met {browser} op een {os} {device}" + "visitor-log": "Bezoeker uit {country} met {browser} op een {os} {device}" } } diff --git a/public/intl/messages/pl-PL.json b/public/intl/messages/pl-PL.json index 6d3897381..f6507ddd0 100644 --- a/public/intl/messages/pl-PL.json +++ b/public/intl/messages/pl-PL.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Zebrane dane", "confirm-delete": "Czy na pewno chcesz usunąć {target}?", - "confirm-leave": "Czy na pewno chcesz opuścić {target}?", - "confirm-remove": "Czy na pewno chcesz usunąć {target}?", + "confirm-leave": "Czy na pewno chcesz opuścić {target}?", + "confirm-remove": "Czy na pewno chcesz usunąć {target}?", "confirm-reset": "Czy na pewno chcesz zresetować statystyki {target}?", "delete-team-warning": "Usunięcie zespołu usunie wszystkie jego witryny.", "delete-website-warning": "Wszystkie powiązane dane również zostaną usunięte.", "error": "Coś poszło nie tak.", - "event-log": "{event} na {url}", + "event-log": "{event} na {url}", "forbidden": "Forbidden", "go-to-settings": "Przejdź do ustawień", "incorrect-username-password": "Nieprawidłowa nazwa użytkownika lub hasło.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Użytkownik usunięty.", "viewed-page": "Obejrzana strona", - "visitor-log": "Odwiedzający z {country} używa {browser} na {os} {device}" + "visitor-log": "Odwiedzający z {country} używa {browser} na {os} {device}" } } diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json index 510109433..4e7a2c5d0 100644 --- a/public/intl/messages/pt-BR.json +++ b/public/intl/messages/pt-BR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Tem certeza de que deseja excluir {target}?", - "confirm-leave": "Tem certeza de que deseja sair de {target}?", - "confirm-remove": "Tem certeza que deseja remover {target}?", + "confirm-leave": "Tem certeza de que deseja sair de {target}?", + "confirm-remove": "Tem certeza que deseja remover {target}?", "confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?", "delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.", "delete-website-warning": "Todos os dados relacionados serão excluídos.", "error": "Ocorreu um erro.", - "event-log": "{event} em {url}", + "event-log": "{event} em {url}", "forbidden": "Forbidden", "go-to-settings": "Ir para as configurações", "incorrect-username-password": "Nome de usuário ou senha incorretos.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Usuário excluído.", "viewed-page": "Página visualizada", - "visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}." + "visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}." } } diff --git a/public/intl/messages/pt-PT.json b/public/intl/messages/pt-PT.json index 80d3d86d2..6ee8c1971 100644 --- a/public/intl/messages/pt-PT.json +++ b/public/intl/messages/pt-PT.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Tem a certeza que pretende eliminar {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Tem a certeza que pretende restaurar as estatísticas de {target}?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Todos os dados associados também serão eliminados.", "error": "Ocorreu um erro.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Ir para as definições", "incorrect-username-password": "Nome de utilizador/senha incorretos.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitante de {country} a usar {browser} no {device} {os}" + "visitor-log": "Visitante de {country} a usar {browser} no {device} {os}" } } diff --git a/public/intl/messages/ro-RO.json b/public/intl/messages/ro-RO.json index f2e872d1e..7149bc6e9 100644 --- a/public/intl/messages/ro-RO.json +++ b/public/intl/messages/ro-RO.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Date colectate", "confirm-delete": "Ești sigur că vrei să ștergi {target}?", - "confirm-leave": "Ești sigur că vrei să părăsești {target}?", - "confirm-remove": "Ești sigur că vrei să ștergi {target}?", + "confirm-leave": "Ești sigur că vrei să părăsești {target}?", + "confirm-remove": "Ești sigur că vrei să ștergi {target}?", "confirm-reset": "Ești sigur că vrei să resetezi statisticile pentru {target}?", "delete-team-warning": "Ștergerea unei echipe va șterge și toate website-urile echipei.", "delete-website-warning": "Toate datele asociate vor fi șterse, de asemenea.", "error": "Ceva n-a mers bine.", - "event-log": "{event} la {url}", + "event-log": "{event} la {url}", "forbidden": "Forbidden", "go-to-settings": "Mergi la Setări", "incorrect-username-password": "Nume utilizator / parolă incorecte.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Utilizator șters.", "viewed-page": "Pagină vizualizată", - "visitor-log": "Vizitator din {country} folosind {browser} pe {os} {device}" + "visitor-log": "Vizitator din {country} folosind {browser} pe {os} {device}" } } diff --git a/public/intl/messages/ru-RU.json b/public/intl/messages/ru-RU.json index 018dad33c..7a4545905 100644 --- a/public/intl/messages/ru-RU.json +++ b/public/intl/messages/ru-RU.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Собранные данные", "confirm-delete": "Вы уверены, что хотите удалить {target}?", - "confirm-leave": "Вы уверены, что хотите уйти {target}?", - "confirm-remove": "Вы уверены, что хотите удалить {target}?", + "confirm-leave": "Вы уверены, что хотите уйти {target}?", + "confirm-remove": "Вы уверены, что хотите удалить {target}?", "confirm-reset": "Вы уверены, что хотите сбросить статистику {target}?", "delete-team-warning": "При удалении команды будут удалены и все ее веб-сайты.", "delete-website-warning": "Все связанные данные будут также удалены.", "error": "Что-то пошло не так.", - "event-log": "{event} на {url}", + "event-log": "{event} на {url}", "forbidden": "Forbidden", "go-to-settings": "Перейти к настройкам", "incorrect-username-password": "Неверное имя пользователя/пароль.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Пользователь удален.", "viewed-page": "Просмотренная страница", - "visitor-log": "Посетитель из {country} используя {browser} на {os} {device}" + "visitor-log": "Посетитель из {country} используя {browser} на {os} {device}" } } diff --git a/public/intl/messages/si-LK.json b/public/intl/messages/si-LK.json index 2c55b75ee..f05ef473f 100644 --- a/public/intl/messages/si-LK.json +++ b/public/intl/messages/si-LK.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "{target} මකා දැමීම ගැන විශ්වාසද?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "{target} ට අදාල සංඛ්‍යාලේඛන නැවත පිහිටුවීමට අවශ්‍යද?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "All website data will be deleted.", "error": "Something went wrong.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "සැකසීම් වෙත යන්න", "incorrect-username-password": "වැරදි පරිශීලක නාමය/මුරපදය.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Visitor from {country} using {browser} on {os} {device}" + "visitor-log": "Visitor from {country} using {browser} on {os} {device}" } } diff --git a/public/intl/messages/sk-SK.json b/public/intl/messages/sk-SK.json index 722ca525d..c8262b955 100644 --- a/public/intl/messages/sk-SK.json +++ b/public/intl/messages/sk-SK.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Naozaj zmazať {target}?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "Všetky príbuzné data budu tiež zmazané.", "error": "Niečo sa pokazilo.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Ísť do nastavení", "incorrect-username-password": "Nesprávné meno/heslo.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "Návštevník z {country} s prehliadačom {browser} na {os} {device}" + "visitor-log": "Návštevník z {country} s prehliadačom {browser} na {os} {device}" } } diff --git a/public/intl/messages/sl-SI.json b/public/intl/messages/sl-SI.json index 1d882fff2..6b8cd0d3a 100644 --- a/public/intl/messages/sl-SI.json +++ b/public/intl/messages/sl-SI.json @@ -277,13 +277,13 @@ "active-users": "{x} trenutni {x, plural, one {obiskovalec} other {obiskovalcev}}", "collected-data": "Zbrani podatki", "confirm-delete": "Ste prepričani, da želite izbrisati {target}?", - "confirm-leave": "Ste prepričani, da želite zapustiti {target}?", - "confirm-remove": "Ali ste prepričani, da želite odstraniti {target}?", + "confirm-leave": "Ste prepričani, da želite zapustiti {target}?", + "confirm-remove": "Ali ste prepričani, da želite odstraniti {target}?", "confirm-reset": "Ste prepričani, da želite ponastaviti statistiko {target}?", "delete-team-warning": "Brisanje ekipe bo izbrisalo tudi vsa spletna mesta ekipe.", "delete-website-warning": "Izbrisani bodo tudi vsi pripadajoči podatki.", "error": "Nekaj je šlo narobe.", - "event-log": "{event} na {url}", + "event-log": "{event} na {url}", "forbidden": "Forbidden", "go-to-settings": "Pojdi v nastavitve", "incorrect-username-password": "Nepravilno uporabniško ime/geslo.", @@ -316,7 +316,7 @@ "triggered-event": "Sprožen dogodek", "user-deleted": "Uporabnik je izbrisan.", "viewed-page": "Ogledana stran", - "visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device}", + "visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device}", "visitors-dropped-off": "Osip obiskovalcev" } } diff --git a/public/intl/messages/sv-SE.json b/public/intl/messages/sv-SE.json index 0943bb9e1..246f0d03f 100644 --- a/public/intl/messages/sv-SE.json +++ b/public/intl/messages/sv-SE.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Är du säker på att du vill radera {target}?", - "confirm-leave": "Är du säker på att du vill lämna {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Är du säker på att du vill lämna {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Är du säker på att du vill återställa statistiken för {target}?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "All tillhörande data kommer också att raderas.", "error": "Något gick fel.", - "event-log": "{event} på {url}", + "event-log": "{event}{url}", "forbidden": "Forbidden", "go-to-settings": "Gå till inställningar", "incorrect-username-password": "Felaktigt användarnamn/lösenord.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Användaren har raderats.", "viewed-page": "Viewed page", - "visitor-log": "Besökare från {country} med {browser} på {os} {device}" + "visitor-log": "Besökare från {country} med {browser}{os} {device}" } } diff --git a/public/intl/messages/ta-IN.json b/public/intl/messages/ta-IN.json index d0086416d..b334748f1 100644 --- a/public/intl/messages/ta-IN.json +++ b/public/intl/messages/ta-IN.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "நீங்கள் நிச்சயமாக {target} நீக்க விரும்புகிறீர்களா?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "Are your sure you want to reset {target}'s statistics?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "தொடர்புடைய எல்லா தரவும் நீக்கப்படும்.", "error": "ஏதோ தவறு நடந்துவிட்டது.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "அமைப்புகளுக்குச் செல்லவும்", "incorrect-username-password": "தவறான பயனர்பெயர் / கடவுச்சொல்.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "{country}வில் இருந்து பார்வையாளர் {browser} ஐ {os} {device}லில் பயன்படுத்துகிறார்" + "visitor-log": "{country}வில் இருந்து பார்வையாளர் {browser}{os} {device}லில் பயன்படுத்துகிறார்" } } diff --git a/public/intl/messages/th-TH.json b/public/intl/messages/th-TH.json index cee5b7c91..bd9861db2 100644 --- a/public/intl/messages/th-TH.json +++ b/public/intl/messages/th-TH.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "คุณแน่ใจหรือไม่ว่าต้องการลบ {target} ?", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "คุณแน่ใจหรือไม่ว่าต้องการรีเซตข้อมูลสถิติของ {target} ?", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบ.", "error": "เกิดข้อผิดพลาด.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "ไปที่การตั้งค่า", "incorrect-username-password": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "ผู้เข้าชมจาก {country} กำลังใช้งานผ่าน {browser} บน {os} {device}" + "visitor-log": "ผู้เข้าชมจาก {country} กำลังใช้งานผ่าน {browser} บน {os} {device}" } } diff --git a/public/intl/messages/tr-TR.json b/public/intl/messages/tr-TR.json index 41d77d579..2835afeb3 100644 --- a/public/intl/messages/tr-TR.json +++ b/public/intl/messages/tr-TR.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "{target} kaydını silmek istediğinizden emin misiniz?", - "confirm-leave": "{target} kaydından ayrılmak istediğinizden emin misiniz?", - "confirm-remove": "{target} kaydını kaldırmak istediğinizden emin misiniz?", + "confirm-leave": "{target} kaydından ayrılmak istediğinizden emin misiniz?", + "confirm-remove": "{target} kaydını kaldırmak istediğinizden emin misiniz?", "confirm-reset": "{target} istatistiklerini sıfırlamak istediğinizden emin misiniz?", "delete-team-warning": "Bir takımı silmek tüm takım web sitelerini de silecektir.", "delete-website-warning": "İlişkili tüm veriler de silinecektir.", "error": "Bir şeyler ters gitti!", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "Ayarlara git", "incorrect-username-password": "Hatalı kullanıcı adı ya da parola.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Kullanıcı silindi.", "viewed-page": "Görüntülenen sayfa", - "visitor-log": "Yeni ziyaretçi: {country}, {os}, {device}, {browser}" + "visitor-log": "Yeni ziyaretçi: {country}, {os}, {device}, {browser}" } } diff --git a/public/intl/messages/uk-UA.json b/public/intl/messages/uk-UA.json index 6946b19db..69575216a 100644 --- a/public/intl/messages/uk-UA.json +++ b/public/intl/messages/uk-UA.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "Ви впевнені, що бажаєте видалити {target}?", - "confirm-leave": "Ви впевнені, що бажаєте покинути {target}?", - "confirm-remove": "Ви впевнені, що бажаєте видалити {target}?", + "confirm-leave": "Ви впевнені, що бажаєте покинути {target}?", + "confirm-remove": "Ви впевнені, що бажаєте видалити {target}?", "confirm-reset": "Ви впевнені, що бажаєте скинути статистику для {target}?", "delete-team-warning": "Видалення команди також призведе до видалення всіх її веб-сайтів.", "delete-website-warning": "Усі пов'язані дані будуть видалені також.", "error": "Щось пішло не так.", - "event-log": "{event} на {url}", + "event-log": "{event} на {url}", "forbidden": "Forbidden", "go-to-settings": "Перейти до налаштувань", "incorrect-username-password": "Невірне ім'я користувача або пароль.", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "Користувача видалено.", "viewed-page": "Переглянута сторінка", - "visitor-log": "Відвідувач з {country} використовуючи {browser} на {os} {device}" + "visitor-log": "Відвідувач з {country} використовуючи {browser} на {os} {device}" } } diff --git a/public/intl/messages/ur-PK.json b/public/intl/messages/ur-PK.json index 47201ace0..1f0aa1649 100644 --- a/public/intl/messages/ur-PK.json +++ b/public/intl/messages/ur-PK.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "Collected data", "confirm-delete": "کیا آپ واقعی {target} کو حذف کرنا چاہتے ہیں؟", - "confirm-leave": "Are you sure you want to leave {target}?", - "confirm-remove": "Are you sure you want to remove {target}?", + "confirm-leave": "Are you sure you want to leave {target}?", + "confirm-remove": "Are you sure you want to remove {target}?", "confirm-reset": "کیا آپ واقعی {target} کے اعدادوشمار کو دوبارہ ترتیب دینا چاہتے ہیں؟", "delete-team-warning": "Deleting a team will also delete all team websites.", "delete-website-warning": "تمام متعلقہ ڈیٹا بھی حذف کر دیا جائے گا۔", "error": "کچھ غلط ہو گیا.", - "event-log": "{event} on {url}", + "event-log": "{event} on {url}", "forbidden": "Forbidden", "go-to-settings": "ترتیبات پر جائیں", "incorrect-username-password": "غلط صارف نام/پاس ورڈ۔", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "User deleted.", "viewed-page": "Viewed page", - "visitor-log": "{os} {device} پر {browser} کا استعمال کرتے ہوئے {country} سے آنے والا" + "visitor-log": "{os} {device} پر {browser} کا استعمال کرتے ہوئے {country} سے آنے والا" } } diff --git a/public/intl/messages/uz-UZ.json b/public/intl/messages/uz-UZ.json index 91d719173..7bfb15871 100644 --- a/public/intl/messages/uz-UZ.json +++ b/public/intl/messages/uz-UZ.json @@ -243,13 +243,13 @@ "active-users": "{x} joriy {x, plural, one {tashrif buyuruvchi} other {tashrif buyuruvchilar}}", "collected-data": "Yigʻilgan ma'lumotlar", "confirm-delete": "**{target}** ni oʻchirmoqchi ekanligingizga ishonchingiz komilmi?", - "confirm-leave": "**{target}** ni tark etmoqchi ekanligingizga ishonchingiz komilmi?", - "confirm-remove": "**{target}** ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?", + "confirm-leave": "**{target}** ni tark etmoqchi ekanligingizga ishonchingiz komilmi?", + "confirm-remove": "**{target}** ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?", "confirm-reset": "**{target}** ni qayta tiklamoqchi ekanligingizga ishonchingiz komilmi?", "delete-team-warning": "Jamoani oʻchirish, shuningdek, barcha jamoa veb-saytlarini ham oʻchiradi.", "delete-website-warning": "Barcha veb-sayt ma'lumotlari oʻchiriladi.", "error": "Nimadir xato ketdi.", - "event-log": "**{url}** da **{event}** hodisasi", + "event-log": "**{url}** da **{event}** hodisasi", "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.", @@ -278,7 +278,7 @@ "triggered-event": "Hodisa ishga tushirildi", "user-deleted": "Foydalanuvchi oʻchirildi.", "viewed-page": "Sahifa koʻrildi", - "visitor-log": "{os} {device} da {browser} dan foydalanayotgan {country} dan tashrif buyuruvchi", + "visitor-log": "{os} {device} da {browser} dan foydalanayotgan {country} dan tashrif buyuruvchi", "visitors-dropped-off": "Tashrif buyuruvchilar tashlab ketishdi" } } diff --git a/public/intl/messages/vi-VN.json b/public/intl/messages/vi-VN.json index 7815bc323..d5552a298 100644 --- a/public/intl/messages/vi-VN.json +++ b/public/intl/messages/vi-VN.json @@ -243,13 +243,13 @@ "active-users": "{x} {x, plural, one {người dùng} other {người dùng}} đang hoạt động", "collected-data": "Dữ liệu đã thu thập", "confirm-delete": "Bạn có chắc chắn muốn xóa {target}?", - "confirm-leave": "Bạn có chắc chắn muốn rời {target}?", - "confirm-remove": "Bạn có chắc chắn muốn xóa {target}?", + "confirm-leave": "Bạn có chắc chắn muốn rời {target}?", + "confirm-remove": "Bạn có chắc chắn muốn xóa {target}?", "confirm-reset": "Bạn có chắc chắn muốn đặt lại thống kê {target}?", "delete-team-warning": "Việc xóa một nhóm cũng sẽ xóa tất cả các website của nhóm.", "delete-website-warning": "Tất cả dữ liệu liên quan cũng sẽ bị xóa.", "error": "Đã xảy ra lỗi.", - "event-log": "{event} trên {url}", + "event-log": "{event} trên {url}", "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ệ", @@ -278,7 +278,7 @@ "triggered-event": "Sự kiện được kích hoạt", "user-deleted": "Người dùng đã bị xóa.", "viewed-page": "Đã xem trang", - "visitor-log": "Khách từ {country} đang sử dụng {browser} trên {os} {device}", + "visitor-log": "Khách từ {country} đang sử dụng {browser} trên {os} {device}", "visitors-dropped-off": "Khách truy cập đã rời đi" } } diff --git a/public/intl/messages/zh-CN.json b/public/intl/messages/zh-CN.json index a46330d01..8a18390b2 100644 --- a/public/intl/messages/zh-CN.json +++ b/public/intl/messages/zh-CN.json @@ -329,13 +329,13 @@ "bad-request": "请求错误", "collected-data": "已收集的数据", "confirm-delete": "你确定要删除 {target} 吗?", - "confirm-leave": "你确定要离开 {target} 吗?", - "confirm-remove": "您确定要移除 {target} ?", + "confirm-leave": "你确定要离开 {target} 吗?", + "confirm-remove": "您确定要移除 {target} ?", "confirm-reset": "您确定要重置 {target} 的数据吗?", "delete-team-warning": "删除团队也会删除所有团队网站。", "delete-website-warning": "所有相关数据将会被删除。", "error": "发生错误。", - "event-log": "{url} 上的 {event}", + "event-log": "{url} 上的 {event}", "forbidden": "禁止访问", "go-to-settings": "去设置", "incorrect-username-password": "用户名或密码不正确。", @@ -369,6 +369,6 @@ "unauthorized": "未授权", "user-deleted": "用户已删除。", "viewed-page": "已浏览页面", - "visitor-log": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 浏览器进行访问。" + "visitor-log": "来自 {country} 的访客在搭载 {os}{device} 上使用 {browser} 浏览器进行访问。" } } diff --git a/public/intl/messages/zh-TW.json b/public/intl/messages/zh-TW.json index 79da82fea..c8fb61c8a 100644 --- a/public/intl/messages/zh-TW.json +++ b/public/intl/messages/zh-TW.json @@ -298,13 +298,13 @@ "bad-request": "Bad request", "collected-data": "已蒐集的資料", "confirm-delete": "您確定要刪除 {target} 嗎?", - "confirm-leave": "您確定要離開 {target} 嗎?", - "confirm-remove": "您確定要移除 {target} 嗎?", + "confirm-leave": "您確定要離開 {target} 嗎?", + "confirm-remove": "您確定要移除 {target} 嗎?", "confirm-reset": "您確定要重設 {target} 的統計資料嗎?", "delete-team-warning": "刪除團隊的同時也會刪除所有團隊的網站。", "delete-website-warning": "所有網站資料都將被刪除。", "error": "發生錯誤。", - "event-log": "在 {url} 上的 {event}", + "event-log": "在 {url} 上的 {event}", "forbidden": "Forbidden", "go-to-settings": "前往設定", "incorrect-username-password": "使用者名稱或密碼不正確。", @@ -338,6 +338,6 @@ "unauthorized": "Unauthorized", "user-deleted": "使用者已刪除。", "viewed-page": "已瀏覽的網頁", - "visitor-log": "來自 {country} 的訪客在 {device} 上的 {os} 使用 {browser} 瀏覽。" + "visitor-log": "來自 {country} 的訪客在 {device} 上的 {os} 使用 {browser} 瀏覽。" } } diff --git a/src/app/(main)/MobileNav.tsx b/src/app/(main)/MobileNav.tsx index af67bc716..158886db3 100644 --- a/src/app/(main)/MobileNav.tsx +++ b/src/app/(main)/MobileNav.tsx @@ -11,7 +11,7 @@ import { AdminNav } from './admin/AdminNav'; import { SettingsNav } from './settings/SettingsNav'; export function MobileNav() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname, websiteId, renderUrl } = useNavigation(); const isAdmin = pathname.includes('/admin'); const isSettings = pathname.includes('/settings'); @@ -19,19 +19,19 @@ export function MobileNav() { const links = [ { id: 'websites', - label: formatMessage(labels.websites), + label: t(labels.websites), path: '/websites', icon: , }, { id: 'links', - label: formatMessage(labels.links), + label: t(labels.links), path: '/links', icon: , }, { id: 'pixels', - label: formatMessage(labels.pixels), + label: t(labels.pixels), path: '/pixels', icon: , }, diff --git a/src/app/(main)/SideNav.tsx b/src/app/(main)/SideNav.tsx index ca52135e4..865a9e280 100644 --- a/src/app/(main)/SideNav.tsx +++ b/src/app/(main)/SideNav.tsx @@ -21,7 +21,7 @@ import { NavButton } from '@/components/input/NavButton'; import { Logo } from '@/components/svg'; export function SideNav(props: any) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname, renderUrl, websiteId, router } = useNavigation(); const [isCollapsed, setIsCollapsed] = useGlobalState('sidenav-collapsed', false); @@ -30,25 +30,25 @@ export function SideNav(props: any) { const links = [ { id: 'boards', - label: formatMessage(labels.boards), + label: t(labels.boards), path: '/boards', icon: , }, { id: 'websites', - label: formatMessage(labels.websites), + label: t(labels.websites), path: '/websites', icon: , }, { id: 'links', - label: formatMessage(labels.links), + label: t(labels.links), path: '/links', icon: , }, { id: 'pixels', - label: formatMessage(labels.pixels), + label: t(labels.pixels), path: '/pixels', icon: , }, diff --git a/src/app/(main)/UpdateNotice.tsx b/src/app/(main)/UpdateNotice.tsx index ef441d0bb..e61407d9d 100644 --- a/src/app/(main)/UpdateNotice.tsx +++ b/src/app/(main)/UpdateNotice.tsx @@ -7,7 +7,7 @@ import { setItem } from '@/lib/storage'; import { checkVersion, useVersion } from '@/store/version'; export function UpdateNotice({ user, config }) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { latest, checked, hasUpdate, releaseUrl } = useVersion(); const pathname = usePathname(); const [dismissed, setDismissed] = useState(checked); @@ -49,11 +49,11 @@ export function UpdateNotice({ user, config }) { return ( - + - + diff --git a/src/app/(main)/admin/AdminNav.tsx b/src/app/(main)/admin/AdminNav.tsx index a0d86c507..aa1cbe884 100644 --- a/src/app/(main)/admin/AdminNav.tsx +++ b/src/app/(main)/admin/AdminNav.tsx @@ -3,28 +3,28 @@ import { useMessages, useNavigation } from '@/components/hooks'; import { Globe, User, Users } from '@/components/icons'; export function AdminNav({ onItemClick }: { onItemClick?: () => void }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname } = useNavigation(); const items = [ { - label: formatMessage(labels.manage), + label: t(labels.manage), items: [ { id: 'users', - label: formatMessage(labels.users), + label: t(labels.users), path: '/admin/users', icon: , }, { id: 'websites', - label: formatMessage(labels.websites), + label: t(labels.websites), path: '/admin/websites', icon: , }, { id: 'teams', - label: formatMessage(labels.teams), + label: t(labels.teams), path: '/admin/teams', icon: , }, @@ -39,7 +39,7 @@ export function AdminNav({ onItemClick }: { onItemClick?: () => void }) { return ( {}; return ( - + diff --git a/src/app/(main)/admin/teams/AdminTeamsTable.tsx b/src/app/(main)/admin/teams/AdminTeamsTable.tsx index 9f2abd5cd..2d5243b99 100644 --- a/src/app/(main)/admin/teams/AdminTeamsTable.tsx +++ b/src/app/(main)/admin/teams/AdminTeamsTable.tsx @@ -14,22 +14,22 @@ export function AdminTeamsTable({ data: any[]; showActions?: boolean; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const [deleteTeam, setDeleteTeam] = useState(null); return ( <> - + {(row: any) => {row.name}} - + {(row: any) => row?._count?.members} - + {(row: any) => row?._count?.websites} - + {(row: any) => { const name = row?.members?.[0]?.user?.username; @@ -40,7 +40,7 @@ export function AdminTeamsTable({ ); }} - + {(row: any) => } {showActions && ( @@ -55,7 +55,7 @@ export function AdminTeamsTable({ - {formatMessage(labels.edit)} + {t(labels.edit)} - {formatMessage(labels.delete)} + {t(labels.delete)} diff --git a/src/app/(main)/admin/users/UserAddButton.tsx b/src/app/(main)/admin/users/UserAddButton.tsx index 052508280..c2b906317 100644 --- a/src/app/(main)/admin/users/UserAddButton.tsx +++ b/src/app/(main)/admin/users/UserAddButton.tsx @@ -4,12 +4,12 @@ import { Plus } from '@/components/icons'; import { UserAddForm } from './UserAddForm'; export function UserAddButton({ onSave }: { onSave?: () => void }) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { toast } = useToast(); const { touch } = useModified(); const handleSave = () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('users'); onSave?.(); }; @@ -20,10 +20,10 @@ export function UserAddButton({ onSave }: { onSave?: () => void }) { - {formatMessage(labels.createUser)} + {t(labels.createUser)} - + {({ close }) => } diff --git a/src/app/(main)/admin/users/UserAddForm.tsx b/src/app/(main)/admin/users/UserAddForm.tsx index 84b8399cd..32c1cd21a 100644 --- a/src/app/(main)/admin/users/UserAddForm.tsx +++ b/src/app/(main)/admin/users/UserAddForm.tsx @@ -10,12 +10,11 @@ import { TextField, } from '@umami/react-zen'; import { useMessages, useUpdateQuery } from '@/components/hooks'; -import { messages } from '@/components/messages'; import { ROLES } from '@/lib/constants'; export function UserAddForm({ onSave, onClose }) { const { mutateAsync, error, isPending } = useUpdateQuery(`/users`); - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const handleSubmit = async (data: any) => { await mutateAsync(data, { @@ -29,45 +28,41 @@ export function UserAddForm({ onSave, onClose }) { return (
- + - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/admin/users/UserDeleteButton.tsx b/src/app/(main)/admin/users/UserDeleteButton.tsx index ee8f2c19c..8425fbb09 100644 --- a/src/app/(main)/admin/users/UserDeleteButton.tsx +++ b/src/app/(main)/admin/users/UserDeleteButton.tsx @@ -12,7 +12,7 @@ export function UserDeleteButton({ username: string; onDelete?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { user } = useLoginQuery(); return ( @@ -21,10 +21,10 @@ export function UserDeleteButton({ - {formatMessage(labels.delete)} + {t(labels.delete)} - + {({ close }) => ( )} diff --git a/src/app/(main)/admin/users/UserDeleteForm.tsx b/src/app/(main)/admin/users/UserDeleteForm.tsx index 8f6fd502b..bf060f560 100644 --- a/src/app/(main)/admin/users/UserDeleteForm.tsx +++ b/src/app/(main)/admin/users/UserDeleteForm.tsx @@ -12,7 +12,7 @@ export function UserDeleteForm({ onSave?: () => void; onClose?: () => void; }) { - const { messages, labels, formatMessage } = useMessages(); + const { messages, labels, t } = useMessages(); const { mutateAsync } = useDeleteQuery(`/users/${userId}`); const { touch } = useModified(); @@ -29,13 +29,13 @@ export function UserDeleteForm({ return ( - {formatMessage(messages.confirmDelete, { target: username })} + {t(messages.confirmDelete, { target: username })} ); } diff --git a/src/app/(main)/admin/users/UsersPage.tsx b/src/app/(main)/admin/users/UsersPage.tsx index 7e1b0f48b..eaabc7c80 100644 --- a/src/app/(main)/admin/users/UsersPage.tsx +++ b/src/app/(main)/admin/users/UsersPage.tsx @@ -7,13 +7,13 @@ import { UserAddButton } from './UserAddButton'; import { UsersDataTable } from './UsersDataTable'; export function UsersPage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const handleSave = () => {}; return ( - + diff --git a/src/app/(main)/admin/users/UsersTable.tsx b/src/app/(main)/admin/users/UsersTable.tsx index 9c10f3e79..16a5b9084 100644 --- a/src/app/(main)/admin/users/UsersTable.tsx +++ b/src/app/(main)/admin/users/UsersTable.tsx @@ -15,26 +15,24 @@ export function UsersTable({ data: any[]; showActions?: boolean; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const [deleteUser, setDeleteUser] = useState(null); return ( <> - + {(row: any) => {row.username}} - + {(row: any) => - formatMessage( - labels[Object.keys(ROLES).find(key => ROLES[key] === row.role)] || labels.unknown, - ) + t(labels[Object.keys(ROLES).find(key => ROLES[key] === row.role)] || labels.unknown) } - + {(row: any) => row._count.websites} - + {(row: any) => } {showActions && ( @@ -49,7 +47,7 @@ export function UsersTable({ - {formatMessage(labels.edit)} + {t(labels.edit)} - {formatMessage(labels.delete)} + {t(labels.delete)} diff --git a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx index 28bf030f5..d8110ca90 100644 --- a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx +++ b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx @@ -12,7 +12,7 @@ import { useLoginQuery, useMessages, useUpdateQuery, useUser } from '@/component import { ROLES } from '@/lib/constants'; export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () => void }) { - const { formatMessage, labels, messages, getMessage } = useMessages(); + const { t, labels, messages, getMessage } = useMessages(); const user = useUser(); const { user: login } = useLoginQuery(); @@ -21,7 +21,7 @@ export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () = const handleSubmit = async (data: any) => { await mutateAsync(data, { onSuccess: async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('users'); touch(`user:${user.id}`); onSave?.(); @@ -31,41 +31,37 @@ export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () = return (
- + {user.id !== login.id && ( - + )} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/admin/users/[userId]/UserSettings.tsx b/src/app/(main)/admin/users/[userId]/UserSettings.tsx index 3f17f3e16..e2119bb59 100644 --- a/src/app/(main)/admin/users/[userId]/UserSettings.tsx +++ b/src/app/(main)/admin/users/[userId]/UserSettings.tsx @@ -4,14 +4,14 @@ import { UserEditForm } from './UserEditForm'; import { UserWebsites } from './UserWebsites'; export function UserSettings({ userId }: { userId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - {formatMessage(labels.details)} - {formatMessage(labels.websites)} + {t(labels.details)} + {t(labels.websites)} diff --git a/src/app/(main)/admin/websites/AdminWebsitesPage.tsx b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx index 1c2ac9218..e536a5bbe 100644 --- a/src/app/(main)/admin/websites/AdminWebsitesPage.tsx +++ b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx @@ -6,11 +6,11 @@ import { useMessages } from '@/components/hooks'; import { AdminWebsitesDataTable } from './AdminWebsitesDataTable'; export function AdminWebsitesPage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + diff --git a/src/app/(main)/admin/websites/AdminWebsitesTable.tsx b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx index cfda59572..def6dd9ff 100644 --- a/src/app/(main)/admin/websites/AdminWebsitesTable.tsx +++ b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx @@ -8,23 +8,23 @@ import { Edit, Trash, Users } from '@/components/icons'; import { MenuButton } from '@/components/input/MenuButton'; export function AdminWebsitesTable({ data = [] }: { data: any[] }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const [deleteWebsite, setDeleteWebsite] = useState(null); return ( <> - + {(row: any) => ( {row.name} )} - + {(row: any) => {row.domain}} - + {(row: any) => { if (row?.team) { return ( @@ -45,7 +45,7 @@ export function AdminWebsitesTable({ data = [] }: { data: any[] }) { ); }} - + {(row: any) => } @@ -59,7 +59,7 @@ export function AdminWebsitesTable({ data = [] }: { data: any[] }) { - {formatMessage(labels.edit)} + {t(labels.edit)} - {formatMessage(labels.delete)} + {t(labels.delete)} diff --git a/src/app/(main)/boards/BoardAddButton.tsx b/src/app/(main)/boards/BoardAddButton.tsx index dd25dbf30..e3139d4b2 100644 --- a/src/app/(main)/boards/BoardAddButton.tsx +++ b/src/app/(main)/boards/BoardAddButton.tsx @@ -4,13 +4,13 @@ import { Plus } from '@/components/icons'; import { BoardAddForm } from './BoardAddForm'; export function BoardAddButton() { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { toast } = useToast(); const { touch } = useModified(); const { teamId } = useNavigation(); const handleSave = async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('boards'); }; @@ -20,10 +20,10 @@ export function BoardAddButton() { - {formatMessage(labels.addBoard)} + {t(labels.addBoard)} - + {({ close }) => } diff --git a/src/app/(main)/boards/BoardAddForm.tsx b/src/app/(main)/boards/BoardAddForm.tsx index de42b7a14..63fc1366e 100644 --- a/src/app/(main)/boards/BoardAddForm.tsx +++ b/src/app/(main)/boards/BoardAddForm.tsx @@ -12,7 +12,7 @@ export function BoardAddForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery('/boards', { teamId }); const [websiteId, setWebsiteId] = useState(); @@ -30,34 +30,30 @@ export function BoardAddForm({ return (
- + - {formatMessage(labels.website)} + {t(labels.website)} {onClose && ( )} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/boards/BoardProvider.tsx b/src/app/(main)/boards/BoardProvider.tsx index f96a13ab2..85dd0f737 100644 --- a/src/app/(main)/boards/BoardProvider.tsx +++ b/src/app/(main)/boards/BoardProvider.tsx @@ -40,7 +40,7 @@ export function BoardProvider({ const { post, useMutation } = useApi(); const { touch } = useModified(); const { toast } = useToast(); - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { router, renderUrl } = useNavigation(); const [board, setBoard] = useState>(data ?? createDefaultBoard()); @@ -70,7 +70,7 @@ export function BoardProvider({ }, []); const saveBoard = useCallback(async () => { - const defaultName = formatMessage(labels.untitled); + const defaultName = t(labels.untitled); // Get current layout sizes from BoardBody if registered const layoutData = layoutGetterRef.current?.(); @@ -82,7 +82,7 @@ export function BoardProvider({ parameters, }); - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('boards'); if (board.id) { @@ -92,17 +92,7 @@ export function BoardProvider({ } return result; - }, [ - board, - mutateAsync, - toast, - formatMessage, - labels.untitled, - messages.saved, - touch, - router, - renderUrl, - ]); + }, [board, mutateAsync, toast, t, labels.untitled, messages.saved, touch, router, renderUrl]); if (boardId && isFetching && isLoading) { return ; diff --git a/src/app/(main)/boards/BoardsPage.tsx b/src/app/(main)/boards/BoardsPage.tsx index 126ac494c..22ffae528 100644 --- a/src/app/(main)/boards/BoardsPage.tsx +++ b/src/app/(main)/boards/BoardsPage.tsx @@ -10,14 +10,14 @@ import { Plus } from '@/components/icons'; import { BoardsDataTable } from './BoardsDataTable'; export function BoardsPage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + - } label={formatMessage(labels.addBoard)} /> + } label={t(labels.addBoard)} /> diff --git a/src/app/(main)/boards/BoardsTable.tsx b/src/app/(main)/boards/BoardsTable.tsx index b23dd7a91..d750db9e5 100644 --- a/src/app/(main)/boards/BoardsTable.tsx +++ b/src/app/(main)/boards/BoardsTable.tsx @@ -4,19 +4,19 @@ import { DateDistance } from '@/components/common/DateDistance'; import { useMessages, useNavigation, useSlug } from '@/components/hooks'; export function BoardsTable(props: DataTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { websiteId, renderUrl } = useNavigation(); const { getSlugUrl } = useSlug('link'); return ( - + {({ id, name }: any) => { return {name}; }} - - + + {(row: any) => } diff --git a/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx b/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx index a3bc3bddb..afcbea6df 100644 --- a/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx +++ b/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx @@ -13,9 +13,9 @@ import { WebsiteSelect } from '@/components/input/WebsiteSelect'; export function BoardEditHeader() { const { board, updateBoard, saveBoard, isPending } = useBoard(); - const { formatMessage, labels } = useMessages(); - const { teamId, router, renderUrl } = useNavigation(); - const defaultName = formatMessage(labels.untitled); + const { t, labels } = useMessages(); + const { router, renderUrl } = useNavigation(); + const defaultName = t(labels.untitled); const handleNameChange = (value: string) => { updateBoard({ name: value }); @@ -71,7 +71,7 @@ export function BoardEditHeader() { variant="quiet" name="description" value={board?.description ?? ''} - placeholder={`+ ${formatMessage(labels.addDescription)}`} + placeholder={`+ ${t(labels.addDescription)}`} autoComplete="off" onChange={handleDescriptionChange} style={{ width: '100%' }} @@ -80,21 +80,17 @@ export function BoardEditHeader() { - {formatMessage(labels.website)} - + {t(labels.website)} + - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx b/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx index 756f39d28..6303123b4 100644 --- a/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx +++ b/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx @@ -8,14 +8,14 @@ import { Edit } from '@/components/icons'; export function BoardViewHeader() { const { board } = useBoard(); const { renderUrl } = useNavigation(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data: website } = useWebsiteQuery(board?.parameters?.websiteId); return ( {website?.name && {website.name}} - }>{formatMessage(labels.edit)} + }>{t(labels.edit)} ); diff --git a/src/app/(main)/dashboard/DashboardPage.tsx b/src/app/(main)/dashboard/DashboardPage.tsx index c2c7e75f0..81bb9719d 100644 --- a/src/app/(main)/dashboard/DashboardPage.tsx +++ b/src/app/(main)/dashboard/DashboardPage.tsx @@ -5,12 +5,12 @@ import { PageHeader } from '@/components/common/PageHeader'; import { useMessages } from '@/components/hooks'; export function DashboardPage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + ); diff --git a/src/app/(main)/links/LinkAddButton.tsx b/src/app/(main)/links/LinkAddButton.tsx index 4276895d0..f7f89b81a 100644 --- a/src/app/(main)/links/LinkAddButton.tsx +++ b/src/app/(main)/links/LinkAddButton.tsx @@ -4,15 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { LinkEditForm } from './LinkEditForm'; export function LinkAddButton({ teamId }: { teamId?: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } - label={formatMessage(labels.addLink)} - variant="primary" - width="600px" - > + } label={t(labels.addLink)} variant="primary" width="600px"> {({ close }) => } ); diff --git a/src/app/(main)/links/LinkDeleteButton.tsx b/src/app/(main)/links/LinkDeleteButton.tsx index 32ccbaf7e..f17040741 100644 --- a/src/app/(main)/links/LinkDeleteButton.tsx +++ b/src/app/(main)/links/LinkDeleteButton.tsx @@ -2,7 +2,6 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { messages } from '@/components/messages'; export function LinkDeleteButton({ linkId, @@ -14,7 +13,7 @@ export function LinkDeleteButton({ name: string; onSave?: () => void; }) { - const { formatMessage, labels, getErrorMessage, FormattedMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, isPending, error } = useDeleteQuery(`/links/${linkId}`); const { touch } = useModified(); @@ -29,27 +28,18 @@ export function LinkDeleteButton({ }; return ( - } - title={formatMessage(labels.confirm)} - variant="quiet" - width="400px" - > + } title={t(labels.confirm)} variant="quiet" width="400px"> {({ close }) => ( {name}, - }} - /> - } + message={t.rich(messages.confirmRemove, { + target: name, + b: chunks => {chunks}, + })} isLoading={isPending} error={getErrorMessage(error)} onConfirm={handleConfirm.bind(null, close)} onClose={close} - buttonLabel={formatMessage(labels.delete)} + buttonLabel={t(labels.delete)} buttonVariant="danger" /> )} diff --git a/src/app/(main)/links/LinkEditButton.tsx b/src/app/(main)/links/LinkEditButton.tsx index 4d8587966..bd309282f 100644 --- a/src/app/(main)/links/LinkEditButton.tsx +++ b/src/app/(main)/links/LinkEditButton.tsx @@ -4,10 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { LinkEditForm } from './LinkEditForm'; export function LinkEditButton({ linkId }: { linkId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } title={formatMessage(labels.link)} variant="quiet" width="800px"> + } title={t(labels.link)} variant="quiet" width="800px"> {({ close }) => { return ; }} diff --git a/src/app/(main)/links/LinkEditForm.tsx b/src/app/(main)/links/LinkEditForm.tsx index a6c0164d0..64bfb8dbc 100644 --- a/src/app/(main)/links/LinkEditForm.tsx +++ b/src/app/(main)/links/LinkEditForm.tsx @@ -32,7 +32,7 @@ export function LinkEditForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery( linkId ? `/links/${linkId}` : '/links', { @@ -48,7 +48,7 @@ export function LinkEditForm({ const handleSubmit = async (data: any) => { await mutateAsync(data, { onSuccess: async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('links'); touch(`link:${linkId}`); onSave?.(); @@ -59,7 +59,7 @@ export function LinkEditForm({ const checkUrl = (url: string) => { if (!isValidUrl(url)) { - return formatMessage(labels.invalidUrl); + return t(labels.invalidUrl); } return true; }; @@ -79,18 +79,14 @@ export function LinkEditForm({ return ( <> - + @@ -98,9 +94,9 @@ export function LinkEditForm({ @@ -116,7 +112,7 @@ export function LinkEditForm({ - + {onClose && ( )} - {formatMessage(labels.save)} + {t(labels.save)} ); diff --git a/src/app/(main)/links/LinksPage.tsx b/src/app/(main)/links/LinksPage.tsx index cdaf8fced..a82ce6da3 100644 --- a/src/app/(main)/links/LinksPage.tsx +++ b/src/app/(main)/links/LinksPage.tsx @@ -10,7 +10,7 @@ import { LinkAddButton } from './LinkAddButton'; export function LinksPage() { const { user } = useLoginQuery(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { teamId } = useNavigation(); const { data } = useTeamMembersQuery(teamId); @@ -23,7 +23,7 @@ export function LinksPage() { return ( - + {showActions && } diff --git a/src/app/(main)/links/LinksTable.tsx b/src/app/(main)/links/LinksTable.tsx index 62eb0fb86..76fcc6df0 100644 --- a/src/app/(main)/links/LinksTable.tsx +++ b/src/app/(main)/links/LinksTable.tsx @@ -11,18 +11,18 @@ export interface LinksTableProps extends DataTableProps { } export function LinksTable({ showActions, ...props }: LinksTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { websiteId, renderUrl } = useNavigation(); const { getSlugUrl } = useSlug('link'); return ( - + {({ id, name }: any) => { return {name}; }} - + {({ slug }: any) => { const url = getSlugUrl(slug); return ( @@ -32,12 +32,12 @@ export function LinksTable({ showActions, ...props }: LinksTableProps) { ); }} - + {({ url }: any) => { return {url}; }} - + {(row: any) => } {showActions && ( diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index da1d75939..5ca713c58 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -5,14 +5,14 @@ import { useLink, useMessages, useSlug } from '@/components/hooks'; import { ExternalLink, Link } from '@/components/icons'; export function LinkHeader() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { getSlugUrl } = useSlug('link'); const link = useLink(); return ( }> - } label={formatMessage(labels.view)} /> + } label={t(labels.view)} /> ); diff --git a/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx index 1fe8c45fa..ec07962c6 100644 --- a/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx +++ b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx @@ -13,7 +13,7 @@ export function LinkMetricsBar({ compareMode?: boolean; }) { const { isAllTime } = useDateRange(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteStatsQuery(linkId); const { pageviews, visitors, visits, comparison } = data || {}; @@ -22,19 +22,19 @@ export function LinkMetricsBar({ ? [ { value: visitors, - label: formatMessage(labels.visitors), + label: t(labels.visitors), change: visitors - comparison.visitors, formatValue: formatLongNumber, }, { value: visits, - label: formatMessage(labels.visits), + label: t(labels.visits), change: visits - comparison.visits, formatValue: formatLongNumber, }, { value: pageviews, - label: formatMessage(labels.views), + label: t(labels.views), change: pageviews - comparison.pageviews, formatValue: formatLongNumber, }, diff --git a/src/app/(main)/links/[linkId]/LinkPanels.tsx b/src/app/(main)/links/[linkId]/LinkPanels.tsx index c044abe5d..6d246618a 100644 --- a/src/app/(main)/links/[linkId]/LinkPanels.tsx +++ b/src/app/(main)/links/[linkId]/LinkPanels.tsx @@ -6,13 +6,13 @@ import { MetricsTable } from '@/components/metrics/MetricsTable'; import { WorldMap } from '@/components/metrics/WorldMap'; export function LinkPanels({ linkId }: { linkId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const tableProps = { websiteId: linkId, limit: 10, allowDownload: false, showMore: true, - metric: formatMessage(labels.visitors), + metric: t(labels.visitors), }; const rowProps = { minHeight: 570 }; @@ -20,36 +20,36 @@ export function LinkPanels({ linkId }: { linkId: string }) { - {formatMessage(labels.sources)} + {t(labels.sources)} - {formatMessage(labels.referrers)} - {formatMessage(labels.channels)} + {t(labels.referrers)} + {t(labels.channels)} - + - + - {formatMessage(labels.environment)} + {t(labels.environment)} - {formatMessage(labels.browsers)} - {formatMessage(labels.os)} - {formatMessage(labels.devices)} + {t(labels.browsers)} + {t(labels.os)} + {t(labels.devices)} - + - + - + @@ -59,21 +59,21 @@ export function LinkPanels({ linkId }: { linkId: string }) { - {formatMessage(labels.location)} + {t(labels.location)} - {formatMessage(labels.countries)} - {formatMessage(labels.regions)} - {formatMessage(labels.cities)} + {t(labels.countries)} + {t(labels.regions)} + {t(labels.cities)} - + - + - + diff --git a/src/app/(main)/pixels/PixelAddButton.tsx b/src/app/(main)/pixels/PixelAddButton.tsx index 1573b9e0f..be8edd418 100644 --- a/src/app/(main)/pixels/PixelAddButton.tsx +++ b/src/app/(main)/pixels/PixelAddButton.tsx @@ -4,15 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { PixelEditForm } from './PixelEditForm'; export function PixelAddButton({ teamId }: { teamId?: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } - label={formatMessage(labels.addPixel)} - variant="primary" - width="600px" - > + } label={t(labels.addPixel)} variant="primary" width="600px"> {({ close }) => } ); diff --git a/src/app/(main)/pixels/PixelDeleteButton.tsx b/src/app/(main)/pixels/PixelDeleteButton.tsx index 436dba5c4..68bb896ce 100644 --- a/src/app/(main)/pixels/PixelDeleteButton.tsx +++ b/src/app/(main)/pixels/PixelDeleteButton.tsx @@ -2,7 +2,6 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { messages } from '@/components/messages'; export function PixelDeleteButton({ pixelId, @@ -13,7 +12,7 @@ export function PixelDeleteButton({ name: string; onSave?: () => void; }) { - const { formatMessage, labels, getErrorMessage, FormattedMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, isPending, error } = useDeleteQuery(`/pixels/${pixelId}`); const { touch } = useModified(); @@ -28,27 +27,18 @@ export function PixelDeleteButton({ }; return ( - } - variant="quiet" - title={formatMessage(labels.confirm)} - width="400px" - > + } variant="quiet" title={t(labels.confirm)} width="400px"> {({ close }) => ( {name}, - }} - /> - } + message={t.rich(messages.confirmRemove, { + target: name, + b: chunks => {chunks}, + })} isLoading={isPending} error={getErrorMessage(error)} onConfirm={handleConfirm.bind(null, close)} onClose={close} - buttonLabel={formatMessage(labels.delete)} + buttonLabel={t(labels.delete)} buttonVariant="danger" /> )} diff --git a/src/app/(main)/pixels/PixelEditButton.tsx b/src/app/(main)/pixels/PixelEditButton.tsx index 3c5924da4..2a16118c2 100644 --- a/src/app/(main)/pixels/PixelEditButton.tsx +++ b/src/app/(main)/pixels/PixelEditButton.tsx @@ -4,15 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { PixelEditForm } from './PixelEditForm'; export function PixelEditButton({ pixelId }: { pixelId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } - title={formatMessage(labels.addPixel)} - variant="quiet" - width="600px" - > + } title={t(labels.addPixel)} variant="quiet" width="600px"> {({ close }) => { return ; }} diff --git a/src/app/(main)/pixels/PixelEditForm.tsx b/src/app/(main)/pixels/PixelEditForm.tsx index 46241c1cf..54c5e64c5 100644 --- a/src/app/(main)/pixels/PixelEditForm.tsx +++ b/src/app/(main)/pixels/PixelEditForm.tsx @@ -30,7 +30,7 @@ export function PixelEditForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery( pixelId ? `/pixels/${pixelId}` : '/pixels', { @@ -46,7 +46,7 @@ export function PixelEditForm({ const handleSubmit = async (data: any) => { await mutateAsync(data, { onSuccess: async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('pixels'); touch(`pixel:${pixelId}`); onSave?.(); @@ -78,18 +78,14 @@ export function PixelEditForm({ {({ setValue }) => { return ( <> - + @@ -97,7 +93,7 @@ export function PixelEditForm({ - + {onClose && ( )} - {formatMessage(labels.save)} + {t(labels.save)} ); diff --git a/src/app/(main)/pixels/PixelsPage.tsx b/src/app/(main)/pixels/PixelsPage.tsx index 91ddcdcda..76e210061 100644 --- a/src/app/(main)/pixels/PixelsPage.tsx +++ b/src/app/(main)/pixels/PixelsPage.tsx @@ -10,7 +10,7 @@ import { PixelsDataTable } from './PixelsDataTable'; export function PixelsPage() { const { user } = useLoginQuery(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { teamId } = useNavigation(); const { data } = useTeamMembersQuery(teamId); @@ -23,7 +23,7 @@ export function PixelsPage() { return ( - + {showActions && } diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx index 018b40eb5..98ae6a8ac 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -11,13 +11,13 @@ export interface PixelsTableProps extends DataTableProps { } export function PixelsTable({ showActions, ...props }: PixelsTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { renderUrl } = useNavigation(); const { getSlugUrl } = useSlug('pixel'); return ( - + {({ id, name }: any) => { return {name}; }} @@ -32,7 +32,7 @@ export function PixelsTable({ showActions, ...props }: PixelsTableProps) { ); }} - + {(row: any) => } {showActions && ( diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index 3fab6b73f..26afc811e 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -5,14 +5,14 @@ import { useMessages, usePixel, useSlug } from '@/components/hooks'; import { ExternalLink, Grid2x2 } from '@/components/icons'; export function PixelHeader() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { getSlugUrl } = useSlug('pixel'); const pixel = usePixel(); return ( }> - } label={formatMessage(labels.view)} /> + } label={t(labels.view)} /> ); diff --git a/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx index c9dcd357c..3a46291e1 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx @@ -13,7 +13,7 @@ export function PixelMetricsBar({ compareMode?: boolean; }) { const { isAllTime } = useDateRange(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteStatsQuery(pixelId); const { pageviews, visitors, visits, comparison } = data || {}; @@ -22,19 +22,19 @@ export function PixelMetricsBar({ ? [ { value: visitors, - label: formatMessage(labels.visitors), + label: t(labels.visitors), change: visitors - comparison.visitors, formatValue: formatLongNumber, }, { value: visits, - label: formatMessage(labels.visits), + label: t(labels.visits), change: visits - comparison.visits, formatValue: formatLongNumber, }, { value: pageviews, - label: formatMessage(labels.views), + label: t(labels.views), change: pageviews - comparison.pageviews, formatValue: formatLongNumber, }, diff --git a/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx index 9f19d65aa..54079a168 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx @@ -6,13 +6,13 @@ import { MetricsTable } from '@/components/metrics/MetricsTable'; import { WorldMap } from '@/components/metrics/WorldMap'; export function PixelPanels({ pixelId }: { pixelId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const tableProps = { websiteId: pixelId, limit: 10, allowDownload: false, showMore: true, - metric: formatMessage(labels.visitors), + metric: t(labels.visitors), }; const rowProps = { minHeight: 570 }; @@ -20,36 +20,36 @@ export function PixelPanels({ pixelId }: { pixelId: string }) { - {formatMessage(labels.sources)} + {t(labels.sources)} - {formatMessage(labels.referrers)} - {formatMessage(labels.channels)} + {t(labels.referrers)} + {t(labels.channels)} - + - + - {formatMessage(labels.environment)} + {t(labels.environment)} - {formatMessage(labels.browsers)} - {formatMessage(labels.os)} - {formatMessage(labels.devices)} + {t(labels.browsers)} + {t(labels.os)} + {t(labels.devices)} - + - + - + @@ -59,21 +59,21 @@ export function PixelPanels({ pixelId }: { pixelId: string }) { - {formatMessage(labels.location)} + {t(labels.location)} - {formatMessage(labels.countries)} - {formatMessage(labels.regions)} - {formatMessage(labels.cities)} + {t(labels.countries)} + {t(labels.regions)} + {t(labels.cities)} - + - + - + diff --git a/src/app/(main)/settings/SettingsNav.tsx b/src/app/(main)/settings/SettingsNav.tsx index 5274ed84e..bfe8a0aee 100644 --- a/src/app/(main)/settings/SettingsNav.tsx +++ b/src/app/(main)/settings/SettingsNav.tsx @@ -3,33 +3,33 @@ import { useMessages, useNavigation } from '@/components/hooks'; import { Settings2, UserCircle, Users } from '@/components/icons'; export function SettingsNav({ onItemClick }: { onItemClick?: () => void }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { renderUrl, pathname } = useNavigation(); const items = [ { - label: formatMessage(labels.application), + label: t(labels.application), items: [ { id: 'preferences', - label: formatMessage(labels.preferences), + label: t(labels.preferences), path: renderUrl('/settings/preferences'), icon: , }, ], }, { - label: formatMessage(labels.account), + label: t(labels.account), items: [ { id: 'profile', - label: formatMessage(labels.profile), + label: t(labels.profile), path: renderUrl('/settings/profile'), icon: , }, { id: 'teams', - label: formatMessage(labels.teams), + label: t(labels.teams), path: renderUrl('/settings/teams'), icon: , }, @@ -44,7 +44,7 @@ export function SettingsNav({ onItemClick }: { onItemClick?: () => void }) { return ( { @@ -27,7 +27,7 @@ export function DateRangeSetting() { placement="bottom start" style={{ minWidth: '250px' }} /> - + ); } diff --git a/src/app/(main)/settings/preferences/LanguageSetting.tsx b/src/app/(main)/settings/preferences/LanguageSetting.tsx index 2b2d0febe..34470c36c 100644 --- a/src/app/(main)/settings/preferences/LanguageSetting.tsx +++ b/src/app/(main)/settings/preferences/LanguageSetting.tsx @@ -6,7 +6,7 @@ import { languages } from '@/lib/lang'; export function LanguageSetting() { const [search, setSearch] = useState(''); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { locale, saveLocale } = useLocale(); const items = search ? Object.keys(languages).filter(n => { @@ -43,7 +43,7 @@ export function LanguageSetting() { ))} {!items.length && } - + ); } diff --git a/src/app/(main)/settings/preferences/PreferenceSettings.tsx b/src/app/(main)/settings/preferences/PreferenceSettings.tsx index c91a6eff2..55695946b 100644 --- a/src/app/(main)/settings/preferences/PreferenceSettings.tsx +++ b/src/app/(main)/settings/preferences/PreferenceSettings.tsx @@ -8,7 +8,7 @@ import { VersionSetting } from './VersionSetting'; export function PreferenceSettings() { const { user } = useLoginQuery(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); if (!user) { return null; @@ -17,23 +17,23 @@ export function PreferenceSettings() { return ( - + - + - + - + - + diff --git a/src/app/(main)/settings/preferences/PreferencesPage.tsx b/src/app/(main)/settings/preferences/PreferencesPage.tsx index 61e26694f..2cbfd6dbf 100644 --- a/src/app/(main)/settings/preferences/PreferencesPage.tsx +++ b/src/app/(main)/settings/preferences/PreferencesPage.tsx @@ -7,12 +7,12 @@ import { useMessages } from '@/components/hooks'; import { PreferenceSettings } from './PreferenceSettings'; export function PreferencesPage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + diff --git a/src/app/(main)/settings/preferences/TimezoneSetting.tsx b/src/app/(main)/settings/preferences/TimezoneSetting.tsx index 8551e8cf0..f206a6e4f 100644 --- a/src/app/(main)/settings/preferences/TimezoneSetting.tsx +++ b/src/app/(main)/settings/preferences/TimezoneSetting.tsx @@ -7,7 +7,7 @@ const timezones = Intl.supportedValuesOf('timeZone'); export function TimezoneSetting() { const [search, setSearch] = useState(''); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { timezone, saveTimezone } = useTimezone(); const items = search ? timezones.filter(n => n.toLowerCase().includes(search.toLowerCase())) @@ -39,7 +39,7 @@ export function TimezoneSetting() { ))} {!items.length && } - + ); } diff --git a/src/app/(main)/settings/profile/PasswordChangeButton.tsx b/src/app/(main)/settings/profile/PasswordChangeButton.tsx index 6ce8ef842..105269dd4 100644 --- a/src/app/(main)/settings/profile/PasswordChangeButton.tsx +++ b/src/app/(main)/settings/profile/PasswordChangeButton.tsx @@ -4,11 +4,11 @@ import { LockKeyhole } from '@/components/icons'; import { PasswordEditForm } from './PasswordEditForm'; export function PasswordChangeButton() { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { toast } = useToast(); const handleSave = () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); }; return ( @@ -17,10 +17,10 @@ export function PasswordChangeButton() { - {formatMessage(labels.changePassword)} + {t(labels.changePassword)} - + {({ close }) => } diff --git a/src/app/(main)/settings/profile/PasswordEditForm.tsx b/src/app/(main)/settings/profile/PasswordEditForm.tsx index 6f782e44b..8a1615a07 100644 --- a/src/app/(main)/settings/profile/PasswordEditForm.tsx +++ b/src/app/(main)/settings/profile/PasswordEditForm.tsx @@ -9,7 +9,7 @@ import { import { useMessages, useUpdateQuery } from '@/components/hooks'; export function PasswordEditForm({ onSave, onClose }) { - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery('/me/password'); const handleSubmit = async (data: any) => { @@ -23,7 +23,7 @@ export function PasswordEditForm({ onSave, onClose }) { const samePassword = (value: string, values: Record) => { if (value !== values.newPassword) { - return formatMessage(messages.noMatchPassword); + return t(messages.noMatchPassword); } return true; }; @@ -31,7 +31,7 @@ export function PasswordEditForm({ onSave, onClose }) { return (
@@ -39,28 +39,28 @@ export function PasswordEditForm({ onSave, onClose }) { - - {formatMessage(labels.save)} + + {t(labels.save)}
); diff --git a/src/app/(main)/settings/profile/ProfileHeader.tsx b/src/app/(main)/settings/profile/ProfileHeader.tsx index 05f799637..09cabbe2c 100644 --- a/src/app/(main)/settings/profile/ProfileHeader.tsx +++ b/src/app/(main)/settings/profile/ProfileHeader.tsx @@ -2,7 +2,7 @@ import { SectionHeader } from '@/components/common/SectionHeader'; import { useMessages } from '@/components/hooks'; export function ProfileHeader() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); - return ; + return ; } diff --git a/src/app/(main)/settings/profile/ProfilePage.tsx b/src/app/(main)/settings/profile/ProfilePage.tsx index f03499a37..896464a13 100644 --- a/src/app/(main)/settings/profile/ProfilePage.tsx +++ b/src/app/(main)/settings/profile/ProfilePage.tsx @@ -7,12 +7,12 @@ import { useMessages } from '@/components/hooks'; import { ProfileSettings } from './ProfileSettings'; export function ProfilePage() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + diff --git a/src/app/(main)/settings/profile/ProfileSettings.tsx b/src/app/(main)/settings/profile/ProfileSettings.tsx index d53a68a03..e991dcda5 100644 --- a/src/app/(main)/settings/profile/ProfileSettings.tsx +++ b/src/app/(main)/settings/profile/ProfileSettings.tsx @@ -5,7 +5,7 @@ import { PasswordChangeButton } from './PasswordChangeButton'; export function ProfileSettings() { const { user } = useLoginQuery(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { cloudMode } = useConfig(); if (!user) { @@ -16,31 +16,31 @@ export function ProfileSettings() { const renderRole = (value: string) => { if (value === ROLES.user) { - return formatMessage(labels.user); + return t(labels.user); } if (value === ROLES.admin) { - return formatMessage(labels.admin); + return t(labels.admin); } if (value === ROLES.viewOnly) { - return formatMessage(labels.viewOnly); + return t(labels.viewOnly); } - return formatMessage(labels.unknown); + return t(labels.unknown); }; return ( - + {username} - + {renderRole(role)} {!cloudMode && ( - + diff --git a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx index 5009ec6c6..d83dfbf02 100644 --- a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx +++ b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx @@ -5,11 +5,11 @@ import { SectionHeader } from '@/components/common/SectionHeader'; import { useMessages } from '@/components/hooks'; export function WebsitesSettingsPage({ teamId }: { teamId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + ); diff --git a/src/app/(main)/teams/TeamAddForm.tsx b/src/app/(main)/teams/TeamAddForm.tsx index 3b827776b..2599baa40 100644 --- a/src/app/(main)/teams/TeamAddForm.tsx +++ b/src/app/(main)/teams/TeamAddForm.tsx @@ -18,7 +18,7 @@ export function TeamAddForm({ onClose: () => void; isAdmin: boolean; }) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery('/teams'); const handleSubmit = async (data: any) => { @@ -32,20 +32,20 @@ export function TeamAddForm({ return (
- + {isAdmin && ( - + )} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/teams/TeamJoinForm.tsx b/src/app/(main)/teams/TeamJoinForm.tsx index 697807889..3aa865319 100644 --- a/src/app/(main)/teams/TeamJoinForm.tsx +++ b/src/app/(main)/teams/TeamJoinForm.tsx @@ -9,7 +9,7 @@ import { import { useMessages, useUpdateQuery } from '@/components/hooks'; export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const { mutateAsync, error, touch } = useUpdateQuery('/teams/join'); const handleSubmit = async (data: any) => { @@ -25,15 +25,15 @@ export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: return (
- - {formatMessage(labels.join)} + + {t(labels.join)}
); diff --git a/src/app/(main)/teams/TeamLeaveButton.tsx b/src/app/(main)/teams/TeamLeaveButton.tsx index 2cca76f86..b4902fa01 100644 --- a/src/app/(main)/teams/TeamLeaveButton.tsx +++ b/src/app/(main)/teams/TeamLeaveButton.tsx @@ -5,7 +5,7 @@ import { LogOut } from '@/components/icons'; import { TeamLeaveForm } from './TeamLeaveForm'; export function TeamLeaveButton({ teamId, teamName }: { teamId: string; teamName: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const router = useRouter(); const { user } = useLoginQuery(); const { touch } = useModified(); @@ -21,10 +21,10 @@ export function TeamLeaveButton({ teamId, teamName }: { teamId: string; teamName - {formatMessage(labels.leave)} + {t(labels.leave)} - + {({ close }) => ( void; onClose: () => void; }) { - const { formatMessage, labels, messages, getErrorMessage, FormattedMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending } = useDeleteQuery(`/teams/${teamId}/users/${userId}`); const { touch } = useModified(); @@ -30,15 +30,11 @@ export function TeamLeaveForm({ return ( {teamName}, - }} - /> - } + buttonLabel={t(labels.leave)} + message={t.rich(messages.confirmLeave, { + target: teamName, + b: chunks => {chunks}, + })} onConfirm={handleConfirm} onClose={onClose} isLoading={isPending} diff --git a/src/app/(main)/teams/TeamMemberAddForm.tsx b/src/app/(main)/teams/TeamMemberAddForm.tsx index d929364eb..4ab314752 100644 --- a/src/app/(main)/teams/TeamMemberAddForm.tsx +++ b/src/app/(main)/teams/TeamMemberAddForm.tsx @@ -22,7 +22,7 @@ export function TeamMemberAddForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery(`/teams/${teamId}/users`); const handleSubmit = async (data: any) => { @@ -37,24 +37,20 @@ export function TeamMemberAddForm({ const renderRole = role => { switch (role) { case ROLES.teamManager: - return formatMessage(labels.manager); + return t(labels.manager); case ROLES.teamMember: - return formatMessage(labels.member); + return t(labels.member); case ROLES.teamViewOnly: - return formatMessage(labels.viewOnly); + return t(labels.viewOnly); } }; return (
- + - + - {formatMessage(labels.manager)} - {formatMessage(labels.member)} - {formatMessage(labels.viewOnly)} + {t(labels.manager)} + {t(labels.member)} + {t(labels.viewOnly)} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx index 4d3e8e91e..ff55a7aab 100644 --- a/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx @@ -2,7 +2,6 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { messages } from '@/components/messages'; export function TeamMemberRemoveButton({ teamId, @@ -16,7 +15,7 @@ export function TeamMemberRemoveButton({ disabled?: boolean; onSave?: () => void; }) { - const { formatMessage, labels, FormattedMessage } = useMessages(); + const { t, labels, messages } = useMessages(); const { mutateAsync, isPending, error } = useDeleteQuery(`/teams/${teamId}/users/${userId}`); const { touch } = useModified(); @@ -31,27 +30,18 @@ export function TeamMemberRemoveButton({ }; return ( - } - title={formatMessage(labels.confirm)} - variant="quiet" - width="400px" - > + } title={t(labels.confirm)} variant="quiet" width="400px"> {({ close }) => ( {userName}, - }} - /> - } + message={t.rich(messages.confirmRemove, { + target: userName, + b: chunks => {chunks}, + })} isLoading={isPending} error={error} onConfirm={handleConfirm.bind(null, close)} onClose={close} - buttonLabel={formatMessage(labels.remove)} + buttonLabel={t(labels.remove)} buttonVariant="danger" /> )} diff --git a/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx index 8414908c1..6c77c89b1 100644 --- a/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx @@ -13,21 +13,21 @@ export function TeamMembersTable({ teamId: string; allowEdit: boolean; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const roles = { - [ROLES.teamOwner]: formatMessage(labels.teamOwner), - [ROLES.teamManager]: formatMessage(labels.teamManager), - [ROLES.teamMember]: formatMessage(labels.teamMember), - [ROLES.teamViewOnly]: formatMessage(labels.viewOnly), + [ROLES.teamOwner]: t(labels.teamOwner), + [ROLES.teamManager]: t(labels.teamManager), + [ROLES.teamMember]: t(labels.teamMember), + [ROLES.teamViewOnly]: t(labels.viewOnly), }; return ( - + {(row: any) => row?.user?.username} - + {(row: any) => roles[row?.role]} {allowEdit && ( diff --git a/src/app/(main)/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/teams/[teamId]/TeamSettings.tsx index c0259f47d..e854c127e 100644 --- a/src/app/(main)/teams/[teamId]/TeamSettings.tsx +++ b/src/app/(main)/teams/[teamId]/TeamSettings.tsx @@ -4,7 +4,6 @@ import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; import { useLoginQuery, useMessages, useNavigation, useTeam } from '@/components/hooks'; import { Users } from '@/components/icons'; -import { labels } from '@/components/messages'; import { ROLES } from '@/lib/constants'; import { TeamsMemberAddButton } from '../TeamsMemberAddButton'; import { TeamEditForm } from './TeamEditForm'; @@ -15,7 +14,7 @@ export function TeamSettings({ teamId }: { teamId: string }) { const team: any = useTeam(); const { user } = useLoginQuery(); const { pathname } = useNavigation(); - const { formatMessage } = useMessages(); + const { t, labels } = useMessages(); const isAdmin = pathname.includes('/admin'); @@ -41,7 +40,7 @@ export function TeamSettings({ teamId }: { teamId: string }) {
- {formatMessage(labels.members)} + {t(labels.members)} {isAdmin && } diff --git a/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx index f2b4ecea0..7ba5ba11a 100644 --- a/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx +++ b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx @@ -3,7 +3,7 @@ import { useDeleteQuery, useMessages } from '@/components/hooks'; import { X } from '@/components/icons'; export function TeamWebsiteRemoveButton({ teamId, websiteId, onSave }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { mutateAsync } = useDeleteQuery(`/teams/${teamId}/websites/${websiteId}`); const handleRemoveTeamMember = async () => { @@ -19,7 +19,7 @@ export function TeamWebsiteRemoveButton({ teamId, websiteId, onSave }) { - {formatMessage(labels.remove)} + {t(labels.remove)} ); } diff --git a/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx index 10f565432..f4ed2df7e 100644 --- a/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx +++ b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx @@ -14,15 +14,15 @@ export function TeamWebsitesTable({ data: any[]; allowEdit: boolean; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - + {(row: any) => {row.name}} - - + + {(row: any) => row?.createUser?.username} {allowEdit && ( diff --git a/src/app/(main)/websites/WebsiteAddButton.tsx b/src/app/(main)/websites/WebsiteAddButton.tsx index 76710abbd..340c6fdc0 100644 --- a/src/app/(main)/websites/WebsiteAddButton.tsx +++ b/src/app/(main)/websites/WebsiteAddButton.tsx @@ -5,23 +5,18 @@ import { DialogButton } from '@/components/input/DialogButton'; import { WebsiteAddForm } from './WebsiteAddForm'; export function WebsiteAddButton({ teamId, onSave }: { teamId: string; onSave?: () => void }) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { toast } = useToast(); const { touch } = useModified(); const handleSave = async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('websites'); onSave?.(); }; return ( - } - label={formatMessage(labels.addWebsite)} - variant="primary" - width="400px" - > + } label={t(labels.addWebsite)} variant="primary" width="400px"> {({ close }) => } ); diff --git a/src/app/(main)/websites/WebsiteAddForm.tsx b/src/app/(main)/websites/WebsiteAddForm.tsx index df17ad5a6..7f28651fc 100644 --- a/src/app/(main)/websites/WebsiteAddForm.tsx +++ b/src/app/(main)/websites/WebsiteAddForm.tsx @@ -11,7 +11,7 @@ export function WebsiteAddForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery('/websites', { teamId }); const handleSubmit = async (data: any) => { @@ -26,21 +26,21 @@ export function WebsiteAddForm({ return (
@@ -48,11 +48,11 @@ export function WebsiteAddForm({ {onClose && ( )} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/websites/WebsitesHeader.tsx b/src/app/(main)/websites/WebsitesHeader.tsx index 889b6025f..da9fd7e87 100644 --- a/src/app/(main)/websites/WebsitesHeader.tsx +++ b/src/app/(main)/websites/WebsitesHeader.tsx @@ -7,11 +7,11 @@ export interface WebsitesHeaderProps { } export function WebsitesHeader({ allowCreate = true }: WebsitesHeaderProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { teamId } = useNavigation(); return ( - + {allowCreate && } ); diff --git a/src/app/(main)/websites/WebsitesPage.tsx b/src/app/(main)/websites/WebsitesPage.tsx index 6f3548a97..4decd8f19 100644 --- a/src/app/(main)/websites/WebsitesPage.tsx +++ b/src/app/(main)/websites/WebsitesPage.tsx @@ -11,7 +11,7 @@ import { WebsitesDataTable } from './WebsitesDataTable'; export function WebsitesPage() { const { user } = useLoginQuery(); const { teamId } = useNavigation(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data } = useTeamMembersQuery(teamId); const showActions = @@ -23,7 +23,7 @@ export function WebsitesPage() { return ( - + {showActions && } diff --git a/src/app/(main)/websites/WebsitesTable.tsx b/src/app/(main)/websites/WebsitesTable.tsx index 70648ed78..714e1c66c 100644 --- a/src/app/(main)/websites/WebsitesTable.tsx +++ b/src/app/(main)/websites/WebsitesTable.tsx @@ -12,15 +12,15 @@ export interface WebsitesTableProps extends DataTableProps { } export function WebsitesTable({ showActions, renderLink, ...props }: WebsitesTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { renderUrl } = useNavigation(); return ( - + {renderLink} - + {showActions && ( {(row: any) => { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx index 629c91391..e11308fb3 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx @@ -37,7 +37,7 @@ export function Attribution({ step, }); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pageviews, visitors, visits } = data?.total || {}; @@ -45,17 +45,17 @@ export function Attribution({ ? [ { value: visitors, - label: formatMessage(labels.visitors), + label: t(labels.visitors), formatValue: formatLongNumber, }, { value: visits, - label: formatMessage(labels.visits), + label: t(labels.visits), formatValue: formatLongNumber, }, { value: pageviews, - label: formatMessage(labels.views), + label: t(labels.views), formatValue: formatLongNumber, }, ] @@ -72,7 +72,7 @@ export function Attribution({ return ( ({ label: x, @@ -94,31 +94,31 @@ export function Attribution({ ); })} - + - + - + - + - + - + - + - + diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx index 485277f20..f0786332a 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx @@ -9,7 +9,7 @@ export function AttributionPage({ websiteId }: { websiteId: string }) { const [model, setModel] = useState('first-click'); const [type, setType] = useState('path'); const [step, setStep] = useState('/'); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { dateRange: { startDate, endDate }, } = useDateRange(); @@ -19,30 +19,20 @@ export function AttributionPage({ websiteId }: { websiteId: string }) { - + {t(labels.firstClick)} + {t(labels.lastClick)} - + {t(labels.viewedPage)} + {t(labels.triggeredEvent)} ( @@ -48,37 +48,22 @@ export function Breakdown({ websiteId, selectedFields = [], startDate, endDate }
); })} - + {row => row?.visitors?.toLocaleString()} - + {row => row?.visits?.toLocaleString()} - + {row => row?.views?.toLocaleString()} - + {row => { const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100; return `${Math.round(+n)}%`; }} - + {row => { const n = row?.totaltime / row?.visits; return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx index fdead9fbf..17e4a2829 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx @@ -33,12 +33,12 @@ export function BreakdownPage({ websiteId }: { websiteId: string }) { } const FieldsButton = ({ value, onChange }) => { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( } - label={formatMessage(labels.fields)} + label={t(labels.fields)} width="400px" minHeight="300px" variant="outline" diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx index fbad47491..b7537c7fa 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx @@ -12,7 +12,7 @@ export function FieldSelectForm({ onClose?: () => void; }) { const [selected, setSelected] = useState(selectedFields); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { fields, groupLabels } = useFields(); const handleChange = (value: string[]) => { @@ -57,9 +57,9 @@ export function FieldSelectForm({
- +
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx index 7821b07c1..dc11544d9 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx @@ -19,7 +19,7 @@ type FunnelResult = { }; export function Funnel({ id, name, type, parameters, websiteId }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname } = useNavigation(); const isSharePage = pathname.includes('/share/'); const { data, error, isLoading } = useResultQuery(type, { @@ -43,10 +43,7 @@ export function Funnel({ id, name, type, parameters, websiteId }) { {({ close }) => { return ( - + ); @@ -90,9 +87,9 @@ export function Funnel({ id, name, type, parameters, websiteId }) { - {formatMessage(isPage ? labels.viewedPage : labels.triggeredEvent)} + {t(isPage ? labels.viewedPage : labels.triggeredEvent)} - {formatMessage(labels.conversionRate)} + {t(labels.conversionRate)} @@ -109,7 +106,7 @@ export function Funnel({ id, name, type, parameters, websiteId }) { - {`${formatLongNumber(visitors)} ${formatMessage(labels.visitors)}`} + {`${formatLongNumber(visitors)} ${t(labels.visitors)}`} diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx index 29b548032..699ff83bf 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx @@ -4,7 +4,7 @@ import { Plus } from '@/components/icons'; import { FunnelEditForm } from './FunnelEditForm'; export function FunnelAddButton({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( @@ -12,14 +12,10 @@ export function FunnelAddButton({ websiteId }: { websiteId: string }) { - {formatMessage(labels.funnel)} + {t(labels.funnel)} - + {({ close }) => } diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx index 5d950ea66..a00c916de 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx @@ -31,7 +31,7 @@ export function FunnelEditForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data } = useReportQuery(id); const { mutateAsync, error, isPending, touch } = useUpdateQuery(`/reports${id ? `/${id}` : ''}`); @@ -61,23 +61,15 @@ export function FunnelEditForm({ return (
- + - + value.length > 1 || 'At least two steps are required', }} @@ -91,7 +83,7 @@ export function FunnelEditForm({ @@ -99,7 +91,7 @@ export function FunnelEditForm({ {({ field, context }) => { const type = context.watch(`steps.${index}.type`); @@ -123,7 +115,7 @@ export function FunnelEditForm({ - {formatMessage(labels.add)} + {t(labels.add)} @@ -132,9 +124,9 @@ export function FunnelEditForm({ - {formatMessage(labels.save)} + {t(labels.save)} ); diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx index 40abea27c..d7553eea5 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx @@ -24,7 +24,7 @@ export interface GoalProps { export type GoalData = { num: number; total: number }; export function Goal({ id, name, type, parameters, websiteId, startDate, endDate }: GoalProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname } = useNavigation(); const isSharePage = pathname.includes('/share/'); const { data, error, isLoading, isFetching } = useResultQuery(type, { @@ -53,7 +53,7 @@ export function Goal({ id, name, type, parameters, websiteId, startDate, endDate {({ close }) => { return ( @@ -66,10 +66,8 @@ export function Goal({ id, name, type, parameters, websiteId, startDate, endDate )} - - {formatMessage(isPage ? labels.viewedPage : labels.triggeredEvent)} - - {formatMessage(labels.conversionRate)} + {t(isPage ? labels.viewedPage : labels.triggeredEvent)} + {t(labels.conversionRate)} diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx index c85b79c54..bf42b6560 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx @@ -4,7 +4,7 @@ import { Plus } from '@/components/icons'; import { GoalEditForm } from './GoalEditForm'; export function GoalAddButton({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( @@ -12,12 +12,12 @@ export function GoalAddButton({ websiteId }: { websiteId: string }) { - {formatMessage(labels.goal)} + {t(labels.goal)} {({ close }) => } diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx index 7f68047c3..159e43828 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx @@ -25,7 +25,7 @@ export function GoalEditForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data } = useReportQuery(id); const { mutateAsync, error, isPending, touch } = useUpdateQuery(`/reports${id ? `/${id}` : ''}`); @@ -59,29 +59,19 @@ export function GoalEditForm({ return ( <> - + - + - + - + {({ field }) => { return ; }} @@ -92,9 +82,9 @@ export function GoalEditForm({ - {formatMessage(labels.save)} + {t(labels.save)} ); diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx index 2afa08f3b..8b3c47499 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx @@ -32,7 +32,7 @@ const EVENT_TYPES = { export function Journey({ websiteId, steps, startStep, endStep, view }: JourneyProps) { const [selectedNode, setSelectedNode] = useState(null); const [activeNode, setActiveNode] = useState(null); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, error, isLoading } = useResultQuery('journey', { websiteId, steps, @@ -178,7 +178,7 @@ export function Journey({ websiteId, steps, startStep, endStep, view }: JourneyP
{columnIndex + 1}
- {formatLongNumber(visitorCount)} {formatMessage(labels.visitors)} + {formatLongNumber(visitorCount)} {t(labels.visitors)}
@@ -237,11 +237,11 @@ export function Journey({ websiteId, steps, startStep, endStep, view }: JourneyP - {`${dropped}% ${formatMessage(labels.dropoff)}`} + {`${dropped}% ${t(labels.dropoff)}`} - {`${remaining}% ${formatMessage(labels.conversion)}`} + {`${remaining}% ${t(labels.conversion)}`} diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx index c8276edca..f7cc4a88d 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx @@ -11,7 +11,7 @@ const JOURNEY_STEPS = [2, 3, 4, 5, 6, 7]; const DEFAULT_STEP = 3; export function JourneysPage({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { dateRange: { startDate, endDate }, } = useDateRange(); @@ -23,15 +23,15 @@ export function JourneysPage({ websiteId }: { websiteId: string }) { const buttons = [ { id: 'all', - label: formatMessage(labels.all), + label: t(labels.all), }, { id: 'views', - label: formatMessage(labels.views), + label: t(labels.views), }, { id: 'events', - label: formatMessage(labels.events), + label: t(labels.events), }, ]; @@ -39,12 +39,7 @@ export function JourneysPage({ websiteId }: { websiteId: string }) { - {JOURNEY_STEPS.map(step => ( {step} @@ -53,7 +48,7 @@ export function JourneysPage({ websiteId }: { websiteId: string }) { - {formatMessage(labels.cohort)} + {t(labels.cohort)} {days.map(n => ( - {formatMessage(labels.day)} {n} + {t(labels.day)} {n} ))} diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx index faee8b9a4..3a7b2058b 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx @@ -34,7 +34,7 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) { setItem(CURRENCY_CONFIG, value); }; - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { locale, dateLocale } = useLocale(); const { countryNames } = useCountryNames(locale); const { data, error, isLoading } = useResultQuery('revenue', { @@ -48,7 +48,7 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) { ({ label: code }) => ( - {countryNames[code] || formatMessage(labels.unknown)} + {countryNames[code] || t(labels.unknown)} ), [countryNames, locale], @@ -90,22 +90,22 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) { return [ { value: sum, - label: formatMessage(labels.total), + label: t(labels.total), formatValue: n => formatLongCurrency(n, currency), }, { value: count ? sum / count : 0, - label: formatMessage(labels.average), + label: t(labels.average), formatValue: n => formatLongCurrency(n, currency), }, { value: count, - label: formatMessage(labels.transactions), + label: t(labels.transactions), formatValue: formatLongNumber, }, { value: unique_count, - label: formatMessage(labels.uniqueCustomers), + label: t(labels.uniqueCustomers), formatValue: formatLongNumber, }, ] as any; @@ -142,8 +142,8 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) { ({ label: name, count: Number(value), diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenueTable.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenueTable.tsx index e30d54c76..f8164147f 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenueTable.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenueTable.tsx @@ -3,19 +3,19 @@ import { useMessages } from '@/components/hooks'; import { formatLongCurrency } from '@/lib/format'; export function RevenueTable({ data = [] }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - - + + {(row: any) => formatLongCurrency(row.sum, row.currency)} - + {(row: any) => formatLongCurrency(row.count ? row.sum / row.count : 0, row.currency)} - - + + ); } diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx index d6265802b..846546106 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx @@ -13,7 +13,7 @@ export interface UTMProps { } export function UTM({ websiteId, startDate, endDate }: UTMProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, error, isLoading } = useResultQuery('utm', { websiteId, startDate, @@ -49,7 +49,7 @@ export function UTM({ websiteId, startDate, endDate }: UTMProps) { {param.replace(/^utm_/, '')} ({ label: utm, count: views, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx index b504bd360..c49eaa02f 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx @@ -35,7 +35,7 @@ export function WebsiteExpandedMenu({ excludedIds?: string[]; onItemClick?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { updateParams, query: { view }, @@ -49,176 +49,176 @@ export function WebsiteExpandedMenu({ items: [ { id: 'path', - label: formatMessage(labels.path), + label: t(labels.path), path: updateParams({ view: 'path' }), icon: , }, { id: 'entry', - label: formatMessage(labels.entry), + label: t(labels.entry), path: updateParams({ view: 'entry' }), icon: , }, { id: 'exit', - label: formatMessage(labels.exit), + label: t(labels.exit), path: updateParams({ view: 'exit' }), icon: , }, { id: 'title', - label: formatMessage(labels.title), + label: t(labels.title), path: updateParams({ view: 'title' }), icon: , }, { id: 'query', - label: formatMessage(labels.query), + label: t(labels.query), path: updateParams({ view: 'query' }), icon: , }, ].filter(filterExcluded), }, { - label: formatMessage(labels.sources), + label: t(labels.sources), items: [ { id: 'referrer', - label: formatMessage(labels.referrer), + label: t(labels.referrer), path: updateParams({ view: 'referrer' }), icon: , }, { id: 'channel', - label: formatMessage(labels.channel), + label: t(labels.channel), path: updateParams({ view: 'channel' }), icon: , }, { id: 'domain', - label: formatMessage(labels.domain), + label: t(labels.domain), path: updateParams({ view: 'domain' }), icon: , }, ].filter(filterExcluded), }, { - label: formatMessage(labels.location), + label: t(labels.location), items: [ { id: 'country', - label: formatMessage(labels.country), + label: t(labels.country), path: updateParams({ view: 'country' }), icon: , }, { id: 'region', - label: formatMessage(labels.region), + label: t(labels.region), path: updateParams({ view: 'region' }), icon: , }, { id: 'city', - label: formatMessage(labels.city), + label: t(labels.city), path: updateParams({ view: 'city' }), icon: , }, ].filter(filterExcluded), }, { - label: formatMessage(labels.environment), + label: t(labels.environment), items: [ { id: 'browser', - label: formatMessage(labels.browser), + label: t(labels.browser), path: updateParams({ view: 'browser' }), icon: , }, { id: 'os', - label: formatMessage(labels.os), + label: t(labels.os), path: updateParams({ view: 'os' }), icon: , }, { id: 'device', - label: formatMessage(labels.device), + label: t(labels.device), path: updateParams({ view: 'device' }), icon: , }, { id: 'language', - label: formatMessage(labels.language), + label: t(labels.language), path: updateParams({ view: 'language' }), icon: , }, { id: 'screen', - label: formatMessage(labels.screen), + label: t(labels.screen), path: updateParams({ view: 'screen' }), icon: , }, ].filter(filterExcluded), }, { - label: formatMessage(labels.utm), + label: t(labels.utm), items: [ { id: 'utmSource', - label: formatMessage(labels.source), + label: t(labels.source), path: updateParams({ view: 'utmSource' }), icon: , }, { id: 'utmMedium', - label: formatMessage(labels.medium), + label: t(labels.medium), path: updateParams({ view: 'utmMedium' }), icon: , }, { id: 'utmCampaign', - label: formatMessage(labels.campaign), + label: t(labels.campaign), path: updateParams({ view: 'utmCampaign' }), icon: , }, { id: 'utmContent', - label: formatMessage(labels.content), + label: t(labels.content), path: updateParams({ view: 'utmContent' }), icon: , }, { id: 'utmTerm', - label: formatMessage(labels.term), + label: t(labels.term), path: updateParams({ view: 'utmTerm' }), icon: , }, ].filter(filterExcluded), }, { - label: formatMessage(labels.other), + label: t(labels.other), items: [ { id: 'event', - label: formatMessage(labels.event), + label: t(labels.event), path: updateParams({ view: 'event' }), icon: , }, { id: 'hostname', - label: formatMessage(labels.hostname), + label: t(labels.hostname), path: updateParams({ view: 'hostname' }), icon: , }, { id: 'distinctId', - label: formatMessage(labels.distinctId), + label: t(labels.distinctId), path: updateParams({ view: 'distinctId' }), icon: , }, { id: 'tag', - label: formatMessage(labels.tag), + label: t(labels.tag), path: updateParams({ view: 'tag' }), icon: , }, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx index 3641e75d8..71fbdc703 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx @@ -13,7 +13,7 @@ export function WebsiteExpandedView({ excludedIds?: string[]; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { query: { view }, } = useNavigation(); @@ -45,7 +45,7 @@ export function WebsiteExpandedView({ - }>{formatMessage(labels.edit)} + }>{t(labels.edit)} )}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx index 132d3b14e..3446440c1 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx @@ -13,12 +13,12 @@ import { useMessages, useNavigation } from '@/components/hooks'; import { Edit, MoreHorizontal, Share } from '@/components/icons'; export function WebsiteMenu({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { router, updateParams, renderUrl } = useNavigation(); const menuItems = [ - { id: 'share', label: formatMessage(labels.share), icon: }, - { id: 'edit', label: formatMessage(labels.edit), icon: , seperator: true }, + { id: 'share', label: t(labels.share), icon: }, + { id: 'edit', label: t(labels.edit), icon: , seperator: true }, ]; const handleAction = (id: any) => { diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx index 605ee3855..e3c263373 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx @@ -14,7 +14,7 @@ export function WebsiteMetricsBar({ compareMode?: boolean; }) { const { isAllTime, dateCompare } = useDateRange(); - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteStatsQuery({ websiteId, compare: compareMode ? dateCompare?.compare : undefined, @@ -26,24 +26,24 @@ export function WebsiteMetricsBar({ ? [ { value: visitors, - label: formatMessage(labels.visitors), + label: t(labels.visitors), change: visitors - comparison.visitors, formatValue: formatLongNumber, }, { value: visits, - label: formatMessage(labels.visits), + label: t(labels.visits), change: visits - comparison.visits, formatValue: formatLongNumber, }, { value: pageviews, - label: formatMessage(labels.views), + label: t(labels.views), change: pageviews - comparison.pageviews, formatValue: formatLongNumber, }, { - label: formatMessage(labels.bounceRate), + label: t(labels.bounceRate), value: (Math.min(visits, bounces) / visits) * 100, prev: (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100, change: @@ -53,7 +53,7 @@ export function WebsiteMetricsBar({ reverseColors: true, }, { - label: formatMessage(labels.visitDuration), + label: t(labels.visitDuration), value: totaltime / visits, prev: comparison.totaltime / comparison.visits, change: totaltime / visits - comparison.totaltime / comparison.visits, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx index c23b1fe23..6bd892e40 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx @@ -24,7 +24,7 @@ export function WebsiteNav({ isCollapsed?: boolean; onItemClick?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { teamId, router, renderUrl } = useNavigation(); const { items, selectedKey } = useWebsiteNavItems(websiteId); @@ -52,14 +52,10 @@ export function WebsiteNav({ borderRadius minHeight="40px" > - } - label={isCollapsed ? '' : formatMessage(labels.back)} - padding - /> + } label={isCollapsed ? '' : t(labels.back)} padding />
- {formatMessage(labels.back)} + {t(labels.back)} {!isCollapsed && ( diff --git a/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx index d76db4af3..7d5d08c8c 100644 --- a/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx @@ -7,13 +7,13 @@ import { WeeklyTraffic } from '@/components/metrics/WeeklyTraffic'; import { WorldMap } from '@/components/metrics/WorldMap'; export function WebsitePanels({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const tableProps = { websiteId, limit: 10, allowDownload: false, showMore: true, - metric: formatMessage(labels.visitors), + metric: t(labels.visitors), }; const rowProps = { minHeight: '570px' }; const { isMobile } = useMobile(); @@ -22,40 +22,36 @@ export function WebsitePanels({ websiteId }: { websiteId: string }) { - {formatMessage(labels.pages)} + {t(labels.pages)} - {formatMessage(labels.path)} - {formatMessage(labels.entry)} - {formatMessage(labels.exit)} + {t(labels.path)} + {t(labels.entry)} + {t(labels.exit)} - + - + - + - {formatMessage(labels.sources)} + {t(labels.sources)} - {formatMessage(labels.referrers)} - {formatMessage(labels.channels)} + {t(labels.referrers)} + {t(labels.channels)} - + - + @@ -63,41 +59,41 @@ export function WebsitePanels({ websiteId }: { websiteId: string }) { - {formatMessage(labels.environment)} + {t(labels.environment)} - {formatMessage(labels.browsers)} - {formatMessage(labels.os)} - {formatMessage(labels.devices)} + {t(labels.browsers)} + {t(labels.os)} + {t(labels.devices)} - + - + - + - {formatMessage(labels.location)} + {t(labels.location)} - {formatMessage(labels.countries)} - {formatMessage(labels.regions)} - {formatMessage(labels.cities)} + {t(labels.countries)} + {t(labels.regions)} + {t(labels.cities)} - + - + - + @@ -109,7 +105,7 @@ export function WebsitePanels({ websiteId }: { websiteId: string }) { - {formatMessage(labels.traffic)} + {t(labels.traffic)} diff --git a/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx index ac978a238..782d55ad8 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx @@ -6,36 +6,36 @@ import { Lightning } from '@/components/svg'; export function WebsiteTabs() { const website = useWebsite(); const { pathname, renderUrl } = useNavigation(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const links = [ { id: 'overview', - label: formatMessage(labels.overview), + label: t(labels.overview), icon: , path: '', }, { id: 'events', - label: formatMessage(labels.events), + label: t(labels.events), icon: , path: '/events', }, { id: 'sessions', - label: formatMessage(labels.sessions), + label: t(labels.sessions), icon: , path: '/sessions', }, { id: 'realtime', - label: formatMessage(labels.realtime), + label: t(labels.realtime), icon: , path: '/realtime', }, { id: 'reports', - label: formatMessage(labels.reports), + label: t(labels.reports), icon: , path: '/reports', }, diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx index 3f7f87232..80699ae99 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx @@ -4,15 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { CohortEditForm } from './CohortEditForm'; export function CohortAddButton({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } - label={formatMessage(labels.cohort)} - variant="primary" - width="800px" - > + } label={t(labels.cohort)} variant="primary" width="800px"> {({ close }) => { return ; }} diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx index 94d62ff2a..1493ed297 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx @@ -2,7 +2,6 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { messages } from '@/components/messages'; export function CohortDeleteButton({ cohortId, @@ -15,7 +14,7 @@ export function CohortDeleteButton({ name: string; onSave?: () => void; }) { - const { formatMessage, labels, FormattedMessage } = useMessages(); + const { t, labels, messages } = useMessages(); const { mutateAsync, isPending, error, touch } = useDeleteQuery( `/websites/${websiteId}/segments/${cohortId}`, ); @@ -31,27 +30,18 @@ export function CohortDeleteButton({ }; return ( - } - variant="quiet" - title={formatMessage(labels.confirm)} - width="400px" - > + } variant="quiet" title={t(labels.confirm)} width="400px"> {({ close }) => ( {name}, - }} - /> - } + message={t.rich(messages.confirmRemove, { + target: name, + b: chunks => {chunks}, + })} isLoading={isPending} error={error} onConfirm={handleConfirm.bind(null, close)} onClose={close} - buttonLabel={formatMessage(labels.delete)} + buttonLabel={t(labels.delete)} buttonVariant="danger" /> )} diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx index 07990712a..02f533dbf 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx @@ -13,15 +13,10 @@ export function CohortEditButton({ websiteId: string; filters: Filter[]; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } - variant="quiet" - title={formatMessage(labels.cohort)} - width="800px" - > + } variant="quiet" title={t(labels.cohort)} width="800px"> {({ close }) => { return ( void; }) { const { data } = useWebsiteCohortQuery(websiteId, cohortId); - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery( `/websites/${websiteId}/segments${cohortId ? `/${cohortId}` : ''}`, @@ -43,7 +43,7 @@ export function CohortEditForm({ const handleSubmit = async (formData: any) => { await mutateAsync(formData, { onSuccess: async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('cohorts'); onSave?.(); onClose?.(); @@ -70,29 +70,22 @@ export function CohortEditForm({ return ( <> - + - + - + {({ field }) => { return ; @@ -103,17 +96,14 @@ export function CohortEditForm({ - - + + - + @@ -121,10 +111,10 @@ export function CohortEditForm({ - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx index 5c7ac03fa..fe9c95441 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx @@ -7,17 +7,17 @@ import { useMessages, useNavigation } from '@/components/hooks'; import { filtersObjectToArray } from '@/lib/params'; export function CohortsTable(props: DataTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { websiteId, renderUrl } = useNavigation(); return ( - + {(row: any) => ( {row.name} )} - + {(row: any) => } diff --git a/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx index c44a05508..3a07f9e66 100644 --- a/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx @@ -10,7 +10,7 @@ import { formatNumber } from '@/lib/format'; export function CompareTables({ websiteId }: { websiteId: string }) { const [data, setData] = useState([]); const { dateRange, dateCompare } = useDateRange(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { router, updateParams, @@ -30,102 +30,102 @@ export function CompareTables({ websiteId }: { websiteId: string }) { const items = [ { id: 'path', - label: formatMessage(labels.path), + label: t(labels.path), path: renderPath('path'), }, { id: 'channel', - label: formatMessage(labels.channels), + label: t(labels.channels), path: renderPath('channel'), }, { id: 'referrer', - label: formatMessage(labels.referrers), + label: t(labels.referrers), path: renderPath('referrer'), }, { id: 'browser', - label: formatMessage(labels.browsers), + label: t(labels.browsers), path: renderPath('browser'), }, { id: 'os', - label: formatMessage(labels.os), + label: t(labels.os), path: renderPath('os'), }, { id: 'device', - label: formatMessage(labels.devices), + label: t(labels.devices), path: renderPath('device'), }, { id: 'country', - label: formatMessage(labels.countries), + label: t(labels.countries), path: renderPath('country'), }, { id: 'region', - label: formatMessage(labels.regions), + label: t(labels.regions), path: renderPath('region'), }, { id: 'city', - label: formatMessage(labels.cities), + label: t(labels.cities), path: renderPath('city'), }, { id: 'language', - label: formatMessage(labels.languages), + label: t(labels.languages), path: renderPath('language'), }, { id: 'screen', - label: formatMessage(labels.screens), + label: t(labels.screens), path: renderPath('screen'), }, { id: 'event', - label: formatMessage(labels.events), + label: t(labels.events), path: renderPath('event'), }, { id: 'utmSource', - label: formatMessage(labels.utmSource), + label: t(labels.utmSource), path: renderPath('utmSource'), }, { id: 'utmMedium', - label: formatMessage(labels.utmMedium), + label: t(labels.utmMedium), path: renderPath('utmMedium'), }, { id: 'utmCampaign', - label: formatMessage(labels.utmCampaign), + label: t(labels.utmCampaign), path: renderPath('utmCampaign'), }, { id: 'utmContent', - label: formatMessage(labels.utmContent), + label: t(labels.utmContent), path: renderPath('utmContent'), }, { id: 'utmTerm', - label: formatMessage(labels.utmTerm), + label: t(labels.utmTerm), path: renderPath('utmTerm'), }, { id: 'hostname', - label: formatMessage(labels.hostname), + label: t(labels.hostname), path: renderPath('hostname'), }, { id: 'distinctId', - label: formatMessage(labels.distinctId), + label: t(labels.distinctId), path: renderPath('distinctId'), }, { id: 'tag', - label: formatMessage(labels.tags), + label: t(labels.tags), path: renderPath('tag'), }, ]; @@ -152,7 +152,7 @@ export function CompareTables({ websiteId }: { websiteId: string }) { <> - - - + + + `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`} /> diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx index c8317a2be..34dfcefee 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx @@ -6,7 +6,7 @@ import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; export function SessionsMetricsBar({ websiteId }: { websiteId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteSessionStatsQuery(websiteId); return ( @@ -15,22 +15,22 @@ export function SessionsMetricsBar({ websiteId }: { websiteId: string }) { diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx index 8e9d2f218..7b0a1afb1 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx @@ -13,7 +13,7 @@ const KEY_NAME = 'umami.sessions.tab'; export function SessionsPage({ websiteId }) { const [tab, setTab] = useState(getItem(KEY_NAME) || 'activity'); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const handleSelect = (value: Key) => { setItem(KEY_NAME, value); @@ -26,8 +26,8 @@ export function SessionsPage({ websiteId }) { - {formatMessage(labels.activity)} - {formatMessage(labels.properties)} + {t(labels.activity)} + {t(labels.properties)} diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx index 5d3bb374e..78a41359b 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx @@ -6,51 +6,51 @@ import { TypeIcon } from '@/components/common/TypeIcon'; import { useFormat, useMessages, useNavigation } from '@/components/hooks'; export function SessionsTable(props: DataTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { formatValue } = useFormat(); const { updateParams } = useNavigation(); return ( - + {(row: any) => ( )} - - - + + + {(row: any) => ( {formatValue(row.country, 'country')} )} - - + + {(row: any) => ( {formatValue(row.browser, 'browser')} )} - + {(row: any) => ( {formatValue(row.os, 'os')} )} - + {(row: any) => ( {formatValue(row.device, 'device')} )} - + {(row: any) => } diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx index 35e96df3f..0c05c5819 100644 --- a/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx @@ -2,7 +2,6 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { messages } from '@/components/messages'; export function ShareDeleteButton({ shareId, @@ -13,7 +12,7 @@ export function ShareDeleteButton({ slug: string; onSave?: () => void; }) { - const { formatMessage, labels, getErrorMessage, FormattedMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, isPending, error } = useDeleteQuery(`/share/id/${shareId}`); const { touch } = useModified(); @@ -28,27 +27,18 @@ export function ShareDeleteButton({ }; return ( - } - title={formatMessage(labels.confirm)} - variant="quiet" - width="400px" - > + } title={t(labels.confirm)} variant="quiet" width="400px"> {({ close }) => ( {slug}, - }} - /> - } + message={t.rich(messages.confirmRemove, { + target: slug, + b: chunks => {chunks}, + })} isLoading={isPending} error={getErrorMessage(error)} onConfirm={handleConfirm.bind(null, close)} onClose={close} - buttonLabel={formatMessage(labels.delete)} + buttonLabel={t(labels.delete)} buttonVariant="danger" /> )} diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx index df1c2e648..66664c5c1 100644 --- a/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx @@ -4,10 +4,10 @@ import { DialogButton } from '@/components/input/DialogButton'; import { ShareEditForm } from './ShareEditForm'; export function ShareEditButton({ shareId }: { shareId: string }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( - } title={formatMessage(labels.share)} variant="quiet" width="600px"> + } title={t(labels.share)} variant="quiet" width="600px"> {({ close }) => { return ; }} diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx index a71a49277..ff62226b1 100644 --- a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx @@ -27,7 +27,7 @@ export function ShareEditForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const { cloudMode } = useConfig(); const { get, post } = useApi(); const { touch } = useModified(); @@ -125,25 +125,21 @@ export function ShareEditForm({ {url && ( - + )} - + {SHARE_NAV_ITEMS.map(section => ( - {formatMessage((labels as any)[section.section])} + {t((labels as any)[section.section])} {section.items.map(item => ( - {formatMessage((labels as any)[item.label])} + {t((labels as any)[item.label])} ))} @@ -153,14 +149,14 @@ export function ShareEditForm({ {onClose && ( )} - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx index 52f8a0579..933fb65ff 100644 --- a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx @@ -6,7 +6,7 @@ import { ShareDeleteButton } from './ShareDeleteButton'; import { ShareEditButton } from './ShareEditButton'; export function SharesTable(props: DataTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { cloudMode } = useConfig(); const { isMobile } = useMobile(); @@ -19,10 +19,10 @@ export function SharesTable(props: DataTableProps) { return ( - + {({ name }: any) => name} - + {({ slug }: any) => { const url = getUrl(slug); return ( @@ -33,7 +33,7 @@ export function SharesTable(props: DataTableProps) { }} {!isMobile && ( - + {(row: any) => } )} diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx index 21cd61370..daf39f8de 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx @@ -13,7 +13,7 @@ import { WebsiteResetForm } from './WebsiteResetForm'; import { WebsiteTransferForm } from './WebsiteTransferForm'; export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { user } = useLoginQuery(); const { touch } = useModified(); const { router, pathname, teamId, renderUrl } = useNavigation(); @@ -49,14 +49,11 @@ export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: return ( {!isAdmin && ( - + - + - + {({ close }) => ( )} @@ -66,14 +63,11 @@ export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: )} - + - + - + {({ close }) => ( )} @@ -82,16 +76,13 @@ export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: - + - + {({ close }) => ( )} diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx index 2fc027687..fb450f478 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx @@ -12,7 +12,7 @@ export function WebsiteDeleteForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { mutateAsync, isPending, error, touch } = useDeleteQuery(`/websites/${websiteId}`); const handleConfirm = async () => { @@ -33,7 +33,7 @@ export function WebsiteDeleteForm({ onClose={onClose} isLoading={isPending} error={error} - buttonLabel={formatMessage(labels.delete)} + buttonLabel={t(labels.delete)} buttonVariant="danger" /> ); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx index 4ae819ee5..49344558c 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx @@ -4,13 +4,13 @@ import { DOMAIN_REGEX } from '@/lib/constants'; export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) { const website = useWebsite(); - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, touch, toast } = useUpdateQuery(`/websites/${websiteId}`); const handleSubmit = async (data: any) => { await mutateAsync(data, { onSuccess: async () => { - toast(formatMessage(messages.saved)); + toast(t(messages.saved)); touch('websites'); touch(`website:${website.id}`); onSave?.(); @@ -20,26 +20,26 @@ export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSa return (
- + @@ -47,7 +47,7 @@ export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSa - {formatMessage(labels.save)} + {t(labels.save)} diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx index d791bc965..72a308eb0 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx @@ -12,7 +12,7 @@ export function WebsiteResetForm({ onSave?: () => void; onClose?: () => void; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { mutateAsync, isPending, error } = useUpdateQuery(`/websites/${websiteId}/reset`); const handleConfirm = async () => { @@ -31,7 +31,7 @@ export function WebsiteResetForm({ onClose={onClose} isLoading={isPending} error={error} - buttonLabel={formatMessage(labels.reset)} + buttonLabel={t(labels.reset)} /> ); } diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx index 4332577b7..ec9eb0b81 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx @@ -7,14 +7,14 @@ import { ArrowLeft, Globe } from '@/components/icons'; export function WebsiteSettingsHeader() { const website = useWebsite(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { renderUrl } = useNavigation(); return ( <> - } label={formatMessage(labels.website)} /> + } label={t(labels.website)} /> } /> diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx index 2ba9764d2..57b52cfb7 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx @@ -11,7 +11,7 @@ export interface WebsiteShareFormProps { } export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) { - const { formatMessage, labels, messages } = useMessages(); + const { t, labels, messages } = useMessages(); const { data, error, isLoading } = useWebsiteSharesQuery({ websiteId }); const shares = data?.data || []; @@ -21,11 +21,11 @@ export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) { - {formatMessage(labels.share)} + {t(labels.share)} } - label={formatMessage(labels.add)} - title={formatMessage(labels.share)} + label={t(labels.add)} + title={t(labels.share)} variant="primary" width="600px" > @@ -34,12 +34,12 @@ export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) { {hasShares ? ( <> - {formatMessage(messages.shareUrl)} + {t(messages.shareUrl)} ) : ( - {formatMessage(messages.noDataAvailable)} + {t(messages.noDataAvailable)} )} diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx index d24f9485d..4fdf7ca70 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx @@ -10,7 +10,7 @@ export function WebsiteTrackingCode({ websiteId: string; hostUrl?: string; }) { - const { formatMessage, messages, labels } = useMessages(); + const { t, messages, labels } = useMessages(); const config = useConfig(); const trackerScriptName = @@ -32,8 +32,8 @@ export function WebsiteTrackingCode({ return ( - - {formatMessage(messages.trackingCode)} + + {t(messages.trackingCode)} ); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx index 8af4f05c2..ce54f8199 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx @@ -31,7 +31,7 @@ export function WebsiteTransferForm({ const { user } = useLoginQuery(); const website = useWebsite(); const [teamId, setTeamId] = useState(null); - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); const { mutateAsync, error, isPending } = useUpdateQuery(`/websites/${websiteId}/transfer`); const { data: teams, isLoading } = useUserTeamsQuery(user.id); const isTeamWebsite = !!website?.teamId; @@ -70,9 +70,7 @@ export function WebsiteTransferForm({ return (
- {formatMessage( - isTeamWebsite ? messages.transferTeamWebsiteToUser : messages.transferUserWebsiteToTeam, - )} + {t(isTeamWebsite ? messages.transferTeamWebsiteToUser : messages.transferUserWebsiteToTeam)} {!isTeamWebsite && ( @@ -88,13 +86,13 @@ export function WebsiteTransferForm({ )} - + - {formatMessage(labels.transfer)} + {t(labels.transfer)}
diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index 26d78dd54..936a30e77 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -16,7 +16,7 @@ import { setClientAuthToken } from '@/lib/client'; import { setUser } from '@/store/app'; export function LoginForm() { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); const router = useRouter(); const { mutateAsync, error } = useUpdateQuery('/auth/login'); @@ -38,19 +38,19 @@ export function LoginForm() { umami
@@ -61,7 +61,7 @@ export function LoginForm() { style={{ flex: 1 }} isDisabled={false} > - {formatMessage(labels.login)} + {t(labels.login)}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index b37615134..fe7e70442 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -3,11 +3,11 @@ import { Flexbox } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; export default function () { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( -

{formatMessage(labels.pageNotFound)}

+

{t(labels.pageNotFound)}

); } diff --git a/src/app/share/[slug]/[[...path]]/ShareNav.tsx b/src/app/share/[slug]/[[...path]]/ShareNav.tsx index c05be050d..8afe1ce64 100644 --- a/src/app/share/[slug]/[[...path]]/ShareNav.tsx +++ b/src/app/share/[slug]/[[...path]]/ShareNav.tsx @@ -16,7 +16,7 @@ export function ShareNav({ onItemClick?: () => void; }) { const share = useShare(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname } = useNavigation(); const { slug, parameters, whiteLabel } = share; @@ -29,41 +29,41 @@ export function ShareNav({ const allItems = [ { section: 'traffic', - label: formatMessage(labels.traffic), + label: t(labels.traffic), items: [ { id: 'overview', - label: formatMessage(labels.overview), + label: t(labels.overview), icon: , path: renderPath(''), }, { id: 'events', - label: formatMessage(labels.events), + label: t(labels.events), icon: , path: renderPath('/events'), }, { id: 'sessions', - label: formatMessage(labels.sessions), + label: t(labels.sessions), icon: , path: renderPath('/sessions'), }, { id: 'realtime', - label: formatMessage(labels.realtime), + label: t(labels.realtime), icon: , path: renderPath('/realtime'), }, { id: 'compare', - label: formatMessage(labels.compare), + label: t(labels.compare), icon: , path: renderPath('/compare'), }, { id: 'breakdown', - label: formatMessage(labels.breakdown), + label: t(labels.breakdown), icon: , path: renderPath('/breakdown'), }, @@ -71,29 +71,29 @@ export function ShareNav({ }, { section: 'behavior', - label: formatMessage(labels.behavior), + label: t(labels.behavior), items: [ { id: 'goals', - label: formatMessage(labels.goals), + label: t(labels.goals), icon: , path: renderPath('/goals'), }, { id: 'funnels', - label: formatMessage(labels.funnels), + label: t(labels.funnels), icon: , path: renderPath('/funnels'), }, { id: 'journeys', - label: formatMessage(labels.journeys), + label: t(labels.journeys), icon: , path: renderPath('/journeys'), }, { id: 'retention', - label: formatMessage(labels.retention), + label: t(labels.retention), icon: , path: renderPath('/retention'), }, @@ -101,23 +101,23 @@ export function ShareNav({ }, { section: 'growth', - label: formatMessage(labels.growth), + label: t(labels.growth), items: [ { id: 'utm', - label: formatMessage(labels.utm), + label: t(labels.utm), icon: , path: renderPath('/utm'), }, { id: 'revenue', - label: formatMessage(labels.revenue), + label: t(labels.revenue), icon: , path: renderPath('/revenue'), }, { id: 'attribution', - label: formatMessage(labels.attribution), + label: t(labels.attribution), icon: , path: renderPath('/attribution'), }, diff --git a/src/components/common/ConfirmationForm.tsx b/src/components/common/ConfirmationForm.tsx index b909ef58a..fd7663369 100644 --- a/src/components/common/ConfirmationForm.tsx +++ b/src/components/common/ConfirmationForm.tsx @@ -21,20 +21,20 @@ export function ConfirmationForm({ onConfirm, onClose, }: ConfirmationFormProps) { - const { formatMessage, labels, getErrorMessage } = useMessages(); + const { t, labels, getErrorMessage } = useMessages(); return (
{message} - + - {buttonLabel || formatMessage(labels.ok)} + {buttonLabel || t(labels.ok)}
diff --git a/src/components/common/DataGrid.tsx b/src/components/common/DataGrid.tsx index b98367e2f..e01891a5f 100644 --- a/src/components/common/DataGrid.tsx +++ b/src/components/common/DataGrid.tsx @@ -37,7 +37,7 @@ export function DataGrid({ renderEmpty = () => , children, }: DataGridProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, error, isLoading, isFetching } = query; const { router, updateParams, query: queryParams } = useNavigation(); const [search, setSearch] = useState(queryParams?.search || data?.search || ''); @@ -70,7 +70,7 @@ export function DataGrid({ onSearch={handleSearch} delay={searchDelay || DEFAULT_SEARCH_DELAY} autoFocus={autoFocus} - placeholder={formatMessage(labels.search)} + placeholder={t(labels.search)} /> {renderActions?.()}
diff --git a/src/components/common/Empty.tsx b/src/components/common/Empty.tsx index 8bd8d82db..3f1374c7c 100644 --- a/src/components/common/Empty.tsx +++ b/src/components/common/Empty.tsx @@ -6,7 +6,7 @@ export interface EmptyProps { } export function Empty({ message }: EmptyProps) { - const { formatMessage, messages } = useMessages(); + const { t, messages } = useMessages(); return ( - {message || formatMessage(messages.noDataAvailable)} + {message || t(messages.noDataAvailable)} ); } diff --git a/src/components/common/ErrorBoundary.tsx b/src/components/common/ErrorBoundary.tsx index 4c0c82ed3..e70c193a3 100644 --- a/src/components/common/ErrorBoundary.tsx +++ b/src/components/common/ErrorBoundary.tsx @@ -9,7 +9,7 @@ const logError = (error: Error, info: ErrorInfo) => { }; export function ErrorBoundary({ children }: { children: ReactNode }) { - const { formatMessage, messages } = useMessages(); + const { t, messages } = useMessages(); const fallbackRender = ({ error, resetErrorBoundary }) => { return ( @@ -22,7 +22,7 @@ export function ErrorBoundary({ children }: { children: ReactNode }) { justifyContent="center" alignItems="center" > -

{formatMessage(messages.error)}

+

{t(messages.error)}

{error.message}

{error.stack}
diff --git a/src/components/common/ErrorMessage.tsx b/src/components/common/ErrorMessage.tsx index 3c3015131..a1ff16bb8 100644 --- a/src/components/common/ErrorMessage.tsx +++ b/src/components/common/ErrorMessage.tsx @@ -3,14 +3,14 @@ import { useMessages } from '@/components/hooks'; import { AlertTriangle } from '@/components/icons'; export function ErrorMessage() { - const { formatMessage, messages } = useMessages(); + const { t, messages } = useMessages(); return ( - {formatMessage(messages.error)} + {t(messages.error)} ); } diff --git a/src/components/common/FilterLink.tsx b/src/components/common/FilterLink.tsx index d719a37e8..df9eab9b7 100644 --- a/src/components/common/FilterLink.tsx +++ b/src/components/common/FilterLink.tsx @@ -14,7 +14,7 @@ export interface FilterLinkProps extends HTMLAttributes { export function FilterLink({ type, value, label, externalUrl, icon }: FilterLinkProps) { const [showLink, setShowLink] = useState(false); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { updateParams, query } = useNavigation(); const active = query[type] !== undefined; const selected = query[type] === value; @@ -29,7 +29,7 @@ export function FilterLink({ type, value, label, externalUrl, icon }: FilterLink onMouseOut={() => setShowLink(false)} > {icon} - {!value && `(${label || formatMessage(labels.unknown)})`} + {!value && `(${label || t(labels.unknown)})`} {value && ( diff --git a/src/components/common/PageBody.tsx b/src/components/common/PageBody.tsx index 9feab71fe..45bfdc8bb 100644 --- a/src/components/common/PageBody.tsx +++ b/src/components/common/PageBody.tsx @@ -17,10 +17,10 @@ export function PageBody({ isLoading?: boolean; children?: ReactNode; } & ColumnProps) { - const { formatMessage, messages } = useMessages(); + const { t, messages } = useMessages(); if (error) { - return ; + return ; } if (isLoading) { diff --git a/src/components/common/Pager.tsx b/src/components/common/Pager.tsx index c65e2f6ab..128d33e24 100644 --- a/src/components/common/Pager.tsx +++ b/src/components/common/Pager.tsx @@ -11,7 +11,7 @@ export interface PagerProps { } export function Pager({ page, pageSize, count, onPageChange }: PagerProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const maxPage = pageSize && count ? Math.ceil(+count / +pageSize) : 0; const lastPage = page === maxPage; const firstPage = page === 1; @@ -34,10 +34,10 @@ export function Pager({ page, pageSize, count, onPageChange }: PagerProps) { return ( - {formatMessage(labels.numberOfRecords, { x: count.toLocaleString() })} + {t(labels.numberOfRecords, { x: count.toLocaleString() })} - {formatMessage(labels.pageOf, { + {t(labels.pageOf, { current: page.toLocaleString(), total: maxPage.toLocaleString(), })} diff --git a/src/components/common/Panel.tsx b/src/components/common/Panel.tsx index 0eba55677..0af322bc6 100644 --- a/src/components/common/Panel.tsx +++ b/src/components/common/Panel.tsx @@ -36,7 +36,7 @@ export function Panel({ width, ...props }: PanelProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const [isFullscreen, setIsFullscreen] = useState(false); const handleFullscreen = () => { @@ -62,7 +62,7 @@ export function Panel({ - {formatMessage(labels.maximize)} + {t(labels.maximize)} )} diff --git a/src/components/common/TypeConfirmationForm.tsx b/src/components/common/TypeConfirmationForm.tsx index 1121fa7d6..3b6413cf0 100644 --- a/src/components/common/TypeConfirmationForm.tsx +++ b/src/components/common/TypeConfirmationForm.tsx @@ -25,7 +25,7 @@ export function TypeConfirmationForm({ onConfirm?: () => void; onClose?: () => void; }) { - const { formatMessage, labels, messages, getErrorMessage } = useMessages(); + const { t, labels, messages, getErrorMessage } = useMessages(); if (!confirmationValue) { return null; } @@ -33,21 +33,21 @@ export function TypeConfirmationForm({ return (

- {formatMessage(messages.actionConfirmation, { + {t(messages.actionConfirmation, { confirmation: confirmationValue, })}

value === confirmationValue }} > - + - {buttonLabel || formatMessage(labels.ok)} + {buttonLabel || t(labels.ok)}
diff --git a/src/components/hooks/useFields.ts b/src/components/hooks/useFields.ts index 644be3a03..7b473cf89 100644 --- a/src/components/hooks/useFields.ts +++ b/src/components/hooks/useFields.ts @@ -10,132 +10,132 @@ export interface Field { } export function useFields() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const fields: Field[] = [ { name: 'path', - filterLabel: formatMessage(labels.path), - label: formatMessage(labels.path), + filterLabel: t(labels.path), + label: t(labels.path), group: 'url', }, { name: 'query', - filterLabel: formatMessage(labels.query), - label: formatMessage(labels.query), + filterLabel: t(labels.query), + label: t(labels.query), group: 'url', }, { name: 'title', - filterLabel: formatMessage(labels.pageTitle), - label: formatMessage(labels.pageTitle), + filterLabel: t(labels.pageTitle), + label: t(labels.pageTitle), group: 'url', }, { name: 'referrer', - filterLabel: formatMessage(labels.referrer), - label: formatMessage(labels.referrer), + filterLabel: t(labels.referrer), + label: t(labels.referrer), group: 'sources', }, { name: 'country', - filterLabel: formatMessage(labels.country), - label: formatMessage(labels.country), + filterLabel: t(labels.country), + label: t(labels.country), group: 'location', }, { name: 'region', - filterLabel: formatMessage(labels.region), - label: formatMessage(labels.region), + filterLabel: t(labels.region), + label: t(labels.region), group: 'location', }, { name: 'city', - filterLabel: formatMessage(labels.city), - label: formatMessage(labels.city), + filterLabel: t(labels.city), + label: t(labels.city), group: 'location', }, { name: 'browser', - filterLabel: formatMessage(labels.browser), - label: formatMessage(labels.browser), + filterLabel: t(labels.browser), + label: t(labels.browser), group: 'environment', }, { name: 'os', - filterLabel: formatMessage(labels.os), - label: formatMessage(labels.os), + filterLabel: t(labels.os), + label: t(labels.os), group: 'environment', }, { name: 'device', - filterLabel: formatMessage(labels.device), - label: formatMessage(labels.device), + filterLabel: t(labels.device), + label: t(labels.device), group: 'environment', }, { name: 'utmSource', - filterLabel: formatMessage(labels.source), - label: formatMessage(labels.utmSource), + filterLabel: t(labels.source), + label: t(labels.utmSource), group: 'utm', }, { name: 'utmMedium', - filterLabel: formatMessage(labels.medium), - label: formatMessage(labels.utmMedium), + filterLabel: t(labels.medium), + label: t(labels.utmMedium), group: 'utm', }, { name: 'utmCampaign', - filterLabel: formatMessage(labels.campaign), - label: formatMessage(labels.utmCampaign), + filterLabel: t(labels.campaign), + label: t(labels.utmCampaign), group: 'utm', }, { name: 'utmContent', - filterLabel: formatMessage(labels.content), - label: formatMessage(labels.utmContent), + filterLabel: t(labels.content), + label: t(labels.utmContent), group: 'utm', }, { name: 'utmTerm', - filterLabel: formatMessage(labels.term), - label: formatMessage(labels.utmTerm), + filterLabel: t(labels.term), + label: t(labels.utmTerm), group: 'utm', }, { name: 'hostname', - filterLabel: formatMessage(labels.hostname), - label: formatMessage(labels.hostname), + filterLabel: t(labels.hostname), + label: t(labels.hostname), group: 'other', }, { name: 'distinctId', - filterLabel: formatMessage(labels.distinctId), - label: formatMessage(labels.distinctId), + filterLabel: t(labels.distinctId), + label: t(labels.distinctId), group: 'other', }, { name: 'tag', - filterLabel: formatMessage(labels.tag), - label: formatMessage(labels.tag), + filterLabel: t(labels.tag), + label: t(labels.tag), group: 'other', }, { name: 'event', - filterLabel: formatMessage(labels.event), - label: formatMessage(labels.event), + filterLabel: t(labels.event), + label: t(labels.event), group: 'other', }, ]; const groupLabels: { key: FieldGroup; label: string }[] = [ - { key: 'url', label: formatMessage(labels.url) }, - { key: 'sources', label: formatMessage(labels.sources) }, - { key: 'location', label: formatMessage(labels.location) }, - { key: 'environment', label: formatMessage(labels.environment) }, - { key: 'utm', label: formatMessage(labels.utm) }, - { key: 'other', label: formatMessage(labels.other) }, + { key: 'url', label: t(labels.url) }, + { key: 'sources', label: t(labels.sources) }, + { key: 'location', label: t(labels.location) }, + { key: 'environment', label: t(labels.environment) }, + { key: 'utm', label: t(labels.utm) }, + { key: 'other', label: t(labels.other) }, ]; return { fields, groupLabels }; diff --git a/src/components/hooks/useFilters.ts b/src/components/hooks/useFilters.ts index 850e2afb1..0dd9a00bb 100644 --- a/src/components/hooks/useFilters.ts +++ b/src/components/hooks/useFilters.ts @@ -5,45 +5,45 @@ import { useMessages } from './useMessages'; import { useNavigation } from './useNavigation'; export function useFilters() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { query } = useNavigation(); const { fields } = useFields(); const operators = [ - { name: 'eq', type: 'string', label: formatMessage(labels.is) }, - { name: 'neq', type: 'string', label: formatMessage(labels.isNot) }, - { name: 'c', type: 'string', label: formatMessage(labels.contains) }, - { name: 'dnc', type: 'string', label: formatMessage(labels.doesNotContain) }, - { name: 'i', type: 'array', label: formatMessage(labels.includes) }, - { name: 'dni', type: 'array', label: formatMessage(labels.doesNotInclude) }, - { name: 't', type: 'boolean', label: formatMessage(labels.isTrue) }, - { name: 'f', type: 'boolean', label: formatMessage(labels.isFalse) }, - { name: 'eq', type: 'number', label: formatMessage(labels.is) }, - { name: 'neq', type: 'number', label: formatMessage(labels.isNot) }, - { name: 'gt', type: 'number', label: formatMessage(labels.greaterThan) }, - { name: 'lt', type: 'number', label: formatMessage(labels.lessThan) }, - { name: 'gte', type: 'number', label: formatMessage(labels.greaterThanEquals) }, - { name: 'lte', type: 'number', label: formatMessage(labels.lessThanEquals) }, - { name: 'bf', type: 'date', label: formatMessage(labels.before) }, - { name: 'af', type: 'date', label: formatMessage(labels.after) }, - { name: 'eq', type: 'uuid', label: formatMessage(labels.is) }, + { name: 'eq', type: 'string', label: t(labels.is) }, + { name: 'neq', type: 'string', label: t(labels.isNot) }, + { name: 'c', type: 'string', label: t(labels.contains) }, + { name: 'dnc', type: 'string', label: t(labels.doesNotContain) }, + { name: 'i', type: 'array', label: t(labels.includes) }, + { name: 'dni', type: 'array', label: t(labels.doesNotInclude) }, + { name: 't', type: 'boolean', label: t(labels.isTrue) }, + { name: 'f', type: 'boolean', label: t(labels.isFalse) }, + { name: 'eq', type: 'number', label: t(labels.is) }, + { name: 'neq', type: 'number', label: t(labels.isNot) }, + { name: 'gt', type: 'number', label: t(labels.greaterThan) }, + { name: 'lt', type: 'number', label: t(labels.lessThan) }, + { name: 'gte', type: 'number', label: t(labels.greaterThanEquals) }, + { name: 'lte', type: 'number', label: t(labels.lessThanEquals) }, + { name: 'bf', type: 'date', label: t(labels.before) }, + { name: 'af', type: 'date', label: t(labels.after) }, + { name: 'eq', type: 'uuid', label: t(labels.is) }, ]; const operatorLabels = { - [OPERATORS.equals]: formatMessage(labels.is), - [OPERATORS.notEquals]: formatMessage(labels.isNot), - [OPERATORS.set]: formatMessage(labels.isSet), - [OPERATORS.notSet]: formatMessage(labels.isNotSet), - [OPERATORS.contains]: formatMessage(labels.contains), - [OPERATORS.doesNotContain]: formatMessage(labels.doesNotContain), - [OPERATORS.true]: formatMessage(labels.true), - [OPERATORS.false]: formatMessage(labels.false), - [OPERATORS.greaterThan]: formatMessage(labels.greaterThan), - [OPERATORS.lessThan]: formatMessage(labels.lessThan), - [OPERATORS.greaterThanEquals]: formatMessage(labels.greaterThanEquals), - [OPERATORS.lessThanEquals]: formatMessage(labels.lessThanEquals), - [OPERATORS.before]: formatMessage(labels.before), - [OPERATORS.after]: formatMessage(labels.after), + [OPERATORS.equals]: t(labels.is), + [OPERATORS.notEquals]: t(labels.isNot), + [OPERATORS.set]: t(labels.isSet), + [OPERATORS.notSet]: t(labels.isNotSet), + [OPERATORS.contains]: t(labels.contains), + [OPERATORS.doesNotContain]: t(labels.doesNotContain), + [OPERATORS.true]: t(labels.true), + [OPERATORS.false]: t(labels.false), + [OPERATORS.greaterThan]: t(labels.greaterThan), + [OPERATORS.lessThan]: t(labels.lessThan), + [OPERATORS.greaterThanEquals]: t(labels.greaterThanEquals), + [OPERATORS.lessThanEquals]: t(labels.lessThanEquals), + [OPERATORS.before]: t(labels.before), + [OPERATORS.after]: t(labels.after), }; const typeFilters = { diff --git a/src/components/hooks/useFormat.ts b/src/components/hooks/useFormat.ts index 896fa0769..998102c31 100644 --- a/src/components/hooks/useFormat.ts +++ b/src/components/hooks/useFormat.ts @@ -6,7 +6,7 @@ import { useLocale } from './useLocale'; import { useMessages } from './useMessages'; export function useFormat() { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { locale } = useLocale(); const { countryNames } = useCountryNames(locale); const { languageNames } = useLanguageNames(locale); @@ -20,7 +20,7 @@ export function useFormat() { }; const formatDevice = (value: string): string => { - return formatMessage(labels[value] || labels.unknown); + return t(labels[value] || labels.unknown); }; const formatCountry = (value: string): string => { diff --git a/src/components/hooks/useMessages.ts b/src/components/hooks/useMessages.ts index ec2088ed9..b8ed46f2e 100644 --- a/src/components/hooks/useMessages.ts +++ b/src/components/hooks/useMessages.ts @@ -1,47 +1,11 @@ import { useTranslations } from 'next-intl'; -import { createElement, type ReactNode } from 'react'; -import { labels, type MessageDescriptor, messages } from '@/components/messages'; +import { labels, messages } from '@/components/messages'; import type { ApiError } from '@/lib/types'; -type FormatMessage = ( - descriptor: MessageDescriptor, - values?: Record, - opts?: any, -) => string | null; - -interface FormattedMessageProps extends MessageDescriptor { - values?: Record; -} - -interface UseMessages { - formatMessage: FormatMessage; - messages: typeof messages; - labels: typeof labels; - getMessage: (id: string) => string; - getErrorMessage: (error: ApiError) => string | undefined; - FormattedMessage: (props: FormattedMessageProps) => ReactNode; -} - -export function useMessages(): UseMessages { +export function useMessages() { const t = useTranslations(); - const formatMessage = ( - descriptor: MessageDescriptor, - values?: Record, - ) => { - if (!descriptor) return null; - try { - return t(descriptor.id, values); - } catch { - return descriptor.defaultMessage || descriptor.id; - } - }; - - const getMessage = (id: string) => { - const message = Object.values(messages).find(value => value.id === `message.${id}`); - - return message ? formatMessage(message) : id; - }; + const getMessage = (id: string) => t(`message.${id}`); const getErrorMessage = (error: ApiError) => { if (!error) { @@ -53,50 +17,5 @@ export function useMessages(): UseMessages { return code ? getMessage(code) : error?.message || 'Unknown error'; }; - function FormattedMessage({ id, defaultMessage, values }: FormattedMessageProps) { - if ( - !values || - Object.values(values).every(v => typeof v === 'string' || typeof v === 'number') - ) { - try { - return t(id, values as any); - } catch { - return defaultMessage || id; - } - } - - // For JSX values: get the raw ICU template and manually interpolate - let template: string; - try { - template = t.raw(id) as string; - } catch { - template = defaultMessage || id; - } - - if (typeof template !== 'string') { - return defaultMessage || id; - } - - // Split on {placeholder} tokens and interleave with values - const parts: ReactNode[] = []; - const regex = /\{(\w+)\}/g; - let lastIndex = 0; - - for (let match = regex.exec(template); match !== null; match = regex.exec(template)) { - if (match.index > lastIndex) { - parts.push(template.slice(lastIndex, match.index)); - } - const key = match[1]; - parts.push(values[key] !== undefined ? values[key] : match[0]); - lastIndex = regex.lastIndex; - } - - if (lastIndex < template.length) { - parts.push(template.slice(lastIndex)); - } - - return createElement('span', null, ...parts); - } - - return { formatMessage, messages, labels, getMessage, getErrorMessage, FormattedMessage }; + return { t, messages, labels, getMessage, getErrorMessage }; } diff --git a/src/components/hooks/useWebsiteNavItems.tsx b/src/components/hooks/useWebsiteNavItems.tsx index eb43eea49..918a423d6 100644 --- a/src/components/hooks/useWebsiteNavItems.tsx +++ b/src/components/hooks/useWebsiteNavItems.tsx @@ -13,7 +13,7 @@ import { useMessages } from './useMessages'; import { useNavigation } from './useNavigation'; export function useWebsiteNavItems(websiteId: string) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { pathname, renderUrl } = useNavigation(); const renderPath = (path: string) => @@ -27,110 +27,110 @@ export function useWebsiteNavItems(websiteId: string) { const items = [ { - label: formatMessage(labels.traffic), + label: t(labels.traffic), items: [ { id: 'overview', - label: formatMessage(labels.overview), + label: t(labels.overview), icon: , path: renderPath(''), }, { id: 'events', - label: formatMessage(labels.events), + label: t(labels.events), icon: , path: renderPath('/events'), }, { id: 'sessions', - label: formatMessage(labels.sessions), + label: t(labels.sessions), icon: , path: renderPath('/sessions'), }, { id: 'realtime', - label: formatMessage(labels.realtime), + label: t(labels.realtime), icon: , path: renderPath('/realtime'), }, { id: 'compare', - label: formatMessage(labels.compare), + label: t(labels.compare), icon: , path: renderPath('/compare'), }, { id: 'breakdown', - label: formatMessage(labels.breakdown), + label: t(labels.breakdown), icon: , path: renderPath('/breakdown'), }, ], }, { - label: formatMessage(labels.behavior), + label: t(labels.behavior), items: [ { id: 'goals', - label: formatMessage(labels.goals), + label: t(labels.goals), icon: , path: renderPath('/goals'), }, { id: 'funnel', - label: formatMessage(labels.funnels), + label: t(labels.funnels), icon: , path: renderPath('/funnels'), }, { id: 'journeys', - label: formatMessage(labels.journeys), + label: t(labels.journeys), icon: , path: renderPath('/journeys'), }, { id: 'retention', - label: formatMessage(labels.retention), + label: t(labels.retention), icon: , path: renderPath('/retention'), }, ], }, { - label: formatMessage(labels.audience), + label: t(labels.audience), items: [ { id: 'segments', - label: formatMessage(labels.segments), + label: t(labels.segments), icon: , path: renderPath('/segments'), }, { id: 'cohorts', - label: formatMessage(labels.cohorts), + label: t(labels.cohorts), icon: , path: renderPath('/cohorts'), }, ], }, { - label: formatMessage(labels.growth), + label: t(labels.growth), items: [ { id: 'utm', - label: formatMessage(labels.utm), + label: t(labels.utm), icon: , path: renderPath('/utm'), }, { id: 'revenue', - label: formatMessage(labels.revenue), + label: t(labels.revenue), icon: , path: renderPath('/revenue'), }, { id: 'attribution', - label: formatMessage(labels.attribution), + label: t(labels.attribution), icon: , path: renderPath('/attribution'), }, diff --git a/src/components/input/ActionSelect.tsx b/src/components/input/ActionSelect.tsx index 616ee3471..79827ea0c 100644 --- a/src/components/input/ActionSelect.tsx +++ b/src/components/input/ActionSelect.tsx @@ -7,12 +7,12 @@ export interface ActionSelectProps { } export function ActionSelect({ value = 'path', onChange }: ActionSelectProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); return ( ); } diff --git a/src/components/input/BounceFilter.tsx b/src/components/input/BounceFilter.tsx index e8a4b31b6..2b5c45388 100644 --- a/src/components/input/BounceFilter.tsx +++ b/src/components/input/BounceFilter.tsx @@ -5,7 +5,7 @@ import { useNavigation } from '@/components/hooks/useNavigation'; export function BounceFilter() { const { router, query, updateParams } = useNavigation(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const isSelected = query.excludeBounce === 'true'; const handleChange = (value: boolean) => { @@ -19,7 +19,7 @@ export function BounceFilter() { return ( - {formatMessage(labels.excludeBounce)} + {t(labels.excludeBounce)} ); diff --git a/src/components/input/CurrencySelect.tsx b/src/components/input/CurrencySelect.tsx index 84e0ee21d..8bad9821c 100644 --- a/src/components/input/CurrencySelect.tsx +++ b/src/components/input/CurrencySelect.tsx @@ -4,12 +4,12 @@ import { useMessages } from '@/components/hooks'; import { CURRENCIES } from '@/lib/constants'; export function CurrencySelect({ value, onChange }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const [search, setSearch] = useState(''); return (
diff --git a/src/components/input/WebsiteFilterButton.tsx b/src/components/input/WebsiteFilterButton.tsx index d00c27865..c558374ec 100644 --- a/src/components/input/WebsiteFilterButton.tsx +++ b/src/components/input/WebsiteFilterButton.tsx @@ -13,7 +13,7 @@ export function WebsiteFilterButton({ position?: 'bottom' | 'top' | 'left' | 'right'; alignment?: 'end' | 'center' | 'start'; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { updateParams, pathname, router, query } = useNavigation(); const [excludeBounce, setExcludeBounce] = useState(!!query.excludeBounce); const isOverview = @@ -33,7 +33,7 @@ export function WebsiteFilterButton({ }; return ( - } label={formatMessage(labels.filter)} variant="outline"> + } label={t(labels.filter)} variant="outline"> {({ close }) => { return ( <> @@ -44,7 +44,7 @@ export function WebsiteFilterButton({ onChange={setExcludeBounce} style={{ marginTop: '3px' }} > - {formatMessage(labels.excludeBounce)} + {t(labels.excludeBounce)} )} diff --git a/src/components/input/WebsiteSelect.tsx b/src/components/input/WebsiteSelect.tsx index 636911844..f3b8e7ff5 100644 --- a/src/components/input/WebsiteSelect.tsx +++ b/src/components/input/WebsiteSelect.tsx @@ -19,7 +19,7 @@ export function WebsiteSelect({ teamId?: string; includeTeams?: boolean; } & SelectProps) { - const { formatMessage, messages } = useMessages(); + const { t, messages } = useMessages(); const { data: website } = useWebsiteQuery(websiteId); const [name, setName] = useState(website?.name); const [search, setSearch] = useState(''); @@ -63,7 +63,7 @@ export function WebsiteSelect({ onOpenChange={handleOpenChange} renderValue={renderValue} listProps={{ - renderEmptyState: () => , + renderEmptyState: () => , style: { maxHeight: 'calc(42vh - 65px)', width: 280 }, }} buttonProps={{ style: { minHeight: 40 } }} diff --git a/src/components/messages.ts b/src/components/messages.ts index ba45ae468..e93cb8f81 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -1,536 +1,388 @@ -export interface MessageDescriptor { - id: string; - defaultMessage: string; -} - -export const labels: Record = { - ok: { id: 'label.ok', defaultMessage: 'OK' }, - unknown: { id: 'label.unknown', defaultMessage: 'Unknown' }, - required: { id: 'label.required', defaultMessage: 'Required' }, - save: { id: 'label.save', defaultMessage: 'Save' }, - cancel: { id: 'label.cancel', defaultMessage: 'Cancel' }, - continue: { id: 'label.continue', defaultMessage: 'Continue' }, - delete: { id: 'label.delete', defaultMessage: 'Delete' }, - leave: { id: 'label.leave', defaultMessage: 'Leave' }, - users: { id: 'label.users', defaultMessage: 'Users' }, - createUser: { id: 'label.create-user', defaultMessage: 'Create user' }, - deleteUser: { id: 'label.delete-user', defaultMessage: 'Delete user' }, - username: { id: 'label.username', defaultMessage: 'Username' }, - password: { id: 'label.password', defaultMessage: 'Password' }, - role: { id: 'label.role', defaultMessage: 'Role' }, - user: { id: 'label.user', defaultMessage: 'User' }, - viewOnly: { id: 'label.view-only', defaultMessage: 'View only' }, - manage: { id: 'label.manage', defaultMessage: 'Manage' }, - admin: { id: 'label.admin', defaultMessage: 'Admin' }, - confirm: { id: 'label.confirm', defaultMessage: 'Confirm' }, - details: { id: 'label.details', defaultMessage: 'Details' }, - website: { id: 'label.website', defaultMessage: 'Website' }, - websites: { id: 'label.websites', defaultMessage: 'Websites' }, - myWebsites: { id: 'label.my-websites', defaultMessage: 'My websites' }, - teamWebsites: { id: 'label.team-websites', defaultMessage: 'Team websites' }, - created: { id: 'label.created', defaultMessage: 'Created' }, - createdBy: { id: 'label.created-by', defaultMessage: 'Created By' }, - edit: { id: 'label.edit', defaultMessage: 'Edit' }, - name: { id: 'label.name', defaultMessage: 'Name' }, - manager: { id: 'label.manager', defaultMessage: 'Manager' }, - member: { id: 'label.member', defaultMessage: 'Member' }, - members: { id: 'label.members', defaultMessage: 'Members' }, - accessCode: { id: 'label.access-code', defaultMessage: 'Access code' }, - teamId: { id: 'label.team-id', defaultMessage: 'Team ID' }, - team: { id: 'label.team', defaultMessage: 'Team' }, - teamName: { id: 'label.team-name', defaultMessage: 'Team name' }, - regenerate: { id: 'label.regenerate', defaultMessage: 'Regenerate' }, - remove: { id: 'label.remove', defaultMessage: 'Remove' }, - join: { id: 'label.join', defaultMessage: 'Join' }, - createTeam: { id: 'label.create-team', defaultMessage: 'Create team' }, - joinTeam: { id: 'label.join-team', defaultMessage: 'Join team' }, - settings: { id: 'label.settings', defaultMessage: 'Settings' }, - owner: { id: 'label.owner', defaultMessage: 'Owner' }, - url: { id: 'label.url', defaultMessage: 'URL' }, - teamOwner: { id: 'label.team-owner', defaultMessage: 'Team owner' }, - teamManager: { id: 'label.team-manager', defaultMessage: 'Team manager' }, - teamMember: { id: 'label.team-member', defaultMessage: 'Team member' }, - teamViewOnly: { id: 'label.team-view-only', defaultMessage: 'Team view only' }, - enableShareUrl: { id: 'label.enable-share-url', defaultMessage: 'Enable share URL' }, - data: { id: 'label.data', defaultMessage: 'Data' }, - trackingCode: { id: 'label.tracking-code', defaultMessage: 'Tracking code' }, - shareUrl: { id: 'label.share-url', defaultMessage: 'Share URL' }, - action: { id: 'label.action', defaultMessage: 'Action' }, - actions: { id: 'label.actions', defaultMessage: 'Actions' }, - domain: { id: 'label.domain', defaultMessage: 'Domain' }, - websiteId: { id: 'label.website-id', defaultMessage: 'Website ID' }, - resetWebsite: { id: 'label.reset-website', defaultMessage: 'Reset website' }, - deleteWebsite: { id: 'label.delete-website', defaultMessage: 'Delete website' }, - transferWebsite: { id: 'label.transfer-website', defaultMessage: 'Transfer website' }, - deleteReport: { id: 'label.delete-report', defaultMessage: 'Delete report' }, - reset: { id: 'label.reset', defaultMessage: 'Reset' }, - addWebsite: { id: 'label.add-website', defaultMessage: 'Add website' }, - addMember: { id: 'label.add-member', defaultMessage: 'Add member' }, - editMember: { id: 'label.edit-member', defaultMessage: 'Edit member' }, - removeMember: { id: 'label.remove-member', defaultMessage: 'Remove member' }, - addDescription: { id: 'label.add-description', defaultMessage: 'Add description' }, - changePassword: { id: 'label.change-password', defaultMessage: 'Change password' }, - currentPassword: { id: 'label.current-password', defaultMessage: 'Current password' }, - newPassword: { id: 'label.new-password', defaultMessage: 'New password' }, - confirmPassword: { id: 'label.confirm-password', defaultMessage: 'Confirm password' }, - timezone: { id: 'label.timezone', defaultMessage: 'Timezone' }, - defaultDateRange: { id: 'label.default-date-range', defaultMessage: 'Default date range' }, - language: { id: 'label.language', defaultMessage: 'Language' }, - theme: { id: 'label.theme', defaultMessage: 'Theme' }, - profile: { id: 'label.profile', defaultMessage: 'Profile' }, - profiles: { id: 'label.profiles', defaultMessage: 'Profiles' }, - dashboard: { id: 'label.dashboard', defaultMessage: 'Dashboard' }, - more: { id: 'label.more', defaultMessage: 'More' }, - realtime: { id: 'label.realtime', defaultMessage: 'Realtime' }, - queries: { id: 'label.queries', defaultMessage: 'Queries' }, - teams: { id: 'label.teams', defaultMessage: 'Teams' }, - teamSettings: { id: 'label.team-settings', defaultMessage: 'Team settings' }, - analytics: { id: 'label.analytics', defaultMessage: 'Analytics' }, - login: { id: 'label.login', defaultMessage: 'Login' }, - logout: { id: 'label.logout', defaultMessage: 'Logout' }, - singleDay: { id: 'label.single-day', defaultMessage: 'Single day' }, - dateRange: { id: 'label.date-range', defaultMessage: 'Date range' }, - viewDetails: { id: 'label.view-details', defaultMessage: 'View details' }, - deleteTeam: { id: 'label.delete-team', defaultMessage: 'Delete team' }, - leaveTeam: { id: 'label.leave-team', defaultMessage: 'Leave team' }, - refresh: { id: 'label.refresh', defaultMessage: 'Refresh' }, - page: { id: 'label.page', defaultMessage: 'Page' }, - pages: { id: 'label.pages', defaultMessage: 'Pages' }, - entry: { id: 'label.entry', defaultMessage: 'Entry' }, - exit: { id: 'label.exit', defaultMessage: 'Exit' }, - referrers: { id: 'label.referrers', defaultMessage: 'Referrers' }, - screen: { id: 'label.screen', defaultMessage: 'Screen' }, - screens: { id: 'label.screens', defaultMessage: 'Screens' }, - browsers: { id: 'label.browsers', defaultMessage: 'Browsers' }, - os: { id: 'label.os', defaultMessage: 'OS' }, - devices: { id: 'label.devices', defaultMessage: 'Devices' }, - countries: { id: 'label.countries', defaultMessage: 'Countries' }, - languages: { id: 'label.languages', defaultMessage: 'Languages' }, - tags: { id: 'label.tags', defaultMessage: 'Tags' }, - segments: { id: 'label.segments', defaultMessage: 'Segments' }, - cohorts: { id: 'label.cohorts', defaultMessage: 'Cohorts' }, - count: { id: 'label.count', defaultMessage: 'Count' }, - average: { id: 'label.average', defaultMessage: 'Average' }, - sum: { id: 'label.sum', defaultMessage: 'Sum' }, - event: { id: 'label.event', defaultMessage: 'Event' }, - events: { id: 'label.events', defaultMessage: 'Events' }, - eventName: { id: 'label.event-name', defaultMessage: 'Event name' }, - excludeBounce: { id: 'label.exclude-bounce', defaultMessage: 'Exclude bounces' }, - query: { id: 'label.query', defaultMessage: 'Query' }, - queryParameters: { id: 'label.query-parameters', defaultMessage: 'Query parameters' }, - back: { id: 'label.back', defaultMessage: 'Back' }, - visitors: { id: 'label.visitors', defaultMessage: 'Visitors' }, - visits: { id: 'label.visits', defaultMessage: 'Visits' }, - filterCombined: { id: 'label.filter-combined', defaultMessage: 'Combined' }, - filterRaw: { id: 'label.filter-raw', defaultMessage: 'Raw' }, - views: { id: 'label.views', defaultMessage: 'Views' }, - none: { id: 'label.none', defaultMessage: 'None' }, - clearAll: { id: 'label.clear-all', defaultMessage: 'Clear all' }, - property: { id: 'label.property', defaultMessage: 'Property' }, - today: { id: 'label.today', defaultMessage: 'Today' }, - lastHours: { id: 'label.last-hours', defaultMessage: 'Last {x} hours' }, - yesterday: { id: 'label.yesterday', defaultMessage: 'Yesterday' }, - thisWeek: { id: 'label.this-week', defaultMessage: 'This week' }, - lastDays: { id: 'label.last-days', defaultMessage: 'Last {x} days' }, - lastMonths: { id: 'label.last-months', defaultMessage: 'Last {x} months' }, - thisMonth: { id: 'label.this-month', defaultMessage: 'This month' }, - thisYear: { id: 'label.this-year', defaultMessage: 'This year' }, - allTime: { id: 'label.all-time', defaultMessage: 'All time' }, - customRange: { id: 'label.custom-range', defaultMessage: 'Custom range' }, - selectWebsite: { id: 'label.select-website', defaultMessage: 'Select website' }, - selectRole: { id: 'label.select-role', defaultMessage: 'Select role' }, - selectDate: { id: 'label.select-date', defaultMessage: 'Select date' }, - selectFilter: { id: 'label.select-filter', defaultMessage: 'Select filter' }, - all: { id: 'label.all', defaultMessage: 'All' }, - session: { id: 'label.session', defaultMessage: 'Session' }, - sessions: { id: 'label.sessions', defaultMessage: 'Sessions' }, - distinctId: { id: 'label.distinct-id', defaultMessage: 'Distinct ID' }, - pageNotFound: { id: 'message.page-not-found', defaultMessage: 'Page not found' }, - activity: { id: 'label.activity', defaultMessage: 'Activity' }, - dismiss: { id: 'label.dismiss', defaultMessage: 'Dismiss' }, - poweredBy: { id: 'label.powered-by', defaultMessage: 'Powered by {name}' }, - pageViews: { id: 'label.page-views', defaultMessage: 'Page views' }, - uniqueVisitors: { id: 'label.unique-visitors', defaultMessage: 'Unique visitors' }, - uniqueEvents: { id: 'label.unique-events', defaultMessage: 'Unique Events' }, - bounceRate: { id: 'label.bounce-rate', defaultMessage: 'Bounce rate' }, - viewsPerVisit: { id: 'label.views-per-visit', defaultMessage: 'Views per visit' }, - visitDuration: { id: 'label.visit-duration', defaultMessage: 'Visit duration' }, - desktop: { id: 'label.desktop', defaultMessage: 'Desktop' }, - laptop: { id: 'label.laptop', defaultMessage: 'Laptop' }, - tablet: { id: 'label.tablet', defaultMessage: 'Tablet' }, - mobile: { id: 'label.mobile', defaultMessage: 'Mobile' }, - toggleCharts: { id: 'label.toggle-charts', defaultMessage: 'Toggle charts' }, - editDashboard: { id: 'label.edit-dashboard', defaultMessage: 'Edit dashboard' }, - title: { id: 'label.title', defaultMessage: 'Title' }, - view: { id: 'label.view', defaultMessage: 'View' }, - cities: { id: 'label.cities', defaultMessage: 'Cities' }, - regions: { id: 'label.regions', defaultMessage: 'Regions' }, - reports: { id: 'label.reports', defaultMessage: 'Reports' }, - eventData: { id: 'label.event-data', defaultMessage: 'Event data' }, - sessionData: { id: 'label.session-data', defaultMessage: 'Session data' }, - funnel: { id: 'label.funnel', defaultMessage: 'Funnel' }, - funnels: { id: 'label.funnels', defaultMessage: 'Funnels' }, - funnelDescription: { - id: 'label.funnel-description', - defaultMessage: 'Understand the conversion and drop-off rate of users.', - }, - revenue: { id: 'label.revenue', defaultMessage: 'Revenue' }, - revenueDescription: { - id: 'label.revenue-description', - defaultMessage: 'Look into your revenue data and how users are spending.', - }, - attribution: { id: 'label.attribution', defaultMessage: 'Attribution' }, - attributionDescription: { - id: 'label.attribution-description', - defaultMessage: 'See how users engage with your marketing and what drives conversions.', - }, - currency: { id: 'label.currency', defaultMessage: 'Currency' }, - model: { id: 'label.model', defaultMessage: 'Model' }, - path: { id: 'label.path', defaultMessage: 'Path' }, - paths: { id: 'label.paths', defaultMessage: 'Paths' }, - add: { id: 'label.add', defaultMessage: 'Add' }, - update: { id: 'label.update', defaultMessage: 'Update' }, - window: { id: 'label.window', defaultMessage: 'Window' }, - runQuery: { id: 'label.run-query', defaultMessage: 'Run query' }, - field: { id: 'label.field', defaultMessage: 'Field' }, - fields: { id: 'label.fields', defaultMessage: 'Fields' }, - createReport: { id: 'label.create-report', defaultMessage: 'Create report' }, - description: { id: 'label.description', defaultMessage: 'Description' }, - untitled: { id: 'label.untitled', defaultMessage: 'Untitled' }, - type: { id: 'label.type', defaultMessage: 'Type' }, - filter: { id: 'label.filter', defaultMessage: 'Filter' }, - filters: { id: 'label.filters', defaultMessage: 'Filters' }, - breakdown: { id: 'label.breakdown', defaultMessage: 'Breakdown' }, - true: { id: 'label.true', defaultMessage: 'True' }, - false: { id: 'label.false', defaultMessage: 'False' }, - is: { id: 'label.is', defaultMessage: 'Is' }, - isNot: { id: 'label.is-not', defaultMessage: 'Is not' }, - isSet: { id: 'label.is-set', defaultMessage: 'Is set' }, - isNotSet: { id: 'label.is-not-set', defaultMessage: 'Is not set' }, - greaterThan: { id: 'label.greater-than', defaultMessage: 'Greater than' }, - lessThan: { id: 'label.less-than', defaultMessage: 'Less than' }, - greaterThanEquals: { id: 'label.greater-than-equals', defaultMessage: 'Greater than or equals' }, - lessThanEquals: { id: 'label.less-than-equals', defaultMessage: 'Less than or equals' }, - contains: { id: 'label.contains', defaultMessage: 'Contains' }, - doesNotContain: { id: 'label.does-not-contain', defaultMessage: 'Does not contain' }, - includes: { id: 'label.includes', defaultMessage: 'Includes' }, - doesNotInclude: { id: 'label.does-not-include', defaultMessage: 'Does not include' }, - before: { id: 'label.before', defaultMessage: 'Before' }, - after: { id: 'label.after', defaultMessage: 'After' }, - isTrue: { id: 'label.is-true', defaultMessage: 'Is true' }, - isFalse: { id: 'label.is-false', defaultMessage: 'Is false' }, - exists: { id: 'label.exists', defaultMessage: 'Exists' }, - doesNotExist: { id: 'label.doest-not-exist', defaultMessage: 'Does not exist' }, - total: { id: 'label.total', defaultMessage: 'Total' }, - min: { id: 'label.min', defaultMessage: 'Min' }, - max: { id: 'label.max', defaultMessage: 'Max' }, - unique: { id: 'label.unique', defaultMessage: 'Unique' }, - value: { id: 'label.value', defaultMessage: 'Value' }, - overview: { id: 'label.overview', defaultMessage: 'Overview' }, - totalRecords: { id: 'label.total-records', defaultMessage: 'Total records' }, - insight: { id: 'label.insight', defaultMessage: 'Insight' }, - insights: { id: 'label.insights', defaultMessage: 'Insights' }, - insightsDescription: { - id: 'label.insights-description', - defaultMessage: 'Dive deeper into your data by using segments and filters.', - }, - retention: { id: 'label.retention', defaultMessage: 'Retention' }, - retentionDescription: { - id: 'label.retention-description', - defaultMessage: 'Measure your website stickiness by tracking how often users return.', - }, - dropoff: { id: 'label.dropoff', defaultMessage: 'Dropoff' }, - referrer: { id: 'label.referrer', defaultMessage: 'Referrer' }, - hostname: { id: 'label.hostname', defaultMessage: 'Hostname' }, - country: { id: 'label.country', defaultMessage: 'Country' }, - region: { id: 'label.region', defaultMessage: 'Region' }, - city: { id: 'label.city', defaultMessage: 'City' }, - browser: { id: 'label.browser', defaultMessage: 'Browser' }, - device: { id: 'label.device', defaultMessage: 'Device' }, - pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' }, - tag: { id: 'label.tag', defaultMessage: 'Tag' }, - source: { id: 'label.source', defaultMessage: 'Source' }, - medium: { id: 'label.medium', defaultMessage: 'Medium' }, - campaign: { id: 'label.campaign', defaultMessage: 'Campaign' }, - content: { id: 'label.content', defaultMessage: 'Content' }, - term: { id: 'label.term', defaultMessage: 'Term' }, - utmSource: { id: 'label.utm-source', defaultMessage: 'UTM source' }, - utmMedium: { id: 'label.utm-medium', defaultMessage: 'UTM medium' }, - utmCampaign: { id: 'label.utm-campaign', defaultMessage: 'UTM campaign' }, - utmContent: { id: 'label.utm-content', defaultMessage: 'UTM content' }, - utmTerm: { id: 'label.utm-term', defaultMessage: 'UTM term' }, - segment: { id: 'label.segment', defaultMessage: 'Segment' }, - cohort: { id: 'label.cohort', defaultMessage: 'Cohort' }, - minute: { id: 'label.minute', defaultMessage: 'Minute' }, - hour: { id: 'label.hour', defaultMessage: 'Hour' }, - day: { id: 'label.day', defaultMessage: 'Day' }, - month: { id: 'label.month', defaultMessage: 'Month' }, - date: { id: 'label.date', defaultMessage: 'Date' }, - pageOf: { id: 'label.page-of', defaultMessage: 'Page {current} of {total}' }, - create: { id: 'label.create', defaultMessage: 'Create' }, - search: { id: 'label.search', defaultMessage: 'Search' }, - numberOfRecords: { - id: 'label.number-of-records', - defaultMessage: '{x} {x, plural, one {record} other {records}}', - }, - select: { id: 'label.select', defaultMessage: 'Select' }, - myAccount: { id: 'label.my-account', defaultMessage: 'My account' }, - transfer: { id: 'label.transfer', defaultMessage: 'Transfer' }, - transactions: { id: 'label.transactions', defaultMessage: 'Transactions' }, - uniqueCustomers: { id: 'label.uniqueCustomers', defaultMessage: 'Unique Customers' }, - viewedPage: { - id: 'message.viewed-page', - defaultMessage: 'Viewed page', - }, - collectedData: { - id: 'message.collected-data', - defaultMessage: 'Collected data', - }, - triggeredEvent: { - id: 'message.triggered-event', - defaultMessage: 'Triggered event', - }, - utm: { id: 'label.utm', defaultMessage: 'UTM' }, - utmDescription: { - id: 'label.utm-description', - defaultMessage: 'Track your campaigns through UTM parameters.', - }, - conversionStep: { id: 'label.conversion-step', defaultMessage: 'Conversion step' }, - conversionRate: { id: 'label.conversion-rate', defaultMessage: 'Conversion rate' }, - steps: { id: 'label.steps', defaultMessage: 'Steps' }, - startStep: { id: 'label.start-step', defaultMessage: 'Start Step' }, - endStep: { id: 'label.end-step', defaultMessage: 'End Step' }, - addStep: { id: 'label.add-step', defaultMessage: 'Add step' }, - goal: { id: 'label.goal', defaultMessage: 'Goal' }, - goals: { id: 'label.goals', defaultMessage: 'Goals' }, - goalsDescription: { - id: 'label.goals-description', - defaultMessage: 'Track your goals for pageviews and events.', - }, - journey: { id: 'label.journey', defaultMessage: 'Journey' }, - journeys: { id: 'label.journeys', defaultMessage: 'Journeys' }, - journeyDescription: { - id: 'label.journey-description', - defaultMessage: 'Understand how users navigate through your website.', - }, - compareDates: { id: 'label.compare-dates', defaultMessage: 'Compare dates' }, - compare: { id: 'label.compare', defaultMessage: 'Compare' }, - current: { id: 'label.current', defaultMessage: 'Current' }, - previous: { id: 'label.previous', defaultMessage: 'Previous' }, - previousPeriod: { id: 'label.previous-period', defaultMessage: 'Previous period' }, - previousYear: { id: 'label.previous-year', defaultMessage: 'Previous year' }, - lastSeen: { id: 'label.last-seen', defaultMessage: 'Last seen' }, - firstSeen: { id: 'label.first-seen', defaultMessage: 'First seen' }, - properties: { id: 'label.properties', defaultMessage: 'Properties' }, - channel: { id: 'label.channel', defaultMessage: 'Channel' }, - channels: { id: 'label.channels', defaultMessage: 'Channels' }, - sources: { id: 'label.sources', defaultMessage: 'Sources' }, - campaigns: { id: 'label.campaigns', defaultMessage: 'Campaigns' }, - terms: { id: 'label.terms', defaultMessage: 'Terms' }, - direct: { id: 'label.direct', defaultMessage: 'Direct' }, - referral: { id: 'label.referral', defaultMessage: 'Referral' }, - affiliate: { id: 'label.affiliate', defaultMessage: 'Affiliate' }, - email: { id: 'label.email', defaultMessage: 'Email' }, - sms: { id: 'label.sms', defaultMessage: 'SMS' }, - organicSearch: { id: 'label.organic-search', defaultMessage: 'Organic search' }, - organicSocial: { id: 'label.organic-social', defaultMessage: 'Organic social' }, - organicShopping: { id: 'label.organic-shopping', defaultMessage: 'Organic shopping' }, - organicVideo: { id: 'label.organic-video', defaultMessage: 'Organic video' }, - paidAds: { id: 'label.paid-ads', defaultMessage: 'Paid ads' }, - paidSearch: { id: 'label.paid-search', defaultMessage: 'Paid search' }, - paidSocial: { id: 'label.paid-social', defaultMessage: 'Paid social' }, - paidShopping: { id: 'label.paid-shopping', defaultMessage: 'Paid shopping' }, - paidVideo: { id: 'label.paid-video', defaultMessage: 'Paid video' }, - grouped: { id: 'label.grouped', defaultMessage: 'Grouped' }, - other: { id: 'label.other', defaultMessage: 'Other' }, - boards: { id: 'label.boards', defaultMessage: 'Boards' }, - apply: { id: 'label.apply', defaultMessage: 'Apply' }, - link: { id: 'label.link', defaultMessage: 'Link' }, - links: { id: 'label.links', defaultMessage: 'Links' }, - pixel: { id: 'label.pixel', defaultMessage: 'Pixel' }, - pixels: { id: 'label.pixels', defaultMessage: 'Pixels' }, - addBoard: { id: 'label.add-board', defaultMessage: 'Add board' }, - addLink: { id: 'label.add-link', defaultMessage: 'Add link' }, - addPixel: { id: 'label.add-pixel', defaultMessage: 'Add pixel' }, - maximize: { id: 'label.maximize', defaultMessage: 'Maximize' }, - remaining: { id: 'label.remaining', defaultMessage: 'Remaining' }, - conversion: { id: 'label.conversion', defaultMessage: 'Conversion' }, - firstClick: { id: 'label.first-click', defaultMessage: 'First click' }, - lastClick: { id: 'label.last-click', defaultMessage: 'Last click' }, - online: { id: 'label.online', defaultMessage: 'Online' }, - preferences: { id: 'label.preferences', defaultMessage: 'Preferences' }, - location: { id: 'label.location', defaultMessage: 'Location' }, - chart: { id: 'label.chart', defaultMessage: 'Chart' }, - table: { id: 'label.table', defaultMessage: 'Table' }, - download: { id: 'label.download', defaultMessage: 'Download' }, - traffic: { id: 'label.traffic', defaultMessage: 'Traffic' }, - behavior: { id: 'label.behavior', defaultMessage: 'Behavior' }, - growth: { id: 'label.growth', defaultMessage: 'Growth' }, - account: { id: 'label.account', defaultMessage: 'Account' }, - application: { id: 'label.application', defaultMessage: 'Application' }, - version: { id: 'label.version', defaultMessage: 'Version' }, - saveSegment: { id: 'label.save-segment', defaultMessage: 'Save as segment' }, - saveCohort: { id: 'label.save-cohort', defaultMessage: 'Save as cohort' }, - analysis: { id: 'label.analysis', defaultMessage: 'Analysis' }, - destinationUrl: { id: 'label.destination-url', defaultMessage: 'Destination URL' }, - audience: { id: 'label.audience', defaultMessage: 'Audience' }, - invalidUrl: { id: 'label.invalid-url', defaultMessage: 'Invalid URL' }, - environment: { id: 'label.environment', defaultMessage: 'Environment' }, - criteria: { id: 'label.criteria', defaultMessage: 'Criteria' }, - share: { id: 'label.share', defaultMessage: 'Share' }, - support: { id: 'label.support', defaultMessage: 'Support' }, - documentation: { id: 'label.documentation', defaultMessage: 'Documentation' }, - switchAccount: { id: 'label.switch-account', defaultMessage: 'Switch account' }, +export const labels: Record = { + ok: 'label.ok', + unknown: 'label.unknown', + required: 'label.required', + save: 'label.save', + cancel: 'label.cancel', + continue: 'label.continue', + delete: 'label.delete', + leave: 'label.leave', + users: 'label.users', + createUser: 'label.create-user', + deleteUser: 'label.delete-user', + username: 'label.username', + password: 'label.password', + role: 'label.role', + user: 'label.user', + viewOnly: 'label.view-only', + manage: 'label.manage', + admin: 'label.admin', + confirm: 'label.confirm', + details: 'label.details', + website: 'label.website', + websites: 'label.websites', + myWebsites: 'label.my-websites', + teamWebsites: 'label.team-websites', + created: 'label.created', + createdBy: 'label.created-by', + edit: 'label.edit', + name: 'label.name', + manager: 'label.manager', + member: 'label.member', + members: 'label.members', + accessCode: 'label.access-code', + teamId: 'label.team-id', + team: 'label.team', + teamName: 'label.team-name', + regenerate: 'label.regenerate', + remove: 'label.remove', + join: 'label.join', + createTeam: 'label.create-team', + joinTeam: 'label.join-team', + settings: 'label.settings', + owner: 'label.owner', + url: 'label.url', + teamOwner: 'label.team-owner', + teamManager: 'label.team-manager', + teamMember: 'label.team-member', + teamViewOnly: 'label.team-view-only', + enableShareUrl: 'label.enable-share-url', + data: 'label.data', + trackingCode: 'label.tracking-code', + shareUrl: 'label.share-url', + action: 'label.action', + actions: 'label.actions', + domain: 'label.domain', + websiteId: 'label.website-id', + resetWebsite: 'label.reset-website', + deleteWebsite: 'label.delete-website', + transferWebsite: 'label.transfer-website', + deleteReport: 'label.delete-report', + reset: 'label.reset', + addWebsite: 'label.add-website', + addMember: 'label.add-member', + editMember: 'label.edit-member', + removeMember: 'label.remove-member', + addDescription: 'label.add-description', + changePassword: 'label.change-password', + currentPassword: 'label.current-password', + newPassword: 'label.new-password', + confirmPassword: 'label.confirm-password', + timezone: 'label.timezone', + defaultDateRange: 'label.default-date-range', + language: 'label.language', + theme: 'label.theme', + profile: 'label.profile', + profiles: 'label.profiles', + dashboard: 'label.dashboard', + more: 'label.more', + realtime: 'label.realtime', + queries: 'label.queries', + teams: 'label.teams', + teamSettings: 'label.team-settings', + analytics: 'label.analytics', + login: 'label.login', + logout: 'label.logout', + singleDay: 'label.single-day', + dateRange: 'label.date-range', + viewDetails: 'label.view-details', + deleteTeam: 'label.delete-team', + leaveTeam: 'label.leave-team', + refresh: 'label.refresh', + page: 'label.page', + pages: 'label.pages', + entry: 'label.entry', + exit: 'label.exit', + referrers: 'label.referrers', + screen: 'label.screen', + screens: 'label.screens', + browsers: 'label.browsers', + os: 'label.os', + devices: 'label.devices', + countries: 'label.countries', + languages: 'label.languages', + tags: 'label.tags', + segments: 'label.segments', + cohorts: 'label.cohorts', + count: 'label.count', + average: 'label.average', + sum: 'label.sum', + event: 'label.event', + events: 'label.events', + eventName: 'label.event-name', + excludeBounce: 'label.exclude-bounce', + query: 'label.query', + queryParameters: 'label.query-parameters', + back: 'label.back', + visitors: 'label.visitors', + visits: 'label.visits', + filterCombined: 'label.filter-combined', + filterRaw: 'label.filter-raw', + views: 'label.views', + none: 'label.none', + clearAll: 'label.clear-all', + property: 'label.property', + today: 'label.today', + lastHours: 'label.last-hours', + yesterday: 'label.yesterday', + thisWeek: 'label.this-week', + lastDays: 'label.last-days', + lastMonths: 'label.last-months', + thisMonth: 'label.this-month', + thisYear: 'label.this-year', + allTime: 'label.all-time', + customRange: 'label.custom-range', + selectWebsite: 'label.select-website', + selectRole: 'label.select-role', + selectDate: 'label.select-date', + selectFilter: 'label.select-filter', + all: 'label.all', + session: 'label.session', + sessions: 'label.sessions', + distinctId: 'label.distinct-id', + pageNotFound: 'message.page-not-found', + activity: 'label.activity', + dismiss: 'label.dismiss', + poweredBy: 'label.powered-by', + pageViews: 'label.page-views', + uniqueVisitors: 'label.unique-visitors', + uniqueEvents: 'label.unique-events', + bounceRate: 'label.bounce-rate', + viewsPerVisit: 'label.views-per-visit', + visitDuration: 'label.visit-duration', + desktop: 'label.desktop', + laptop: 'label.laptop', + tablet: 'label.tablet', + mobile: 'label.mobile', + toggleCharts: 'label.toggle-charts', + editDashboard: 'label.edit-dashboard', + title: 'label.title', + view: 'label.view', + cities: 'label.cities', + regions: 'label.regions', + reports: 'label.reports', + eventData: 'label.event-data', + sessionData: 'label.session-data', + funnel: 'label.funnel', + funnels: 'label.funnels', + funnelDescription: 'label.funnel-description', + revenue: 'label.revenue', + revenueDescription: 'label.revenue-description', + attribution: 'label.attribution', + attributionDescription: 'label.attribution-description', + currency: 'label.currency', + model: 'label.model', + path: 'label.path', + paths: 'label.paths', + add: 'label.add', + update: 'label.update', + window: 'label.window', + runQuery: 'label.run-query', + field: 'label.field', + fields: 'label.fields', + createReport: 'label.create-report', + description: 'label.description', + untitled: 'label.untitled', + type: 'label.type', + filter: 'label.filter', + filters: 'label.filters', + breakdown: 'label.breakdown', + true: 'label.true', + false: 'label.false', + is: 'label.is', + isNot: 'label.is-not', + isSet: 'label.is-set', + isNotSet: 'label.is-not-set', + greaterThan: 'label.greater-than', + lessThan: 'label.less-than', + greaterThanEquals: 'label.greater-than-equals', + lessThanEquals: 'label.less-than-equals', + contains: 'label.contains', + doesNotContain: 'label.does-not-contain', + includes: 'label.includes', + doesNotInclude: 'label.does-not-include', + before: 'label.before', + after: 'label.after', + isTrue: 'label.is-true', + isFalse: 'label.is-false', + exists: 'label.exists', + doesNotExist: 'label.doest-not-exist', + total: 'label.total', + min: 'label.min', + max: 'label.max', + unique: 'label.unique', + value: 'label.value', + overview: 'label.overview', + totalRecords: 'label.total-records', + insight: 'label.insight', + insights: 'label.insights', + insightsDescription: 'label.insights-description', + retention: 'label.retention', + retentionDescription: 'label.retention-description', + dropoff: 'label.dropoff', + referrer: 'label.referrer', + hostname: 'label.hostname', + country: 'label.country', + region: 'label.region', + city: 'label.city', + browser: 'label.browser', + device: 'label.device', + pageTitle: 'label.pageTitle', + tag: 'label.tag', + source: 'label.source', + medium: 'label.medium', + campaign: 'label.campaign', + content: 'label.content', + term: 'label.term', + utmSource: 'label.utm-source', + utmMedium: 'label.utm-medium', + utmCampaign: 'label.utm-campaign', + utmContent: 'label.utm-content', + utmTerm: 'label.utm-term', + segment: 'label.segment', + cohort: 'label.cohort', + minute: 'label.minute', + hour: 'label.hour', + day: 'label.day', + month: 'label.month', + date: 'label.date', + pageOf: 'label.page-of', + create: 'label.create', + search: 'label.search', + numberOfRecords: 'label.number-of-records', + select: 'label.select', + myAccount: 'label.my-account', + transfer: 'label.transfer', + transactions: 'label.transactions', + uniqueCustomers: 'label.uniqueCustomers', + viewedPage: 'message.viewed-page', + collectedData: 'message.collected-data', + triggeredEvent: 'message.triggered-event', + utm: 'label.utm', + utmDescription: 'label.utm-description', + conversionStep: 'label.conversion-step', + conversionRate: 'label.conversion-rate', + steps: 'label.steps', + startStep: 'label.start-step', + endStep: 'label.end-step', + addStep: 'label.add-step', + goal: 'label.goal', + goals: 'label.goals', + goalsDescription: 'label.goals-description', + journey: 'label.journey', + journeys: 'label.journeys', + journeyDescription: 'label.journey-description', + compareDates: 'label.compare-dates', + compare: 'label.compare', + current: 'label.current', + previous: 'label.previous', + previousPeriod: 'label.previous-period', + previousYear: 'label.previous-year', + lastSeen: 'label.last-seen', + firstSeen: 'label.first-seen', + properties: 'label.properties', + channel: 'label.channel', + channels: 'label.channels', + sources: 'label.sources', + campaigns: 'label.campaigns', + terms: 'label.terms', + direct: 'label.direct', + referral: 'label.referral', + affiliate: 'label.affiliate', + email: 'label.email', + sms: 'label.sms', + organicSearch: 'label.organic-search', + organicSocial: 'label.organic-social', + organicShopping: 'label.organic-shopping', + organicVideo: 'label.organic-video', + paidAds: 'label.paid-ads', + paidSearch: 'label.paid-search', + paidSocial: 'label.paid-social', + paidShopping: 'label.paid-shopping', + paidVideo: 'label.paid-video', + grouped: 'label.grouped', + other: 'label.other', + boards: 'label.boards', + apply: 'label.apply', + link: 'label.link', + links: 'label.links', + pixel: 'label.pixel', + pixels: 'label.pixels', + addBoard: 'label.add-board', + addLink: 'label.add-link', + addPixel: 'label.add-pixel', + maximize: 'label.maximize', + remaining: 'label.remaining', + conversion: 'label.conversion', + firstClick: 'label.first-click', + lastClick: 'label.last-click', + online: 'label.online', + preferences: 'label.preferences', + location: 'label.location', + chart: 'label.chart', + table: 'label.table', + download: 'label.download', + traffic: 'label.traffic', + behavior: 'label.behavior', + growth: 'label.growth', + account: 'label.account', + application: 'label.application', + version: 'label.version', + saveSegment: 'label.save-segment', + saveCohort: 'label.save-cohort', + analysis: 'label.analysis', + destinationUrl: 'label.destination-url', + audience: 'label.audience', + invalidUrl: 'label.invalid-url', + environment: 'label.environment', + criteria: 'label.criteria', + share: 'label.share', + support: 'label.support', + documentation: 'label.documentation', + switchAccount: 'label.switch-account', }; -export const messages: Record = { - error: { id: 'message.error', defaultMessage: 'Something went wrong.' }, - saved: { id: 'message.saved', defaultMessage: 'Saved successfully.' }, - noUsers: { id: 'message.no-users', defaultMessage: 'There are no users.' }, - userDeleted: { id: 'message.user-deleted', defaultMessage: 'User deleted.' }, - noDataAvailable: { id: 'message.no-data-available', defaultMessage: 'No data available.' }, - nothingSelected: { id: 'message.nothing-selected', defaultMessage: 'Nothing selected.' }, - confirmReset: { - id: 'message.confirm-reset', - defaultMessage: 'Are you sure you want to reset {target}?', - }, - confirmDelete: { - id: 'message.confirm-delete', - defaultMessage: 'Are you sure you want to delete {target}?', - }, - confirmRemove: { - id: 'message.confirm-remove', - defaultMessage: 'Are you sure you want to remove {target}?', - }, - confirmLeave: { - id: 'message.confirm-leave', - defaultMessage: 'Are you sure you want to leave {target}?', - }, - minPasswordLength: { - id: 'message.min-password-length', - defaultMessage: 'Minimum length of {n} characters', - }, - noTeams: { - id: 'message.no-teams', - defaultMessage: 'You have not created any teams.', - }, - shareUrl: { - id: 'message.share-url', - defaultMessage: 'Your website stats are publicly available at the following URL:', - }, - trackingCode: { - id: 'message.tracking-code', - defaultMessage: - 'To track stats for this website, place the following code in the ... section of your HTML.', - }, - joinTeamWarning: { - id: 'message.team-already-member', - defaultMessage: 'You are already a member of the team.', - }, - actionConfirmation: { - id: 'message.action-confirmation', - defaultMessage: 'Type {confirmation} in the box below to confirm.', - }, - resetWebsite: { - id: 'message.reset-website', - defaultMessage: 'To reset this website, type {confirmation} in the box below to confirm.', - }, - invalidDomain: { - id: 'message.invalid-domain', - defaultMessage: 'Invalid domain. Do not include http/https.', - }, - resetWebsiteWarning: { - id: 'message.reset-website-warning', - defaultMessage: - 'All statistics for this website will be deleted, but your settings will remain intact.', - }, - deleteWebsiteWarning: { - id: 'message.delete-website-warning', - defaultMessage: 'All website data will be deleted.', - }, - deleteTeamWarning: { - id: 'message.delete-team-warning', - defaultMessage: 'Deleting a team will also delete all team websites.', - }, - noResultsFound: { - id: 'message.no-results-found', - defaultMessage: 'No results found.', - }, - noWebsitesConfigured: { - id: 'message.no-websites-configured', - defaultMessage: 'You do not have any websites configured.', - }, - noTeamWebsites: { - id: 'message.no-team-websites', - defaultMessage: 'This team does not have any websites.', - }, - teamWebsitesInfo: { - id: 'message.team-websites-info', - defaultMessage: 'Websites can be viewed by anyone on the team.', - }, - noMatchPassword: { id: 'message.no-match-password', defaultMessage: 'Passwords do not match.' }, - goToSettings: { - id: 'message.go-to-settings', - defaultMessage: 'Go to settings', - }, - activeUsers: { - id: 'message.active-users', - defaultMessage: '{x} current {x, plural, one {visitor} other {visitors}}', - }, - teamNotFound: { - id: 'message.team-not-found', - defaultMessage: 'Team not found.', - }, - visitorLog: { - id: 'message.visitor-log', - defaultMessage: 'Visitor from {country} using {browser} on {os} {device}', - }, - eventLog: { - id: 'message.event-log', - defaultMessage: '{event} on {url}', - }, - incorrectUsernamePassword: { - id: 'message.incorrect-username-password', - defaultMessage: 'Incorrect username and/or password.', - }, - noEventData: { - id: 'message.no-event-data', - defaultMessage: 'No event data is available.', - }, - newVersionAvailable: { - id: 'message.new-version-available', - defaultMessage: 'A new version of Umami {version} is available!', - }, - transferWebsite: { - id: 'message.transfer-website', - defaultMessage: 'Transfer website ownership to your account or another team.', - }, - transferTeamWebsiteToUser: { - id: 'message.transfer-team-website-to-user', - defaultMessage: 'Transfer this website to your account?', - }, - transferUserWebsiteToTeam: { - id: 'message.transfer-user-website-to-team', - defaultMessage: 'Select the team to transfer this website to.', - }, - unauthorized: { - id: 'message.unauthorized', - defaultMessage: 'Unauthorized', - }, - badRequest: { - id: 'message.bad-request', - defaultMessage: 'Bad request', - }, - forbidden: { - id: 'message.forbidden', - defaultMessage: 'Forbidden', - }, - notFound: { - id: 'message.not-found', - defaultMessage: 'Not found', - }, - serverError: { - id: 'message.sever-error', - defaultMessage: 'Server error', - }, +export const messages: Record = { + error: 'message.error', + saved: 'message.saved', + noUsers: 'message.no-users', + userDeleted: 'message.user-deleted', + noDataAvailable: 'message.no-data-available', + nothingSelected: 'message.nothing-selected', + confirmReset: 'message.confirm-reset', + confirmDelete: 'message.confirm-delete', + confirmRemove: 'message.confirm-remove', + confirmLeave: 'message.confirm-leave', + minPasswordLength: 'message.min-password-length', + noTeams: 'message.no-teams', + shareUrl: 'message.share-url', + trackingCode: 'message.tracking-code', + joinTeamWarning: 'message.team-already-member', + actionConfirmation: 'message.action-confirmation', + resetWebsite: 'message.reset-website', + invalidDomain: 'message.invalid-domain', + resetWebsiteWarning: 'message.reset-website-warning', + deleteWebsiteWarning: 'message.delete-website-warning', + deleteTeamWarning: 'message.delete-team-warning', + noResultsFound: 'message.no-results-found', + noWebsitesConfigured: 'message.no-websites-configured', + noTeamWebsites: 'message.no-team-websites', + teamWebsitesInfo: 'message.team-websites-info', + noMatchPassword: 'message.no-match-password', + goToSettings: 'message.go-to-settings', + activeUsers: 'message.active-users', + teamNotFound: 'message.team-not-found', + visitorLog: 'message.visitor-log', + eventLog: 'message.event-log', + incorrectUsernamePassword: 'message.incorrect-username-password', + noEventData: 'message.no-event-data', + newVersionAvailable: 'message.new-version-available', + transferWebsite: 'message.transfer-website', + transferTeamWebsiteToUser: 'message.transfer-team-website-to-user', + transferUserWebsiteToTeam: 'message.transfer-user-website-to-team', + unauthorized: 'message.unauthorized', + badRequest: 'message.bad-request', + forbidden: 'message.forbidden', + notFound: 'message.not-found', + serverError: 'message.sever-error', }; diff --git a/src/components/metrics/ActiveUsers.tsx b/src/components/metrics/ActiveUsers.tsx index d440f9ae7..fda0ba2a4 100644 --- a/src/components/metrics/ActiveUsers.tsx +++ b/src/components/metrics/ActiveUsers.tsx @@ -12,7 +12,7 @@ export function ActiveUsers({ value?: number; refetchInterval?: number; }) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data } = useActyiveUsersQuery(websiteId, { refetchInterval }); const count = useMemo(() => { @@ -31,7 +31,7 @@ export function ActiveUsers({ - {count} {formatMessage(labels.online)} + {count} {t(labels.online)} diff --git a/src/components/metrics/DatePickerForm.tsx b/src/components/metrics/DatePickerForm.tsx index 59d170937..cb6041af6 100644 --- a/src/components/metrics/DatePickerForm.tsx +++ b/src/components/metrics/DatePickerForm.tsx @@ -20,7 +20,7 @@ export function DatePickerForm({ const [date, setDate] = useState(defaultStartDate || new Date()); const [startDate, setStartDate] = useState(defaultStartDate || new Date()); const [endDate, setEndDate] = useState(defaultEndDate || new Date()); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const disabled = selected.includes(FILTER_DAY) ? isAfter(minDate, date) && isBefore(maxDate, date) @@ -38,8 +38,8 @@ export function DatePickerForm({ - {formatMessage(labels.singleDay)} - {formatMessage(labels.dateRange)} + {t(labels.singleDay)} + {t(labels.dateRange)} @@ -64,9 +64,9 @@ export function DatePickerForm({ )} - + diff --git a/src/components/metrics/ListTable.tsx b/src/components/metrics/ListTable.tsx index 00192d1b2..b2924b374 100644 --- a/src/components/metrics/ListTable.tsx +++ b/src/components/metrics/ListTable.tsx @@ -41,7 +41,7 @@ export function ListTable({ itemCount = 10, currency, }: ListTableProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { isPhone } = useMobile(); const getRow = (row: ListData, index: number) => { @@ -50,7 +50,7 @@ export function ListTable({ return ( } /> ); case 'domain': if (label === 'Other') { - return `(${formatMessage(labels.other)})`; + return `(${t(labels.other)})`; } else { const name = GROUPED_DOMAINS.find(({ domain }) => domain === label)?.name; diff --git a/src/components/metrics/MetricsExpandedTable.tsx b/src/components/metrics/MetricsExpandedTable.tsx index f24c952de..c4c49e75a 100644 --- a/src/components/metrics/MetricsExpandedTable.tsx +++ b/src/components/metrics/MetricsExpandedTable.tsx @@ -33,7 +33,7 @@ export function MetricsExpandedTable({ children, }: MetricsExpandedTableProps) { const [search, setSearch] = useState(''); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const isType = ['browser', 'country', 'device', 'os'].includes(type); const showBounceDuration = SESSION_COLUMNS.includes(type); @@ -79,35 +79,20 @@ export function MetricsExpandedTable({ )}
- + {row => row?.visitors?.toLocaleString()} - + {row => row?.visits?.toLocaleString()} - + {row => row?.pageviews?.toLocaleString()} {showBounceDuration && [ @@ -120,7 +105,7 @@ export function MetricsExpandedTable({ diff --git a/src/components/metrics/MetricsTable.tsx b/src/components/metrics/MetricsTable.tsx index e2fbc287e..8c94b26b4 100644 --- a/src/components/metrics/MetricsTable.tsx +++ b/src/components/metrics/MetricsTable.tsx @@ -32,7 +32,7 @@ export function MetricsTable({ ...props }: MetricsTableProps) { const { updateParams } = useNavigation(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { data, isLoading, isFetching, error } = useWebsiteMetricsQuery(websiteId, { type, limit, @@ -83,7 +83,7 @@ export function MetricsTable({ {showMore && limit && ( - }>{formatMessage(labels.more)} + }>{t(labels.more)} )} diff --git a/src/components/metrics/PageviewsChart.tsx b/src/components/metrics/PageviewsChart.tsx index b83f8dc3a..6727facaa 100644 --- a/src/components/metrics/PageviewsChart.tsx +++ b/src/components/metrics/PageviewsChart.tsx @@ -19,7 +19,7 @@ export interface PageviewsChartProps extends BarChartProps { } export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: PageviewsChartProps) { - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { theme } = useTheme(); const { locale, dateLocale } = useLocale(); const { colors } = useMemo(() => getThemeColors(theme), [theme]); @@ -32,7 +32,7 @@ export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: Pagev datasets: [ { type: 'bar', - label: formatMessage(labels.visitors), + label: t(labels.visitors), data: generateTimeSeries(data.sessions, minDate, maxDate, unit, dateLocale), borderWidth: 1, barPercentage: 0.9, @@ -42,7 +42,7 @@ export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: Pagev }, { type: 'bar', - label: formatMessage(labels.views), + label: t(labels.views), data: generateTimeSeries(data.pageviews, minDate, maxDate, unit, dateLocale), barPercentage: 0.9, categoryPercentage: 0.9, @@ -54,7 +54,7 @@ export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: Pagev ? [ { type: 'line', - label: `${formatMessage(labels.views)} (${formatMessage(labels.previous)})`, + label: `${t(labels.views)} (${t(labels.previous)})`, data: generateTimeSeries( data.compare.pageviews, minDate, @@ -69,7 +69,7 @@ export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: Pagev }, { type: 'line', - label: `${formatMessage(labels.visitors)} (${formatMessage(labels.previous)})`, + label: `${t(labels.visitors)} (${t(labels.previous)})`, data: generateTimeSeries(data.compare.sessions, minDate, maxDate, unit, dateLocale), borderWidth: 2, backgroundColor: '#f15bb5', diff --git a/src/components/metrics/WeeklyTraffic.tsx b/src/components/metrics/WeeklyTraffic.tsx index 40d562d6a..c1c58ee82 100644 --- a/src/components/metrics/WeeklyTraffic.tsx +++ b/src/components/metrics/WeeklyTraffic.tsx @@ -7,7 +7,7 @@ import { getDayOfWeekAsDate } from '@/lib/date'; export function WeeklyTraffic({ websiteId }: { websiteId: string }) { const { data, isLoading, error } = useWeeklyTrafficQuery(websiteId); const { dateLocale } = useLocale(); - const { labels, formatMessage } = useMessages(); + const { labels, t } = useMessages(); const { weekStartsOn } = dateLocale.options; const daysOfWeek = Array(7) .fill(weekStartsOn) @@ -96,7 +96,7 @@ export function WeeklyTraffic({ websiteId }: { websiteId: string }) { - {`${formatMessage(labels.visitors)}: ${count}`} + {`${t(labels.visitors)}: ${count}`} ); diff --git a/src/components/metrics/WorldMap.tsx b/src/components/metrics/WorldMap.tsx index 1939fe89d..f0df71487 100644 --- a/src/components/metrics/WorldMap.tsx +++ b/src/components/metrics/WorldMap.tsx @@ -23,10 +23,10 @@ export function WorldMap({ websiteId, data, ...props }: WorldMapProps) { const { theme } = useTheme(); const { colors } = getThemeColors(theme); const { locale } = useLocale(); - const { formatMessage, labels } = useMessages(); + const { t, labels } = useMessages(); const { countryNames } = useCountryNames(locale); - const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale); - const unknownLabel = formatMessage(labels.unknown); + const visitorsLabel = t(labels.visitors).toLocaleLowerCase(locale); + const unknownLabel = t(labels.unknown); const { data: mapData } = useWebsiteMetricsQuery(websiteId, { type: 'country',