fix: language switching now strictly follows URL path

- Remove localStorage dependency for language persistence
- Add route change listener for language updates
- Simplify language switching logic
- Fix language reset issue when refreshing /en pages
This commit is contained in:
Zhenye Dong
2024-11-05 00:09:46 +08:00
parent 129e670b36
commit 44d6756920
2 changed files with 36 additions and 23 deletions

View File

@@ -87,9 +87,35 @@ export function GlobalContextProvider(props) {
}
}
// 添加路由变化时的语言处理
useEffect(() => {
const handleRouteChange = (url) => {
// 从路径中提取语言前缀
const pathSegments = url.split('/')
const pathLang = pathSegments[1]
// 检查是否是有效的语言路径
if (pathLang === 'en' || pathLang === 'zh') {
const targetLang = pathLang === 'en' ? 'en-US' : 'zh-CN'
// 直接更新语言,不使用 localStorage
updateLang(targetLang)
updateLocale(generateLocaleDict(targetLang))
}
}
// 初始化时处理当前路径
handleRouteChange(router.asPath)
// 监听路由变化
router.events.on('routeChangeComplete', handleRouteChange)
return () => {
router.events.off('routeChangeComplete', handleRouteChange)
}
}, [router])
useEffect(() => {
initDarkMode(updateDarkMode, defaultDarkMode)
initLocale(lang, locale, updateLang, updateLocale)
if (
NOTION_CONFIG?.REDIRECT_LANG &&
JSON.parse(NOTION_CONFIG?.REDIRECT_LANG)

View File

@@ -70,34 +70,21 @@ export function generateLocaleDict(langString) {
*/
export function initLocale(lang, locale, changeLang, changeLocale) {
if (isBrowser) {
// 用户请求的语言
let queryLang =
getQueryVariable('locale') ||
getQueryVariable('lang') ||
loadLangFromLocalStorage()
// 只使用 URL 参数,忽略 localStorage
const queryLang = getQueryVariable('locale') || getQueryVariable('lang')
if (queryLang) {
// 用正则表达式匹配有效的语言标识符例如zh-CN可选的 -CN 部分)
queryLang = queryLang.match(/[a-zA-Z]{2}(?:-[a-zA-Z]{2})?/)
if (queryLang) {
queryLang = queryLang[0]
const match = queryLang.match(/[a-zA-Z]{2}(?:-[a-zA-Z]{2})?/)
if (match) {
const targetLang = match[0]
changeLang(targetLang)
const targetLocale = generateLocaleDict(targetLang)
changeLocale(targetLocale)
}
}
let currentLang = lang
if (queryLang && queryLang !== lang) {
currentLang = queryLang
}
changeLang(currentLang)
saveLangToLocalStorage(currentLang)
const targetLocale = generateLocaleDict(currentLang)
if (JSON.stringify(locale) !== JSON.stringify(currentLang)) {
changeLocale(targetLocale)
}
}
}
/**
* 读取语言
* @returns {*}