Как реактивно установить vue-i18n в свойстве компонента

#vue.js #vue-i18n

#vue.js #vue-i18n

Вопрос:

Я пытаюсь отобразить некоторые сообщения или ошибки, зависящие от результата асинхронной функции. Когда запрос ответа не включает свойство message, я должен использовать свое собственное. Проблема в том, что когда я использую this.$t("message") внутри someMethod метода response.message (данные), он не реагирует. Так что он не изменится после изменения локали.

 <v-alert v-if="response.error || response.message"
  :type="response.error ? 'error' : 'info'">
  {{response.error ? response.error : response.message}}
</v-alert>

export default {
    data() {
      return {
        response: {
          message: "",
          error: ""
        }
      };
    },
    methods: {
      async someMethod() {
        const apiResponse = await sendRequestToAnApi();
        if (apiResponse.message) {
          this.response.message = apiResponse.message;
        } else {
          this.response.message = this.$t("translation")
        }
      }
    }
}
 

Я предполагаю, что я должен использовать вычисляемое свойство, чтобы заставить его работать, но я понятия не имею, как смешать объект ответа с возможным ответом API.

Любая помощь будет оценена по достоинству

Ответ №1:

Ваш API может возвращать не только сообщение, но и код, где сообщение может быть текстовой строкой на основе пользовательских настроек локали, а код — фрагментом, который всегда будет английским, например users.added , или project.created . Вы можете сохранить этот код response.code и создать вычисляемое свойство, проверяя этот код и возвращая правильный перевод vue-i18n.

 export default {
    data() {
      return {
        response: {
          code: "",
          error: ""
        }
      };
    },
    methods: {
      async someMethod() {
        const apiResponse = await sendRequestToAnApi();
        if (apiResponse.code) {
          this.response.code = apiResponse.code;
        } else {
          this.response.code = null
        }
      }
    },
    computed: {
        translatedMessage () {
            if (this.response.code === 'users.added') {
              return this.$t('translate')
            }
            return 'unknown code'
        }
    }
}
 

Конечно, вы также можете заставить это работать с текстовой строкой, поступающей из API, но лично мне нравится работать с определенным кодом, который не зависит от языковых настроек.