From 2813002344ff45669b90dcbd5f9e26b5679c04fa Mon Sep 17 00:00:00 2001 From: "tangly1024.com" Date: Wed, 10 Apr 2024 18:35:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2=E8=AF=AD=E8=A8=80=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/global.js | 32 ++++++++++++++++++++++++++------ lib/lang.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/lib/global.js b/lib/global.js index 77b94e2d..d673c3ea 100644 --- a/lib/global.js +++ b/lib/global.js @@ -1,8 +1,17 @@ -import { generateLocaleDict, initLocale, saveLangToLocalStorage } from './lang' -import { createContext, useContext, useEffect, useState } from 'react' +import { + THEMES, + initDarkMode, + saveDarkModeToLocalStorage +} from '@/themes/theme' +import { APPEARANCE, LANG, NOTION_PAGE_ID, THEME } from 'blog.config' import { useRouter } from 'next/router' -import { THEMES, initDarkMode, saveDarkModeToLocalStorage } from '@/themes/theme' -import { APPEARANCE, LANG, THEME } from 'blog.config' +import { createContext, useContext, useEffect, useState } from 'react' +import { + generateLocaleDict, + initLocale, + redirectUserLang, + saveLangToLocalStorage +} from './lang' const GlobalContext = createContext() /** @@ -12,9 +21,18 @@ const GlobalContext = createContext() * @constructor */ export function GlobalContextProvider(props) { - const { post, children, siteInfo, categoryOptions, tagOptions, NOTION_CONFIG } = props + const { + post, + children, + siteInfo, + categoryOptions, + tagOptions, + NOTION_CONFIG + } = props const [lang, updateLang] = useState(NOTION_CONFIG?.LANG || LANG) // 默认语言 - const [locale, updateLocale] = useState(generateLocaleDict(NOTION_CONFIG?.LANG || LANG)) // 默认语言 + const [locale, updateLocale] = useState( + generateLocaleDict(NOTION_CONFIG?.LANG || LANG) + ) // 默认语言 const [theme, setTheme] = useState(NOTION_CONFIG?.THEME || THEME) // 默认博客主题 const defaultDarkMode = NOTION_CONFIG?.APPEARANCE || APPEARANCE const [isDarkMode, updateDarkMode] = useState(defaultDarkMode === 'dark') // 默认深色模式 @@ -48,6 +66,7 @@ export function GlobalContextProvider(props) { /** * 更新语言 + * 这里是代码级别的多语言,整个站点和文章内容的多语言不在此处理 */ function changeLang(lang) { if (lang) { @@ -60,6 +79,7 @@ export function GlobalContextProvider(props) { useEffect(() => { initDarkMode(updateDarkMode, defaultDarkMode) initLocale(lang, locale, updateLang, updateLocale) + redirectUserLang(NOTION_PAGE_ID) }, []) // 加载进度条 diff --git a/lib/lang.js b/lib/lang.js index e05ac5e3..ca92f793 100644 --- a/lib/lang.js +++ b/lib/lang.js @@ -6,6 +6,7 @@ import trTR from './lang/tr-TR' import zhCN from './lang/zh-CN' import zhHK from './lang/zh-HK' import zhTW from './lang/zh-TW' +import { extractLangPrefix } from './utils/pageId' /** * 在这里配置所有支持的语言 @@ -102,3 +103,36 @@ export const loadLangFromLocalStorage = () => { export const saveLangToLocalStorage = lang => { localStorage.setItem('lang', lang) } + +/** + * 检测用户的预研偏好,跳转至对应的多语言网站 + * @param {*} lang + * @param {*} pageId + * + */ +export const redirectUserLang = (lang, pageId) => { + if (!isBrowser) { + return + } + // 只在首页处理跳转 + if (!window.location.pathname === '/') { + return + } + + const userLang = + getQueryVariable('locale') || + getQueryVariable('lang') || + window?.navigator?.language + const siteIds = pageId.split(',') + + // 默认是进首页; 如果检测到有一个多语言匹配了用户浏览器,则自动跳转过去 + for (let index = 0; index < siteIds.length; index++) { + const siteId = siteIds[index] + const prefix = extractLangPrefix(siteId) + if (prefix === userLang) { + if (window.location.pathname.indexOf(prefix) < 0) { + window.location.href = '/' + prefix + } + } + } +}