feat(demo-vue): 全站 i18n 抽文案、中英文资源与页面接入

- 引入 vue-i18n,集中维护 zh-CN / en-US 文案与产品 catalog、长文 HTML
- 前台与后台列表/弹窗/校验/删除确认等改为 t(),顶栏与新闻/行业列表与详情页多语言
- 修正 Industry 等页面文首误粘贴;请求头 Accept-Language 与 Element 语言随 locale 切换
This commit is contained in:
王文昊
2026-04-27 13:48:42 +08:00
parent 8b8ae61f4b
commit a74f3e9401
57 changed files with 3703 additions and 3235 deletions

View File

@@ -0,0 +1,19 @@
import { createI18n } from 'vue-i18n'
import zhCN from '../locales/zh-CN'
import enUS from '../locales/en-US'
const stored = typeof localStorage !== 'undefined' ? localStorage.getItem('locale') : null
const defaultLocale = stored === 'en-US' || stored === 'zh-CN' ? stored : 'zh-CN'
export const i18n = createI18n({
legacy: false,
globalInjection: true,
locale: defaultLocale,
fallbackLocale: 'zh-CN',
messages: {
'zh-CN': zhCN,
'en-US': enUS
}
})
export default i18n

View File

@@ -2,6 +2,7 @@ import axios, { type AxiosRequestConfig } from 'axios';
import { saveLocalStorage, getLocalStorage,clearLocalStorage } from '@/utils/utils';
import Constants from '@/utils/constants';
import {ElMessage, ElMessageBox} from 'element-plus';
import i18n from '@/utils/i18n';
// token的名称 需要和服务端 配置的对应
const TOKEN_NAME = 'pdmtoken';
@@ -29,6 +30,10 @@ request.interceptors.request.use(
} else {
delete config.headers[TOKEN_NAME];
}
const locale = (i18n.global.locale as { value: string }).value
|| (typeof localStorage !== 'undefined' && localStorage.getItem('locale'))
|| 'zh-CN';
config.headers['Accept-Language'] = locale;
return config;
},
(error: any) => {
@@ -59,15 +64,16 @@ request.interceptors.response.use(
// `token` 过期或者账号已在别处登录
if (res.code === 11012 || res.code == 11011) {
ElMessage.closeAll();
ElMessage.error('您没有登录,请重新登录');
ElMessage.error((i18n.global as { t: (k: string) => string }).t('request.notLogin'));
setTimeout(logout, 300);
return Promise.reject(response);
}
// 长时间未操作系统,需要重新登录
if (res.code === 30001) {
ElMessageBox.confirm('您需要重新登陆', '确认退出登录', {
confirmButtonText: '重新登陆',
cancelButtonText: '取消',
const gt = (i18n.global as { t: (k: string) => string }).t;
ElMessageBox.confirm(gt('admin.reLogin'), gt('admin.reLoginTitle'), {
confirmButtonText: gt('admin.reLoginBtn'),
cancelButtonText: (i18n.global as { t: (k: string) => string }).t('common.cancel'),
type: 'warning'
}).then(() => {
logout()
@@ -86,15 +92,16 @@ request.interceptors.response.use(
},
(error) => {
// 对响应错误做点什么
const gt = (i18n.global as { t: (k: string) => string }).t;
if (error.message.indexOf('timeout') !== -1) {
ElMessage.closeAll();
ElMessage.error('网络超时');
ElMessage.error(gt('request.timeout'));
} else if (error.message === 'Network Error') {
ElMessage.closeAll();
ElMessage.error('网络连接错误');
ElMessage.error(gt('request.network'));
} else if (error.message.indexOf('Request') !== -1) {
ElMessage.closeAll();
ElMessage.error('网络发生错误');
ElMessage.error(gt('request.error'));
}
return Promise.reject(error);
}