import routesI18n from '@/router/i18n'; import { getI18nKey } from '@/utils/routerUtil'; /** * 根据 router options 配置生成 国际化语言 * @param lang * @param routes * @param valueKey * @returns {*} */ function generateI18n(lang, routes, valueKey) { routes.forEach(route => { let keys = getI18nKey(route.fullPath).split('.'); let value = valueKey === 'path' ? route[valueKey] .split('/') .filter(item => !item.startsWith(':') && item != '') .join('.') : route[valueKey]; if (value.includes('_')) { value = value.replace('_', ' '); value = value.toLowerCase().replace(/( |^)[a-z]/g, L => L.toUpperCase()); } else { value = value.charAt(0).toUpperCase() + value.toLowerCase().substring(1); } lang.assignProps(keys, value); if (route.children) { generateI18n(lang, route.children, valueKey); } }); return lang; } /** * 格式化 router.options.routes,生成 fullPath * @param routes * @param parentPath */ function formatFullPath(routes, parentPath = '') { routes.forEach(route => { let isFullPath = route.path.substring(0, 1) === '/'; route.fullPath = isFullPath ? route.path : parentPath === '/' ? parentPath + route.path : parentPath + '/' + route.path; if (route.children) { formatFullPath(route.children, route.fullPath); } }); } /** * 从路由提取国际化数据 * @param i18n * @param routes */ function mergeI18nFromRoutes(i18n, routes) { formatFullPath(routes); const zh_CN = generateI18n(new Object(), routes, 'name'); const en_US = generateI18n(new Object(), routes, 'path'); i18n.mergeLocaleMessage('zh_CN', zh_CN); i18n.mergeLocaleMessage('en_US', en_US); const messages = routesI18n.messages; Object.keys(messages).forEach(lang => { i18n.mergeLocaleMessage(lang, messages[lang]); }); } /** * 给对象注入属性 * @param keys 属性key数组, 如 keys = ['config', 'path'] , 则会给对象注入 object.config.path 的属性 * @param value 属性值 * @returns {Object} */ Object.defineProperty(Object.prototype, 'assignProps', { writable: false, enumerable: false, configurable: true, value: function(keys, value) { let props = this; for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (i == keys.length - 1) { props[key] = value; } else { props[key] = props[key] == undefined ? {} : props[key]; props = props[key]; } } return this; }, }); export { mergeI18nFromRoutes, formatFullPath };