route.config.js 3.6 KB

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