import { defineAsyncComponent } from 'vue'
import langs from './i18n/route'
import navConfig from './nav.config'
import { Language } from './enums/language'
const LoadingComponent = {
template: `
`,
}
const ErrorComponent = {
template: `
Loading error. Please refresh the page and try again
`,
}
const getAsyncComponent = (func) => {
return defineAsyncComponent({
loader: func,
delay: 0,
timeout: 30000,
errorComponent: ErrorComponent,
loadingComponent: LoadingComponent,
})
}
const LOAD_MAP = {
[Language.CN]: (name) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "zh-CN" */ `./pages/${name}.vue`)
)
},
[Language.EN]: (name) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "en-US" */ `./pages/${name}.vue`)
)
},
[Language.ES]: (name) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "es" */ `./pages/${name}.vue`)
)
},
[Language.FR]: (name) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "fr-FR" */ `./pages/${name}.vue`)
)
},
[Language.JP]: (name) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "jp" */ `./pages/${name}.vue`)
)
},
}
const load = function (lang, path) {
return LOAD_MAP[lang](path)
}
const LOAD_DOCS_MAP = {
[Language.CN]: (path) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "DOCS zh-CN" */ `./docs/zh-CN${path}.md`)
)
},
[Language.EN]: (path) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "DOCS en-US" */ `./docs/en-US${path}.md`)
)
},
[Language.ES]: (path) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "DOCS es" */ `./docs/es${path}.md`)
)
},
[Language.FR]: (path) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "DOCS fr-FR" */ `./docs/fr-FR${path}.md`)
)
},
[Language.JP]: (path) => {
return getAsyncComponent(() =>
import(/* webpackChunkName: "DOCS jp" */ `./docs/jp${path}.md`)
)
},
}
const loadDocs = function (lang, path) {
return LOAD_DOCS_MAP[lang](path)
}
const registerRoute = (navConfig) => {
let route = []
Object.keys(navConfig).forEach((lang, index) => {
let navs = navConfig[lang]
route.push({
path: `/${lang}/component`,
redirect: `/${lang}/component/installation`,
component: load(lang, 'component'),
children: [],
})
navs.forEach((nav) => {
if (nav.href) return
if (nav.groups) {
nav.groups.forEach((group) => {
group.list.forEach((nav) => {
addRoute(nav, lang, index)
})
})
} else if (nav.children) {
nav.children.forEach((nav) => {
addRoute(nav, lang, index)
})
} else {
addRoute(nav, lang, index)
}
})
})
function addRoute(page, lang, index) {
const component =
page.path === '/changelog'
? load(lang, 'changelog')
: loadDocs(lang, page.path)
let child = {
path: page.path.slice(1),
meta: {
title: page.title || page.name,
description: page.description,
lang,
},
name: 'component-' + lang + (page.title || page.name),
component: component.default || component,
}
route[index].children.push(child)
}
return route
}
let route = registerRoute(navConfig)
const generateMiscRoutes = function (lang) {
let guideRoute = {
path: `/${lang}/guide`, // 指南
redirect: `/${lang}/guide/design`,
component: load(lang, 'guide'),
children: [
{
path: 'design', // 设计原则
name: 'guide-design' + lang,
meta: { lang },
component: load(lang, 'design'),
},
{
path: 'nav', // 导航
name: 'guide-nav' + lang,
meta: { lang },
component: load(lang, 'nav'),
},
],
}
let resourceRoute = {
path: `/${lang}/resource`, // 资源
meta: { lang },
name: 'resource' + lang,
component: load(lang, 'resource'),
}
let indexRoute = {
path: `/${lang}`, // 首页
meta: { lang },
name: 'home' + lang,
component: load(lang, 'index'),
}
return [guideRoute, resourceRoute, indexRoute]
}
langs.forEach((lang) => {
route = route.concat(generateMiscRoutes(lang.lang))
})
let userLanguage =
localStorage.getItem('ELEMENT_LANGUAGE') ||
window.navigator.language ||
Language.EN
let defaultPath = Language.EN
if (userLanguage.indexOf('zh-') !== -1) {
defaultPath = Language.CN
} else if (userLanguage.indexOf('es') !== -1) {
defaultPath = Language.ES
} else if (userLanguage.indexOf('fr') !== -1) {
defaultPath = Language.FR
} else if (userLanguage.indexOf('jp') !== -1) {
defaultPath = Language.JP
}
route = route.concat([
{
path: '/',
redirect: { path: `/${defaultPath}` },
},
{
path: '/*',
redirect: { path: `/${defaultPath}` },
},
])
export default route