当前位置: 首页 > news >正文

router.js 中使用国际化

1、router.js 

import { createRouter, createWebHistory } from 'vue-router';
import { i18n } from '~/locales/index.js'; // 引入 i18n 实例 (自定义的index.js配置)
import UserList from '../pages/user/list.vue'

// 路由配置
const routes = [
  {
    path: "/homeIndex",
    name: "homeIndex",
    component: Home,
    meta: {
      title: "menu.HOME" // 国际化键值
    }
  },
  {
    path: "/user",
    name: "user",
    component: UserList,
    meta: {
      title: "sub_menu.M2_1" // 国际化键值
    }
  }
];

export const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 全局前置守卫
router.beforeEach((to, from, next) => {
  const { t } = i18n.global; // 获取 t 函数
  const title = to.meta.title; // 提取 meta.title

  console.log("to.meta.title:", title); // 调试:确认是否获取到正确的 meta.title
  console.log("Translated title:", t(title)); // 调试:确认翻译是否正确

  if (title) {
    document.title = t(title); // 动态设置页面标题
  }

  next();
});

export default router;

2.国际化index.js

import type { App } from 'vue';
import type { I18n, I18nOptions } from 'vue-i18n';
import zh from './zh.json';  // 自己的json文件
import ko from './en.json';  // 自己的json文件
import { createI18n } from 'vue-i18n';


export let i18n: ReturnType<typeof createI18n>;

async function createI18nOptions(): Promise<I18nOptions> {
const locale = localStorage.getItem('lang') || "en";  // 存本地便于更新切换语言

  let defaultLocal = {};
  if (locale === 'en') {
    defaultLocal = en;
  } else {
    defaultLocal = zh;
  }
  const msg = defaultLocal ?? {};

  return {
    legacy: false,
    locale,
    fallbackLocale: "zh",
    messages: {
      [locale]: msg,
     /*  "zh":{
        message:{
          hello: '确认',
        }
      },
      "en":{
        message:{
          hello: 'ENTER',
        }
      }, */
    },
    availableLocales: ['zh', 'en'],
    sync: true, 
    silentTranslationWarn: true, // true - warning off
    missingWarn: false,
    silentFallbackWarn: true,
  };
}

export async function setupI18n(app: App) {
  const options = await createI18nOptions();
  console.log('setupI18n', options);
  i18n = createI18n(options) as I18n;
  app.use(i18n);
}

 3、mian.js

import { createApp } from 'vue';
import App from './App.vue';
import { router } from './router';
import { setupI18n } from './locales/index';  //自定义的国际化配置文件


const app = createApp(App);
  // 初始化插件
  app.use(store);
  app.use(router);

// 初始化 i18n
await setupI18n(app);


// 挂载应用
app.mount('#app');

4、zh.json    en.json  文件 

// zh.json

{
  "btn": {
    "save": "保存",
    "close": "关闭"
  },
    // 多个对象
}



// en.json
{
  "btn": {
    "save": "save",
    "close": "close"
  },
    // 多个对象
}

5、 切换语言vue文件

<el-dropdown @command="handleLanguageChange"> 
                <div class="el-dropdown-link">
                    {{ currentLanguage }} 
                    <el-icon><Switch /></el-icon>
                </div>
                <template #dropdown>
                    <el-dropdown-menu>
                        <el-dropdown-item v-for="lang in languages" :key="lang.value"                 
                          :command="lang.value">{{ lang.label }}</el-dropdown-item>
                    </el-dropdown-menu>
                </template>
</el-dropdown>

const languages = [
    { label: '中文', value: 'zh' },
    { label: 'English', value: 'en' },
];
const currentValue = ref(localStorage.getItem('lang') || 'en');
const currentLanguage = ref(languages.find(item => item.value === currentValue.value)?.label);

// 切换语言
const handleLanguageChange = (lang) => {
    console.log('lang',lang);
    currentLanguage.value = languages.find(item => item.value === lang)?.label || 'English'; 
    localStorage.setItem('lang',lang)
   
    locale.value = lang;
    console.log('lang',locale.value);
    // todo  强制刷新一下本页面
    window.location.reload()
    handleProcStatus
    
};

 

相关文章:

  • 【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记
  • Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
  • 基于数字水印的公文流转系统设计与实现
  • Java的关键字、标识符与数据类型详解
  • 内联汇编知识点earlyclobber=
  • Windows启动总是卡在LOGO画面有哪些原因
  • Java 设计模式:装饰者模式详解
  • 阿里云服务迁移实战: 02-服务器迁移
  • 作为一名java技术博主如何突围
  • 大模型技术发展与应用趋势分析
  • FFMPEG大文件视频分割传输教程,微信不支持1G文件以上
  • Git 标签
  • C++学习之ORACLE③
  • 龙虎榜——20250411
  • 触觉智能RK3506核心板,工业应用之EtherCAT总线
  • 使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键
  • 电脑和手机磁盘将满的处理办法
  • C++学习之密码学知识
  • 你所拨打的电话是空号?手机状态查询API
  • QML布局
  • 织梦个人网站模板/在线磁力搜索神器
  • 网站建设行业的趋势/百度平台营销
  • 北京小程序网站制作/今天最近的新闻
  • 湖北武汉最新消息/厦门seo外包服务
  • 网站制作制作公司/网络营销顾问工作内容
  • 湖南网站开发 岚鸿/哈尔滨seo关键词