版本
"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() 不会变化
可以参考一下这个https://blog.csdn.net/JINGZzhuo/article/details/126065964
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>
在 Vue 3 中使用 vue-i18n
时,你需要确保你的语言设置是响应式的。然而,在你的代码中,locale
被设置为 useSystem.language
的一个静态值,这不是响应式的。vue-i18n
的 createI18n
函数在初始化时接受一个静态的 locale
值,这不会随着 useSystem.language
的变化而自动更新。
为了解决这个问题,你可以使用 vue-i18n
的 setLocaleMessage
和 setLocale
方法来动态地更新语言和消息。此外,你应该将 i18n
实例设置为 Vue 应用的插件,而不是直接导出它。
以下是一个修改后的示例,展示了如何在 Vue 3 和 vue-i18n
9 中实现响应式的语言切换:
import { createI18n, useI18n } from 'vue-i18n'import { ref, onMounted, watch } from 'vue'import { useOutsideSystemStore } from '@/stores/modules/system.js'import zhCN from './json/zh.json'import enUS from './json/en.json'const messages = { zh: zhCN, en: enUS}// 创建一个响应式的 ref 来存储当前的 localeconst currentLocale = ref('zh') // 假设默认是中文// 创建一个 i18n 实例,但不立即设置 localeconst i18n = createI18n({ legacy: false, globalInjection: true, // 这将使 $t 和 $i18n 在模板和组件中可用 // 注意:这里不设置 locale messages // 传入所有的消息})// 监听 useOutsideSystemStore 中的 language 变化,并更新 i18n 的 localeconst useSystem = useOutsideSystemStore()watch(useSystem.language, (newLocale) => { i18n.global.setLocaleMessage(newLocale, messages[newLocale]) i18n.global.locale.value = newLocale})// 挂载时设置初始 localeonMounted(() => { i18n.global.setLocaleMessage(currentLocale.value, messages[currentLocale.value]) i18n.global.locale.value = currentLocale.value})// 导出 useI18n 钩子函数export { useI18n }// 在你的 Vue 应用中安装 i18n 插件// 例如,在 main.js 或 main.ts 中// createApp(App).use(i18n).mount('#app')
请注意,我使用了 Vue 3 的 ref
、onMounted
和 watch
API 来创建一个响应式的 currentLocale
并监听 useSystem.language
的变化。我还使用了 i18n.global.setLocaleMessage
和 i18n.global.locale.value
来动态地更新语言和消息。
确保在你的 Vue 应用中安装 i18n
插件,这样 $t
和 $i18n
就可以在模板和组件中使用了。
此外,由于你使用的是 Vue 3 和 Composition API,你可能还需要在你的组件中使用 setup
函数和 useI18n
钩子函数来访问 $t
函数。例如:
import { setup } from 'vue'import { useI18n } from 'vue-i18n'export default { setup() { const { t } = useI18n() // 现在你可以使用 t 函数来翻译文本了 // 例如:const translatedText = t('hello') // ... 其他逻辑 ... return { // ... 返回给模板的响应式引用 ... } }}
本教程旨在指导您在uni-app(小程序,H5,APP(不含NVUE)等)中从0开始,到熟练使用多语言切换功能,在这里,我们使用的是vue-i18n插件,请您务必按照我们提供的步骤,完整的做好每一步的配置。 前言: i18n是一个专门用于处理多语言的插件,其义来自于internationalization(国际化),取其首尾两个字母i和n,中间部分nternationalizatio刚好18个字母
vue3 响应式无法更新 下面是最小复现代码 https://play.vuejs.org/#eNqVVs2O2zYQfhVWF2kBV27QnlzbaJIu2vTQD... 点击“修改值”这个按钮,最上层组件能够更新值, 但是最内层的组件无法监听到值被改变了
下面这样写切换语言的时候 {{welcome1}} 和 {{welcome2}} 都不会变,只能 {{welcome3}} 这么写,为什么?
本文向大家介绍利用vue-i18n实现多语言切换效果的方法,包括了利用vue-i18n实现多语言切换效果的方法的使用技巧和注意事项,需要的朋友参考一下 前言 有些项目我们需要支持多种语言切换,满足国际化需求。 vue-i18n是一个vue插件,主要作用就是让项目支持国际化多语言,使用方便快捷,能很轻松的将我们的项目国际化。本文主要介绍使用vue-i18n实现切换中英文效果。 安装vue-i18n
Vue的 响应性语法糖 文档中 响应式 props 解构 部分提到了: 和 .value 类似,为了保持响应性,你始终需要以 props.x 的方式访问这些 prop。这意味着你不能够解构 defineProps 的返回值,因为得到的变量将不是响应式的、也不会更新。 真的是这样吗?解构 defineProps 的返回值得到的变量将不是响应式,也不会更新。 例子1 父组件响应式数据改变 => 子组件
本文向大家介绍thinkPHP多语言切换设置方法详解,包括了thinkPHP多语言切换设置方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP多语言切换设置方法。分享给大家供大家参考,具体如下: thinkphp多语言设置有点‘高大上',为什么说它有点‘高大上'呢?因为本人设置了好久才弄好,而本人之所以弄了好久的原因,竟然是因为‘开启语言设置必须得先开启初始化系统的行为