Skip to content

Commit 95d0113

Browse files
boubakerexo-swf
authored andcommitted
feat: Add Default Language Main Setting - MEED-7144 - Meeds-io/meeds#2230 (#3950)
This change will allow to configure the default language to be used in email Notifications when the user didn't connected to platform yet. The default language will be used as well in `TranslationField.vue` component to set mandatory default language as well.
1 parent 9450316 commit 95d0113

8 files changed

Lines changed: 162 additions & 20 deletions

File tree

webapp/portlet/src/main/resources/locale/portlet/GeneralSettings_en.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,9 @@ generalSettings.errorUploadingPreview=An error occurred while uploading Illustra
166166
generalSettings.globalPageFullWindow=Full Window Pages
167167
generalSettings.editCustomStyle=Edit custom style
168168
generalSettings.customStyle=Custom Style
169+
170+
generalSettings.manageDefaultLanguage=Language
171+
generalSettings.subtitle.manageDefaultLanguage=Select the default platform language
172+
generalSettings.manageDefaultLanguage.drawer.title=Default Language
173+
generalSettings.defaultLanguageSettingSaved=Default language saved successfully.
174+
generalSettings.defaultLanguageSettingError=Error while saving default language setting. Please contact the administrator or try again later.

webapp/portlet/src/main/webapp/vue-apps/component-translation-field/js/TranslationService.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,6 @@ export function saveTranslations(objectType, objectId, fieldName, labels) {
6565
});
6666
}
6767

