Vue3 vue-i18n 切换语言无法响应式变化,如何解决?

作者站长头像
站长
· 阅读数 12

Vue3 vue-I18u 切换语言无法响应式变化

版本👇"vue": "^3.3.4","vue-i18n": "9",
import { createI18n, useI18n } from 'vue-i18n'
import { useOutsideSystemStore } from '@/stores/modules/system.js'
import zhCN from './json/zh.json'
import enUS from './json/en.json'

const useSystem = useOutsideSystemStore()

const i18n = createI18n({
  legacy: false,
  locale: useSystem.language,
  globalInjection: true,
  messages: {
    zh: zhCN,
    en: enUS
  }
})

const locale = toRef(i18n.global.locale)

export { useI18n, locale }

export default i18n

当切换时修改 全局locale 只响应式变化html中的{{$t('')}} script中的$t() 不会变化

希望只要使用到$t的地方都能变化

回复
1个回答
avatar
test
2024-06-27

OP你是怎么切换i18n当前语言的,有按照文档中的方式来切换吗? 👉 #Locale Changing - Composition API | Vue I18n

<script setup>
const { t, locale } = useI18n({ useScope: 'global' })

locale.value = 'en' // change!
</script>

按照OP你的评论,猜测OP你可能是在声明的时候,直接把 t 函数 返回的文本值直接赋值给JS变量了。

以下是一个Demo片段,OP你理解一下其中的区别:

<template>
  <div>
    <p>text:{{ $t("message.hello") }}</p>
    <p>testRef: {{ textRef }}</p>
    <p>textComp: {{ textComp }}</p>
    <button @click="changeLocale">Change</button>
  </div>
</template>

<script setup>
import { ref, computed } from "vue";
import { useI18n } from 'vue-i18n'

const { t, locale } = useI18n({ useScope: "global" });

const textRef = ref(t('message.hello'))
const textComp = computed(() => t('message.hello'));

const changeLocale = () => {
  locale.value = (locale.value === "en") ? "ja" : "en";
  console.log('changeLocale textRef.value =>', textRef.value)
  text.value = t('message.hello')
  console.log('changeLocale textRef.value(赋值后)', textRef.value)
};
</script>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容