mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-06-04 15:10:23 +00:00
多语言版本自动切换语言处理
This commit is contained in:
@@ -1,8 +1,17 @@
|
|||||||
import { generateLocaleDict, initLocale, saveLangToLocalStorage } from './lang'
|
import {
|
||||||
import { createContext, useContext, useEffect, useState } from 'react'
|
THEMES,
|
||||||
|
initDarkMode,
|
||||||
|
saveDarkModeToLocalStorage
|
||||||
|
} from '@/themes/theme'
|
||||||
|
import { APPEARANCE, LANG, NOTION_PAGE_ID, THEME } from 'blog.config'
|
||||||
import { useRouter } from 'next/router'
|
import { useRouter } from 'next/router'
|
||||||
import { THEMES, initDarkMode, saveDarkModeToLocalStorage } from '@/themes/theme'
|
import { createContext, useContext, useEffect, useState } from 'react'
|
||||||
import { APPEARANCE, LANG, THEME } from 'blog.config'
|
import {
|
||||||
|
generateLocaleDict,
|
||||||
|
initLocale,
|
||||||
|
redirectUserLang,
|
||||||
|
saveLangToLocalStorage
|
||||||
|
} from './lang'
|
||||||
const GlobalContext = createContext()
|
const GlobalContext = createContext()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,9 +21,18 @@ const GlobalContext = createContext()
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export function GlobalContextProvider(props) {
|
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 [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 [theme, setTheme] = useState(NOTION_CONFIG?.THEME || THEME) // 默认博客主题
|
||||||
const defaultDarkMode = NOTION_CONFIG?.APPEARANCE || APPEARANCE
|
const defaultDarkMode = NOTION_CONFIG?.APPEARANCE || APPEARANCE
|
||||||
const [isDarkMode, updateDarkMode] = useState(defaultDarkMode === 'dark') // 默认深色模式
|
const [isDarkMode, updateDarkMode] = useState(defaultDarkMode === 'dark') // 默认深色模式
|
||||||
@@ -48,6 +66,7 @@ export function GlobalContextProvider(props) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新语言
|
* 更新语言
|
||||||
|
* 这里是代码级别的多语言,整个站点和文章内容的多语言不在此处理
|
||||||
*/
|
*/
|
||||||
function changeLang(lang) {
|
function changeLang(lang) {
|
||||||
if (lang) {
|
if (lang) {
|
||||||
@@ -60,6 +79,7 @@ export function GlobalContextProvider(props) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initDarkMode(updateDarkMode, defaultDarkMode)
|
initDarkMode(updateDarkMode, defaultDarkMode)
|
||||||
initLocale(lang, locale, updateLang, updateLocale)
|
initLocale(lang, locale, updateLang, updateLocale)
|
||||||
|
redirectUserLang(lang, NOTION_PAGE_ID)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
// 加载进度条
|
// 加载进度条
|
||||||
|
|||||||
31
lib/lang.js
31
lib/lang.js
@@ -6,6 +6,7 @@ import trTR from './lang/tr-TR'
|
|||||||
import zhCN from './lang/zh-CN'
|
import zhCN from './lang/zh-CN'
|
||||||
import zhHK from './lang/zh-HK'
|
import zhHK from './lang/zh-HK'
|
||||||
import zhTW from './lang/zh-TW'
|
import zhTW from './lang/zh-TW'
|
||||||
|
import { extractLangPrefix } from './utils/pageId'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在这里配置所有支持的语言
|
* 在这里配置所有支持的语言
|
||||||
@@ -102,3 +103,33 @@ export const loadLangFromLocalStorage = () => {
|
|||||||
export const saveLangToLocalStorage = lang => {
|
export const saveLangToLocalStorage = lang => {
|
||||||
localStorage.setItem('lang', lang)
|
localStorage.setItem('lang', lang)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测用户的预研偏好,跳转至对应的多语言网站
|
||||||
|
* @param {*} lang
|
||||||
|
* @param {*} pageId
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export const redirectUserLang = (lang, pageId) => {
|
||||||
|
if (!isBrowser) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 只在首页处理跳转
|
||||||
|
if (!window.location.pathname === '/') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// const userLang = window?.navigator?.language
|
||||||
|
const userLang = 'en'
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user