route.config.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import navConfig from './nav.config.json';
  2. import langs from './i18n/route.json';
  3. const LOAD_MAP = {
  4. 'zh-CN': name => {
  5. return r => require.ensure([], () =>
  6. r(require(`./pages/zh-CN/${name}.vue`)),
  7. 'zh-CN');
  8. },
  9. 'en-US': name => {
  10. return r => require.ensure([], () =>
  11. r(require(`./pages/en-US/${name}.vue`)),
  12. 'en-US');
  13. }
  14. };
  15. const load = function(lang, path) {
  16. return LOAD_MAP[lang](path);
  17. };
  18. const LOAD_DOCS_MAP = {
  19. 'zh-CN': path => {
  20. return r => require.ensure([], () =>
  21. r(require(`./docs/zh-CN${path}.md`)),
  22. 'zh-CN');
  23. },
  24. 'en-US': path => {
  25. return r => require.ensure([], () =>
  26. r(require(`./docs/en-US${path}.md`)),
  27. 'en-US');
  28. }
  29. };
  30. const loadDocs = function(lang, path) {
  31. return LOAD_DOCS_MAP[lang](path);
  32. };
  33. const registerRoute = (navConfig) => {
  34. let route = [];
  35. Object.keys(navConfig).forEach((lang, index) => {
  36. let navs = navConfig[lang];
  37. route.push({
  38. path: `/${ lang }/component`,
  39. redirect: `/${ lang }/component/installation`,
  40. component: load(lang, 'component'),
  41. children: []
  42. });
  43. navs.forEach(nav => {
  44. if (nav.href) return;
  45. if (nav.groups) {
  46. nav.groups.forEach(group => {
  47. group.list.forEach(nav => {
  48. addRoute(nav, lang, index);
  49. });
  50. });
  51. } else if (nav.children) {
  52. nav.children.forEach(nav => {
  53. addRoute(nav, lang, index);
  54. });
  55. } else {
  56. addRoute(nav, lang, index);
  57. }
  58. });
  59. });
  60. function addRoute(page, lang, index) {
  61. const component = page.path === '/changelog'
  62. ? load(lang, 'changelog')
  63. : loadDocs(lang, page.path);
  64. let child = {
  65. path: page.path.slice(1),
  66. meta: {
  67. title: page.title || page.name,
  68. description: page.description,
  69. lang
  70. },
  71. name: 'component-' + (page.title || page.name),
  72. component: component.default || component
  73. };
  74. route[index].children.push(child);
  75. }
  76. return route;
  77. };
  78. let route = registerRoute(navConfig);
  79. const generateMiscRoutes = function(lang) {
  80. let guideRoute = {
  81. path: `/${ lang }/guide`, // 指南
  82. redirect: `/${ lang }/guide/design`,
  83. component: load(lang, 'guide'),
  84. children: [{
  85. path: 'design', // 设计原则
  86. name: 'guide-design' + lang,
  87. meta: { lang },
  88. component: load(lang, 'design')
  89. }, {
  90. path: 'nav', // 导航
  91. name: 'guide-nav' + lang,
  92. meta: { lang },
  93. component: load(lang, 'nav')
  94. }]
  95. };
  96. let resourceRoute = {
  97. path: `/${ lang }/resource`, // 资源
  98. meta: { lang },
  99. name: 'resource' + lang,
  100. component: load(lang, 'resource')
  101. };
  102. let indexRoute = {
  103. path: `/${ lang }`, // 首页
  104. meta: { lang },
  105. name: 'home' + lang,
  106. component: load(lang, 'index')
  107. };
  108. return [guideRoute, resourceRoute, indexRoute];
  109. };
  110. langs.forEach(lang => {
  111. route = route.concat(generateMiscRoutes(lang.lang));
  112. });
  113. route.push({
  114. path: '/play',
  115. name: 'play',
  116. component: require('./play/index.vue')
  117. });
  118. let userLanguage = localStorage.getItem('ELEMENT_LANGUAGE') || window.navigator.language || 'en-US';
  119. let defaultPath = '/en-US';
  120. if (userLanguage.indexOf('zh-') !== -1) {
  121. defaultPath = '/zh-CN';
  122. }
  123. route = route.concat([{
  124. path: '/',
  125. redirect: defaultPath
  126. }, {
  127. path: '*',
  128. redirect: defaultPath
  129. }]);
  130. export default route;