68-
export function saveDefaultLanguage(lang) {
69-
return fetch(`${eXo.env.portal.context}/${eXo.env.portal.rest}/social/translations/configuration/defaultLanguage`, {
70-
method: 'PUT',
71-
credentials: 'include',
72-
headers: {
73-
'Content-Type': 'application/x-www-form-urlencoded'
74-
},
75-
body: `lang=${lang}`,
76-
}).then((resp) => {
77-
if (!resp?.ok) {
78-
throw new Error(`Error when saving default language '${lang}' configuration`);
79-
}
80-
});
81-
}
82-
8368
export function deleteTranslations(objectType, objectId) {
8469
return fetch(`${eXo.env.portal.context}/${eXo.env.portal.rest}/social/translations/${objectType}/${objectId}`, {
8570
method: 'DELETE',

webapp/portlet/src/main/webapp/vue-apps/general-settings/components/GeneralSettings.vue

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,23 @@
138138
</v-btn>
139139
</v-list-item-action>
140140
</v-list-item>
141+
<v-list-item class="px-0" two-line>
142+
<v-list-item-content>
143+
<v-list-item-title class="text-title">
144+
{{ $t('generalSettings.manageDefaultLanguage') }}
145+
</v-list-item-title>
146+
<v-list-item-subtitle>
147+
{{ $t('generalSettings.subtitle.manageDefaultLanguage') }}
148+
</v-list-item-subtitle>
149+
</v-list-item-content>
150+
<v-list-item-action>
151+
<v-btn
152+
icon
153+
@click="$root.$emit('default-language-edit')">
154+
<v-icon size="18" class="icon-default-color">fa-edit</v-icon>
155+
</v-btn>
156+
</v-list-item-action>
157+
</v-list-item>
141158
<v-list-item class="px-0" two-line>
142159
<v-list-item-content>
143160
<v-list-item-title class="text-title">
@@ -168,6 +185,9 @@
168185
persistent
169186
@ok="closeEffectively" />
170187
<portal-general-settings-public-site-drawer />
188+
<portal-general-settings-default-language-drawer
189+
:branding="branding"
190+
@refresh="initBranding" />
171191
</v-main>
172192
</v-app>
173193
</template>
@@ -209,12 +229,18 @@ export default {
209229
methods: {
210230
init() {
211231
this.$root.loading = true;
212-
return this.$brandingService.getBrandingInformation()
213-
.then(data => this.branding = data)
214-
.then(() => this.$registrationService.getRegistrationSettings())
215-
.then(data => this.registrationSettings = data)
232+
return this.initBranding()
233+
.then(this.initRegistration)
216234
.finally(() => this.$root.loading = false);
217235
},
236+
initBranding() {
237+
return this.$brandingService.getBrandingInformation()
238+
.then(data => this.branding = data);
239+
},
240+
initRegistration() {
241+
return this.$registrationService.getRegistrationSettings()
242+
.then(data => this.registrationSettings = data);
243+
},
218244
close() {
219245
if (this.changed) {
220246
this.$refs.closeConfirmDialog.open();
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<template>
2+
<exo-drawer
3+
ref="drawer"
4+
v-model="drawer"
5+
id="defaultLanguageDrawer"
6+
allow-expand
7+
right>
8+
<template slot="title">
9+
{{ $t('generalSettings.manageDefaultLanguage.drawer.title') }}
10+
</template>
11+
<template v-if="drawer" slot="content">
12+
<v-radio-group v-model="language" class="px-4">
13+
<v-radio
14+
v-for="lang in languages"
15+
:key="lang.value"
16+
:label="lang.text"
17+
:value="lang.value"
18+
class="text-capitalize" />
19+
</v-radio-group>
20+
</template>
21+
<template slot="footer">
22+
<div class="d-flex">
23+
<v-spacer />
24+
<v-btn
25+
class="btn me-2"
26+
@click="close">
27+
{{ $t('generalSettings.cancel') }}
28+
</v-btn>
29+
<v-btn
30+
class="btn btn-primary"
31+
@click="saveLanguage">
32+
{{ $t('generalSettings.apply') }}
33+
</v-btn>
34+
</div>
35+
</template>
36+
</exo-drawer>
37+
</template>
38+
39+
<script>
40+
export default {
41+
props: {
42+
branding: {
43+
type: Object,
44+
default: null,
45+
},
46+
},
47+
data: () => ({
48+
drawer: false,
49+
language: null,
50+
}),
51+
computed: {
52+
languages() {
53+
return this.branding?.supportedLanguages && Object.keys(this.branding?.supportedLanguages).map(l => ({
54+
value: l.replace('_', '-'),
55+
text: this.branding.supportedLanguages[l],
56+
})) || [];
57+
},
58+
},
59+
created() {
60+
this.$root.$on('default-language-edit', this.open);
61+
},
62+
methods: {
63+
open() {
64+
this.language = this.branding?.defaultLanguage;
65+
this.$refs.drawer.open();
66+
},
67+
saveLanguage() {
68+
const lang = this.language.replace('-', '_');
69+
this.loading = true;
70+
this.$languageSettingService.saveDefaultLanguage(lang)
71+
.then(() => {
72+
this.$emit('refresh');
73+
this.$root.$emit('alert-message', this.$t('generalSettings.defaultLanguageSettingSaved'), 'success');
74+
this.close();
75+
})
76+
.catch(() => this.$root.$emit('alert-message', this.$t('generalSettings.defaultLanguageSettingError'), 'error'))
77+
.finally(() => this.loading = false);
78+
},
79+
close() {
80+
this.$refs.drawer.close();
81+
},
82+
},
83+
};
84+
</script>
85+

webapp/portlet/src/main/webapp/vue-apps/general-settings/initComponents.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import HubAccess from './components/registration/HubAccess.vue';
3737
import DefaultSpacesDrawer from './components/registration/DefaultSpacesDrawer.vue';
3838

3939
import PublicSiteEditDrawer from './components/public-site/PublicSiteEditDrawer.vue';
40+
import DefaultLanguageDrawer from './components/language/DefaultLanguageDrawer.vue';
4041

4142
const components = {
4243
'portal-general-settings': GeneralSettings,
@@ -55,6 +56,7 @@ const components = {
5556
'portal-general-settings-hub-access': HubAccess,
5657
'portal-general-settings-default-spaces-drawer': DefaultSpacesDrawer,
5758
'portal-general-settings-public-site-drawer': PublicSiteEditDrawer,
59+
'portal-general-settings-default-language-drawer': DefaultLanguageDrawer,
5860
};
5961

6062
for (const key in components) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* This file is part of the Meeds project (https://meeds.io/).
3+
*
4+
* Copyright (C) 2020 - 2024 Meeds Association contact@meeds.io
5+
*
6+
* This program is free software; you can redistribute it and/or
7+
* modify it under the terms of the GNU Lesser General Public
8+
* License as published by the Free Software Foundation; either
9+
* version 3 of the License, or (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
* Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
*/
20+
21+
export function saveDefaultLanguage(lang) {
22+
return fetch(`${eXo.env.portal.context}/${eXo.env.portal.rest}/social/translations/configuration/defaultLanguage`, {
23+
method: 'PUT',
24+
credentials: 'include',
25+
headers: {
26+
'Content-Type': 'application/x-www-form-urlencoded'
27+
},
28+
body: `lang=${lang}`,
29+
}).then((resp) => {
30+
if (!resp?.ok) {
31+
throw new Error(`Error when saving default language '${lang}' configuration`);
32+
}
33+
});
34+
}

webapp/portlet/src/main/webapp/vue-apps/general-settings/services.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
*/
1919

2020
import * as registrationService from './js/RegistrationService.js';
21+
import * as languageSettingService from './js/LanguageSettingService.js';
2122

2223
window.Object.defineProperty(Vue.prototype, '$registrationService', {
2324
value: registrationService,
2425
});
26+
window.Object.defineProperty(Vue.prototype, '$languageSettingService', {
27+
value: languageSettingService,
28+
});

webapp/portlet/src/main/webapp/vue-apps/user-setting-language/components/UserLanguageDrawer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<exo-drawer
33
ref="userLanguageDrawer"
44
class="userLanguageDrawer"
5-
body-classes="hide-scroll decrease-z-index-more"
5+
allow-expand
66
right>
77
<template slot="title">
88
{{ $t('UserSettings.language') }}

0 commit comments

Comments
 (0)