Skip to content

Commit afb0dc4

Browse files
committed
Implement language switcher as modal.
1 parent 7208f5c commit afb0dc4

File tree

3 files changed

+90
-50
lines changed

3 files changed

+90
-50
lines changed

kolibri/core/assets/src/views/app-bar/index.vue

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
ref="accountButton"
2020
class="username-text">
2121
<template v-if="windowSize.breakpoint > 2">
22-
{{ username }}
23-
<template v-if="isSuperuser">{{ $tr('superuser') }}</template>
24-
<template v-if="isAdmin">{{ $tr('admin') }}</template>
25-
<template v-if="isCoach">{{ $tr('coach') }}</template>
22+
<template v-if="isUserLoggedIn">
23+
{{ username }}
24+
<template v-if="isSuperuser">{{ $tr('superuser') }}</template>
25+
<template v-if="isAdmin">{{ $tr('admin') }}</template>
26+
<template v-if="isCoach">{{ $tr('coach') }}</template>
27+
</template>
28+
<template v-else>{{ $tr('guest') }}</template>
2629
</template>
2730
<ui-menu
2831
slot="dropdown"
@@ -31,14 +34,7 @@
3134
@select="optionSelected"
3235
/>
3336
</ui-button>
34-
<a v-else href="/user">
35-
<ui-button
36-
type="primary"
37-
color="primary"
38-
:ariaLabel="$tr('signIn')">
39-
{{ $tr('signIn') }}
40-
</ui-button>
41-
</a>
37+
<language-switcher v-if="showLanguageModal" @close="showLanguageModal=false"/>
4238
</div>
4339
</ui-toolbar>
4440

@@ -60,6 +56,8 @@
6056
import uiIconButton from 'keen-ui/src/UiIconButton';
6157
import uiMenu from 'keen-ui/src/UiMenu';
6258
import uiButton from 'keen-ui/src/UiButton';
59+
import { redirectBrowser } from '../../utils/browser';
60+
import languageSwitcher from '../language-switcher';
6361
export default {
6462
mixins: [responsiveWindow],
6563
name: 'appBar',
@@ -71,6 +69,8 @@
7169
superuser: '(Device owner)',
7270
admin: '(Admin)',
7371
coach: '(Coach)',
72+
guest: 'Guest',
73+
languageSwitchMenuOption: 'Change language',
7474
},
7575
props: {
7676
title: {
@@ -86,23 +86,41 @@
8686
required: true,
8787
},
8888
},
89+
data: () => ({
90+
showLanguageModal: false,
91+
}),
8992
components: {
9093
uiToolbar,
9194
uiIconButton,
9295
uiMenu,
9396
uiButton,
97+
languageSwitcher,
9498
},
9599
computed: {
96100
accountMenuOptions() {
101+
const changeLanguage = {
102+
id: 'language',
103+
label: this.$tr('languageSwitchMenuOption'),
104+
};
105+
if (this.isUserLoggedIn) {
106+
return [
107+
{
108+
id: 'profile',
109+
label: this.$tr('profile'),
110+
},
111+
changeLanguage,
112+
{
113+
id: 'signOut',
114+
label: this.$tr('signOut'),
115+
},
116+
];
117+
}
97118
return [
98119
{
99-
id: 'profile',
100-
label: this.$tr('profile'),
101-
},
102-
{
103-
id: 'signOut',
104-
label: this.$tr('signOut'),
120+
id: 'signIn',
121+
label: this.$tr('signIn'),
105122
},
123+
changeLanguage,
106124
];
107125
},
108126
},
@@ -115,6 +133,10 @@
115133
case 'signOut':
116134
this.kolibriLogout();
117135
break;
136+
case 'signIn':
137+
redirectBrowser();
138+
case 'language':
139+
this.showLanguageModal = true;
118140
default:
119141
break;
120142
}

