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