diff --git a/.github/release.yml b/.github/release.yml
index de6e982d9..b2eb4ae46 100644
--- a/.github/release.yml
+++ b/.github/release.yml
@@ -15,6 +15,9 @@ changelog:
     - title: Enhancements
       labels:
         - enhancement
+    - title: Translations
+      labels:
+        - lang
     - title: Refactoring
       labels:
         - refactor
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 8104d197e..61269b119 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -1,8 +1,10 @@
-name: docs 
+name: docs
 on:
   push:
     branches:
       - master
+permissions:
+  contents: write
 jobs:
   deploy:
     runs-on: ubuntu-latest
@@ -11,5 +13,5 @@ jobs:
       - uses: actions/setup-python@v4
         with:
           python-version: 3.x
-      - run: pip install mkdocs-material 
+      - run: pip install mkdocs-material
       - run: mkdocs gh-deploy --force
diff --git a/docs/forcing_password_reset.md b/docs/forcing_password_reset.md
index 5292a370e..927b3aec8 100644
--- a/docs/forcing_password_reset.md
+++ b/docs/forcing_password_reset.md
@@ -6,7 +6,7 @@ Depending on the scope of your application, there may be times when you'll decid
   - [Available Methods](#available-methods)
     - [Check if a User Requires Password Reset](#check-if-a-user-requires-password-reset)
     - [Force Password Reset On a User](#force-password-reset-on-a-user)
-    - [Removing Password Reset Flag On a User](#removing-password-reset-flag-on-a-user)
+    - [Remove Force Password Reset Flag On a User](#remove-force-password-reset-flag-on-a-user)
     - [Force Password Reset On Multiple Users](#force-password-reset-on-multiple-users)
     - [Force Password Reset On All Users](#force-password-reset-on-all-users)
 
@@ -46,9 +46,8 @@ If you see the need to force password reset for more than one user, the `forceMu
 
 ```php
 use CodeIgniter\Shield\Models\UserIdentityModel;
-...
-...
-...
+
+// ...
 $identities = new UserIdentityModel();
 $identities->forceMultiplePasswordReset([1,2,3,4]);
 ```
@@ -59,9 +58,8 @@ If you suspect a security breach or compromise in the passwords of your users, y
 
 ```php
 use CodeIgniter\Shield\Models\UserIdentityModel;
-...
-...
-...
+
+// ...
 $identities = new UserIdentityModel();
 $identities->forceGlobalPasswordReset();
 ```
diff --git a/docs/guides/strengthen_password.md b/docs/guides/strengthen_password.md
index 4e5067fc4..5d9345022 100644
--- a/docs/guides/strengthen_password.md
+++ b/docs/guides/strengthen_password.md
@@ -94,10 +94,10 @@ and `$hashThreads`.
 If you use `PASSWORD_ARGON2ID`, you should use PHP's constants:
 
 ```php
-    public int $hashMemoryCost = PASSWORD_ARGON2_DEFAULT_MEMORY_COST;
+public int $hashMemoryCost = PASSWORD_ARGON2_DEFAULT_MEMORY_COST;
 
-    public int $hashTimeCost = PASSWORD_ARGON2_DEFAULT_TIME_COST;
-    public int $hashThreads  = PASSWORD_ARGON2_DEFAULT_THREADS;
+public int $hashTimeCost = PASSWORD_ARGON2_DEFAULT_TIME_COST;
+public int $hashThreads  = PASSWORD_ARGON2_DEFAULT_THREADS;
 ```
 
 ## Maximum Password Length
diff --git a/docs/index.md b/docs/index.md
index 32aed5e61..a0fa90810 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -6,10 +6,11 @@
 * [Authentication](authentication.md)
 * [Authorization](authorization.md)
 * [Auth Actions](auth_actions.md)
-* [Forcing Password Reset](forcing_password_reset.md)
 * [Events](events.md)
 * [Testing](testing.md)
 * [Customization](customization.md)
+* [Forcing Password Reset](forcing_password_reset.md)
+* [Banning Users](banning_users.md)
 
 ## Guides
 * [Protecting an API with Access Tokens](guides/api_tokens.md)
diff --git a/mkdocs.yml b/mkdocs.yml
index 36a514bf3..023b20886 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -47,6 +47,8 @@ nav:
   - Events: events.md
   - Testing: testing.md
   - Customization: customization.md
+  - Forcing Password Reset: forcing_password_reset.md
+  - Banning Users: banning_users.md
   - session_auth_event_and_logging.md
   - Guides:
     - guides/api_tokens.md
diff --git a/src/Auth.php b/src/Auth.php
index 35e5bd30f..4ec710a5a 100644
--- a/src/Auth.php
+++ b/src/Auth.php
@@ -25,6 +25,11 @@
  */
 class Auth
 {
+    /**
+     * The current version of CodeIgniter Shield
+     */
+    public const SHIELD_VERSION = '1.0.0-beta.5';
+
     protected Authentication $authenticate;
 
     /**
diff --git a/src/Collectors/Auth.php b/src/Collectors/Auth.php
index ad19e5637..f265b2e58 100644
--- a/src/Collectors/Auth.php
+++ b/src/Collectors/Auth.php
@@ -56,7 +56,7 @@ public function __construct()
      */
     public function getTitleDetails(): string
     {
-        return get_class($this->auth->getAuthenticator());
+        return ShieldAuth::SHIELD_VERSION . ' | ' . get_class($this->auth->getAuthenticator());
     }
 
     /**
diff --git a/src/Commands/Generators/Views/usermodel.tpl.php b/src/Commands/Generators/Views/usermodel.tpl.php
index 8937a2978..0ae3650ff 100644
--- a/src/Commands/Generators/Views/usermodel.tpl.php
+++ b/src/Commands/Generators/Views/usermodel.tpl.php
@@ -10,6 +10,8 @@ class {class} extends ShieldUserModel
 {
     protected function initialize(): void
     {
+        parent::initialize();
+
         $this->allowedFields = [
             ...$this->allowedFields,
 
diff --git a/src/Language/de/Auth.php b/src/Language/de/Auth.php
index d763ef7d2..8e2c2476f 100644
--- a/src/Language/de/Auth.php
+++ b/src/Language/de/Auth.php
@@ -7,8 +7,8 @@
     'unknownAuthenticator'  => '{0} ist kein gültiger Authentifikator.',
     'unknownUserProvider'   => 'Der zu verwendende User Provider konnte nicht ermittelt werden.',
     'invalidUser'           => 'Der angegebene Benutzer kann nicht gefunden werden.',
-    'bannedUser'            => '(To be translated) Can not log you in as you are currently banned.',
-    'logOutBannedUser'      => '(To be translated) You have been logged out because you have been banned.',
+    'bannedUser'            => 'Anmelden nicht möglich da Ihr Benutzer derzeit gesperrt ist.',
+    'logOutBannedUser'      => 'Ihr Benutzer wurde abgemeldet und gesperrt.',
     'badAttempt'            => 'Sie konnten nicht angemeldet werden. Bitte überprüfen Sie Ihre Anmeldedaten.',
     'noPassword'            => 'Kann einen Benutzer ohne Passwort nicht validieren.',
     'invalidPassword'       => 'Sie können nicht angemeldet werden. Bitte überprüfen Sie Ihr Passwort.',
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'Das Passwort {0} wurde aufgrund einer Datenschutzverletzung aufgedeckt und wurde {1, number} Mal in {2} kompromittierten Passwörtern gesehen.',
     'suggestPasswordPwned'      => '{0} sollte niemals als Passwort verwendet werden. Wenn Sie es irgendwo verwenden, ändern Sie es sofort.',
     'errorPasswordEmpty'        => 'Ein Passwort ist erforderlich.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => 'Das Passwort darf die Länge von {param} Bytes nicht überschreiten.',
     'passwordChangeSuccess'     => 'Passwort erfolgreich geändert',
     'userDoesNotExist'          => 'Passwort wurde nicht geändert. Der Benutzer existiert nicht',
     'resetTokenExpired'         => 'Tut mir leid. Ihr Reset-Token ist abgelaufen.',
diff --git a/src/Language/fa/Auth.php b/src/Language/fa/Auth.php
index fb3acfce5..b3d8e4fe5 100644
--- a/src/Language/fa/Auth.php
+++ b/src/Language/fa/Auth.php
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'رمز عبور {0} با توجه به نقض داده ها و دیده شدن {1, number} بارها داخل رمز های عبور {2} به پسورد های ناامن تبدیل شده و در معرض قرار گرفته است.',
     'suggestPasswordPwned'      => '{0} هرگز نباید به عنوان رمز عبور استفاده شود. اگر در هر جایی از آن استفاده می کنید سریعا آن را تغییر دهید.',
     'errorPasswordEmpty'        => 'رمز عبور الزامی است.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => 'طول رمز عبور نمی تواند از {param} بایت بیشتر باشد.',
     'passwordChangeSuccess'     => 'رمز عبور با موفقیت تغییر کرد',
     'userDoesNotExist'          => 'رمز عبور تغییر نکرد. کاربر وجود ندارد.',
     'resetTokenExpired'         => 'متاسفانه، توکن بازنشانی شما منقضی شده است.',
diff --git a/src/Language/fr/Auth.php b/src/Language/fr/Auth.php
index 5c4e0bbd9..50c56881a 100644
--- a/src/Language/fr/Auth.php
+++ b/src/Language/fr/Auth.php
@@ -7,8 +7,8 @@
     'unknownAuthenticator'  => '{0} n\'est pas un authentificateur valide.',
     'unknownUserProvider'   => 'Impossible de déterminer le User Provider à utiliser.',
     'invalidUser'           => 'Impossible de trouver l\'utilisateur.',
-    'bannedUser'            => '(To be translated) Can not log you in as you are currently banned.',
-    'logOutBannedUser'      => '(To be translated) You have been logged out because you have been banned.',
+    'bannedUser'            => 'Impossible de vous connecter car vous êtes actuellement banni.',
+    'logOutBannedUser'      => 'Vous avez été déconnecté car vous avez été banni.',
     'badAttempt'            => 'Connexion impossible. Veuillez vérifier les informations saisies.',
     'noPassword'            => 'Impossible de valider un utilisateur sans mot de passe.',
     'invalidPassword'       => 'Connexion impossible. Veuillez vérifier votre mot de passe.',
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'Le mot de passe {0} a été exposé à la suite d\'une violation de données et a été vu {1, number} fois dans {2} des mots de passe compromis.',
     'suggestPasswordPwned'      => '{0} ne devrait jamais être utilisé comme mot de passe. Si vous l\'utilisez quelque part, changez-le immédiatement.',
     'errorPasswordEmpty'        => 'Un mot de passe est obligatoire.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => 'Le mot de passe ne doit pas dépasser {param} octets de longueur.',
     'passwordChangeSuccess'     => 'Mot de passe modifié avec succès',
     'userDoesNotExist'          => 'Le mot de passe n\'a pas été modifié. L\'utilisateur n\'existe pas',
     'resetTokenExpired'         => 'Désolé. Votre jeton de réinitialisation a expiré.',
@@ -90,7 +90,7 @@
     'emailActivateMailBody' => 'Veuillez utiliser le code suivant pour activer votre compte et commencer à utiliser le site.',
     'invalidActivateToken'  => 'Le code était incorrect.',
     'needActivate'          => 'Complétez votre inscription en confirmant le code envoyé à votre email.',
-    'activationBlocked'     => '(to be translated) You must activate your account before logging in.',
+    'activationBlocked'     => 'Vous devez activer votre compte avant de vous connecter.',
 
     // Groups
     'unknownGroup' => '{0} n\'est pas un groupe valide.',
diff --git a/src/Language/ja/Auth.php b/src/Language/ja/Auth.php
index 40f3624cd..e1d4870be 100644
--- a/src/Language/ja/Auth.php
+++ b/src/Language/ja/Auth.php
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'パスワード {0} はデータ漏洩により公開されており、{2} の漏洩したパスワード中で {1, number} 回見られます。', // 'The password {0} has been exposed due to a data breach and has been seen {1, number} times in {2} of compromised passwords.',
     'suggestPasswordPwned'      => '{0} は絶対にパスワードとして使ってはいけません。もしどこかで使っていたら、すぐに変更してください。', // '{0} should never be used as a password. If you are using it anywhere change it immediately.',
     'errorPasswordEmpty'        => 'パスワードが必要です。', // 'A Password is required.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => '{param} バイトを超えるパスワードは設定できません。', // 'Password cannot exceed {param} bytes in length.',
     'passwordChangeSuccess'     => 'パスワードの変更に成功しました', // 'Password changed successfully',
     'userDoesNotExist'          => 'パスワードは変更されていません。ユーザーは存在しません', // 'Password was not changed. User does not exist',
     'resetTokenExpired'         => '申し訳ありません。リセットトークンの有効期限が切れました。', // 'Sorry. Your reset token has expired.',
diff --git a/src/Language/pt-BR/Auth.php b/src/Language/pt-BR/Auth.php
index dda64e644..4a9c6cbf4 100644
--- a/src/Language/pt-BR/Auth.php
+++ b/src/Language/pt-BR/Auth.php
@@ -7,8 +7,8 @@
     'unknownAuthenticator'  => '{0} não é um autenticador válido.',
     'unknownUserProvider'   => 'Não foi possível determinar o provedor de usuário a ser usado.',
     'invalidUser'           => 'Não foi possível localizar o usuário especificado.',
-    'bannedUser'            => '(To be translated) Can not log you in as you are currently banned.',
-    'logOutBannedUser'      => '(To be translated) You have been logged out because you have been banned.',
+    'bannedUser'            => 'Não é possível fazer login porque você está banido no momento.',
+    'logOutBannedUser'      => 'Você foi desconectado porque foi banido.',
     'badAttempt'            => 'Não foi possível fazer login. Por favor, verifique suas credenciais.',
     'noPassword'            => 'Não é possível validar um usuário sem uma senha.',
     'invalidPassword'       => 'Não foi possível fazer login. Por favor, verifique sua senha.',
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'A senha {0} foi exposta devido a uma violação de dados e foi vista {1, number} vezes em {2} de senhas comprometidas.',
     'suggestPasswordPwned'      => '{0} nunca deve ser usado como uma senha. Se você estiver usando em algum lugar, altere imediatamente.',
     'errorPasswordEmpty'        => 'É necessária uma senha.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => 'A senha não pode exceder {param} bytes.',
     'passwordChangeSuccess'     => 'Senha alterada com sucesso',
     'userDoesNotExist'          => 'Senha não foi alterada. Usuário não existe',
     'resetTokenExpired'         => 'Desculpe. Seu token de redefinição expirou.',
@@ -90,7 +90,7 @@
     'emailActivateMailBody' => 'Use o código abaixo para ativar sua conta e começar a usar o site.',
     'invalidActivateToken'  => 'O código estava incorreto.',
     'needActivate'          => 'Você deve concluir seu registro confirmando o código enviado para seu endereço de e-mail.',
-    'activationBlocked'     => '(to be translated) You must activate your account before logging in.',
+    'activationBlocked'     => 'Você deve ativar sua conta antes de fazer o login.',
 
     // Grupos
     'unknownGroup' => '{0} não é um grupo válido.',
diff --git a/src/Language/sk/Auth.php b/src/Language/sk/Auth.php
index 5d504b5be..3617e0560 100644
--- a/src/Language/sk/Auth.php
+++ b/src/Language/sk/Auth.php
@@ -7,8 +7,8 @@
     'unknownAuthenticator'  => '{0} nie je platný autentifikátor.',
     'unknownUserProvider'   => 'Nie je možné určiť poskytovateľa používateľa, ktorý sa má použiť.',
     'invalidUser'           => 'Nie je možné nájsť zadaného používateľa.',
-    'bannedUser'            => '(To be translated) Can not log you in as you are currently banned.',
-    'logOutBannedUser'      => '(To be translated) You have been logged out because you have been banned.',
+    'bannedUser'            => 'Prihlásenie zlyhalo, pretože ste dostali zákaz vstupu (ban).',
+    'logOutBannedUser'      => 'Boli ste odhlásení, pretože ste dostali zákaz vstupu (ban).',
     'badAttempt'            => 'Prihlásenie zlyhalo. Skontrolujte svoje prihlasovacie údaje.',
     'noPassword'            => 'Nie je možné overiť používateľa bez hesla.',
     'invalidPassword'       => 'Prihlásenie zlyhalo. Skontrolujte svoje heslo.',
@@ -61,7 +61,7 @@
     'errorPasswordPwned'        => 'Heslo {0} bolo odhalené z dôvodu porušenia ochrany údajov a bolo videné {1, number}-krát z {2} prelomených hesiel.',
     'suggestPasswordPwned'      => '{0} by sa nikdy nemalo používať ako heslo. Ak ho niekde používate, okamžite ho zmeňte.',
     'errorPasswordEmpty'        => 'Vyžaduje sa heslo.',
-    'errorPasswordTooLongBytes' => '(To be translated) Password cannot exceed {param} bytes in length.',
+    'errorPasswordTooLongBytes' => 'Heslo nemôže presiahnuť dĺžku {param} bajtov',
     'passwordChangeSuccess'     => 'Heslo bolo úspešne zmenené',
     'userDoesNotExist'          => 'Heslo nebolo zmenené. Používateľ neexistuje',
     'resetTokenExpired'         => 'Prepáčte. Platnosť vášho resetovacieho tokenu vypršala.',
@@ -90,7 +90,7 @@
     'emailActivateMailBody' => 'Pomocou nižšie uvedeného kódu aktivujte svoj účet a môžete začať používať stránku.',
     'invalidActivateToken'  => 'Kód bol nesprávny',
     'needActivate'          => 'Registráciu musíte dokončiť potvrdením kódu zaslaného na vašu e-mailovú adresu.',
-    'activationBlocked'     => '(to be translated) You must activate your account before logging in.',
+    'activationBlocked'     => 'Pred prihlásením si musíte aktivovať svoj účet.',
 
     // Groups
     'unknownGroup' => '{0} nie je platná skupina.',
diff --git a/src/Language/sr/Auth.php b/src/Language/sr/Auth.php
new file mode 100644
index 000000000..22b2ecb5d
--- /dev/null
+++ b/src/Language/sr/Auth.php
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+
+return [
+    // Exceptions
+    'unknownAuthenticator'  => '{0} nije validan autentikator.',
+    'unknownUserProvider'   => 'Nemoguće je odlučiti koji User Provider koristiti.',
+    'invalidUser'           => 'Nemoguće locirati specifičnog korisnika.',
+    'bannedUser'            => 'Nije moguće pristupanje sistemu.Vaš nalog je banovan.',
+    'logOutBannedUser'      => 'Izlogovani ste jer je vaš nalog je banovan.',
+    'badAttempt'            => 'Neuspešan pristup. Proverite kredencijale.',
+    'noPassword'            => 'Neuspešna validacija korisnika bez lozinke.',
+    'invalidPassword'       => 'Neuspešan pristup, Proverite vašu lozinku.',
+    'noToken'               => 'Svaki zahtev mora imati bearer token u {0} zaglavlju.',
+    'badToken'              => 'Pristupni token nije validan.',
+    'oldToken'              => 'Pristupni token je istekao.',
+    'noUserEntity'          => 'Korisnički entitet mora postojati za verifikaciju naloga.',
+    'invalidEmail'          => 'Nije moguće potvrditi email adresu ne postoje pogodci u bazi podataka.',
+    'unableSendEmailToUser' => 'Žao nam je ali slanje email poruke nije moguće. Nismo u mogućnosti poslati poruku na "{0}".',
+    'throttled'             => 'Preveliki broj zahteva sa vaše IP adrese. Možete pokušati ponovo za {0} secondi.',
+    'notEnoughPrivilege'    => 'Nemate dovoljan nivo autorizacije za zahtevanu akciju.',
+
+    'email'           => 'E-mail Adresa',
+    'username'        => 'Korisničko ime',
+    'password'        => 'Lozinka',
+    'passwordConfirm' => 'Lozinka (ponovo)',
+    'haveAccount'     => 'Već imate nalog?',
+
+    // Buttons
+    'confirm' => 'Potvrdi',
+    'send'    => 'Pošalji',
+
+    // Registration
+    'register'         => 'Registracija',
+    'registerDisabled' => 'Registracija trenutno nije dozvoljena.',
+    'registerSuccess'  => 'Dobrodošli!',
+
+    // Login
+    'login'              => 'Pristup',
+    'needAccount'        => 'Potreban Vam je nalog?',
+    'rememberMe'         => 'Zapmti me?',
+    'forgotPassword'     => 'Zaboravljena lozinka?',
+    'useMagicLink'       => 'Koristi pristupni link',
+    'magicLinkSubject'   => 'Vaš pristupni link',
+    'magicTokenNotFound' => 'Nije moguća verifikacija linka.',
+    'magicLinkExpired'   => 'Žao nam je, link je istekao.',
+    'checkYourEmail'     => 'Proverite Vaš email!',
+    'magicLinkDetails'   => 'Upravo smo Vam poslali pristupni link. Pristupni link će biti validan još samo {0} minuta.',
+    'successLogout'      => 'Uspešno ste se odjavili sa sistema.',
+
+    // Passwords
+    'errorPasswordLength'       => 'Lozinka mora biti najmanje {0, number} znakova dužine.',
+    'suggestPasswordLength'     => 'Fraza lozinke - čak do 255 znakova dužine - napravite sigurniju lozinku koja se lako pamti.',
+    'errorPasswordCommon'       => 'Lozinka ne može biti na listi čestih lozinki.',
+    'suggestPasswordCommon'     => 'Lozinka je upoređena sa 65k čestih lozinki ili lozinki procurelih hakovanjem.',
+    'errorPasswordPersonal'     => 'Lozinka ne može sadržati hešovane lične podatke.',
+    'suggestPasswordPersonal'   => 'Varijacije bazirane na email adresi ne treba koristiti kao lozinku.',
+    'errorPasswordTooSimilar'   => 'Lozinka je previše slična korisničkom imenu.',
+    'suggestPasswordTooSimilar' => 'Ne koristite delove korisničkog imena za lozinku.',
+    'errorPasswordPwned'        => 'Lozinka {0} je otkrivena prilikom napada {1, number} puta u {2} kompromitovanih lozinki.',
+    'suggestPasswordPwned'      => '{0} nikada ne treba biti korišćen za lozinku. Ako to koristite bilo gde promenite lozinku odmah.',
+    'errorPasswordEmpty'        => 'Lozinka je obavezna.',
+    'errorPasswordTooLongBytes' => 'Lozinka ne može preći {param} bytova dužine.',
+    'passwordChangeSuccess'     => 'Lozinka je uspešno promenjena',
+    'userDoesNotExist'          => 'Lozinka nije promenjena. Korisnični nalog ne postoji',
+    'resetTokenExpired'         => 'Žao nam je ali token je istekao.',
+
+    // Email Globals
+    'emailInfo'      => 'Neke informacije o osobi:',
+    'emailIpAddress' => 'IP Adresa:',
+    'emailDevice'    => 'Uređaj:',
+    'emailDate'      => 'Datum:',
+
+    // 2FA
+    'email2FATitle'       => 'Dvofazna autentifikacija',
+    'confirmEmailAddress' => 'Potvrdite Vašu email adresu.',
+    'emailEnterCode'      => 'Unesite kod',
+    'emailConfirmCode'    => 'Unesite 6-cifreni kod koji smo Vam poslali na email.',
+    'email2FASubject'     => 'Vaš kod za autentifikaciju',
+    'email2FAMailBody'    => 'Autentifikacioni kod:',
+    'invalid2FAToken'     => 'Kod nije ispravan.',
+    'need2FA'             => 'Morate dovršiti dvofaznu autentifikaciju.',
+    'needVerification'    => 'Proverite email kako bi ste završili verifikaciju.',
+
+    // Activate
+    'emailActivateTitle'    => 'Aktivacija email-a',
+    'emailActivateBody'     => 'Upravo smo Vam poslali kod za proveru email adrese. Molimo vas alepite kod ispod',
+    'emailActivateSubject'  => 'Baš aktivacioni kod',
+    'emailActivateMailBody' => 'Koristite kod u nastavku kako bi ste aktivirali Vaš nalog i počeli korišćenje servisa.',
+    'invalidActivateToken'  => 'Kod nije ispravan.',
+    'needActivate'          => 'Morate dovršiti registraciju potvrdom koda poslatog na vašu email adresu.',
+    'activationBlocked'     => 'Morate aktivirati vaš nalog pre pristupanja sistemu.',
+
+    // Groups
+    'unknownGroup' => '{0} neispravna grupa.',
+    'missingTitle' => 'Grupa mora imati naziv.',
+
+    // Permissions
+    'unknownPermission' => '{0} nije validno odobrenje.',
+];
diff --git a/src/Language/sv-SE/Auth.php b/src/Language/sv-SE/Auth.php
new file mode 100644
index 000000000..7176f650a
--- /dev/null
+++ b/src/Language/sv-SE/Auth.php
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+
+return [
+    // Exceptions
+    'unknownAuthenticator'  => '{0} är inte en giltig autentiseringsmetod.',
+    'unknownUserProvider'   => 'Kunde inte bestämma vilken User Provider som skall användas.',
+    'invalidUser'           => 'Kan inte hitta angiven användare.',
+    'bannedUser'            => 'Kan inte logga in dig eftersom du är avstängd.',
+    'logOutBannedUser'      => 'Du har blivit utloggad eftersom du har stängts av.',
+    'badAttempt'            => 'Kan inte logga in dig. Kontrollera dina inloggningsuppgifter.',
+    'noPassword'            => 'Kan inte validera användaren eftersom lösenord saknas.',
+    'invalidPassword'       => 'Kan inte logga in dig. Kontrollera angivet lösenord.',
+    'noToken'               => 'Varje förfrågan måste ha en bearer token i {0} headern.',
+    'badToken'              => 'Access token är ogiltig.',
+    'oldToken'              => 'Access token har gått ut.',
+    'noUserEntity'          => 'User Entity måste anges för lösenordsvalidering.',
+    'invalidEmail'          => 'Kan inte verifiera att epostadressen stämmer med den sparade.',
+    'unableSendEmailToUser' => 'Det var inte möjligt att skicka epost. Det gick inte att skicka till "{0}".',
+    'throttled'             => 'För många anrop från denna IP-adress. Du kan försöka igen om {0} sekunder.',
+    'notEnoughPrivilege'    => 'Du har inte nödvändiga rättigheter för detta kommando.',
+
+    'email'           => 'Epostadress',
+    'username'        => 'Användarnamn',
+    'password'        => 'Lösenord',
+    'passwordConfirm' => 'Lösenord (igen)',
+    'haveAccount'     => 'Har du redan ett konto?',
+
+    // Buttons
+    'confirm' => 'Bekräfta',
+    'send'    => 'Skicka',
+
+    // Registration
+    'register'         => 'Registrera',
+    'registerDisabled' => 'Registrering är för närvarande inte möjlig.',
+    'registerSuccess'  => 'Välkommen!',
+
+    // Login
+    'login'              => 'Logga in',
+    'needAccount'        => 'Behöver du ett konto?',
+    'rememberMe'         => 'Kom ihåg mig?',
+    'forgotPassword'     => 'Glömt ditt lösenord?',
+    'useMagicLink'       => 'Använd en login-länk',
+    'magicLinkSubject'   => 'Din login-länk',
+    'magicTokenNotFound' => 'Kan inte verifiera länken.',
+    'magicLinkExpired'   => 'Tyvärr, länken har gått ut.',
+    'checkYourEmail'     => 'Kontrollera din epost!',
+    'magicLinkDetails'   => 'En login-länk har skickats med epost. Den gäller bara i {0} minuter.',
+    'successLogout'      => 'Du har loggats ut.',
+
+    // Passwords
+    'errorPasswordLength'       => 'Lösenordet måste vara minst {0, number} tecken långt.',
+    'suggestPasswordLength'     => 'Lösenfraser - upp till 255 tecken långa - ger säkrare lösenord som är lättare att komma ihåg.',
+    'errorPasswordCommon'       => 'Lösenordet kan inte vara en vanligt lösenord.',
+    'suggestPasswordCommon'     => 'Lösenordet kontrollerades mot en lista med över 65k vanliga lösenord eller lösenord från publicerade dataläckor.',
+    'errorPasswordPersonal'     => 'Lösenord kan inte innehålla hashad personlig information.',
+    'suggestPasswordPersonal'   => 'Variationer på epostadress eller användarnamn kan inte användas som lösenord.',
+    'errorPasswordTooSimilar'   => 'Lösenordet är för likt användarnamnet.',
+    'suggestPasswordTooSimilar' => 'Använd inte delar av ditt användarnamn i lösenordet.',
+    'errorPasswordPwned'        => 'Lösenordet {0} har publicerats i en dataläcka och har setts {1, number} gånger i {2} publicerade dataläckor.',
+    'suggestPasswordPwned'      => '{0} skall aldrig användas som lösenord. Använder du det någonstans skall du omedelbart byta.',
+    'errorPasswordEmpty'        => 'Ett lösenord krävs.',
+    'errorPasswordTooLongBytes' => 'Lösenordet kan inte vara längre än {param} bytes.',
+    'passwordChangeSuccess'     => 'Lösenordet har bytts',
+    'userDoesNotExist'          => 'Lösenordet kunde inte bytas. Användaren existerar inte.',
+    'resetTokenExpired'         => 'Tyvärr. Din reset token har gått ut.',
+
+    // Email Globals
+    'emailInfo'      => 'Informationen om personen:',
+    'emailIpAddress' => 'IP-adress:',
+    'emailDevice'    => 'Enhet:',
+    'emailDate'      => 'Datum:',
+
+    // 2FA
+    'email2FATitle'       => 'Tvåfaktorsautentisering',
+    'confirmEmailAddress' => 'Validera din epost-adress.',
+    'emailEnterCode'      => 'Validera din epost',
+    'emailConfirmCode'    => 'Ange den 6 siffror långa koden som skickats till din epost-adress.',
+    'email2FASubject'     => 'Din engångskod',
+    'email2FAMailBody'    => 'Your engångskod är:',
+    'invalid2FAToken'     => 'Koden var fel.',
+    'need2FA'             => 'Du måste gör en tvåfaktorsautentisering.',
+    'needVerification'    => 'Kontrollera din epost för att slutföra aktiveringen av kontot.',
+
+    // Activate
+    'emailActivateTitle'    => 'Verifiering av epostadress',
+    'emailActivateBody'     => 'Ett meddelande har just skickats för att det skall gå att verifiera din epostadress. Kopiera aktiveringskoden från meddelandet och klistra in den nedan.',
+    'emailActivateSubject'  => 'Din aktiveringskod',
+    'emailActivateMailBody' => 'Använd koden nedan för att aktivera ditt konto för att kunna använda webplatsen.',
+    'invalidActivateToken'  => 'Koden var fel.',
+    'needActivate'          => 'Du måste slutföra registreringen genom att ange aktiveringskoden som skickats till din epostadress.',
+    'activationBlocked'     => 'Du måste aktivera ditt konto innan du kan logga in.',
+
+    // Groups
+    'unknownGroup' => '{0} är inte en giltig grupp.',
+    'missingTitle' => 'En titel på gruppen måste anges.',
+
+    // Permissions
+    'unknownPermission' => '{0} är inte ett giltig rättighet.',
+];
diff --git a/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php b/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php
index d84e66586..c5042dbb8 100644
--- a/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php
+++ b/tests/Authentication/Authenticators/AccessTokenAuthenticatorTest.php
@@ -126,9 +126,11 @@ public function testCheckOldToken(): void
         /** @var User $user */
         $user = fake(UserModel::class);
         /** @var UserIdentityModel $identities */
-        $identities          = model(UserIdentityModel::class);
-        $token               = $user->generateAccessToken('foo');
-        $token->last_used_at = Time::now()->subYears(1)->subMinutes(1);
+        $identities = model(UserIdentityModel::class);
+        $token      = $user->generateAccessToken('foo');
+        // CI 4.2 uses the Chicago timezone that has Daylight Saving Time,
+        // so subtracts 1 hour to make sure this test passes.
+        $token->last_used_at = Time::now()->subYears(1)->subHours(1)->subMinutes(1);
         $identities->save($token);
 
         $result = $this->auth->check(['token' => $token->raw_token]);
diff --git a/tests/Collectors/AuthTest.php b/tests/Collectors/AuthTest.php
index 1c3c50495..45d7a5871 100644
--- a/tests/Collectors/AuthTest.php
+++ b/tests/Collectors/AuthTest.php
@@ -4,6 +4,7 @@
 
 namespace Tests\Collectors;
 
+use CodeIgniter\Shield\Auth as ShieldAuth;
 use CodeIgniter\Shield\Authentication\Authenticators\Session;
 use CodeIgniter\Shield\Collectors\Auth;
 use CodeIgniter\Shield\Entities\User;
@@ -71,6 +72,7 @@ public function testGetTitleDetails(): void
     {
         $output = $this->collector->getTitleDetails();
 
+        $this->assertStringContainsString(ShieldAuth::SHIELD_VERSION, $output);
         $this->assertStringContainsString(Session::class, $output);
     }
 
diff --git a/tests/Commands/UserModelGeneratorTest.php b/tests/Commands/UserModelGeneratorTest.php
index d7fbfd522..41c539593 100644
--- a/tests/Commands/UserModelGeneratorTest.php
+++ b/tests/Commands/UserModelGeneratorTest.php
@@ -90,6 +90,7 @@ public function testGenerateUserModel(): void
         $this->assertStringContainsString('class UserModel extends ShieldUserModel', $contents);
         $this->assertStringContainsString('use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;', $contents);
         $this->assertStringContainsString('protected function initialize(): void', $contents);
+        $this->assertStringContainsString('parent::initialize();', $contents);
     }
 
     public function testGenerateUserModelCustomNamespace(): void
diff --git a/tests/Language/AbstractTranslationTestCase.php b/tests/Language/AbstractTranslationTestCase.php
index 6b8edc707..49e114184 100644
--- a/tests/Language/AbstractTranslationTestCase.php
+++ b/tests/Language/AbstractTranslationTestCase.php
@@ -69,8 +69,9 @@ abstract class AbstractTranslationTestCase extends TestCase
         BrazilianTranslationTest::class => 'pt-BR',
         //        RussianTranslationTest::class            => 'ru',
         //        SinhalaTranslationTest::class            => 'si',
-        SlovakTranslationTest::class => 'sk',
-        //        SwedishTranslationTest::class            => 'sv-SE',
+        SlovakTranslationTest::class  => 'sk',
+        SerbianTranslationTest::class => 'sr',
+        SwedishTranslationTest::class => 'sv-SE',
         //        ThaiTranslationTest::class               => 'th',
         TurkishTranslationTest::class => 'tr',
         //        UkrainianTranslationTest::class          => 'uk',
diff --git a/tests/Language/SerbianTranslationTest.php b/tests/Language/SerbianTranslationTest.php
new file mode 100644
index 000000000..5dede1cf5
--- /dev/null
+++ b/tests/Language/SerbianTranslationTest.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * This file is part of CodeIgniter 4 framework.
+ *
+ * (c) CodeIgniter Foundation <admin@codeigniter.com>
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Tests\Language;
+
+/**
+ * @internal
+ */
+final class SerbianTranslationTest extends AbstractTranslationTestCase
+{
+}
diff --git a/tests/Language/SwedishTranslationTest.php b/tests/Language/SwedishTranslationTest.php
new file mode 100644
index 000000000..2c5ed0674
--- /dev/null
+++ b/tests/Language/SwedishTranslationTest.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * This file is part of CodeIgniter 4 framework.
+ *
+ * (c) CodeIgniter Foundation <admin@codeigniter.com>
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Tests\Language;
+
+/**
+ * @internal
+ */
+final class SwedishTranslationTest extends AbstractTranslationTestCase
+{
+}