chore: 🔨 补充语言文件

This commit is contained in:
nsnail 2024-12-27 22:13:46 +08:00
parent 13a4896828
commit a2de0bcbd1
36 changed files with 350 additions and 86 deletions

View File

@ -42,5 +42,21 @@
{ {
"ApiId": "api/sys/user/set.session.user.app.config", "ApiId": "api/sys/user/set.session.user.app.config",
"RoleId": 371729946431493, "RoleId": 371729946431493,
},
{
"ApiId": "api/sys/login.log/paged.query",
"RoleId": 371729946431493,
},
{
"ApiId": "api/sys/login.log/get",
"RoleId": 371729946431493,
},
{
"ApiId": "api/sys/login.log/count.by",
"RoleId": 371729946431493,
},
{
"ApiId": "api/sys/login.log/export",
"RoleId": 371729946431493,
} }
] ]

View File

@ -23,7 +23,7 @@
"sortablejs": "1.15.6", "sortablejs": "1.15.6",
"vkbeautify": "0.99.3", "vkbeautify": "0.99.3",
"vue": "3.5.13", "vue": "3.5.13",
"vue-i18n": "10.0.5", "vue-i18n": "11.0.1",
"vue-router": "4.5.0", "vue-router": "4.5.0",
"vue3-ace-editor": "2.2.4", "vue3-ace-editor": "2.2.4",
"vue3-json-viewer": "2.2.2", "vue3-json-viewer": "2.2.2",
@ -36,7 +36,7 @@
"prettier-plugin-organize-attributes": "1.0.0", "prettier-plugin-organize-attributes": "1.0.0",
"sass": "1.83.0", "sass": "1.83.0",
"terser": "5.37.0", "terser": "5.37.0",
"vite": "6.0.5" "vite": "6.0.6"
}, },
"browserslist": [ "browserslist": [
"> 1%", "> 1%",

View File

@ -56,9 +56,11 @@ export default {
this.data = this.$TOOL.sortProperties(res.data) this.data = this.$TOOL.sortProperties(res.data)
if (queryEs) { if (queryEs) {
this.esData = {} this.esData = {}
try {
this.$API.adm_tools.queryEsLog.post(queryEs).then((res) => { this.$API.adm_tools.queryEsLog.post(queryEs).then((res) => {
this.esData = res.data this.esData = res.data
}) })
} catch {}
} }
return this return this
}, },

View File

@ -525,7 +525,7 @@ export default {
this.loading = true this.loading = true
try { try {
await this.exportApi.post(this.getQueryParams(), { responseType: 'blob' }) await this.exportApi.post(this.getQueryParams(), { responseType: 'blob' })
this.$message.success(`数据已导出上限5万条`) this.$message.success(this.$t('数据已导出(上限 {n} 条)', { n: 50000 }))
} catch {} } catch {}
this.loading = false this.loading = false
}, },

View File

@ -2,7 +2,7 @@ export default {
email: (_this) => { email: (_this) => {
return { return {
required: true, required: true,
message: '您的邮箱地址', message: _this.$t('您的邮箱地址'),
pattern: _this.$GLOBAL.chars.RGXL_EMAIL, pattern: _this.$GLOBAL.chars.RGXL_EMAIL,
} }
}, },
@ -20,16 +20,16 @@ export default {
} catch { } catch {
// //
} }
callback(new Error('邮箱已被使用')) callback(new Error(_this.$t('邮箱已被使用')))
}, },
trigger: 'blur', trigger: 'blur',
} }
}, },
code: () => { code: (_this) => {
return { return {
required: true, required: true,
message: '请输入4位数字验证码', message: _this.$t('请输入4位数字验证码'),
} }
}, },
} }

View File

@ -2,17 +2,17 @@ export default {
passwordText: (_this) => { passwordText: (_this) => {
return { return {
required: true, required: true,
message: '8位以上数字字母组合', message: _this.$t('8位以上数字字母组合'),
pattern: _this.$GLOBAL.chars.RGX_PASSWORD, pattern: _this.$GLOBAL.chars.RGX_PASSWORD,
} }
}, },
passwordText2: (passwordText) => [ passwordText2: (_this, passwordText) => [
{ required: true, message: '请再次输入密码' }, { required: true, message: _this.$t('请再次输入密码') },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (value !== passwordText()) { if (value !== passwordText()) {
callback(new Error('两次输入密码不一致')) callback(new Error(_this.$t('两次输入密码不一致')))
} else { } else {
callback() callback()
} }

View File

@ -2,7 +2,7 @@ export default {
mobile: (_this) => { mobile: (_this) => {
return { return {
required: true, required: true,
message: '您的手机号码', message: _this.$t('您的手机号码'),
pattern: _this.$GLOBAL.chars.RGX_MOBILE, pattern: _this.$GLOBAL.chars.RGX_MOBILE,
} }
}, },
@ -20,16 +20,16 @@ export default {
} catch { } catch {
// //
} }
callback(new Error('手机号已被使用')) callback(new Error(_this.$t('手机号已被使用')))
}, },
trigger: 'blur', trigger: 'blur',
} }
}, },
code: () => { code: (_this) => {
return { return {
required: true, required: true,
message: '请输入4位数字验证码', message: _this.$t('请输入4位数字验证码'),
} }
}, },
} }

