12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import { computed } from 'vue'
- import { useRoute, useSiteData, inBrowser } from 'vitepress'
- import type { DefaultTheme } from '../config'
- export function useLocaleLinks() {
- const route = useRoute()
- const site = useSiteData()
- return computed(() => {
- const theme = site.value.themeConfig as DefaultTheme.Config
- const locales = theme.locales
- if (!locales) {
- return null
- }
- const localeKeys = Object.keys(locales)
- if (localeKeys.length <= 1) {
- return null
- }
- // handle site base
- const siteBase = inBrowser ? site.value.base : '/'
- const siteBaseWithoutSuffix = siteBase.endsWith('/')
- ? siteBase.slice(0, -1)
- : siteBase
- // remove site base in browser env
- const routerPath = route.path.slice(siteBaseWithoutSuffix.length)
- const currentLangBase = localeKeys.find((key) => {
- return key === '/' ? false : routerPath.startsWith(key)
- })
- const currentContentPath = currentLangBase
- ? routerPath.substring(currentLangBase.length - 1)
- : routerPath
- const candidates = localeKeys.map((v) => {
- const localePath = v.endsWith('/') ? v.slice(0, -1) : v
- return {
- text: locales[v].label,
- link: `${localePath}${currentContentPath}`
- }
- })
- const currentLangKey = currentLangBase ? currentLangBase : '/'
- const selectText = locales[currentLangKey].selectText
- ? locales[currentLangKey].selectText
- : 'Languages'
- return {
- text: selectText,
- items: candidates
- } as DefaultTheme.NavItemWithChildren
- })
- }
|