Răsfoiți Sursa

feat: browse tags localization

Nick 5 ani în urmă
părinte
comite
d89bf1ab71
5 a modificat fișierele cu 154 adăugiri și 151 ștergeri
  1. 87 97
      client/components/common/nav-header.vue
  2. 1 0
      client/components/editor.vue
  3. 25 22
      client/components/tags.vue
  4. 1 1
      package.json
  5. 40 31
      yarn.lock

+ 87 - 97
client/components/common/nav-header.vue

@@ -7,7 +7,7 @@
         clearable
         clearable
         background-color='deep-purple'
         background-color='deep-purple'
         color='white'
         color='white'
-        label='Search...'
+        :label='$t(`common:header.search`)'
         single-line
         single-line
         solo
         solo
         flat
         flat
@@ -22,41 +22,19 @@
           v-menu(open-on-hover, offset-y, bottom, left, min-width='250', transition='slide-y-transition')
           v-menu(open-on-hover, offset-y, bottom, left, min-width='250', transition='slide-y-transition')
             template(v-slot:activator='{ on }')
             template(v-slot:activator='{ on }')
               v-app-bar-nav-icon.btn-animate-app(v-on='on', :class='$vuetify.rtl ? `mx-0` : ``')
               v-app-bar-nav-icon.btn-animate-app(v-on='on', :class='$vuetify.rtl ? `mx-0` : ``')
-                v-icon mdi-menu-open
+                v-icon mdi-menu
             v-list(nav, :light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark', :class='$vuetify.theme.dark ? `grey darken-4` : ``')
             v-list(nav, :light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark', :class='$vuetify.theme.dark ? `grey darken-4` : ``')
               v-list-item.pl-4(href='/')
               v-list-item.pl-4(href='/')
                 v-list-item-avatar(size='24'): v-icon(color='blue') mdi-home
                 v-list-item-avatar(size='24'): v-icon(color='blue') mdi-home
                 v-list-item-title.body-2 {{$t('common:header.home')}}
                 v-list-item-title.body-2 {{$t('common:header.home')}}
-              v-list-item.pl-4(@click='pageNew', v-if='isAuthenticated')
-                v-list-item-avatar(size='24'): v-icon(color='green') mdi-file-document-box-plus-outline
-                v-list-item-title.body-2 {{$t('common:header.newPage')}}
-              template(v-if='path && path.length')
-                v-divider.my-0
-                .overline.pa-4.grey--text {{$t('common:header.currentPage')}}
-                v-list-item.pl-4(@click='pageView', v-if='mode !== `view`')
-                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-file-document-box-outline
-                  v-list-item-title.body-2 {{$t('common:header.view')}}
-                v-list-item.pl-4(@click='pageEdit', v-if='mode !== `edit` && isAuthenticated')
-                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-file-document-edit-outline
-                  v-list-item-title.body-2 {{$t('common:header.edit')}}
-                v-list-item.pl-4(@click='pageHistory', v-if='mode !== `history`')
-                  v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-history
-                  v-list-item-content
-                    v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.history')}}
-                    v-list-item-subtitle.overline.grey--text.text--lighten-2 Coming soon
-                v-list-item.pl-4(@click='pageSource', v-if='mode !== `source`')
-                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-code-tags
-                  v-list-item-title.body-2 {{$t('common:header.viewSource')}}
-                v-list-item.pl-4(@click='pageMove', v-if='isAuthenticated')
-                  v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-content-save-move-outline
-                  v-list-item-content
-                    v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.move')}}
-                    v-list-item-subtitle.overline.grey--text.text--lighten-2 Coming soon
-                v-list-item.pl-4(@click='pageDelete', v-if='isAuthenticated')
-                  v-list-item-avatar(size='24'): v-icon(color='red darken-2') mdi-trash-can-outline
-                  v-list-item-title.body-2 {{$t('common:header.delete')}}
-              v-divider.my-0
-              .overline.pa-4.grey--text {{$t('common:header.assets')}}
+              v-list-item.pl-4(@click='')
+                v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-file-tree
+                v-list-item-content
+                  v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.siteMap')}}
+                  v-list-item-subtitle.overline.grey--text.text--lighten-2 Coming soon
+              v-list-item.pl-4(href='/t')
+                v-list-item-avatar(size='24'): v-icon(color='teal') mdi-tag-multiple
+                v-list-item-title.body-2 {{$t('common:header.browseTags')}}
               v-list-item.pl-4(@click='assets')
               v-list-item.pl-4(@click='assets')
                 v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-folder-multiple-image
                 v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-folder-multiple-image
                 v-list-item-content
                 v-list-item-content
@@ -88,89 +66,98 @@
                 @keyup.down='searchMove(`down`)'
                 @keyup.down='searchMove(`down`)'
                 @keyup.up='searchMove(`up`)'
                 @keyup.up='searchMove(`up`)'
               )
               )