View File

@ -9,9 +9,9 @@ export default (el, binding) => {
value = value * 1000 value = value * 1000
} }
if (modifiers.tip) { if (modifiers.tip) {
el.innerHTML = tool.time.getFormatTime(value) el.innerHTML = tool.time.getFormatTime(binding.instance, value)
el.__timeout__ = setInterval(() => { el.__timeout__ = setInterval(() => {
el.innerHTML = tool.time.getFormatTime(value) el.innerHTML = tool.time.getFormatTime(binding.instance, value)
}, 60000) }, 60000)
} else { } else {
const format = el.getAttribute('format') || undefined const format = el.getAttribute('format') || undefined

View File

@ -9,7 +9,7 @@
<component :is="navMenu.meta.icon || 'el-icon-menu'" /> <component :is="navMenu.meta.icon || 'el-icon-menu'" />
</el-icon> </el-icon>
<template #title> <template #title>
<span>{{ navMenu.meta.title }}</span> <span>{{ this.$t(navMenu.meta.title) }}</span>
<span v-if="navMenu.meta.tag" class="menu-tag">{{ navMenu.meta.tag }}</span> <span v-if="navMenu.meta.tag" class="menu-tag">{{ navMenu.meta.tag }}</span>
</template> </template>
</el-menu-item> </el-menu-item>
@ -18,7 +18,7 @@
<el-icon v-if="navMenu.meta && navMenu.meta.icon"> <el-icon v-if="navMenu.meta && navMenu.meta.icon">
<component :is="navMenu.meta.icon || 'el-icon-menu'" /> <component :is="navMenu.meta.icon || 'el-icon-menu'" />
</el-icon> </el-icon>
<span>{{ navMenu.meta.title }}</span> <span>{{ this.$t(navMenu.meta.title) }}</span>
<span v-if="navMenu.meta.tag" class="menu-tag">{{ navMenu.meta.tag }}</span> <span v-if="navMenu.meta.tag" class="menu-tag">{{ navMenu.meta.tag }}</span>
</template> </template>
<NavMenu :navMenus="navMenu.children"></NavMenu> <NavMenu :navMenus="navMenu.children"></NavMenu>

View File

@ -7,7 +7,7 @@
:class="[isActive(tag) ? 'active' : '', tag.meta.affix ? 'affix' : '']" :class="[isActive(tag) ? 'active' : '', tag.meta.affix ? 'affix' : '']"
@contextmenu.prevent="openContextMenu($event, tag)"> @contextmenu.prevent="openContextMenu($event, tag)">
<router-link :to="tag"> <router-link :to="tag">
<span>{{ tag.meta.title }}</span> <span>{{ $t(tag.meta.title) }}</span>
<el-icon v-if="!tag.meta.affix" @click.prevent.stop="closeSelectedTag(tag)"> <el-icon v-if="!tag.meta.affix" @click.prevent.stop="closeSelectedTag(tag)">
<el-icon-close /> <el-icon-close />
</el-icon> </el-icon>
@ -22,39 +22,39 @@
<el-icon> <el-icon>
<el-icon-refresh /> <el-icon-refresh />
</el-icon> </el-icon>
刷新 {{ $t('刷新') }}
</li> </li>
<li @click="scheduledRefresh()"> <li @click="scheduledRefresh()">
<el-icon> <el-icon>
<el-icon-alarm-clock /> <el-icon-alarm-clock />
</el-icon> </el-icon>
定时刷新 {{ $t('定时刷新') }}
</li> </li>
<hr /> <hr />
<li :class="contextMenuItem.meta.affix ? 'disabled' : ''" @click="closeTabs()"> <li :class="contextMenuItem.meta.affix ? 'disabled' : ''" @click="closeTabs()">
<el-icon> <el-icon>
<el-icon-close /> <el-icon-close />
</el-icon> </el-icon>
关闭标签 {{ $t('关闭标签') }}
</li> </li>
<li @click="closeOtherTabs()"> <li @click="closeOtherTabs()">
<el-icon> <el-icon>
<el-icon-folder-delete /> <el-icon-folder-delete />
</el-icon> </el-icon>
关闭其他标签 {{ $t('关闭其他标签') }}
</li> </li>
<hr /> <hr />
<li @click="maximize()"> <li @click="maximize()">
<el-icon> <el-icon>
<el-icon-full-screen /> <el-icon-full-screen />
</el-icon> </el-icon>
最大化 {{ $t('最大化') }}
</li> </li>
<li @click="openWindow()"> <li @click="openWindow()">
<el-icon> <el-icon>
<el-icon-copy-document /> <el-icon-copy-document />
</el-icon> </el-icon>
在新的窗口中打开 {{ $t('在新的窗口中打开') }}
</li> </li>
</ul> </ul>
</transition> </transition>
@ -200,9 +200,9 @@ export default {
async scheduledRefresh() { async scheduledRefresh() {
this.closeMenu() this.closeMenu()
try { try {
const sleep = await this.$prompt('刷新时间间隔(秒)', '定时刷新', { const sleep = await this.$prompt(this.$t('刷新时间间隔(秒)'), this.$t('定时刷新'), {
inputPattern: /^[1-9]\d*$/, inputPattern: /^[1-9]\d*$/,
inputErrorMessage: '时间必须为数字', inputErrorMessage: this.$t('时间必须为数字'),
inputValue: '10', inputValue: '10',
}) })
const sleepSecs = parseInt(sleep.value) const sleepSecs = parseInt(sleep.value)

View File

@ -2,7 +2,7 @@
<el-container v-loading="loading"> <el-container v-loading="loading">
<el-header class="flex" style="justify-content: space-evenly; height: unset"> <el-header class="flex" style="justify-content: space-evenly; height: unset">
<div v-if="failJobs"> <div v-if="failJobs">
<el-badge :hidden="fail === 0" :value="`${$TOOL.time.getFormatTime(new Date(failJobViewTime).getTime())} 至今 ${fail}个`"> <el-badge :hidden="fail === 0" :value="`${$TOOL.time.getFormatTime(this, new Date(failJobViewTime).getTime())} 至今 ${fail}个`">
<el-button <el-button
@click=" @click="
() => { () => {
@ -41,9 +41,9 @@
<el-col :lg="12"> <el-col :lg="12">
<el-empty v-if="!failJobs"> <el-empty v-if="!failJobs">
<template #description> <template #description>
<p>{{ $TOOL.time.getFormatTime(new Date(failJobViewTime).getTime()) }}</p> <p>{{ $TOOL.time.getFormatTime(this, new Date(failJobViewTime).getTime()) }}</p>
<p>至今</p> <p>{{ $t('至今') }}</p>
<p>未发现新的异常作业</p> <p>{{ $t('未发现新的异常作业') }}</p>
</template> </template>
</el-empty> </el-empty>
<el-card <el-card
@ -88,9 +88,9 @@
<div class="jobMain"> <div class="jobMain">
<div class="title"> <div class="title">
<h2>{{ job.jobName }}</h2> <h2>{{ job.jobName }}</h2>
<p>{{ $t('上次执行') }}<span v-time.tip="job.lastExecTime" :title="job.lastExecTime"></span></p> <p>{{ $t('上次执行') }}<span v-time.tip="job.lastExecTime" :title="job.lastExecTime"></span></p>
<p> <p>
下次执行<span>{{ job.nextExecTime }}</span> {{ $t('下次执行') }}<span>{{ job.nextExecTime }}</span>
</p> </p>
</div> </div>
<div class="bottom"> <div class="bottom">

View File

@ -501,4 +501,125 @@ export default {
本页: 'Page', 本页: 'Page',
'JSON 格式化': 'JSON formatting', 'JSON 格式化': 'JSON formatting',
格式错误: 'Format error', 格式错误: 'Format error',
模块信息: 'Module information',
当前项目模块信息: 'Current project module information',
本周: 'This week',
本月: 'This month',
后退一月: 'Back a month',
最近整点: 'Last hour',
'手机号 / 邮箱': 'Phone / Email',
后退一周: 'Back a week',
用户数量: 'Number of users',
复制角色: 'Copy the role',
删除角色: 'Delete the role',
删除部门: 'Delete a department',
作业日志: 'Job logs',
上次执行状态: 'Last Execution Status',
立即执行: 'Execute it now',
复制作业: 'Copy the job',
'项名 / 项值 / 备注': 'Item Name / Item Value / Notes',
设置项值: 'Set the item value',
过期时间: 'Expiration time',
查看缓存: 'View the cache',
删除缓存: 'Delete the cache',
文档分类: 'Document classification',
档案可见性: 'Archive visibility',
文档标题: 'The title of the document',
错误码: 'Error codes',
登录用户名: 'Login username',
客户端IP地址: 'Client IP address',
授权信息: 'Authorization Information',
用户标识: 'User ID',
授权令牌: 'Authorization tokens',
复制授权令牌: 'Copy the authorization token',
异常日志: 'Exception logs',
没有正在执行的作业: 'There are no jobs in progress',
空闲: 'Idle',
请输入用户名: 'Please enter a username',
请输入密码: 'Please enter your password',
'用户名 / 手机 / 邮箱': 'Username / Phone / Email',
您的手机号码: 'Your mobile phone number',
请输入4位数字验证码: 'Please enter a 4-digit verification code',
'8位以上数字字母组合': 'A combination of more than 8 digits of numbers and letters',
请再次输入密码: 'Please enter your password again',
发送成功: 'The sending was successful',
操作指引: 'How-to instructions',
'按下 {key} 可关闭当前标签页': 'Press {key} to close the current tab',
'按下 {key} 可关闭其它标签页': 'Press {key} to close other tabs',
'按下 {key} 快速查找菜单功能': 'Press {key} to quickly find the menu function',
原手机验证码: 'The verification code of the original mobile phone',
原手机号码: 'Original mobile phone number',
手机验证码: 'Mobile phone verification code',
邮箱已被使用: 'The email is already in use',
您的邮箱地址: 'Your email address',
自定义首页布局: 'Customize the homepage layout',
'喜欢就点个 Star⭐ 吧!': 'If you like, order a Star⭐!',
完成: 'Finish',
没有部件啦: 'There are no parts',
恢复默认: 'Restore the default',
添加部件: 'Add a part',
添加自定义布局: 'Add custom layouts',
'请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】': 'Please enter a 24-column layout separated by spaces: e.g. 24 or 12 12 or 8 8 8',
添加一行: 'Add a line',
'第 {n} 行': 'Line {n}',
版本信息: 'Version information',
外部组件: 'External components',
至今: 'Ever since',
未发现新的异常作业: 'No new anomalous jobs were found',
刚刚: 'Newly',
'{n} 天前': '{n} days ago',
'{n} 分钟前': '{n} minutes ago',
'{n} 小时前': '{n} hours ago',
下次执行: 'Next time',
成功率: 'Success rate',
总数: 'Total',
随机延时: 'Random delay',
'结束值(毫秒)': 'End Value (ms)',
'起始值(毫秒)': 'Starting Value (ms)',
复制: 'Copy',
新增: 'New',
'数据已导出(上限 {n} 条)': 'Data exported (Maximum {n} entries)',
同步成功: 'Synchronization succeeded',
缓存详情: 'Cache details',
操作日志: 'Operation logs',
数据权限: 'Data Permissions',
首页视图: 'Home view',
删除配置: 'Delete the configuration',
所属字典目录: 'Dictionary catalog',
删除字典项: 'Delete dictionary entries',
接口总数: 'Total number of apis',
所属文档分类: 'Document catalog',
请选择所属文档分类: 'Please select the document category',
请输入文档标题: 'Please enter a title for the document',
请输入文档内容: 'Please enter the content of the document',
请选择档案可见性: 'Please select profile visibility',
文档内容: 'Document content',
主控面板: 'Dashboard',
权限管理: 'Permissions',
用户管理: 'User',
角色管理: 'Role',
部门管理: 'Department',
菜单管理: 'Menu',
系统管理: 'System',
计划作业: 'Schedule jobs',
字典管理: 'Dictionary',
消息管理: 'Message',
接口管理: 'API',
缓存管理: 'Cache',
档案管理: 'Archives',
文档管理: 'Document',
日志管理: 'Log',
开发管理: 'Development',
代码生成: 'Code generation',
定时刷新: 'Refresh on interval',
关闭标签: 'Close the tab',
关闭其他标签: 'Close other tabs',
最大化: 'Maximum',
在新的窗口中打开: 'Opens in a new window',
'刷新时间间隔(秒)': 'Refresh interval (seconds)',
时间必须为数字: 'The time must be a number',
菜单: 'Menu',
链接: 'Link',
框架: 'IFrame',
按钮: 'Button',
} }

View File

@ -501,4 +501,123 @@ export default {
'按下 {key} 可关闭当前标签页': '按下 {key} 可关闭当前标签页', '按下 {key} 可关闭当前标签页': '按下 {key} 可关闭当前标签页',
'按下 {key} 可关闭其它标签页': '按下 {key} 可关闭其它标签页', '按下 {key} 可关闭其它标签页': '按下 {key} 可关闭其它标签页',
'按下 {key} 快速查找菜单功能': '按下 {key} 快速查找菜单功能', '按下 {key} 快速查找菜单功能': '按下 {key} 快速查找菜单功能',
模块信息: '模块信息',
当前项目模块信息: '当前项目模块信息',
本周: '本周',
本月: '本月',
后退一月: '后退一月',
最近整点: '最近整点',
'手机号 / 邮箱': '手机号 / 邮箱',
后退一周: '后退一周',
用户数量: '用户数量',
复制角色: '复制角色',
删除角色: '删除角色',
删除部门: '删除部门',
作业日志: '作业日志',
上次执行状态: '上次执行状态',
立即执行: '立即执行',
复制作业: '复制作业',
'项名 / 项值 / 备注': '项名 / 项值 / 备注',
设置项值: '设置项值',
过期时间: '过期时间',
查看缓存: '查看缓存',
删除缓存: '删除缓存',
文档分类: '文档分类',
档案可见性: '档案可见性',
文档标题: '文档标题',
错误码: '错误码',
登录用户名: '登录用户名',
客户端IP地址: '客户端IP地址',
授权信息: '授权信息',
用户标识: '用户标识',
授权令牌: '授权令牌',
复制授权令牌: '复制授权令牌',
重置为默认值: '重置为默认值',
异常日志: '异常日志',
没有正在执行的作业: '没有正在执行的作业',
空闲: '空闲',
请输入用户名: '请输入用户名',
'用户名 / 手机 / 邮箱': '用户名 / 手机 / 邮箱',
请输入密码: '请输入密码',
您的手机号码: '您的手机号码',
请输入4位数字验证码: '请输入4位数字验证码',
'8位以上数字字母组合': '8位以上数字字母组合',
请再次输入密码: '请再次输入密码',
发送成功: '发送成功',
操作指引: '操作指引',
原手机验证码: '原手机验证码',
原手机号码: '原手机号码',
手机验证码: '手机验证码',
邮箱已被使用: '邮箱已被使用',
您的邮箱地址: '您的邮箱地址',
自定义首页布局: '自定义首页布局',
'喜欢就点个 Star⭐ 吧!': '喜欢就点个 Star⭐ 吧!',
完成: '完成',
没有部件啦: '没有部件啦',
恢复默认: '恢复默认',
添加部件: '添加部件',
添加自定义布局: '添加自定义布局',
'请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】': '请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】',
添加一行: '添加一行',
'第 {n} 行': '第 {n} 行',
版本信息: '版本信息',
外部组件: '外部组件',
至今: '至今',
未发现新的异常作业: '未发现新的异常作业',
刚刚: '刚刚',
'{n} 天前': '{n} 天前',
'{n} 分钟前': '{n} 分钟前',
'{n} 小时前': '{n} 小时前',
下次执行: '下次执行',
成功率: '成功率',
总数: '总数',
随机延时: '随机延时',
'结束值(毫秒)': '结束值(毫秒)',
'起始值(毫秒)': '起始值(毫秒)',
复制: '复制',
新增: '新增',
'数据已导出(上限 {n} 条)': '数据已导出(上限 {n} 条)',
同步成功: '同步成功',
缓存详情: '缓存详情',
操作日志: '操作日志',
数据权限: '数据权限',
首页视图: '首页视图',
删除配置: '删除配置',
所属字典目录: '所属字典目录',
删除字典项: '删除字典项',
接口总数: '接口总数',
所属文档分类: '所属文档分类',
请选择所属文档分类: '请选择所属文档分类',
请输入文档标题: '请输入文档标题',
请输入文档内容: '请输入文档内容',
请选择档案可见性: '请选择档案可见性',
文档内容: '文档内容',
主控面板: '主控面板',
权限管理: '权限管理',
用户管理: '用户管理',
角色管理: '角色管理',
部门管理: '部门管理',
菜单管理: '菜单管理',
系统管理: '系统管理',
计划作业: '计划作业',
字典管理: '字典管理',
消息管理: '消息管理',
接口管理: '接口管理',
缓存管理: '缓存管理',
档案管理: '档案管理',
文档管理: '文档管理',
日志管理: '日志管理',
开发管理: '开发管理',
代码生成: '代码生成',
定时刷新: '定时刷新',
关闭标签: '关闭标签',
关闭其他标签: '关闭其他标签',
最大化: '最大化',
在新的窗口中打开: '在新的窗口中打开',
'刷新时间间隔(秒)': '刷新时间间隔(秒)',
时间必须为数字: '时间必须为数字',
菜单: '菜单',
链接: '链接',
框架: '框架',
按钮: '按钮',
} }

View File

@ -37,7 +37,7 @@ tool.time = {
return date.getFullYear() + '-' + month + '-' + day return date.getFullYear() + '-' + month + '-' + day
}, },
//转换时间 //转换时间
getFormatTime: function (timestamp) { getFormatTime: function (_this, timestamp) {
timestamp = new Date(timestamp) timestamp = new Date(timestamp)
const now = this.getUnix() const now = this.getUnix()
const today = this.getTodayUnix() const today = this.getTodayUnix()
@ -46,15 +46,15 @@ tool.time = {
let tip let tip
if (timer <= 0) { if (timer <= 0) {
tip = '刚刚' tip = _this.$t('刚刚')
} else if (Math.floor(timer / 60) <= 0) { } else if (Math.floor(timer / 60) <= 0) {
tip = '刚刚' tip = _this.$t('刚刚')
} else if (timer < 3600) { } else if (timer < 3600) {
tip = Math.floor(timer / 60) + '分钟前' tip = _this.$t('{n} 分钟前', { n: Math.floor(timer / 60) })
} else if (timer >= 3600 && (timestamp - today >= 0 || Math.floor(timer / 86400) <= 0)) { } else if (timer >= 3600 && (timestamp - today >= 0 || Math.floor(timer / 86400) <= 0)) {
tip = Math.floor(timer / 3600) + '小时前' tip = _this.$t('{n} 小时前', { n: Math.floor(timer / 3600) })
} else if (timer / 86400 <= 31) { } else if (timer / 86400 <= 31) {
tip = Math.floor(timer / 86400) + '天前' tip = _this.$t('{n} 天前', { n: Math.floor(timer / 86400) })
} else { } else {
tip = this.getLastDate(timestamp) tip = this.getLastDate(timestamp)
} }

View File

@ -109,7 +109,7 @@ export default {
}, },
}, },
], ],
passwordText2: naFormPassword.passwordText2(() => this.form.passwordText), passwordText2: naFormPassword.passwordText2(this, () => this.form.passwordText),
passwordText: naFormPassword.passwordText(this), passwordText: naFormPassword.passwordText(this),
userName: [ userName: [
{ required: true, message: this.$t('请输入用户名') }, { required: true, message: this.$t('请输入用户名') },

View File

@ -61,7 +61,7 @@ export default {
destDevice: phoneConfig.mobile(this), destDevice: phoneConfig.mobile(this),
code: phoneConfig.code(this), code: phoneConfig.code(this),
}, },
passwordText2: naFormPassword.passwordText2(() => this.form.passwordText), passwordText2: naFormPassword.passwordText2(this, () => this.form.passwordText),
passwordText: naFormPassword.passwordText(this), passwordText: naFormPassword.passwordText(this),
}, },
} }

View File

@ -3,19 +3,21 @@
<el-form :model="form" ref="form"> <el-form :model="form" ref="form">
<el-form-item <el-form-item
v-for="(row, index) in form.rows" v-for="(row, index) in form.rows"
:label="`第${index + 1}行`" :label="$t('第 {n} 行', { n: index + 1 })"
:prop="'rows.' + index + '.value'" :prop="'rows.' + index + '.value'"
:rules="{ :rules="{
required: true, required: true,
message: '请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】', message: $t('请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】'),
trigger: 'blur', trigger: 'blur',
}"> }">
<el-input <el-input
v-model="form.rows[index].value" v-model="form.rows[index].value"
:input="form.rows[index].value = form.rows[index].value.replace(/[^0-9 ]/g, '')" :input="form.rows[index].value = form.rows[index].value.replace(/[^0-9 ]/g, '')"
placeholder="请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】"> :placeholder="$t('请输入以空格分隔的24分栏布局如【24】或【12 12】或【8 8 8】')">
<template #append> <template #append>
<el-button @click.prevent="form.rows.splice(index, 1)" icon="delete">删除</el-button> <el-button @click.prevent="form.rows.splice(index, 1)" icon="el-icon-delete">
{{ $t('删除') }}
</el-button>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -32,7 +34,7 @@ export default {
components: {}, components: {},
data() { data() {
return { return {
title: '添加自定义布局', title: this.$t('添加自定义布局'),
visible: false, visible: false,
form: { form: {
rows: [{ value: '' }], rows: [{ value: '' }],

View File

@ -33,7 +33,7 @@
<el-icon> <el-icon>
<component :is="allComps[element].icon" /> <component :is="allComps[element].icon" />
</el-icon> </el-icon>
{{ allComps[element].title }}</label {{ $t(allComps[element].title) }}</label
> >
</div> </div>
</div> </div>
@ -51,7 +51,7 @@
<el-icon> <el-icon>
<el-icon-circle-plus-filled /> <el-icon-circle-plus-filled />
</el-icon> </el-icon>
添加部件 {{ $t('添加部件') }}
</div> </div>
<div> <div>
<el-button v-if="customizing" @click="save" icon="el-icon-check" round type="primary">{{ $t('完成') }}</el-button> <el-button v-if="customizing" @click="save" icon="el-icon-check" round type="primary">{{ $t('完成') }}</el-button>
@ -77,7 +77,9 @@
</div> </div>
</el-header> </el-header>
<el-header style="height: auto"> <el-header style="height: auto">
<el-button @click="this.dialog.customLayout = { title: '添加自定义布局' }" style="margin: 0 auto">添加自定义布局</el-button> <el-button @click="this.dialog.customLayout = { title: this.$t('添加自定义布局') }" style="margin: 0 auto">
{{ this.$t('添加自定义布局') }}
</el-button>
</el-header> </el-header>
<el-main class="nopadding"> <el-main class="nopadding">
<div class="widgets-list"> <div class="widgets-list">

View File

@ -62,7 +62,7 @@ export default {
}, },
destDevice: [emailConfig.email(this)], destDevice: [emailConfig.email(this)],
code: emailConfig.code(), code: emailConfig.code(this),
}, },
visible: false, visible: false,
} }

View File

@ -58,7 +58,7 @@ export default {
rules: { rules: {
oldPassword: naFormPassword.passwordText(this), oldPassword: naFormPassword.passwordText(this),
newPassword: naFormPassword.passwordText(this), newPassword: naFormPassword.passwordText(this),
confirmNewPassword: naFormPassword.passwordText2(() => this.form.newPassword), confirmNewPassword: naFormPassword.passwordText2(this, () => this.form.newPassword),
}, },
visible: false, visible: false,
} }

View File

@ -10,7 +10,7 @@
<scTable <scTable
:export-api="$API.sys_api.export" :export-api="$API.sys_api.export"
:query-api="$API.sys_api.query" :query-api="$API.sys_api.query"
:summary-method="(x) => ['接口总数', countTotalRows(x.data)]" :summary-method="(x) => [$t('接口总数'), countTotalRows(x.data)]"
default-expand-all default-expand-all
hidePagination hidePagination
ref="table" ref="table"
@ -68,7 +68,7 @@ export default {
this.loading = true this.loading = true
try { try {
await this.$API.sys_api.sync.post() await this.$API.sys_api.sync.post()
this.$message.success('同步成功') this.$message.success(this.$t('同步成功'))
} catch { } catch {
// //
} }

View File

@ -87,14 +87,14 @@
:buttons="[ :buttons="[
{ {
icon: 'el-icon-view', icon: 'el-icon-view',
title: '查看缓存', title: $t('查看缓存'),
click: viewClick, click: viewClick,
}, },
{ {
icon: 'el-icon-delete', icon: 'el-icon-delete',
type: 'danger', type: 'danger',
confirm: true, confirm: true,
title: '删除缓存', title: $t('删除缓存'),
click: delClick, click: delClick,
}, },
]" ]"

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -90,7 +90,7 @@
</template> </template>
</el-table-column> </el-table-column>
<naColOperation <naColOperation
:buttons="naColOperation.buttons.concat(naColOperation.delButton('删除部门', $API.sys_config.delete))" :buttons="naColOperation.buttons.concat(naColOperation.delButton(this.$t('删除配置'), $API.sys_config.delete))"
:vue="this" :vue="this"
width="150" /> width="150" />
</scTable> </scTable>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -103,7 +103,7 @@
</template> </template>
</el-table-column> </el-table-column>
<naColOperation <naColOperation
:buttons="naColOperation.buttons.concat(naColOperation.delButton('删除部门', $API.sys_dept.delete))" :buttons="naColOperation.buttons.concat(naColOperation.delButton(this.$t('删除部门'), $API.sys_dept.delete))"
:vue="this" :vue="this"
width="120" /> width="120" />
</scTable> </scTable>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -100,7 +100,7 @@
</template> </template>
</el-table-column> </el-table-column>
<naColOperation <naColOperation
:buttons="naColOperation.buttons.concat(naColOperation.delButton('删除字典项', $API.sys_dic.deleteContent))" :buttons="naColOperation.buttons.concat(naColOperation.delButton(this.$t('删除字典项'), $API.sys_dic.deleteContent))"
:vue="this" :vue="this"
width="120" /> width="120" />
</scTable> </scTable>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>

View File

@ -60,10 +60,10 @@ export default {
mode: 'add', mode: 'add',
// //
rules: { rules: {
catalogId: [{ required: true, message: '请选择所属文档分类' }], catalogId: [{ required: true, message: this.$t('请选择所属文档分类') }],
title: [{ required: true, message: '请输入文档标题' }], title: [{ required: true, message: this.$t('请输入文档标题') }],
body: [{ required: true, message: '请输入文档内容' }], body: [{ required: true, message: this.$t('请输入文档内容') }],
visibility: [{ required: true, message: '请选择档案可见性' }], visibility: [{ required: true, message: this.$t('请选择档案可见性') }],
}, },
titleMap: { titleMap: {
add: this.$t('新增文档'), add: this.$t('新增文档'),

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -211,16 +211,16 @@
naColOperation.buttons.concat( naColOperation.buttons.concat(
{ {
icon: 'el-icon-video-play', icon: 'el-icon-video-play',
title: '立即执行', title: $t('立即执行'),
click: execute, click: execute,
}, },
{ {
icon: 'el-icon-document-copy', icon: 'el-icon-document-copy',
confirm: true, confirm: true,
title: '复制作业', title: $t('复制作业'),
click: copyJob, click: copyJob,
}, },
naColOperation.delButton('删除作业', $API.sys_job.delete), naColOperation.delButton($t('删除作业'), $API.sys_job.delete),
) )
" "
:vue="this" :vue="this"

View File

@ -4,12 +4,12 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.rate" suffix="%" title="成功率"></scStatistic> <scStatistic :title="$t('成功率')" :value="statistics.rate" suffix="%"></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>

View File

@ -14,7 +14,7 @@
:filter-node-method="treeFilterNode" :filter-node-method="treeFilterNode"
:props="{ :props="{
label: (data) => { label: (data) => {
return data.meta.title + ' - ' + data.sort return this.$t(data.meta.title) + ' - ' + data.sort
}, },
}" }"
@node-click="treeClick" @node-click="treeClick"

View File

@ -26,7 +26,9 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('类型')" prop="meta.type"> <el-form-item :label="$t('类型')" prop="meta.type">
<el-radio-group v-model="form.meta.type"> <el-radio-group v-model="form.meta.type">
<el-radio-button v-for="(item, i) in this.$GLOBAL.enums.menuTypes" :key="i" :label="i">{{ item[1] }}</el-radio-button> <el-radio-button v-for="(item, i) in this.$GLOBAL.enums.menuTypes" :key="i" :label="i">{{
this.$t(item[1])
}}</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="$t('别名')" prop="name"> <el-form-item :label="$t('别名')" prop="name">

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -92,7 +92,7 @@
<el-table-column :label="$t('消息摘要')" min-width="400" prop="summary" show-overflow-tooltip sortable="custom" /> <el-table-column :label="$t('消息摘要')" min-width="400" prop="summary" show-overflow-tooltip sortable="custom" />
<naColOperation <naColOperation
:buttons="naColOperation.buttons.concat(naColOperation.delButton('删除消息', $API.sys_sitemsg.delete))" :buttons="naColOperation.buttons.concat(naColOperation.delButton($t('删除消息'), $API.sys_sitemsg.delete))"
:vue="this" :vue="this"
width="120" /> width="120" />
</scTable> </scTable>

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -176,10 +176,10 @@
{ {
icon: 'el-icon-document-copy', icon: 'el-icon-document-copy',
confirm: true, confirm: true,
title: '复制角色', title: $t('复制角色'),
click: copyRole, click: copyRole,
}, },
naColOperation.delButton('删除角色', $API.sys_role.delete), naColOperation.delButton(this.$t('删除角色'), $API.sys_role.delete),
) )
" "
:vue="this" :vue="this"

View File

@ -4,7 +4,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :lg="24"> <el-col :lg="24">
<el-card shadow="never"> <el-card shadow="never">
<scStatistic :value="statistics.total" group-separator title="总数"></scStatistic> <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>