import navConfig from './nav.config'; import langs from './i18n/route'; const LOAD_MAP = { 'zh-CN': name => { return r => require.ensure([], () => r(require(`./pages/zh-CN/${name}.vue`)), 'zh-CN'); }, 'en-US': name => { return r => require.ensure([], () => r(require(`./pages/en-US/${name}.vue`)), 'en-US'); }, 'es': name => { return r => require.ensure([], () => r(require(`./pages/es/${name}.vue`)), 'es'); }, 'fr-FR': name => { return r => require.ensure([], () => r(require(`./pages/fr-FR/${name}.vue`)), 'fr-FR'); } }; const load = function(lang, path) { return LOAD_MAP[lang](path); }; const LOAD_DOCS_MAP = { 'zh-CN': path => { return r => require.ensure([], () => r(require(`./docs/zh-CN${path}.md`)), 'zh-CN'); }, 'en-US': path => { return r => require.ensure([], () => r(require(`./docs/en-US${path}.md`)), 'en-US'); }, 'es': path => { return r => require.ensure([], () => r(require(`./docs/es${path}.md`)), 'es'); }, 'fr-FR': path => { return r => require.ensure([], () => r(require(`./docs/fr-FR${path}.md`)), 'fr-FR'); } }; 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 themeRoute = { path: `/${ lang }/theme`, component: load(lang, 'theme-nav'), children: [ { path: '/', // 主题管理 name: 'theme' + lang, meta: { lang }, component: load(lang, 'theme') }, { path: 'preview', // 主题预览编辑 name: 'theme-preview-' + lang, meta: { lang }, component: load(lang, 'theme-preview') }] }; 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, themeRoute, indexRoute]; }; langs.forEach(lang => { route = route.concat(generateMiscRoutes(lang.lang)); }); route.push({ path: '/play', name: 'play', component: require('./play/index.vue') }); let userLanguage = localStorage.getItem('ELEMENT_LANGUAGE') || window.navigator.language || 'en-US'; let defaultPath = '/en-US'; if (userLanguage.indexOf('zh-') !== -1) { defaultPath = '/zh-CN'; } else if (userLanguage.indexOf('es') !== -1) { defaultPath = '/es'; } else if (userLanguage.indexOf('fr') !== -1) { defaultPath = '/fr-FR'; } route = route.concat([{ path: '/', redirect: defaultPath }, { path: '*', redirect: defaultPath }]); export default route;