-            //- v-menu(
-            //-   v-model='searchAdvMenuShown'
-            //-   left
-            //-   offset-y
-            //-   min-width='450'
-            //-   :close-on-content-click='false'
-            //-   nudge-bottom='7'
-            //-   nudge-right='5'
-            //-   v-if='searchIsShown'
-            //-   )
-            //-   template(v-slot:activator='{ on }')
-            //-     v-btn.nav-header-search-adv(icon, color='grey darken-2', v-on='on')
-            //-       v-icon(color='white') mdi-chevron-down
-            //-   v-card.radius-0(dark)
-            //-     v-toolbar(flat, color='grey darken-4', dense)
-            //-       v-icon.mr-2 mdi-feature-search-outline
-            //-       v-subheader.pl-0 Advanced Search
-            //-       v-spacer
-            //-       v-chip(label, small, color='primary') Coming soon
-            //-     v-card-text.pa-4
-            //-       v-checkbox.mt-0(
-            //-         label='Restrict to current language'
-            //-         color='white'
-            //-         v-model='searchRestrictLocale'
-            //-         hide-details
-            //-       )
-            //-       v-checkbox(
-            //-         label='Search below current path only'
-            //-         color='white'
-            //-         v-model='searchRestrictPath'
-            //-         hide-details
-            //-       )
-            //-     v-divider
-            //-     v-card-actions.grey.darken-3-d4
-            //-       v-container.pa-0(grid-list-md)
-            //-         v-layout(row)
-            //-           v-flex(xs6)
-            //-             v-btn(depressed, color='grey darken-3', block)
-            //-               v-icon(left) mdi-chevron-right
-            //-               span Save as defaults
-            //-           v-flex(xs6)
-            //-             v-btn(depressed, color='grey darken-3', block)
-            //-               v-icon(left) mdi-cached
-            //-               span Reset
-            v-tooltip(bottom, v-if='isAuthenticated && isAdmin')
+            v-tooltip(bottom)
               template(v-slot:activator='{ on }')
               template(v-slot:activator='{ on }')
                 v-btn.ml-2.mr-0(icon, v-on='on', href='/t')
                 v-btn.ml-2.mr-0(icon, v-on='on', href='/t')
                   v-icon(color='grey') mdi-tag-multiple
                   v-icon(color='grey') mdi-tag-multiple
-              span Browse Tags
+              span {{$t('common:header.browseTags')}}
       v-flex(xs6, md4)
       v-flex(xs6, md4)
         v-toolbar.nav-header-inner.pr-4(color='black', dark, flat)
         v-toolbar.nav-header-inner.pr-4(color='black', dark, flat)
           v-spacer
           v-spacer
           .navHeaderLoading.mr-3
           .navHeaderLoading.mr-3
             v-progress-circular(indeterminate, color='blue', :size='22', :width='2' v-show='isLoading')
             v-progress-circular(indeterminate, color='blue', :size='22', :width='2' v-show='isLoading')
+
           slot(name='actions')
           slot(name='actions')
+
+          //- (mobile) SEARCH TOGGLE
+
           v-btn(
           v-btn(
             v-if='!hideSearch && $vuetify.breakpoint.smAndDown'
             v-if='!hideSearch && $vuetify.breakpoint.smAndDown'
             @click='searchToggle'
             @click='searchToggle'
             icon
             icon
             )
             )
             v-icon(color='grey') mdi-magnify
             v-icon(color='grey') mdi-magnify
