mirror of https://github.com/vuejs/vitepress
feat: i18n support (#50)
parent
692a490986
commit
7802cb55c2
@ -0,0 +1,10 @@
|
||||
import { computed } from 'vue'
|
||||
import { resolveSiteDataByRoute } from '/@shared/config'
|
||||
import { siteDataRef } from './siteData'
|
||||
import { useRoute } from '../router'
|
||||
|
||||
export function useSiteDataByRoute(route = useRoute()) {
|
||||
return computed(() => {
|
||||
return resolveSiteDataByRoute(siteDataRef.value, route.path)
|
||||
})
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../dist/node",
|
||||
"outDir": "../../dist",
|
||||
"module": "commonjs",
|
||||
"lib": ["ESNext", "DOM"],
|
||||
"sourceMap": true
|
||||
},
|
||||
"include": [".", "../../types/shared.d.ts"]
|
||||
"include": [".", "../shared", "../../types/shared.d.ts"]
|
||||
}
|
||||
|
@ -0,0 +1,48 @@
|
||||
import { SiteData } from '../../types/shared'
|
||||
|
||||
function findMatchRoot(route: string, roots: string[]) {
|
||||
// first match to the routes with the most deep level.
|
||||
roots.sort((a, b) => {
|
||||
const levelDelta = b.split('/').length - a.split('/').length
|
||||
if (levelDelta !== 0) {
|
||||
return levelDelta
|
||||
} else {
|
||||
return b.length - a.length
|
||||
}
|
||||
})
|
||||
|
||||
for (const r of roots) {
|
||||
if (route.startsWith(r)) return r
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
function resolveLocales<T>(
|
||||
locales: Record<string, T>,
|
||||
route: string
|
||||
): T | undefined {
|
||||
const localeRoot = findMatchRoot(route, Object.keys(locales))
|
||||
return localeRoot ? locales[localeRoot] : undefined
|
||||
}
|
||||
|
||||
// this merges the locales data to the main data by the route
|
||||
export function resolveSiteDataByRoute(siteData: SiteData, route: string) {
|
||||
const localeData = resolveLocales(siteData.locales || {}, route) || {}
|
||||
const localeThemeConfig =
|
||||
resolveLocales<any>(
|
||||
(siteData.themeConfig && siteData.themeConfig.locales) || {},
|
||||
route
|
||||
) || {}
|
||||
|
||||
return {
|
||||
...siteData,
|
||||
...localeData,
|
||||
themeConfig: {
|
||||
...siteData.themeConfig,
|
||||
...localeThemeConfig,
|
||||
// clean the locales to reduce the bundle size
|
||||
locales: {}
|
||||
},
|
||||
locales: {}
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"outDir": "../../dist/client/shared",
|
||||
"module": "esnext",
|
||||
"lib": ["ESNext", "DOM"],
|
||||
},
|
||||
"include": [
|
||||
".",
|
||||
"../../types/shared.d.ts",
|
||||
]
|
||||
}
|
Loading…
Reference in new issue