当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vue i18n 切换语言的时候为什么不变?

长孙沈义
2023-10-30

下面这样写切换语言的时候 {{welcome1}}{{welcome2}} 都不会变,只能 {{welcome3}} 这么写,为什么?

<script setup>import {useI18n} from "vue-i18n";import {computed, ref} from "vue";const {t} = useI18n();const welcome1 = t('welcome');const welcome2 = ref(t('welcome'));const welcome3 = ref(computed(() => t('welcome')));</script><template>    <p>{{$t('welcome')}}</p>    <p>{{welcome1}}</p>    <p>{{welcome2}}</p>    <p>{{welcome3}}</p></template><style scoped></style>

共有4个答案

干浩然
2023-10-30

你webcome1和webcome2都只是在那一刻使用了语言的值 然后用了另一个变量存起来 后面你语言的值发生变化 跟你存的这个变量有啥关系

农建弼
2023-10-30

webcome1和webcome2都是函数的调用,他只执行一次,当切换语言时,并不会再次调用,webcome3你使用了computed属性,当t('welcome')值变化时,他就会触发依赖的模版页面的显示变更,还有你既然使用computed,外面就不用包一个ref了

夏弘义
2023-10-30

它为什么可以把welcome替换成欢迎,它是有一个这个映射关系,代码中做了处理,不是魔法,他处理的地方就是t函数,$t('welcome')computed都是动态的,所以切换语言后,页面重新渲染,可以重新计算,换成映射到的东西,但welcome1和welcome2是你写死在页面中的,换不了,除非你重新初始化组件

孙琨
2023-10-30

这个问题可能是由于 vue-i18n 的初始化和更新时间导致的。在 Vue 3 中,refcomputed 创建的数据是延迟计算的,只有当其依赖的数据发生变化时,它们才会重新计算。

对于 welcome1welcome2,它们都是 useI18n 创建的实例,并且在其内部,它们使用的是同一个 t 函数。当你更改语言时,t 函数返回的文本会变化,但是这个变化只会在 useI18n 内部生效,不会影响到已经创建的 welcome1welcome2 实例。

然而,对于 welcome3,它是一个通过 computed 创建的实例。当其依赖的数据(即 t('welcome'))发生变化时,它会自动重新计算。因此,当你更改语言时,welcome3 会自动更新。

所以,如果你想让 welcome1welcome2 在更改语言时更新,你可能需要重新创建它们。你可以将它们设置为 useI18n 的返回值的一部分,这样它们就会随着 t 函数的变化而变化。例如:

<script setup>import {useI18n} from "vue-i18n";import {computed, ref} from "vue";const {t} = useI18n();const locale = ref(navigator.language || navigator.userLanguage); // 使用浏览器的语言设置作为默认语言const welcome1 = computed(() => t('welcome', { locale: locale.value })); // 使用浏览器的语言设置作为参数const welcome2 = computed(() => t('welcome', { locale: locale.value })); // 使用浏览器的语言设置作为参数</script><template>    <p>{{$t('welcome')}}</p>    <p>{{welcome1}}</p>    <p>{{welcome2}}</p></template><style scoped></style>

这样,无论何时更改语言,welcome1welcome2 都会自动更新。

 类似资料:
  • 问题: 如何实现实时语言切换? 解法: 首先你必须阅读 模板语言中的i18n支持, 然后尝试下面的代码。 文件: code.py import os import sys import gettext import web # File location directory. rootdir = os.path.abspath(os.path.dirname(__file__)) # i18n

  • 通常,当我查看使用Android Studio构建的Android应用程序的输出时,我会看到以下内容。有时它正在将从更改为。其他时候,它正在将从更改为。为什么这么优柔寡断??

  • 我正在参加计算机组织课程,我看到了以下片段: 为什么编译器编写者需要了解汇编语言?编译器是否会将Java之类的高级语言翻译成二进制(或者Java中的字节码)?汇编语言何时出现? 我的书中有这样一句话: 高级编程语言一种可移植的语言,如C、C、Java或Visual Basic,由可由编译器翻译成汇编语言的单词和代数符号组成。 我真的认为编译器可以从高级语言变成二进制语言。这不对吗?

  • 本教程旨在指导您在uni-app(小程序,H5,APP(不含NVUE)等)中从0开始,到熟练使用多语言切换功能,在这里,我们使用的是vue-i18n插件,请您务必按照我们提供的步骤,完整的做好每一步的配置。 前言: i18n是一个专门用于处理多语言的插件,其义来自于internationalization(国际化),取其首尾两个字母i和n,中间部分nternationalizatio刚好18个字母

  • 问题内容: Javadoc的方法 doInBackground方法完成后,在事件调度线程上执行。 我已经暗示,对于被取消的工人,情况并非如此。 在每种情况下都会被调用(正常终止或取消),但是当它 未排入 EDT时(通常终止会发生这种情况)。 在取消a的情况下,何时调用有更精确的分析吗? 澄清:这个问题是 不是 就如何一个。在此假定以正确的方式取消。 它是 不是 什么时候他们应该完成的线程仍在工作。

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除