vben5项目中切换国际化时项目刷新

我使用vben5进行前端代码开发时,有一个需求,每次切换语言时,我都要求项目要重新刷新一遍,这样才能进行后端的语言切换也好,前端国际化的展示也好,我都需要实现这个功能。

我之前一直都是在apps/web-and/src/locales/index.ts文件中进行语言的切换,但是,我发现在这个文件中进行语言切换时,每次切换国际化之后都不起作用。后来发现是切换语言的时候又刷新了页面,所有导致切换好的语言又被重置了,所以,我发现不能再这个文件中进行切换,我们应该在。

packages\effects\layouts\src\widgets\language-toggle.vue

我们应该在这个文件中进行国际化语言的切换才对。

相应的修改代码如下:

复制代码
<script setup lang="ts">
import type { SupportedLanguagesType } from '@vben/locales';

import { SUPPORT_LANGUAGES } from '@vben/constants';
import { Languages } from '@vben/icons';
import { loadLocaleMessages } from '@vben/locales';
import { preferences, updatePreferences } from '@vben/preferences';

import { VbenDropdownRadioMenu, VbenIconButton } from '@vben-core/shadcn-ui';
import { nextTick, ref } from 'vue';

defineOptions({
  name: 'LanguageToggle',
});

// 添加加载状态,防止重复点击
const loading = ref(false);

async function handleUpdate(value: string | undefined) {
  if (!value) {
    console.warn('接收到空值,跳过语言切换');
    return;
  }
  
  const locale = value as SupportedLanguagesType;
  
  // 如果正在加载或者已经是当前语言,则跳过
  if (loading.value || preferences.app.locale === locale) {
    return;
  }

  
  try {
    loading.value = true;
    
    // 1. 更新偏好设置
    updatePreferences({
      app: {
        locale,
      },
    });
    
    // 2. 加载语言包
    await loadLocaleMessages(locale);
    
    // 3. 等待下一个tick确保DOM更新完成
    await nextTick();
    
    // 4. 刷新页面以重新加载所有组件
    // 这里使用setTimeout是为了确保所有的状态更新和DOM更新都已完成
    setTimeout(() => {
      window.location.reload();
    }, 100);
      console.log('国际化手动切换成功', value);
  } catch (error) {
    console.error('切换语言失败:', error);
    // 如果切换失败,恢复原来的语言设置
    updatePreferences({
      app: {
        locale: preferences.app.locale,
      },
    });
  } finally {
    
    loading.value = false;
  }
}
</script>

<template>
  <div>
    <VbenDropdownRadioMenu
      :menus="SUPPORT_LANGUAGES"
      :model-value="preferences.app.locale"
      :disabled="loading"
      @update:model-value="handleUpdate"
    >
      <VbenIconButton 
        class="hover:animate-[shrink_0.3s_ease-in-out]"
        :disabled="loading"
      >
        <Languages class="text-foreground size-4" />
        <!-- 添加加载指示器 -->
        <span 
          v-if="loading" 
          class="absolute top-0 right-0 w-2 h-2 bg-primary rounded-full animate-ping"
        ></span>
      </VbenIconButton>
    </VbenDropdownRadioMenu>
  </div>
</template>
相关推荐
小葛要努力15 天前
安装nvm 管理node.js版本实现vue2和vue3项目共存
node.js·vue·nvm
这里是杨杨吖15 天前
SpringBoot+Vue高校在线考试系统 附带详细运行指导视频
vue·在线考试·springboot
wuxia211816 天前
在5种环境中编写点击元素改变内容和颜色的JavaScript程序
javascript·微信小程序·vue·jquery·react
Sweet锦16 天前
Vue3 集成 ApexCharts 避坑指南:从动画失效到自定义指令的完美解决方案
vue·echarts
王小王-12317 天前
基于深度学习的个性化音乐推荐系统的设计与开发
人工智能·深度学习·mysql·vue·推荐算法·个性化音乐推荐系统·音乐预测
alexander06817 天前
使用vite脚手架,快速创建一个vue3的项目
vue
toooooop819 天前
UniApp Vue2 动态修改 SCSS 伪类颜色
vue
这是个栗子19 天前
微信小程序开发(九)- uni-app微信小程序商城
微信小程序·小程序·uni-app·vue·vuex
鹤鸣的日常19 天前
前端运行时动态环境变量方案
前端·react.js·docker·前端框架·vue·gitlab
来杯@Java20 天前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis