vitepress多语言实现第一次跟随浏览器,第二次不跟随

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

就像我的项目PakePlus的官网一样: pakeplus.com,第一次加载的时候,根据浏览器的默认语言,以后就不跟随了,用户选择什么语言就是什么语言,然后根据不同的语言,展示不同的提示内容。

实现逻辑就是创建一个脚本,来判断是不是第一次加载,可以在js脚本中,然后将这个js脚本添加到vitepress的加载脚本中。另外一种就是创建一个vue组建,然后在首页加载这个vue组建,在这个vue组建中实现相应的逻辑。

第一种方案js脚本

脚本逻辑如下,可以参考

第二种vue组建

创建一个组建来判断是不是第一次加载,并根据相应的语言提示公告

html 复制代码
<template>
    <div v-if="notesData.show" class="modalBox">
        <div class="modalContent">
            <h1 class="modalTitle">{{ title }}</h1>
            <p class="modalNotes">{{ content }}</p>
            <div class="modalButtons">
                <button id="modalOk" @click="closeNotes">{{ okText }}</button>
            </div>
        </div>
    </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useData } from 'vitepress'

const vpData = useData()
const title = ref('')
const content = ref('')
const okText = ref('')
const notesData = ref({
    version: '0.5.30',
    show: false,
    pub_date: '2025-06-02T09:00:33.251Z',
    zh: 'PakePlus正在优化升级,暂时无法使用云端打包,请使用本地打包的方式,好了会在微信群发通知,感谢理解!',
    en: 'PakePlus is optimizing and upgrading, please use local packaging instead,thank you for your understanding!',
    ja: 'PakePlus は Github Token 方式のパッケージングをサポートしなくなりました。ローカルパッケージングを使用してください,感謝します!',
    ko: 'PakePlus 는 Github Token 방식의 패키징을 지원하지 않습니다. 로컬 패키징을 사용하세요,感謝します!',
    zhTw: 'PakePlus 正在优化升级,暂时无法使用云端打包,请使用本地打包的方式,感谢理解!',
    openUrl: '',
    overall: false,
})

const initNotes = async () => {
    const ppnotesJson = await fetch('/ppnotes.json')
    const ppnotesJsonData = await ppnotesJson.json()
    notesData.value = ppnotesJsonData
    console.log('ppnotesJsonData', ppnotesJsonData)
    const isChinese = window.location.href.includes('zh')
    const contentValue = isChinese ? ppnotesJsonData.zh : ppnotesJsonData.en
    const titleValue = isChinese ? 'PackPlus公告' : 'PakePlus Notice'
    const okTextValue = isChinese ? '确定' : 'OK'
    if (ppnotesJsonData.show) {
        title.value = titleValue
        content.value = contentValue
        okText.value = okTextValue
    }
}

const closeNotes = () => {
    if (notesData.value.openUrl) {
        window.open(notesData.value.openUrl, '_blank')
    }
    notesData.value.show = false
}

const initLang = () => {
    const isFirst = localStorage.getItem('first_visit')
    const browserLang = navigator.language
    console.log('browserLang-initLang', browserLang)
    if (isFirst) {
        console.log('cookieLang is not empty')
    } else {
        if (browserLang === 'zh-CN') {
            window.location.href = '/zh'
        } else {
            window.location.href = '/'
        }
        localStorage.setItem('first_visit', 'true')
    }
}

onMounted(() => {
    console.log('vpData-----', vpData)
    initLang()
    initNotes()
})
</script>

<style scoped lang="scss">
.modalBox {
    position: fixed;
    z-index: 1000;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    align-items: center;
    padding-top: 150px;
}

.modalContent {
    background: white;
    padding: 20px;
    border-radius: 5px;
    color: #000;
    width: 40%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

@media only screen and (max-width: 600px) {
    .modalContent {
        width: 80%;
    }
}

.modalTitle {
    font-size: 24px;
    font-weight: bold;
    margin-bottom: 20px;
}

.modalButtons {
    display: flex;
    justify-content: center;
    gap: 10px;
}

.modalButtons button {
    padding: 8px 20px;
    border-radius: 10px;
    cursor: pointer;
    background-color: #409eff;
    color: #fff;
    border: none;
    margin-top: 20px;
}

.modalButtons button:hover {
    background-color: #3688fa;
}

.modalButtons button:active {
    background-color: #3688fa;
}
</style>

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

相关推荐
天若有情67321 分钟前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
香香爱编程27 分钟前
electron对于图片/视频无法加载的问题
前端·javascript·vue.js·chrome·vscode·electron·npm
程序猿_极客1 小时前
【期末网页设计作业】HTML+CSS+JavaScript 蜡笔小新 动漫主题网站设计与实现(附源码)
前端·javascript·css·html·课程设计·期末网页设计
zl_vslam1 小时前
SLAM中的非线性优-3D图优化之轴角在Opencv-PNP中的应用(一)
前端·人工智能·算法·计算机视觉·slam se2 非线性优化
CDwenhuohuo2 小时前
用spark-md5实现切片上传前端起node模拟上传文件大小,消耗时间
前端
阿桂有点桂2 小时前
React使用笔记(持续更新中)
前端·javascript·react.js·react
自由日记2 小时前
实例:跳动的心,火柴人
前端·css·css3
柯腾啊2 小时前
一文简单入门 Axios
前端·axios·apifox
im_AMBER2 小时前
React 15
前端·javascript·笔记·学习·react.js·前端框架
How_doyou_do3 小时前
模态框的两种管理思路
java·服务器·前端