Skip to content
Snippets Groups Projects
interface_language_switcher.vue 2.55 KiB
Newer Older
  <div class="interface-language-switcher">
    <label>
      {{ promptText }}
tusooa's avatar
tusooa committed
    <ul class="setting-list">
      <li
        v-for="index of controlledLanguage.keys()"
        :key="index"
HJ's avatar
HJ committed
      >
tusooa's avatar
tusooa committed
        <label>
          {{ index === 0 ? $t('settings.primary_language') : $tc('settings.fallback_language', index, { index }) }}
          <Select
            class="language-select"
            :model-value="controlledLanguage[index]"
            @update:modelValue="val => setLanguageAt(index, val)"
tusooa's avatar
tusooa committed
            <option
              v-for="lang in languages"
              :key="lang.code"
              :value="lang.code"
            >
              {{ lang.name }}
            </option>
          </Select>
        </label>
tusooa's avatar
tusooa committed
          v-if="controlledLanguage.length > 1 && index !== 0"
          class="button-default btn"
          @click="() => removeLanguageAt(index)"
tusooa's avatar
tusooa committed
        >
          {{ $t('settings.remove_language') }}
        </button>
      </li>
      <li>
        <button
          class="button-default btn"
          @click="addLanguage"
        >{{ $t('settings.add_language') }}</button>
      </li>
tusooa's avatar
tusooa committed
    </ul>
  </div>
</template>

<script>
import localeService from '../../services/locale/locale.service.js'
import Select from '../select/select.vue'
HJ's avatar
HJ committed
export default {
HJ's avatar
HJ committed
    // eslint-disable-next-line vue/no-reserved-component-names
  props: {
    promptText: {
      type: String,
      required: true
    },
    language: {
      type: [Array, String],
      required: true
    },
    setLanguage: {
      type: Function,
      required: true
    }
  },
HJ's avatar
HJ committed
  computed: {
      return localeService.languages
HJ's avatar
HJ committed
    },
    controlledLanguage: {
      get: function () {
        return Array.isArray(this.language) ? this.language : [this.language]
      },
HJ's avatar
HJ committed
      set: function (val) {
        this.setLanguage(val)
HJ's avatar
HJ committed
    }
  },
HJ's avatar
HJ committed
  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
HJ's avatar
HJ committed
}

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

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