TT#52621 Change language for current session

What has been done:
- TT#52621, i18n: As a Customer, I want to change the language for the
  current session
  - TT#53402, Implement state handling for selection options and currently
    selected language
  - TT#53317, Implement UI with language selection box and label
  - TT#52968, Implement state handling for fetching and updating
    language selection
  - TT#53319, Configure i18n module to bind with language selection in
    store
  - TT#53366, Create Web Storage API methods for storing/updating
    session based language selection
- TT#52969, i18n: As a Customer, I want to see the text in the
  application translated to French
  - TT#52969, Add French translation file to codebase
  - TT#53403, Enable selection of French language

Change-Id: I07d5e353e7895f4f9dfb5fd3d1d4cf06073d9be7
changes/63/27363/6
Robert Axelsen 6 years ago committed by Hans-Peter Herzog
parent da1a37b0a3
commit af2c112dfa

File diff suppressed because it is too large Load Diff

@ -71,7 +71,7 @@
.csc-page-content
min-height 100vh
padding $flex-gutter-lg
padding-top $header-height
padding-top 24px
padding-bottom $call-footer-height
.csc-page.csc-page-mobile
.csc-page-content

@ -6,57 +6,78 @@
v-model="sideStates"
@left-breakpoint="leftBreakpoint"
>
<div
id="csc-header"
:class="headerClasses"
>
<csc-logo
id="csc-main-logo"
color="light"
/>
<div
class="csc-header-content"
<q-toolbar
id="csc-header-toolbar"
color="primary"
inverted
slot="header"
>
<q-btn
v-if="isMobile"
flat
color="white"
@click="$refs.layout.toggleLeft()"
>
<q-icon name="menu" />
<q-icon
name="menu"
/>
</q-btn>
<q-btn
class="csc-user-menu-button no-shadow"
v-if="!isMobile"
icon="language"
color="tertiary"
round
small
>
<q-popover ref="languagePopover">
<csc-user-menu
:language-label="languageLabel"
@change-language="changeLanguage"
/>
</q-popover>
</q-btn>
<div
id="csc-user-menu"
class="csc-user-menu-button"
>
<q-btn
icon="person"
color="faded"
color="tertiary"
round
small
/>
class="no-shadow"
>
</q-btn>
<span
v-if="!isMobile"
class="csc-username"
>
{{ getUsername }}
</span>
<q-popover ref="popover">
<q-popover>
<q-list
no-border
link
class="csc-toolbar-btn-popover"
>
<q-item @click="logout()">
<q-item-side
icon="exit to app"
icon="exit_to_app"
color="primary"
/>
<q-item-main label="Logout" />
<q-item-main
label="Logout"
:sublabel="getUsername"
>
</q-item-main>
</q-item>
</q-list>
</q-popover>
</div>
</div>
</div>
<csc-logo
id="csc-main-logo"
color="light"
/>
</q-toolbar>
<div
v-if="!isMobile"
slot=left
@ -78,6 +99,12 @@
color="default"
/>
</div>
<csc-user-menu
slot="left"
v-if="isMobile"
:language-label="languageLabel"
@change-language="changeLanguage"
/>
<csc-main-menu
slot="left"
:call-state-title="callStateTitle"
@ -157,11 +184,14 @@
QItem,
QItemSide,
QItemMain,
QItemTile,
QPopover,
QSideLink,
QCollapsible
} from 'quasar-framework'
import CscMainMenu from "./MainMenu";
import CscMainMenu from "./MainMenu"
import CscUserMenu from "./UserMenu"
import { i18n } from "../../i18n"
export default {
name: 'default',
data() {
@ -188,6 +218,7 @@
],
components: {
CscMainMenu,
CscUserMenu,
QLayout,
QToolbar,
QToolbarTitle,
@ -198,6 +229,7 @@
QItem,
QItemSide,
QItemMain,
QItemTile,
QPopover,
QSideLink,
QCollapsible,
@ -246,7 +278,8 @@
'hasSendSmsFeature',
'hasSendFaxFeature',
'userDataRequesting',
'userDataSucceeded'
'userDataSucceeded',
'changeSessionLocaleState'
]),
...mapGetters('communication', [
'createFaxState',
@ -300,6 +333,17 @@
classes.push('csc-header-full');
}
return classes;
},
languageLabel() {
let i18nLocale = i18n.locale.split('-')[0];
let locale = 'Unknown';
if (i18nLocale === 'en') {
locale = 'English';
}
else if (i18nLocale === 'fr') {
locale = 'français';
}
return this.$t('language', {language: locale});
}
},
methods: {
@ -371,6 +415,15 @@
},
sideStateLeft() {
return this.sideStates.left;
},
changeLanguage(language) {
this.$store.dispatch('user/changeSessionLanguage', language);
if(this.isMobile) {
this.$refs.layout.hideLeft();
}
else {
this.$refs.languagePopover.close();
}
}
},
watch: {
@ -426,6 +479,12 @@
this.$refs.call.fitMedia();
});
}
window.scrollTo(0, 0);
},
changeSessionLocaleState(state) {
if (state === 'succeeded') {
showToast(this.$t('toasts.changeSessionLanguageSuccessMessage'));
}
}
}
}
@ -433,6 +492,23 @@
<style lang="stylus" rel="stylesheet/stylus">
@import '../../themes/app.common'
#csc-header-toolbar
background-color $secondary
#csc-main-logo
height 52px
width auto
right 12px
top 4px
position absolute
.csc-user-menu-button
margin 0 0.2rem
padding 0.2rem
.on-left
margin 0
.csc-username
padding-left 3px
font-weight normal
color rgba(255,255,255,0.6)
.page.page-call-active
padding-bottom 120px
#main-menu
@ -502,11 +578,6 @@
overflow hidden
z-index 100
background-color $secondary
#csc-main-logo
position absolute
height $header-height - ($logo-margin * 2)
right $logo-margin
top $logo-margin
.csc-header-content
position absolute
top 0
@ -515,12 +586,6 @@
bottom 0
padding $logo-margin
background linear-gradient(to bottom, rgba(21,29,48,0.5) 0%,rgba(21,29,48,0) 75%,rgba(21,29,48,0) 100%)
#csc-header.csc-header-mobile
#csc-main-logo
position absolute
height $header-height-mobile - ($logo-margin-mobile * 2)
right $logo-margin-mobile
top $logo-margin-mobile
#csc-header.csc-header-full
left 0
#csc-user-menu
@ -562,4 +627,12 @@
.layout-aside-left
width auto
right 0
.csc-subitem-label
padding-left 20px
.csc-toolbar-btn-popover
.q-collapsible-sub-item
padding 0 16px 0 16px
.csc-collapsible-menu
.q-icon
display none
</style>

