feat(i18n): translate backend error messages, dict labels auto-translate, add 150+ medical dict terms

This commit is contained in:
2026-06-25 21:15:44 +08:00
parent 7c7b02225d
commit 4e2e11292f
4 changed files with 152 additions and 17 deletions

View File

@@ -1,12 +1,14 @@
import axios from 'axios'
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from 'element-plus'
import {getToken} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import errorCode, {errorCodeEn, errorCodeVi} from '@/utils/errorCode'
import {blobValidate, tansParams} from '@/utils/his'
import cache from '@/plugins/cache'
import {saveAs} from 'file-saver'
import useUserStore from '@/store/modules/user'
import JSONBig from 'json-bigint'
import {autoTranslate} from '@/i18n/autoTranslate'
import Cookies from 'js-cookie'
// 初始化json-bigint配置大数字转字符串关键storeAsString: true
const jsonBig = JSONBig({ storeAsString: true })
@@ -141,8 +143,14 @@ service.interceptors.request.use(config => {
service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
// 获取错误信息(支持多语言)
const lang = Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
const errorDict = lang === 'en' ? errorCodeEn : lang === 'vi' ? errorCodeVi : errorCode
let msg = errorDict[code] || res.data.msg || errorDict['default']
// 后端返回的中文错误消息自动翻译
if (lang !== 'zh-CN' && /[\u4e00-\u9fff]/.test(msg)) {
msg = autoTranslate(msg)
}
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
@@ -160,11 +168,12 @@ service.interceptors.request.use(config => {
}).catch(() => {
isRelogin.show = false;
});
return Promise.reject('登录已过期,请重新登录。')
return Promise.reject(lang === 'zh-CN' ? '登录已过期,请重新登录。' : lang === 'en' ? 'Session expired, please log in again.' : 'Phiên hết hạn, vui lòng đăng nhập lại.')
}
// 其他页面:显示提示后自动跳转
ElMessage.warning('登录已过期,正在跳转到登录页面...');
const expiredMsg = lang === 'zh-CN' ? '登录已过期,正在跳转到登录页面...' : lang === 'en' ? 'Session expired, redirecting to login...' : 'Phiên hết hạn, đang chuyển đến trang đăng nhập...'
ElMessage.warning(expiredMsg);
useUserStore().logOut().then(() => {
isRelogin.show = false;
// 跳转到登录页保留当前路径作为redirect参数
@@ -204,13 +213,15 @@ service.interceptors.request.use(config => {
},
error => {
console.log('err' + error)
const lang = Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
message = lang === 'zh-CN' ? '后端接口连接异常' : lang === 'en' ? 'Backend API connection error' : 'Lỗi kết nối API backend';
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
message = lang === 'zh-CN' ? '系统接口请求超时' : lang === 'en' ? 'API request timeout' : 'Yêu cầu API hết thời gian';
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
const code = message.substr(message.length - 3)
message = lang === 'zh-CN' ? '系统接口' + code + '异常' : lang === 'en' ? 'API error ' + code : 'Lỗi API ' + code;
}
// 检查是否需要跳过错误提示
if (!error.config?.skipErrorMsg) {
@@ -221,7 +232,9 @@ service.interceptors.request.use(config => {
// 通用下载方法
export function download(url, params, filename, config) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
const lang = Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
const dlMsg = lang === 'zh-CN' ? '正在下载数据,请稍候' : lang === 'en' ? 'Downloading data, please wait' : 'Đang tải dữ liệu, vui lòng đợi'
downloadLoadingInstance = ElLoading.service({ text: dlMsg, background: "rgba(0, 0, 0, 0.7)", })
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
@@ -235,20 +248,25 @@ export function download(url, params, filename, config) {
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
const errorDict = lang === 'en' ? errorCodeEn : lang === 'vi' ? errorCodeVi : errorCode
let errMsg = errorDict[rspObj.code] || rspObj.msg || errorDict['default']
if (lang !== 'zh-CN' && /[\u4e00-\u9fff]/.test(errMsg)) errMsg = autoTranslate(errMsg)
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
const dlErr = lang === 'zh-CN' ? '下载文件出现错误,请联系管理员!' : lang === 'en' ? 'Download error, please contact administrator!' : 'Lỗi tải xuống, vui lòng liên hệ quản trị viên!'
ElMessage.error(dlErr)
downloadLoadingInstance.close();
})
}
// 添加GET方式下载方法
export function downloadGet(url, params, filename, config) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
const lang2 = Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
const dlMsg2 = lang2 === 'zh-CN' ? '正在下载数据,请稍候' : lang2 === 'en' ? 'Downloading data, please wait' : 'Đang tải dữ liệu, vui lòng đợi'
downloadLoadingInstance = ElLoading.service({ text: dlMsg2, background: "rgba(0, 0, 0, 0.7)", })
return service.get(url, {
params: params,
responseType: 'blob',
@@ -261,13 +279,16 @@ export function downloadGet(url, params, filename, config) {
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
const errorDict2 = lang2 === 'en' ? errorCodeEn : lang2 === 'vi' ? errorCodeVi : errorCode
let errMsg = errorDict2[rspObj.code] || rspObj.msg || errorDict2['default']
if (lang2 !== 'zh-CN' && /[\u4e00-\u9fff]/.test(errMsg)) errMsg = autoTranslate(errMsg)
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
const dlErr2 = lang2 === 'zh-CN' ? '下载文件出现错误,请联系管理员!' : lang2 === 'en' ? 'Download error, please contact administrator!' : 'Lỗi tải xuống, vui lòng liên hệ quản trị viên!'
ElMessage.error(dlErr2)
downloadLoadingInstance.close();
})
}