diff --git a/openwisp_users/accounts/locale/de/LC_MESSAGES/django.po b/openwisp_users/accounts/locale/de/LC_MESSAGES/django.po
index d096ecef0..349a99677 100644
--- a/openwisp_users/accounts/locale/de/LC_MESSAGES/django.po
+++ b/openwisp_users/accounts/locale/de/LC_MESSAGES/django.po
@@ -6,23 +6,16 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-11-11 21:36-0500\n"
+"POT-Creation-Date: 2026-07-02 17:08+0200\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: accounts/templates/account/email/email_confirmation_message.html:5
-#, python-format
-msgid ""
-"\n"
-"You're receiving this e-mail because user %(user_display)s registered "
-"this e-mail address to create an account on %(site_name)s.\n"
-msgstr ""
-"\n"
-"Sie bekommen diese E-Mail, weil diese E-Mail-Adresse von einem Benutzer "
-"%(user_display)s auf %(site_name)s registriert wurde.\n"
+#: accounts/adapter.py:23 accounts/templates/account/email_confirm.html:21
+msgid "Confirm"
+msgstr "Bestätigen"
#: accounts/templates/account/email/account_expiration_reminder_message.html:5
#, python-format
@@ -49,40 +42,123 @@ msgstr ""
#: accounts/templates/account/email/account_expiration_reminder_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s will expire in %(days)s day on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s day "
+"on %(expiry_date)s."
msgid_plural ""
-"We inform you that your account %(username)s will expire in %(days)s days on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s "
+"days on %(expiry_date)s."
msgstr[0] ""
-"Wir informieren Sie, dass Ihr Konto %(username)s in %(days)s Tag am "
+"Wir informieren Sie, dass Ihr Konto \"%(username)s\" in %(days)s Tag am "
"%(expiry_date)s abläuft."
msgstr[1] ""
-"Wir informieren Sie, dass Ihr Konto %(username)s in %(days)s Tagen am "
+"Wir informieren Sie, dass Ihr Konto \"%(username)s\" in %(days)s Tagen am "
"%(expiry_date)s abläuft."
#: accounts/templates/account/email/account_expired_message.html:5
-#: accounts/templates/account/email/account_expired_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s has been deactivated because it "
-"expired on %(expiry_date)s."
+"We inform you that your account %(username)s has been "
+"deactivated because it expired on %(expiry_date)s."
msgstr ""
-"Wir informieren Sie, dass Ihr Konto %(username)s deaktiviert wurde, weil es "
-"am %(expiry_date)s abgelaufen ist."
+"Wir informieren Sie, dass Ihr Konto %(username)s "
+"deaktiviert wurde, weil es am %(expiry_date)s abgelaufen ist."
#: accounts/templates/account/email/account_expired_message.html:11
#: accounts/templates/account/email/account_expired_message.txt:8
msgid ""
"Please contact your administrator if you need to reactivate your account."
msgstr ""
-"Bitte kontaktieren Sie Ihren Administrator, wenn Sie Ihr Konto "
-"reaktivieren möchten."
+"Bitte kontaktieren Sie Ihren Administrator, wenn Sie Ihr Konto reaktivieren "
+"möchten."
+#: accounts/templates/account/email/account_expired_message.txt:4
+#, python-format
+msgid ""
+"We inform you that your account \"%(username)s\" has been deactivated "
+"because it expired on %(expiry_date)s."
+msgstr ""
+"Wir informieren Sie, dass Ihr Konto \"%(username)s\" deaktiviert wurde, weil "
+"es am %(expiry_date)s abgelaufen ist."
+
+#: accounts/templates/account/email/base_message.txt:1
+#, python-format
+msgid "Welcome to %(site_name)s!"
+msgstr "Willkommen bei %(site_name)s!"
+
+#: accounts/templates/account/email/base_message.txt:5
+#, python-format
+msgid ""
+"Thank you for using %(site_name)s!\n"
+"%(site_domain)s"
+msgstr ""
+"Danke, dass Sie %(site_name)s nutzen!\n"
+"%(site_domain)s"
+
+#: accounts/templates/account/email/email_confirmation_message.html:5
+#, python-format
+msgid ""
+"\n"
+"You're receiving this e-mail because user %(user_display)s registered "
+"this e-mail address to create an account on %(site_name)s.\n"
+msgstr ""
+"\n"
+"Sie bekommen diese E-Mail, weil diese E-Mail-Adresse von einem Benutzer "
+"%(user_display)s auf %(site_name)s registriert wurde.\n"
#: accounts/templates/account/email/email_confirmation_message.html:9
msgid "To confirm this is correct, please click on the button below."
-msgstr "Um zu bestätigen, dass dies korrekt ist, klicken Sie bitte auf die Schaltfläche unten."
+msgstr ""
+"Um zu bestätigen, dass dies korrekt ist, klicken Sie bitte auf die "
+"Schaltfläche unten."
+
+#: accounts/templates/account/email/email_confirmation_message.txt:5
+#, python-format
+msgid ""
+"You're receiving this e-mail because user %(user_display)s registered this e-"
+"mail address to create an account on %(site_domain)s.\n"
+"\n"
+"To confirm this is correct, go to %(activate_url)s"
+msgstr ""
+"Sie erhalten diese E-Mail, weil der Benutzer %(user_display)s diese E-Mail-"
+"Adresse zur Erstellung eines Kontos auf %(site_domain)s registriert hat.\n"
+"\n"
+"Um dies zu bestätigen, gehen Sie zu %(activate_url)s"
+
+#: accounts/templates/account/email/password_expiration_message.html:4
+#: accounts/templates/account/email/password_expiration_message.txt:4
+#, python-format
+msgid ""
+"We inform you that the password for your account %(username)s will expire in "
+"7 days, precisely on %(expiry_date)s."
+msgstr ""
+"Wir informieren Sie darüber, dass das Passwort für Ihr Konto %(username)s in "
+"7 Tagen abläuft, genau am %(expiry_date)s."
+
+#: accounts/templates/account/email/password_expiration_message.html:6
+#: accounts/templates/account/email/password_expiration_message.txt:6
+msgid ""
+"Kindly proceed with updating your password by clicking on the button below."
+msgstr ""
+"Bitte aktualisieren Sie Ihr Passwort, indem Sie auf die Schaltfläche unten "
+"klicken."
+
+#: accounts/templates/account/email_confirm.html:6
+#: accounts/templates/account/email_confirm.html:11
+msgid "Confirm E-mail Address"
+msgstr "E-Mail-Adresse bestätigen"
+
+#: accounts/templates/account/email_confirm.html:17
+#, python-format
+msgid ""
+"Please confirm that %(email)s is an e-mail "
+"address for user %(user_display)s."
+msgstr ""
+"Bitte bestätigen Sie, dass %(email)s eine E-"
+"Mail-Adresse für den Benutzer %(user_display)s ist."
+
+#: accounts/templates/account/email_confirm.html:26
+msgid "This e-mail confirmation link expired or is invalid."
+msgstr "Dieser Bestätigungslink ist abgelaufen oder ungültig."
#: accounts/templates/account/email_verification_success.html:18
msgid "Your email has been verified successfully."
@@ -90,27 +166,48 @@ msgstr "E-Mail-Adresse bestätigt."
#: accounts/templates/account/email_verification_success.html:19
#: accounts/templates/account/logout_success.html:19
+#: accounts/templates/account/password_change_success.html:19
+#: accounts/templates/account/password_not_required.html:20
msgid "This web page can be closed."
msgstr "Die Seite kann geschlossen werden."
+#: accounts/templates/account/login.html:4
+#: accounts/templates/account/login.html:19
+#: accounts/templates/account/login.html:27
+msgid "Sign In"
+msgstr "Anmelden"
+
+#: accounts/templates/account/login.html:28
+#: accounts/templates/account/password_change.html:49
+msgid "Forgot Password?"
+msgstr "Passwort vergessen?"
+
#: accounts/templates/account/logout_success.html:18
msgid "Logout successful."
msgstr "Sie wurden erfolgreich abgemeldet."
-#: accounts/templates/account/email/password_expiration_message.html:3
-#: accounts/templates/account/email/password_expiration_message.txt:3
-#, python-format
+#: accounts/templates/account/password_change.html:6
+#: accounts/templates/account/password_change.html:14
+msgid "Change Password"
+msgstr "Passwort ändern"
+
+#: accounts/templates/account/password_change.html:48
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: accounts/templates/account/password_change_success.html:18
+msgid "Your password has been changed successfully."
+msgstr "Ihr Passwort wurde erfolgreich geändert."
+
+#: accounts/templates/account/password_not_required.html:18
msgid ""
-"We inform you that the password for your account %(username)s will expire in "
-"7 days, precisely on %(expiry_date)s."
+"You cannot change your password from this application because your account "
+"is linked to a third-party authentication provider."
msgstr ""
-"Wir informieren Sie darüber, dass das Passwort für Ihr Konto %(username)s in "
-"7 Tagen abläuft, genau am %(expiry_date)s."
+"Sie können Ihr Passwort nicht über diese Anwendung ändern, da Ihr Konto mit "
+"einem Drittanbieter für die Authentifizierung verknüpft ist."
-#: accounts/templates/account/email/password_expiration_message.html:5
-#: accounts/templates/account/email/password_expiration_message.txt:5
-msgid ""
-"Kindly proceed with updating your password by clicking on the button below."
+#: accounts/templates/account/password_not_required.html:19
+msgid "Please visit the provider's website to manage your password."
msgstr ""
-"Bitte aktualisieren Sie Ihr Passwort, indem Sie auf die Schaltfläche unten "
-"klicken."
+"Bitte besuchen Sie die Website des Anbieters, um Ihr Passwort zu verwalten."
diff --git a/openwisp_users/accounts/locale/it/LC_MESSAGES/django.po b/openwisp_users/accounts/locale/it/LC_MESSAGES/django.po
index 5a9fd1801..989171670 100644
--- a/openwisp_users/accounts/locale/it/LC_MESSAGES/django.po
+++ b/openwisp_users/accounts/locale/it/LC_MESSAGES/django.po
@@ -6,19 +6,14 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-11-11 21:33-0500\n"
+"POT-Creation-Date: 2026-07-02 17:11+0200\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: accounts/adapter.py:11 accounts/templates/account/email_confirm.html:6
-#: accounts/templates/account/email_confirm.html:11
-msgid "Confirm E-mail Address"
-msgstr "Conferma l'indirizzo E-mail"
-
-#: accounts/adapter.py:21 accounts/templates/account/email_confirm.html:21
+#: accounts/adapter.py:23 accounts/templates/account/email_confirm.html:21
msgid "Confirm"
msgstr "Confermo"
@@ -46,27 +41,26 @@ msgstr ""
#: accounts/templates/account/email/account_expiration_reminder_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s will expire in %(days)s day on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s day "
+"on %(expiry_date)s."
msgid_plural ""
-"We inform you that your account %(username)s will expire in %(days)s days on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s "
+"days on %(expiry_date)s."
msgstr[0] ""
-"Ti informiamo che il tuo account %(username)s scadrà tra %(days)s giorno, "
-"precisamente il %(expiry_date)s."
+"Ti informiamo che il tuo account \"%(username)s\" scadrà tra %(days)s "
+"giorno, precisamente il %(expiry_date)s."
msgstr[1] ""
-"Ti informiamo che il tuo account %(username)s scadrà tra %(days)s giorni, "
-"precisamente il %(expiry_date)s."
+"Ti informiamo che il tuo account \"%(username)s\" scadrà tra %(days)s "
+"giorni, precisamente il %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:5
-#: accounts/templates/account/email/account_expired_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s has been deactivated because it "
-"expired on %(expiry_date)s."
+"We inform you that your account %(username)s has been "
+"deactivated because it expired on %(expiry_date)s."
msgstr ""
-"Ti informiamo che il tuo account %(username)s è stato disattivato perché è "
-"scaduto il %(expiry_date)s."
+"Ti informiamo che il tuo account %(username)s è stato "
+"disattivato perché è scaduto il %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:11
#: accounts/templates/account/email/account_expired_message.txt:8
@@ -75,6 +69,15 @@ msgid ""
msgstr ""
"Contatta il tuo amministratore se hai bisogno di riattivare il tuo account."
+#: accounts/templates/account/email/account_expired_message.txt:4
+#, python-format
+msgid ""
+"We inform you that your account \"%(username)s\" has been deactivated "
+"because it expired on %(expiry_date)s."
+msgstr ""
+"Ti informiamo che il tuo account \"%(username)s\" è stato disattivato perché "
+"è scaduto il %(expiry_date)s."
+
#: accounts/templates/account/email/base_message.txt:1
#, python-format
msgid "Welcome to %(site_name)s!"
@@ -116,6 +119,29 @@ msgstr ""
"indirizzo e-mail su %(site_domain)s.\n"
"Per confermare, clicca sul seguente collegamento: %(activate_url)s"
+#: accounts/templates/account/email/password_expiration_message.html:4
+#: accounts/templates/account/email/password_expiration_message.txt:4
+#, python-format
+msgid ""
+"We inform you that the password for your account %(username)s will expire in "
+"7 days, precisely on %(expiry_date)s."
+msgstr ""
+"Ti informiamo che la password per il tuo account %(username)s scadrà tra 7 "
+"giorni, precisamente il %(expiry_date)s."
+
+#: accounts/templates/account/email/password_expiration_message.html:6
+#: accounts/templates/account/email/password_expiration_message.txt:6
+msgid ""
+"Kindly proceed with updating your password by clicking on the button below."
+msgstr ""
+"Ti preghiamo di procedere con l'aggiornamento della tua password cliccando "
+"sul pulsante qui sotto."
+
+#: accounts/templates/account/email_confirm.html:6
+#: accounts/templates/account/email_confirm.html:11
+msgid "Confirm E-mail Address"
+msgstr "Conferma l'indirizzo E-mail"
+
#: accounts/templates/account/email_confirm.html:17
#, python-format
msgid ""
@@ -125,33 +151,57 @@ msgstr ""
"Conferma che %(email)s è l'indirizzo e-mail "
"per l'utente %(user_display)s."
+#: accounts/templates/account/email_confirm.html:26
+msgid "This e-mail confirmation link expired or is invalid."
+msgstr "Questo link di conferma e-mail è scaduto o non è valido."
+
#: accounts/templates/account/email_verification_success.html:18
msgid "Your email has been verified successfully."
msgstr "L'indirizzo email è stato verificato con successo."
#: accounts/templates/account/email_verification_success.html:19
#: accounts/templates/account/logout_success.html:19
+#: accounts/templates/account/password_change_success.html:19
+#: accounts/templates/account/password_not_required.html:20
msgid "This web page can be closed."
msgstr "La pagina può essere chiusa."
+#: accounts/templates/account/login.html:4
+#: accounts/templates/account/login.html:19
+#: accounts/templates/account/login.html:27
+msgid "Sign In"
+msgstr "Accedi"
+
+#: accounts/templates/account/login.html:28
+#: accounts/templates/account/password_change.html:49
+msgid "Forgot Password?"
+msgstr "Password dimenticata?"
+
#: accounts/templates/account/logout_success.html:18
msgid "Logout successful."
msgstr "Logout effettuato con successo."
-#: accounts/templates/account/email/password_expiration_message.html:3
-#: accounts/templates/account/email/password_expiration_message.txt:3
-#, python-format
-msgid ""
-"We inform you that the password for your account %(username)s will expire in "
-"7 days, precisely on %(expiry_date)s."
-msgstr ""
-"Ti informiamo che la password per il tuo account %(username)s scadrà tra "
-"7 giorni, precisamente il %(expiry_date)s."
+#: accounts/templates/account/password_change.html:6
+#: accounts/templates/account/password_change.html:14
+msgid "Change Password"
+msgstr "Cambia password"
+
+#: accounts/templates/account/password_change.html:48
+msgid "Change password"
+msgstr "Cambia password"
-#: accounts/templates/account/email/password_expiration_message.html:5
-#: accounts/templates/account/email/password_expiration_message.txt:5
+#: accounts/templates/account/password_change_success.html:18
+msgid "Your password has been changed successfully."
+msgstr "La tua password è stata modificata con successo."
+
+#: accounts/templates/account/password_not_required.html:18
msgid ""
-"Kindly proceed with updating your password by clicking on the button below."
+"You cannot change your password from this application because your account "
+"is linked to a third-party authentication provider."
msgstr ""
-"Ti preghiamo di procedere con l'aggiornamento della tua password cliccando "
-"sul pulsante qui sotto."
+"Non puoi cambiare la tua password da questa applicazione perché il tuo "
+"account è collegato a un provider di autenticazione di terze parti."
+
+#: accounts/templates/account/password_not_required.html:19
+msgid "Please visit the provider's website to manage your password."
+msgstr "Visita il sito web del provider per gestire la tua password."
diff --git a/openwisp_users/accounts/locale/ru/LC_MESSAGES/django.po b/openwisp_users/accounts/locale/ru/LC_MESSAGES/django.po
index 6440aadd9..658bbd2e9 100644
--- a/openwisp_users/accounts/locale/ru/LC_MESSAGES/django.po
+++ b/openwisp_users/accounts/locale/ru/LC_MESSAGES/django.po
@@ -5,27 +5,18 @@
#
msgid ""
msgstr ""
-"POT-Creation-Date: 2021-09-01 18:32-0500\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-02 17:11+0200\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 "
-"&& n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: templates/account/email/base_message.txt:1
-#, python-format
-msgid "Welcome to %(site_name)s!"
-msgstr "Добро пожаловат на %(site_name)s!"
-
-#: templates/account/email/base_message.txt:5
-#, python-format
-msgid ""
-"Thank you for using %(site_name)s!\n"
-"%(site_domain)s"
-msgstr ""
-"Спасибо за использование %(site_name)s!\n"
-"%(site_domain)s"
+#: accounts/adapter.py:23 accounts/templates/account/email_confirm.html:21
+msgid "Confirm"
+msgstr "Подтверждать"
#: accounts/templates/account/email/account_expiration_reminder_message.html:5
#, python-format
@@ -36,17 +27,14 @@ msgid_plural ""
"We inform you that your account %(username)s will expire in "
"%(days)s days on %(expiry_date)s."
msgstr[0] ""
-"Сообщаем вам, что срок действия вашей учетной записи "
-"%(username)s истечет через %(days)s день, а именно "
-"%(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи %(username)s"
+"strong> истечет через %(days)s день, а именно %(expiry_date)s."
msgstr[1] ""
-"Сообщаем вам, что срок действия вашей учетной записи "
-"%(username)s истечет через %(days)s дня, а именно "
-"%(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи %(username)s"
+"strong> истечет через %(days)s дня, а именно %(expiry_date)s."
msgstr[2] ""
-"Сообщаем вам, что срок действия вашей учетной записи "
-"%(username)s истечет через %(days)s дней, а именно "
-"%(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи %(username)s"
+"strong> истечет через %(days)s дней, а именно %(expiry_date)s."
#: accounts/templates/account/email/account_expiration_reminder_message.html:13
#: accounts/templates/account/email/account_expiration_reminder_message.txt:10
@@ -58,38 +46,60 @@ msgstr ""
#: accounts/templates/account/email/account_expiration_reminder_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s will expire in %(days)s day on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s day "
+"on %(expiry_date)s."
msgid_plural ""
-"We inform you that your account %(username)s will expire in %(days)s days on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s "
+"days on %(expiry_date)s."
msgstr[0] ""
-"Сообщаем вам, что срок действия вашей учетной записи %(username)s истечет "
-"через %(days)s день, а именно %(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи \"%(username)s\" "
+"истечет через %(days)s день, а именно %(expiry_date)s."
msgstr[1] ""
-"Сообщаем вам, что срок действия вашей учетной записи %(username)s истечет "
-"через %(days)s дня, а именно %(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи \"%(username)s\" "
+"истечет через %(days)s дня, а именно %(expiry_date)s."
msgstr[2] ""
-"Сообщаем вам, что срок действия вашей учетной записи %(username)s истечет "
-"через %(days)s дней, а именно %(expiry_date)s."
+"Сообщаем вам, что срок действия вашей учетной записи \"%(username)s\" "
+"истечет через %(days)s дней, а именно %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:5
-#: accounts/templates/account/email/account_expired_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s has been deactivated because it "
-"expired on %(expiry_date)s."
+"We inform you that your account %(username)s has been "
+"deactivated because it expired on %(expiry_date)s."
msgstr ""
-"Сообщаем вам, что ваша учетная запись %(username)s была деактивирована, "
-"поскольку срок ее действия истек %(expiry_date)s."
+"Сообщаем вам, что ваша учетная запись %(username)s была "
+"деактивирована, поскольку срок ее действия истек %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:11
#: accounts/templates/account/email/account_expired_message.txt:8
msgid ""
"Please contact your administrator if you need to reactivate your account."
msgstr ""
-"Пожалуйста, свяжитесь с вашим администратором, если вам нужно "
-"повторно активировать вашу учетную запись."
+"Пожалуйста, свяжитесь с вашим администратором, если вам нужно повторно "
+"активировать вашу учетную запись."
+
+#: accounts/templates/account/email/account_expired_message.txt:4
+#, python-format
+msgid ""
+"We inform you that your account \"%(username)s\" has been deactivated "
+"because it expired on %(expiry_date)s."
+msgstr ""
+"Сообщаем вам, что ваша учетная запись \"%(username)s\" была деактивирована, "
+"поскольку срок ее действия истек %(expiry_date)s."
+
+#: accounts/templates/account/email/base_message.txt:1
+#, python-format
+msgid "Welcome to %(site_name)s!"
+msgstr "Добро пожаловать на %(site_name)s!"
+
+#: accounts/templates/account/email/base_message.txt:5
+#, python-format
+msgid ""
+"Thank you for using %(site_name)s!\n"
+"%(site_domain)s"
+msgstr ""
+"Спасибо за использование %(site_name)s!\n"
+"%(site_domain)s"
#: accounts/templates/account/email/email_confirmation_message.html:5
#, python-format
@@ -99,55 +109,112 @@ msgid ""
"this e-mail address to create an account on %(site_name)s.\n"
msgstr ""
"\n"
-"Вы получаете это письмо, потому что пользователь %(user_display)s зарегистрировал это "
-"емейл на %(site_name)s.\n"
+"Вы получаете это письмо, потому что пользователь %(user_display)s "
+"зарегистрировал это емейл на %(site_name)s.\n"
#: accounts/templates/account/email/email_confirmation_message.html:9
msgid "To confirm this is correct, please click on the button below."
msgstr "Чтобы убедиться, что это правильно, нажмите кнопку ниже."
-#: templates/account/email_confirm.html:6 templates/account/email_confirm.html:9
+#: accounts/templates/account/email/email_confirmation_message.txt:5
+#, python-format
+msgid ""
+"You're receiving this e-mail because user %(user_display)s registered this e-"
+"mail address to create an account on %(site_domain)s.\n"
+"\n"
+"To confirm this is correct, go to %(activate_url)s"
+msgstr ""
+"Вы получаете это письмо, потому что пользователь %(user_display)s "
+"зарегистрировал этот адрес электронной почты для создания учётной записи на "
+"%(site_domain)s.\n"
+"\n"
+"Чтобы подтвердить это, перейдите по ссылке %(activate_url)s"
+
+#: accounts/templates/account/email/password_expiration_message.html:4
+#: accounts/templates/account/email/password_expiration_message.txt:4
+#, python-format
+msgid ""
+"We inform you that the password for your account %(username)s will expire in "
+"7 days, precisely on %(expiry_date)s."
+msgstr ""
+"Мы информируем вас о том, что пароль для вашей учетной записи %(username)s "
+"истекает через 7 дней, точно %(expiry_date)s."
+
+#: accounts/templates/account/email/password_expiration_message.html:6
+#: accounts/templates/account/email/password_expiration_message.txt:6
+msgid ""
+"Kindly proceed with updating your password by clicking on the button below."
+msgstr "Просим вас обновить ваш пароль, нажав на кнопку ниже."
+
+#: accounts/templates/account/email_confirm.html:6
+#: accounts/templates/account/email_confirm.html:11
msgid "Confirm E-mail Address"
msgstr "Подтверждать емейл адрес"
-#: templates/account/email_confirm.html:15
+#: accounts/templates/account/email_confirm.html:17
#, python-format
msgid ""
-"Please confirm that %(email)s is an e-mail address for "
-"user %(user_display)s."
+"Please confirm that %(email)s is an e-mail "
+"address for user %(user_display)s."
msgstr ""
-"Подтвердите, что это %(email)s адрес электронной почты "
-"пользователя %(user_display)s."
+"Подтвердите, что это %(email)s адрес "
+"электронной почты пользователя %(user_display)s."
-#: templates/account/email_verification_success.html:18
+#: accounts/templates/account/email_confirm.html:26
+msgid "This e-mail confirmation link expired or is invalid."
+msgstr ""
+"Срок действия этой ссылки для подтверждения e-mail истёк, или она "
+"недействительна."
+
+#: accounts/templates/account/email_verification_success.html:18
msgid "Your email has been verified successfully."
msgstr "Емейл адрес успешно подтверждён"
-#: templates/account/email_verification_success.html:19
+#: accounts/templates/account/email_verification_success.html:19
+#: accounts/templates/account/logout_success.html:19
+#: accounts/templates/account/password_change_success.html:19
+#: accounts/templates/account/password_not_required.html:20
msgid "This web page can be closed."
msgstr "Вы можете закрывать страницу"
-#: templates/account/email_confirm.html:20
-msgid "Confirm"
-msgstr "Подтверждать"
+#: accounts/templates/account/login.html:4
+#: accounts/templates/account/login.html:19
+#: accounts/templates/account/login.html:27
+msgid "Sign In"
+msgstr "Вход"
+
+#: accounts/templates/account/login.html:28
+#: accounts/templates/account/password_change.html:49
+msgid "Forgot Password?"
+msgstr "Забыли пароль?"
#: accounts/templates/account/logout_success.html:18
msgid "Logout successful."
msgstr "Выход прошел успешно."
-#: accounts/templates/account/email/password_expiration_message.html:3
-#: accounts/templates/account/email/password_expiration_message.txt:3
-#, python-format
+#: accounts/templates/account/password_change.html:6
+#: accounts/templates/account/password_change.html:14
+msgid "Change Password"
+msgstr "Изменить пароль"
+
+#: accounts/templates/account/password_change.html:48
+msgid "Change password"
+msgstr "Изменить пароль"
+
+#: accounts/templates/account/password_change_success.html:18
+msgid "Your password has been changed successfully."
+msgstr "Ваш пароль был успешно изменён."
+
+#: accounts/templates/account/password_not_required.html:18
msgid ""
-"We inform you that the password for your account %(username)s will expire in "
-"7 days, precisely on %(expiry_date)s."
+"You cannot change your password from this application because your account "
+"is linked to a third-party authentication provider."
msgstr ""
-"Мы информируем вас о том, что пароль для вашей учетной записи %(username)s "
-"истекает через 7 дней, точно %(expiry_date)s."
+"Вы не можете изменить пароль в этом приложении, поскольку ваша учётная "
+"запись связана со сторонним поставщиком аутентификации."
-#: accounts/templates/account/email/password_expiration_message.html:5
-#: accounts/templates/account/email/password_expiration_message.txt:5
-msgid ""
-"Kindly proceed with updating your password by clicking on the button below."
+#: accounts/templates/account/password_not_required.html:19
+msgid "Please visit the provider's website to manage your password."
msgstr ""
-"Просим вас обновить ваш пароль, нажав на кнопку ниже."
+"Пожалуйста, посетите веб-сайт поставщика услуг, чтобы управлять своим "
+"паролем."
diff --git a/openwisp_users/accounts/locale/sl/LC_MESSAGES/django.po b/openwisp_users/accounts/locale/sl/LC_MESSAGES/django.po
index a90c3329e..678612caf 100644
--- a/openwisp_users/accounts/locale/sl/LC_MESSAGES/django.po
+++ b/openwisp_users/accounts/locale/sl/LC_MESSAGES/django.po
@@ -6,24 +6,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-11-11 21:36-0500\n"
+"POT-Creation-Date: 2026-07-02 17:11+0200\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : "
-"n%100==3 || n%100==4 ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3);\n"
-#: accounts/templates/account/email/email_confirmation_message.html:5
-#, python-format
-msgid ""
-"\n"
-"You're receiving this e-mail because user %(user_display)s registered "
-"this e-mail address to create an account on %(site_name)s.\n"
-msgstr ""
-"\n"
-"To e-pošto ste prejeli, ker je registriran uporabnik %(user_display)s"
-"ta e-poštni naslov za ustvarjanje računa na %(site_name)s.\n"
+#: accounts/adapter.py:23 accounts/templates/account/email_confirm.html:21
+msgid "Confirm"
+msgstr "Potrdi"
#: accounts/templates/account/email/account_expiration_reminder_message.html:5
#, python-format
@@ -55,33 +48,32 @@ msgstr ""
#: accounts/templates/account/email/account_expiration_reminder_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s will expire in %(days)s day on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s day "
+"on %(expiry_date)s."
msgid_plural ""
-"We inform you that your account %(username)s will expire in %(days)s days on "
-"%(expiry_date)s."
+"We inform you that your account \"%(username)s\" will expire in %(days)s "
+"days on %(expiry_date)s."
msgstr[0] ""
-"Obveščamo vas, da bo vaš račun %(username)s potekel čez %(days)s dan, in "
+"Obveščamo vas, da bo vaš račun \"%(username)s\" potekel čez %(days)s dan, in "
"sicer %(expiry_date)s."
msgstr[1] ""
-"Obveščamo vas, da bo vaš račun %(username)s potekel čez %(days)s dni, in "
+"Obveščamo vas, da bo vaš račun \"%(username)s\" potekel čez %(days)s dni, in "
"sicer %(expiry_date)s."
msgstr[2] ""
-"Obveščamo vas, da bo vaš račun %(username)s potekel čez %(days)s dni, in "
+"Obveščamo vas, da bo vaš račun \"%(username)s\" potekel čez %(days)s dni, in "
"sicer %(expiry_date)s."
msgstr[3] ""
-"Obveščamo vas, da bo vaš račun %(username)s potekel čez %(days)s dni, in "
+"Obveščamo vas, da bo vaš račun \"%(username)s\" potekel čez %(days)s dni, in "
"sicer %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:5
-#: accounts/templates/account/email/account_expired_message.txt:4
#, python-format
msgid ""
-"We inform you that your account %(username)s has been deactivated because it "
-"expired on %(expiry_date)s."
+"We inform you that your account %(username)s has been "
+"deactivated because it expired on %(expiry_date)s."
msgstr ""
-"Obveščamo vas, da je bil vaš račun %(username)s deaktiviran, ker je potekel "
-"dne %(expiry_date)s."
+"Obveščamo vas, da je bil vaš račun %(username)s "
+"deaktiviran, ker je potekel dne %(expiry_date)s."
#: accounts/templates/account/email/account_expired_message.html:11
#: accounts/templates/account/email/account_expired_message.txt:8
@@ -91,35 +83,140 @@ msgstr ""
"Če želite ponovno aktivirati svoj račun, se obrnite na svojega "
"administratorja."
+#: accounts/templates/account/email/account_expired_message.txt:4
+#, python-format
+msgid ""
+"We inform you that your account \"%(username)s\" has been deactivated "
+"because it expired on %(expiry_date)s."
+msgstr ""
+"Obveščamo vas, da je bil vaš račun \"%(username)s\" deaktiviran, ker je "
+"potekel dne %(expiry_date)s."
+
+#: accounts/templates/account/email/base_message.txt:1
+#, python-format
+msgid "Welcome to %(site_name)s!"
+msgstr "Dobrodošli na %(site_name)s!"
+
+#: accounts/templates/account/email/base_message.txt:5
+#, python-format
+msgid ""
+"Thank you for using %(site_name)s!\n"
+"%(site_domain)s"
+msgstr ""
+"Hvala, ker uporabljate %(site_name)s!\n"
+"%(site_domain)s"
+
+#: accounts/templates/account/email/email_confirmation_message.html:5
+#, python-format
+msgid ""
+"\n"
+"You're receiving this e-mail because user %(user_display)s registered "
+"this e-mail address to create an account on %(site_name)s.\n"
+msgstr ""
+"\n"
+"To e-pošto ste prejeli, ker je registriran uporabnik %(user_display)s"
+"b> ta e-poštni naslov za ustvarjanje računa na %(site_name)s.\n"
+
#: accounts/templates/account/email/email_confirmation_message.html:9
msgid "To confirm this is correct, please click on the button below."
msgstr "Če želite potrditi, da je to pravilno, kliknite spodnji gumb."
+#: accounts/templates/account/email/email_confirmation_message.txt:5
+#, python-format
+msgid ""
+"You're receiving this e-mail because user %(user_display)s registered this e-"
+"mail address to create an account on %(site_domain)s.\n"
+"\n"
+"To confirm this is correct, go to %(activate_url)s"
+msgstr ""
+"To e-pošto prejemate, ker je uporabnik %(user_display)s registriral ta e-"
+"poštni naslov za ustvarjanje računa na %(site_domain)s.\n"
+"\n"
+"Če želite to potrditi, obiščite %(activate_url)s"
+
+#: accounts/templates/account/email/password_expiration_message.html:4
+#: accounts/templates/account/email/password_expiration_message.txt:4
+#, python-format
+msgid ""
+"We inform you that the password for your account %(username)s will expire in "
+"7 days, precisely on %(expiry_date)s."
+msgstr ""
+"Obveščamo vas, da bo geslo za vaš račun %(username)s poteklo v 7 dneh, "
+"natančneje dne %(expiry_date)s."
+
+#: accounts/templates/account/email/password_expiration_message.html:6
+#: accounts/templates/account/email/password_expiration_message.txt:6
+msgid ""
+"Kindly proceed with updating your password by clicking on the button below."
+msgstr ""
+"Prosimo, da nadaljujete z posodabljanjem svojega gesla tako, da kliknete na "
+"spodnji gumb."
+
+#: accounts/templates/account/email_confirm.html:6
+#: accounts/templates/account/email_confirm.html:11
+msgid "Confirm E-mail Address"
+msgstr "Potrdite e-poštni naslov"
+
+#: accounts/templates/account/email_confirm.html:17
+#, python-format
+msgid ""
+"Please confirm that %(email)s is an e-mail "
+"address for user %(user_display)s."
+msgstr ""
+"Prosimo, potrdite, da je %(email)s e-poštni "
+"naslov uporabnika %(user_display)s."
+
+#: accounts/templates/account/email_confirm.html:26
+msgid "This e-mail confirmation link expired or is invalid."
+msgstr "Ta povezava za potrditev e-pošte je potekla ali ni veljavna."
+
#: accounts/templates/account/email_verification_success.html:18
msgid "Your email has been verified successfully."
msgstr "Preverjanje naslova e-pošte je bilo uspešno."
#: accounts/templates/account/email_verification_success.html:19
#: accounts/templates/account/logout_success.html:19
+#: accounts/templates/account/password_change_success.html:19
+#: accounts/templates/account/password_not_required.html:20
msgid "This web page can be closed."
msgstr "Lahko zaprete stran."
+#: accounts/templates/account/login.html:4
+#: accounts/templates/account/login.html:19
+#: accounts/templates/account/login.html:27
+msgid "Sign In"
+msgstr "Prijava"
+
+#: accounts/templates/account/login.html:28
+#: accounts/templates/account/password_change.html:49
+msgid "Forgot Password?"
+msgstr "Ste pozabili geslo?"
+
#: accounts/templates/account/logout_success.html:18
msgid "Logout successful."
msgstr "Odjava uspešna."
-#: accounts/templates/account/email/password_expiration_message.html:3
-#: accounts/templates/account/email/password_expiration_message.txt:3
-#, python-format
-msgid ""
-"We inform you that the password for your account %(username)s will expire in "
-"7 days, precisely on %(expiry_date)s."
-msgstr ""
-"Obveščamo vas, da bo geslo za vaš račun %(username)s poteklo v 7 dneh, natančneje dne %(expiry_date)s."
+#: accounts/templates/account/password_change.html:6
+#: accounts/templates/account/password_change.html:14
+msgid "Change Password"
+msgstr "Spremeni geslo"
+
+#: accounts/templates/account/password_change.html:48
+msgid "Change password"
+msgstr "Spremeni geslo"
-#: accounts/templates/account/email/password_expiration_message.html:5
-#: accounts/templates/account/email/password_expiration_message.txt:5
+#: accounts/templates/account/password_change_success.html:18
+msgid "Your password has been changed successfully."
+msgstr "Vaše geslo je bilo uspešno spremenjeno."
+
+#: accounts/templates/account/password_not_required.html:18
msgid ""
-"Kindly proceed with updating your password by clicking on the button below."
+"You cannot change your password from this application because your account "
+"is linked to a third-party authentication provider."
msgstr ""
-"Prosimo, da nadaljujete z posodabljanjem svojega gesla tako, da kliknete na spodnji gumb."
+"Gesla ne morete spremeniti prek te aplikacije, ker je vaš račun povezan s "
+"ponudnikom avtentikacije tretje osebe."
+
+#: accounts/templates/account/password_not_required.html:19
+msgid "Please visit the provider's website to manage your password."
+msgstr "Obiščite spletno stran ponudnika za upravljanje svojega gesla."
diff --git a/openwisp_users/admin.py b/openwisp_users/admin.py
index af504df38..7bdd92ec4 100644
--- a/openwisp_users/admin.py
+++ b/openwisp_users/admin.py
@@ -181,9 +181,9 @@ class Meta(BaseUserCreationForm.Meta):
_("Account expiration"),
{"classes": ("wide",), "fields": ("expiration_date",)},
),
- ("Personal Info", {"classes": ("wide",), "fields": personal_fields}),
+ (_("Personal Info"), {"classes": ("wide",), "fields": personal_fields}),
(
- "Permissions",
+ _("Permissions"),
{"classes": ("wide",), "fields": ["is_active", "is_staff", "groups"]},
),
)
@@ -193,9 +193,9 @@ class Meta(BaseUserCreationForm.Meta):
_("Account expiration"),
{"classes": ("wide",), "fields": ("expiration_date",)},
),
- ("Personal Info", {"classes": ("wide",), "fields": personal_fields}),
+ (_("Personal Info"), {"classes": ("wide",), "fields": personal_fields}),
(
- "Permissions",
+ _("Permissions"),
{
"classes": ("wide",),
"fields": ["is_active", "is_staff", "is_superuser", "groups"],
@@ -274,10 +274,11 @@ def make_inactive(self, request, queryset):
if count:
self.message_user(
request,
- _(
- f"Successfully made {count} "
- f"{model_ngettext(self.opts, count)} inactive."
- ),
+ _("Successfully made %(count)d %(model_name)s inactive.")
+ % {
+ "count": count,
+ "model_name": model_ngettext(self.opts, count),
+ },
messages.SUCCESS,
)
@@ -413,11 +414,11 @@ def delete_selected_overridden(self, request, queryset):
self.message_user(
request,
ngettext(
- f"Can't delete %d organization owner: {owners}",
- f"Can't delete %d organization owners: {owners}",
+ "Can't delete %(count)d organization owner: %(owners)s",
+ "Can't delete %(count)d organization owners: %(owners)s",
count,
)
- % count,
+ % {"count": count, "owners": owners},
messages.ERROR,
)
# if trying to delete only owners, stop here
@@ -495,16 +496,17 @@ def save_formset(self, request, form, formset, change):
except OwnershipRequired:
not_deleted += 1
if not_deleted:
- single_msg = (
- f"Can't delete {not_deleted} organization user because it "
- "belongs to an organization owner."
- )
- multiple_msg = (
- f"Can't delete {not_deleted} organization users because they "
- "belong to some organization owners."
- )
self.message_user(
- request, ngettext(single_msg, multiple_msg, not_deleted), messages.ERROR
+ request,
+ ngettext(
+ "Can't delete %(count)d organization user because it "
+ "belongs to an organization owner.",
+ "Can't delete %(count)d organization users because they "
+ "belong to some organization owners.",
+ not_deleted,
+ )
+ % {"count": not_deleted},
+ messages.ERROR,
)
for instance in instances:
instance.save()
@@ -661,16 +663,17 @@ def delete_selected_overridden(self, request, queryset):
# if some org owners' org users were selected
if count and count != queryset.count():
queryset = queryset.exclude(pk__in=pks)
- single_msg = (
- f"Can't delete {count} organization user because it "
- "belongs to an organization owner."
- )
- multiple_msg = (
- f"Can't delete {count} organization users because they "
- "belong to some organization owners."
- )
self.message_user(
- request, ngettext(single_msg, multiple_msg, count), messages.ERROR
+ request,
+ ngettext(
+ "Can't delete %(count)d organization user because it "
+ "belongs to an organization owner.",
+ "Can't delete %(count)d organization users because they "
+ "belong to some organization owners.",
+ count,
+ )
+ % {"count": count},
+ messages.ERROR,
)
# otherwise proceed but remove org users from the delete queryset
return delete_selected(self, request, queryset)
diff --git a/openwisp_users/base/models.py b/openwisp_users/base/models.py
index 52ff71ce5..f2a38d3e4 100644
--- a/openwisp_users/base/models.py
+++ b/openwisp_users/base/models.py
@@ -498,9 +498,10 @@ def clean(self):
):
raise ValidationError(
_(
- f"{self.user.username} is the owner of the organization: "
- f"{self.organization}, and cannot be downgraded"
+ "%(username)s is the owner of the organization: "
+ "%(organization)s, and cannot be downgraded"
)
+ % {"username": self.user.username, "organization": self.organization}
)
@property
diff --git a/openwisp_users/locale/de/LC_MESSAGES/django.po b/openwisp_users/locale/de/LC_MESSAGES/django.po
index 1aa68b8af..cacd6bd19 100644
--- a/openwisp_users/locale/de/LC_MESSAGES/django.po
+++ b/openwisp_users/locale/de/LC_MESSAGES/django.po
@@ -5,25 +5,496 @@
#
msgid ""
msgstr ""
-"POT-Creation-Date: 2021-09-01 18:32-0500\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-03 10:10+0200\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: serializers.py:422
+#: admin.py:152
+msgid "Email"
+msgstr "E-Mail"
+
+#: admin.py:160
+msgid "A staff user must belong to a group, please select one."
+msgstr ""
+"Ein Mitarbeiter muss einer Gruppe angehören, bitte wählen Sie eine aus."
+
+#: admin.py:180 admin.py:192 admin.py:533
+msgid "Account expiration"
+msgstr "Ablauf des Kontos"
+
+#: admin.py:183 admin.py:195
+msgid "Personal Info"
+msgstr "Persönliche Informationen"
+
+#: admin.py:185 admin.py:197
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: admin.py:253
+msgid "Are you sure?"
+msgstr "Sind Sie sicher?"
+
+#: admin.py:267
+msgid "Flag selected users as inactive"
+msgstr "Ausgewählte Benutzer als inaktiv markieren"
+
+#: admin.py:276
+#, python-format
+msgid "Successfully made %(count)d %(model_name)s inactive."
+msgstr "%(count)d %(model_name)s erfolgreich deaktiviert."
+
+#: admin.py:285
+msgid "Flag selected users as active"
+msgstr "Ausgewählte Benutzer als aktiv markieren"
+
+#: admin.py:300
+#, python-format
+msgid "Successfully activated %(count)d %(model_name)s"
+msgstr "%(count)d %(model_name)s erfolgreich aktiviert"
+
+#: admin.py:309
+#, python-format
+msgid "and cleared %(count)d expiration date."
+msgid_plural "and cleared %(count)d expiration dates."
+msgstr[0] "und %(count)d Ablaufdatum gelöscht."
+msgstr[1] "und %(count)d Ablaufdaten gelöscht."
+
+#: admin.py:416
+#, python-format
+msgid "Can't delete %(count)d organization owner: %(owners)s"
+msgid_plural "Can't delete %(count)d organization owners: %(owners)s"
+msgstr[0] ""
+"%(count)d Organisationseigentümer kann nicht gelöscht werden: %(owners)s"
+msgstr[1] ""
+"%(count)d Organisationseigentümer können nicht gelöscht werden: %(owners)s"
+
+#: admin.py:501 admin.py:667
+#, python-format
+msgid ""
+"Can't delete %(count)d organization user because it belongs to an "
+"organization owner."
+msgid_plural ""
+"Can't delete %(count)d organization users because they belong to some "
+"organization owners."
+msgstr[0] ""
+"%(count)d Organisationsbenutzer kann nicht gelöscht werden, da er einem "
+"Organisationseigentümer gehört."
+msgstr[1] ""
+"%(count)d Organisationsbenutzer können nicht gelöscht werden, da sie einigen "
+"Organisationseigentümern gehören."
+
+#: admin.py:535
+msgid "Internal"
+msgstr "Intern"
+
+#: admin.py:625
+msgid ""
+"Can't delete this organization user because it belongs to an organization "
+"owner."
+msgstr ""
+"Dieser Organisationsbenutzer kann nicht gelöscht werden, da er dem "
+"Eigentümer der Organisation gehört."
+
+#: admin.py:654
+msgid "Can't delete organization users which belong to owners."
+msgstr ""
+"Organisationsbenutzer, die Eigentümern gehören, können nicht gelöscht werden."
+
+#: admin.py:736
+msgid "Create new API key"
+msgstr "Neuen API-Schlüssel erstellen"
+
+#: admin.py:797 admin.py:808 base/models.py:554
+msgid "API key"
+msgstr "API-Schlüssel"
+
+#: api/authentication.py:26
+msgid "Invalid token header. No credentials provided."
+msgstr "Ungültiger Token-Header. Keine Zugangsdaten angegeben."
+
+#: api/authentication.py:29
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr ""
+"Ungültiger Token-Header. Die Token-Zeichenfolge darf keine Leerzeichen "
+"enthalten."
+
+#: api/authentication.py:36
+msgid ""
+"Invalid token header. Token string should not contain invalid characters."
+msgstr ""
+"Ungültiger Token-Header. Die Token-Zeichenfolge darf keine ungültigen "
+"Zeichen enthalten."
+
+#: api/authentication.py:46
+msgid "Invalid or expired token."
+msgstr "Ungültiges oder abgelaufenes Token."
+
+#: api/permissions.py:21
+msgid "Organization not found, `organization_field` not implemented correctly."
+msgstr ""
+"Organisation nicht gefunden, `organization_field` wurde nicht korrekt "
+"implementiert."
+
+#: api/permissions.py:49
+msgid ""
+"View's permission_classes not implemented correctly.Please use one of the "
+"child classes: IsOrganizationMember, IsOrganizationManager or "
+"IsOrganizationOwner."
+msgstr ""
+"permission_classes der View wurden nicht korrekt implementiert. Bitte "
+"verwenden Sie eine der Unterklassen: IsOrganizationMember, "
+"IsOrganizationManager oder IsOrganizationOwner."
+
+#: api/permissions.py:58
+msgid ""
+"User is not a member of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Der Benutzer ist kein Mitglied der Organisation, zu der die angeforderte "
+"Ressource gehört."
+
+#: api/permissions.py:68
+msgid ""
+"User is not a manager of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Der Benutzer ist kein Verwalter der Organisation, zu der die angeforderte "
+"Ressource gehört."
+
+#: api/permissions.py:84
+msgid ""
+"User is not a owner of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Der Benutzer ist nicht Eigentümer der Organisation, zu der die angeforderte "
+"Ressource gehört."
+
+#: api/serializers.py:50
+msgid "organization with this slug already exists."
+msgstr "Eine Organisation mit diesem Slug existiert bereits."
+
+#: api/serializers.py:264
+msgid "This field cannot be blank."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: api/serializers.py:436
+msgid "The two password fields didn’t match."
+msgstr "Die beiden Passwortfelder stimmen nicht überein."
+
+#: api/serializers.py:452
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"Ihr altes Passwort wurde falsch eingegeben. Bitte geben Sie es erneut ein."
+
+#: api/serializers.py:463
msgid "New password cannot be the same as your old password."
msgstr "Neues Passwort darf nicht mit Ihrem alten Passwort identisch sein."
-#: views.py:198
+#: api/views.py:190
msgid "Password updated successfully"
msgstr "Passwort erfolgreich aktualisiert"
-#: tasks.py:58
+#: apps.py:23
+msgid "Users and Organizations"
+msgstr "Benutzer und Organisationen"
+
+#: apps.py:34
+msgid "Users"
+msgstr "Benutzer"
+
+#: apps.py:40
+msgid "Organizations"
+msgstr "Organisationen"
+
+#: apps.py:46
+msgid "Groups & Permissions"
+msgstr "Gruppen & Berechtigungen"
+
+#: apps.py:54
+msgid "Organization Owners"
+msgstr "Organisationseigentümer"
+
+#: apps.py:61
+msgid "Organization Users"
+msgstr "Organisationsbenutzer"
+
+#: apps.py:69
+msgid "Users & Organizations"
+msgstr "Benutzer & Organisationen"
+
+#: base/models.py:61
+msgid "email address"
+msgstr "E-Mail-Adresse"
+
+#: base/models.py:62
+msgid "bio"
+msgstr "Biografie"
+
+#: base/models.py:63 base/models.py:454
+msgid "URL"
+msgstr "URL"
+
+#: base/models.py:64
+msgid "company"
+msgstr "Unternehmen"
+
+#: base/models.py:65
+msgid "location"
+msgstr "Standort"
+
+#: base/models.py:67
+msgid "phone number"
+msgstr "Telefonnummer"
+
+#: base/models.py:69
+msgid "birth date"
+msgstr "Geburtsdatum"
+
+#: base/models.py:71
+msgid "notes"
+msgstr "Notizen"
+
+#: base/models.py:71
+msgid "notes for internal usage"
+msgstr "Notizen für den internen Gebrauch"
+
+#: base/models.py:78
+msgid "password updated"
+msgstr "Passwort aktualisiert"
+
+#: base/models.py:80
+msgid "expiration date"
+msgstr "Ablaufdatum"
+
+#: base/models.py:84
+msgid ""
+"If set, the account will be deactivated after this date passes and the user "
+"will no longer be able to log in."
+msgstr ""
+"Falls gesetzt, wird das Konto nach Ablauf dieses Datums deaktiviert und der "
+"Benutzer kann sich nicht mehr anmelden."
+
+#: base/models.py:206
+msgid "User with this Email address already exists."
+msgstr "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits."
+
+#: base/models.py:236
+msgid "Expiration date cannot be in the past."
+msgstr "Das Ablaufdatum darf nicht in der Vergangenheit liegen."
+
+#: base/models.py:247
+msgid ""
+"Cannot activate an expired account. Clear or extend the expiration date "
+"first."
+msgstr ""
+"Ein abgelaufenes Konto kann nicht aktiviert werden. Löschen oder verlängern "
+"Sie zuerst das Ablaufdatum."
+
+#: base/models.py:326
+msgid "Your account has been deactivated"
+msgstr "Ihr Konto wurde deaktiviert"
+
+#: base/models.py:404
+msgid "Action Required: Account Expiration Notice"
+msgstr "Aktion erforderlich: Hinweis zum Kontoablauf"
+
+#: base/models.py:442
+msgid "group"
+msgstr "Gruppe"
+
+#: base/models.py:443
+msgid "groups"
+msgstr "Gruppen"
+
+#: base/models.py:452
+msgid "description"
+msgstr "Beschreibung"
+
+#: base/models.py:453
+msgid "email"
+msgstr "E-Mail"
+
+#: base/models.py:459
+msgid "disabled"
+msgstr "deaktiviert"
+
+#: base/models.py:500
+#, python-format
+msgid ""
+"%(username)s is the owner of the organization: %(organization)s, and cannot "
+"be downgraded"
+msgstr ""
+"%(username)s ist der Eigentümer der Organisation: %(organization)s und kann "
+"nicht herabgestuft werden"
+
+#: base/models.py:528
+msgid "The selected user is not member of this organization."
+msgstr "Der ausgewählte Benutzer ist kein Mitglied dieser Organisation."
+
+#: base/models.py:555
+msgid "API keys"
+msgstr "API-Schlüssel"
+
+#: management/commands/export_users.py:23
+msgid "Exports user data to a CSV file"
+msgstr "Exportiert Benutzerdaten in eine CSV-Datei"
+
+#: management/commands/export_users.py:46
+msgid "Comma-separated list of fields to exclude from export"
+msgstr ""
+"Durch Kommas getrennte Liste von Feldern, die vom Export ausgeschlossen "
+"werden sollen"
+
+#: management/commands/export_users.py:53
+msgid ""
+"Filename for the exported CSV, defaults to \"openwisp_exported_users.csv\""
+msgstr ""
+"Dateiname für die exportierte CSV-Datei, Standardwert ist "
+"\"openwisp_exported_users.csv\""
+
+#: management/commands/export_users.py:97
+#, python-brace-format
+msgid "User data exported successfully to {filename}!"
+msgstr "Benutzerdaten erfolgreich nach {filename} exportiert!"
+
+#: management/commands/export_users.py:180
+msgid "Error calling function {func_name!r} for field '{name}': {e}"
+msgstr ""
+"Fehler beim Aufruf der Funktion {func_name!r} für das Feld '{name}': {e}"
+
+#: middleware.py:38
+msgid "Your password has expired, please update your password."
+msgstr "Ihr Passwort ist abgelaufen, bitte aktualisieren Sie Ihr Passwort."
+
+#: mixins.py:32
+#, python-brace-format
+msgid ""
+"Please ensure that the organization of this {object_label} and the "
+"organization of the related {related_object_label} match."
+msgstr ""
+"Bitte stellen Sie sicher, dass die Organisation dieses {object_label} mit "
+"der Organisation des zugehörigen {related_object_label} übereinstimmt."
+
+#: mixins.py:65
+#, python-brace-format
+msgid ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} is still related to it"
+msgid_plural ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} are still related to it"
+msgstr[0] ""
+"Die Organisation dieses {object_label} kann nicht geändert werden, da "
+"{count} {related_object_label} noch damit verknüpft ist"
+msgstr[1] ""
+"Die Organisation dieses {object_label} kann nicht geändert werden, da "
+"{count} {related_object_label} noch damit verknüpft sind"
+
+#: mixins.py:88 multitenancy.py:150
+msgid "organization"
+msgstr "Organisation"
+
+#: multitenancy.py:38
+msgid "name"
+msgstr "Name"
+
+#: password_validation.py:17
+msgid "You cannot re-use your current password. Enter a new password."
+msgstr ""
+"Sie können Ihr aktuelles Passwort nicht erneut verwenden. Geben Sie ein "
+"neues Passwort ein."
+
+#: password_validation.py:21
+msgid "Your password cannot be the same as your current password."
+msgstr "Ihr Passwort darf nicht mit Ihrem aktuellen Passwort identisch sein."
+
+#: tasks.py:62
msgid "Action Required: Password Expiry Notice"
msgstr "Aktion erforderlich: Passwortablaufbenachrichtigung"
-#: tasks.py:73
+#: tasks.py:77
msgid "Change password"
msgstr "Passwort ändern"
+
+#: templates/admin/openwisp_users/action_confirmation.html:15
+msgid "Home"
+msgstr "Startseite"
+
+#: templates/admin/openwisp_users/action_confirmation.html:18
+msgid "Modify active status"
+msgstr "Aktiven Status ändern"
+
+#: templates/admin/openwisp_users/action_confirmation.html:24
+msgid "Are you sure you want to make the selected users inactive?"
+msgstr ""
+"Sind Sie sicher, dass Sie die ausgewählten Benutzer inaktiv setzen möchten?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:26
+msgid "Are you sure you want to make the selected users active?"
+msgstr ""
+"Sind Sie sicher, dass Sie die ausgewählten Benutzer aktiv setzen möchten?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:28
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: templates/admin/openwisp_users/action_confirmation.html:31
+msgid "User"
+msgstr "Benutzer"
+
+#: templates/admin/openwisp_users/action_confirmation.html:40
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#: templates/admin/openwisp_users/action_confirmation.html:42
+msgid "No, take me back"
+msgstr "Nein, zurück"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the error below"
+msgstr "Bitte korrigieren Sie den folgenden Fehler"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the errors below"
+msgstr "Bitte korrigieren Sie die folgenden Fehler"
+
+#: templates/admin/openwisp_users/login.html:23
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Sie sind als %(username)s angemeldet, sind jedoch nicht berechtigt, auf "
+"diese Seite zuzugreifen. Möchten Sie sich mit einem anderen Konto anmelden?"
+
+#: templates/admin/openwisp_users/login.html:34
+msgid "Email, phone number or username"
+msgstr "E-Mail, Telefonnummer oder Benutzername"
+
+#: templates/admin/openwisp_users/login.html:44
+msgid "Forgot Password?"
+msgstr "Passwort vergessen?"
+
+#: templates/admin/openwisp_users/login.html:47
+msgid "Log in"
+msgstr "Anmelden"
+
+#: templates/admin/openwisp_users/user/change_form.html:9
+msgid ""
+"\n"
+" You do not have permission to edit or delete this user because they "
+"are owner of an organization.\n"
+" "
+msgstr ""
+"\n"
+" Sie haben keine Berechtigung, diesen Benutzer zu bearbeiten oder zu "
+"löschen, da er Eigentümer einer Organisation ist.\n"
+" "
+
+#: widgets.py:5
+msgid "Shared systemwide (no organization)"
+msgstr "Systemweit freigegeben (keine Organisation)"
diff --git a/openwisp_users/locale/it/LC_MESSAGES/django.po b/openwisp_users/locale/it/LC_MESSAGES/django.po
index 624db1a87..890f4a01a 100644
--- a/openwisp_users/locale/it/LC_MESSAGES/django.po
+++ b/openwisp_users/locale/it/LC_MESSAGES/django.po
@@ -5,37 +5,493 @@
#
msgid ""
msgstr ""
-"POT-Creation-Date: 2021-09-01 18:32-0500\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-03 10:10+0200\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin.py:488
+#: admin.py:152
+msgid "Email"
+msgstr "Email"
+
+#: admin.py:160
+msgid "A staff user must belong to a group, please select one."
+msgstr "Un utente dello staff deve appartenere a un gruppo, selezionane uno."
+
+#: admin.py:180 admin.py:192 admin.py:533
msgid "Account expiration"
msgstr "Scadenza dell'account"
-#: admin.py:490
+#: admin.py:183 admin.py:195
+msgid "Personal Info"
+msgstr "Informazioni personali"
+
+#: admin.py:185 admin.py:197
+msgid "Permissions"
+msgstr "Permessi"
+
+#: admin.py:253
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: admin.py:267
+msgid "Flag selected users as inactive"
+msgstr "Contrassegna gli utenti selezionati come inattivi"
+
+#: admin.py:276
+#, python-format
+msgid "Successfully made %(count)d %(model_name)s inactive."
+msgstr "%(count)d %(model_name)s disattivati con successo."
+
+#: admin.py:285
+msgid "Flag selected users as active"
+msgstr "Contrassegna gli utenti selezionati come attivi"
+
+#: admin.py:300
+#, python-format
+msgid "Successfully activated %(count)d %(model_name)s"
+msgstr "%(count)d %(model_name)s attivati con successo"
+
+#: admin.py:309
+#, python-format
+msgid "and cleared %(count)d expiration date."
+msgid_plural "and cleared %(count)d expiration dates."
+msgstr[0] "e cancellata %(count)d data di scadenza."
+msgstr[1] "e cancellate %(count)d date di scadenza."
+
+#: admin.py:416
+#, python-format
+msgid "Can't delete %(count)d organization owner: %(owners)s"
+msgid_plural "Can't delete %(count)d organization owners: %(owners)s"
+msgstr[0] ""
+"Impossibile eliminare %(count)d proprietario dell'organizzazione: %(owners)s"
+msgstr[1] ""
+"Impossibile eliminare %(count)d proprietari dell'organizzazione: %(owners)s"
+
+#: admin.py:501 admin.py:667
+#, python-format
+msgid ""
+"Can't delete %(count)d organization user because it belongs to an "
+"organization owner."
+msgid_plural ""
+"Can't delete %(count)d organization users because they belong to some "
+"organization owners."
+msgstr[0] ""
+"Impossibile eliminare %(count)d utente dell'organizzazione perché appartiene "
+"al proprietario dell'organizzazione."
+msgstr[1] ""
+"Impossibile eliminare %(count)d utenti dell'organizzazione perché "
+"appartengono ad alcuni proprietari dell'organizzazione."
+
+#: admin.py:535
msgid "Internal"
msgstr "Interno"
-#: api/serializers.py:477
+#: admin.py:625
+msgid ""
+"Can't delete this organization user because it belongs to an organization "
+"owner."
+msgstr ""
+"Impossibile eliminare questo utente dell'organizzazione perché appartiene al "
+"proprietario dell'organizzazione."
+
+#: admin.py:654
+msgid "Can't delete organization users which belong to owners."
+msgstr ""
+"Impossibile eliminare gli utenti dell'organizzazione che appartengono ai "
+"proprietari."
+
+#: admin.py:736
+msgid "Create new API key"
+msgstr "Crea nuova chiave API"
+
+#: admin.py:797 admin.py:808 base/models.py:554
+msgid "API key"
+msgstr "Chiave API"
+
+#: api/authentication.py:26
+msgid "Invalid token header. No credentials provided."
+msgstr "Intestazione del token non valida. Nessuna credenziale fornita."
+
+#: api/authentication.py:29
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr ""
+"Intestazione del token non valida. La stringa del token non deve contenere "
+"spazi."
+
+#: api/authentication.py:36
+msgid ""
+"Invalid token header. Token string should not contain invalid characters."
+msgstr ""
+"Intestazione del token non valida. La stringa del token non deve contenere "
+"caratteri non validi."
+
+#: api/authentication.py:46
+msgid "Invalid or expired token."
+msgstr "Token non valido o scaduto."
+
+#: api/permissions.py:21
+msgid "Organization not found, `organization_field` not implemented correctly."
+msgstr ""
+"Organizzazione non trovata, `organization_field` non implementato "
+"correttamente."
+
+#: api/permissions.py:49
+msgid ""
+"View's permission_classes not implemented correctly.Please use one of the "
+"child classes: IsOrganizationMember, IsOrganizationManager or "
+"IsOrganizationOwner."
+msgstr ""
+"permission_classes della view non implementate correttamente. Utilizza una "
+"delle classi figlie: IsOrganizationMember, IsOrganizationManager o "
+"IsOrganizationOwner."
+
+#: api/permissions.py:58
+msgid ""
+"User is not a member of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"L'utente non è membro dell'organizzazione a cui appartiene la risorsa "
+"richiesta."
+
+#: api/permissions.py:68
+msgid ""
+"User is not a manager of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"L'utente non è un manager dell'organizzazione a cui appartiene la risorsa "
+"richiesta."
+
+#: api/permissions.py:84
+msgid ""
+"User is not a owner of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"L'utente non è proprietario dell'organizzazione a cui appartiene la risorsa "
+"richiesta."
+
+#: api/serializers.py:50
+msgid "organization with this slug already exists."
+msgstr "esiste già un'organizzazione con questo slug."
+
+#: api/serializers.py:264
+msgid "This field cannot be blank."
+msgstr "Questo campo non può essere vuoto."
+
+#: api/serializers.py:436
+msgid "The two password fields didn’t match."
+msgstr "I due campi password non corrispondono."
+
+#: api/serializers.py:452
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La tua vecchia password non è stata inserita correttamente. Per favore, "
+"inseriscila di nuovo."
+
+#: api/serializers.py:463
msgid "New password cannot be the same as your old password."
msgstr "La nuova password non può essere uguale alla vecchia password."
-#: api/views.py:196
+#: api/views.py:190
msgid "Password updated successfully"
msgstr "Password aggiornata con successo"
-#: base/models.py:350
+#: apps.py:23
+msgid "Users and Organizations"
+msgstr "Utenti e Organizzazioni"
+
+#: apps.py:34
+msgid "Users"
+msgstr "Utenti"
+
+#: apps.py:40
+msgid "Organizations"
+msgstr "Organizzazioni"
+
+#: apps.py:46
+msgid "Groups & Permissions"
+msgstr "Gruppi e Permessi"
+
+#: apps.py:54
+msgid "Organization Owners"
+msgstr "Proprietari delle organizzazioni"
+
+#: apps.py:61
+msgid "Organization Users"
+msgstr "Utenti delle organizzazioni"
+
+#: apps.py:69
+msgid "Users & Organizations"
+msgstr "Utenti e Organizzazioni"
+
+#: base/models.py:61
+msgid "email address"
+msgstr "indirizzo email"
+
+#: base/models.py:62
+msgid "bio"
+msgstr "biografia"
+
+#: base/models.py:63 base/models.py:454
+msgid "URL"
+msgstr "URL"
+
+#: base/models.py:64
+msgid "company"
+msgstr "azienda"
+
+#: base/models.py:65
+msgid "location"
+msgstr "posizione"
+
+#: base/models.py:67
+msgid "phone number"
+msgstr "numero di telefono"
+
+#: base/models.py:69
+msgid "birth date"
+msgstr "data di nascita"
+
+#: base/models.py:71
+msgid "notes"
+msgstr "note"
+
+#: base/models.py:71
+msgid "notes for internal usage"
+msgstr "note per uso interno"
+
+#: base/models.py:78
+msgid "password updated"
+msgstr "password aggiornata"
+
+#: base/models.py:80
+msgid "expiration date"
+msgstr "data di scadenza"
+
+#: base/models.py:84
+msgid ""
+"If set, the account will be deactivated after this date passes and the user "
+"will no longer be able to log in."
+msgstr ""
+"Se impostata, l'account verrà disattivato dopo questa data e l'utente non "
+"potrà più accedere."
+
+#: base/models.py:206
+msgid "User with this Email address already exists."
+msgstr "Un utente con questo indirizzo email esiste già."
+
+#: base/models.py:236
+msgid "Expiration date cannot be in the past."
+msgstr "La data di scadenza non può essere nel passato."
+
+#: base/models.py:247
+msgid ""
+"Cannot activate an expired account. Clear or extend the expiration date "
+"first."
+msgstr ""
+"Impossibile attivare un account scaduto. Cancella o estendi prima la data di "
+"scadenza."
+
+#: base/models.py:326
+msgid "Your account has been deactivated"
+msgstr "Il tuo account è stato disattivato"
+
+#: base/models.py:404
msgid "Action Required: Account Expiration Notice"
msgstr "Azione richiesta: Avviso di scadenza dell'account"
+#: base/models.py:442
+msgid "group"
+msgstr "gruppo"
+
+#: base/models.py:443
+msgid "groups"
+msgstr "gruppi"
+
+#: base/models.py:452
+msgid "description"
+msgstr "descrizione"
+
+#: base/models.py:453
+msgid "email"
+msgstr "email"
+
+#: base/models.py:459
+msgid "disabled"
+msgstr "disattivato"
+
+#: base/models.py:500
+#, python-format
+msgid ""
+"%(username)s is the owner of the organization: %(organization)s, and cannot "
+"be downgraded"
+msgstr ""
+"%(username)s è il proprietario dell'organizzazione: %(organization)s, e non "
+"può essere declassato"
+
+#: base/models.py:528
+msgid "The selected user is not member of this organization."
+msgstr "L'utente selezionato non è membro di questa organizzazione."
+
+#: base/models.py:555
+msgid "API keys"
+msgstr "Chiavi API"
+
+#: management/commands/export_users.py:23
+msgid "Exports user data to a CSV file"
+msgstr "Esporta i dati degli utenti in un file CSV"
+
+#: management/commands/export_users.py:46
+msgid "Comma-separated list of fields to exclude from export"
+msgstr "Elenco di campi separati da virgola da escludere dall'esportazione"
+
+#: management/commands/export_users.py:53
+msgid ""
+"Filename for the exported CSV, defaults to \"openwisp_exported_users.csv\""
+msgstr ""
+"Nome del file CSV esportato, il valore predefinito è "
+"\"openwisp_exported_users.csv\""
+
+#: management/commands/export_users.py:97
+#, python-brace-format
+msgid "User data exported successfully to {filename}!"
+msgstr "Dati utente esportati con successo in {filename}!"
+
+#: management/commands/export_users.py:180
+msgid "Error calling function {func_name!r} for field '{name}': {e}"
+msgstr ""
+"Errore durante la chiamata della funzione {func_name!r} per il campo "
+"'{name}': {e}"
+
+#: middleware.py:38
+msgid "Your password has expired, please update your password."
+msgstr "La tua password è scaduta, aggiornala."
+
+#: mixins.py:32
+#, python-brace-format
+msgid ""
+"Please ensure that the organization of this {object_label} and the "
+"organization of the related {related_object_label} match."
+msgstr ""
+"Assicurati che l'organizzazione di questo {object_label} corrisponda "
+"all'organizzazione del relativo {related_object_label}."
+
+#: mixins.py:65
+#, python-brace-format
+msgid ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} is still related to it"
+msgid_plural ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} are still related to it"
+msgstr[0] ""
+"L'organizzazione di questo {object_label} non può essere modificata perché "
+"{count} {related_object_label} è ancora collegato ad essa"
+msgstr[1] ""
+"L'organizzazione di questo {object_label} non può essere modificata perché "
+"{count} {related_object_label} sono ancora collegati ad essa"
+
+#: mixins.py:88 multitenancy.py:150
+msgid "organization"
+msgstr "organizzazione"
+
+#: multitenancy.py:38
+msgid "name"
+msgstr "nome"
+
+#: password_validation.py:17
+msgid "You cannot re-use your current password. Enter a new password."
+msgstr ""
+"Non puoi riutilizzare la tua password attuale. Inserisci una nuova password."
+
+#: password_validation.py:21
+msgid "Your password cannot be the same as your current password."
+msgstr "La tua password non può essere uguale alla password attuale."
+
#: tasks.py:62
msgid "Action Required: Password Expiry Notice"
msgstr "Azione richiesta: Avviso di scadenza della password"
-#: tasks.py:79
+#: tasks.py:77
msgid "Change password"
msgstr "Cambia password"
+
+#: templates/admin/openwisp_users/action_confirmation.html:15
+msgid "Home"
+msgstr "Home"
+
+#: templates/admin/openwisp_users/action_confirmation.html:18
+msgid "Modify active status"
+msgstr "Modifica stato attivo"
+
+#: templates/admin/openwisp_users/action_confirmation.html:24
+msgid "Are you sure you want to make the selected users inactive?"
+msgstr "Sei sicuro di voler rendere inattivi gli utenti selezionati?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:26
+msgid "Are you sure you want to make the selected users active?"
+msgstr "Sei sicuro di voler rendere attivi gli utenti selezionati?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:28
+msgid "Summary"
+msgstr "Riepilogo"
+
+#: templates/admin/openwisp_users/action_confirmation.html:31
+msgid "User"
+msgstr "Utente"
+
+#: templates/admin/openwisp_users/action_confirmation.html:40
+msgid "Confirm"
+msgstr "Conferma"
+
+#: templates/admin/openwisp_users/action_confirmation.html:42
+msgid "No, take me back"
+msgstr "No, torna indietro"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the error below"
+msgstr "Correggi l'errore sottostante"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the errors below"
+msgstr "Correggi gli errori sottostanti"
+
+#: templates/admin/openwisp_users/login.html:23
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Sei autenticato come %(username)s, ma non sei autorizzato ad accedere a "
+"questa pagina. Vuoi accedere con un altro account?"
+
+#: templates/admin/openwisp_users/login.html:34
+msgid "Email, phone number or username"
+msgstr "Email, numero di telefono o nome utente"
+
+#: templates/admin/openwisp_users/login.html:44
+msgid "Forgot Password?"
+msgstr "Password dimenticata?"
+
+#: templates/admin/openwisp_users/login.html:47
+msgid "Log in"
+msgstr "Accedi"
+
+#: templates/admin/openwisp_users/user/change_form.html:9
+msgid ""
+"\n"
+" You do not have permission to edit or delete this user because they "
+"are owner of an organization.\n"
+" "
+msgstr ""
+"\n"
+" Non hai il permesso di modificare o eliminare questo utente perché è "
+"proprietario di un'organizzazione.\n"
+" "
+
+#: widgets.py:5
+msgid "Shared systemwide (no organization)"
+msgstr "Condiviso a livello di sistema (nessuna organizzazione)"
diff --git a/openwisp_users/locale/ru/LC_MESSAGES/django.po b/openwisp_users/locale/ru/LC_MESSAGES/django.po
index 2a1e3298d..b16180c6c 100644
--- a/openwisp_users/locale/ru/LC_MESSAGES/django.po
+++ b/openwisp_users/locale/ru/LC_MESSAGES/django.po
@@ -5,25 +5,492 @@
#
msgid ""
msgstr ""
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-03 10:10+0200\n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 "
-"&& (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
-#: serializers.py:422
+#: admin.py:152
+msgid "Email"
+msgstr "Email"
+
+#: admin.py:160
+msgid "A staff user must belong to a group, please select one."
+msgstr "Сотрудник должен принадлежать к группе, пожалуйста, выберите одну."
+
+#: admin.py:180 admin.py:192 admin.py:533
+msgid "Account expiration"
+msgstr "Срок действия учётной записи"
+
+#: admin.py:183 admin.py:195
+msgid "Personal Info"
+msgstr "Личная информация"
+
+#: admin.py:185 admin.py:197
+msgid "Permissions"
+msgstr "Права доступа"
+
+#: admin.py:253
+msgid "Are you sure?"
+msgstr "Вы уверены?"
+
+#: admin.py:267
+msgid "Flag selected users as inactive"
+msgstr "Отметить выбранных пользователей как неактивных"
+
+#: admin.py:276
+#, python-format
+msgid "Successfully made %(count)d %(model_name)s inactive."
+msgstr "Успешно деактивировано %(count)d %(model_name)s."
+
+#: admin.py:285
+msgid "Flag selected users as active"
+msgstr "Отметить выбранных пользователей как активных"
+
+#: admin.py:300
+#, python-format
+msgid "Successfully activated %(count)d %(model_name)s"
+msgstr "Успешно активировано %(count)d %(model_name)s"
+
+#: admin.py:309
+#, python-format
+msgid "and cleared %(count)d expiration date."
+msgid_plural "and cleared %(count)d expiration dates."
+msgstr[0] "и очищена %(count)d дата истечения срока действия."
+msgstr[1] "и очищены %(count)d даты истечения срока действия."
+msgstr[2] "и очищено %(count)d дат истечения срока действия."
+
+#: admin.py:416
+#, python-format
+msgid "Can't delete %(count)d organization owner: %(owners)s"
+msgid_plural "Can't delete %(count)d organization owners: %(owners)s"
+msgstr[0] "Невозможно удалить %(count)d владельца организации: %(owners)s"
+msgstr[1] "Невозможно удалить %(count)d владельцев организации: %(owners)s"
+msgstr[2] "Невозможно удалить %(count)d владельцев организации: %(owners)s"
+
+#: admin.py:501 admin.py:667
+#, python-format
+msgid ""
+"Can't delete %(count)d organization user because it belongs to an "
+"organization owner."
+msgid_plural ""
+"Can't delete %(count)d organization users because they belong to some "
+"organization owners."
+msgstr[0] ""
+"Невозможно удалить %(count)d пользователя организации, так как он "
+"принадлежит владельцу организации."
+msgstr[1] ""
+"Невозможно удалить %(count)d пользователей организации, так как они "
+"принадлежат некоторым владельцам организации."
+msgstr[2] ""
+"Невозможно удалить %(count)d пользователей организации, так как они "
+"принадлежат некоторым владельцам организации."
+
+#: admin.py:535
+msgid "Internal"
+msgstr "Внутреннее"
+
+#: admin.py:625
+msgid ""
+"Can't delete this organization user because it belongs to an organization "
+"owner."
+msgstr ""
+"Невозможно удалить этого пользователя организации, поскольку он принадлежит "
+"владельцу организации."
+
+#: admin.py:654
+msgid "Can't delete organization users which belong to owners."
+msgstr ""
+"Невозможно удалить пользователей организации, принадлежащих владельцам."
+
+#: admin.py:736
+msgid "Create new API key"
+msgstr "Создать новый API-ключ"
+
+#: admin.py:797 admin.py:808 base/models.py:554
+msgid "API key"
+msgstr "API-ключ"
+
+#: api/authentication.py:26
+msgid "Invalid token header. No credentials provided."
+msgstr "Неверный заголовок токена. Учётные данные не предоставлены."
+
+#: api/authentication.py:29
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr "Неверный заголовок токена. Строка токена не должна содержать пробелов."
+
+#: api/authentication.py:36
+msgid ""
+"Invalid token header. Token string should not contain invalid characters."
+msgstr ""
+"Неверный заголовок токена. Строка токена не должна содержать недопустимых "
+"символов."
+
+#: api/authentication.py:46
+msgid "Invalid or expired token."
+msgstr "Недействительный или истёкший токен."
+
+#: api/permissions.py:21
+msgid "Organization not found, `organization_field` not implemented correctly."
+msgstr "Организация не найдена, `organization_field` реализовано некорректно."
+
+#: api/permissions.py:49
+msgid ""
+"View's permission_classes not implemented correctly.Please use one of the "
+"child classes: IsOrganizationMember, IsOrganizationManager or "
+"IsOrganizationOwner."
+msgstr ""
+"Свойство permission_classes у представления реализовано некорректно. "
+"Используйте один из дочерних классов: IsOrganizationMember, "
+"IsOrganizationManager или IsOrganizationOwner."
+
+#: api/permissions.py:58
+msgid ""
+"User is not a member of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Пользователь не является участником организации, которой принадлежит "
+"запрашиваемый ресурс."
+
+#: api/permissions.py:68
+msgid ""
+"User is not a manager of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Пользователь не является менеджером организации, которой принадлежит "
+"запрашиваемый ресурс."
+
+#: api/permissions.py:84
+msgid ""
+"User is not a owner of the organization to which the requested resource "
+"belongs."
+msgstr ""
+"Пользователь не является владельцем организации, которой принадлежит "
+"запрашиваемый ресурс."
+
+#: api/serializers.py:50
+msgid "organization with this slug already exists."
+msgstr "организация с таким slug уже существует."
+
+#: api/serializers.py:264
+msgid "This field cannot be blank."
+msgstr "Это поле не может быть пустым."
+
+#: api/serializers.py:436
+msgid "The two password fields didn’t match."
+msgstr "Два поля пароля не совпадают."
+
+#: api/serializers.py:452
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ваш старый пароль введён неверно. Пожалуйста, введите его снова."
+
+#: api/serializers.py:463
msgid "New password cannot be the same as your old password."
msgstr "Новый пароль не может совпадать с вашим старым паролем."
-#: views.py:198
+#: api/views.py:190
msgid "Password updated successfully"
msgstr "Пароль успешно обновлен"
-#: tasks.py:58
+#: apps.py:23
+msgid "Users and Organizations"
+msgstr "Пользователи и организации"
+
+#: apps.py:34
+msgid "Users"
+msgstr "Пользователи"
+
+#: apps.py:40
+msgid "Organizations"
+msgstr "Организации"
+
+#: apps.py:46
+msgid "Groups & Permissions"
+msgstr "Группы и права доступа"
+
+#: apps.py:54
+msgid "Organization Owners"
+msgstr "Владельцы организаций"
+
+#: apps.py:61
+msgid "Organization Users"
+msgstr "Пользователи организаций"
+
+#: apps.py:69
+msgid "Users & Organizations"
+msgstr "Пользователи и организации"
+
+#: base/models.py:61
+msgid "email address"
+msgstr "адрес электронной почты"
+
+#: base/models.py:62
+msgid "bio"
+msgstr "биография"
+
+#: base/models.py:63 base/models.py:454
+msgid "URL"
+msgstr "URL"
+
+#: base/models.py:64
+msgid "company"
+msgstr "компания"
+
+#: base/models.py:65
+msgid "location"
+msgstr "местоположение"
+
+#: base/models.py:67
+msgid "phone number"
+msgstr "номер телефона"
+
+#: base/models.py:69
+msgid "birth date"
+msgstr "дата рождения"
+
+#: base/models.py:71
+msgid "notes"
+msgstr "заметки"
+
+#: base/models.py:71
+msgid "notes for internal usage"
+msgstr "заметки для внутреннего использования"
+
+#: base/models.py:78
+msgid "password updated"
+msgstr "пароль обновлён"
+
+#: base/models.py:80
+msgid "expiration date"
+msgstr "дата истечения срока действия"
+
+#: base/models.py:84
+msgid ""
+"If set, the account will be deactivated after this date passes and the user "
+"will no longer be able to log in."
+msgstr ""
+"Если указано, учётная запись будет деактивирована после этой даты, и "
+"пользователь больше не сможет войти в систему."
+
+#: base/models.py:206
+msgid "User with this Email address already exists."
+msgstr "Пользователь с таким адресом электронной почты уже существует."
+
+#: base/models.py:236
+msgid "Expiration date cannot be in the past."
+msgstr "Дата истечения срока действия не может быть в прошлом."
+
+#: base/models.py:247
+msgid ""
+"Cannot activate an expired account. Clear or extend the expiration date "
+"first."
+msgstr ""
+"Невозможно активировать истёкшую учётную запись. Сначала очистите или "
+"продлите дату истечения срока действия."
+
+#: base/models.py:326
+msgid "Your account has been deactivated"
+msgstr "Ваша учётная запись деактивирована"
+
+#: base/models.py:404
+msgid "Action Required: Account Expiration Notice"
+msgstr ""
+"Требуется действие: Уведомление об истечении срока действия учётной записи"
+
+#: base/models.py:442
+msgid "group"
+msgstr "группа"
+
+#: base/models.py:443
+msgid "groups"
+msgstr "группы"
+
+#: base/models.py:452
+msgid "description"
+msgstr "описание"
+
+#: base/models.py:453
+msgid "email"
+msgstr "email"
+
+#: base/models.py:459
+msgid "disabled"
+msgstr "отключено"
+
+#: base/models.py:500
+#, python-format
+msgid ""
+"%(username)s is the owner of the organization: %(organization)s, and cannot "
+"be downgraded"
+msgstr ""
+"%(username)s является владельцем организации: %(organization)s, и не может "
+"быть понижен в правах"
+
+#: base/models.py:528
+msgid "The selected user is not member of this organization."
+msgstr "Выбранный пользователь не является участником этой организации."
+
+#: base/models.py:555
+msgid "API keys"
+msgstr "API-ключи"
+
+#: management/commands/export_users.py:23
+msgid "Exports user data to a CSV file"
+msgstr "Экспортирует данные пользователей в файл CSV"
+
+#: management/commands/export_users.py:46
+msgid "Comma-separated list of fields to exclude from export"
+msgstr "Список полей, разделённых запятыми, для исключения из экспорта"
+
+#: management/commands/export_users.py:53
+msgid ""
+"Filename for the exported CSV, defaults to \"openwisp_exported_users.csv\""
+msgstr ""
+"Имя файла для экспортированного CSV, по умолчанию "
+"\"openwisp_exported_users.csv\""
+
+#: management/commands/export_users.py:97
+#, python-brace-format
+msgid "User data exported successfully to {filename}!"
+msgstr "Данные пользователей успешно экспортированы в {filename}!"
+
+#: management/commands/export_users.py:180
+msgid "Error calling function {func_name!r} for field '{name}': {e}"
+msgstr "Ошибка при вызове функции {func_name!r} для поля '{name}': {e}"
+
+#: middleware.py:38
+msgid "Your password has expired, please update your password."
+msgstr "Срок действия вашего пароля истёк, пожалуйста, обновите пароль."
+
+#: mixins.py:32
+#, python-brace-format
+msgid ""
+"Please ensure that the organization of this {object_label} and the "
+"organization of the related {related_object_label} match."
+msgstr ""
+"Убедитесь, что организация этого {object_label} совпадает с организацией "
+"связанного {related_object_label}."
+
+#: mixins.py:65
+#, python-brace-format
+msgid ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} is still related to it"
+msgid_plural ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} are still related to it"
+msgstr[0] ""
+"Организацию этого {object_label} нельзя изменить, так как {count} "
+"{related_object_label} всё ещё связан с ним"
+msgstr[1] ""
+"Организацию этого {object_label} нельзя изменить, так как {count} "
+"{related_object_label} всё ещё связаны с ним"
+msgstr[2] ""
+"Организацию этого {object_label} нельзя изменить, так как {count} "
+"{related_object_label} всё ещё связаны с ним"
+
+#: mixins.py:88 multitenancy.py:150
+msgid "organization"
+msgstr "организация"
+
+#: multitenancy.py:38
+msgid "name"
+msgstr "имя"
+
+#: password_validation.py:17
+msgid "You cannot re-use your current password. Enter a new password."
+msgstr ""
+"Вы не можете повторно использовать текущий пароль. Введите новый пароль."
+
+#: password_validation.py:21
+msgid "Your password cannot be the same as your current password."
+msgstr "Ваш пароль не должен совпадать с текущим паролем."
+
+#: tasks.py:62
msgid "Action Required: Password Expiry Notice"
msgstr "Требуется действие: Уведомление о сроке действия пароля"
-#: tasks.py:73
+#: tasks.py:77
msgid "Change password"
msgstr "Изменить пароль"
+
+#: templates/admin/openwisp_users/action_confirmation.html:15
+msgid "Home"
+msgstr "Главная"
+
+#: templates/admin/openwisp_users/action_confirmation.html:18
+msgid "Modify active status"
+msgstr "Изменить статус активности"
+
+#: templates/admin/openwisp_users/action_confirmation.html:24
+msgid "Are you sure you want to make the selected users inactive?"
+msgstr "Вы уверены, что хотите сделать выбранных пользователей неактивными?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:26
+msgid "Are you sure you want to make the selected users active?"
+msgstr "Вы уверены, что хотите сделать выбранных пользователей активными?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:28
+msgid "Summary"
+msgstr "Сводка"
+
+#: templates/admin/openwisp_users/action_confirmation.html:31
+msgid "User"
+msgstr "Пользователь"
+
+#: templates/admin/openwisp_users/action_confirmation.html:40
+msgid "Confirm"
+msgstr "Подтвердить"
+
+#: templates/admin/openwisp_users/action_confirmation.html:42
+msgid "No, take me back"
+msgstr "Нет, вернуться назад"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the error below"
+msgstr "Пожалуйста, исправьте указанную ниже ошибку"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the errors below"
+msgstr "Пожалуйста, исправьте указанные ниже ошибки"
+
+#: templates/admin/openwisp_users/login.html:23
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Вы вошли как %(username)s, но не имеете доступа к этой странице. Хотите "
+"войти под другой учётной записью?"
+
+#: templates/admin/openwisp_users/login.html:34
+msgid "Email, phone number or username"
+msgstr "Email, номер телефона или имя пользователя"
+
+#: templates/admin/openwisp_users/login.html:44
+msgid "Forgot Password?"
+msgstr "Забыли пароль?"
+
+#: templates/admin/openwisp_users/login.html:47
+msgid "Log in"
+msgstr "Войти"
+
+#: templates/admin/openwisp_users/user/change_form.html:9
+msgid ""
+"\n"
+" You do not have permission to edit or delete this user because they "
+"are owner of an organization.\n"
+" "
+msgstr ""
+"\n"
+" У вас нет разрешения на редактирование или удаление этого "
+"пользователя, так как он является владельцем организации.\n"
+" "
+
+#: widgets.py:5
+msgid "Shared systemwide (no organization)"
+msgstr "Общий для всей системы (без организации)"
diff --git a/openwisp_users/locale/sl/LC_MESSAGES/django.po b/openwisp_users/locale/sl/LC_MESSAGES/django.po
index 1fd8f90a8..a2ccd4ee3 100644
--- a/openwisp_users/locale/sl/LC_MESSAGES/django.po
+++ b/openwisp_users/locale/sl/LC_MESSAGES/django.po
@@ -5,25 +5,475 @@
#
msgid ""
msgstr ""
-"POT-Creation-Date: 2021-09-01 18:32-0500\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-03 10:10+0200\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: serializers.py:422
+#: admin.py:152
+msgid "Email"
+msgstr "E-pošta"
+
+#: admin.py:160
+msgid "A staff user must belong to a group, please select one."
+msgstr "Član osebja mora pripadati skupini, izberite eno."
+
+#: admin.py:180 admin.py:192 admin.py:533
+msgid "Account expiration"
+msgstr "Potek veljavnosti računa"
+
+#: admin.py:183 admin.py:195
+msgid "Personal Info"
+msgstr "Osebni podatki"
+
+#: admin.py:185 admin.py:197
+msgid "Permissions"
+msgstr "Dovoljenja"
+
+#: admin.py:253
+msgid "Are you sure?"
+msgstr "Ali ste prepričani?"
+
+#: admin.py:267
+msgid "Flag selected users as inactive"
+msgstr "Označi izbrane uporabnike kot neaktivne"
+
+#: admin.py:276
+#, python-format
+msgid "Successfully made %(count)d %(model_name)s inactive."
+msgstr "Uspešno deaktiviranih %(count)d %(model_name)s."
+
+#: admin.py:285
+msgid "Flag selected users as active"
+msgstr "Označi izbrane uporabnike kot aktivne"
+
+#: admin.py:300
+#, python-format
+msgid "Successfully activated %(count)d %(model_name)s"
+msgstr "Uspešno aktiviranih %(count)d %(model_name)s"
+
+#: admin.py:309
+#, python-format
+msgid "and cleared %(count)d expiration date."
+msgid_plural "and cleared %(count)d expiration dates."
+msgstr[0] "in počiščen %(count)d datum poteka."
+msgstr[1] "in počiščenih %(count)d datumov poteka."
+
+#: admin.py:416
+#, python-format
+msgid "Can't delete %(count)d organization owner: %(owners)s"
+msgid_plural "Can't delete %(count)d organization owners: %(owners)s"
+msgstr[0] "Ni mogoče izbrisati %(count)d lastnika organizacije: %(owners)s"
+msgstr[1] "Ni mogoče izbrisati %(count)d lastnikov organizacije: %(owners)s"
+
+#: admin.py:501 admin.py:667
+#, python-format
+msgid ""
+"Can't delete %(count)d organization user because it belongs to an "
+"organization owner."
+msgid_plural ""
+"Can't delete %(count)d organization users because they belong to some "
+"organization owners."
+msgstr[0] ""
+"Ni mogoče izbrisati %(count)d uporabnika organizacije, ker pripada lastniku "
+"organizacije."
+msgstr[1] ""
+"Ni mogoče izbrisati %(count)d uporabnikov organizacije, ker pripadajo "
+"nekaterim lastnikom organizacije."
+
+#: admin.py:535
+msgid "Internal"
+msgstr "Interno"
+
+#: admin.py:625
+msgid ""
+"Can't delete this organization user because it belongs to an organization "
+"owner."
+msgstr ""
+"Tega uporabnika organizacije ni mogoče izbrisati, ker pripada lastniku "
+"organizacije."
+
+#: admin.py:654
+msgid "Can't delete organization users which belong to owners."
+msgstr "Uporabnikov organizacije, ki pripadajo lastnikom, ni mogoče izbrisati."
+
+#: admin.py:736
+msgid "Create new API key"
+msgstr "Ustvari nov API ključ"
+
+#: admin.py:797 admin.py:808 base/models.py:554
+msgid "API key"
+msgstr "API ključ"
+
+#: api/authentication.py:26
+msgid "Invalid token header. No credentials provided."
+msgstr "Neveljavna glava žetona. Poverilnice niso bile posredovane."
+
+#: api/authentication.py:29
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr "Neveljavna glava žetona. Niz žetona ne sme vsebovati presledkov."
+
+#: api/authentication.py:36
+msgid ""
+"Invalid token header. Token string should not contain invalid characters."
+msgstr ""
+"Neveljavna glava žetona. Niz žetona ne sme vsebovati neveljavnih znakov."
+
+#: api/authentication.py:46
+msgid "Invalid or expired token."
+msgstr "Neveljaven ali potekel žeton."
+
+#: api/permissions.py:21
+msgid "Organization not found, `organization_field` not implemented correctly."
+msgstr ""
+"Organizacije ni mogoče najti, `organization_field` ni pravilno implementiran."
+
+#: api/permissions.py:49
+msgid ""
+"View's permission_classes not implemented correctly.Please use one of the "
+"child classes: IsOrganizationMember, IsOrganizationManager or "
+"IsOrganizationOwner."
+msgstr ""
+"permission_classes pogleda niso pravilno implementirane. Uporabite enega od "
+"podrazredov: IsOrganizationMember, IsOrganizationManager ali "
+"IsOrganizationOwner."
+
+#: api/permissions.py:58
+msgid ""
+"User is not a member of the organization to which the requested resource "
+"belongs."
+msgstr "Uporabnik ni član organizacije, ki ji pripada zahtevani vir."
+
+#: api/permissions.py:68
+msgid ""
+"User is not a manager of the organization to which the requested resource "
+"belongs."
+msgstr "Uporabnik ni upravitelj organizacije, ki ji pripada zahtevani vir."
+
+#: api/permissions.py:84
+msgid ""
+"User is not a owner of the organization to which the requested resource "
+"belongs."
+msgstr "Uporabnik ni lastnik organizacije, ki ji pripada zahtevani vir."
+
+#: api/serializers.py:50
+msgid "organization with this slug already exists."
+msgstr "Organizacija s tem nazivom (slug) že obstaja."
+
+#: api/serializers.py:264
+msgid "This field cannot be blank."
+msgstr "To polje ne sme biti prazno."
+
+#: api/serializers.py:436
+msgid "The two password fields didn’t match."
+msgstr "Polji z geslom se ne ujemata."
+
+#: api/serializers.py:452
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaše staro geslo je bilo vneseno napačno. Prosimo, vnesite ga znova."
+
+#: api/serializers.py:463
msgid "New password cannot be the same as your old password."
msgstr "Novo geslo ne more biti enako staremu."
-#: views.py:198
+#: api/views.py:190
msgid "Password updated successfully"
msgstr "Geslo je bilo uspešno posodobljeno"
-#: tasks.py:58
+#: apps.py:23
+msgid "Users and Organizations"
+msgstr "Uporabniki in organizacije"
+
+#: apps.py:34
+msgid "Users"
+msgstr "Uporabniki"
+
+#: apps.py:40
+msgid "Organizations"
+msgstr "Organizacije"
+
+#: apps.py:46
+msgid "Groups & Permissions"
+msgstr "Skupine in dovoljenja"
+
+#: apps.py:54
+msgid "Organization Owners"
+msgstr "Lastniki organizacij"
+
+#: apps.py:61
+msgid "Organization Users"
+msgstr "Uporabniki organizacij"
+
+#: apps.py:69
+msgid "Users & Organizations"
+msgstr "Uporabniki in organizacije"
+
+#: base/models.py:61
+msgid "email address"
+msgstr "e-poštni naslov"
+
+#: base/models.py:62
+msgid "bio"
+msgstr "biografija"
+
+#: base/models.py:63 base/models.py:454
+msgid "URL"
+msgstr "URL"
+
+#: base/models.py:64
+msgid "company"
+msgstr "podjetje"
+
+#: base/models.py:65
+msgid "location"
+msgstr "lokacija"
+
+#: base/models.py:67
+msgid "phone number"
+msgstr "telefonska številka"
+
+#: base/models.py:69
+msgid "birth date"
+msgstr "datum rojstva"
+
+#: base/models.py:71
+msgid "notes"
+msgstr "opombe"
+
+#: base/models.py:71
+msgid "notes for internal usage"
+msgstr "opombe za interno uporabo"
+
+#: base/models.py:78
+msgid "password updated"
+msgstr "geslo posodobljeno"
+
+#: base/models.py:80
+msgid "expiration date"
+msgstr "datum poteka"
+
+#: base/models.py:84
+msgid ""
+"If set, the account will be deactivated after this date passes and the user "
+"will no longer be able to log in."
+msgstr ""
+"Če je nastavljeno, bo račun po tem datumu onemogočen in uporabnik se ne bo "
+"mogel več prijaviti."
+
+#: base/models.py:206
+msgid "User with this Email address already exists."
+msgstr "Uporabnik s tem e-poštnim naslovom že obstaja."
+
+#: base/models.py:236
+msgid "Expiration date cannot be in the past."
+msgstr "Datum poteka ne sme biti v preteklosti."
+
+#: base/models.py:247
+msgid ""
+"Cannot activate an expired account. Clear or extend the expiration date "
+"first."
+msgstr ""
+"Poteklega računa ni mogoče aktivirati. Najprej počistite ali podaljšajte "
+"datum poteka."
+
+#: base/models.py:326
+msgid "Your account has been deactivated"
+msgstr "Vaš račun je bil onemogočen"
+
+#: base/models.py:404
+msgid "Action Required: Account Expiration Notice"
+msgstr "Potrebno dejanje: Obvestilo o poteku računa"
+
+#: base/models.py:442
+msgid "group"
+msgstr "skupina"
+
+#: base/models.py:443
+msgid "groups"
+msgstr "skupine"
+
+#: base/models.py:452
+msgid "description"
+msgstr "opis"
+
+#: base/models.py:453
+msgid "email"
+msgstr "e-pošta"
+
+#: base/models.py:459
+msgid "disabled"
+msgstr "onemogočeno"
+
+#: base/models.py:500
+#, python-format
+msgid ""
+"%(username)s is the owner of the organization: %(organization)s, and cannot "
+"be downgraded"
+msgstr ""
+"%(username)s je lastnik organizacije: %(organization)s in ga ni mogoče "
+"znižati"
+
+#: base/models.py:528
+msgid "The selected user is not member of this organization."
+msgstr "Izbrani uporabnik ni član te organizacije."
+
+#: base/models.py:555
+msgid "API keys"
+msgstr "API ključi"
+
+#: management/commands/export_users.py:23
+msgid "Exports user data to a CSV file"
+msgstr "Izvozi podatke uporabnikov v datoteko CSV"
+
+#: management/commands/export_users.py:46
+msgid "Comma-separated list of fields to exclude from export"
+msgstr "Z vejico ločen seznam polj, ki jih želite izključiti iz izvoza"
+
+#: management/commands/export_users.py:53
+msgid ""
+"Filename for the exported CSV, defaults to \"openwisp_exported_users.csv\""
+msgstr ""
+"Ime datoteke za izvoženo datoteko CSV, privzeto "
+"\"openwisp_exported_users.csv\""
+
+#: management/commands/export_users.py:97
+#, python-brace-format
+msgid "User data exported successfully to {filename}!"
+msgstr "Podatki uporabnikov so bili uspešno izvoženi v {filename}!"
+
+#: management/commands/export_users.py:180
+msgid "Error calling function {func_name!r} for field '{name}': {e}"
+msgstr "Napaka pri klicu funkcije {func_name!r} za polje '{name}': {e}"
+
+#: middleware.py:38
+msgid "Your password has expired, please update your password."
+msgstr "Vaše geslo je poteklo, prosimo, posodobite ga."
+
+#: mixins.py:32
+#, python-brace-format
+msgid ""
+"Please ensure that the organization of this {object_label} and the "
+"organization of the related {related_object_label} match."
+msgstr ""
+"Prepričajte se, da se organizacija tega {object_label} ujema z organizacijo "
+"povezanega {related_object_label}."
+
+#: mixins.py:65
+#, python-brace-format
+msgid ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} is still related to it"
+msgid_plural ""
+"The organization of this {object_label} cannot be changed because {count} "
+"{related_object_label} are still related to it"
+msgstr[0] ""
+"Organizacije tega {object_label} ni mogoče spremeniti, ker je {count} "
+"{related_object_label} še vedno povezan z njim"
+msgstr[1] ""
+"Organizacije tega {object_label} ni mogoče spremeniti, ker so {count} "
+"{related_object_label} še vedno povezani z njim"
+
+#: mixins.py:88 multitenancy.py:150
+msgid "organization"
+msgstr "organizacija"
+
+#: multitenancy.py:38
+msgid "name"
+msgstr "ime"
+
+#: password_validation.py:17
+msgid "You cannot re-use your current password. Enter a new password."
+msgstr "Trenutnega gesla ne morete ponovno uporabiti. Vnesite novo geslo."
+
+#: password_validation.py:21
+msgid "Your password cannot be the same as your current password."
+msgstr "Vaše geslo ne sme biti enako trenutnemu geslu."
+
+#: tasks.py:62
msgid "Action Required: Password Expiry Notice"
msgstr "Potrebno dejanje: Obvestilo o poteku gesla"
-#: tasks.py:73
+#: tasks.py:77
msgid "Change password"
msgstr "Spremeni geslo"
+
+#: templates/admin/openwisp_users/action_confirmation.html:15
+msgid "Home"
+msgstr "Domov"
+
+#: templates/admin/openwisp_users/action_confirmation.html:18
+msgid "Modify active status"
+msgstr "Spremeni status aktivnosti"
+
+#: templates/admin/openwisp_users/action_confirmation.html:24
+msgid "Are you sure you want to make the selected users inactive?"
+msgstr ""
+"Ali ste prepričani, da želite izbrane uporabnike označiti kot neaktivne?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:26
+msgid "Are you sure you want to make the selected users active?"
+msgstr "Ali ste prepričani, da želite izbrane uporabnike označiti kot aktivne?"
+
+#: templates/admin/openwisp_users/action_confirmation.html:28
+msgid "Summary"
+msgstr "Povzetek"
+
+#: templates/admin/openwisp_users/action_confirmation.html:31
+msgid "User"
+msgstr "Uporabnik"
+
+#: templates/admin/openwisp_users/action_confirmation.html:40
+msgid "Confirm"
+msgstr "Potrdi"
+
+#: templates/admin/openwisp_users/action_confirmation.html:42
+msgid "No, take me back"
+msgstr "Ne, pelji me nazaj"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the error below"
+msgstr "Prosimo, popravite spodnjo napako"
+
+#: templates/admin/openwisp_users/login.html:7
+msgid "Please correct the errors below"
+msgstr "Prosimo, popravite spodnje napake"
+
+#: templates/admin/openwisp_users/login.html:23
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Prijavljeni ste kot %(username)s, vendar nimate dovoljenja za dostop do te "
+"strani. Ali se želite prijaviti z drugim računom?"
+
+#: templates/admin/openwisp_users/login.html:34
+msgid "Email, phone number or username"
+msgstr "E-pošta, telefonska številka ali uporabniško ime"
+
+#: templates/admin/openwisp_users/login.html:44
+msgid "Forgot Password?"
+msgstr "Ste pozabili geslo?"
+
+#: templates/admin/openwisp_users/login.html:47
+msgid "Log in"
+msgstr "Prijava"
+
+#: templates/admin/openwisp_users/user/change_form.html:9
+msgid ""
+"\n"
+" You do not have permission to edit or delete this user because they "
+"are owner of an organization.\n"
+" "
+msgstr ""
+"\n"
+" Nimate dovoljenja za urejanje ali brisanje tega uporabnika, ker je "
+"lastnik organizacije.\n"
+" "
+
+#: widgets.py:5
+msgid "Shared systemwide (no organization)"
+msgstr "Deljeno na ravni sistema (brez organizacije)"
diff --git a/openwisp_users/mixins.py b/openwisp_users/mixins.py
index bd3e3caf7..41b6cadb4 100644
--- a/openwisp_users/mixins.py
+++ b/openwisp_users/mixins.py
@@ -5,6 +5,7 @@
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _
+from django.utils.translation import ngettext_lazy
from swapper import get_model_name
@@ -60,16 +61,17 @@ def _validate_org_reverse_relation(self, rel_name, field_error="organization"):
related_label = (
rel_meta.verbose_name if count == 1 else rel_meta.verbose_name_plural
)
- verb = _("is") if count == 1 else _("are")
- message = _(
+ message = ngettext_lazy(
+ "The organization of this {object_label} cannot be changed "
+ "because {count} {related_object_label} is still related to it",
"The organization of this {object_label} cannot be changed "
- "because {0} {related_object_label} {verb} still "
- "related to it".format(
- count,
- object_label=self._meta.verbose_name,
- related_object_label=related_label,
- verb=verb,
- )
+ "because {count} {related_object_label} are still related to it",
+ count,
+ )
+ message = message.format(
+ count=count,
+ object_label=self._meta.verbose_name,
+ related_object_label=related_label,
)
raise ValidationError({field_error: message})
diff --git a/openwisp_users/templates/admin/openwisp_users/login.html b/openwisp_users/templates/admin/openwisp_users/login.html
index ea421b34e..b7f623007 100644
--- a/openwisp_users/templates/admin/openwisp_users/login.html
+++ b/openwisp_users/templates/admin/openwisp_users/login.html
@@ -4,7 +4,7 @@
{% block content %}
{% if form.errors and not form.non_field_errors %}
-{% if form.errors.items|length == 1 %}Please correct the error below{% else %}Please correct the errors below{% endif %}
+{% if form.errors.items|length == 1 %}{% trans "Please correct the error below" %}{% else %}{% trans "Please correct the errors below" %}{% endif %}
-{% block trimmed %}
+{% blocktrans trimmed %}
You are authenticated as {{ username }}, but are not authorized to
access this page. Would you like to login to a different account?
-{% endblock %}
+{% endblocktrans %}