diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index f59634c05cd8297177238be1cb650867766d2b74..13a7f30ed26b178a23796cc8963ff7324fd77414 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -18,6 +18,7 @@ Fixed
 ~~~~~
 
 * Default translations from vuetify were not loaded.
+* Browser locale was not the default locale in the entire frontend.
 * In some cases, some items in the sidenav menu were not shown due to its height being higher than the visible page area.
 * The search bar in the sidenav menu is shown even though the user has no permission to see it.
 * Add permission check to accept invitation menu point in order to hide it when this feature is disabled.
diff --git a/aleksis/core/frontend/components/app/LanguageForm.vue b/aleksis/core/frontend/components/app/LanguageForm.vue
index 12acbe613e94a23e25f5d1195b0badf420d92aa6..cdef5932231e5b0401296b6918d009eb544588ec 100644
--- a/aleksis/core/frontend/components/app/LanguageForm.vue
+++ b/aleksis/core/frontend/components/app/LanguageForm.vue
@@ -33,17 +33,33 @@ export default {
       type: Array,
       required: true,
     },
+    defaultLanguage: {
+      type: Object,
+      required: true,
+    },
   },
   methods: {
     setLanguage: function (languageOption) {
       document.cookie = languageOption.cookie;
       this.$i18n.locale = languageOption.code;
       this.$vuetify.lang.current = languageOption.code;
+      this.language = languageOption;
     },
     nameForMenu: function (item) {
       return `${item.nameLocal} (${item.code})`;
     },
   },
+  mounted() {
+    if (
+      this.availableLanguages.filter((lang) => lang.code === this.$i18n.locale)
+        .length === 0
+    ) {
+      console.warn(
+        `Unsupported language ${this.$i18n.locale} selected, defaulting to ${this.defaultLanguage.code}`
+      );
+      this.setLanguage(this.defaultLanguage);
+    }
+  },
   name: "LanguageForm",
 };
 </script>
diff --git a/aleksis/core/frontend/components/app/SideNav.vue b/aleksis/core/frontend/components/app/SideNav.vue
index 7d486ad7e2aba6cfdb325130710beb9cd39db106..af34c3b5ee1e74f1587d9aa275952a2f77a0468e 100644
--- a/aleksis/core/frontend/components/app/SideNav.vue
+++ b/aleksis/core/frontend/components/app/SideNav.vue
@@ -82,6 +82,7 @@
         <v-spacer />
         <language-form
           :available-languages="systemProperties.availableLanguages"
+          :default-language="systemProperties.defaultLanguage"
         />
         <v-spacer />
       </div>
diff --git a/aleksis/core/frontend/components/app/systemProperties.graphql b/aleksis/core/frontend/components/app/systemProperties.graphql
index 99533650b65369f4a07c330399a2f452a815b763..b8ec991bda2b1b689c97f2fb339dafce9d0e1175 100644
--- a/aleksis/core/frontend/components/app/systemProperties.graphql
+++ b/aleksis/core/frontend/components/app/systemProperties.graphql
@@ -6,6 +6,12 @@
       nameLocal
       cookie
     }
+    defaultLanguage {
+      code
+      nameTranslated
+      nameLocal
+      cookie
+    }
     sitePreferences {
       themePrimary
       themeSecondary
diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js
index 11d1a1db0fe3b51703f63a6a668d96aac02f8374..baa4366fe9df4ef849aee0424cd2c916b3eda468 100644
--- a/aleksis/core/frontend/index.js
+++ b/aleksis/core/frontend/index.js
@@ -36,9 +36,7 @@ import routerOpts from "./app/router.js";
 import apolloOpts from "./app/apollo.js";
 
 const i18n = new VueI18n({
-  locale: Vue.$cookies.get("django_language")
-    ? Vue.$cookies.get("django_language")
-    : "en",
+  locale: Vue.$cookies.get("django_language") || navigator.language || "en",
   ...i18nOpts,
 });
 const vuetify = new Vuetify({
diff --git a/aleksis/core/schema/system_properties.py b/aleksis/core/schema/system_properties.py
index 1546512fc4e488faa01a93d87510249577c63388..6d6e50d5958601db24eca6e61d959482611cf5af 100644
--- a/aleksis/core/schema/system_properties.py
+++ b/aleksis/core/schema/system_properties.py
@@ -20,6 +20,7 @@ class LanguageType(graphene.ObjectType):
 
 class SystemPropertiesType(graphene.ObjectType):
     current_language = graphene.String(required=True)
+    default_language = graphene.Field(LanguageType)
     available_languages = graphene.List(LanguageType)
     site_preferences = graphene.Field(SitePreferencesType)
     custom_menu_by_name = graphene.Field(CustomMenuType)
@@ -27,6 +28,11 @@ class SystemPropertiesType(graphene.ObjectType):
     def resolve_current_language(parent, info, **kwargs):
         return info.context.LANGUAGE_CODE
 
+    @staticmethod
+    def resolve_default_language(root, info, **kwargs):
+        code = settings.LANGUAGE_CODE
+        return translation.get_language_info(code) | {"cookie": get_language_cookie(code)}
+
     def resolve_available_languages(parent, info, **kwargs):
         return [
             translation.get_language_info(code) | {"cookie": get_language_cookie(code)}