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 }