nuxt2 国际化i18n使用,语言切换

news/2024/9/21 11:10:35
目标实现:
1.语言切换
2.路由切换nuxt.config.js 
export default = {modules: ["@nuxtjs/i18n",],i18n: {langDir: "locales/", // 本地语言配置目录locales: [{code: "en",iso: "en",name: 'English',file: "en.json",},{code: "cn",iso: "cn",name: '简体中文',file: "cn.json",},{code: "tw",iso: "tw",name: '繁体中文',file: "tw.json",},],lazy: false,strategy: "prefix_and_default", // 路由策略,可选值有 prefix_except_default, prefix_and_default, prefix, no_prefix 等defaultLocale: 'en', // 直接设置默认语言代码vueI18n: {fallbackLocale: 'en',messages: {} // 动态加载语言文件时可以留空},detectBrowserLanguage: {useCookie: true,cookieKey: 'language',onlyOnRoot: true, // 这意味着只在用户首次访问应用的根路径时进行语言重定向},// router: { // 自定义路由规则 添加前缀,但保持自定义路由结构//     path: '{{$locale}}/_custom_path', // 注意:对于完全自定义的路由,你可能需要根据实际情况调整这部分配置//     prefix: '{{$locale}}' // 或者如果所有路由都应该是 /lang/path 这样的形式,则可以简化为// }// 配置未生效使用其他方式实现},
}router.js 主要部分代码
const languages = ['en', 'cn', 'tw']; // 示例语言数组,根据实际情况调整
// 动态语言生成路由
function generateLocalizedRoutes(routesBase) {return languages.flatMap(lang => {return routesBase.map(route => {const localizedRoute = { ...route };//   if (localizedRoute.path !== '/') {localizedRoute.path = `/${lang}${localizedRoute.path}`;//   }return localizedRoute;});});
}
// 添加多语言的路由配置合并路由
routes = routes.concat(generateLocalizedRoutes(routes))
console.log(routes)
// 添加一个组件进行测试<template><div class="pl-15"><el-selectv-model="lang"placeholder="Select"size="mini"style="width: 100px"><el-optionv-for="item in locales":key="item.value":label="item.label":value="item.value"/></el-select></div>
</template>
<script>
import { mapMutations } from "vuex";
export default {data() {return {lang: "en",locales: [{value: "en",label: "英文",},{value: "cn",label: "中文简体",},{value: "tw",label: "中文繁体",},],};},watch: {lang(newLang) {this.changeLanguage(newLang);// 获取当前路径去除语言前缀let pathWithoutLang = this.$route.path;const langKeys = this.locales.map((item) => item.value);// 如果当前路径以支持的语言开始,则去除该前缀if (langKeys.some((lang) => pathWithoutLang.startsWith(`/${lang}`))) {const langIndex = pathWithoutLang.indexOf("/", 1); // 找到第一个斜杠后的索引pathWithoutLang =langIndex > 0 ? pathWithoutLang.substring(langIndex) : "";}// 构建新路径并导航const newPath = `/${newLang}${pathWithoutLang.startsWith("/") ? "" : "/"}${pathWithoutLang}`;this.$router.replace(newPath).catch((error) => {if (error.name !== "NavigationDuplicated") throw error; // 非重复导航错误重新抛出});},},created() {this.lang = this.$cookies.get("language") || "en";},methods: {...mapMutations(["setLanguage"]),changeLanguage(newLanguage) {// 这里可以直接调用从 mutation 映射过来的方法this.setLanguage(newLanguage);},hasCommonItem(arr1, arr2) {const set = new Set(arr1);return arr2.some((item) => set.has(item));},},
};
</script>

实现效果:
路由携带语言,切换语言对应全局存储语言变量修改,cookie缓存修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/47317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

redis自学(48)集群最佳实践

集群最佳实践 集群完整性问题 在redis的默认配置中,如果发现任意一个插槽不可用,则整个集群都会停止对外服务:为了保证高可用特性,这里建议蒋cluster-require-full-coverage配置为false 集群带宽问题 集群节点之间会不断的互相ping来确定集群中其他节点的状态。每次ping携带…

lxl 数据结构(一)(1)

lxl 数据结构(一)(1) Day 1 线段树+平衡树-颜色段均摊 Day 2 扫描线模型lxl 数据结构(一) 2023.11.23-2023.12 讲课人:lxl前言 这篇学习笔记也是写了半年之久了吧,虽然总是断断续续。 这是(一),很快在七月份也有二推出。 这些日子里面,我在英才集训时也分享过一次扫描…

sql知识

1.关联式资料库存储形式 以表格形式存储,然后表格之间会有关联。即表格是数据存储的单元。表格的描述:行row为一笔资料。列column为一个表格的属性。每个表格里至少需要一个属性作为主键。主键:唯一确定一笔资料的标识。我们不想一张表里出现两笔同样的数据。外键:一张表和…

FPGA对EEPROM驱动控制(I2C协议)

本文摘要:本文首先对I2C协议的通信模式和AT24C16-EEPROM芯片时序控制进行分析和理解,设计了一个i2c通信方案。人为按下写操作按键后,FPGA(Altera EP4CE10)对EEPROM指定地址写入字节数据,并接后按下读操作按键,读取该地址上的一个字节数据在数码管低两位显示出来。其中包…

BOSHIDA DC/AC电源模块:推动工业自动化技术的发展

BOSHIDA DC/AC电源模块:推动工业自动化技术的发展 工业自动化技术是当今工业领域的重要发展方向,它的出现和发展为工业生产带来了巨大的变革。而DC/AC电源模块作为工业自动化技术的重要组成部分,为工业自动化的发展起到了至关重要的推动作用。 DC/AC电源模块作为一种用于改…

数据标注工具 doccano | 命名实体识别(Named Entity Recognition,简称NER)

目录安装数据准备创建项目创建抽取式任务上传定义标签构建抽取式任务标签任务标注命名实体识别导出数据查看数据 命名实体识别(Named Entity Recognition,简称NER),是指识别文本中具有特定意义的实体。在开放域信息抽取中,抽取的类别没有限制,用户可以自己定义。 安装 详…