-          v-menu(offset-y, left, transition='slide-y-transition', v-if='mode === `view` && locales.length > 0')
-            template(v-slot:activator='{ on: menu }')
-              v-tooltip(bottom)
-                template(v-slot:activator='{ on: tooltip }')
-                  v-btn(icon, v-on='{ ...menu, ...tooltip }', :class='$vuetify.rtl ? `ml-3` : ``')
-                    v-icon(color='grey') mdi-web
-                span {{$t('common:header.language')}}
-            v-list(nav)
-              template(v-for='(lc, idx) of locales')
-                v-list-item(@click='changeLocale(lc)')
-                  v-list-item-action: v-chip(:color='lc.code === locale ? `blue` : `grey`', small, label, dark) {{lc.code.toUpperCase()}}
-                  v-list-item-title {{lc.name}}
-          v-tooltip(bottom, v-if='isAuthenticated && isAdmin')
-            template(v-slot:activator='{ on }')
-              v-btn.btn-animate-rotate(icon, href='/a', v-on='on', :class='$vuetify.rtl ? `ml-3` : ``')
-                v-icon(color='grey') mdi-settings
-            span {{$t('common:header.admin')}}
-          v-menu(v-if='isAuthenticated', offset-y, min-width='300', left, transition='slide-y-transition')
+
+          //- LANGUAGES
+
+          template(v-if='mode === `view` && locales.length > 0')
+            v-menu(offset-y, bottom, nudge-bottom='30', transition='slide-y-transition')
+              template(v-slot:activator='{ on: menu }')
+                v-tooltip(bottom)
+                  template(v-slot:activator='{ on: tooltip }')
+                    v-btn(icon, v-on='{ ...menu, ...tooltip }', :class='$vuetify.rtl ? `ml-3` : ``', tile, height='64')
+                      v-icon(color='grey') mdi-web
+                  span {{$t('common:header.language')}}
+              v-list(nav)
+                template(v-for='(lc, idx) of locales')
+                  v-list-item(@click='changeLocale(lc)')
+                    v-list-item-action: v-chip(:color='lc.code === locale ? `blue` : `grey`', small, label, dark) {{lc.code.toUpperCase()}}
+                    v-list-item-title {{lc.name}}
+            v-divider(vertical)
+
+          //- PAGE ACTIONS
+
+          template(v-if='isAuthenticated && path')
+            v-menu(offset-y, bottom, nudge-bottom='30', transition='slide-y-transition')
+              template(v-slot:activator='{ on: menu }')
+                v-tooltip(bottom)
+                  template(v-slot:activator='{ on: tooltip }')
+                    v-btn(icon, v-on='{ ...menu, ...tooltip }', :class='$vuetify.rtl ? `ml-3` : ``', tile, height='64')
+                      v-icon(color='grey') mdi-file-document-edit-outline
+                  span {{$t('common:header.pageActions')}}
+              v-list(nav, :light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark', :class='$vuetify.theme.dark ? `grey darken-4` : ``')
+                .overline.pa-4.grey--text {{$t('common:header.currentPage')}}
+                v-list-item.pl-4(@click='pageView', v-if='mode !== `view`')
+                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-file-document-box-outline
+                  v-list-item-title.body-2 {{$t('common:header.view')}}
+                v-list-item.pl-4(@click='pageEdit', v-if='mode !== `edit` && isAuthenticated')
+                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-file-document-edit-outline
+                  v-list-item-title.body-2 {{$t('common:header.edit')}}
+                v-list-item.pl-4(@click='pageHistory', v-if='mode !== `history`')
+                  v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-history
+                  v-list-item-content
+                    v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.history')}}
+                    v-list-item-subtitle.overline.grey--text.text--lighten-2 Coming soon
+                v-list-item.pl-4(@click='pageSource', v-if='mode !== `source`')
+                  v-list-item-avatar(size='24'): v-icon(color='indigo') mdi-code-tags
+                  v-list-item-title.body-2 {{$t('common:header.viewSource')}}
+                v-list-item.pl-4(@click='pageMove', v-if='isAuthenticated')
+                  v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-content-save-move-outline
+                  v-list-item-content
+                    v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.move')}}
+                    v-list-item-subtitle.overline.grey--text.text--lighten-2 Coming soon
+                v-list-item.pl-4(@click='pageDelete', v-if='isAuthenticated')
+                  v-list-item-avatar(size='24'): v-icon(color='red darken-2') mdi-trash-can-outline
+                  v-list-item-title.body-2 {{$t('common:header.delete')}}
+            v-divider(vertical)
+
+          //- NEW PAGE
+
+          template(v-if='isAuthenticated')
+            v-tooltip(bottom)
+              template(v-slot:activator='{ on }')
+                v-btn(icon, tile, height='64', v-on='on', @click='pageNew')
+                  v-icon(color='grey') mdi-file-document-box-plus-outline
+              span {{$t('common:header.newPage')}}
+            v-divider(vertical)
+
+          //- ACCOUNT
+
+          v-menu(v-if='isAuthenticated', offset-y, bottom, nudge-bottom='30', min-width='300', transition='slide-y-transition')
             template(v-slot:activator='{ on: menu }')
             template(v-slot:activator='{ on: menu }')
               v-tooltip(bottom)
               v-tooltip(bottom)
                 template(v-slot:activator='{ on: tooltip }')
                 template(v-slot:activator='{ on: tooltip }')
-                  v-btn(icon, v-on='{ ...menu, ...tooltip }', :class='$vuetify.rtl ? `ml-0` : ``')
+                  v-btn(icon, v-on='{ ...menu, ...tooltip }', :class='$vuetify.rtl ? `ml-0` : ``', tile, height='64')
                     v-icon(v-if='picture.kind === `initials`', color='grey') mdi-account-circle
                     v-icon(v-if='picture.kind === `initials`', color='grey') mdi-account-circle
                     v-avatar(v-else-if='picture.kind === `image`', :size='34')
                     v-avatar(v-else-if='picture.kind === `image`', :size='34')
                       v-img(:src='picture.url')
                       v-img(:src='picture.url')
@@ -195,6 +182,9 @@
                 v-list-item-content
                 v-list-item-content
                   v-list-item-title {{$t('common:header.profile')}}
                   v-list-item-title {{$t('common:header.profile')}}
                   v-list-item-subtitle.overline Coming soon
                   v-list-item-subtitle.overline Coming soon
+              v-list-item(href='/a', v-if='isAuthenticated && isAdmin')
+                v-list-item-action.btn-animate-rotate: v-icon(color='blue-grey') mdi-settings
+                v-list-item-title.blue-grey--text {{$t('common:header.admin')}}
               v-list-item(@click='logout')
               v-list-item(@click='logout')
                 v-list-item-action: v-icon(color='red') mdi-logout
                 v-list-item-action: v-icon(color='red') mdi-logout
                 v-list-item-title.red--text {{$t('common:header.logout')}}
                 v-list-item-title.red--text {{$t('common:header.logout')}}

+ 1 - 0
client/components/editor.vue

@@ -31,6 +31,7 @@
           )
           )
           v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') mdi-close
           v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') mdi-close
           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.close') }}
           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.close') }}