@ -0,0 +1,68 @@
<template>
<q-list
no-border
link
highlight
class="csc-toolbar-btn-popover"
>
<q-collapsible
ref="languageCollapsible"
:label="languageLabel"
class="csc-collapsible-menu"
>
<q-list
no-border
highlight
>
<q-item
v-for="language in languages"
@click="changeLanguage(language[0])"
class="csc-subitem"
>
<q-item-main
:label="language[1]"
/>
</q-item>
</q-list>
</q-collapsible>
</q-list>
</template>
<script>
import {
QList,
QItem,
QItemMain,
QCollapsible
} from 'quasar-framework'
export default {
name: 'csc-user-menu',
props: [
'languageLabel'
],
data () {
return {
languages: [
['en', 'English'],
['fr', 'français']
]
}
},
components: {
QList,
QItem,
QItemMain,
QCollapsible
},
methods: {
changeLanguage(language) {
console.log(language);
this.$emit('change-language', language);
this.$refs.languageCollapsible.close();
},
}
}
</script>
<style lang="stylus" rel="stylesheet/stylus">
</style>

@ -212,7 +212,7 @@
return '';
}
else {
return 'All'
return this.$t('pages.conversations.tabLabelAll');
}
},
labelCalls() {
@ -220,7 +220,7 @@
return '';
}
else {
return 'Calls'
return this.$t('pages.conversations.tabLabelCalls');
}
},
labelFaxes() {
@ -228,7 +228,7 @@
return '';
}
else {
return 'Faxes'
return this.$t('pages.conversations.tabLabelFaxes');
}
},
labelVoicemails() {
@ -236,7 +236,7 @@
return '';
}
else {
return 'Voicemails'
return this.$t('pages.conversations.tabLabelVoicemails');
}
},
isCalling() {

@ -177,18 +177,18 @@
},
direction() {
if(this.call.direction === 'out') {
return 'to';
return this.$t('pages.conversations.to');
}
else {
return 'from';
return this.$t('pages.conversations.from');
}
},
typeTerm() {
if(this.call.call_type === 'call') {
return 'Call';
return this.$t('pages.conversations.call');
}
else {
return 'Call forwarded'
return this.$t('pages.conversations.callForwarded');
}
},
icon() {

@ -1,6 +1,12 @@
<template>
<csc-page
class="csc-simple-page"
>
<div
class="row"
>
<div
class="col col-xs-12 col-md-6"
>
<q-field
class="csc-form-field"
@ -40,6 +46,8 @@
@input="updateRecurrence"
/>
</q-field>
</div>
</div>
</csc-page>
</template>

@ -1,6 +1,7 @@
<template>
<csc-page class="csc-simple-page">
<csc-page
class="csc-simple-page">
<div
class="row"
>

@ -2,6 +2,7 @@
import { isYesterday, isToday, isWithinLastWeek } from '../helpers/date-helper'
import moment from 'moment'
import { date } from 'quasar-framework'
import { i18n } from '../i18n';
const { formatDate } = date;
export default function(value) {
@ -17,27 +18,31 @@ export function smartTime($date) {
let diffMinutes = Math.floor(diffSeconds / 60);
let momentDate = moment(date);
let seconds = 'second';
let seconds = i18n.t('filters.second');
if (diffSeconds > 1) {
seconds = seconds + "s";
seconds = i18n.t('filters.seconds');
}
let minutes = 'minute';
if (diffSeconds > 120) {
minutes = minutes + "s";
minutes = i18n.t('filters.minutes');
}
if (diffSeconds < 60) {
return diffSeconds + ' ' + seconds + ' ago';
let descriptor = i18n.t('filters.ago');
return `${diffSeconds} ${seconds} ${descriptor}`;
}
else if (diffSeconds < 3600) {
return diffMinutes + ' ' + minutes + ' ago';
let descriptor = i18n.t('filters.ago');
return `${diffMinutes} ${minutes} ${descriptor}`;
}
else if (isToday(date)) {
return 'Today, ' + momentDate.format('HH:mm');
let descriptor = i18n.t('filters.today');
return `${descriptor}, ${momentDate.format('HH:mm')}`;
}
else if (isYesterday(date)) {
return 'Yesterday, ' + momentDate.format('HH:mm');
let descriptor = i18n.t('filters.yesterday');
return `${descriptor}, ${momentDate.format('HH:mm')}`;
}
else if (isWithinLastWeek(date)) {
return momentDate.format('dddd, HH:mm');

@ -2,15 +2,18 @@
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import localeEn from './locales/en'
import localeFr from './locales/fr'
import { SessionStorage } from 'quasar-framework'
Vue.use(VueI18n);
export const locales = {
en: localeEn
en: localeEn,
fr: localeFr
};
export const i18n = new VueI18n({
locale: localStorage.getItem('lang') || navigator.language || navigator.userLanguage,
locale: SessionStorage.get.item('locale') || navigator.language || navigator.userLanguage,
fallbackLocale: 'en',
messages: locales
});

@ -9,6 +9,7 @@
"sendFax": "Send Fax",
"loggedInAs": "Logged in as",
"notFound" : "404 Not Found",
"language": "Language ({language})",
"buttons": {
"cancel": "Cancel",
"save": "Save",
@ -32,7 +33,8 @@
},
"toasts": {
"callAvailable": "You are now able to start and receive calls",
"callNotAvailable": "Could not initialize call functionality properly"
"callNotAvailable": "Could not initialize call functionality properly",
"changeSessionLanguageSuccessMessage": "Session language successfully changed"
},
"validationErrors": {
"generic": "You have invalid form input. Please check and try again.",
@ -50,6 +52,15 @@
"pin": "Input a valid PIN",
"userInfoAndEmpty": "Input contains invalid characters"
},
"filters": {
"second": "second",
"seconds": "seconds",
"minute": "minute",
"minutes": "minutes",
"ago": "ago",
"today": "Today",
"yesterday": "Yesterday"
},
"navigation": {
"home": {
"title": "Start call",
@ -168,7 +179,11 @@
"duration": "Duration",
"seconds": "seconds",
"cost": "Cost",
"toggledSuccessMessage": "Number {type} successfully"
"toggledSuccessMessage": "Number {type} successfully",
"to": "to",
"from": "from",
"call": "Call",
"callForwarded": "Call forwarded"
},
"reminder": {
"toggleEnabled": "Reminder is enabled",

@ -0,0 +1,491 @@
{
"title": "CSC",
"rtcEngineDisconnected": "Vous ne pouvez pas lancer dappel. Le service est actuellement indisponible.",
"startCall": "Appel",
"startAudioCall": "Audio seulement",
"startVideoCall": "Audio et vidéo",
"startScreenSharing": "Audio et partage d'écran",
"sendSms": "Envoyer un SMS",
"sendFax": "Envoyer un Fax",
"loggedInAs": "Connecté en tant que",
"notFound": "Erreur 404",
"buttons": {
"cancel": "Annuler",
"save": "Enregistrer",
"remove": "Supprimer",
"edit": "Modifier",
"add": "Ajouter",
"moveUp": "Monter",
"moveDown": "Descendre",
"dismiss": "Ignorer",
"reset": "Réinitialiser",
"select": "Sélectionner",
"upload": "Transférer",
"abort": "Abandonner",
"selectNew": "En sélectionner un nouveau",
"resetDefaults": "Valeurs par défaut",
"install": "Installer",
"addNew": "En ajouter un nouveau"
},
"form": {
"destinationLabel": "Destination"
},
"toasts": {
"callAvailable": "Vous pouvez désormais lancer et recevoir des appels",
"callNotAvailable": "Impossible dinitialiser la fonction dappel correctement"
},
"validationErrors": {
"generic": "Un ou plusieurs champs de cet écran sont invalides. Veuillez vérifier.",
"required": "Ce champ est obligatoire.",
"maxLength": "{field} doit avoir au maximum {maxLength} caractères",
"fieldRequired": "{field} est obligatoire",
"minValueSecond": "{field} doit être au moins {minValue} seconde",
"maxValueSecond": "{field} doit être au maximum {maxValue} secondes",
"numeric": "{field} ne peut contenir que des caractères numériques",
"inputNumber": "Veuillez saisir un numéro de téléphone",
"inputValidNumber": "Veuillez saisir un numéro de téléphone valide",
"fieldRequiredXor": "{fieldOne} ou {fieldTwo} est obligatoire",
"email": "Veuillez saisir une adresse e-mail valide",
"macAddress": "Veuillez saisir une adresse MAC valide",
"pin": "Veuillez saisir un code PIN valide",
"userInfoAndEmpty": "Votre saisie contient des caractères invalides"
},
"navigation": {
"home": {
"title": "Lancer un appel",
"subTitle": ""
},
"conversations": {
"title": "Conversations",
"subTitle": "Appels, Fax, Boites vocales"
},
"callForward": {
"title": "Renvoi dappel",
"subTitle": "Contrôlez vos appels",
"always": "Toujours",
"companyHours": "Heures douverture",
"afterHours": "En dehors des heures douverture"
},
"callBlocking": {
"title": "Blocage dappels",
"subTitle": "Bloquer les numéros",
"incoming": "Entrant",
"outgoing": "Sortant",
"privacy": "Confidentialité"
},
"reminder": {
"title": "Rappel",
"subTitle": "Définissez votre alarme personnelle"
},
"speeddial": {
"title": "Raccourcis",
"subTitle": "Définissez vos raccourcis"
},
"pbxConfiguration": {
"title": "Configuration PBX",
"subTitle": "Groupes, Postes",
"groups": "Groupes",
"seats": "Sièges",
"devices": "Postes",
"callQueues": "Files dattente"
},
"voicebox": {
"title": "Messagerie vocale",
"subTitle": "Configurez votre messagerie vocale"
}
},
"pages": {
"login": {
"title": "Authentification de labonné",
"button": "Authentification",
"error": "Identifiant ou mot de passe incorrect",
"username": "Identifiant",
"username_helper": "Veuillez saisir lidentifiant ou identifiant@domaine",
"password": "Mot de passe",
"password_helper": ""
},
"callBlockingIncoming": {
"title": "Bloquer/autoriser les appels",
"toggleEnableLabel": "Seuls les appels entrants provenant des numéros listés sont autorisés",
"toggleDisableLabel": "Tous les appels entrants provenant des numéros listés sont bloqués",
"toggleEnabledToast": "Tous les numéros listés sont autorisés",
"toggleDisabledToast": "Tous les numéros listés sont bloqués",
"removeDialogTitle": "Supprimer le numéro",
"removeDialogText": "Vous êtes sur le point de supprimer le numéro {number}",
"removedToast": "Numéro {number} supprimé",
"addedToast": "Numéro {number} ajouté",
"addInputError": "Veuillez saisir un numéro valide ou un nom dabonné",
"addNumberButton": "Ajouter un numéro"
},
"callBlockingOutgoing": {
"title": "Bloquer/autoriser les appels sortants",
"toggleEnableLabel": "Seuls les appels sortants vers les numéros listés sont autorisés",
"toggleDisableLabel": "Tous les appels sortants vers les numéros listés sont bloqués",
"toggleEnabledToast": "Tous les numéros listés sont autorisés",
"toggleDisabledToast": "Tous les numéros listés sont bloqués",
"removeDialogTitle": "Supprimer le numéro",
"removeDialogText": "Vous êtes sur le point de supprimer le numéro {number}",
"removedToast": "Numéro {number} supprimé",
"addedToast": "Numéro {number} ajouté",
"addInputError": "Veuillez saisir un numéro valide ou un nom dabonné",
"addNumberButton": "Ajouter un numéro"
},
"conversations": {
"title": "Conversations",
"buttons": {
"call": "Rappel",
"audioCall": "Appel audio",
"videoCall": "Appel vidéo",
"play": "Lecture",
"download": "Télécharger",
"downloadFax": "Télécharger le Fax",
"downloadVoicemail": "Télécharger le message vocal"
},
"downloadVoiceMailSuccessMessage": "Le message vocal a été téléchargé avec succès",
"downloadVoiceMailErrorMessage": "Le téléchargement du message vocal a échoué",
"downloadFaxSuccessMessage": "Le fax a été téléchargé avec succès",
"downloadFaxErrorMessage": "Le téléchargement du fax a échoué",
"emptyListMessage": "Appels, messages vocaux ou fax introuvables",
"noFaxesMessage": "Fax introuvables",
"noVoicemailsMessage": "Message vocaux introuvables",
"noCallsMessage": "Appels introuvables",
"reloadItemsErrorMessage": "Le rechargement des conversations a échoué",
"tabLabelAll": "Tous",
"tabLabelCalls": "Appels",
"tabLabelFaxes": "Fax",
"tabLabelVoicemails": "Message vocaux",
"fax": "Fax",
"page": "page",
"pages": "pages",
"voicemail": "Message vocal",
"duration": "Durée",
"seconds": "secondes",
"cost": "Coût"
},
"reminder": {
"toggleEnabled": "Rappel activé",
"toggleDisabled": "Rappel désactivé",
"timeLabel": "Heure de la journée",
"recurrence": {
"once": "Une fois",
"weekdays": "Les jours de semaine",
"always": "Toujours"
},
"enabledToast": "Rappel: activation réussie",
"disabledToast": "Rappel: désactivation réussie",
"timeChangedToast": "Rappel: heure modifiée en {time}",
"recurrenceChangedToast": "Rappel: récurrence modifiée en {recurrence}"
},
"callForward": {
"titles": {
"always": "Toujours",
"companyHours": "Heures douverture",
"afterHours": "En dehors des heures douverture",
"sources": "Sources"
},
"buttons": {
"addNumber": "Ajouter un numéro",
"addVoicemail": "Ajouter une messagerie vocale",
"addFax2Mail": "Ajouter Fax2Mail"
},
"whenOnline": "Quand je suis connecté ...",
"whenBusy": "Quand je suis occupé ...",
"whenOffline": "Quand je suis déconnecté ...",
"forwardTo": "renvoyer vers",
"firstRing": "appeler dabord",
"thenRing": "puis appeler",
"for": "pendant",
"secs": "secs",
"forwardToNowhere": "renvoyer vers nulle part",
"removeDialogTitle": "Supprimer le numéro",
"removeDialogText": "Vous êtes sur le point de supprimer la destination {destination}",
"removeSuccessMessage": "Destination {destination} supprimée",
"removeErrorMessage": "Une erreur est survenue lors de la suppression de la destination. Veuillez réessayer",
"addDestinationButton": "Ajouter une destination",
"addDestinationSuccessMessage": "Destination {destination} ajoutée",
"addErrorMessage": "Une erreur est survenue lors de lajout de la destination. Veuillez réessayer",
"addInputError": "Veuillez saisir un numéro valide ou un nom dabonné",
"timeout": "Temporisation",
"destination": "Destination",
"terminatedTooltip": "Cette destination arrive après une destination finale, et est de ce fait inactive.",
"updateOwnPhoneToggleErrorMessage": "Une erreur est survenue lors de la mise à jour du numéro de téléphone personnel. Veuillez réessayer",
"editTimeout": "Modifier la temporisation",
"toggleTimeout": "{mode} téléphone personnel",
"ownPhoneDisabled": "ne pas faire sonner le téléphone personnel",
"updateOwnPhoneToggleSuccessMessage": "Le téléphone personnel est {toggle}",
"updateOwnPhoneTimeoutSuccessMessage": "La temporisation du téléphone personnel est fixée à {timeout}",
"updateOwnPhoneTimeoutErrorMessage": "Une erreur est survenue lors de la mise à jour de la temporisation du téléphone personnel. Veuillez réessayer",
"ownPhone": "téléphone personnel",
"disable": "Désactiver",
"enable": "Activer",
"whitelist": "Liste blanche",
"blacklist": "Liste noire",
"enabled": "activé",
"disabled": "désactivé",
"seconds": "secondes",
"times": {
"removeDialogTitle": "Supprimer lheure du renvoi dappel",
"removeDialogText": "Vous êtes sur le point de supprimer lheure pour {day}",
"removeLastDialogTitle": "Supprimer la dernière entrée dheure de renvoi",
"removeLastDialogText": "Attention: supprimer la dernière entrée dheure de renvoi supprimera aussi cet intervalle de temps ainsi que toutes les destinations. Êtes-vous sûr de vouloir faire ceci?",
"removeSuccessMessage": "Entrée supprimée pour {day}",
"removeErrorMessage": "Une erreur est survenue lors de la suppression de lentrée. Veuillez réessayer",
"removeTimesetSuccessMessage": "Plage horaire supprimée",
"resetErrorMessage": "Une erreur est survenue lors de la réinitialisation des plages horaires. Veuillez réessayer",
"resetSuccessMessage": "Réinitialisation des plages horaires terminée",
"addTimeSuccessMessage": "Nouvelle plage horaire créée avec succès",
"addTimeErrorMessage": "Une erreur est survenue lors de la création dune plage horaire. Veuillez réessayer",
"loadDestinationErrorMessage": "Une erreur est survenue lors du chargement des destinations. Veuillez réessayer",
"noTimeSet": "aucune plage horaire",
"addTimeButton": "Ajouter une heure",
"timesetIncompatible": "La plage horaire {timeset} contient des valeurs incompatibles. Vous pouvez résoudre le problème en réinitialisant la plage horaire {timeset}.",
"timesetNotDefined": "La plage horaire {timeset} nest pas définie. Veuillez en créer une afin de définir des destinations de renvois.",
"timesetDuplicate": "Il existe déjà une plage horaire {timeset}. Vous pouvez résoudre le problème en réinitialisant la plage horaire {timeset}.",
"timesetReverse": "Lordre des valeurs de la plage horaire {timeset} est inversé. Vous pouvez résoudre le problème en réinitialisant la plage horaire {timeset}.",
"weekday": "Jour de la semaine",
"from": "De",
"to": "A",
"monday": "Lundi",
"tuesday": "Mardi",
"wednesday": "Mercredi",
"thursday": "Jeudi",
"friday": "Vendredi",
"saturday": "Samedi",
"sunday": "Dimanche",
"resetTimeset": "Réinitialiser {timeset}",
"addTimeset": "Ajouter {timeset}",
"selectValidTime": "Sélectionner une heure valide"
},
"sources": {
"sourcesTitleMode": "Sources {mode}",
"addSuccessMessage": "Liste de sources {sourceset} créée avec succès",
"sourceset": "Liste de sources",
"source": "Source",
"fieldMissing": "Le nom de la liste de sources et la source sont nécessaires. Veuillez fournir les deux informations et réessayer.",
"addSourcesetErrorMessage": "Un erreur est survenue lors de la création de la liste de sources. Veuillez réessayer",
"addSourceButton": "Ajouter une source",
"addSourceSuccessMessage": "La nouvelle source {source} a été ajoutée avec succès",
"addSourceErrorMessage": "Une erreur est survenue lors de lajout de la source. Veuillez réessayer",
"removeSourcesetButton": "Supprimer la liste de sources",
"removeSourcesetErrorMessage": "Une erreur est survenue lors de la suppression de la liste de sources. Veuillez réessayer",
"removeSourcesetSuccessMessage": "La liste de sources {sourceset} a été supprimée avec succès",
"removeSourcesetDialogTitle": "La liste de sources de renvois dappels a été supprimée avec succès",
"removeSourcesetDialogText": "Vous êtes sur le point de supprimer la liste de sources {sourceset}",
"removeSourceSuccessMessage": "La source {source} a été supprimée avec succès",
"removeSourceErrorMessage": "Une erreur est survenue lors de la suppression de la source. Veuillez réessayer",
"removeSourceDialogTitle": "Supprimer la source du renvoi dappel",
"removeSourceDialogText": "Vous êtes sur le point de supprimer la source {source}",
"removeLastSourceDialogText": "Supprimer la dernière source nest pas autorisé."
}
},
"home": {
"title": "Accueil",
"cards": {
"voiceCall": "Appel voix",
"videoCall": "Appel vidéo",
"screenShare": "Partage décran",
"callForward": "Renvoi dappel",
"callBlocking": "Blocage dappel",
"reminder": "Rappel",
"speeddial": "Raccourcis",
"buddyList": "Liste de contact",
"welcome": "Bienvenue"
},
"featureNotAvailable": "Cette fonction nest pas disponible actuellement"
}
},
"call": {
"startNew": "Lancer un appel",
"initiating": "Appel vers le {number} en cours...",
"ringing": "{number} sonne...",
"incoming": "Appel entrant de {number}...",
"established": "En conversation avec {number}",
"inputShort": "Lancer un appel",
"initiatingShort": "Appel",
"ringingShort": "Appel présenté à",
"incomingShort": "Appel entrant de",
"establishedShort": "En communication avec",
"endedShort": "Appel terminé",
"ended": "Terminé",
"call": "Établi",
"number": "Numéro de téléphone",
"endCall": "Raccrocher",
"endCallDialog": "Vous êtes sur le point de raccrocher lappel. Êtes-vous sûr?",
"notificationTitle": "Appel entrant de {number}",
"notificationBlocked": "Vous avez bloqué les notifications dappels entrants.",
"notificationFailed": "Impossible dactiver les notifications dappels entrants.",
"notificationNotSupported": "Les notifications dappels entrants ne sont pas supportées.",
"desktopSharingNotInstalled": "Lextension de partage décran pour Chrome nest pas installée.",
"rtcEngineNotEnabled": "Vous ne pouvez ni émettre ou recevoir un appel car le RTC:engine nest pas actif. Si vous opérez un C5 CE alors migrez dabord vers un C5 PRO pour être en mesure dutiliser le RTC:engine."
},
"pbxConfig": {
"seat": "Siège",
"seats": "Sièges",
"group": "Groupe",
"groups": "Groupes",
"extension": "Extension",
"groupName": "Nom du groupe",
"huntPolicy": "Politique de groupement dappels",
"huntTimeout": "Temporisation des groupements dappels",
"huntTimeoutSentence": "Temporisation des groupements dappels",
"primaryNumber": "Numéro principal",
"aliasNumbers": "Numéros alternatifs",
"serialRinging": "Sonnerie séquentielle",
"parallelRinging": "Sonnerie parallèle",
"randomRinging": "Sonnerie aléatoire",
"circularRinging": "Sonnerie circulaire",
"allocatedByNobody": "Gratuit",
"allocatedBy": "Alloué par {type} {name}",
"addGroup": "Ajouter un groupe",
"removeGroup": "Supprimer le groupe",
"removeGroupTitle": "Supprimer le groupe",
"removeGroupText": "Vous êtes sur le point de supprimer le groupe {group}",
"name": "Nom",
"seatName": "Nom du siège",
"addSeat": "Ajouter un siège",
"removeSeat": "Supprimer le siège",
"removeSeatTitle": "Supprimer le siège",
"removeSeatText": "Vous êtes sur le point de supprimer le siège {seat}",
"devicesTitle": "Postes",
"deviceStationName": "Nom du poste",
"deviceIdentifier": "Adresse MAC",
"deviceModel": "Modèle du poste",
"groupsTitle": "Groupes",
"seatsTitle": "Sièges",
"noDevicesCreated": "Aucun poste créé",
"noDevicesFound": "Impossible de trouver un poste correspondant aux critères de filtrage",
"noModel": "Impossible de trouver un poste dont le modèle correspond aux critères de filtrage",
"noMacAddress": "Impossible de trouver un poste dont ladresse MAC correspond aux critères de filtrage",
"noStationName": "Impossible de trouver un poste dont le nom correspond aux critères de filtrage",
"noGroups": "Aucun groupe de créé",
"noSeats": "Aucun siège de créé",
"noCallQueues": "Aucune file dattente de créée",
"toasts": {
"changedFieldToast": "{type} modifié en {name}",
"updatedAliasNumbersToast": "Numéros alternatifs modifiés!",
"updatedSeatsInGroupToast": "Siège du groupe modifié!",
"updatedGroupsInSeatToast": "Groupe de sièges modifié!",
"addedGroupToast": "Groupe {group} ajouté",
"removedGroupToast": "Groupe {group} supprimé",
"addedSeatToast": "Siège {seat} ajouté",
"removedSeatToast": "Siège {seat} supprimé",
"removedDeviceToast": "Poste {name} supprimé",
"updatedDeviceKeys": "Touches du poste {name} mis à jour",
"updatedStationName": "Nom du poste modifié en {name}",
"updatedProfile": "Modèle du poste modifié en {name}",
"updatedIdentifier": "Identifiant modifié en {identifier}",
"createdDevice": "Le poste {name} a été créé avec succès"
},
"addDevice": "Ajouter un poste",
"addDeviceShort": "Ajouter",
"removeDevice": "Supprimer le poste",
"removeDeviceTitle": "Supprimer le poste",
"removeDeviceText": "Vous êtes sur le point de supprimer le poste {device}",
"keyEmptyLabel": "Non attribué",
"keyGroupLabel": "Groupe",
"keySeatLabel": "Siège",
"keyPilotLabel": "Pilote",
"keyBothLabel": "Groupe/Siège/Pilote",
"keyTypeShared": "Partagé",
"keyTypeBLF": "Busy Lamp Field",
"keyTypePrivate": "Privé",
"filterPhoneModel": "Modèle du poste",
"filterMacAddress": "Adresse MAC",
"filterStationName": "Nom du poste",
"showFilters": "Afficher les filtre",
"filterDevices": "Filtrer les postes",
"filterDevicesShort": "Filtrer",
"resetFilters": "Réinitialiser les filtres",
"closeFilters": "Fermer les filtres",
"createSeat": "Créer un siège",
"noGroupAssigned": "Aucun groupe",
"noSeatAssigned": "Aucun siège",
"createGroup": "Créer un groupe",
"queueLength": "Longueur de la file dattente",
"wrapUpTime": "Délai inter-appel",
"queueExtensionName": "Groupe/Siège/Pilote",
"addConfig": "Ajouter une file dattente",
"callQueue": "File dattente",
"createConfig": "Créer une file dattente",
"removeConfigTitle": "Supprimer la file dattente",
"removeConfigText": "Vous êtes sur le point de supprimer une file dattente de {subscriber}",
"seconds": "secondes",
"callers": "appelants"
},
"callBlocking": {
"privacyEnabledToast": "Votre numéro est caché à appelant",
"privacyEnabledLabel": "Votre numéro est caché à appelant",
"privacyDisabledToast": "Votre numéro est visible par appelant",
"privacyDisabledLabel": "Votre numéro est visible par appelant",
"number": "Numéro",
"listEmptyMessage": "Aucun numéro trouvé",
"anonymousBlocked": "Tous les appels anonymes sont bloqués"
},
"communication": {
"sendFax": "Envoyer un fax",
"quality": {
"normal": "Normal",
"fine": "Fin",
"super": "Supérieur"
},
"label": {
"destination": "Numéro de destination",
"quality": "Qualité",
"pageHeader": "En-tête de page",
"content": "Contenu",
"file": "Fichier",
"faxFile": "Fax"
},
"send": "Envoyer",
"cancel": "Annuler",
"createFaxErrorMessage": "Une erreur est survenue lors de lenvoi du Fax. Veuillez réessayer",
"createFaxSuccessMessage": "Le Fax a été envoyé avec succès."
},
"speedDial": {
"whenIDial": "Lorsque je numérote le {slot} ...",
"ring": "sonner",
"loadSpeedDialErrorMessage": "Une erreur est survenue lors du chargement des raccourcis. Veuillez réessayer",
"noResultsMessage": "Aucun raccourci",
"removeDialogTitle": "Supprimer le raccourci",
"removeDialogText": "Vous êtes sur le point de supprimer le raccourci {slot}",
"unassignSlotErrorMessage": "Une erreur est survenue lors de la configuration de lemplacement du raccourci. Veuillez réessayer",
"unassignSlotSuccessMessage": "Emplacement {slot} non attribué",
"addSpeedDial": "Ajouter un raccourci",
"slot": "Emplacement",
"destination": "Destination",
"addNoSlotsDialogText": "Tous les emplacements de raccourcis ont été attribués. Veuillez en supprimer un.",
"assignSlotErrorMessage": "Une erreur est survenue lors de lattribution de lemplacement du raccourci. Veuillez réessayer",
"assignSlotSuccessMessage": "Emplacement {slot} attribué"
},
"voicebox": {
"label": {
"changeEmail": "Modifier le-mail",
"changePin": "Modifier le code PIN",
"deletionEnabled": "Supprimer le message vocal une fois la notification e-mail délivrée",
"deletionDisabled": "Supprimer le message vocal une fois la notification e-mail délivrée",
"attachmentEnabled": "Joindre le message vocal à l'e-mail de notification",
"attachmentDisabled": "Joindre le message vocal à l' e-mail de notification",
"busyGreeting": "Annonce dabsence",
"unavailGreeting": "Annonce dindisponibilité",
"customSoundActive": "Son personnalisé",
"defaultSoundActive": "Son par défaut"
},
"pin": "PIN",
"loadSettingsErrorMessage": "Une erreur est survenue lors du chargement des paramètres. Veuillez recharger la page ou vérifier votre connexion réseau",
"toggleDeleteSuccessMessage": "La suppression a été activée avec succès",
"toggleDeleteErrorMessage": "Une erreur est survenue lors de lactivation de loption de suppression. Veuillez réessayer",
"toggleAttachSuccessMessage": "Les pièces jointes ont été activées avec succès",
"toggleAttachErrorMessage": "Une erreur est survenue lors de lactivation des pièces jointes. Veuillez réessayer",
"updatePinSuccessMessage": "Code PIN modifié avec succès.",
"updatePinErrorMessage": "Une erreur est survenue lors de la modification du code PIN. Veuillez réessayer",
"updateEmailSuccessMessage": "E-mail modifié avec succès",
"updateEmailErrorMessage": "Une erreur est survenue lors de la modification de le-mail. Veuillez réessayer",
"uploadGreetingSuccessMessage": "Annonce chargée avec succès",
"uploadGreetingErrorMessage": "Une erreur est survenue lors du chargement de lannonce. Veuillez réessayer",
"deleteGreetingSuccessMessage": "Lannonce a été supprimée avec succès",
"deleteGreetingErrorMessage": "Une erreur est survenue lors de la suppression de lannonce. Veuillez réessayer",
"deleteCustomDialogTitle": "Réinitialiser le message",
"deleteCustomDialogText": "Vous êtes sur le point de réinitialiser le message personnalisé de type {type} à ses valeurs par défaut",
"unavailable": "indisponible"
}
}

@ -1,6 +1,9 @@
'use strict';
import { i18n } from '../i18n';
import _ from 'lodash';
import { SessionStorage } from 'quasar-framework'
import { RequestState } from './common'
import {
login,
getUserData
@ -22,7 +25,10 @@ export default {
loginError: null,
userDataRequesting: false,
userDataSucceeded: false,
userDataError: null
userDataError: null,
sessionLocale: null,
changeSessionLocaleState: RequestState.initiated,
changeSessionLocaleError: null
},
getters: {
isLogged(state) {
@ -105,6 +111,9 @@ export default {
catch(err) {
return null;
}
},
changeSessionLocaleState(state) {
return state.changeSessionLocaleState;
}
},
mutations: {
@ -154,7 +163,20 @@ export default {
state.userDataSucceeded = false;
state.userDataError = null;
},
changeSessionLocaleRequesting(state) {
state.changeSessionLocaleState = RequestState.requesting;
state.changeSessionLocaleError = null;
},
changeSessionLocaleSucceeded(state, locale) {
i18n.locale = locale;
state.sessionLocale = locale;
state.changeSessionLocaleState = RequestState.succeeded;
state.changeSessionLocaleError = null;
},
changeSessionLocaleFailed(state, error) {
state.changeSessionLocaleState = RequestState.failed;
state.changeSessionLocaleError = error;
}
},
actions: {
login(context, options) {
@ -204,6 +226,18 @@ export default {
context.dispatch('logout');
});
}
},
changeSessionLanguage(context, locale) {
context.commit('changeSessionLocaleRequesting');
try {
SessionStorage.set('locale', locale);
}
catch(error) {
context.commit('changeSessionLocaleFailed', error);
}
finally {
context.commit('changeSessionLocaleSucceeded', locale);
}
}
}
};

@ -48,7 +48,7 @@ $call-minimized-background = $main-menu-background
$body-background = $secondary
$body-color = white
$header-height = 90px
$header-height = 60px
$header-height-mobile = 60px
$logo-margin = $flex-gutter-sm

Loading…
Cancel
Save