多语言管理页面翻译,添加优化

This commit is contained in:
不做码农 2022-05-14 12:21:42 +08:00
parent aaae749c1f
commit 89b96a367e
9 changed files with 156 additions and 93 deletions

View File

@ -9,6 +9,10 @@ import pageLoginCn from './pages/login/zh-cn'
import pageLoginEn from './pages/login/en' import pageLoginEn from './pages/login/en'
import pageLoginTw from './pages/login/zh-tw' import pageLoginTw from './pages/login/zh-tw'
import pageLangSetCn from './pages/langSet/zh-cn'
import pageLangSetEn from './pages/langSet/en'
import pageLangSetTw from './pages/langSet/zh-tw'
const i18n = createI18n({ const i18n = createI18n({
// 全局注入 $t 函数 // 全局注入 $t 函数
globalInjection: true, globalInjection: true,
@ -16,9 +20,9 @@ const i18n = createI18n({
locale: store.getters.language, //默认选择的语言 locale: store.getters.language, //默认选择的语言
legacy: false, // 使用 Composition API 模式则需要将其设置为false legacy: false, // 使用 Composition API 模式则需要将其设置为false
messages: { messages: {
'zh-cn': { ...zhCn, ...pageLoginCn }, 'zh-cn': { ...zhCn, ...pageLoginCn, ...pageLangSetCn },
'zh-tw': { ...zhTw, ...pageLoginTw }, 'zh-tw': { ...zhTw, ...pageLoginTw, ...pageLangSetTw },
'en': { ...en, ...pageLoginEn } 'en': { ...en, ...pageLoginEn, ...pageLangSetEn }
} }
}) })
console.log('lang=' + store.getters.language) console.log('lang=' + store.getters.language)

View File

@ -76,7 +76,13 @@ export default {
common: { common: {
ok: 'Ok', ok: 'Ok',
cancel: 'Cancel', cancel: 'Cancel',
tips: 'tips' tips: 'tips',
english: 'English',
chinese: 'Chinese',
traditionalChinese: 'TraditionalChinese',
name: 'Name',
content: 'Content',
addTime: 'AddTime'
}, },
btn: { btn: {
add: 'Add', add: 'Add',
@ -107,5 +113,6 @@ export default {
upload: 'Upload', upload: 'Upload',
view: 'To view', view: 'To view',
copy: 'Copy', copy: 'Copy',
operate: 'Operate'
} }
}; };

View File

@ -76,7 +76,13 @@ export default {
common: { common: {
ok: '确定', ok: '确定',
cancel: '取消', cancel: '取消',
tips: '提示' tips: '提示',
english: '英文',
chinese: '中文',
traditionalChinese: '繁体',
name: '名称',
content: '内容',
addTime: '添加时间'
}, },
btn: { btn: {
add: '新增', add: '新增',
@ -90,8 +96,8 @@ export default {
synchronize: '同步', synchronize: '同步',
generateCode: '生成代码', generateCode: '生成代码',
start: '启动', start: '启动',
stop: '停止', stop: '停止',
run: '运行', run: '运行',
runOnce: '运行一次', runOnce: '运行一次',
log: '日志', log: '日志',
expand: '展开', expand: '展开',
@ -107,5 +113,6 @@ export default {
upload: '上传', upload: '上传',
view: '查看', view: '查看',
copy: '複製', copy: '複製',
operate: '操作'
} }
}; };

View File

@ -76,7 +76,13 @@ export default {
common: { common: {
ok: '確定', ok: '確定',
cancel: '取消', cancel: '取消',
tips: '提示' tips: '提示',
english: '英文',
chinese: '中文簡體',
traditionalChinese: '繁體',
name: '名稱',
content: '內容',
addTime: '添加時間'
}, },
btn: { btn: {
add: '新增', add: '新增',
@ -104,5 +110,6 @@ export default {
upload: '上傳', upload: '上傳',
view: '查看', view: '查看',
copy: '复制', copy: '复制',
operate: '操作'
} }
}; };

View File

@ -0,0 +1,6 @@
export default {
language: 'Language',
languageKey: 'LanguageKey',
showWay: 'Show Way',
table: 'Table',
}

View File

@ -0,0 +1,6 @@
export default {
language: '语言',
languageKey: '语言key',
showWay: '显示方式',
table: '表格',
}

View File

@ -0,0 +1,6 @@
export default {
language: '语言',
languageKey: '语言key',
showWay: '显示方式',
table: '表格',
}

View File

@ -1,4 +1,5 @@
const baseURL = import.meta.env.VITE_APP_BASE_API const baseURL =
import.meta.env.VITE_APP_BASE_API
/** /**
* 通用js方法封装处理 * 通用js方法封装处理
* Copyright (c) 2019 ruoyi * Copyright (c) 2019 ruoyi
@ -94,7 +95,7 @@ export function selectDictLabel(datas, value) {
// 回显数据字典(字符串数组) // 回显数据字典(字符串数组)
export function selectDictLabels(datas, value, separator) { export function selectDictLabels(datas, value, separator) {
if(value === undefined) { if (value === undefined) {
return ""; return "";
} }
var actions = []; var actions = [];
@ -118,7 +119,9 @@ export function download(fileName) {
// 字符串格式化(%s ) // 字符串格式化(%s )
export function sprintf(str) { export function sprintf(str) {
var args = arguments, flag = true, i = 1; var args = arguments,
flag = true,
i = 1;
str = str.replace(/%s/g, function () { str = str.replace(/%s/g, function () {
var arg = args[i++]; var arg = args[i++];
if (typeof arg === 'undefined') { if (typeof arg === 'undefined') {
@ -206,9 +209,9 @@ export function handleTree(data, id, parentId, children) {
} }
/** /**
* 参数处理 * 参数处理
* @param {*} params 参数 * @param {*} params 参数
*/ */
export function tansParams(params) { export function tansParams(params) {
let result = '' let result = ''
for (const propName of Object.keys(params)) { for (const propName of Object.keys(params)) {
@ -269,3 +272,16 @@ export function praseStrZero(str) {
} }
return str; return str;
} }
/**
* 字符串是否为空
* @param {*} obj
* @returns
*/
export function isEmpty(obj) {
if (typeof obj == "undefined" || obj == null || obj === "") {
return true;
} else {
return false;
}
}

View File

@ -10,21 +10,21 @@
<div class="app-container"> <div class="app-container">
<!-- :model属性用于表单验证使用 比如下面的el-form-item prop属性用于对表单值进行验证操作 --> <!-- :model属性用于表单验证使用 比如下面的el-form-item prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent> <el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="语言code" prop="langCode"> <el-form-item :label="$t('language')" prop="langCode">
<el-select v-model="queryParams.langCode" placeholder="请选择语言code"> <el-select v-model="queryParams.langCode" placeholder="请选择语言code">
<el-option v-for="item in sys_lang_type" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option> <el-option v-for="item in sys_lang_type" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="语言key" prop="langKey"> <el-form-item :label="$t('languageKey')" prop="langKey">
<el-input v-model="queryParams.langKey" placeholder="请输入语言key" /> <el-input v-model="queryParams.langKey" placeholder="请输入语言key" />
</el-form-item> </el-form-item>
<el-form-item label="显示方式"> <el-form-item :label="$t('showWay')">
<el-radio-group v-model="queryParams.showMode"> <el-radio-group v-model="queryParams.showMode">
<el-radio-button label="1">表格</el-radio-button> <el-radio-button label="1">表格</el-radio-button>
<el-radio-button label="2">行列</el-radio-button> <el-radio-button label="2">行列</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="添加时间"> <el-form-item :label="$t('common.addTime')">
<el-date-picker <el-date-picker
v-model="dateRangeAddtime" v-model="dateRangeAddtime"
style="width: 240px" style="width: 240px"
@ -49,14 +49,14 @@
<el-button type="primary" v-hasPermi="['system:lang:add']" plain icon="plus" @click="handleAdd">{{ $t('btn.add') }}</el-button> <el-button type="primary" v-hasPermi="['system:lang:add']" plain icon="plus" @click="handleAdd">{{ $t('btn.add') }}</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" :disabled="single" v-hasPermi="['system:lang:edit']" plain icon="edit" @click="handleUpdate">{{ <el-button type="success" :disabled="single" v-hasPermi="['system:lang:edit']" plain icon="edit" @click="handleUpdate">
$t('btn.edit') {{ $t('btn.edit') }}
}}</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['system:lang:delete']" plain icon="delete" @click="handleDelete">{{ <el-button type="danger" :disabled="multiple" v-hasPermi="['system:lang:delete']" plain icon="delete" @click="handleDelete">
$t('btn.delete') {{ $t('btn.delete') }}
}}</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['system:lang:export']">{{ $t('btn.export') }}</el-button> <el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['system:lang:export']">{{ $t('btn.export') }}</el-button>
@ -77,16 +77,16 @@
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<!-- <el-table-column prop="id" label="id" align="center" /> --> <!-- <el-table-column prop="id" label="id" align="center" /> -->
<el-table-column prop="langCode" label="语言code" align="center"> <el-table-column prop="langCode" :label="$t('language')" align="center">
<template #default="scope"> <template #default="scope">
<dict-tag :options="sys_lang_type" :value="scope.row.langCode" /> <dict-tag :options="sys_lang_type" :value="scope.row.langCode" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="langKey" label="语言key" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="langKey" :label="$t('languageKey')" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="langName" label="名称" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="langName" :label="$t('common.content')" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="addtime" label="添加时间" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="addtime" :label="$t('common.addTime')" align="center" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" width="140"> <el-table-column :label="$t('btn.operate')" align="center" width="140">
<template #default="scope"> <template #default="scope">
<el-button v-hasPermi="['system:lang:edit']" type="success" icon="edit" title="编辑" @click="handleUpdate(scope.row)"></el-button> <el-button v-hasPermi="['system:lang:edit']" type="success" icon="edit" title="编辑" @click="handleUpdate(scope.row)"></el-button>
<el-button v-hasPermi="['system:lang:delete']" type="danger" icon="delete" title="删除" @click="handleDelete(scope.row)"></el-button> <el-button v-hasPermi="['system:lang:delete']" type="danger" icon="delete" title="删除" @click="handleDelete(scope.row)"></el-button>
@ -104,11 +104,13 @@
highlight-current-row highlight-current-row
@sort-change="sortChange" @sort-change="sortChange"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column prop="langKey" label="语言key" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="langKey" :label="$t('languageKey')" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="zh-cn" label="中文" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="en" label="英文" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="zh-cn" :label="$t('common.chinese')" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="zh-tw" label="繁体" align="center" :show-overflow-tooltip="true" /> <el-table-column prop="en" :label="$t('common.english')" align="center" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" width="140"> <el-table-column prop="zh-tw" :label="$t('common.traditionalChinese')" align="center" :show-overflow-tooltip="true" />
<el-table-column :label="$t('btn.operate')" align="center" width="140">
<template #default="scope"> <template #default="scope">
<el-button v-hasPermi="['system:lang:edit']" type="success" icon="edit" title="编辑" @click="handleUpdateP(scope.row)"></el-button> <el-button v-hasPermi="['system:lang:edit']" type="success" icon="edit" title="编辑" @click="handleUpdateP(scope.row)"></el-button>
<!-- <el-button v-hasPermi="['system:lang:delete']" type="danger" icon="delete" title="删除" @click="handleDeleteP(scope.row)"></el-button> --> <!-- <el-button v-hasPermi="['system:lang:delete']" type="danger" icon="delete" title="删除" @click="handleDeleteP(scope.row)"></el-button> -->
@ -126,43 +128,37 @@
@pagination="getList" /> @pagination="getList" />
<!-- 添加或修改多语言配置对话框 --> <!-- 添加或修改多语言配置对话框 -->
<el-dialog :title="title" :lock-scroll="false" v-model="open" width="500px"> <el-dialog :title="title" :lock-scroll="false" v-model="open" width="550px">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="140px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :lg="24"> <el-col :lg="24">
<el-form-item label="语言key" prop="langKey"> <el-form-item prop="langKey">
<template #label> <template #label>
<el-tooltip content="翻译keyegmessage.title" placement="top"> <el-tooltip content="翻译keyegmessage.title" placement="top">
<el-icon :size="15"> <el-icon :size="15">
<questionFilled /> <questionFilled />
</el-icon> </el-icon>
</el-tooltip> </el-tooltip>
翻译key {{ $t('languageKey') }}
</template> </template>
<el-input v-model="form.langKey" placeholder="请输入语言key" /> <el-input v-model="form.langKey" placeholder="请输入语言key" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :lg="24"> </el-row>
<el-form-item :label="item.langCode" prop="langName" v-for="(item, index) in form.langs" :key="index"> <el-row>
<el-input type="textarea" v-model="item.langName" placeholder="请输入名称" /> <el-table :data="form.langList">
</el-form-item> <el-table-column :label="$t('language')" align="center" prop="langCode" width="100">
</el-col> --> <template #default="scope">
{{ scope.row.label }} <br />
<el-col :lg="24"> {{ scope.row.langCode }}
<el-form-item label="中文内容" prop="langName"> </template>
<el-input type="textarea" v-model="form.langName" placeholder="请输入名称" /> </el-table-column>
</el-form-item> <el-table-column :label="$t('common.content')" align="center">
</el-col> <template #default="scope">
<el-col :lg="24"> <el-input type="textarea" rows="2" prop="langName" v-model="scope.row.langName"></el-input>
<el-form-item label="英文内容" prop="langNameEn"> </template>
<el-input type="textarea" v-model="form.langNameEn" placeholder="请输入名称" /> </el-table-column>
</el-form-item> </el-table>
</el-col>
<el-col :lg="24">
<el-form-item label="繁体内容" prop="langNameTw">
<el-input type="textarea" v-model="form.langNameTw" placeholder="请输入名称" />
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>
@ -176,16 +172,8 @@
</template> </template>
<script setup name="commonlang"> <script setup name="commonlang">
import { import { listCommonLang, delCommonLang, updateCommonLang, getCommonLang, exportCommonLang, getCommonLangByKey } from '@/api/system/commonlang.js'
listCommonLang, import { isEmpty } from '@/utils/ruoyi.js'
addCommonLang,
delCommonLang,
updateCommonLang,
getCommonLang,
exportCommonLang,
getCommonLangByKey,
} from '@/api/system/commonlang.js'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
// id // id
const ids = ref([]) const ids = ref([])
@ -222,8 +210,6 @@ const state = reactive({
// langCode: [{ required: true, message: 'code', trigger: 'change' }], // langCode: [{ required: true, message: 'code', trigger: 'change' }],
langKey: [{ required: true, pattern: /^[A-Za-z].+$/, message: '语言key不能为空', trigger: 'change' }], langKey: [{ required: true, pattern: /^[A-Za-z].+$/, message: '语言key不能为空', trigger: 'change' }],
langName: [{ required: true, message: '内容不能为空', trigger: 'blur' }], langName: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
langNameEn: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
langNameTw: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
}, },
}) })
@ -272,6 +258,26 @@ function cancel() {
// //
function reset() { function reset() {
form.value = {
langKey: undefined,
langList: [
{
langCode: 'zh-cn',
label: proxy.$t('common.chinese'),
langName: undefined,
},
{
langCode: 'zh-tw',
label: proxy.$t('common.traditionalChinese'),
langName: undefined,
},
{
langCode: 'en',
label: proxy.$t('common.english'),
langName: undefined,
},
],
}
proxy.resetForm('formRef') proxy.resetForm('formRef')
} }
@ -285,7 +291,7 @@ function handleQuery() {
function handleAdd() { function handleAdd() {
reset() reset()
open.value = true open.value = true
title.value = '添加' title.value = proxy.$t('btn.add')
opertype.value = 1 opertype.value = 1
} }
@ -328,7 +334,7 @@ function handleUpdateP(row) {
const { code, data } = res const { code, data } = res
if (code == 200) { if (code == 200) {
open.value = true open.value = true
title.value = '修改数据' title.value = proxy.$t('btn.edit')
opertype.value = 2 opertype.value = 2
form.value = { form.value = {
@ -340,27 +346,25 @@ function handleUpdateP(row) {
// //
function submitForm() { function submitForm() {
const formValid = ref(true)
form.value.langList.forEach((item) => {
if (isEmpty(item.langName)) {
formValid.value = false
}
})
if (!formValid.value) {
proxy.$modal.msgError(`请完成表格内容填写`)
return
}
proxy.$refs['formRef'].validate((valid) => { proxy.$refs['formRef'].validate((valid) => {
if (valid) { if (valid) {
if (form.value.id != undefined && opertype.value === 2) { updateCommonLang(form.value)
updateCommonLang(form.value) .then((res) => {
.then((res) => { proxy.$modal.msgSuccess('操作成功')
proxy.$modal.msgSuccess('修改成功') open.value = false
open.value = false getList()
getList() })
}) .catch(() => {})
.catch(() => {})
} else {
addCommonLang(form.value)
.then((res) => {
proxy.$modal.msgSuccess('新增成功')
open.value = false
getList()
})
.catch((err) => {
//TODO
})
}
} }
}) })
} }
@ -407,6 +411,6 @@ function sortChange(column) {
handleQuery() handleQuery()
} }
handleQuery() handleQuery()
reset()
</script> </script>