+        v-divider(vertical)
     v-content
     v-content
       component(:is='currentEditor', :save='save')
       component(:is='currentEditor', :save='save')
       editor-modal-properties(v-model='dialogProps')
       editor-modal-properties(v-model='dialogProps')

+ 25 - 22
client/components/tags.vue

@@ -18,7 +18,7 @@
     v-content.grey(:class='$vuetify.theme.dark ? `darken-4-d5` : `lighten-3`')
     v-content.grey(:class='$vuetify.theme.dark ? `darken-4-d5` : `lighten-3`')
       v-toolbar(color='primary', dark, flat, height='58')
       v-toolbar(color='primary', dark, flat, height='58')
         template(v-if='selection.length > 0')
         template(v-if='selection.length > 0')
-          .overline.mr-3.animated.fadeInLeft Current Selection
+          .overline.mr-3.animated.fadeInLeft {{$t('tags:currentSelection')}}
           v-chip.mr-3.primary--text(
           v-chip.mr-3.primary--text(
             v-for='tag of tagsSelected'
             v-for='tag of tagsSelected'
             :key='`tagSelected-` + tag.tag'
             :key='`tagSelected-` + tag.tag'
@@ -35,14 +35,14 @@
             @click='selection = []'
             @click='selection = []'
             )
             )
             v-icon(left) mdi-close
             v-icon(left) mdi-close
