vue-i18n: как использовать фильтр экземпляра vue
Я хочу использовать фильтр для выполнения переводов.
Проблема в том, что "this" не указывает на мой экземпляр vue внутри моей функции фильтра.
Это то, что у меня сейчас есть.
внутри моего шаблона у меня есть это:
<p>{{ parking.status | translate }} </p>
внутри моего компонента у меня есть это:
new Vue({ ...
filters: {
translate: function(value, vue) {
return this.$i18n.t('MLAA-47');
}
Я получаю ошибку, что это == неопределено.
Как мне указать на мой экземпляр vue внутри функции фильтра?
3 ответа
Как указывает @italy-mosin в комментарии к ответу, вы не можете использовать this
внутри функции фильтра.
Фильтры в первую очередь предназначены для преобразования текста. Для более сложных преобразований данных в других директивах вы должны использовать вместо этого свойства Computed.
У меня была та же проблема, и я решил переместить перевод с $i18n в вычисляемый метод, например:
Внутри вашего шаблона вместо этого:
<p>{{ parking.status | translate }} </p>
Измените это на:
<p>{{ translateStatus(parking.status) }} </p>
И в методах:
methods: {
translateStatus (status) {
return this.$t(status)
}
},
Я предполагаю, что у вас динамический статус (не всегда возвращается: "MLAA-47"), и вы должны утверждать, что у вас есть переводы для всех из них. Это сработало для меня!
Надеюсь, это поможет и вам
Я не уверен, что это хорошая идея, но пока она делает то, что я хочу.
Определите фильтры как
// the instance.vue will be set on App.vue
export const instance = {
vue: null
};
// little helper
const t = (key) => instance.vue?.$t?.(key);
export default {
filter: (v) => v + t('somekey')
}
Затем в
App.vue
(или что бы вы ни использовали), сделайте
import {instance} from '@/filters'
export default {
mounted() {
instance.vue = this; // set the instance here
Мы можем импортировать файл, экспортирующий экземпляр i18n следующим образом
import i18n from '@/i18n.js'
И используйте это так
i18n.t('your.message')