working at i18n @admin page

This commit is contained in:
lesion
2022-11-29 14:40:19 +01:00
parent c46a4ee17c
commit 5baff1adb1
18 changed files with 799 additions and 767 deletions

View File

@@ -22,6 +22,7 @@ v-container
v-data-table( v-data-table(
v-if='announcements.length' v-if='announcements.length'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:header-props='{ sortIcon: mdiChevronDown }'
:headers='headers' :headers='headers'
:items='announcements') :items='announcements')
template(v-slot:item.actions='{ item }') template(v-slot:item.actions='{ item }')
@@ -35,21 +36,21 @@ import { mapActions } from 'vuex'
import cloneDeep from 'lodash/cloneDeep' import cloneDeep from 'lodash/cloneDeep'
import Editor from '../Editor' import Editor from '../Editor'
import Announcement from '../Announcement' import Announcement from '../Announcement'
import { mdiPlus, mdiChevronRight, mdiChevronLeft } from '@mdi/js' import { mdiPlus, mdiChevronRight, mdiChevronLeft, mdiChevronDown } from '@mdi/js'
export default { export default {
components: { Editor, Announcement }, components: { Editor, Announcement },
data() { data() {
return { return {
mdiPlus, mdiChevronRight, mdiChevronLeft, mdiPlus, mdiChevronRight, mdiChevronLeft, mdiChevronDown,
valid: false, valid: false,
dialog: false, dialog: false,
editing: false, editing: false,
announcements: [], announcements: [],
loading: false, loading: false,
headers: [ headers: [
{ value: 'title', text: 'Title' }, { value: 'title', text: this.$t('common.title') },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
], ],
announcement: { title: '', announcement: '' } announcement: { title: '', announcement: '' }
} }

View File

@@ -4,7 +4,7 @@ v-container
v-spacer v-spacer
v-text-field(v-model='search' v-text-field(v-model='search'
:append-icon='mdiMagnify' outlined rounded :append-icon='mdiMagnify' outlined rounded
label='Search' :label="$t('common.search')"
single-line hide-details) single-line hide-details)
v-card-subtitle(v-html="$t('admin.collections_description')") v-card-subtitle(v-html="$t('admin.collections_description')")
@@ -75,6 +75,7 @@ v-container
:headers='filterHeaders' :headers='filterHeaders'
:items='filters' :items='filters'
:hide-default-footer='filters.length < 5' :hide-default-footer='filters.length < 5'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }') :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }')
template(v-slot:item.actions='{ item }') template(v-slot:item.actions='{ item }')
v-btn(@click='removeFilter(item)' color='error' icon) v-btn(@click='removeFilter(item)' color='error' icon)
@@ -94,6 +95,7 @@ v-container
:headers='collectionHeaders' :headers='collectionHeaders'
:items='collections' :items='collections'
:hide-default-footer='collections.length < 5' :hide-default-footer='collections.length < 5'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:search='search') :search='search')
template(v-slot:item.filters='{ item }') template(v-slot:item.filters='{ item }')
@@ -108,12 +110,12 @@ v-container
<script> <script>
import get from 'lodash/get' import get from 'lodash/get'
import debounce from 'lodash/debounce' import debounce from 'lodash/debounce'
import { mdiPencil, mdiChevronLeft, mdiChevronRight, mdiMagnify, mdiPlus, mdiTagMultiple, mdiMapMarker, mdiDeleteForever, mdiCloseCircle } from '@mdi/js' import { mdiPencil, mdiChevronLeft, mdiChevronRight, mdiMagnify, mdiPlus, mdiTagMultiple, mdiMapMarker, mdiDeleteForever, mdiCloseCircle, mdiChevronDown } from '@mdi/js'
export default { export default {
data() { data() {
return { return {
mdiPencil, mdiChevronRight, mdiChevronLeft, mdiMagnify, mdiPlus, mdiTagMultiple, mdiMapMarker, mdiDeleteForever, mdiCloseCircle, mdiPencil, mdiChevronRight, mdiChevronLeft, mdiMagnify, mdiPlus, mdiTagMultiple, mdiMapMarker, mdiDeleteForever, mdiCloseCircle, mdiChevronDown,
loading: false, loading: false,
dialog: false, dialog: false,
valid: false, valid: false,
@@ -128,14 +130,14 @@ export default {
tagName: '', tagName: '',
placeName: '', placeName: '',
collectionHeaders: [ collectionHeaders: [
{ value: 'name', text: 'Name' }, { value: 'name', text: this.$t('common.name') },
{ value: 'filters', text: 'Filters' }, { value: 'filters', text: this.$t('common.filter') },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
], ],
filterHeaders: [ filterHeaders: [
{ value: 'tags', text: 'Tags' }, { value: 'tags', text: this.$t('common.tags') },
{ value: 'places', text: 'Places' }, { value: 'places', text: this.$t('common.places') },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
] ]
} }
}, },

View File

@@ -5,6 +5,7 @@ v-container
v-card-text v-card-text
v-data-table( v-data-table(
:hide-default-footer='unconfirmedEvents.length<10' :hide-default-footer='unconfirmedEvents.length<10'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:items='unconfirmedEvents' :items='unconfirmedEvents'
:headers='headers') :headers='headers')
@@ -17,7 +18,7 @@ v-container
color='error') {{$t('common.delete')}} color='error') {{$t('common.delete')}}
</template> </template>
<script> <script>
import { mdiChevronLeft, mdiChevronRight } from '@mdi/js' import { mdiChevronLeft, mdiChevronRight, mdiChevronDown } from '@mdi/js'
export default { export default {
props: { props: {
@@ -25,15 +26,15 @@ export default {
}, },
data () { data () {
return { return {
mdiChevronLeft, mdiChevronRight, mdiChevronLeft, mdiChevronRight, mdiChevronDown,
valid: false, valid: false,
dialog: false, dialog: false,
editing: false, editing: false,
headers: [ headers: [
{ value: 'title', text: 'Title' }, { value: 'title', text: this.$t('common.title') },
{ value: 'place.name', text: 'Place' }, { value: 'place.name', text: this.$t('common.place') },
{ value: 'when', text: 'When' }, { value: 'when', text: this.$t('common.when') },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
] ]
} }
}, },

View File

@@ -68,6 +68,7 @@ v-container
v-if='settings.trusted_instances.length' v-if='settings.trusted_instances.length'
:hide-default-footer='settings.trusted_instances.length<10' :hide-default-footer='settings.trusted_instances.length<10'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:header-props='{ sortIcon: mdiChevronDown }'
:headers='headers' :headers='headers'
:items='settings.trusted_instances') :items='settings.trusted_instances')
template(v-slot:item.actions="{item}") template(v-slot:item.actions="{item}")
@@ -79,13 +80,13 @@ v-container
import { mapActions, mapState } from 'vuex' import { mapActions, mapState } from 'vuex'
import get from 'lodash/get' import get from 'lodash/get'
import axios from 'axios' import axios from 'axios'
import { mdiDeleteForever, mdiPlus, mdiChevronLeft, mdiChevronRight } from '@mdi/js' import { mdiDeleteForever, mdiPlus, mdiChevronLeft, mdiChevronRight, mdiChevronDown } from '@mdi/js'
export default { export default {
name: 'Federation', name: 'Federation',
data ({ $store, $options }) { data ({ $store, $options }) {
return { return {
mdiDeleteForever, mdiPlus, mdiChevronLeft, mdiChevronRight, mdiDeleteForever, mdiPlus, mdiChevronLeft, mdiChevronRight, mdiChevronDown,
instance_url: '', instance_url: '',
instance_name: $store.state.settings.instance_name, instance_name: $store.state.settings.instance_name,
instance_place: $store.state.settings.instance_place, instance_place: $store.state.settings.instance_place,

View File

@@ -10,6 +10,7 @@ v-container
:items-per-page='5' :items-per-page='5'
:search='instancesFilter' :search='instancesFilter'
:hide-default-footer='instances.length<5' :hide-default-footer='instances.length<5'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
dense :headers='instancesHeader' dense :headers='instancesHeader'
@click:row='instanceSelected') @click:row='instanceSelected')
@@ -24,6 +25,7 @@ v-container
:search='usersFilter' :search='usersFilter'
:hide-default-footer='users.length<5' :hide-default-footer='users.length<5'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:header-props='{ sortIcon: mdiChevronDown }'
dense :headers='usersHeader') dense :headers='usersHeader')
template(v-slot:item.blocked="{ item }") template(v-slot:item.blocked="{ item }")
v-icon(@click='toggleUserBlock(item)' v-text='item.blocked ? mdiCheckboxIntermediate : mdiCheckboxBlankOutline') v-icon(@click='toggleUserBlock(item)' v-text='item.blocked ? mdiCheckboxIntermediate : mdiCheckboxBlankOutline')
@@ -34,6 +36,7 @@ v-container
:headers='resourcesHeader' :headers='resourcesHeader'
:hide-default-footer='resources.length<10' :hide-default-footer='resources.length<10'
:items-per-page='10' :items-per-page='10'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }') :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }')
template(v-slot:item.content='{ item }') template(v-slot:item.content='{ item }')
span(v-html='item.data.content') span(v-html='item.data.content')
@@ -62,33 +65,33 @@ v-container
import { mapState, mapActions } from 'vuex' import { mapState, mapActions } from 'vuex'
import get from 'lodash/get' import get from 'lodash/get'
import { mdiDelete, mdiEye, mdiEyeOff, mdiDotsVertical, mdiCheckboxIntermediate, import { mdiDelete, mdiEye, mdiEyeOff, mdiDotsVertical, mdiCheckboxIntermediate,
mdiCheckboxBlankOutline, mdiChevronLeft, mdiChevronRight } from '@mdi/js' mdiCheckboxBlankOutline, mdiChevronLeft, mdiChevronRight, mdiChevronDown } from '@mdi/js'
export default { export default {
name: 'Moderation', name: 'Moderation',
data () { data () {
return { return {
mdiDelete, mdiEye, mdiEyeOff, mdiDotsVertical, mdiCheckboxIntermediate, mdiDelete, mdiEye, mdiEyeOff, mdiDotsVertical, mdiCheckboxIntermediate,
mdiCheckboxBlankOutline, mdiChevronLeft, mdiChevronRight, mdiCheckboxBlankOutline, mdiChevronLeft, mdiChevronRight, mdiChevronDown,
instances: [], instances: [],
resources: [], resources: [],
users: [], users: [],
usersHeader: [ usersHeader: [
{ value: 'object.preferredUsername', text: 'Name' }, { value: 'object.preferredUsername', text: this.$t('common.name') },
{ value: 'blocked', text: 'Blocked' } { value: 'blocked', text: this.$t('admin.blocked') }
], ],
instancesHeader: [ instancesHeader: [
{ value: 'domain', text: 'Domain' }, { value: 'domain', text: this.$t('admin.domain') },
{ value: 'name', text: 'Name' }, { value: 'name', text: this.$t('common.name') },
{ value: 'blocked', text: 'Blocked' }, { value: 'blocked', text: this.$t('admin.blocked') },
{ value: 'users', text: 'known users' } { value: 'users', text: this.$t('admin.known_users') }
], ],
resourcesHeader: [ resourcesHeader: [
{ value: 'created', text: 'Created' }, { value: 'created', text: this.$t('admin.created_at') },
{ value: 'event', text: 'Event' }, { value: 'event', text: this.$t('common.event') },
{ value: 'user', text: 'user' }, { value: 'user', text: this.$t('common.user') },
{ value: 'content', text: 'Content' }, { value: 'content', text: this.$t('common.content') },
{ value: 'actions', text: 'Actions' } { value: 'actions', text: this.$t('common.actions') }
], ],
usersFilter: '', usersFilter: '',
instancesFilter: '' instancesFilter: ''

View File

@@ -4,7 +4,7 @@ v-container
v-spacer v-spacer
v-text-field(v-model='search' v-text-field(v-model='search'
:append-icon='mdiMagnify' outlined rounded :append-icon='mdiMagnify' outlined rounded
label='Search' :label="$t('common.search')"
single-line hide-details) single-line hide-details)
v-card-subtitle(v-html="$t('admin.place_description')") v-card-subtitle(v-html="$t('admin.place_description')")
@@ -49,6 +49,7 @@ v-container
:headers='headers' :headers='headers'
:items='places' :items='places'
:hide-default-footer='places.length < 5' :hide-default-footer='places.length < 5'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:search='search') :search='search')
template(v-slot:item.map='{ item }') template(v-slot:item.map='{ item }')
@@ -61,7 +62,7 @@ v-container
</template> </template>
<script> <script>
import { mdiPencil, mdiChevronLeft, mdiChevronRight, mdiMagnify, mdiEye, mdiMapSearch } from '@mdi/js' import { mdiPencil, mdiChevronLeft, mdiChevronRight, mdiMagnify, mdiEye, mdiMapSearch, mdiChevronDown } from '@mdi/js'
import { mapState } from 'vuex' import { mapState } from 'vuex'
import debounce from 'lodash/debounce' import debounce from 'lodash/debounce'
import get from 'lodash/get' import get from 'lodash/get'
@@ -69,7 +70,7 @@ import get from 'lodash/get'
export default { export default {
data() { data() {
return { return {
mdiPencil, mdiChevronRight, mdiChevronLeft, mdiMagnify, mdiEye, mdiMapSearch, mdiPencil, mdiChevronRight, mdiChevronLeft, mdiMagnify, mdiEye, mdiMapSearch, mdiChevronDown,
loading: false, loading: false,
dialog: false, dialog: false,
valid: false, valid: false,
@@ -79,10 +80,10 @@ export default {
search: '', search: '',
place: { name: '', address: '', id: null }, place: { name: '', address: '', id: null },
headers: [ headers: [
{ value: 'name', text: 'Name' }, { value: 'name', text: this.$t('common.name') },
{ value: 'address', text: 'Address' }, { value: 'address', text: this.$t('common.address') },
{ value: 'map', text: 'Map' }, { value: 'map', text: 'Map' },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
] ]
} }
}, },

View File

@@ -4,7 +4,7 @@ v-container
v-spacer v-spacer
v-text-field(v-model='search' v-text-field(v-model='search'
:append-icon='mdiMagnify' outlined rounded :append-icon='mdiMagnify' outlined rounded
label='Search' :label="$t('common.search')"
single-line hide-details) single-line hide-details)
v-btn(color='primary' text @click='newUserDialog = true') <v-icon v-text='mdiPlus'></v-icon> {{$t('common.new_user')}} v-btn(color='primary' text @click='newUserDialog = true') <v-icon v-text='mdiPlus'></v-icon> {{$t('common.new_user')}}
@@ -32,6 +32,7 @@ v-container
:headers='headers' :headers='headers'
:items='users' :items='users'
:hide-default-footer='users.length<5' :hide-default-footer='users.length<5'
:header-props='{ sortIcon: mdiChevronDown }'
:footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }' :footer-props='{ prevIcon: mdiChevronLeft, nextIcon: mdiChevronRight }'
:search='search') :search='search')
template(v-slot:item.is_active='{item}') template(v-slot:item.is_active='{item}')
@@ -49,7 +50,7 @@ v-container
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import get from 'lodash/get' import get from 'lodash/get'
import { mdiClose, mdiMagnify, mdiCheck, mdiPlus, mdiInformation, mdiChevronLeft, mdiChevronRight } from '@mdi/js' import { mdiClose, mdiMagnify, mdiCheck, mdiPlus, mdiInformation, mdiChevronLeft, mdiChevronRight, mdiChevronDown } from '@mdi/js'
export default { export default {
name: 'Users', name: 'Users',
@@ -58,7 +59,7 @@ export default {
}, },
data () { data () {
return { return {
mdiClose, mdiMagnify, mdiCheck, mdiPlus, mdiInformation, mdiChevronLeft, mdiChevronRight, mdiClose, mdiMagnify, mdiCheck, mdiPlus, mdiInformation, mdiChevronLeft, mdiChevronRight, mdiChevronDown,
newUserDialog: false, newUserDialog: false,
valid: false, valid: false,
new_user: { new_user: {
@@ -67,10 +68,10 @@ export default {
}, },
search: '', search: '',
headers: [ headers: [
{ value: 'email', text: 'Email' }, { value: 'email', text: this.$t('common.email') },
{ value: 'description', text: 'Description' }, { value: 'description', text: this.$t('common.description') },
{ value: 'is_active', text: 'Active' }, { value: 'is_active', text: 'Active' },
{ value: 'actions', text: 'Actions', align: 'right' } { value: 'actions', text: this.$t('common.actions'), align: 'right' }
] ]
} }
}, },

View File

@@ -3,7 +3,7 @@ span
v-list(dense nav) v-list(dense nav)
v-list-group(:append-icon='mdiChevronUp' :value='true') v-list-group(:append-icon='mdiChevronUp' :value='true')
template(v-slot:activator) template(v-slot:activator)
v-list-item.text-overline Admin actions v-list-item.text-overline {{$t('common.admin_actions')}}
//- Hide / confirm event //- Hide / confirm event
v-list-item(@click='toggle(false)') v-list-item(@click='toggle(false)')
@@ -29,7 +29,7 @@ span
template(v-if='event.parentId') template(v-if='event.parentId')
v-list-item.text-overline Recurring event actions <a href="https://gancio.org/">?</a> v-list-item.text-overline(v-html="$t('common.recurring_event_actions')")
//- Pause / Start to generate recurring event //- Pause / Start to generate recurring event
v-list-item(@click='toggle(true)') v-list-item(@click='toggle(true)')

View File

@@ -94,7 +94,10 @@
"show_map": "Show map", "show_map": "Show map",
"calendar": "Calendar", "calendar": "Calendar",
"home": "Home", "home": "Home",
"about": "About" "about": "About",
"content": "Content",
"admin_actions": "Admin actions",
"recurring_event_actions": "Recurring event actions"
}, },
"login": { "login": {
"description": "By logging in you can publish new events.", "description": "By logging in you can publish new events.",
@@ -183,7 +186,7 @@
"disable_user_confirm": "Are you sure you want to disable {user}?", "disable_user_confirm": "Are you sure you want to disable {user}?",
"delete_user_confirm": "Are you sure you want to remove {user}?", "delete_user_confirm": "Are you sure you want to remove {user}?",
"disable_admin_user_confirm": "Are you sure to remove admin permissions from {user}?", "disable_admin_user_confirm": "Are you sure to remove admin permissions from {user}?",
"enable_admin_user_confirm": "Are sure you want to add admin permissions to {user}?", "enable_admin_user_confirm": "Are you sure to add admin permissions to {user}?",
"user_remove_ok": "User removed", "user_remove_ok": "User removed",
"user_create_ok": "User created", "user_create_ok": "User created",
"event_remove_ok": "Event removed", "event_remove_ok": "Event removed",
@@ -261,7 +264,11 @@
"header_image": "Header image", "header_image": "Header image",
"hide_thumbs": "Hide thumbs", "hide_thumbs": "Hide thumbs",
"hide_calendar": "Hide calendar", "hide_calendar": "Hide calendar",
"default_images": "Default images" "default_images": "Default images",
"blocked": "Blocked",
"domain": "Domain",
"known_users": "Known users",
"created_at": "Created at"
}, },
"auth": { "auth": {
"not_confirmed": "Not confirmed yet…", "not_confirmed": "Not confirmed yet…",

View File

@@ -88,6 +88,7 @@
"max_events": "N. massimo eventi", "max_events": "N. massimo eventi",
"label": "Etichetta", "label": "Etichetta",
"collections": "Bolle", "collections": "Bolle",
"plugins": "Plugin",
"help_translate": "Aiuta a tradurre", "help_translate": "Aiuta a tradurre",
"show_map": "Mostra mappa", "show_map": "Mostra mappa",
"latitude": "Latitudine", "latitude": "Latitudine",
@@ -136,7 +137,8 @@
"added_anon": "Evento aggiunto, verrà confermato quanto prima.", "added_anon": "Evento aggiunto, verrà confermato quanto prima.",
"updated": "Evento aggiornato", "updated": "Evento aggiornato",
"where_description": "Dov'è il gancio? Se il posto non è presente potrai crearlo.", "where_description": "Dov'è il gancio? Se il posto non è presente potrai crearlo.",
"coordinates_search": "Ricerca coordinate", "address_description": "A che indirizzo?",
"address_description_osm": "A che indirizzo? ((<a href='http://osm.org/copyright'>OpenStreetMap</a>)",
"coordinates_search_description": "Puoi ricercare il posto per nome, o incollare la coppia di coordinate.", "coordinates_search_description": "Puoi ricercare il posto per nome, o incollare la coppia di coordinate.",
"confirmed": "Evento confermato", "confirmed": "Evento confermato",
"not_found": "Evento non trovato", "not_found": "Evento non trovato",
@@ -250,7 +252,12 @@
"wrong_domain_warning": "Il \"baseurl\" configurato in config.json <b>({baseurl})</b> è diverso da quello che stai visitando <b>({url})</b>", "wrong_domain_warning": "Il \"baseurl\" configurato in config.json <b>({baseurl})</b> è diverso da quello che stai visitando <b>({url})</b>",
"collections_description": "Le bolle sono raggruppamenti di eventi per tag e posti.", "collections_description": "Le bolle sono raggruppamenti di eventi per tag e posti.",
"edit_collection": "Modifica bolla", "edit_collection": "Modifica bolla",
"config_plugin": "Configura plugin" "config_plugin": "Configura plugin",
"fallback_image": "Immagine di ripiego",
"header_image": "Immagine di intestazione",
"hide_thumbs": "Nascondi immaginine",
"hide_calendar": "Nascondi calendario",
"default_images": "Immagini preimpostate"
}, },
"auth": { "auth": {
"not_confirmed": "Non ancora confermato…", "not_confirmed": "Non ancora confermato…",

View File

@@ -2,6 +2,8 @@ const config = require('./server/config.js')
const minifyTheme = require('minify-css-string').default const minifyTheme = require('minify-css-string').default
const locales = require('./locales/index') const locales = require('./locales/index')
import { ca, de, en, es, eu, fr, gl, it, nb, pl, pt, sk, zhHans } from 'vuetify/lib/locale'
const isDev = (process.env.NODE_ENV !== 'production') const isDev = (process.env.NODE_ENV !== 'production')
module.exports = { module.exports = {
telemetry: false, telemetry: false,
@@ -43,6 +45,7 @@ module.exports = {
'@/plugins/axios', // axios baseurl configuration '@/plugins/axios', // axios baseurl configuration
'@/plugins/validators', // inject validators '@/plugins/validators', // inject validators
'@/plugins/api', // api helpers '@/plugins/api', // api helpers
'@/plugins/i18n',
{ src: '@/plugins/v-calendar', ssr: false } // v-calendar { src: '@/plugins/v-calendar', ssr: false } // v-calendar
], ],
@@ -51,7 +54,7 @@ module.exports = {
*/ */
modules: [ modules: [
// Doc: https://axios.nuxtjs.org/usage // Doc: https://axios.nuxtjs.org/usage
'nuxt-i18n', '@nuxtjs/i18n',
'@nuxtjs/axios', '@nuxtjs/axios',
'@nuxtjs/auth', '@nuxtjs/auth',
'@nuxtjs/sitemap' '@nuxtjs/sitemap'
@@ -88,7 +91,8 @@ module.exports = {
iso: key iso: key
})), })),
vueI18n: { vueI18n: {
fallbackLocale: 'en' fallbackLocale: 'en',
silentTranslationWarn: true
}, },
langDir: 'locales', langDir: 'locales',
lazy: true, lazy: true,
@@ -137,6 +141,7 @@ module.exports = {
}, },
buildModules: ['@nuxtjs/vuetify'], buildModules: ['@nuxtjs/vuetify'],
vuetify: { vuetify: {
lang: { locales: { ca, de, en, es, eu, fr, gl, it, nb, pl, pt, sk, zhHans } },
treeShake: true, treeShake: true,
theme: { theme: {
options: { options: {

View File

@@ -37,18 +37,19 @@
"@mdi/js": "^7.0.96", "@mdi/js": "^7.0.96",
"@nuxtjs/auth": "^4.9.1", "@nuxtjs/auth": "^4.9.1",
"@nuxtjs/axios": "^5.13.5", "@nuxtjs/axios": "^5.13.5",
"@nuxtjs/i18n": "^7.3.0",
"@nuxtjs/sitemap": "^2.4.0", "@nuxtjs/sitemap": "^2.4.0",
"accept-language": "^3.0.18", "accept-language": "^3.0.18",
"axios": "^0.27.2", "axios": "^0.27.2",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"body-parser": "^1.20.0", "body-parser": "^1.20.0",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cookie-session": "^2.0.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"dayjs": "^1.11.5", "dayjs": "^1.11.5",
"dompurify": "^2.4.1", "dompurify": "^2.4.1",
"email-templates": "^10.0.1", "email-templates": "^10.0.1",
"express": "^4.18.1", "express": "^4.18.1",
"express-session": "^1.17.3",
"http-signature": "^1.3.6", "http-signature": "^1.3.6",
"https-proxy-agent": "^5.0.1", "https-proxy-agent": "^5.0.1",
"ical.js": "^1.5.0", "ical.js": "^1.5.0",
@@ -67,7 +68,6 @@
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"mysql2": "^2.3.3", "mysql2": "^2.3.3",
"nuxt-edge": "2.16.0-27720022.54e852f", "nuxt-edge": "2.16.0-27720022.54e852f",
"nuxt-i18n": "^6.28.1",
"oauth2orize": "^1.11.1", "oauth2orize": "^1.11.1",
"passport": "^0.6.0", "passport": "^0.6.0",
"passport-anonymous": "^1.0.1", "passport-anonymous": "^1.0.1",

View File

@@ -61,7 +61,7 @@ export default ({ app, store }) => {
Vue.filter('recurrentDetail', event => { Vue.filter('recurrentDetail', event => {
const parent = event.parent const parent = event.parent
if (!parent.frequency || !parent.type) return if (!parent.recurrent.frequency) return
const { frequency, type } = parent.recurrent const { frequency, type } = parent.recurrent
let recurrent let recurrent
if (frequency === '1w' || frequency === '2w') { if (frequency === '1w' || frequency === '2w') {

View File

@@ -1,35 +1,36 @@
import Vue from 'vue' export default async ({ app, store, res, $vuetify }) => {
import VueI18n from 'vue-i18n'
import merge from 'lodash/merge'
Vue.use(VueI18n) $vuetify.lang.current = app.i18n.locale
export default async ({ app, store, res }) => { app.i18n.onLanguageSwitched = (oldLocale, newLocale) => {
const messages = {} $vuetify.lang.current = newLocale
if (process.server) {
if (res.locals) {
store.commit('setLocale', res.locals.acceptedLocale)
if (res.locals.user_locale) {
store.commit('setUserLocale', res.locals.user_locale)
}
}
} }
messages[store.state.locale] = await import(/* webpackChunkName: "lang-[request]" */`../locales/${store.state.locale}.json`) // const messages = {}
// if (process.server) {
// if (res.locals) {
// store.commit('setLocale', res.locals.acceptedLocale)
// if (res.locals.user_locale) {
// store.commit('setUserLocale', res.locals.user_locale)
// }
// }
// }
// messages[store.state.locale] = await import(/* webpackChunkName: "lang-[request]" */`../locales/${store.state.locale}.json`)
// always include en fallback locale // always include en fallback locale
if (store.state.locale !== 'en') { // if (store.state.locale !== 'en') {
messages.en = await import('../locales/en.json') // messages.en = await import('../locales/en.json')
} // }
if (store.state.user_locale) { // if (store.state.user_locale) {
merge(messages[store.state.locale], store.state.user_locale) // merge(messages[store.state.locale], store.state.user_locale)
} // }
// Set i18n instance on app // Set i18n instance on app
app.i18n = new VueI18n({ // app.i18n = new VueI18n({
locale: store.state.locale, // locale: store.state.locale,
fallbackLocale: 'en', // fallbackLocale: 'en',
messages // messages
}) // })
} }

View File

@@ -7,7 +7,7 @@ const sharp = require('sharp')
const config = require('../../config') const config = require('../../config')
const generateKeyPair = promisify(crypto.generateKeyPair) const generateKeyPair = promisify(crypto.generateKeyPair)
const log = require('../../log') const log = require('../../log')
const locales = require('../../../locales/index') // const locales = require('../../../locales/index')
const escape = require('lodash/escape') const escape = require('lodash/escape')
const pluginController = require('./plugins') const pluginController = require('./plugins')
@@ -99,18 +99,18 @@ const settingsController = {
} }
// initialize user_locale // initialize user_locale
if (config.user_locale && fs.existsSync(path.resolve(config.user_locale))) { // if (config.user_locale && fs.existsSync(path.resolve(config.user_locale))) {
const user_locales_files = fs.readdirSync(path.resolve(config.user_locale)) // const user_locales_files = fs.readdirSync(path.resolve(config.user_locale))
user_locales_files.forEach( f => { // user_locales_files.forEach( f => {
const locale = path.basename(f ,'.json') // const locale = path.basename(f ,'.json')
if (locales[locale]) { // if (locales[locale]) {
log.info(`Adding custom locale ${locale}`) // log.info(`Adding custom locale ${locale}`)
settingsController.user_locale[locale] = require(path.resolve(config.user_locale, f)).default // settingsController.user_locale[locale] = require(path.resolve(config.user_locale, f)).default
} else { // } else {
log.warning(`Unknown custom user locale: ${locale} [valid locales are ${locales}]`) // log.warning(`Unknown custom user locale: ${locale} [valid locales are ${locales}]`)
} // }
}) // })
} // }
pluginController._load() pluginController._load()
}, },

View File

@@ -96,7 +96,7 @@ module.exports = {
about: settings.about about: settings.about
} }
// set user locale // set user locale
res.locals.user_locale = settingsController.user_locale[res.locals.acceptedLocale] // res.locals.user_locale = settingsController.user_locale[res.locals.acceptedLocale]
dayjs.tz.setDefault(res.locals.settings.instance_timezone) dayjs.tz.setDefault(res.locals.settings.instance_timezone)
next() next()
}, },

View File

@@ -1,7 +1,6 @@
import dayjs from 'dayjs' import dayjs from 'dayjs'
export const state = () => ({ export const state = () => ({
user_locale: {},
settings: { settings: {
instance_timezone: 'Europe/Rome', instance_timezone: 'Europe/Rome',
instance_name: '', instance_name: '',
@@ -29,9 +28,6 @@ export const mutations = {
setSetting (state, setting) { setSetting (state, setting) {
state.settings[setting.key] = setting.value state.settings[setting.key] = setting.value
}, },
setUserlocale (state, messages) {
state.user_locale = messages
},
setAnnouncements (state, announcements) { setAnnouncements (state, announcements) {
state.announcements = announcements state.announcements = announcements
}, },

126
yarn.lock
View File

@@ -262,7 +262,7 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.14.9", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.4", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
version "7.20.3" version "7.20.3"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2"
integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==
@@ -933,7 +933,7 @@
"@babel/parser" "^7.18.10" "@babel/parser" "^7.18.10"
"@babel/types" "^7.18.10" "@babel/types" "^7.18.10"
"@babel/traverse@^7.14.9", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": "@babel/traverse@^7.18.10", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2":
version "7.20.1" version "7.20.1"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8"
integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==
@@ -1744,6 +1744,24 @@
consola "^2.15.3" consola "^2.15.3"
defu "^5.0.0" defu "^5.0.0"
"@nuxtjs/i18n@^7.3.0":
version "7.3.0"
resolved "https://registry.yarnpkg.com/@nuxtjs/i18n/-/i18n-7.3.0.tgz#49ddaaf5c39a0eb60e59515bbdebb0a94845cc06"
integrity sha512-KBmFzgHjaJ/b+I/nISWUkAxcigjc5FiR1ScRzq/eC8Ahxi5zIulfF8vRROmYbW1gP6B2yYBblOuWemW/T/YM0A==
dependencies:
"@babel/parser" "^7.18.10"
"@babel/traverse" "^7.18.10"
"@intlify/vue-i18n-extensions" "^1.0.2"
"@intlify/vue-i18n-loader" "^1.1.0"
cookie "^0.5.0"
devalue "^2.0.1"
is-https "^4.0.0"
js-cookie "^3.0.1"
klona "^2.0.5"
lodash.merge "^4.6.2"
ufo "^0.8.5"
vue-i18n "^8.27.2"
"@nuxtjs/proxy@^2.1.0": "@nuxtjs/proxy@^2.1.0":
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/@nuxtjs/proxy/-/proxy-2.1.0.tgz#fa7715a11d237fa1273503c4e9e137dd1bf5575b" resolved "https://registry.yarnpkg.com/@nuxtjs/proxy/-/proxy-2.1.0.tgz#fa7715a11d237fa1273503c4e9e137dd1bf5575b"
@@ -3805,6 +3823,16 @@ cookie-parser@^1.4.6:
cookie "0.4.1" cookie "0.4.1"
cookie-signature "1.0.6" cookie-signature "1.0.6"
cookie-session@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/cookie-session/-/cookie-session-2.0.0.tgz#d07aa27822f43619e4342df1342268c849833089"
integrity sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==
dependencies:
cookies "0.8.0"
debug "3.2.7"
on-headers "~1.0.2"
safe-buffer "5.2.1"
cookie-signature@1.0.6: cookie-signature@1.0.6:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
@@ -3815,12 +3843,7 @@ cookie@0.4.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
cookie@0.4.2, cookie@^0.4.0, cookie@^0.4.1: cookie@0.5.0, cookie@^0.5.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
cookie@0.5.0:
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
@@ -3830,11 +3853,24 @@ cookie@^0.3.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==
cookie@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
cookiejar@^2.1.3: cookiejar@^2.1.3:
version "2.1.3" version "2.1.3"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc"
integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==
cookies@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
dependencies:
depd "~2.0.0"
keygrip "~1.1.0"
copy-concurrently@^1.0.0: copy-concurrently@^1.0.0:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -4270,6 +4306,13 @@ debug@2.6.9, debug@2.x.x, debug@^2.2.0, debug@^2.3.3:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "^2.1.1"
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4:
version "4.3.4" version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
@@ -5064,20 +5107,6 @@ expect@^29.3.1:
jest-message-util "^29.3.1" jest-message-util "^29.3.1"
jest-util "^29.3.1" jest-util "^29.3.1"
express-session@^1.17.3:
version "1.17.3"
resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36"
integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==
dependencies:
cookie "0.4.2"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~2.0.0"
on-headers "~1.0.2"
parseurl "~1.3.3"
safe-buffer "5.2.1"
uid-safe "~2.1.5"
express@^4.18.1: express@^4.18.1:
version "4.18.2" version "4.18.2"
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
@@ -7141,7 +7170,7 @@ js-cookie@^2.2.1:
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
js-cookie@^3.0.0: js-cookie@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
@@ -7358,6 +7387,13 @@ jws@^3.2.2:
jwa "^1.4.1" jwa "^1.4.1"
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
keygrip@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
dependencies:
tsscmp "1.0.6"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2" version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -7387,7 +7423,7 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
klona@^2.0.4: klona@^2.0.4, klona@^2.0.5:
version "2.0.5" version "2.0.5"
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
@@ -8613,24 +8649,6 @@ nuxt-edge@2.16.0-27720022.54e852f:
"@nuxt/vue-renderer-edge" "2.16.0-27720022.54e852f" "@nuxt/vue-renderer-edge" "2.16.0-27720022.54e852f"
"@nuxt/webpack-edge" "2.16.0-27720022.54e852f" "@nuxt/webpack-edge" "2.16.0-27720022.54e852f"
nuxt-i18n@^6.28.1:
version "6.28.1"
resolved "https://registry.yarnpkg.com/nuxt-i18n/-/nuxt-i18n-6.28.1.tgz#63e3e809fa41d855c5c7c443c0074eecaa97d273"
integrity sha512-JKRs8AmixVZ7k90Rrwq468McfnInP1ymuejYHRGA4VV0nZCLYsdDQXZxXl3JXaER9VatM9C24GM3ArAYFOtUhg==
dependencies:
"@babel/parser" "^7.14.9"
"@babel/traverse" "^7.14.9"
"@intlify/vue-i18n-extensions" "^1.0.2"
"@intlify/vue-i18n-loader" "^1.1.0"
cookie "^0.4.1"
devalue "^2.0.1"
is-https "^4.0.0"
js-cookie "^3.0.0"
klona "^2.0.4"
lodash.merge "^4.6.2"
ufo "^0.7.7"
vue-i18n "^8.25.0"
nwsapi@^2.2.2: nwsapi@^2.2.2:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0"
@@ -10422,11 +10440,6 @@ randexp@0.4.6:
discontinuous-range "1.0.0" discontinuous-range "1.0.0"
ret "~0.1.10" ret "~0.1.10"
random-bytes@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -12061,6 +12074,11 @@ tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
tsscmp@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
tty-browserify@0.0.0: tty-browserify@0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -12143,11 +12161,6 @@ uc.micro@^1.0.1:
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
ufo@^0.7.7:
version "0.7.11"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.7.11.tgz#17defad497981290383c5d26357773431fdbadcb"
integrity sha512-IT3q0lPvtkqQ8toHQN/BkOi4VIqoqheqM1FnkNWT9y0G8B3xJhwnoKBu5OHx8zHDOvveQzfKuFowJ0VSARiIDg==
ufo@^0.8.5: ufo@^0.8.5:
version "0.8.6" version "0.8.6"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.8.6.tgz#c0ec89bc0e0c9fa59a683680feb0f28b55ec323b" resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.8.6.tgz#c0ec89bc0e0c9fa59a683680feb0f28b55ec323b"
@@ -12158,13 +12171,6 @@ uglify-js@^3.5.1:
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"
integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==
uid-safe@~2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==
dependencies:
random-bytes "~1.0.0"
uid2@0.0.x: uid2@0.0.x:
version "0.0.4" version "0.0.4"
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44"
@@ -12482,7 +12488,7 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
vue-i18n@^8.25.0: vue-i18n@^8.27.2:
version "8.28.2" version "8.28.2"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.28.2.tgz#913558066e274395c0a9f40b2f3393d5c2636840" resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.28.2.tgz#913558066e274395c0a9f40b2f3393d5c2636840"
integrity sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA== integrity sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==