-            span Clear Selection
+            span {{$t('tags:clearSelection')}}
         template(v-else)
         template(v-else)
           v-icon.mr-3.animated.fadeInRight mdi-arrow-left
           v-icon.mr-3.animated.fadeInRight mdi-arrow-left
-          .overline.animated.fadeInRight Select one or more tags
+          .overline.animated.fadeInRight {{$t('tags:selectOneMoreTags')}}
       v-toolbar(:color='$vuetify.theme.dark ? `grey darken-4-l5` : `grey lighten-4`', flat, height='58')
       v-toolbar(:color='$vuetify.theme.dark ? `grey darken-4-l5` : `grey lighten-4`', flat, height='58')
         v-text-field.tags-search(
         v-text-field.tags-search(
           v-model='innerSearch'
           v-model='innerSearch'
-          label='Search within results...'
+          :label='$t(`tags:searchWithinResultsPlaceholder`)'
           solo
           solo
           hide-details
           hide-details
           flat
           flat
@@ -55,13 +55,13 @@
         )
         )
         template(v-if='locales.length > 1')
         template(v-if='locales.length > 1')
           v-divider.mx-3(vertical)
           v-divider.mx-3(vertical)
-          .overline Locale
+          .overline {{$t('tags:locale')}}
           v-select.ml-2(
           v-select.ml-2(
             :items='locales'
             :items='locales'
             v-model='locale'
             v-model='locale'
             :background-color='$vuetify.theme.dark ? `grey darken-3` : `white`'
             :background-color='$vuetify.theme.dark ? `grey darken-3` : `white`'
             hide-details
             hide-details
-            label='Locale'
+            :label='$t(`tags:locale`)'
             item-text='name'
             item-text='name'
             item-value='code'
             item-value='code'
             rounded
             rounded
@@ -71,13 +71,13 @@
             style='max-width: 170px;'
             style='max-width: 170px;'
           )
           )
         v-divider.mx-3(vertical)
         v-divider.mx-3(vertical)
