前端 Vue实现国际化(可自动获取用户语言并切换

本文详细介绍了如何在Vue项目中实现多语言切换功能,包括环境准备、安装与引入vue-i18n、编辑语言包及在页面中使用,最后通过自动识别用户语言实现自动切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

由于最近项目做到了需求前端判别用户使用的不同语言并且进行自动切换语言,所以想着记录一下。

一、环境准备

我们需要准备开发环境,我这里使用vue-cli官方脚手架搭建了一个vue的开发环境。

二、安装 vue-i18n

我这里使用npm安装依赖

$ npm install vue-i18n

三、引入 vue-i18n

这里我是在main.js中引入vue-i18n

//多语言切换
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n({
  // locale: '', // 语言标识
  messages: {
    //中文
    'zh-CN': require('./common/lang/zh-CN'),
    //英文
    'en-US': require('./common/lang/en-US'),
    //同理,以下可以引多种语言
  }
})

这时我们可以全局调用这个i18n的实例对象,通过改变this.$i18n.locale的值来改变语言,但这时我们还没有语言切换的条件以及语言包

此时我们再创建一个lang语言文件夹,在lang中创建我们需要的语言包

四、编辑语言包

比如我们在中文zh-CN.js中编辑

module.exports = {
  login: {
   'loginPassword':'请输入登录密码',
   'password': '密码登录',
   'passcode': '验证码登录',
   'signin': '登  录',
 }
  }

同时我们需要在英文en-US.js中编辑

module.exports = {
  login: {
    'loginPassword': 'Please enter your login password',
    'password': 'Login',
    'passcode': 'SMS Login',
    'signin': 'Sign In',
  },
}

注意我们的每个语言包都是对应的

五、在页面中使用语言包

那么我们怎么在页面中去使用我们的语言包呢,这里有两种使用方式

  1. this.$t(’’) 比如使用动态属性 如v-text 等 以及接口数据等地方都可以使用这种方式渲染
 tabList:[{name:this.$t('login.password'),path:'/login/pwdlogin'}]
  1. {{$t(’’)}}则可以直接在标签内部渲染
<router-link to="/reg">{{$t('register.signup')}}</router-link>

好了既然可以渲染语言包那么最重要的一步我们需要去触发改变语言了

六、触发改变语言

自动识别用户使用语言自动切换语言

先说前端怎样自动识别用户语言然后自动切换语言,我们可以使用navigator.language得到用户使用的语言,那么我们在App.vue中可以判别

 methods: {
   autoChange() {
     switch (navigator.language) {
       case "en":
         this.$i18n.locale = "en-US";
         break;
       case "zh-CN":
         this.$i18n.locale = "zh-CN";
         break;
     }
   }
 },
 created() {
   this.autoChange();
 },

这样,我们就可以通过浏览器自动识别语言自动切换语言了。

国际化方式很多,我只是分享到了一种如有不足欢迎指出。

### Vue3 TypeScript 国际化配置中左侧菜单语言切换解决方案 在处理 Vue3 和 TypeScript 的国际化(i18n)配置时,如果遇到左侧菜单的语言未能正确切换的情况,通常是因为组件重新渲染机制或状态管理存在问题。以下是详细的排查和解决办法: #### 1. 确认 i18n 配置无误 确保 `i18n` 插件已正确定义引入到项目中[^1]。 ```typescript import { createI18n } from 'vue-i18n'; const i18n = createI18n({ locale: 'en', // 设置默认语言 messages: { en: { message: { hello: 'hello world' } }, zh: { message: { hello: '你好世界' } } } }); export default i18n; ``` #### 2. 组件内使用 `$t()` 方法获取翻译字符串 对于需要动态更新文字的组件,应通过调用 `$t('message.hello')` 来获得对应语言的文字内容,将其绑定至视图层中的数据属性上。 ```html <template> <div>{{ translatedMessage }}</div> </template> <script lang="ts"> import { defineComponent, computed } from "vue"; import { useI18n } from "vue-i18n"; export default defineComponent({ setup() { const { t } = useI18n(); return { translatedMessage: computed(() => t('message.hello')) }; } }) </script> ``` #### 3. 处理左侧菜单特殊逻辑 针对特定场景下的左侧导航栏或其他固定位置元素,在改变语言设置之后可能不会自动刷新其内部文本节点的内容。此时可以通过监听全局事件来强制触发这些区域的数据重载操作。 ```javascript // main.ts 中注册全局事件总线 app.config.globalProperties.$bus = new EventEmitter(); // 当前页面接收消息后执行相应动作 watchEffect(() => { if (locale.value !== prevLocaleValue){ app.$bus.emit('language-changed'); }}); ``` ```html <!-- Menu.vue --> <template> <ul @click="$emit('update-lang')" :key="langKey">{{translatedMenuItems}}</ul> </template> <script setup lang="ts"> import { ref, onMounted, watchEffect } from 'vue'; let langKey = ref(0); onMounted(() => { window.addEventListener('language-changed', () => ++langKey.value); }); defineProps<{ translatedMenuItems:string[] }>(); </script> ``` 以上措施能够有效改善因缓存等原因造成的部分界面无法及时响应语言变化的问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值