aboutsummaryrefslogtreecommitdiff
path: root/src/components/interface_language_switcher/interface_language_switcher.vue
blob: e18a2a12022569818ab7ef75119264614f56ae98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<template>
  <div class="interface-language-switcher">
    <label>
      {{ promptText }}
    </label>
    <ol>
      <li
        v-for="index of controlledLanguage.keys()"
        :key="index"
      >
        <Select
          class="language-select"
          :model-value="controlledLanguage[index]"
          @update:modelValue="val => setLanguageAt(index, val)"
        >
          <option
            v-for="lang in languages"
            :key="lang.code"
            :value="lang.code"
          >
            {{ lang.name }}
          </option>
        </Select>
        <button
          v-if="controlledLanguage.length > 1"
          class="button-default btn"
          @click="() => removeLanguageAt(index)"
        >{{ $t('settings.remove_language') }}</button>
      </li>
      <li>
        <button
          class="button-default btn"
          @click="addLanguage"
        >{{ $t('settings.add_language') }}</button>
      </li>
    </ol>
  </div>
</template>

<script>
import localeService from '../../services/locale/locale.service.js'
import Select from '../select/select.vue'

export default {
  components: {
    // eslint-disable-next-line vue/no-reserved-component-names
    Select
  },
  props: {
    promptText: {
      type: String,
      required: true
    },
    language: {
      type: [Array, String],
      required: true
    },
    setLanguage: {
      type: Function,
      required: true
    }
  },
  computed: {
    languages () {
      return localeService.languages
    },

    controlledLanguage: {
      get: function () {
        return Array.isArray(this.language) ? this.language : [this.language]
      },
      set: function (val) {
        this.setLanguage(val)
      }
    }
  },

  methods: {
    getLanguageName (code) {
      return localeService.getLanguageName(code)
    },
    addLanguage () {
      this.controlledLanguage = [...this.controlledLanguage, '']
    },
    setLanguageAt (index, val) {
      const lang = [...this.controlledLanguage]
      lang[index] = val
      this.controlledLanguage = lang
    },
    removeLanguageAt (index) {
      const lang = [...this.controlledLanguage]
      lang.splice(index, 1)
      this.controlledLanguage = lang
    }
  }
}
</script>

<style lang="scss">
@import '../../_variables.scss';

.interface-language-switcher {
  .language-select {
    margin-right: 1em;
  }
}
</style>