fix(theme): preserve url params when switching languages (#5312)

pull/5314/head
Bjorn Lu 2 months ago committed by GitHub
parent c34769c2e6
commit 9ee401d7ad
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,5 +1,5 @@
import { resolveLocaleLink } from 'client/theme-default/composables/langs' import { resolveLocaleLink } from 'client/theme-default/composables/langs'
import type { VitePressData } from 'vitepress' import type { Route, VitePressData } from 'vitepress'
import type { DefaultTheme } from 'vitepress/theme' import type { DefaultTheme } from 'vitepress/theme'
import { ref } from 'vue' import { ref } from 'vue'
@ -24,29 +24,38 @@ function createData(
} as unknown as VitePressData<DefaultTheme.Config> } as unknown as VitePressData<DefaultTheme.Config>
} }
function createRoute(query = '', hash = '#install') {
return {
query,
hash
} as unknown as Route
}
describe('client/theme-default/composables/langs', () => { describe('client/theme-default/composables/langs', () => {
test('resolves corresponding links with the default router', () => { test('resolves corresponding links with the default router', () => {
expect(resolveLocaleLink(createData({}), 'fr', '/fr/', '/', true)).toBe( expect(
'/fr/guide/getting-started.html#install' resolveLocaleLink(createData({}), createRoute(), 'fr', '/fr/', '/', true)
) ).toBe('/fr/guide/getting-started.html#install')
}) })
test('resolves clean index links with the default router', () => { test('resolves clean index links with the default router', () => {
expect( expect(
resolveLocaleLink( resolveLocaleLink(
createData({}, 'en/guide/index.md', true, '#intro'), createData({}, 'en/guide/index.md', true, '#intro'),
createRoute('?query', '#intro'),
'fr', 'fr',
'/fr/', '/fr/',
'/en/', '/en/',
true true
) )
).toBe('/fr/guide/#intro') ).toBe('/fr/guide/?query#intro')
}) })
test('keeps locale root links when i18n routing is disabled', () => { test('keeps locale root links when i18n routing is disabled', () => {
expect( expect(
resolveLocaleLink( resolveLocaleLink(
createData({ i18nRouting: false }), createData({ i18nRouting: false }),
createRoute(),
'fr', 'fr',
'/fr/', '/fr/',
'/', '/',
@ -62,8 +71,8 @@ describe('client/theme-default/composables/langs', () => {
} }
}) })
expect(resolveLocaleLink(data, 'fr', '/fr/', '/', true)).toBe( expect(
'/fr/mapped/guide/getting-started.md#install' resolveLocaleLink(data, createRoute(), 'fr', '/fr/', '/', true)
) ).toBe('/fr/mapped/guide/getting-started.md#install')
}) })
}) })

@ -1,11 +1,13 @@
import { computed } from 'vue' import { computed } from 'vue'
import type { DefaultTheme } from 'vitepress/theme' import type { DefaultTheme } from 'vitepress/theme'
import type { VitePressData } from '../../app/data' import type { VitePressData } from '../../app/data'
import { useRoute, type Route } from '../../app/router'
import { ensureStartingSlash } from '../support/utils' import { ensureStartingSlash } from '../support/utils'
import { useData } from './data' import { useData } from './data'
export function useLangs({ correspondingLink = false } = {}) { export function useLangs({ correspondingLink = false } = {}) {
const data = useData() const data = useData()
const route = useRoute()
const { site, localeIndex } = data const { site, localeIndex } = data
const currentLang = computed(() => ({ const currentLang = computed(() => ({
label: site.value.locales[localeIndex.value]?.label, label: site.value.locales[localeIndex.value]?.label,
@ -22,6 +24,7 @@ export function useLangs({ correspondingLink = false } = {}) {
text: value.label, text: value.label,
link: resolveLocaleLink( link: resolveLocaleLink(
data, data,
route,
key, key,
value.link || (key === 'root' ? '/' : `/${key}/`), value.link || (key === 'root' ? '/' : `/${key}/`),
currentLang.value.link, currentLang.value.link,
@ -38,16 +41,17 @@ export function useLangs({ correspondingLink = false } = {}) {
export function resolveLocaleLink( export function resolveLocaleLink(
data: VitePressData<DefaultTheme.Config>, data: VitePressData<DefaultTheme.Config>,
route: Route,
targetLocale: string, targetLocale: string,
targetLink: string, targetLink: string,
currentLink: string, currentLink: string,
correspondingLink: boolean correspondingLink: boolean
) { ) {
const { site, page, theme, hash } = data const { site, page, theme } = data
const i18nRouting = theme.value.i18nRouting const i18nRouting = theme.value.i18nRouting
if (correspondingLink && typeof i18nRouting === 'function') { if (correspondingLink && typeof i18nRouting === 'function') {
return i18nRouting(data, hash.value, targetLocale) return i18nRouting(data, route.hash, targetLocale)
} }
return ( return (
@ -56,7 +60,9 @@ export function resolveLocaleLink(
i18nRouting !== false && correspondingLink, i18nRouting !== false && correspondingLink,
page.value.relativePath.slice(currentLink.length - 1), page.value.relativePath.slice(currentLink.length - 1),
!site.value.cleanUrls !site.value.cleanUrls
) + hash.value ) +
route.query +
route.hash
) )
} }

Loading…
Cancel
Save