-        .overline Order By
+        .overline {{$t('tags:orderBy')}}
         v-select.ml-2(
         v-select.ml-2(
           :items='orderByItems'
           :items='orderByItems'
           v-model='orderBy'
           v-model='orderBy'
           :background-color='$vuetify.theme.dark ? `grey darken-3` : `white`'
           :background-color='$vuetify.theme.dark ? `grey darken-3` : `white`'
           hide-details
           hide-details
-          label='Order By'
+          :label='$t(`tags:orderBy`)'
           rounded
           rounded
           single-line
           single-line
           dense
           dense
@@ -90,7 +90,7 @@
       v-divider
       v-divider
       .text-center.pt-10(v-if='selection.length < 1')
       .text-center.pt-10(v-if='selection.length < 1')
         img(src='/svg/icon-price-tag.svg')
         img(src='/svg/icon-price-tag.svg')
-        .subtitle-2.grey--text Select one or more tags on the left.
+        .subtitle-2.grey--text {{$t('tags:selectOneMoreTagsHint')}}
       .px-5.py-2(v-else)
       .px-5.py-2(v-else)
         v-data-iterator(
         v-data-iterator(
           :items='pages'
           :items='pages'
@@ -109,15 +109,15 @@
                 size='96'
                 size='96'
                 width='2'
                 width='2'
                 )
                 )
-              .subtitle-2.grey--text.mt-5 Retrieving page results...
+              .subtitle-2.grey--text.mt-5 {{$t('tags:retrievingResultsLoading')}}
           template(v-slot:no-data)
           template(v-slot:no-data)
             .text-center.pt-10
             .text-center.pt-10
               img(src='/svg/icon-info.svg')
               img(src='/svg/icon-info.svg')
-              .subtitle-2.grey--text Couldn't find any page with the selected tags.
+              .subtitle-2.grey--text {{$t('tags:noResults')}}
           template(v-slot:no-results)
           template(v-slot:no-results)
             .text-center.pt-10
             .text-center.pt-10
               img(src='/svg/icon-info.svg')
               img(src='/svg/icon-info.svg')
-              .subtitle-2.grey--text Couldn't find any page matching the current filtering options.
+              .subtitle-2.grey--text {{$t('tags:noResultsWithFilter')}}
           template(v-slot:default='props')
           template(v-slot:default='props')
             v-row(align='stretch')
             v-row(align='stretch')
               v-col(
               v-col(
@@ -135,7 +135,8 @@
                     .d-flex.flex-row.align-center
                     .d-flex.flex-row.align-center
                       .body-1: strong.primary--text {{item.title}}
                       .body-1: strong.primary--text {{item.title}}
                       v-spacer
                       v-spacer
-                      .caption Last updated {{item.updatedAt | moment('from')}}
+                      i18next.caption(tag='div', path='tags:pageLastUpdated')
+                        span(place='date') {{item.updatedAt | moment('from')}}
                     .body-2.grey--text {{item.description || '---'}}
                     .body-2.grey--text {{item.description || '---'}}
                     v-divider.my-2
                     v-divider.my-2
                     .d-flex.flex-row.align-center
                     .d-flex.flex-row.align-center
@@ -165,6 +166,7 @@ const router = new VueRouter({
 })
 })
 
 
 export default {
 export default {
+  i18nOptions: { namespaces: 'tags' },
   data() {
   data() {
     return {
     return {
       tags: [],
       tags: [],
@@ -173,13 +175,6 @@ export default {
       locale: 'any',
       locale: 'any',
       locales: [],
       locales: [],
       orderBy: 'title',
       orderBy: 'title',
-      orderByItems: [
-        { text: 'Creation Date', value: 'createdAt' },
-        { text: 'ID', value: 'id' },
-        { text: 'Last Modified', value: 'updatedAt' },
-        { text: 'Path', value: 'path' },
-        { text: 'Title', value: 'title' }
-      ],
       orderByDirection: 0,
       orderByDirection: 0,
       pagination: {
       pagination: {
         page: 1,
         page: 1,
@@ -223,6 +218,15 @@ export default {
     },
     },
     pageTotal () {
     pageTotal () {
       return Math.ceil(this.pages.length / this.pagination.itemsPerPage)
       return Math.ceil(this.pages.length / this.pagination.itemsPerPage)
+    },
+    orderByItems () {
+      return [
+        { text: this.$t('tags:orderByField.creationDate'), value: 'createdAt' },
+        { text: this.$t('tags:orderByField.ID'), value: 'id' },
+        { text: this.$t('tags:orderByField.lastModified'), value: 'updatedAt' },
+        { text: this.$t('tags:orderByField.path'), value: 'path' },
+        { text: this.$t('tags:orderByField.title'), value: 'title' }
+      ]
     }
     }
   },
   },
   watch: {
   watch: {
@@ -243,7 +247,7 @@ export default {
     this.$store.commit('page/SET_MODE', 'tags')
     this.$store.commit('page/SET_MODE', 'tags')
 
 
     this.locales = _.concat(
     this.locales = _.concat(
-      [{name: 'Any', code: 'any'}],
+      [{name: this.$t('tags:localeAny'), code: 'any'}],
       (siteLangs.length > 0 ? siteLangs : [])
       (siteLangs.length > 0 ? siteLangs : [])
     )
     )
 
 
@@ -257,7 +261,6 @@ export default {
         this.selection.push(tag)
         this.selection.push(tag)
       }
       }
       this.rebuildURL()
       this.rebuildURL()
-      console.info(this.$refs.dude)
     },
     },
     isSelected (tag) {
     isSelected (tag) {
       return _.includes(this.selection, tag)
       return _.includes(this.selection, tag)

+ 1 - 1
package.json

@@ -182,7 +182,7 @@
     "@babel/preset-env": "^7.6.0",
     "@babel/preset-env": "^7.6.0",
     "@mdi/font": "4.3.95",
     "@mdi/font": "4.3.95",
     "@panter/vue-i18next": "0.15.1",
     "@panter/vue-i18next": "0.15.1",
-    "@requarks/ckeditor5": "12.4.0-wiki.11",
+    "@requarks/ckeditor5": "12.4.0-wiki.14",
     "@vue/babel-preset-app": "3.11.0",
     "@vue/babel-preset-app": "3.11.0",
     "animate-sass": "0.8.2",
     "animate-sass": "0.8.2",
     "animated-number-vue": "1.0.0",
     "animated-number-vue": "1.0.0",

+ 40 - 31
yarn.lock

@@ -1229,10 +1229,10 @@
   resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
   resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
   integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
   integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
 
 
-"@requarks/ckeditor5@12.4.0-wiki.11":
-  version "12.4.0-wiki.11"
-  resolved "https://registry.yarnpkg.com/@requarks/ckeditor5/-/ckeditor5-12.4.0-wiki.11.tgz#6a83bcd0617b32a9a2f946549727c2f95a97a7ba"
-  integrity sha512-Qs1rFB290CUVaXB0LuoN/b00ivN/S0NY0obFaOEmegQu69gKxiDaQSlvrSm2jOKpmNlxruc7/CxYSKiPvhadCw==
+"@requarks/ckeditor5@12.4.0-wiki.14":
+  version "12.4.0-wiki.14"
+  resolved "https://registry.yarnpkg.com/@requarks/ckeditor5/-/ckeditor5-12.4.0-wiki.14.tgz#eca91568cc5f1471fff684df18c638dfab9f0aef"
+  integrity sha512-3DD2GmagyTYeSHsm437FR0OxlzNFYnc3PEflt7p0/mTM68nRHUHv/pO9wvbUXaRk667WKsRVqckbbMQbdRK43g==
 
 
 "@types/accepts@*", "@types/accepts@^1.3.5":
 "@types/accepts@*", "@types/accepts@^1.3.5":
   version "1.3.5"
   version "1.3.5"
@@ -1910,9 +1910,9 @@ acorn-globals@^3.0.0:
     acorn "^4.0.4"
     acorn "^4.0.4"
 
 
 acorn-globals@^4.1.0:
 acorn-globals@^4.1.0:
-  version "4.3.3"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e"
-  integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
+  integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
   dependencies:
   dependencies:
     acorn "^6.0.1"
     acorn "^6.0.1"
     acorn-walk "^6.0.1"
     acorn-walk "^6.0.1"
@@ -4962,9 +4962,9 @@ ejs@^2.3.4, ejs@^2.5.6, ejs@^2.6.1:
     pump "^3.0.0"
     pump "^3.0.0"
 
 
 electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.30:
 electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.30:
-  version "1.3.253"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.253.tgz#bc3b2c94c2a109c08d37b04f526dc05fdabcbb5b"
-  integrity sha512-LAwFRWViiiCSxQ2Lj3mnyEP8atkpAoHSPUnkFoy4mNabbnPHxtfseWvPCGGhewjHQI+ky/V4LdlTyyI0d3YPXA==
+  version "1.3.255"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.255.tgz#9f4b4f9ffd559dd7a81fef962186fc918d118b66"
+  integrity sha512-SZ6NlaNw3h4WR5kA1BK8XltdJCax02P+lW+z78RYoLDqmpyYuDQ5bS+/O6MCJ/j761qoZIFox2qYYt+UwqGA5w==
 
 
 elliptic@^6.0.0, elliptic@^6.2.3:
 elliptic@^6.0.0, elliptic@^6.2.3:
   version "6.5.1"
   version "6.5.1"
@@ -5964,7 +5964,7 @@ fsevents@^2.0.6:
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a"
   integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==
   integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==
 
 
-function-bind@^1.0.2, function-bind@^1.1.1:
+function-bind@^1.1.1:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
@@ -8797,9 +8797,9 @@ minimist@~0.0.1:
   integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
   integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
 
 
 minipass@^2.2.1, minipass@^2.3.5:
 minipass@^2.2.1, minipass@^2.3.5:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.5.0.tgz#dddb1d001976978158a05badfcbef4a771612857"
-  integrity sha512-9FwMVYhn6ERvMR8XFdOavRz4QK/VJV8elU1x50vYexf9lslDcWe/f4HBRxCPd185ekRSjU6CfYyJCECa/CQy7Q==
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.5.1.tgz#cf435a9bf9408796ca3a3525a8b851464279c9b8"
+  integrity sha512-dmpSnLJtNQioZFI5HfQ55Ad0DzzsMAb+HfokwRTNXwEQjepbTkl5mtIlSVxGIkOkxlpX7wIn5ET/oAd9fZ/Y/Q==
   dependencies:
   dependencies:
     safe-buffer "^5.1.2"
     safe-buffer "^5.1.2"
     yallist "^3.0.0"
     yallist "^3.0.0"
@@ -9166,9 +9166,9 @@ node-pre-gyp@^0.12.0:
     tar "^4"
     tar "^4"
 
 
 node-releases@^1.1.29:
 node-releases@^1.1.29:
-  version "1.1.29"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.29.tgz#86a57c6587a30ecd6726449e5d293466b0a0bb86"
-  integrity sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==
+  version "1.1.30"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.30.tgz#35eebf129c63baeb6d8ddeda3c35b05abfd37f7f"
+  integrity sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==
   dependencies:
   dependencies:
     semver "^5.3.0"
     semver "^5.3.0"
 
 
@@ -11342,9 +11342,9 @@ pseudomap@^1.0.1, pseudomap@^1.0.2:
   integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
   integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
 
 
 psl@^1.1.24, psl@^1.1.28:
 psl@^1.1.24, psl@^1.1.28:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.1.tgz#d5aa3873a35ec450bc7db9012ad5a7246f6fc8bd"
-  integrity sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA==
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
+  integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
 
 
 public-encrypt@^4.0.0:
 public-encrypt@^4.0.0:
   version "4.0.3"
   version "4.0.3"
@@ -12928,20 +12928,20 @@ string.prototype.repeat@^0.2.0:
   integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=
   integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=
 
 
 string.prototype.trimleft@^2.0.0:
 string.prototype.trimleft@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff"
-  integrity sha1-aLaqjhYsaoDnbjqKDC50cYbicf8=
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
+  integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
   dependencies:
   dependencies:
-    define-properties "^1.1.2"
-    function-bind "^1.0.2"
+    define-properties "^1.1.3"
+    function-bind "^1.1.1"
 
 
 string.prototype.trimright@^2.0.0:
 string.prototype.trimright@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd"
-  integrity sha1-q0pW2AKgH75yk+EehPJNyBZGYd0=
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
+  integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
   dependencies:
   dependencies:
-    define-properties "^1.1.2"
-    function-bind "^1.0.2"
+    define-properties "^1.1.3"
+    function-bind "^1.1.1"
 
 
 string_decoder@^1.0.0, string_decoder@^1.1.1:
 string_decoder@^1.0.0, string_decoder@^1.1.1:
   version "1.3.0"
   version "1.3.0"
@@ -13206,7 +13206,7 @@ terser-webpack-plugin@^1.4.1:
     webpack-sources "^1.4.0"
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
     worker-farm "^1.7.0"
 
 
-terser@4.3.0, terser@^4.1.2:
+terser@4.3.0:
   version "4.3.0"
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.0.tgz#0259070576ff34d89c5cd2b8d91055cdce0212d5"
   resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.0.tgz#0259070576ff34d89c5cd2b8d91055cdce0212d5"
   integrity sha512-w5CzrvQOwYAH54aG22IrUJI4yX1w62XQmMdEOM6H4w0ii6rc3HJ89fmcOGN5mRwBWfUgaqO7RJTp4aoY/uE+qQ==
   integrity sha512-w5CzrvQOwYAH54aG22IrUJI4yX1w62XQmMdEOM6H4w0ii6rc3HJ89fmcOGN5mRwBWfUgaqO7RJTp4aoY/uE+qQ==
@@ -13215,6 +13215,15 @@ terser@4.3.0, terser@^4.1.2:
     source-map "~0.6.1"
     source-map "~0.6.1"
     source-map-support "~0.5.12"
     source-map-support "~0.5.12"
 
 
+terser@^4.1.2:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65"
+  integrity sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
 test-exclude@^5.2.3:
 test-exclude@^5.2.3:
   version "5.2.3"
   version "5.2.3"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"