kolibri/core/assets/src/views/core-base.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
:navShown="navShown"
1111
:height="headerHeight">
1212
<div slot="app-bar-actions" class="app-bar-actions">
13-
<language-switcher/>
1413
<slot name="app-bar-actions"/>
1514
</div>
1615
</app-bar>
@@ -50,7 +49,6 @@
5049
import sideNav from 'kolibri.coreVue.components.sideNav';
5150
import errorBox from './error-box';
5251
import loadingSpinner from 'kolibri.coreVue.components.loadingSpinner';
53-
import languageSwitcher from './language-switcher';
5452
import Vue from 'kolibri.lib.vue';
5553
5654
export default {
@@ -83,7 +81,6 @@
8381
sideNav,
8482
errorBox,
8583
loadingSpinner,
86-
languageSwitcher,
8784
},
8885
vuex: {
8986
getters: {
Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,62 @@
11
<template>
22

3-
<dropdown-menu
4-
:name="currentLanguageName"
5-
:options="languageOptions"
6-
:inAppBar="inAppBar"
7-
:displayDisabledAsSelected="true"
8-
:disabled="disabled"
9-
type="primary"
10-
color="primary"
11-
icon="language"
12-
@select="switchLanguage"
13-
/>
3+
<core-modal :title="$tr('changeLanguageModalHeader')" @cancel="$emit('close')">
4+
<p>{{ $tr('changeLanguageSubHeader') }}</p>
5+
<p v-for="language in languageOptions" :class="selectedLanguage.code===language.code ? 'selected' : 'choice'" @click="selectedLanguage=language">
6+
{{ language.name }}
7+
</p>
8+
<div class="footer">
9+
<k-button :text="$tr('cancelButtonText')" :raised="false" :disabled="disabled" @click="$emit('close')"/>
10+
<k-button :text="$tr('confirmButtonText')" :primary="true" :disabled="disabled" @click="switchLanguage"/>
11+
</div>
12+
</core-modal>
1413

1514
</template>
1615

1716

1817
<script>
1918
20-
import orderBy from 'lodash/orderBy';
21-
import dropdownMenu from 'kolibri.coreVue.components.dropdownMenu';
19+
import coreModal from 'kolibri.coreVue.components.coreModal';
20+
import kButton from 'kolibri.coreVue.components.kButton';
2221
import { httpClient } from 'kolibri.client';
2322
import { availableLanguages, currentLanguage } from 'kolibri.utils.i18n';
2423
export default {
25-
name: 'languageSwitcher',
26-
components: { dropdownMenu },
24+
name: 'languageSwitcherModalDialog',
25+
components: { coreModal, kButton },
26+
$trs: {
27+
changeLanguageModalHeader: 'Change language',
28+
changeLanguageSubHeader: 'Select the language you want to view Kolibri in',
29+
cancelButtonText: 'Cancel',
30+
confirmButtonText: 'Confirm',
31+
},
2732
computed: {
2833
languageOptions() {
29-
return orderBy(availableLanguages, language => language.code, ['asc']).map(language => ({
30-
id: language.code,
31-
label: language.name,
32-
disabled: language.code === currentLanguage,
33-
}));
34+
return Object.keys(availableLanguages)
35+
.sort((a, b) => {
36+
if (a === currentLanguage || a[0] > b[0]) {
37+
return -1;
38+
}
39+
if (b === currentLanguage || b[0] > a[0]) {
40+
return 1;
41+
}
42+
return 0;
43+
})
44+
.map(key => availableLanguages[key]);
3445
},
3546
currentLanguageName() {
3647
return availableLanguages[currentLanguage].name;
3748
},
3849
},
39-
props: {
40-
inAppBar: {
41-
type: Boolean,
42-
default: true,
43-
},
44-
},
4550
data: () => ({
4651
disabled: false,
52+
selectedLanguage: availableLanguages[currentLanguage],
4753
}),
4854
methods: {
49-
switchLanguage(language) {
55+
switchLanguage() {
5056
this.disabled = true;
5157
const path = this.Kolibri.urls['kolibri:set_language']();
5258
const entity = {
53-
language: language.id,
59+
language: this.selectedLanguage.code,
5460
};
5561
httpClient({
5662
path,
@@ -65,4 +71,19 @@
6571
</script>
6672

6773

68-
<style lang="stylus"></style>
74+
<style lang="stylus">
75+
76+
@require '~kolibri.styles.definitions'
77+
78+
h1, p
79+
color: black
80+
81+
.selected
82+
font-weight: bold
83+
84+
.choice
85+
color: $core-action-normal
86+
text-decoration: underline $core-action-normal
87+
cursor: pointer
88+
89+
</style>

0 commit comments

Comments
 (0)