提交 962f90de 作者: vben

feat: support vscode i18n-ally plugin

上级 41a4b827
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
"stylelint.vscode-stylelint", "stylelint.vscode-stylelint",
"DavidAnson.vscode-markdownlint", "DavidAnson.vscode-markdownlint",
"esbenp.prettier-vscode", "esbenp.prettier-vscode",
"mrmlnc.vscode-scss",
"mrmlnc.vscode-less", "mrmlnc.vscode-less",
"antfu.i18n-ally",
"cpylua.language-postcss", "cpylua.language-postcss",
"Orta.vscode-jest", "Orta.vscode-jest",
"antfu.iconify", "antfu.iconify",
......
...@@ -10,14 +10,13 @@ ...@@ -10,14 +10,13 @@
"editor.smoothScrolling": true, "editor.smoothScrolling": true,
"editor.cursorBlinking": "phase", "editor.cursorBlinking": "phase",
"editor.cursorSmoothCaretAnimation": true, "editor.cursorSmoothCaretAnimation": true,
"editor.detectIndentation": false, // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false,
"diffEditor.ignoreTrimWhitespace": false, "diffEditor.ignoreTrimWhitespace": false,
"editor.formatOnPaste": true, //自动格式化粘贴的内容 "editor.formatOnPaste": true,
"editor.formatOnSave": true, //保存自动格式化 "editor.formatOnSave": true,
"editor.suggestSelection": "first", "editor.suggestSelection": "first",
"editor.trimAutoWhitespace": true, "editor.trimAutoWhitespace": true,
"editor.quickSuggestions": { "editor.quickSuggestions": {
// 快速提示
"other": true, "other": true,
"comments": true, "comments": true,
"strings": true "strings": true
...@@ -25,41 +24,33 @@ ...@@ -25,41 +24,33 @@
//=========================================== //===========================================
//============= Other ======================= //============= Other =======================
//=========================================== //===========================================
"breadcrumbs.enabled": true, // 启用/禁用导航路径 "breadcrumbs.enabled": true,
"open-in-browser.default": "chrome", // 默认浏览器 "open-in-browser.default": "chrome",
//=========================================== //===========================================
//============= emmet ======================= //============= emmet =======================
//=========================================== //===========================================
"emmet.triggerExpansionOnTab": true, // 配置emmet是否启用tab展开缩写 "emmet.triggerExpansionOnTab": true,
"emmet.showAbbreviationSuggestions": true, "emmet.showAbbreviationSuggestions": true,
"emmet.showExpandedAbbreviation": "always", "emmet.showExpandedAbbreviation": "always",
"emmet.syntaxProfiles": { "emmet.syntaxProfiles": {
// 配置emmet对文件类型的支持,比如vue后缀文件按照html文件来进行emmet扩写
"vue-html": "html", "vue-html": "html",
"vue": "html", "vue": "html",
"javascript": "javascriptreact", "javascript": "javascriptreact",
// xml类型文件默认都是单引号,开启对非单引号的emmet识别
"xml": { "xml": {
"attr_quotes": "single" "attr_quotes": "single"
} }
}, },
"emmet.includeLanguages": { "emmet.includeLanguages": {
// 在react的jsx中添加对emmet的支持
"jsx-sublime-babel-tags": "javascriptreact" "jsx-sublime-babel-tags": "javascriptreact"
}, },
//=========================================== //===========================================
//============= files ======================= //============= files =======================
//=========================================== //===========================================
// "files.autoSave": "onWindowChange", // 窗口失去焦点自动保存 "files.trimTrailingWhitespace": true,
// "files.autoSaveDelay": 1000, // 自动保存时间
"files.trimTrailingWhitespace": true, // 启用后,将在保存文件时剪裁尾随空格。
// 文件末尾插入新行
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
// 删除文件末尾多余的新行
"files.trimFinalNewlines": true, "files.trimFinalNewlines": true,
"files.eol": "\n", "files.eol": "\n",
"search.exclude": { "search.exclude": {
// 搜索排除这些区域
"**/node_modules": true, "**/node_modules": true,
"**/*.log": true, "**/*.log": true,
"**/*.log*": true, "**/*.log*": true,
...@@ -76,8 +67,6 @@ ...@@ -76,8 +67,6 @@
"**/tmp": true "**/tmp": true
}, },
"files.exclude": { "files.exclude": {
// 排除文件搜索区域,比如node_modules(默认设置已经屏蔽了)
// "**/node_modules": true,
"**/bower_components": true, "**/bower_components": true,
"**/.idea": true, "**/.idea": true,
"**/yarn.lock": true, "**/yarn.lock": true,
...@@ -100,7 +89,6 @@ ...@@ -100,7 +89,6 @@
"**/yarn.lock": true "**/yarn.lock": true
}, },
"files.associations": { "files.associations": {
// 配置文件关联,以便启用对应的智能提示,比如wxss使用css
"*.vue": "vue", "*.vue": "vue",
"*.wxss": "css" "*.wxss": "css"
}, },
...@@ -109,13 +97,11 @@ ...@@ -109,13 +97,11 @@
"css.validate": true, "css.validate": true,
"less.validate": true, "less.validate": true,
"scss.validate": true, "scss.validate": true,
// ↓↓↓↓↓↓↓↓↓↓↓↓↓ 以下为插件设置 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// ↓↓↓↓↓↓↓↓↓↓↓↓↓ 需要安装对应的插件 ↓↓↓↓↓↓↓↓↓↓↓↓
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// =========================================== // ===========================================
// ================ Eslint =================== // ================ Eslint ===================
// =========================================== // ===========================================
"eslint.enable": true, // 是否开启eslint "eslint.enable": true,
"eslint.options": { "eslint.options": {
// 配置 // 配置
"plugins": [ "plugins": [
...@@ -126,53 +112,41 @@ ...@@ -126,53 +112,41 @@
"typescript" "typescript"
] ]
}, },
"eslint.autoFixOnSave": true, // 保存自动格式化 "eslint.autoFixOnSave": true,
// =========================================== // ===========================================
// ================ Vetur ==================== // ================ Vetur ====================
// =========================================== // ===========================================
"vetur.experimental.templateInterpolationService": true, "vetur.experimental.templateInterpolationService": true,
"vetur.format.options.tabSize": 2, "vetur.format.options.tabSize": 2,
"vetur.format.defaultFormatter.html": "js-beautify-html", // 使用js-beautify-html格式化 "vetur.format.defaultFormatter.html": "js-beautify-html",
"vetur.format.defaultFormatter.scss": "prettier", // 使用js-beautify-html格式化 "vetur.format.defaultFormatter.scss": "prettier",
"vetur.format.defaultFormatter.css": "prettier", // 使用js-beautify-html格式化 "vetur.format.defaultFormatter.css": "prettier",
// "vetur.format.defaultFormatter.html": "prettyhtml",
"vetur.format.defaultFormatter.ts": "prettier-tslint", "vetur.format.defaultFormatter.ts": "prettier-tslint",
"vetur.format.defaultFormatter.js": "prettier", "vetur.format.defaultFormatter.js": "prettier",
"vetur.languageFeatures.codeActions": false, "vetur.languageFeatures.codeActions": false,
// "vetur.useWorkspaceDependencies": true,
"vetur.format.defaultFormatterOptions": { "vetur.format.defaultFormatterOptions": {
"js-beautify-html": { "js-beautify-html": {
// "wrap_attributes": "force-aligned", // 单行 "wrap_attributes": "force-expand-multiline"
"wrap_attributes": "force-expand-multiline" // 属性强制折行对齐 多行
}, },
"prettier": { "prettier": {
"eslintIntegration": true, // 让perttier使用eslint的格式进行检查 "eslintIntegration": true,
"arrowParens": "always", // 箭头函数参数括号 默认avoid 可选 avoid | always "arrowParens": "always",
"semi": false, // 使用分号, 默认true "semi": false,
"singleQuote": true // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号) "singleQuote": true
} }
}, },
// 函数注释
//===========================================
//============= Code Runner =================
//===========================================
"javascript.updateImportsOnFileMove.enabled": "never", "javascript.updateImportsOnFileMove.enabled": "never",
"liveServer.settings.donotShowInfoMsg": true, "liveServer.settings.donotShowInfoMsg": true,
"[javascript]": { "terminal.integrated.rendererType": "dom",
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"terminal.integrated.rendererType": "dom", //关闭liveserver提示
"telemetry.enableCrashReporter": false, "telemetry.enableCrashReporter": false,
"telemetry.enableTelemetry": false, "telemetry.enableTelemetry": false,
"workbench.settings.enableNaturalLanguageSearch": false, "workbench.settings.enableNaturalLanguageSearch": false,
// 引用路径设置
"path-intellisense.mappings": { "path-intellisense.mappings": {
"/@/": "${workspaceRoot}/src" "/@/": "${workspaceRoot}/src"
}, },
"prettier.requireConfig": true, "prettier.requireConfig": true,
"typescript.updateImportsOnFileMove.enabled": "always", "typescript.updateImportsOnFileMove.enabled": "always",
"workbench.sideBar.location": "left", "workbench.sideBar.location": "left",
"[javascriptreact]": { "[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "esbenp.prettier-vscode"
}, },
...@@ -203,8 +177,18 @@ ...@@ -203,8 +177,18 @@
"[markdown]": { "[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "esbenp.prettier-vscode"
}, },
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true "source.fixAll.eslint": true
} },
} "i18n-ally.localesPaths": [
"src/locales/lang",
],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher":"{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": [
"ts"
],
"i18n-ally.sourceLanguage": "zh"
}
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
### ✨ Features ### ✨ Features
- 还原 antdv 默认 loading,重构 `Loading` 组件,增加`useLoading``v-loading`指令。并增加示例 - 还原 antdv 默认 loading,重构 `Loading` 组件,增加`useLoading``v-loading`指令。并增加示例
- i18n 支持 vscode `i18n-ally`插件
### 🎫 Chores ### 🎫 Chores
......
...@@ -29,7 +29,7 @@ export default defineComponent({ ...@@ -29,7 +29,7 @@ export default defineComponent({
const visibleRef = ref(false); const visibleRef = ref(false);
const propsRef = ref<Partial<Nullable<DrawerProps>>>(null); const propsRef = ref<Partial<Nullable<DrawerProps>>>(null);
const { t } = useI18n('component.drawer'); const { t } = useI18n();
const getMergeProps = computed( const getMergeProps = computed(
(): DrawerProps => { (): DrawerProps => {
...@@ -228,7 +228,11 @@ export default defineComponent({ ...@@ -228,7 +228,11 @@ export default defineComponent({
default: () => ( default: () => (
<> <>
<div ref={scrollRef} style={unref(getScrollContentStyle)}> <div ref={scrollRef} style={unref(getScrollContentStyle)}>
<Loading absolute tip={t('loadingText')} loading={unref(getLoading)} /> <Loading
absolute
tip={t('component.drawer.loadingText')}
loading={unref(getLoading)}
/>
{getSlot(slots)} {getSlot(slots)}
</div> </div>
{renderFooter()} {renderFooter()}
......
...@@ -2,7 +2,7 @@ import type { PropType } from 'vue'; ...@@ -2,7 +2,7 @@ import type { PropType } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
const { t } = useI18n('component.drawer'); const { t } = useI18n();
export const footerProps = { export const footerProps = {
confirmLoading: propTypes.bool, confirmLoading: propTypes.bool,
...@@ -11,13 +11,13 @@ export const footerProps = { ...@@ -11,13 +11,13 @@ export const footerProps = {
*/ */
showCancelBtn: propTypes.bool.def(true), showCancelBtn: propTypes.bool.def(true),
cancelButtonProps: Object as PropType<any>, cancelButtonProps: Object as PropType<any>,
cancelText: propTypes.string.def(t('cancelText')), cancelText: propTypes.string.def(t('component.drawer.cancelText')),
/** /**
* @description: Show confirmation button * @description: Show confirmation button
*/ */
showOkBtn: propTypes.bool.def(true), showOkBtn: propTypes.bool.def(true),
okButtonProps: propTypes.any, okButtonProps: propTypes.any,
okText: propTypes.string.def(t('okText')), okText: propTypes.string.def(t('component.drawer.okText')),
okType: propTypes.string.def('primary'), okType: propTypes.string.def('primary'),
showFooter: propTypes.bool, showFooter: propTypes.bool,
footerHeight: { footerHeight: {
......
<template> <template>
<BasicModal <BasicModal
v-bind="$attrs" v-bind="$attrs"
:title="t('exportModalTitle')" :title="t('component.excel.exportModalTitle')"
@ok="handleOk" @ok="handleOk"
@register="registerModal" @register="registerModal"
> >
...@@ -21,19 +21,19 @@ ...@@ -21,19 +21,19 @@
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.excel'); const { t } = useI18n();
const schemas: FormSchema[] = [ const schemas: FormSchema[] = [
{ {
field: 'filename', field: 'filename',
component: 'Input', component: 'Input',
label: t('fileName'), label: t('component.excel.fileName'),
rules: [{ required: true }], rules: [{ required: true }],
}, },
{ {
field: 'bookType', field: 'bookType',
component: 'Select', component: 'Select',
label: t('fileType'), label: t('component.excel.fileType'),
defaultValue: 'xlsx', defaultValue: 'xlsx',
rules: [{ required: true }], rules: [{ required: true }],
componentProps: { componentProps: {
......
...@@ -9,7 +9,7 @@ import { getSlot } from '/@/utils/helper/tsxHelper'; ...@@ -9,7 +9,7 @@ import { getSlot } from '/@/utils/helper/tsxHelper';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
const { t } = useI18n('component.form'); const { t } = useI18n();
export default defineComponent({ export default defineComponent({
name: 'BasicFormAction', name: 'BasicFormAction',
...@@ -38,14 +38,14 @@ export default defineComponent({ ...@@ -38,14 +38,14 @@ export default defineComponent({
setup(props, { slots, emit }) { setup(props, { slots, emit }) {
const getResetBtnOptionsRef = computed(() => { const getResetBtnOptionsRef = computed(() => {
return { return {
text: t('resetButton'), text: t('component.form.resetButton'),
...props.resetButtonOptions, ...props.resetButtonOptions,
}; };
}); });
const getSubmitBtnOptionsRef = computed(() => { const getSubmitBtnOptionsRef = computed(() => {
return { return {
text: t('submitButton'), text: t('component.form.submitButton'),
// htmlType: 'submit', // htmlType: 'submit',
...props.submitButtonOptions, ...props.submitButtonOptions,
}; };
...@@ -77,7 +77,7 @@ export default defineComponent({ ...@@ -77,7 +77,7 @@ export default defineComponent({
<Button type="default" class="mr-2" onClick={toggleAdvanced}> <Button type="default" class="mr-2" onClick={toggleAdvanced}>
{() => ( {() => (
<> <>
{isAdvanced ? t('putAway') : t('unfold')} {isAdvanced ? t('component.form.putAway') : t('component.form.unfold')}
<BasicArrow expand={!isAdvanced} top /> <BasicArrow expand={!isAdvanced} top />
</> </>
)} )}
......
...@@ -47,7 +47,7 @@ export default defineComponent({ ...@@ -47,7 +47,7 @@ export default defineComponent({
}, },
}, },
setup(props, { slots }) { setup(props, { slots }) {
const { t } = useI18n('component.form'); const { t } = useI18n();
// @ts-ignore // @ts-ignore
const itemLabelWidthRef = useItemLabelWidth(toRef(props, 'schema'), toRef(props, 'formProps')); const itemLabelWidthRef = useItemLabelWidth(toRef(props, 'schema'), toRef(props, 'formProps'));
...@@ -175,7 +175,7 @@ export default defineComponent({ ...@@ -175,7 +175,7 @@ export default defineComponent({
const characterInx = rules.findIndex((val) => val.max); const characterInx = rules.findIndex((val) => val.max);
if (characterInx !== -1 && !rules[characterInx].validator) { if (characterInx !== -1 && !rules[characterInx].validator) {
rules[characterInx].message = rules[characterInx].message =
rules[characterInx].message || t('maxTip', [rules[characterInx].max]); rules[characterInx].message || t('component.form.maxTip', [rules[characterInx].max]);
} }
return rules; return rules;
} }
......
import type { ComponentType } from './types/index'; import type { ComponentType } from './types/index';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.form'); const { t } = useI18n();
/** /**
* @description: 生成placeholder * @description: 生成placeholder
*/ */
export function createPlaceholderMessage(component: ComponentType) { export function createPlaceholderMessage(component: ComponentType) {
if (component.includes('Input') || component.includes('Complete')) { if (component.includes('Input') || component.includes('Complete')) {
return t('input'); return t('component.form.input');
} }
if (component.includes('Picker')) { if (component.includes('Picker')) {
return t('choose'); return t('component.form.choose');
} }
if ( if (
component.includes('Select') || component.includes('Select') ||
...@@ -21,7 +21,7 @@ export function createPlaceholderMessage(component: ComponentType) { ...@@ -21,7 +21,7 @@ export function createPlaceholderMessage(component: ComponentType) {
component.includes('Switch') component.includes('Switch')
) { ) {
// return `请选择${label}`; // return `请选择${label}`;
return t('choose'); return t('component.form.choose');
} }
return ''; return '';
} }
......
<template> <template>
<section class="menu-search-input" @Click="handleClick" :class="searchClass"> <section class="menu-search-input" @Click="handleClick" :class="searchClass">
<a-input-search <a-input-search
:placeholder="t('search')" :placeholder="t('component.menu.search')"
class="menu-search-input__search" class="menu-search-input__search"
allowClear allowClear
@change="handleChange" @change="handleChange"
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
}, },
}, },
setup(props, { emit }) { setup(props, { emit }) {
const { t } = useI18n('component.menu'); const { t } = useI18n();
const [debounceEmitChange] = useDebounce(emitChange, 200); const [debounceEmitChange] = useDebounce(emitChange, 200);
......
...@@ -3,15 +3,15 @@ import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; ...@@ -3,15 +3,15 @@ import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
const { t } = useI18n('component.modal'); const { t } = useI18n();
export const modalProps = { export const modalProps = {
visible: propTypes.bool, visible: propTypes.bool,
// open drag // open drag
draggable: propTypes.bool.def(true), draggable: propTypes.bool.def(true),
centered: propTypes.bool, centered: propTypes.bool,
cancelText: propTypes.string.def(t('cancelText')), cancelText: propTypes.string.def(t('component.modal.cancelText')),
okText: propTypes.string.def(t('okText')), okText: propTypes.string.def(t('component.modal.okText')),
closeFunc: Function as PropType<() => Promise<boolean>>, closeFunc: Function as PropType<() => Promise<boolean>>,
}; };
......
...@@ -4,27 +4,27 @@ ...@@ -4,27 +4,27 @@
<Tooltip placement="top" v-if="getSetting.redo"> <Tooltip placement="top" v-if="getSetting.redo">
<template #title> <template #title>
<span>{{ t('settingRedo') }}</span> <span>{{ t('component.table.settingRedo') }}</span>
</template> </template>
<RedoOutlined @click="redo" /> <RedoOutlined @click="redo" />
</Tooltip> </Tooltip>
<Tooltip placement="top" v-if="getSetting.size"> <Tooltip placement="top" v-if="getSetting.size">
<template #title> <template #title>
<span>{{ t('settingDens') }}</span> <span>{{ t('component.table.settingDens') }}</span>
</template> </template>
<Dropdown placement="bottomCenter" :trigger="['click']"> <Dropdown placement="bottomCenter" :trigger="['click']">
<ColumnHeightOutlined /> <ColumnHeightOutlined />
<template #overlay> <template #overlay>
<Menu @click="handleTitleClick" selectable v-model:selectedKeys="selectedKeysRef"> <Menu @click="handleTitleClick" selectable v-model:selectedKeys="selectedKeysRef">
<MenuItem key="default"> <MenuItem key="default">
<span>{{ t('settingDensDefault') }}</span> <span>{{ t('component.table.settingDensDefault') }}</span>
</MenuItem> </MenuItem>
<MenuItem key="middle"> <MenuItem key="middle">
<span>{{ t('settingDensMiddle') }}</span> <span>{{ t('component.table.settingDensMiddle') }}</span>
</MenuItem> </MenuItem>
<MenuItem key="small"> <MenuItem key="small">
<span>{{ t('settingDensSmall') }}</span> <span>{{ t('component.table.settingDensSmall') }}</span>
</MenuItem> </MenuItem>
</Menu> </Menu>
</template> </template>
...@@ -140,7 +140,7 @@ ...@@ -140,7 +140,7 @@
defaultCheckList: [], defaultCheckList: [],
}); });
const { t } = useI18n('component.table'); const { t } = useI18n();
watchEffect(() => { watchEffect(() => {
const columns = table.getColumns(); const columns = table.getColumns();
......
...@@ -6,7 +6,7 @@ import { PAGE_SIZE } from '../const'; ...@@ -6,7 +6,7 @@ import { PAGE_SIZE } from '../const';
import { useProps } from './useProps'; import { useProps } from './useProps';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.table'); const { t } = useI18n();
export function useColumns( export function useColumns(
refProps: ComputedRef<BasicTableProps>, refProps: ComputedRef<BasicTableProps>,
getPaginationRef: ComputedRef<false | PaginationProps> getPaginationRef: ComputedRef<false | PaginationProps>
...@@ -44,7 +44,7 @@ export function useColumns( ...@@ -44,7 +44,7 @@ export function useColumns(
columns.unshift({ columns.unshift({
flag: 'INDEX', flag: 'INDEX',
width: 50, width: 50,
title: t('index'), title: t('component.table.index'),
align: 'center', align: 'center',
customRender: ({ index }) => { customRender: ({ index }) => {
const getPagination = unref(getPaginationRef); const getPagination = unref(getPaginationRef);
......
...@@ -10,7 +10,7 @@ import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const'; ...@@ -10,7 +10,7 @@ import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const';
import { useProps } from './useProps'; import { useProps } from './useProps';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.table'); const { t } = useI18n();
export function usePagination(refProps: ComputedRef<BasicTableProps>) { export function usePagination(refProps: ComputedRef<BasicTableProps>) {
const configRef = ref<PaginationProps>({}); const configRef = ref<PaginationProps>({});
const { propsRef } = useProps(refProps); const { propsRef } = useProps(refProps);
...@@ -25,7 +25,7 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) { ...@@ -25,7 +25,7 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
pageSize: PAGE_SIZE, pageSize: PAGE_SIZE,
size: 'small', size: 'small',
defaultPageSize: PAGE_SIZE, defaultPageSize: PAGE_SIZE,
showTotal: (total) => t('total', { total }), showTotal: (total) => t('component.table.total', { total }),
showSizeChanger: true, showSizeChanger: true,
pageSizeOptions: PAGE_SIZE_OPTIONS, pageSizeOptions: PAGE_SIZE_OPTIONS,
itemRender: ({ page, type, originalElement }) => { itemRender: ({ page, type, originalElement }) => {
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
<div> <div>
<a-button-group> <a-button-group>
<a-button type="primary" @click="openUploadModal" preIcon="ant-design:cloud-upload-outlined"> <a-button type="primary" @click="openUploadModal" preIcon="ant-design:cloud-upload-outlined">
{{ t('upload') }} {{ t('component.upload.upload') }}
</a-button> </a-button>
<Tooltip placement="bottom" v-if="showPreview"> <Tooltip placement="bottom" v-if="showPreview">
<template #title> <template #title>
{{ t('uploaded') }} {{ t('component.upload.uploaded') }}
<template v-if="fileListRef.length">{{ fileListRef.length }}</template> <template v-if="fileListRef.length">{{ fileListRef.length }}</template>
</template> </template>
<a-button @click="openPreviewModal"> <a-button @click="openPreviewModal">
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
components: { UploadModal, UploadPreviewModal, Icon, Tooltip }, components: { UploadModal, UploadPreviewModal, Icon, Tooltip },
props: uploadContainerProps, props: uploadContainerProps,
setup(props, { emit, attrs }) { setup(props, { emit, attrs }) {
const { t } = useI18n('component.upload'); const { t } = useI18n();
// 上传modal // 上传modal
const [registerUploadModal, { openModal: openUploadModal }] = useModal(); const [registerUploadModal, { openModal: openUploadModal }] = useModal();
......
<template> <template>
<BasicModal <BasicModal
width="800px" width="800px"
:title="t('upload')" :title="t('component.upload.upload')"
:okText="t('save')" :okText="t('component.upload.save')"
v-bind="$attrs" v-bind="$attrs"
@register="register" @register="register"
@ok="handleOk" @ok="handleOk"
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
:before-upload="beforeUpload" :before-upload="beforeUpload"
class="upload-modal-toolbar__btn" class="upload-modal-toolbar__btn"
> >
<a-button type="primary"> {{ t('choose') }} </a-button> <a-button type="primary"> {{ t('component.upload.choose') }} </a-button>
</Upload> </Upload>
</div> </div>
<FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" /> <FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" />
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
props: basicProps, props: basicProps,
setup(props, { emit }) { setup(props, { emit }) {
// 是否正在上传 // 是否正在上传
const { t } = useI18n('component.upload'); const { t } = useI18n();
const isUploadingRef = ref(false); const isUploadingRef = ref(false);
const fileListRef = ref<FileItem[]>([]); const fileListRef = ref<FileItem[]>([]);
...@@ -105,10 +105,10 @@ ...@@ -105,10 +105,10 @@
(item) => item.status === UploadResultStatus.ERROR (item) => item.status === UploadResultStatus.ERROR
); );
return isUploadingRef.value return isUploadingRef.value
? t('uploading') ? t('component.upload.uploading')
: someError : someError
? t('reUploadFailed') ? t('component.upload.reUploadFailed')
: t('startUpload'); : t('component.upload.startUpload');
}); });
// 上传前校验 // 上传前校验
...@@ -119,13 +119,13 @@ ...@@ -119,13 +119,13 @@
// 设置最大值,则判断 // 设置最大值,则判断
if (maxSize && file.size / 1024 / 1024 >= maxSize) { if (maxSize && file.size / 1024 / 1024 >= maxSize) {
createMessage.error(t('maxSizeMultiple', [maxSize])); createMessage.error(t('component.upload.maxSizeMultiple', [maxSize]));
return false; return false;
} }
// 设置类型,则判断 // 设置类型,则判断
if (accept.length > 0 && !checkFileType(file, accept)) { if (accept.length > 0 && !checkFileType(file, accept)) {
createMessage.error!(t('acceptUpload', [accept.join(',')])); createMessage.error!(t('acomponent.upload.cceptUpload', [accept.join(',')]));
return false; return false;
} }
const commonItem = { const commonItem = {
...@@ -206,7 +206,7 @@ ...@@ -206,7 +206,7 @@
async function handleStartUpload() { async function handleStartUpload() {
const { maxNumber } = props; const { maxNumber } = props;
if (fileListRef.value.length > maxNumber) { if (fileListRef.value.length > maxNumber) {
return createMessage.warning(t('maxNumber', [maxNumber])); return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
} }
try { try {
isUploadingRef.value = true; isUploadingRef.value = true;
...@@ -233,10 +233,10 @@ ...@@ -233,10 +233,10 @@
const { maxNumber } = props; const { maxNumber } = props;
if (fileListRef.value.length > maxNumber) { if (fileListRef.value.length > maxNumber) {
return createMessage.warning(t('maxNumber', [maxNumber])); return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
} }
if (isUploadingRef.value) { if (isUploadingRef.value) {
return createMessage.warning(t('saveWarn')); return createMessage.warning(t('component.upload.saveWarn'));
} }
const fileList: string[] = []; const fileList: string[] = [];
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
} }
// 存在一个上传成功的即可保存 // 存在一个上传成功的即可保存
if (fileList.length <= 0) { if (fileList.length <= 0) {
return createMessage.warning(t('saveError')); return createMessage.warning(t('component.upload.saveError'));
} }
fileListRef.value = []; fileListRef.value = [];
closeModal(); closeModal();
...@@ -261,7 +261,7 @@ ...@@ -261,7 +261,7 @@
fileListRef.value = []; fileListRef.value = [];
return true; return true;
} else { } else {
createMessage.warning(t('uploadWait')); createMessage.warning(t('component.upload.uploadWait'));
return false; return false;
} }
} }
......
<template> <template>
<BasicModal <BasicModal
width="800px" width="800px"
:title="t('preview')" :title="t('component.upload.preview')"
wrapClassName="upload-preview-modal" wrapClassName="upload-preview-modal"
v-bind="$attrs" v-bind="$attrs"
@register="register" @register="register"
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
props: previewProps, props: previewProps,
setup(props, { emit }) { setup(props, { emit }) {
const [register, { closeModal }] = useModalInner(); const [register, { closeModal }] = useModalInner();
const { t } = useI18n('component.upload'); const { t } = useI18n();
const fileListRef = ref<PreviewFileItem[]>([]); const fileListRef = ref<PreviewFileItem[]>([]);
watch( watch(
......
...@@ -7,14 +7,14 @@ import { Progress, Tag } from 'ant-design-vue'; ...@@ -7,14 +7,14 @@ import { Progress, Tag } from 'ant-design-vue';
import TableAction from '/@/components/Table/src/components/TableAction'; import TableAction from '/@/components/Table/src/components/TableAction';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.upload'); const { t } = useI18n();
// 文件上传列表 // 文件上传列表
export function createTableColumns(): BasicColumn[] { export function createTableColumns(): BasicColumn[] {
return [ return [
{ {
dataIndex: 'thumbUrl', dataIndex: 'thumbUrl',
title: t('legend'), title: t('component.upload.legend'),
width: 100, width: 100,
customRender: ({ record }) => { customRender: ({ record }) => {
const { thumbUrl, type } = (record as FileItem) || {}; const { thumbUrl, type } = (record as FileItem) || {};
...@@ -23,7 +23,7 @@ export function createTableColumns(): BasicColumn[] { ...@@ -23,7 +23,7 @@ export function createTableColumns(): BasicColumn[] {
}, },
{ {
dataIndex: 'name', dataIndex: 'name',
title: t('fileName'), title: t('component.upload.fileName'),
align: 'left', align: 'left',
customRender: ({ text, record }) => { customRender: ({ text, record }) => {
const { percent, status: uploadStatus } = (record as FileItem) || {}; const { percent, status: uploadStatus } = (record as FileItem) || {};
...@@ -47,7 +47,7 @@ export function createTableColumns(): BasicColumn[] { ...@@ -47,7 +47,7 @@ export function createTableColumns(): BasicColumn[] {
}, },
{ {
dataIndex: 'size', dataIndex: 'size',
title: t('fileSize'), title: t('component.upload.fileSize'),
width: 100, width: 100,
customRender: ({ text = 0 }) => { customRender: ({ text = 0 }) => {
return text && (text / 1024).toFixed(2) + 'KB'; return text && (text / 1024).toFixed(2) + 'KB';
...@@ -60,15 +60,15 @@ export function createTableColumns(): BasicColumn[] { ...@@ -60,15 +60,15 @@ export function createTableColumns(): BasicColumn[] {
// }, // },
{ {
dataIndex: 'status', dataIndex: 'status',
title: t('fileStatue'), title: t('component.upload.fileStatue'),
width: 100, width: 100,
customRender: ({ text }) => { customRender: ({ text }) => {
if (text === UploadResultStatus.SUCCESS) { if (text === UploadResultStatus.SUCCESS) {
return <Tag color="green">{() => t('uploadSuccess')}</Tag>; return <Tag color="green">{() => t('component.upload.uploadSuccess')}</Tag>;
} else if (text === UploadResultStatus.ERROR) { } else if (text === UploadResultStatus.ERROR) {
return <Tag color="red">{() => t('uploadError')}</Tag>; return <Tag color="red">{() => t('component.upload.uploadError')}</Tag>;
} else if (text === UploadResultStatus.UPLOADING) { } else if (text === UploadResultStatus.UPLOADING) {
return <Tag color="blue">{() => t('uploading')}</Tag>; return <Tag color="blue">{() => t('component.upload.uploading')}</Tag>;
} }
return text; return text;
...@@ -79,20 +79,20 @@ export function createTableColumns(): BasicColumn[] { ...@@ -79,20 +79,20 @@ export function createTableColumns(): BasicColumn[] {
export function createActionColumn(handleRemove: Function, handlePreview: Function): BasicColumn { export function createActionColumn(handleRemove: Function, handlePreview: Function): BasicColumn {
return { return {
width: 120, width: 120,
title: t('operating'), title: t('component.upload.operating'),
dataIndex: 'action', dataIndex: 'action',
fixed: false, fixed: false,
customRender: ({ record }) => { customRender: ({ record }) => {
const actions: ActionItem[] = [ const actions: ActionItem[] = [
{ {
label: t('del'), label: t('component.upload.del'),
color: 'error', color: 'error',
onClick: handleRemove.bind(null, record), onClick: handleRemove.bind(null, record),
}, },
]; ];
if (checkImgType(record)) { if (checkImgType(record)) {
actions.unshift({ actions.unshift({
label: t('preview'), label: t('component.upload.preview'),
onClick: handlePreview.bind(null, record), onClick: handlePreview.bind(null, record),
}); });
} }
...@@ -105,7 +105,7 @@ export function createPreviewColumns(): BasicColumn[] { ...@@ -105,7 +105,7 @@ export function createPreviewColumns(): BasicColumn[] {
return [ return [
{ {
dataIndex: 'url', dataIndex: 'url',
title: t('legend'), title: t('component.upload.legend'),
width: 100, width: 100,
customRender: ({ record }) => { customRender: ({ record }) => {
const { url, type } = (record as PreviewFileItem) || {}; const { url, type } = (record as PreviewFileItem) || {};
...@@ -116,7 +116,7 @@ export function createPreviewColumns(): BasicColumn[] { ...@@ -116,7 +116,7 @@ export function createPreviewColumns(): BasicColumn[] {
}, },
{ {
dataIndex: 'name', dataIndex: 'name',
title: t('fileName'), title: t('component.upload.fileName'),
align: 'left', align: 'left',
}, },
]; ];
...@@ -133,7 +133,7 @@ export function createPreviewActionColumn({ ...@@ -133,7 +133,7 @@ export function createPreviewActionColumn({
}): BasicColumn { }): BasicColumn {
return { return {
width: 160, width: 160,
title: t('operating'), title: t('component.upload.operating'),
dataIndex: 'action', dataIndex: 'action',
fixed: false, fixed: false,
customRender: ({ record }) => { customRender: ({ record }) => {
...@@ -141,18 +141,18 @@ export function createPreviewActionColumn({ ...@@ -141,18 +141,18 @@ export function createPreviewActionColumn({
const actions: ActionItem[] = [ const actions: ActionItem[] = [
{ {
label: t('del'), label: t('component.upload.del'),
color: 'error', color: 'error',
onClick: handleRemove.bind(null, record), onClick: handleRemove.bind(null, record),
}, },
{ {
label: t('download'), label: t('component.upload.download'),
onClick: handleDownload.bind(null, record), onClick: handleDownload.bind(null, record),
}, },
]; ];
if (isImgTypeByName(url)) { if (isImgTypeByName(url)) {
actions.unshift({ actions.unshift({
label: t('preview'), label: t('component.upload.preview'),
onClick: handlePreview.bind(null, record), onClick: handlePreview.bind(null, record),
}); });
} }
......
import { Ref, unref, computed } from 'vue'; import { Ref, unref, computed } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.upload'); const { t } = useI18n();
export function useUploadType({ export function useUploadType({
acceptRef, acceptRef,
// uploadTypeRef, // uploadTypeRef,
...@@ -38,17 +38,17 @@ export function useUploadType({ ...@@ -38,17 +38,17 @@ export function useUploadType({
const accept = unref(acceptRef); const accept = unref(acceptRef);
if (accept.length > 0) { if (accept.length > 0) {
helpTexts.push(t('accept', [accept.join(',')])); helpTexts.push(t('component.upload.accept', [accept.join(',')]));
} }
const maxSize = unref(maxSizeRef); const maxSize = unref(maxSizeRef);
if (maxSize) { if (maxSize) {
helpTexts.push(t('maxSize', [maxSize])); helpTexts.push(t('component.upload.maxSize', [maxSize]));
} }
const maxNumber = unref(maxNumberRef); const maxNumber = unref(maxNumberRef);
if (maxNumber && maxNumber !== Infinity) { if (maxNumber && maxNumber !== Infinity) {
helpTexts.push(t('maxNumber', [maxNumber])); helpTexts.push(t('component.upload.maxNumber', [maxNumber]));
} }
return helpTexts.join(','); return helpTexts.join(',');
}); });
......
...@@ -30,7 +30,7 @@ export default defineComponent({ ...@@ -30,7 +30,7 @@ export default defineComponent({
endTime: 0, endTime: 0,
draged: false, draged: false,
}); });
const { t } = useI18n('component.verify'); const { t } = useI18n();
watch( watch(
() => state.isPassing, () => state.isPassing,
...@@ -146,7 +146,9 @@ export default defineComponent({ ...@@ -146,7 +146,9 @@ export default defineComponent({
/> />
{state.showTip && ( {state.showTip && (
<span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}> <span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}>
{state.isPassing ? t('time', { time: time.toFixed(1) }) : t('error')} {state.isPassing
? t('component.verify.time', { time: time.toFixed(1) })
: t('component.verify.error')}
</span> </span>
)} )}
{!state.showTip && !state.draged && ( {!state.showTip && !state.draged && (
......
import type { PropType } from 'vue'; import type { PropType } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('component.verify'); const { t } = useI18n();
export const basicProps = { export const basicProps = {
value: { value: {
type: Boolean as PropType<boolean>, type: Boolean as PropType<boolean>,
...@@ -15,11 +15,11 @@ export const basicProps = { ...@@ -15,11 +15,11 @@ export const basicProps = {
text: { text: {
type: [String] as PropType<string>, type: [String] as PropType<string>,
default: t('dragText'), default: t('component.verify.dragText'),
}, },
successText: { successText: {
type: [String] as PropType<string>, type: [String] as PropType<string>,
default: t('successText'), default: t('component.verify.successText'),
}, },
height: { height: {
type: [Number, String] as PropType<number | string>, type: [Number, String] as PropType<number | string>,
......
...@@ -13,16 +13,16 @@ import { useI18n } from '/@/hooks/web/useI18n'; ...@@ -13,16 +13,16 @@ import { useI18n } from '/@/hooks/web/useI18n';
export default defineComponent({ export default defineComponent({
name: 'LayoutContent', name: 'LayoutContent',
setup() { setup() {
const { t } = useI18n('layout.footer'); const { t } = useI18n();
return () => { return () => {
return ( return (
<Layout.Footer class="layout-footer"> <Layout.Footer class="layout-footer">
{() => ( {() => (
<> <>
<div class="layout-footer__links"> <div class="layout-footer__links">
<a onClick={() => openWindow(SITE_URL)}>{t('onlinePreview')}</a> <a onClick={() => openWindow(SITE_URL)}>{t('layout.footer.onlinePreview')}</a>
<GithubFilled onClick={() => openWindow(GITHUB_URL)} class="github" /> <GithubFilled onClick={() => openWindow(GITHUB_URL)} class="github" />
<a onClick={() => openWindow(DOC_URL)}>{t('onlineDocument')}</a> <a onClick={() => openWindow(DOC_URL)}>{t('layout.footer.onlineDocument')}</a>
</div> </div>
<div>Copyright &copy;2020 Vben Admin</div> <div>Copyright &copy;2020 Vben Admin</div>
</> </>
......
...@@ -66,7 +66,7 @@ export default defineComponent({ ...@@ -66,7 +66,7 @@ export default defineComponent({
const logoWidthRef = ref(200); const logoWidthRef = ref(200);
const logoRef = ref<ComponentRef>(null); const logoRef = ref<ComponentRef>(null);
const { refreshPage } = useTabs(); const { refreshPage } = useTabs();
const { t } = useI18n('layout.header'); const { t } = useI18n();
const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting(); const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting();
......
...@@ -44,7 +44,7 @@ const MenuItem: FunctionalComponent<MenuItemProps> = (props) => { ...@@ -44,7 +44,7 @@ const MenuItem: FunctionalComponent<MenuItemProps> = (props) => {
export default defineComponent({ export default defineComponent({
name: 'UserDropdown', name: 'UserDropdown',
setup() { setup() {
const { t } = useI18n('layout.header'); const { t } = useI18n();
const { getShowDoc } = useHeaderSetting(); const { getShowDoc } = useHeaderSetting();
const getUserInfo = computed(() => { const getUserInfo = computed(() => {
...@@ -91,12 +91,18 @@ export default defineComponent({ ...@@ -91,12 +91,18 @@ export default defineComponent({
<Menu onClick={handleMenuClick}> <Menu onClick={handleMenuClick}>
{() => ( {() => (
<> <>
{showDoc && <MenuItem key="doc" text={t('dropdownItemDoc')} icon="gg:loadbar-doc" />} {showDoc && (
<MenuItem
key="doc"
text={t('layout.header.dropdownItemDoc')}
icon="gg:loadbar-doc"
/>
)}
{/* @ts-ignore */} {/* @ts-ignore */}
{showDoc && <Menu.Divider />} {showDoc && <Menu.Divider />}
<MenuItem <MenuItem
key="loginOut" key="loginOut"
text={t('dropdownItemLoginOut')} text={t('layout.header.dropdownItemLoginOut')}
icon="ant-design:poweroff-outlined" icon="ant-design:poweroff-outlined"
/> />
</> </>
......
...@@ -15,7 +15,7 @@ const prefixCls = 'lock-modal'; ...@@ -15,7 +15,7 @@ const prefixCls = 'lock-modal';
export default defineComponent({ export default defineComponent({
name: 'LockModal', name: 'LockModal',
setup(_, { attrs }) { setup(_, { attrs }) {
const { t } = useI18n('layout.header'); const { t } = useI18n();
const [register, { closeModal }] = useModalInner(); const [register, { closeModal }] = useModalInner();
const [registerForm, { validateFields, resetFields }] = useForm({ const [registerForm, { validateFields, resetFields }] = useForm({
...@@ -23,7 +23,7 @@ export default defineComponent({ ...@@ -23,7 +23,7 @@ export default defineComponent({
schemas: [ schemas: [
{ {
field: 'password', field: 'password',
label: t('lockScreenPassword'), label: t('layout.header.lockScreenPassword'),
component: 'InputPassword', component: 'InputPassword',
required: true, required: true,
}, },
...@@ -53,7 +53,7 @@ export default defineComponent({ ...@@ -53,7 +53,7 @@ export default defineComponent({
return () => ( return () => (
<BasicModal <BasicModal
footer={null} footer={null}
title={t('lockScreen')} title={t('layout.header.lockScreen')}
{...attrs} {...attrs}
class={prefixCls} class={prefixCls}
onRegister={register} onRegister={register}
...@@ -69,10 +69,10 @@ export default defineComponent({ ...@@ -69,10 +69,10 @@ export default defineComponent({
<div class={`${prefixCls}__footer`}> <div class={`${prefixCls}__footer`}>
<Button type="primary" block class="mt-2" onClick={lock}> <Button type="primary" block class="mt-2" onClick={lock}>
{() => t('lockScreenBtn')} {() => t('layout.header.lockScreenBtn')}
</Button> </Button>
<Button block class="mt-2" onClick={lock.bind(null, false)}> <Button block class="mt-2" onClick={lock.bind(null, false)}>
{() => t('notLockScreenPassword')} {() => t('layout.header.notLockScreenPassword')}
</Button> </Button>
</div> </div>
</div> </div>
......
...@@ -59,7 +59,7 @@ export default defineComponent({ ...@@ -59,7 +59,7 @@ export default defineComponent({
}, },
}, },
setup(props) { setup(props) {
const { t } = useI18n('layout.multipleTab'); const { t } = useI18n();
const { getShowMenu } = useMenuSetting(); const { getShowMenu } = useMenuSetting();
const { getShowHeader } = useHeaderSetting(); const { getShowHeader } = useHeaderSetting();
const { getShowQuick } = useMultipleTabSetting(); const { getShowQuick } = useMultipleTabSetting();
...@@ -76,7 +76,7 @@ export default defineComponent({ ...@@ -76,7 +76,7 @@ export default defineComponent({
return () => { return () => {
const scaleAction = getScaleAction( const scaleAction = getScaleAction(
unref(getIsScale) ? t('putAway') : t('unfold'), unref(getIsScale) ? t('layout.multipleTab.putAway') : t('layout.multipleTab.unfold'),
unref(getIsScale) unref(getIsScale)
); );
const dropMenuList = unref(getDropMenuList) || []; const dropMenuList = unref(getDropMenuList) || [];
......
...@@ -4,7 +4,7 @@ import type { TabItem } from '/@/store/modules/tab'; ...@@ -4,7 +4,7 @@ import type { TabItem } from '/@/store/modules/tab';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('layout.multipleTab'); const { t } = useI18n();
export enum TabContentEnum { export enum TabContentEnum {
TAB_TYPE, TAB_TYPE,
...@@ -41,40 +41,40 @@ export function getActions() { ...@@ -41,40 +41,40 @@ export function getActions() {
const REFRESH_PAGE: DropMenu = { const REFRESH_PAGE: DropMenu = {
icon: 'ant-design:reload-outlined', icon: 'ant-design:reload-outlined',
event: MenuEventEnum.REFRESH_PAGE, event: MenuEventEnum.REFRESH_PAGE,
text: t('redo'), text: t('layout.multipleTab.redo'),
disabled: false, disabled: false,
}; };
const CLOSE_CURRENT: DropMenu = { const CLOSE_CURRENT: DropMenu = {
icon: 'ant-design:close-outlined', icon: 'ant-design:close-outlined',
event: MenuEventEnum.CLOSE_CURRENT, event: MenuEventEnum.CLOSE_CURRENT,
text: t('close'), text: t('layout.multipleTab.close'),
disabled: false, disabled: false,
divider: true, divider: true,
}; };
const CLOSE_LEFT: DropMenu = { const CLOSE_LEFT: DropMenu = {
icon: 'ant-design:pic-left-outlined', icon: 'ant-design:pic-left-outlined',
event: MenuEventEnum.CLOSE_LEFT, event: MenuEventEnum.CLOSE_LEFT,
text: t('closeLeft'), text: t('layout.multipleTab.closeLeft'),
disabled: false, disabled: false,
divider: false, divider: false,
}; };
const CLOSE_RIGHT: DropMenu = { const CLOSE_RIGHT: DropMenu = {
icon: 'ant-design:pic-right-outlined', icon: 'ant-design:pic-right-outlined',
event: MenuEventEnum.CLOSE_RIGHT, event: MenuEventEnum.CLOSE_RIGHT,
text: t('closeRight'), text: t('layout.multipleTab.closeRight'),
disabled: false, disabled: false,
divider: true, divider: true,
}; };
const CLOSE_OTHER: DropMenu = { const CLOSE_OTHER: DropMenu = {
icon: 'ant-design:pic-center-outlined', icon: 'ant-design:pic-center-outlined',
event: MenuEventEnum.CLOSE_OTHER, event: MenuEventEnum.CLOSE_OTHER,
text: t('closeOther'), text: t('layout.multipleTab.closeOther'),
disabled: false, disabled: false,
}; };
const CLOSE_ALL: DropMenu = { const CLOSE_ALL: DropMenu = {
icon: 'ant-design:line-outlined', icon: 'ant-design:line-outlined',
event: MenuEventEnum.CLOSE_ALL, event: MenuEventEnum.CLOSE_ALL,
text: t('closeAll'), text: t('layout.multipleTab.closeAll'),
disabled: false, disabled: false,
}; };
return [REFRESH_PAGE, CLOSE_CURRENT, CLOSE_LEFT, CLOSE_RIGHT, CLOSE_OTHER, CLOSE_ALL]; return [REFRESH_PAGE, CLOSE_CURRENT, CLOSE_LEFT, CLOSE_RIGHT, CLOSE_OTHER, CLOSE_ALL];
......
...@@ -56,7 +56,7 @@ interface ThemePickerProps { ...@@ -56,7 +56,7 @@ interface ThemePickerProps {
} }
const { createSuccessModal, createMessage } = useMessage(); const { createSuccessModal, createMessage } = useMessage();
const { t } = useI18n('layout.setting'); const { t } = useI18n();
/** /**
* Menu type Picker comp * Menu type Picker comp
...@@ -122,8 +122,8 @@ const FooterButton: FunctionalComponent = () => { ...@@ -122,8 +122,8 @@ const FooterButton: FunctionalComponent = () => {
const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2)); const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2));
unref(isSuccessRef) && unref(isSuccessRef) &&
createSuccessModal({ createSuccessModal({
title: t('operatingTitle'), title: t('layout.setting.operatingTitle'),
content: t('operatingContent'), content: t('layout.setting.operatingContent'),
}); });
} }
function handleResetSetting() { function handleResetSetting() {
...@@ -133,7 +133,7 @@ const FooterButton: FunctionalComponent = () => { ...@@ -133,7 +133,7 @@ const FooterButton: FunctionalComponent = () => {
// updateTheme(themeColor); // updateTheme(themeColor);
updateColorWeak(colorWeak); updateColorWeak(colorWeak);
updateGrayMode(grayMode); updateGrayMode(grayMode);
createMessage.success(t('resetSuccess')); createMessage.success(t('layout.setting.resetSuccess'));
} catch (error) { } catch (error) {
createMessage.error(error); createMessage.error(error);
} }
...@@ -151,7 +151,7 @@ const FooterButton: FunctionalComponent = () => { ...@@ -151,7 +151,7 @@ const FooterButton: FunctionalComponent = () => {
{() => ( {() => (
<> <>
<CopyOutlined class="mr-2" /> <CopyOutlined class="mr-2" />
{t('copyBtn')} {t('layout.setting.copyBtn')}
</> </>
)} )}
</Button> </Button>
...@@ -159,7 +159,7 @@ const FooterButton: FunctionalComponent = () => { ...@@ -159,7 +159,7 @@ const FooterButton: FunctionalComponent = () => {
{() => ( {() => (
<> <>
<RedoOutlined class="mr-2" /> <RedoOutlined class="mr-2" />
{t('resetBtn')} {t('layout.setting.resetBtn')}
</> </>
)} )}
</Button> </Button>
...@@ -167,7 +167,7 @@ const FooterButton: FunctionalComponent = () => { ...@@ -167,7 +167,7 @@ const FooterButton: FunctionalComponent = () => {
{() => ( {() => (
<> <>
<RedoOutlined class="mr-2" /> <RedoOutlined class="mr-2" />
{t('clearBtn')} {t('layout.setting.clearBtn')}
</> </>
)} )}
</Button> </Button>
...@@ -226,7 +226,7 @@ export default defineComponent({ ...@@ -226,7 +226,7 @@ export default defineComponent({
return ( return (
<> <>
<MenuTypePicker /> <MenuTypePicker />
{renderSwitchItem(t('splitMenu'), { {renderSwitchItem(t('layout.setting.splitMenu'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_SPLIT, e); baseHandler(HandlerEnum.MENU_SPLIT, e);
}, },
...@@ -240,7 +240,7 @@ export default defineComponent({ ...@@ -240,7 +240,7 @@ export default defineComponent({
function renderTheme() { function renderTheme() {
return ( return (
<> <>
<Divider>{() => t('headerTheme')}</Divider> <Divider>{() => t('layout.setting.headerTheme')}</Divider>
<ThemePicker <ThemePicker
colorList={HEADER_PRESET_BG_COLOR_LIST} colorList={HEADER_PRESET_BG_COLOR_LIST}
def={unref(getHeaderBgColor)} def={unref(getHeaderBgColor)}
...@@ -248,7 +248,7 @@ export default defineComponent({ ...@@ -248,7 +248,7 @@ export default defineComponent({
baseHandler(HandlerEnum.HEADER_THEME, e); baseHandler(HandlerEnum.HEADER_THEME, e);
}} }}
/> />
<Divider>{() => t('sidebarTheme')}</Divider> <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
<ThemePicker <ThemePicker
colorList={SIDE_BAR_BG_COLOR_LIST} colorList={SIDE_BAR_BG_COLOR_LIST}
def={unref(getMenuBgColor)} def={unref(getMenuBgColor)}
...@@ -265,56 +265,56 @@ export default defineComponent({ ...@@ -265,56 +265,56 @@ export default defineComponent({
*/ */
function renderFeatures() { function renderFeatures() {
return [ return [
renderSwitchItem(t('menuDrag'), { renderSwitchItem(t('layout.setting.menuDrag'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_HAS_DRAG, e); baseHandler(HandlerEnum.MENU_HAS_DRAG, e);
}, },
def: unref(getCanDrag), def: unref(getCanDrag),
disabled: !unref(getShowMenuRef), disabled: !unref(getShowMenuRef),
}), }),
renderSwitchItem(t('menuSearch'), { renderSwitchItem(t('layout.setting.menuSearch'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e); baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e);
}, },
def: unref(getShowSearch), def: unref(getShowSearch),
disabled: !unref(getShowMenuRef), disabled: !unref(getShowMenuRef),
}), }),
renderSwitchItem(t('menuAccordion'), { renderSwitchItem(t('layout.setting.menuAccordion'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_ACCORDION, e); baseHandler(HandlerEnum.MENU_ACCORDION, e);
}, },
def: unref(getAccordion), def: unref(getAccordion),
disabled: !unref(getShowMenuRef), disabled: !unref(getShowMenuRef),
}), }),
renderSwitchItem(t('menuCollapse'), { renderSwitchItem(t('layout.setting.menuCollapse'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_COLLAPSED, e); baseHandler(HandlerEnum.MENU_COLLAPSED, e);
}, },
def: unref(getCollapsed), def: unref(getCollapsed),
disabled: !unref(getShowMenuRef), disabled: !unref(getShowMenuRef),
}), }),
renderSwitchItem(t('collapseMenuDisplayName'), { renderSwitchItem(t('layout.setting.collapseMenuDisplayName'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e); baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e);
}, },
def: unref(getCollapsedShowTitle), def: unref(getCollapsedShowTitle),
disabled: !unref(getShowMenuRef) || !unref(getCollapsed), disabled: !unref(getShowMenuRef) || !unref(getCollapsed),
}), }),
renderSwitchItem(t('fixedHeader'), { renderSwitchItem(t('layout.setting.fixedHeader'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.HEADER_FIXED, e); baseHandler(HandlerEnum.HEADER_FIXED, e);
}, },
def: unref(getHeaderFixed), def: unref(getHeaderFixed),
disabled: !unref(getShowHeader), disabled: !unref(getShowHeader),
}), }),
renderSwitchItem(t('fixedSideBar'), { renderSwitchItem(t('layout.setting.fixedSideBar'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_FIXED, e); baseHandler(HandlerEnum.MENU_FIXED, e);
}, },
def: unref(getMenuFixed), def: unref(getMenuFixed),
disabled: !unref(getShowMenuRef), disabled: !unref(getShowMenuRef),
}), }),
renderSelectItem(t('topMenuLayout'), { renderSelectItem(t('layout.setting.topMenuLayout'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e); baseHandler(HandlerEnum.MENU_TOP_ALIGN, e);
}, },
...@@ -322,7 +322,7 @@ export default defineComponent({ ...@@ -322,7 +322,7 @@ export default defineComponent({
options: topMenuAlignOptions, options: topMenuAlignOptions,
disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)), disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)),
}), }),
renderSelectItem(t('menuCollapseButton'), { renderSelectItem(t('layout.setting.menuCollapseButton'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_TRIGGER, e); baseHandler(HandlerEnum.MENU_TRIGGER, e);
}, },
...@@ -331,7 +331,7 @@ export default defineComponent({ ...@@ -331,7 +331,7 @@ export default defineComponent({
options: menuTriggerOptions, options: menuTriggerOptions,
}), }),
renderSelectItem(t('contentMode'), { renderSelectItem(t('layout.setting.contentMode'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.CONTENT_MODE, e); baseHandler(HandlerEnum.CONTENT_MODE, e);
}, },
...@@ -339,7 +339,7 @@ export default defineComponent({ ...@@ -339,7 +339,7 @@ export default defineComponent({
options: contentModeOptions, options: contentModeOptions,
}), }),
<div class={`setting-drawer__cell-item`}> <div class={`setting-drawer__cell-item`}>
<span>{t('autoScreenLock')}</span> <span>{t('layout.setting.autoScreenLock')}</span>
<InputNumber <InputNumber
style="width:126px" style="width:126px"
size="small" size="small"
...@@ -350,14 +350,14 @@ export default defineComponent({ ...@@ -350,14 +350,14 @@ export default defineComponent({
defaultValue={appStore.getProjectConfig.lockTime} defaultValue={appStore.getProjectConfig.lockTime}
formatter={(value: string) => { formatter={(value: string) => {
if (parseInt(value) === 0) { if (parseInt(value) === 0) {
return `0(${t('notAutoScreenLock')})`; return `0(${t('layout.setting.notAutoScreenLock')})`;
} }
return `${value}${t('minute')}`; return `${value}${t('layout.setting.minute')}`;
}} }}
/> />
</div>, </div>,
<div class={`setting-drawer__cell-item`}> <div class={`setting-drawer__cell-item`}>
<span>{t('expandedMenuWidth')}</span> <span>{t('layout.setting.expandedMenuWidth')}</span>
<InputNumber <InputNumber
style="width:126px" style="width:126px"
size="small" size="small"
...@@ -377,27 +377,27 @@ export default defineComponent({ ...@@ -377,27 +377,27 @@ export default defineComponent({
function renderContent() { function renderContent() {
return [ return [
renderSwitchItem(t('breadcrumb'), { renderSwitchItem(t('layout.setting.breadcrumb'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e); baseHandler(HandlerEnum.SHOW_BREADCRUMB, e);
}, },
def: unref(getShowBreadCrumb), def: unref(getShowBreadCrumb),
disabled: !unref(getShowHeader), disabled: !unref(getShowHeader),
}), }),
renderSwitchItem(t('breadcrumbIcon'), { renderSwitchItem(t('layout.setting.breadcrumbIcon'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e); baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e);
}, },
def: unref(getShowBreadCrumbIcon), def: unref(getShowBreadCrumbIcon),
disabled: !unref(getShowHeader), disabled: !unref(getShowHeader),
}), }),
renderSwitchItem(t('tabs'), { renderSwitchItem(t('layout.setting.tabs'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.TABS_SHOW, e); baseHandler(HandlerEnum.TABS_SHOW, e);
}, },
def: unref(getShowMultipleTab), def: unref(getShowMultipleTab),
}), }),
renderSwitchItem(t('tabsQuickBtn'), { renderSwitchItem(t('layout.setting.tabsQuickBtn'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e); baseHandler(HandlerEnum.TABS_SHOW_QUICK, e);
}, },
...@@ -405,14 +405,14 @@ export default defineComponent({ ...@@ -405,14 +405,14 @@ export default defineComponent({
disabled: !unref(getShowMultipleTab), disabled: !unref(getShowMultipleTab),
}), }),
renderSwitchItem(t('sidebar'), { renderSwitchItem(t('layout.setting.sidebar'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e); baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e);
}, },
def: unref(getShowMenu), def: unref(getShowMenu),
disabled: unref(getIsHorizontal), disabled: unref(getIsHorizontal),
}), }),
renderSwitchItem(t('header'), { renderSwitchItem(t('layout.setting.header'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.HEADER_SHOW, e); baseHandler(HandlerEnum.HEADER_SHOW, e);
}, },
...@@ -424,25 +424,25 @@ export default defineComponent({ ...@@ -424,25 +424,25 @@ export default defineComponent({
}, },
def: unref(getShowLogo), def: unref(getShowLogo),
}), }),
renderSwitchItem(t('footer'), { renderSwitchItem(t('layout.setting.footer'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.SHOW_FOOTER, e); baseHandler(HandlerEnum.SHOW_FOOTER, e);
}, },
def: unref(getShowFooter), def: unref(getShowFooter),
}), }),
renderSwitchItem(t('fullContent'), { renderSwitchItem(t('layout.setting.fullContent'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.FULL_CONTENT, e); baseHandler(HandlerEnum.FULL_CONTENT, e);
}, },
def: unref(getFullContent), def: unref(getFullContent),
}), }),
renderSwitchItem(t('grayMode'), { renderSwitchItem(t('layout.setting.grayMode'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.GRAY_MODE, e); baseHandler(HandlerEnum.GRAY_MODE, e);
}, },
def: unref(getGrayMode), def: unref(getGrayMode),
}), }),
renderSwitchItem(t('colorWeak'), { renderSwitchItem(t('layout.setting.colorWeak'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.COLOR_WEAK, e); baseHandler(HandlerEnum.COLOR_WEAK, e);
}, },
...@@ -454,13 +454,13 @@ export default defineComponent({ ...@@ -454,13 +454,13 @@ export default defineComponent({
function renderTransition() { function renderTransition() {
return ( return (
<> <>
{renderSwitchItem(t('progress'), { {renderSwitchItem(t('layout.setting.progress'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.OPEN_PROGRESS, e); baseHandler(HandlerEnum.OPEN_PROGRESS, e);
}, },
def: unref(getOpenNProgress), def: unref(getOpenNProgress),
})} })}
{renderSwitchItem(t('switchLoading'), { {renderSwitchItem(t('layout.setting.switchLoading'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
}, },
...@@ -468,14 +468,14 @@ export default defineComponent({ ...@@ -468,14 +468,14 @@ export default defineComponent({
disabled: !unref(getEnableTransition), disabled: !unref(getEnableTransition),
})} })}
{renderSwitchItem(t('switchAnimation'), { {renderSwitchItem(t('layout.setting.switchAnimation'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e); baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
}, },
def: unref(getEnableTransition), def: unref(getEnableTransition),
})} })}
{renderSelectItem(t('animationType'), { {renderSelectItem(t('layout.setting.animationType'), {
handler: (e) => { handler: (e) => {
baseHandler(HandlerEnum.ROUTER_TRANSITION, e); baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
}, },
...@@ -519,26 +519,31 @@ export default defineComponent({ ...@@ -519,26 +519,31 @@ export default defineComponent({
onChange={(e: any) => { onChange={(e: any) => {
handler && handler(e); handler && handler(e);
}} }}
checkedChildren={t('on')} checkedChildren={t('layout.setting.on')}
unCheckedChildren={t('off')} unCheckedChildren={t('layout.setting.off')}
/> />
</div> </div>
); );
} }
return () => ( return () => (
<BasicDrawer {...attrs} title={t('drawerTitle')} width={330} wrapClassName="setting-drawer"> <BasicDrawer
{...attrs}
title={t('layout.setting.drawerTitle')}
width={330}
wrapClassName="setting-drawer"
>
{{ {{
default: () => ( default: () => (
<> <>
<Divider>{() => t('navMode')}</Divider> <Divider>{() => t('layout.setting.navMode')}</Divider>
{renderSidebar()} {renderSidebar()}
{renderTheme()} {renderTheme()}
<Divider>{() => t('interfaceFunction')}</Divider> <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
{renderFeatures()} {renderFeatures()}
<Divider>{() => t('interfaceDisplay')}</Divider> <Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
{renderContent()} {renderContent()}
<Divider>{() => t('animation')}</Divider> <Divider>{() => t('layout.setting.animation')}</Divider>
{renderTransition()} {renderTransition()}
<Divider /> <Divider />
<FooterButton /> <FooterButton />
......
...@@ -6,7 +6,7 @@ import sidebarImg from '/@/assets/images/layout/menu-sidebar.svg'; ...@@ -6,7 +6,7 @@ import sidebarImg from '/@/assets/images/layout/menu-sidebar.svg';
import menuTopImg from '/@/assets/images/layout/menu-top.svg'; import menuTopImg from '/@/assets/images/layout/menu-top.svg';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('layout.setting'); const { t } = useI18n();
export enum HandlerEnum { export enum HandlerEnum {
CHANGE_LAYOUT, CHANGE_LAYOUT,
...@@ -51,41 +51,41 @@ export enum HandlerEnum { ...@@ -51,41 +51,41 @@ export enum HandlerEnum {
export const contentModeOptions = [ export const contentModeOptions = [
{ {
value: ContentEnum.FULL, value: ContentEnum.FULL,
label: t('contentModeFull'), label: t('layout.setting.contentModeFull'),
}, },
{ {
value: ContentEnum.FIXED, value: ContentEnum.FIXED,
label: t('contentModeFixed'), label: t('layout.setting.contentModeFixed'),
}, },
]; ];
export const topMenuAlignOptions = [ export const topMenuAlignOptions = [
{ {
value: TopMenuAlignEnum.CENTER, value: TopMenuAlignEnum.CENTER,
label: t('topMenuAlignRight'), label: t('layout.setting.topMenuAlignRight'),
}, },
{ {
value: TopMenuAlignEnum.START, value: TopMenuAlignEnum.START,
label: t('topMenuAlignLeft'), label: t('layout.setting.topMenuAlignLeft'),
}, },
{ {
value: TopMenuAlignEnum.END, value: TopMenuAlignEnum.END,
label: t('topMenuAlignCenter'), label: t('layout.setting.topMenuAlignCenter'),
}, },
]; ];
export const menuTriggerOptions = [ export const menuTriggerOptions = [
{ {
value: TriggerEnum.NONE, value: TriggerEnum.NONE,
label: t('menuTriggerNone'), label: t('layout.setting.menuTriggerNone'),
}, },
{ {
value: TriggerEnum.FOOTER, value: TriggerEnum.FOOTER,
label: t('menuTriggerBottom'), label: t('layout.setting.menuTriggerBottom'),
}, },
{ {
value: TriggerEnum.HEADER, value: TriggerEnum.HEADER,
label: t('menuTriggerTop'), label: t('layout.setting.menuTriggerTop'),
}, },
]; ];
...@@ -104,20 +104,20 @@ export const routerTransitionOptions = [ ...@@ -104,20 +104,20 @@ export const routerTransitionOptions = [
export const menuTypeList = [ export const menuTypeList = [
{ {
title: t('menuTypeSidebar'), title: t('layout.setting.menuTypeSidebar'),
mode: MenuModeEnum.INLINE, mode: MenuModeEnum.INLINE,
type: MenuTypeEnum.SIDEBAR, type: MenuTypeEnum.SIDEBAR,
src: sidebarImg, src: sidebarImg,
}, },
{ {
title: t('menuTypeMix'), title: t('layout.setting.menuTypeMix'),
mode: MenuModeEnum.INLINE, mode: MenuModeEnum.INLINE,
type: MenuTypeEnum.MIX, type: MenuTypeEnum.MIX,
src: mixImg, src: mixImg,
}, },
{ {
title: t('menuTypeTopMenu'), title: t('layout.setting.menuTypeTopMenu'),
mode: MenuModeEnum.HORIZONTAL, mode: MenuModeEnum.HORIZONTAL,
type: MenuTypeEnum.TOP_MENU, type: MenuTypeEnum.TOP_MENU,
src: menuTopImg, src: menuTopImg,
......
...@@ -22,7 +22,7 @@ import { useMessage } from '/@/hooks/web/useMessage'; ...@@ -22,7 +22,7 @@ import { useMessage } from '/@/hooks/web/useMessage';
// import { warn } from '/@/utils/log'; // import { warn } from '/@/utils/log';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('sys.app'); const { t } = useI18n();
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const NAME = 'permission'; const NAME = 'permission';
...@@ -104,7 +104,7 @@ class Permission extends VuexModule { ...@@ -104,7 +104,7 @@ class Permission extends VuexModule {
} else if (permissionMode === PermissionModeEnum.BACK) { } else if (permissionMode === PermissionModeEnum.BACK) {
const messageKey = 'loadMenu'; const messageKey = 'loadMenu';
createMessage.loading({ createMessage.loading({
content: t('menuLoading'), content: t('sys.app.menuLoading'),
key: messageKey, key: messageKey,
duration: 1, duration: 1,
}); });
......
...@@ -143,11 +143,11 @@ class User extends VuexModule { ...@@ -143,11 +143,11 @@ class User extends VuexModule {
@Action @Action
async confirmLoginOut() { async confirmLoginOut() {
const { createConfirm } = useMessage(); const { createConfirm } = useMessage();
const { t } = useI18n('sys.app'); const { t } = useI18n();
createConfirm({ createConfirm({
iconType: 'warning', iconType: 'warning',
title: t('loginOutTip'), title: t('sys.app.loginOutTip'),
content: t('loginOutMessage'), content: t('sys.app.loginOutMessage'),
onOk: async () => { onOk: async () => {
await this.loginOut(true); await this.loginOut(true);
}, },
......
...@@ -5,7 +5,7 @@ const { createMessage } = useMessage(); ...@@ -5,7 +5,7 @@ const { createMessage } = useMessage();
const error = createMessage.error!; const error = createMessage.error!;
export function checkStatus(status: number, msg: string): void { export function checkStatus(status: number, msg: string): void {
const { t } = useI18n('sys.api'); const { t } = useI18n();
switch (status) { switch (status) {
case 400: case 400:
error(`${msg}`); error(`${msg}`);
...@@ -14,39 +14,39 @@ export function checkStatus(status: number, msg: string): void { ...@@ -14,39 +14,39 @@ export function checkStatus(status: number, msg: string): void {
// 未登录则跳转登录页面,并携带当前页面的路径 // 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。 // 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401: case 401:
error(t('errMsg401')); error(t('sys.api.errMsg401'));
userStore.loginOut(true); userStore.loginOut(true);
break; break;
case 403: case 403:
error(t('errMsg403')); error(t('sys.api.errMsg403'));
break; break;
// 404请求不存在 // 404请求不存在
case 404: case 404:
error(t('errMsg404')); error(t('sys.api.errMsg404'));
break; break;
case 405: case 405:
error(t('errMsg405')); error(t('sys.api.errMsg405'));
break; break;
case 408: case 408:
error(t('errMsg408')); error(t('sys.api.errMsg408'));
break; break;
case 500: case 500:
error(t('errMsg500')); error(t('sys.api.errMsg500'));
break; break;
case 501: case 501:
error(t('errMsg501')); error(t('sys.api.errMsg501'));
break; break;
case 502: case 502:
error(t('errMsg502')); error(t('sys.api.errMsg502'));
break; break;
case 503: case 503:
error(t('errMsg503')); error(t('sys.api.errMsg503'));
break; break;
case 504: case 504:
error(t('errMsg504')); error(t('sys.api.errMsg504'));
break; break;
case 505: case 505:
error(t('errMsg505')); error(t('sys.api.errMsg505'));
break; break;
default: default:
} }
......
...@@ -34,7 +34,7 @@ const transform: AxiosTransform = { ...@@ -34,7 +34,7 @@ const transform: AxiosTransform = {
* @description: 处理请求数据 * @description: 处理请求数据
*/ */
transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => { transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => {
const { t } = useI18n('sys.api'); const { t } = useI18n();
const { isTransformRequestResult } = options; const { isTransformRequestResult } = options;
// 不进行任何处理,直接返回 // 不进行任何处理,直接返回
// 用于页面代码可能需要直接获取code,data,message这些信息时开启 // 用于页面代码可能需要直接获取code,data,message这些信息时开启
...@@ -57,7 +57,7 @@ const transform: AxiosTransform = { ...@@ -57,7 +57,7 @@ const transform: AxiosTransform = {
if (message) { if (message) {
// errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误 // errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
if (options.errorMessageMode === 'modal') { if (options.errorMessageMode === 'modal') {
createErrorModal({ title: t('errorTip'), content: message }); createErrorModal({ title: t('sys.api.errorTip'), content: message });
} else { } else {
createMessage.error(message); createMessage.error(message);
} }
...@@ -76,7 +76,7 @@ const transform: AxiosTransform = { ...@@ -76,7 +76,7 @@ const transform: AxiosTransform = {
createMessage.error(data.message); createMessage.error(data.message);
Promise.reject(new Error(message)); Promise.reject(new Error(message));
} else { } else {
const msg = t('errorMessage'); const msg = t('sys.api.errorMessage');
createMessage.error(msg); createMessage.error(msg);
Promise.reject(new Error(msg)); Promise.reject(new Error(msg));
} }
...@@ -84,9 +84,9 @@ const transform: AxiosTransform = { ...@@ -84,9 +84,9 @@ const transform: AxiosTransform = {
} }
// 登录超时 // 登录超时
if (code === ResultEnum.TIMEOUT) { if (code === ResultEnum.TIMEOUT) {
const timeoutMsg = t('timeoutMessage'); const timeoutMsg = t('sys.api.timeoutMessage');
createErrorModal({ createErrorModal({
title: t('operationFailed'), title: t('sys.api.operationFailed'),
content: timeoutMsg, content: timeoutMsg,
}); });
Promise.reject(new Error(timeoutMsg)); Promise.reject(new Error(timeoutMsg));
...@@ -154,7 +154,7 @@ const transform: AxiosTransform = { ...@@ -154,7 +154,7 @@ const transform: AxiosTransform = {
* @description: 响应错误处理 * @description: 响应错误处理
*/ */
responseInterceptorsCatch: (error: any) => { responseInterceptorsCatch: (error: any) => {
const { t } = useI18n('sys.api'); const { t } = useI18n();
errorStore.setupErrorHandle(error); errorStore.setupErrorHandle(error);
const { response, code, message } = error || {}; const { response, code, message } = error || {};
const msg: string = const msg: string =
...@@ -162,12 +162,12 @@ const transform: AxiosTransform = { ...@@ -162,12 +162,12 @@ const transform: AxiosTransform = {
const err: string = error.toString(); const err: string = error.toString();
try { try {
if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) { if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
createMessage.error(t('apiTimeoutMessage')); createMessage.error(t('sys.api.apiTimeoutMessage'));
} }
if (err && err.includes('Network Error')) { if (err && err.includes('Network Error')) {
createErrorModal({ createErrorModal({
title: t('networkException'), title: t('sys.api.networkException'),
content: t('networkExceptionMsg'), content: t('sys.api.networkExceptionMsg'),
}); });
} }
} catch (error) { } catch (error) {
......
<template> <template>
<BasicModal :width="800" :title="t('tableActionDesc')" v-bind="$attrs"> <BasicModal :width="800" :title="t('sys.errorLog.tableActionDesc')" v-bind="$attrs">
<Description :data="info" @register="register" /> <Description :data="info" @register="register" />
</BasicModal> </BasicModal>
</template> </template>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
}, },
}, },
setup() { setup() {
const { t } = useI18n('sys.errorLog'); const { t } = useI18n();
const [register] = useDescription({ const [register] = useDescription({
column: 2, column: 2,
schema: getDescSchema(), schema: getDescSchema(),
......
...@@ -3,13 +3,13 @@ import { BasicColumn } from '/@/components/Table/index'; ...@@ -3,13 +3,13 @@ import { BasicColumn } from '/@/components/Table/index';
import { ErrorTypeEnum } from '/@/enums/exceptionEnum'; import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n('sys.errorLog'); const { t } = useI18n();
export function getColumns(): BasicColumn[] { export function getColumns(): BasicColumn[] {
return [ return [
{ {
dataIndex: 'type', dataIndex: 'type',
title: t('tableColumnType'), title: t('sys.errorLog.tableColumnType'),
width: 80, width: 80,
customRender: ({ text }) => { customRender: ({ text }) => {
const color = const color =
...@@ -32,12 +32,12 @@ export function getColumns(): BasicColumn[] { ...@@ -32,12 +32,12 @@ export function getColumns(): BasicColumn[] {
}, },
{ {
dataIndex: 'time', dataIndex: 'time',
title: t('tableColumnDate'), title: t('sys.errorLog.tableColumnDate'),
width: 160, width: 160,
}, },
{ {
dataIndex: 'file', dataIndex: 'file',
title: t('tableColumnFile'), title: t('sys.errorLog.tableColumnFile'),
width: 200, width: 200,
}, },
{ {
...@@ -47,12 +47,12 @@ export function getColumns(): BasicColumn[] { ...@@ -47,12 +47,12 @@ export function getColumns(): BasicColumn[] {
}, },
{ {
dataIndex: 'message', dataIndex: 'message',
title: t('tableColumnMsg'), title: t('sys.errorLog.tableColumnMsg'),
width: 300, width: 300,
}, },
{ {
dataIndex: 'stack', dataIndex: 'stack',
title: t('tableColumnStackMsg'), title: t('sys.errorLog.tableColumnStackMsg'),
width: 300, width: 300,
}, },
]; ];
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
const rowInfoRef = ref<ErrorInfo>(); const rowInfoRef = ref<ErrorInfo>();
const imgListRef = ref<string[]>([]); const imgListRef = ref<string[]>([]);
const { t } = useI18n('sys.errorLog'); const { t } = useI18n();
const [register, { setTableData }] = useTable({ const [register, { setTableData }] = useTable({
title: t('sys.errorLog.tableTitle'), title: t('sys.errorLog.tableTitle'),
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
); );
const { createMessage } = useMessage(); const { createMessage } = useMessage();
if (isDevMode()) { if (isDevMode()) {
createMessage.info(t('enableMessage')); createMessage.info(t('sys.errorLog.enableMessage'));
} }
// 查看详情 // 查看详情
function handleDetail(row: ErrorInfo) { function handleDetail(row: ErrorInfo) {
......
...@@ -53,7 +53,7 @@ export default defineComponent({ ...@@ -53,7 +53,7 @@ export default defineComponent({
const { query } = useRoute(); const { query } = useRoute();
const go = useGo(); const go = useGo();
const redo = useRedo(); const redo = useRedo();
const { t } = useI18n('sys.exception'); const { t } = useI18n();
const getStatus = computed(() => { const getStatus = computed(() => {
const { status: routeStatus } = query; const { status: routeStatus } = query;
...@@ -67,13 +67,13 @@ export default defineComponent({ ...@@ -67,13 +67,13 @@ export default defineComponent({
} }
); );
const backLoginI18n = t('backLogin'); const backLoginI18n = t('sys.exception.backLogin');
const backHomeI18n = t('backHome'); const backHomeI18n = t('sys.exception.backHome');
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, { unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {
title: '403', title: '403',
status: `${ExceptionEnum.PAGE_NOT_ACCESS}`, status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,
subTitle: t('subTitle403'), subTitle: t('sys.exception.subTitle403'),
btnText: props.full ? backLoginI18n : backHomeI18n, btnText: props.full ? backLoginI18n : backHomeI18n,
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()), handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
}); });
...@@ -81,7 +81,7 @@ export default defineComponent({ ...@@ -81,7 +81,7 @@ export default defineComponent({
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, { unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {
title: '404', title: '404',
status: `${ExceptionEnum.PAGE_NOT_FOUND}`, status: `${ExceptionEnum.PAGE_NOT_FOUND}`,
subTitle: t('subTitle404'), subTitle: t('sys.exception.subTitle404'),
btnText: props.full ? backLoginI18n : backHomeI18n, btnText: props.full ? backLoginI18n : backHomeI18n,
handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()), handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
}); });
...@@ -89,22 +89,22 @@ export default defineComponent({ ...@@ -89,22 +89,22 @@ export default defineComponent({
unref(statusMapRef).set(ExceptionEnum.ERROR, { unref(statusMapRef).set(ExceptionEnum.ERROR, {
title: '500', title: '500',
status: `${ExceptionEnum.ERROR}`, status: `${ExceptionEnum.ERROR}`,
subTitle: t('subTitle500'), subTitle: t('sys.exception.subTitle500'),
btnText: backHomeI18n, btnText: backHomeI18n,
handler: () => go(), handler: () => go(),
}); });
unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, { unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {
title: t('noDataTitle'), title: t('sys.exception.noDataTitle'),
subTitle: '', subTitle: '',
btnText: t('redo'), btnText: t('sys.exception.redo'),
handler: () => redo(), handler: () => redo(),
icon: notDataImg, icon: notDataImg,
}); });
unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, { unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {
title: t('networkErrorTitle'), title: t('sys.exception.networkErrorTitle'),
subTitle: t('networkErrorSubTitle'), subTitle: t('sys.exception.networkErrorSubTitle'),
btnText: 'Refresh', btnText: 'Refresh',
handler: () => redo(), handler: () => redo(),
icon: netWorkImg, icon: netWorkImg,
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
const loadingRef = ref(false); const loadingRef = ref(false);
const errMsgRef = ref(false); const errMsgRef = ref(false);
const { t } = useI18n('sys.lock'); const { t } = useI18n();
const [register, { validateFields }] = useForm({ const [register, { validateFields }] = useForm({
showActionButtonGroup: false, showActionButtonGroup: false,
schemas: [ schemas: [
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
component: 'InputPassword', component: 'InputPassword',
componentProps: { componentProps: {
style: { width: '100%' }, style: { width: '100%' },
placeholder: t('placeholder'), placeholder: t('sys.lock.placeholder'),
}, },
rules: [{ required: true }], rules: [{ required: true }],
}, },
......
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
const globSetting = useGlobSetting(); const globSetting = useGlobSetting();
const { locale } = useProjectSetting(); const { locale } = useProjectSetting();
const { notification } = useMessage(); const { notification } = useMessage();
const { t } = useI18n('sys.login'); const { t } = useI18n();
// const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify); // const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);
...@@ -104,8 +104,10 @@ ...@@ -104,8 +104,10 @@
}); });
const formRules = reactive({ const formRules = reactive({
account: [{ required: true, message: t('accountPlaceholder'), trigger: 'blur' }], account: [{ required: true, message: t('sys.login.accountPlaceholder'), trigger: 'blur' }],
password: [{ required: true, message: t('passwordPlaceholder'), trigger: 'blur' }], password: [
{ required: true, message: t('sys.login.passwordPlaceholder'), trigger: 'blur' },
],
// verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [], // verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [],
}); });
...@@ -130,8 +132,8 @@ ...@@ -130,8 +132,8 @@
); );
if (userInfo) { if (userInfo) {
notification.success({ notification.success({
message: t('loginSuccessTitle'), message: t('sys.login.loginSuccessTitle'),
description: `${t('loginSuccessDesc')}: ${userInfo.realName}`, description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`,
duration: 3, duration: 3,
}); });
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论