mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-01-23 01:30:26 +08:00
perf: optimize the naming of locale key
This commit is contained in:
parent
25a1e93ab2
commit
4674380266
@ -1,3 +0,0 @@
|
||||
{
|
||||
"exclude": ["zx", "eslint", "eslint-plugin-unused-imports"]
|
||||
}
|
@ -50,31 +50,31 @@ export class MenuController {
|
||||
const createDemosMenus = (role: 'admin' | 'super' | 'user') => {
|
||||
const roleWithMenus = {
|
||||
admin: {
|
||||
component: '/demos/access/backend/access-test-2',
|
||||
component: '/demos/access/backend/admin-visible',
|
||||
meta: {
|
||||
icon: 'mdi:button-cursor',
|
||||
title: 'page.demos.access.access-test-2',
|
||||
title: 'page.demos.access.adminVisible',
|
||||
},
|
||||
name: 'AccessBackendTest2',
|
||||
path: 'access-test-2',
|
||||
name: 'AccessBackendAdminVisible',
|
||||
path: 'admin-visible',
|
||||
},
|
||||
super: {
|
||||
component: '/demos/access/backend/access-test-1',
|
||||
component: '/demos/access/backend/super-visible',
|
||||
meta: {
|
||||
icon: 'mdi:button-cursor',
|
||||
title: 'page.demos.access.access-test-1',
|
||||
title: 'page.demos.access.superVisible',
|
||||
},
|
||||
name: 'AccessBackendTest1',
|
||||
path: 'access-test-1',
|
||||
name: 'AccessBackendSuperVisible',
|
||||
path: 'super-visible',
|
||||
},
|
||||
user: {
|
||||
component: '/demos/access/backend/access-test-3',
|
||||
component: '/demos/access/backend/user-visible',
|
||||
meta: {
|
||||
icon: 'mdi:button-cursor',
|
||||
title: 'page.demos.access.access-test-3',
|
||||
title: 'page.demos.access.userVisible',
|
||||
},
|
||||
name: 'AccessBackendTest3',
|
||||
path: 'access-test-3',
|
||||
name: 'AccessBackendUserVisible',
|
||||
path: 'user-visible',
|
||||
},
|
||||
};
|
||||
|
||||
@ -105,7 +105,7 @@ export class MenuController {
|
||||
path: 'backend',
|
||||
meta: {
|
||||
icon: 'mdi:cloud-key-outline',
|
||||
title: 'page.demos.access.backend-control',
|
||||
title: 'page.demos.access.backendControl',
|
||||
},
|
||||
redirect: '/demos/access/backend/page-control',
|
||||
children: [
|
||||
@ -115,7 +115,7 @@ export class MenuController {
|
||||
component: '/demos/access/backend/index',
|
||||
meta: {
|
||||
icon: 'mdi:page-previous-outline',
|
||||
title: 'page.demos.access.page',
|
||||
title: 'page.demos.access.pageAccess',
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -124,7 +124,7 @@ export class MenuController {
|
||||
component: '/demos/access/backend/button-control',
|
||||
meta: {
|
||||
icon: 'mdi:button-cursor',
|
||||
title: 'page.demos.access.button',
|
||||
title: 'page.demos.access.buttonControl',
|
||||
},
|
||||
},
|
||||
roleWithMenus[role],
|
||||
|
@ -1,14 +1,14 @@
|
||||
import type { UserInfo } from '@vben/types';
|
||||
|
||||
import type { UserApiType } from '../types';
|
||||
import type { UserApi } from '../types';
|
||||
|
||||
import { requestClient } from '#/forward';
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*/
|
||||
async function userLogin(data: UserApiType.LoginParams) {
|
||||
return requestClient.post<UserApiType.LoginResult>('/auth/login', data);
|
||||
async function userLogin(data: UserApi.LoginParams) {
|
||||
return requestClient.post<UserApi.LoginResult>('/auth/login', data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,4 +1,4 @@
|
||||
namespace UserApiType {
|
||||
namespace UserApi {
|
||||
/** 登录接口参数 */
|
||||
export interface LoginParams {
|
||||
password: string;
|
||||
@ -16,4 +16,4 @@ namespace UserApiType {
|
||||
}
|
||||
}
|
||||
|
||||
export type { UserApiType };
|
||||
export type { UserApi };
|
||||
|
@ -17,7 +17,7 @@ async function bootstrap(namespace: string) {
|
||||
await setupI18n(app, {
|
||||
defaultLocale: preferences.app.locale,
|
||||
loadMessages,
|
||||
missingWarn: import.meta.env.PROD,
|
||||
missingWarn: !import.meta.env.PROD,
|
||||
});
|
||||
|
||||
// 配置 pinia-store
|
||||
|
@ -25,7 +25,7 @@ async function generateAccess(options: GeneratorMenuAndRoutesOptions) {
|
||||
...options,
|
||||
fetchMenuListAsync: async () => {
|
||||
message.loading({
|
||||
content: `${$t('common.loading-menu')}...`,
|
||||
content: `${$t('common.loadingMenu')}...`,
|
||||
duration: 1.5,
|
||||
});
|
||||
return await getAllMenus();
|
||||
|
@ -16,6 +16,7 @@ const localesMap = loadLocalesMap(modules);
|
||||
|
||||
/**
|
||||
* 加载应用特有的语言包
|
||||
* 这里也可以改造为从服务端获取翻译数据
|
||||
* @param lang
|
||||
*/
|
||||
async function loadMessages(lang: SupportedLanguagesType) {
|
||||
|
@ -4,29 +4,28 @@
|
||||
"title": "Demos",
|
||||
"access": {
|
||||
"title": "Access Control",
|
||||
"frontend-control": "Front-end Control",
|
||||
"backend-control": "Backend Control",
|
||||
"page": "Page visit",
|
||||
"button": "Button control",
|
||||
"loading-menu": "In the loading menu",
|
||||
"access-test-1": "Super visit",
|
||||
"access-test-2": "Admin visit",
|
||||
"access-test-3": "User visit"
|
||||
"frontendControl": "Frontend Control",
|
||||
"backendControl": "Backend Control",
|
||||
"pageAccess": "Page Access",
|
||||
"buttonControl": "Button Control",
|
||||
"superVisible": "Visible to Super",
|
||||
"adminVisible": "Visible to Admin",
|
||||
"userVisible": "Visible to User"
|
||||
},
|
||||
"nested": {
|
||||
"title": "Nested Menu",
|
||||
"menu1": "Menu 1",
|
||||
"menu2": "Menu 2",
|
||||
"menu21": "Menu 2-1",
|
||||
"menu2_1": "Menu 2-1",
|
||||
"menu3": "Menu 3",
|
||||
"menu31": "Menu 3-1",
|
||||
"menu32": "Menu 3-2",
|
||||
"menu321": "Menu 3-2-1"
|
||||
"menu3_1": "Menu 3-1",
|
||||
"menu3_2": "Menu 3-2",
|
||||
"menu3_2_1": "Menu 3-2-1"
|
||||
},
|
||||
"outside": {
|
||||
"title": "External Page",
|
||||
"embedded": "embedded Page",
|
||||
"external-link": "External Link"
|
||||
"title": "External Pages",
|
||||
"embedded": "Embedded",
|
||||
"externalLink": "External Link"
|
||||
},
|
||||
"fallback": { "title": "Fallback Page" }
|
||||
}
|
||||
|
@ -4,28 +4,28 @@
|
||||
"title": "演示",
|
||||
"access": {
|
||||
"title": "访问控制",
|
||||
"frontend-control": "前端控制",
|
||||
"backend-control": "后端控制",
|
||||
"page": "页面访问",
|
||||
"button": "按钮控制",
|
||||
"access-test-1": "Super 可见",
|
||||
"access-test-2": "Admin 可见",
|
||||
"access-test-3": "User 可见"
|
||||
"frontendControl": "前端控制",
|
||||
"backendControl": "后端控制",
|
||||
"pageAccess": "页面访问",
|
||||
"buttonControl": "按钮控制",
|
||||
"superVisible": "Super 可见",
|
||||
"adminVisible": "Admin 可见",
|
||||
"userVisible": "User 可见"
|
||||
},
|
||||
"nested": {
|
||||
"title": "嵌套菜单",
|
||||
"menu1": "菜单 1",
|
||||
"menu2": "菜单 2",
|
||||
"menu21": "菜单 2-1",
|
||||
"menu2_1": "菜单 2-1",
|
||||
"menu3": "菜单 3",
|
||||
"menu31": "菜单 3-1",
|
||||
"menu32": "菜单 3-2",
|
||||
"menu321": "菜单 3-2-1"
|
||||
"menu3_1": "菜单 3-1",
|
||||
"menu3_2": "菜单 3-2",
|
||||
"menu3_2_1": "菜单 3-2-1"
|
||||
},
|
||||
"outside": {
|
||||
"title": "外部页面",
|
||||
"embedded": "内嵌",
|
||||
"external-link": "外链"
|
||||
"externalLink": "外链"
|
||||
},
|
||||
"fallback": {
|
||||
"title": "缺省页"
|
||||
|
@ -60,7 +60,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
|
||||
component: () =>
|
||||
import('#/views/_essential/authentication/qrcode-login.vue'),
|
||||
meta: {
|
||||
title: $t('page.essentials.qrcode-login'),
|
||||
title: $t('page.essentials.qrcodeLogin'),
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -69,7 +69,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
|
||||
component: () =>
|
||||
import('#/views/_essential/authentication/forget-password.vue'),
|
||||
meta: {
|
||||
title: $t('page.essentials.forget-password'),
|
||||
title: $t('page.essentials.forgetPassword'),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -31,7 +31,7 @@ const routes: RouteRecordRaw[] = [
|
||||
redirect: '/demos/access/frontend/page-control',
|
||||
meta: {
|
||||
icon: 'mdi:table-key',
|
||||
title: $t('page.demos.access.frontend-control'),
|
||||
title: $t('page.demos.access.frontendControl'),
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@ -41,7 +41,7 @@ const routes: RouteRecordRaw[] = [
|
||||
import('#/views/demos/access/frontend/index.vue'),
|
||||
meta: {
|
||||
icon: 'mdi:page-previous-outline',
|
||||
title: $t('page.demos.access.page'),
|
||||
title: $t('page.demos.access.pageAccess'),
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -51,40 +51,40 @@ const routes: RouteRecordRaw[] = [
|
||||
import('#/views/demos/access/frontend/button-control.vue'),
|
||||
meta: {
|
||||
icon: 'mdi:button-cursor',
|
||||
title: $t('page.demos.access.button'),
|
||||
title: $t('page.demos.access.buttonControl'),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'AccessFrontendTest1',
|
||||
path: 'access-test-1',
|
||||
name: 'AccessFrontendSuperVisible',
|
||||
path: 'super-visible',
|
||||
component: () =>
|
||||
import('#/views/demos/access/frontend/access-test-1.vue'),
|
||||
import('#/views/demos/access/frontend/super-visible.vue'),
|
||||
meta: {
|
||||
authority: ['super'],
|
||||
icon: 'mdi:button-cursor',
|
||||
title: $t('page.demos.access.access-test-1'),
|
||||
title: $t('page.demos.access.superVisible'),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'AccessFrontendTest2',
|
||||
path: 'access-test-2',
|
||||
name: 'AccessFrontendAdminVisible',
|
||||
path: 'admin-visible',
|
||||
component: () =>
|
||||
import('#/views/demos/access/frontend/access-test-2.vue'),
|
||||
import('#/views/demos/access/frontend/admin-visible.vue'),
|
||||
meta: {
|
||||
authority: ['admin'],
|
||||
icon: 'mdi:button-cursor',
|
||||
title: $t('page.demos.access.access-test-2'),
|
||||
title: $t('page.demos.access.adminVisible'),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'AccessFrontendTest3',
|
||||
path: 'access-test-3',
|
||||
name: 'AccessFrontendUserVisible',
|
||||
path: 'user-visible',
|
||||
component: () =>
|
||||
import('#/views/demos/access/frontend/access-test-3.vue'),
|
||||
import('#/views/demos/access/frontend/user-visible.vue'),
|
||||
meta: {
|
||||
authority: ['user'],
|
||||
icon: 'mdi:button-cursor',
|
||||
title: $t('page.demos.access.access-test-3'),
|
||||
title: $t('page.demos.access.userVisible'),
|
||||
},
|
||||
},
|
||||
],
|
||||
@ -95,7 +95,7 @@ const routes: RouteRecordRaw[] = [
|
||||
component: () => import('#/views/demos/access/backend/index.vue'),
|
||||
meta: {
|
||||
icon: 'mdi:cloud-key-outline',
|
||||
title: $t('page.demos.access.backend-control'),
|
||||
title: $t('page.demos.access.backendControl'),
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@ -105,7 +105,7 @@ const routes: RouteRecordRaw[] = [
|
||||
import('#/views/demos/access/frontend/index.vue'),
|
||||
meta: {
|
||||
icon: 'mdi:page-previous-outline',
|
||||
title: $t('page.demos.access.page'),
|
||||
title: $t('page.demos.access.pageAccess'),
|
||||
},
|
||||
},
|
||||
],
|
||||
@ -209,7 +209,7 @@ const routes: RouteRecordRaw[] = [
|
||||
path: 'external-link',
|
||||
meta: {
|
||||
icon: 'mdi:newspaper-variant-multiple-outline',
|
||||
title: $t('page.demos.outside.external-link'),
|
||||
title: $t('page.demos.outside.externalLink'),
|
||||
},
|
||||
redirect: '/outside/external-link/vite',
|
||||
children: [
|
||||
@ -273,7 +273,7 @@ const routes: RouteRecordRaw[] = [
|
||||
meta: {
|
||||
icon: 'ic:round-menu',
|
||||
keepAlive: true,
|
||||
title: $t('page.demos.nested.menu21'),
|
||||
title: $t('page.demos.nested.menu2_1'),
|
||||
},
|
||||
},
|
||||
],
|
||||
@ -294,7 +294,7 @@ const routes: RouteRecordRaw[] = [
|
||||
meta: {
|
||||
icon: 'ic:round-menu',
|
||||
keepAlive: true,
|
||||
title: $t('page.demos.nested.menu31'),
|
||||
title: $t('page.demos.nested.menu3_1'),
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -302,7 +302,7 @@ const routes: RouteRecordRaw[] = [
|
||||
path: 'menu3-2',
|
||||
meta: {
|
||||
icon: 'ic:round-menu',
|
||||
title: $t('page.demos.nested.menu32'),
|
||||
title: $t('page.demos.nested.menu3_2'),
|
||||
},
|
||||
redirect: '/nested/menu3/menu3-2/menu3-2-1',
|
||||
children: [
|
||||
@ -314,7 +314,7 @@ const routes: RouteRecordRaw[] = [
|
||||
meta: {
|
||||
icon: 'ic:round-menu',
|
||||
keepAlive: true,
|
||||
title: $t('page.demos.nested.menu321'),
|
||||
title: $t('page.demos.nested.menu3_2_1'),
|
||||
},
|
||||
},
|
||||
],
|
||||
|
@ -20,9 +20,9 @@ async function handleLogin(params: LoginAndRegisterParams) {
|
||||
const { userInfo } = await accessStore.authLogin(params);
|
||||
if (userInfo?.realName) {
|
||||
notification.success({
|
||||
description: `${$t('authentication.login-success-desc')}:${userInfo?.realName}`,
|
||||
description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
|
||||
duration: 3,
|
||||
message: $t('authentication.login-success'),
|
||||
message: $t('authentication.loginSuccess'),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,7 @@
|
||||
"sonner",
|
||||
"unplugin",
|
||||
"vben",
|
||||
"vbenjs",
|
||||
"vueuse",
|
||||
"yxxx",
|
||||
"nuxt",
|
||||
|
@ -46,7 +46,7 @@
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-regexp": "^2.6.0",
|
||||
"eslint-plugin-unicorn": "^54.0.0",
|
||||
"eslint-plugin-unused-imports": "^3.2.0",
|
||||
"eslint-plugin-unused-imports": "^4.0.0",
|
||||
"eslint-plugin-vitest": "^0.5.4",
|
||||
"eslint-plugin-vue": "^9.27.0",
|
||||
"globals": "^15.8.0",
|
||||
|
@ -30,7 +30,7 @@
|
||||
"dependencies": {
|
||||
"@stylistic/stylelint-plugin": "^2.1.2",
|
||||
"stylelint-config-recess-order": "^5.0.1",
|
||||
"stylelint-scss": "^6.4.0"
|
||||
"stylelint-scss": "^6.4.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"postcss": "^8.4.39",
|
||||
|
@ -37,6 +37,6 @@
|
||||
"pkg-types": "^1.1.3",
|
||||
"prettier": "^3.3.2",
|
||||
"rimraf": "^6.0.0",
|
||||
"zx": "^7.2.3"
|
||||
"zx": "^8.1.4"
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@
|
||||
"rollup": "^4.18.1",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"sass": "^1.77.7",
|
||||
"unplugin-turbo-console": "^1.9.0",
|
||||
"unplugin-turbo-console": "^1.9.2",
|
||||
"vite": "^5.3.3",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-dts": "^3.9.1",
|
||||
|
13
package.json
13
package.json
@ -44,7 +44,8 @@
|
||||
"publint": "vsh publint",
|
||||
"reinstall": "pnpm clean --del-lock && pnpm bootstrap",
|
||||
"test": "vitest",
|
||||
"version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile"
|
||||
"version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile",
|
||||
"update:deps": " pnpm update --latest --recursive"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@changesets/changelog-github": "^0.5.0",
|
||||
@ -68,7 +69,6 @@
|
||||
"is-ci": "^3.0.1",
|
||||
"jsdom": "^24.1.0",
|
||||
"rimraf": "^6.0.0",
|
||||
"taze": "^0.14.2",
|
||||
"turbo": "^2.0.6",
|
||||
"typescript": "^5.5.3",
|
||||
"unbuild": "^2.0.0",
|
||||
@ -88,6 +88,12 @@
|
||||
"clsx": "^2.1.1",
|
||||
"vue": "^3.4.31"
|
||||
},
|
||||
"peerDependencyRules": {
|
||||
"allowedVersions": {
|
||||
"eslint": "*",
|
||||
" @typescript-eslint/eslint-plugin": "*"
|
||||
}
|
||||
},
|
||||
"neverBuiltDependencies": [
|
||||
"canvas",
|
||||
"node-gyp",
|
||||
@ -95,8 +101,7 @@
|
||||
],
|
||||
"updateConfig": {
|
||||
"ignoreDependencies": [
|
||||
"eslint",
|
||||
"zx"
|
||||
"eslint"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ describe('useCoreAccessStore', () => {
|
||||
const store = useCoreTabbarStore();
|
||||
store.cachedTabs.add('Home');
|
||||
store.cachedTabs.add('About');
|
||||
expect(store.cachedTabs).toEqual(['Home', 'About']);
|
||||
expect(store.getCachedTabs).toEqual(['Home', 'About']);
|
||||
});
|
||||
|
||||
it('returns all tabs, including affix tabs', () => {
|
||||
|
@ -28,10 +28,11 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
|
||||
|
||||
// 在控制台打印警告
|
||||
i18n.global.setMissingHandler((locale, key) => {
|
||||
options.missingWarn &&
|
||||
if (options.missingWarn && key.includes('.')) {
|
||||
console.warn(
|
||||
`[intlify] Not found '${key}' key in '${locale}' locale messages.`,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,9 @@
|
||||
"essentials": {
|
||||
"login": "Login",
|
||||
"register": "Register",
|
||||
"code-login": "Code Login",
|
||||
"qrcode-login": "Qrcode Login",
|
||||
"forget-password": "Forget Password"
|
||||
"codeLogin": "Code Login",
|
||||
"qrcodeLogin": "Qr Code Login",
|
||||
"forgetPassword": "Forget Password"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
@ -19,197 +19,193 @@
|
||||
},
|
||||
"common": {
|
||||
"back": "Back",
|
||||
"back-to-home": "Back To Home",
|
||||
"backToHome": "Back To Home",
|
||||
"login": "Login",
|
||||
"logout": "Logout",
|
||||
"prompt": "Prompt",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Comfirm",
|
||||
"not-data": "No data",
|
||||
"refresh": "Refresh"
|
||||
"noData": "No Data",
|
||||
"refresh": "Refresh",
|
||||
"loadingMenu": "Loading Menu"
|
||||
},
|
||||
"fallback": {
|
||||
"page-not-found": "Oops! Page Not Found",
|
||||
"page-not-found-desc": "Sorry, we couldn't find the page you were looking for.",
|
||||
"pageNotFound": "Oops! Page Not Found",
|
||||
"pageNotFoundDesc": "Sorry, we couldn't find the page you were looking for.",
|
||||
"forbidden": "Oops! Access Denied",
|
||||
"forbidden-desc": "Sorry, but you don't have permission to access this page.",
|
||||
"internal-error": "Oops! Something Went Wrong",
|
||||
"internal-error-desc": "Sorry, but the server encountered an error.",
|
||||
"forbiddenDesc": "Sorry, but you don't have permission to access this page.",
|
||||
"internalError": "Oops! Something Went Wrong",
|
||||
"internalErrorDesc": "Sorry, but the server encountered an error.",
|
||||
"offline": "Offline Page",
|
||||
"offline-error": "Oops! Network Error",
|
||||
"offline-error-desc": "Sorry, can't connect to the internet. Check your connection.",
|
||||
"coming-soon": "Coming soon"
|
||||
"offlineError": "Oops! Network Error",
|
||||
"offlineErrorDesc": "Sorry, can't connect to the internet. Check your connection.",
|
||||
"coming-soon": "Coming Soon"
|
||||
},
|
||||
"widgets": {
|
||||
"document": "Document",
|
||||
"qa": "FAQ & Help",
|
||||
"setting": "Setting",
|
||||
"logout-tip": "Do you want to log out?",
|
||||
"view-all": "View all messages",
|
||||
"qa": "Q&A",
|
||||
"setting": "Settings",
|
||||
"logoutTip": "Do you want to logout?",
|
||||
"viewAll": "View All Messages",
|
||||
"notifications": "Notifications",
|
||||
"make-all-as-read": "Make all as read",
|
||||
"clear-notifications": "Clear",
|
||||
"markAllAsRead": "Make All as Read",
|
||||
"clearNotifications": "Clear",
|
||||
"search": {
|
||||
"title": "Search",
|
||||
"search-navigate": "Search Navigate",
|
||||
"select": "To select",
|
||||
"navigate": "To navigate",
|
||||
"close": "To close",
|
||||
"no-results": "No results for",
|
||||
"no-recent": "No recent searches",
|
||||
"recent": "Recent"
|
||||
"searchNavigate": "Search Navigation",
|
||||
"select": "Select",
|
||||
"navigate": "Navigate",
|
||||
"close": "Close",
|
||||
"noResults": "No Search Results Found",
|
||||
"noRecent": "No Search History",
|
||||
"recent": "Search History"
|
||||
}
|
||||
},
|
||||
"authentication": {
|
||||
"welcome-back": "Welcome Back",
|
||||
"page-title": "Plug-and-play backend system",
|
||||
"page-desc": "Efficient, versatile frontend template",
|
||||
"login-success": "Login successful",
|
||||
"login-success-desc": "Welcome back",
|
||||
"login-subtitle": "Enter your account details to manage your projects",
|
||||
"welcomeBack": "Welcome Back",
|
||||
"pageTitle": "Plug-and-play Admin system",
|
||||
"pageDesc": "Efficient, versatile frontend template",
|
||||
"loginSuccess": "Login Successful",
|
||||
"loginSuccessDesc": "Welcome Back",
|
||||
"loginSubtitle": "Enter your account details to manage your projects",
|
||||
"username": "Username",
|
||||
"password": "Password",
|
||||
"username-tip": "Username is required",
|
||||
"password-tip": "Password is required",
|
||||
"remember-me": "Remember Me",
|
||||
"create-an-account": "Create an account",
|
||||
"create-account": "Create account",
|
||||
"already-account": "Already have an account?",
|
||||
"account-tip": "Don't have an account yet?",
|
||||
"sign-up": "Sign Up",
|
||||
"sign-up-subtitle": "Make managing your applications simple and fun",
|
||||
"comfirm-password": "Comfirm Password",
|
||||
"comfirm-password-tip": "The passwords entered twice do not match",
|
||||
"sign-up-agree": "I agree to",
|
||||
"sign-up-privacy-policy": "Privacy-policy",
|
||||
"sign-up-terms": "Terms",
|
||||
"sign-up-agree-tip": "Please agree to the Privacy Policy and Terms",
|
||||
"go-login": "Login instead",
|
||||
"password-strength": "Use 8 or more characters with a mix of letters, numbers & symbols",
|
||||
"forget-password": "Forget Password?",
|
||||
"forget-password-subtitle": "Enter your email and we'll send you instructions to reset your password",
|
||||
"email-tip": "Email is required",
|
||||
"send-reset-link": "Send Reset Link",
|
||||
"usernameTip": "Please enter username",
|
||||
"passwordTip": "Please enter password",
|
||||
"rememberMe": "Remember Me",
|
||||
"createAnAccount": "Create an Account",
|
||||
"createAccount": "Create Account",
|
||||
"alreadyHaveAccount": "Already have an account?",
|
||||
"accountTip": "Don't have an account?",
|
||||
"signUp": "Sign Up",
|
||||
"signUpSubtitle": "Make managing your applications simple and fun",
|
||||
"confirmPassword": "Comfirm Password",
|
||||
"confirmPasswordTip": "The passwords do not match",
|
||||
"agree": "I agree to",
|
||||
"agreeprivacyPolicy": "Privacy-policy",
|
||||
"terms": "Terms",
|
||||
"agreeTip": "Please agree to the Privacy Policy and Terms",
|
||||
"goToLogin": "Login instead",
|
||||
"passwordStrength": "Use 8 or more characters with a mix of letters, numbers & symbols",
|
||||
"forgetPassword": "Forget Password?",
|
||||
"forgetPasswordSubtitle": "Enter your email and we'll send you instructions to reset your password",
|
||||
"emailTip": "Please enter email",
|
||||
"sendResetLink": "Send Reset Link",
|
||||
"email": "Email",
|
||||
"qrcode-subtitle": "Please scan the QR code to log in on your mobile device",
|
||||
"qrcode-prompt": "Scanning the code to complete the login",
|
||||
"qrcode-login": "QR Login",
|
||||
"code-subtitle": "Please enter your phone number to start managing your projects",
|
||||
"qrcodeSubtitle": "Scan the QR code with your phone to login",
|
||||
"qrcodePrompt": "Click 'Confirm' after scanning to complete login",
|
||||
"qrcodeLogin": "QR Code Login",
|
||||
"codeSubtitle": "Enter your phone number to start managing your project",
|
||||
"code": "Security code",
|
||||
"code-tip": "Security code is required",
|
||||
"codeTip": "Security code is required",
|
||||
"mobile": "Mobile",
|
||||
"mobile-login": "Mobile Login",
|
||||
"mobile-tip": "Mobile is required",
|
||||
"send-code": "Get Security code",
|
||||
"send-text": "Reacquire in {0}s",
|
||||
"third-party-login": "Or continue with",
|
||||
"mobileLogin": "Mobile Login",
|
||||
"mobile-tip": "Please enter phone number",
|
||||
"sendCode": "Get Security code",
|
||||
"sendText": "Resend in {0}s",
|
||||
"thirdPartyLogin": "Or continue with",
|
||||
"layout": {
|
||||
"center": "Align Center",
|
||||
"align-left": "Align Left",
|
||||
"align-right": "Align Right"
|
||||
"alignLeft": "Align Left",
|
||||
"alignRight": "Align Right"
|
||||
}
|
||||
},
|
||||
"preferences": {
|
||||
"title": "Preferences",
|
||||
"subtitle": "Customize Preferences & Preview in Real Time",
|
||||
"reset-tip": "The data has changed, click to reset",
|
||||
"reset-title": "Preferences reset",
|
||||
"reset-success": "Preferences reset successfully",
|
||||
"resetTip": "Data has changed, click to reset",
|
||||
"resetTitle": "Reset Preferences",
|
||||
"resetSuccess": "Preferences reset successfully",
|
||||
"appearance": "Appearance",
|
||||
"layout": "Layout",
|
||||
"content": "Content",
|
||||
"other": "Other",
|
||||
"wide": "Fluid",
|
||||
"compact": "Fixed Width",
|
||||
"follow-system": "Follow System",
|
||||
"wide": "Wide",
|
||||
"compact": "Fixed",
|
||||
"followSystem": "Follow System",
|
||||
"vertical": "Vertical",
|
||||
"vertical-tip": "Side Vertical Menu Mode",
|
||||
"verticalTip": "Side vertical menu mode",
|
||||
"horizontal": "Horizontal",
|
||||
"horizontal-tip": "Top Horizontal Menu",
|
||||
"two-column": "Two Column",
|
||||
"two-column-tip": "Vertical Two Column Menu Mode",
|
||||
"mixed-menu": "Mixed Menu",
|
||||
"split-menu": "Split Menu",
|
||||
"mixed-menu-tip": "Vertical & Horizontal Menu Co-exists",
|
||||
"full-content": "Full Content",
|
||||
"full-content-tip": "Display only the main content, no menus",
|
||||
"weak-mode": "Color Weak Mode",
|
||||
"gray-mode": "Gray Mode",
|
||||
"horizontalTip": "Horizontal menu mode, all menus displayed at the top",
|
||||
"twoColumn": "Two Column",
|
||||
"twoColumnTip": "Vertical Two Column Menu Mode",
|
||||
"mixedMenu": "Mixed Menu",
|
||||
"mixedMenuTip": "Vertical & Horizontal Menu Co-exists",
|
||||
"fullContent": "Full Content",
|
||||
"fullContentTip": "Only display content body, hide all menus",
|
||||
"normal": "Normal",
|
||||
"plain": "Plain",
|
||||
"rounded": "Rounded",
|
||||
"interface-control": "Interface Layout Control",
|
||||
"copy": "Copy Preferences",
|
||||
"copy-success": "Copy successful. Please replace in `src/preferences.ts` of the app",
|
||||
"clear-and-logout": "Clear Cache & Logout",
|
||||
"copyPreferences": "Copy Preferences",
|
||||
"copyPreferencesSuccess": "Copy successful, please override in `src/preferences.ts` under app",
|
||||
"clearAndLogout": "Clear Cache & Logout",
|
||||
"mode": "Mode",
|
||||
"logo-visible": "Display Logo",
|
||||
"general": "General",
|
||||
"language": "Language",
|
||||
"dynamic-title": "Dynamic Title",
|
||||
"dynamicTitle": "Dynamic Title",
|
||||
"sidebar": {
|
||||
"title": "Sidebar",
|
||||
"width": "Width",
|
||||
"visible": "Display Sidebar",
|
||||
"visible": "Show Sidebar",
|
||||
"collapsed": "Collpase Menu",
|
||||
"collapsed-show-title": "Display menu name"
|
||||
"collapsedShowTitle": "Show Menu Title"
|
||||
},
|
||||
"tabbar": {
|
||||
"title": "Tabbar",
|
||||
"enable": "Enable Tab Bar",
|
||||
"icon": "Display Tabbar Icon",
|
||||
"persist": "Persistent tabs",
|
||||
"context-menu": {
|
||||
"icon": "Show Tabbar Icon",
|
||||
"persist": "Persist Tabs",
|
||||
"contextMenu": {
|
||||
"reload": "Reload",
|
||||
"close": "Close",
|
||||
"pin": "Pin",
|
||||
"unpin": "Unpin",
|
||||
"close-left": "Close Left",
|
||||
"close-right": "Close Right",
|
||||
"close-other": "Close Other",
|
||||
"close-all": "Close All"
|
||||
"close": "Close Tab",
|
||||
"pin": "Pin Tab",
|
||||
"unpin": "Unpin Tab",
|
||||
"closeLeft": "Close Left Tabs",
|
||||
"closeRight": "Close Right Tabs",
|
||||
"closeOther": "Close Other Tabs",
|
||||
"closeAll": "Close All Tabs"
|
||||
}
|
||||
},
|
||||
"navigation-menu": {
|
||||
"navigationMenu": {
|
||||
"title": "Navigation Menu",
|
||||
"style": "Navigation menu style",
|
||||
"style": "Navigation Menu Style",
|
||||
"accordion": "Sidebar Accordion Menu",
|
||||
"split": "Navigation Menu Separation",
|
||||
"accordion": "Sidebar Navigation Menu Accordion mode",
|
||||
"split-tip": "When enabled, the sidebar shows the top bar's submenu"
|
||||
"splitTip": "When enabled, the sidebar displays the top bar's submenu"
|
||||
},
|
||||
"breadcrumb": {
|
||||
"title": "Breadcrumb",
|
||||
"home": "Display the home button",
|
||||
"home": "Show Home Button",
|
||||
"enable": "Enable Breadcrumb",
|
||||
"icon": "Display breadcrumb icon",
|
||||
"icon": "Show Breadcrumb Icon",
|
||||
"background": "background",
|
||||
"style": "Breadcrumb Type",
|
||||
"hide-only-one": "Hidden when only one left"
|
||||
"style": "Breadcrumb Style",
|
||||
"hideOnlyOne": "Hidden when only one"
|
||||
},
|
||||
"animation": {
|
||||
"title": "Animation",
|
||||
"loading": "Page transition loading",
|
||||
"transition": "Page transition animation",
|
||||
"progress": "Page transition progress"
|
||||
"loading": "Page Loading",
|
||||
"transition": "Page Transition",
|
||||
"progress": "Page Progress"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Theme",
|
||||
"radius": "Radius",
|
||||
"light": "Light",
|
||||
"dark": "Dark",
|
||||
"dark-menu": "Semi Dark Menu",
|
||||
"weak-mode": "Color Weak Mode",
|
||||
"gray-mode": "Gray Mode",
|
||||
"darkMenu": "Semi Dark Menu",
|
||||
"weakMode": "Weak Mode",
|
||||
"grayMode": "Gray Mode",
|
||||
"builtin": {
|
||||
"title": "Built-in",
|
||||
"default": "Default",
|
||||
"violet": "Violet",
|
||||
"pink": "Pink",
|
||||
"rose": "Rose",
|
||||
"sky-blue": "Sky Blue",
|
||||
"deep-blue": "Deep Blue",
|
||||
"skyBlue": "Sky Blue",
|
||||
"deepBlue": "Deep Blue",
|
||||
"green": "Green",
|
||||
"deep-green": "Deep Green",
|
||||
"deepGreen": "Deep Green",
|
||||
"orange": "Orange",
|
||||
"yellow": "Yellow",
|
||||
"zinc": "Zinc",
|
||||
@ -221,27 +217,27 @@
|
||||
},
|
||||
"header": {
|
||||
"title": "Header",
|
||||
"visible": "Display Header",
|
||||
"mode-static": "Static",
|
||||
"mode-fixed": "Fixed",
|
||||
"mode-auto": "Auto hide/display",
|
||||
"mode-auto-scroll": "Scroll hide/display"
|
||||
"visible": "Show Header",
|
||||
"modeStatic": "Static",
|
||||
"modeFixed": "Fixed",
|
||||
"modeAuto": "Auto hide & Show",
|
||||
"modeAutoScroll": "Scroll to Hide & Show"
|
||||
},
|
||||
"footer": {
|
||||
"title": "Footer",
|
||||
"visible": "Display Footer",
|
||||
"fixed": "Fixed at the bottom"
|
||||
"visible": "Show Footer",
|
||||
"fixed": "Fixed at Bottom"
|
||||
},
|
||||
"copyright": {
|
||||
"title": "Copyright",
|
||||
"enable": "Enable copyright",
|
||||
"company-name": "Company name",
|
||||
"company-site-link": "Company homepage",
|
||||
"enable": "Enable Copyright",
|
||||
"companyName": "Company Name",
|
||||
"companySiteLink": "Company Site Link",
|
||||
"date": "Date",
|
||||
"icp": "ICP number",
|
||||
"icp-link": "ICP Site Link"
|
||||
"icp": "ICP License Number",
|
||||
"icpLink": "ICP Site Link"
|
||||
},
|
||||
"shortcut-keys": {
|
||||
"shortcutKeys": {
|
||||
"title": "Shortcut Keys",
|
||||
"global": "Global",
|
||||
"search": "Global Search",
|
||||
@ -250,13 +246,13 @@
|
||||
},
|
||||
"widget": {
|
||||
"title": "Widget",
|
||||
"global-search": "Enable Global Search",
|
||||
"globalSearch": "Enable Global Search",
|
||||
"fullscreen": "Enable Fullscreen",
|
||||
"theme-toggle": "Enable Theme Toggle",
|
||||
"language-toggle": "Enable Language Toggle",
|
||||
"themeToggle": "Enable Theme Toggle",
|
||||
"languageToggle": "Enable Language Toggle",
|
||||
"notification": "Enable Notification",
|
||||
"sidebar-toggle": "Enable Sidebar Toggle",
|
||||
"ai-assistant": "Enable AI Assistant"
|
||||
"sidebarToggle": "Enable Sidebar Toggle",
|
||||
"aiAssistant": "Enable AI Assistant"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,9 +3,9 @@
|
||||
"essentials": {
|
||||
"login": "登陆",
|
||||
"register": "注册",
|
||||
"code-login": "验证码登陆",
|
||||
"qrcode-login": "二维码登陆",
|
||||
"forget-password": "忘记密码"
|
||||
"codeLogin": "验证码登陆",
|
||||
"qrcodeLogin": "二维码登陆",
|
||||
"forgetPassword": "忘记密码"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "概览",
|
||||
@ -19,162 +19,159 @@
|
||||
},
|
||||
"common": {
|
||||
"back": "返回",
|
||||
"back-to-home": "返回首页",
|
||||
"backToHome": "返回首页",
|
||||
"login": "登录",
|
||||
"logout": "退出登录",
|
||||
"prompt": "提示",
|
||||
"cancel": "取消",
|
||||
"confirm": "确认",
|
||||
"not-data": "暂无数据",
|
||||
"noData": "暂无数据",
|
||||
"refresh": "刷新",
|
||||
"loading-menu": "加载菜单中"
|
||||
"loadingMenu": "加载菜单中"
|
||||
},
|
||||
"fallback": {
|
||||
"page-not-found": "哎呀!未找到页面",
|
||||
"page-not-found-desc": "抱歉,我们无法找到您要找的页面。",
|
||||
"pageNotFound": "哎呀!未找到页面",
|
||||
"pageNotFoundDesc": "抱歉,我们无法找到您要找的页面。",
|
||||
"forbidden": "哎呀!访问被拒绝",
|
||||
"forbidden-desc": "抱歉,您没有权限访问此页面。",
|
||||
"internal-error": "哎呀!出错了",
|
||||
"internal-error-desc": "抱歉,服务器遇到错误。",
|
||||
"forbiddenDesc": "抱歉,您没有权限访问此页面。",
|
||||
"internalError": "哎呀!出错了",
|
||||
"internalErrorDesc": "抱歉,服务器遇到错误。",
|
||||
"offline": "离线页面",
|
||||
"offline-error": "哎呀!网络错误",
|
||||
"offline-error-desc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。",
|
||||
"offlineError": "哎呀!网络错误",
|
||||
"offlineErrorDesc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。",
|
||||
"coming-soon": "即将推出"
|
||||
},
|
||||
"widgets": {
|
||||
"document": "文档",
|
||||
"qa": "问题 & 帮助",
|
||||
"setting": "设置",
|
||||
"logout-tip": "是否退出登录?",
|
||||
"view-all": "查看所有消息",
|
||||
"logoutTip": "是否退出登录?",
|
||||
"viewAll": "查看所有消息",
|
||||
"notifications": "通知",
|
||||
"make-all-as-read": "全部标记为已读",
|
||||
"clear-notifications": "清空",
|
||||
"markAllAsRead": "全部标记为已读",
|
||||
"clearNotifications": "清空",
|
||||
"search": {
|
||||
"title": "搜索",
|
||||
"search-navigate": "搜索导航菜单",
|
||||
"searchNavigate": "搜索导航菜单",
|
||||
"select": "选择",
|
||||
"navigate": "导航",
|
||||
"close": "关闭",
|
||||
"no-results": "未找到搜索结果",
|
||||
"no-recent": "没有搜索历史",
|
||||
"noResults": "未找到搜索结果",
|
||||
"noRecent": "没有搜索历史",
|
||||
"recent": "搜索历史"
|
||||
}
|
||||
},
|
||||
"authentication": {
|
||||
"welcome-back": "欢迎回来",
|
||||
"page-title": "开箱即用的大型中后台管理系统",
|
||||
"page-desc": "工程化、高性能、跨组件库的前端模版",
|
||||
"login-success": "登录成功",
|
||||
"login-success-desc": "欢迎回来",
|
||||
"login-subtitle": "请输入您的帐户信息以开始管理您的项目",
|
||||
"welcomeBack": "欢迎回来",
|
||||
"pageTitle": "开箱即用的大型中后台管理系统",
|
||||
"pageDesc": "工程化、高性能、跨组件库的前端模版",
|
||||
"loginSuccess": "登录成功",
|
||||
"loginSuccessDesc": "欢迎回来",
|
||||
"loginSubtitle": "请输入您的帐户信息以开始管理您的项目",
|
||||
"username": "账号",
|
||||
"password": "密码",
|
||||
"username-tip": "请输入用户名",
|
||||
"password-tip": "请输入密码",
|
||||
"remember-me": "记住账号",
|
||||
"create-an-account": "创建一个账号",
|
||||
"create-account": "创建账号",
|
||||
"already-account": "已经有账号了?",
|
||||
"account-tip": "还没有账号?",
|
||||
"sign-up": "注册",
|
||||
"sign-up-subtitle": "让您的应用程序管理变得简单而有趣",
|
||||
"comfirm-password": "确认密码",
|
||||
"comfirm-password-tip": "两次输入的密码不一致",
|
||||
"sign-up-agree": "我同意",
|
||||
"sign-up-privacy-policy": "隐私政策",
|
||||
"sign-up-terms": "条款",
|
||||
"sign-up-agree-tip": "请同意隐私政策和条款",
|
||||
"go-login": "去登录",
|
||||
"password-strength": "使用 8 个或更多字符,混合字母、数字和符号",
|
||||
"forget-password": "忘记密码?",
|
||||
"forget-password-subtitle": "输入您的电子邮件,我们将向您发送重置密码的连接",
|
||||
"email-tip": "请输入邮箱",
|
||||
"send-reset-link": "发送重置链接",
|
||||
"usernameTip": "请输入用户名",
|
||||
"passwordTip": "请输入密码",
|
||||
"rememberMe": "记住账号",
|
||||
"createAnAccount": "创建一个账号",
|
||||
"createAccount": "创建账号",
|
||||
"alreadyHaveAccount": "已经有账号了?",
|
||||
"accountTip": "还没有账号?",
|
||||
"signUp": "注册",
|
||||
"signUpSubtitle": "让您的应用程序管理变得简单而有趣",
|
||||
"confirmPassword": "确认密码",
|
||||
"confirmPasswordTip": "两次输入的密码不一致",
|
||||
"agree": "我同意",
|
||||
"agreeprivacyPolicy": "隐私政策",
|
||||
"terms": "条款",
|
||||
"agreeTip": "请同意隐私政策和条款",
|
||||
"goToLogin": "去登录",
|
||||
"passwordStrength": "使用 8 个或更多字符,混合字母、数字和符号",
|
||||
"forgetPassword": "忘记密码?",
|
||||
"forgetPasswordSubtitle": "输入您的电子邮件,我们将向您发送重置密码的连接",
|
||||
"emailTip": "请输入邮箱",
|
||||
"sendResetLink": "发送重置链接",
|
||||
"email": "邮箱",
|
||||
"qrcode-subtitle": "请用手机扫描二维码登录",
|
||||
"qrcode-prompt": "扫码后点击 '确认',即可完成登录",
|
||||
"qrcode-login": "扫码登录",
|
||||
"code-subtitle": "请输入您的手机号码以开始管理您的项目",
|
||||
"qrcodeSubtitle": "请用手机扫描二维码登录",
|
||||
"qrcodePrompt": "扫码后点击 '确认',即可完成登录",
|
||||
"qrcodeLogin": "扫码登录",
|
||||
"codeSubtitle": "请输入您的手机号码以开始管理您的项目",
|
||||
"code": "验证码",
|
||||
"code-tip": "请输入验证码",
|
||||
"codeTip": "请输入验证码",
|
||||
"mobile": "手机号码",
|
||||
"mobile-login": "手机号登录",
|
||||
"mobileLogin": "手机号登录",
|
||||
"mobile-tip": "请输入手机号码",
|
||||
"send-code": "获取验证码",
|
||||
"send-text": "{0}秒后重新获取",
|
||||
"third-party-login": "其他登录方式",
|
||||
"sendCode": "获取验证码",
|
||||
"sendText": "{0}秒后重新获取",
|
||||
"thirdPartyLogin": "其他登录方式",
|
||||
"layout": {
|
||||
"center": "居中",
|
||||
"align-left": "居左",
|
||||
"align-right": "居右"
|
||||
"alignLeft": "居左",
|
||||
"alignRight": "居右"
|
||||
}
|
||||
},
|
||||
"preferences": {
|
||||
"title": "偏好设置",
|
||||
"subtitle": "自定义偏好设置 & 实时预览",
|
||||
"reset-title": "重置偏好设置",
|
||||
"reset-tip": "数据有变化,点击可进行重置",
|
||||
"reset-success": "重置偏好设置成功",
|
||||
"resetTitle": "重置偏好设置",
|
||||
"resetTip": "数据有变化,点击可进行重置",
|
||||
"resetSuccess": "重置偏好设置成功",
|
||||
"appearance": "外观",
|
||||
"layout": "布局",
|
||||
"content": "内容",
|
||||
"other": "其它",
|
||||
"wide": "流式",
|
||||
"compact": "定宽",
|
||||
"follow-system": "跟随系统",
|
||||
"followSystem": "跟随系统",
|
||||
"vertical": "垂直",
|
||||
"vertical-tip": "侧边垂直菜单模式",
|
||||
"verticalTip": "侧边垂直菜单模式",
|
||||
"horizontal": "水平",
|
||||
"horizontal-tip": "水平菜单模式,菜单全部显示在顶部",
|
||||
"two-column": "双列菜单",
|
||||
"two-column-tip": "垂直双列菜单模式",
|
||||
"mixed-menu": "混合菜单",
|
||||
"mixed-menu-tip": "垂直水平菜单共存",
|
||||
"split-menu": "切割菜单",
|
||||
"full-content": "内容全屏",
|
||||
"full-content-tip": "不显示任何菜单,只显示内容主体",
|
||||
"interface-control": "界面布局控制",
|
||||
"normal": "默认",
|
||||
"horizontalTip": "水平菜单模式,菜单全部显示在顶部",
|
||||
"twoColumn": "双列菜单",
|
||||
"twoColumnTip": "垂直双列菜单模式",
|
||||
"mixedMenu": "混合菜单",
|
||||
"mixedMenuTip": "垂直水平菜单共存",
|
||||
"fullContent": "内容全屏",
|
||||
"fullContentTip": "不显示任何菜单,只显示内容主体",
|
||||
"normal": "常规",
|
||||
"plain": "朴素",
|
||||
"rounded": "圆润",
|
||||
"copy": "复制偏好设置",
|
||||
"copy-success": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖",
|
||||
"clear-and-logout": "清空缓存 & 退出登录",
|
||||
"copyPreferences": "复制偏好设置",
|
||||
"copyPreferencesSuccess": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖",
|
||||
"clearAndLogout": "清空缓存 & 退出登录",
|
||||
"mode": "模式",
|
||||
"logo-visible": "显示 Logo",
|
||||
"general": "通用",
|
||||
"language": "语言",
|
||||
"dynamic-title": "动态标题",
|
||||
"dynamicTitle": "动态标题",
|
||||
"sidebar": {
|
||||
"title": "侧边栏",
|
||||
"width": "宽度",
|
||||
"visible": "显示侧边栏",
|
||||
"collapsed": "折叠菜单",
|
||||
"collapsed-show-title": "显示菜单名"
|
||||
"collapsedShowTitle": "显示菜单名"
|
||||
},
|
||||
"tabbar": {
|
||||
"title": "标签栏",
|
||||
"enable": "启用标签栏",
|
||||
"icon": "显示标签栏图标",
|
||||
"persist": "持久化标签页",
|
||||
"context-menu": {
|
||||
"contextMenu": {
|
||||
"reload": "重新加载",
|
||||
"close": "关闭标签页",
|
||||
"pin": "固定标签页",
|
||||
"unpin": "取消固定标签页",
|
||||
"close-left": "关闭左侧标签页",
|
||||
"close-right": "关闭右侧标签页",
|
||||
"close-other": "关闭其它标签页",
|
||||
"close-all": "关闭全部标签页"
|
||||
"closeLeft": "关闭左侧标签页",
|
||||
"closeRight": "关闭右侧标签页",
|
||||
"closeOther": "关闭其它标签页",
|
||||
"closeAll": "关闭全部标签页"
|
||||
}
|
||||
},
|
||||
"navigation-menu": {
|
||||
"navigationMenu": {
|
||||
"title": "导航菜单",
|
||||
"style": "导航菜单风格",
|
||||
"accordion": "侧边导航菜单手风琴模式",
|
||||
"split": "导航菜单分离",
|
||||
"split-tip": "开启时,侧边栏显示顶栏对应菜单的子菜单"
|
||||
"splitTip": "开启时,侧边栏显示顶栏对应菜单的子菜单"
|
||||
},
|
||||
"breadcrumb": {
|
||||
"title": "面包屑导航",
|
||||
@ -182,7 +179,7 @@
|
||||
"icon": "显示面包屑图标",
|
||||
"home": "显示首页按钮",
|
||||
"style": "面包屑风格",
|
||||
"hide-only-one": "仅有一个时隐藏",
|
||||
"hideOnlyOne": "仅有一个时隐藏",
|
||||
"background": "背景"
|
||||
},
|
||||
"animation": {
|
||||
@ -196,19 +193,19 @@
|
||||
"radius": "圆角",
|
||||
"light": "浅色",
|
||||
"dark": "深色",
|
||||
"dark-menu": "深色菜单",
|
||||
"weak-mode": "色弱模式",
|
||||
"gray-mode": "灰色模式",
|
||||
"darkMenu": "深色菜单",
|
||||
"weakMode": "色弱模式",
|
||||
"grayMode": "灰色模式",
|
||||
"builtin": {
|
||||
"title": "内置主题",
|
||||
"default": "默认",
|
||||
"violet": "紫罗兰",
|
||||
"pink": "樱花粉",
|
||||
"rose": "玫瑰红",
|
||||
"sky-blue": "天蓝色",
|
||||
"deep-blue": "深蓝色",
|
||||
"skyBlue": "天蓝色",
|
||||
"deepBlue": "深蓝色",
|
||||
"green": "浅绿色",
|
||||
"deep-green": "深绿色",
|
||||
"deepGreen": "深绿色",
|
||||
"orange": "橙黄色",
|
||||
"yellow": "柠檬黄",
|
||||
"zinc": "锌色灰",
|
||||
@ -220,10 +217,10 @@
|
||||
},
|
||||
"header": {
|
||||
"title": "顶栏",
|
||||
"mode-static": "静止",
|
||||
"mode-fixed": "固定",
|
||||
"mode-auto": "自动隐藏和显示",
|
||||
"mode-auto-scroll": "滚动隐藏和显示",
|
||||
"modeStatic": "静止",
|
||||
"modeFixed": "固定",
|
||||
"modeAuto": "自动隐藏和显示",
|
||||
"modeAutoScroll": "滚动隐藏和显示",
|
||||
"visible": "显示顶栏"
|
||||
},
|
||||
"footer": {
|
||||
@ -234,13 +231,13 @@
|
||||
"copyright": {
|
||||
"title": "版权",
|
||||
"enable": "启用版权",
|
||||
"company-name": "公司名",
|
||||
"company-site-link": "公司主页",
|
||||
"companyName": "公司名",
|
||||
"companySiteLink": "公司主页",
|
||||
"date": "日期",
|
||||
"icp": "ICP 备案号",
|
||||
"icp-link": "ICP 网站链接"
|
||||
"icpLink": "ICP 网站链接"
|
||||
},
|
||||
"shortcut-keys": {
|
||||
"shortcutKeys": {
|
||||
"title": "快捷键",
|
||||
"global": "全局",
|
||||
"search": "全局搜索",
|
||||
@ -249,13 +246,13 @@
|
||||
},
|
||||
"widget": {
|
||||
"title": "小部件",
|
||||
"global-search": "启用全局搜索",
|
||||
"globalSearch": "启用全局搜索",
|
||||
"fullscreen": "启用全屏",
|
||||
"theme-toggle": "启用主题切换",
|
||||
"language-toggle": "启用语言切换",
|
||||
"themeToggle": "启用主题切换",
|
||||
"languageToggle": "启用语言切换",
|
||||
"notification": "启用通知",
|
||||
"sidebar-toggle": "启用侧边栏切换",
|
||||
"ai-assistant": "启用 AI 助手"
|
||||
"sidebarToggle": "启用侧边栏切换",
|
||||
"aiAssistant": "启用 AI 助手"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@ant-design/colors": "^7.1.0",
|
||||
"@ctrl/tinycolor": "4.1.0"
|
||||
"@ctrl/tinycolor": "^4.1.0"
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@vue/shared": "^3.4.31",
|
||||
"clsx": "2.1.1",
|
||||
"clsx": "^2.1.1",
|
||||
"defu": "^6.1.4",
|
||||
"lodash.clonedeep": "^4.5.0",
|
||||
"nprogress": "^0.2.0",
|
||||
|
@ -49,10 +49,10 @@ const appName = computed(() => preferences.app.name);
|
||||
<div class="flex-col-center -enter-x mr-20 h-full">
|
||||
<SloganIcon :alt="appName" class="animate-float h-64 w-2/5" />
|
||||
<div class="text-1xl mt-6 font-sans text-white lg:text-2xl">
|
||||
{{ $t('authentication.page-title') }}
|
||||
{{ $t('authentication.pageTitle') }}
|
||||
</div>
|
||||
<div class="dark:text-muted-foreground mt-2 text-white/60">
|
||||
{{ $t('authentication.page-desc') }}
|
||||
{{ $t('authentication.pageDesc') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -117,7 +117,7 @@ function useTabs() {
|
||||
},
|
||||
icon: IcRoundRefresh,
|
||||
key: 'reload',
|
||||
text: $t('preferences.tabbar.context-menu.reload'),
|
||||
text: $t('preferences.tabbar.contextMenu.reload'),
|
||||
},
|
||||
{
|
||||
disabled: !!affixTab || disabled,
|
||||
@ -126,7 +126,7 @@ function useTabs() {
|
||||
},
|
||||
icon: IcRoundClose,
|
||||
key: 'close',
|
||||
text: $t('preferences.tabbar.context-menu.close'),
|
||||
text: $t('preferences.tabbar.contextMenu.close'),
|
||||
},
|
||||
{
|
||||
handler: async () => {
|
||||
@ -138,8 +138,8 @@ function useTabs() {
|
||||
key: 'affix',
|
||||
separator: true,
|
||||
text: affixTab
|
||||
? $t('preferences.tabbar.context-menu.unpin')
|
||||
: $t('preferences.tabbar.context-menu.pin'),
|
||||
? $t('preferences.tabbar.contextMenu.unpin')
|
||||
: $t('preferences.tabbar.contextMenu.pin'),
|
||||
},
|
||||
{
|
||||
disabled: closeLeftDisabled,
|
||||
@ -148,7 +148,7 @@ function useTabs() {
|
||||
},
|
||||
icon: MdiFormatHorizontalAlignLeft,
|
||||
key: 'close-left',
|
||||
text: $t('preferences.tabbar.context-menu.close-left'),
|
||||
text: $t('preferences.tabbar.contextMenu.closeLeft'),
|
||||
},
|
||||
{
|
||||
disabled: closeRightDisabled,
|
||||
@ -158,7 +158,7 @@ function useTabs() {
|
||||
icon: MdiFormatHorizontalAlignRight,
|
||||
key: 'close-right',
|
||||
separator: true,
|
||||
text: $t('preferences.tabbar.context-menu.close-right'),
|
||||
text: $t('preferences.tabbar.contextMenu.closeRight'),
|
||||
},
|
||||
{
|
||||
disabled: closeOtherDisabled,
|
||||
@ -167,7 +167,7 @@ function useTabs() {
|
||||
},
|
||||
icon: MdiArrowExpandHorizontal,
|
||||
key: 'close-other',
|
||||
text: $t('preferences.tabbar.context-menu.close-other'),
|
||||
text: $t('preferences.tabbar.contextMenu.closeOther'),
|
||||
},
|
||||
{
|
||||
disabled,
|
||||
@ -176,7 +176,7 @@ function useTabs() {
|
||||
},
|
||||
icon: IcRoundMultipleStop,
|
||||
key: 'close-all',
|
||||
text: $t('preferences.tabbar.context-menu.close-all'),
|
||||
text: $t('preferences.tabbar.contextMenu.closeAll'),
|
||||
},
|
||||
// {
|
||||
// icon: 'icon-[material-symbols--back-to-tab-sharp]',
|
||||
|
@ -116,7 +116,7 @@ onMounted(() => {
|
||||
<IcRoundSearch class="mt-1 size-4" />
|
||||
<input
|
||||
v-model="keyword"
|
||||
:placeholder="$t('widgets.search.search-navigate')"
|
||||
:placeholder="$t('widgets.search.searchNavigate')"
|
||||
class="ring-none placeholder:text-muted-foreground w-[80%] rounded-md border border-none bg-transparent p-2 text-sm outline-none ring-0 ring-offset-transparent focus-visible:ring-transparent"
|
||||
/>
|
||||
</DialogTitle>
|
||||
|
@ -223,7 +223,7 @@ onMounted(() => {
|
||||
>
|
||||
<IcRoundSearchOff class="size-12" />
|
||||
<p class="my-10 text-xs">
|
||||
{{ $t('widgets.search.no-results') }}
|
||||
{{ $t('widgets.search.noResults') }}
|
||||
<span class="text-foreground text-sm font-medium">
|
||||
"{{ keyword }}"
|
||||
</span>
|
||||
@ -235,7 +235,7 @@ onMounted(() => {
|
||||
class="text-muted-foreground text-center"
|
||||
>
|
||||
<p class="my-10 text-xs">
|
||||
{{ $t('widgets.search.no-recent') }}
|
||||
{{ $t('widgets.search.noRecent') }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
@ -21,7 +21,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
|
||||
{
|
||||
icon: MdiDockLeft,
|
||||
key: 'panel-left',
|
||||
text: $t('authentication.layout.align-left'),
|
||||
text: $t('authentication.layout.alignLeft'),
|
||||
},
|
||||
{
|
||||
icon: MdiDockBottom,
|
||||
@ -31,7 +31,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
|
||||
{
|
||||
icon: MdiDockRight,
|
||||
key: 'panel-right',
|
||||
text: $t('authentication.layout.align-right'),
|
||||
text: $t('authentication.layout.alignRight'),
|
||||
},
|
||||
]);
|
||||
|
||||
|
@ -84,7 +84,7 @@ function handleClick(item: NotificationItem) {
|
||||
<div class="flex items-center justify-between p-4 py-3">
|
||||
<div class="text-foreground">{{ $t('widgets.notifications') }}</div>
|
||||
<VbenIconButton
|
||||
:tooltip="$t('widgets.make-all-as-read')"
|
||||
:tooltip="$t('widgets.markAllAsRead')"
|
||||
@click="handleMakeAll"
|
||||
>
|
||||
<IcRoundMarkEmailRead />
|
||||
@ -127,7 +127,7 @@ function handleClick(item: NotificationItem) {
|
||||
|
||||
<template v-else>
|
||||
<div class="flex-center text-muted-foreground min-h-[150px] w-full">
|
||||
{{ $t('common.not-data') }}
|
||||
{{ $t('common.noData') }}
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -135,10 +135,10 @@ function handleClick(item: NotificationItem) {
|
||||
class="border-border flex items-center justify-between border-t px-4 py-3"
|
||||
>
|
||||
<VbenButton size="sm" variant="ghost" @click="handleClear">
|
||||
{{ $t('widgets.clear-notifications') }}
|
||||
{{ $t('widgets.clearNotifications') }}
|
||||
</VbenButton>
|
||||
<VbenButton size="sm" @click="handleViewAll">
|
||||
{{ $t('widgets.view-all') }}
|
||||
{{ $t('widgets.viewAll') }}
|
||||
</VbenButton>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -25,6 +25,6 @@ const localeItems: SelectListItem[] = SUPPORT_LANGUAGES.map((item) => ({
|
||||
{{ $t('preferences.language') }}
|
||||
</SelectItem>
|
||||
<SwitchItem v-model="appDynamicTitle">
|
||||
{{ $t('preferences.dynamic-title') }}
|
||||
{{ $t('preferences.dynamicTitle') }}
|
||||
</SwitchItem>
|
||||
</template>
|
||||
|
@ -35,7 +35,7 @@ const disableItem = computed(() => {
|
||||
{{ $t('preferences.breadcrumb.enable') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="breadcrumbHideOnlyOne" :disabled="disableItem">
|
||||
{{ $t('preferences.breadcrumb.hide-only-one') }}
|
||||
{{ $t('preferences.breadcrumb.hideOnlyOne') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="breadcrumbShowIcon" :disabled="disableItem">
|
||||
{{ $t('preferences.breadcrumb.icon') }}
|
||||
|
@ -30,10 +30,10 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
|
||||
</SwitchItem>
|
||||
|
||||
<InputItem v-model="copyrightCompanyName" :disabled="itemDisabled">
|
||||
{{ $t('preferences.copyright.company-name') }}
|
||||
{{ $t('preferences.copyright.companyName') }}
|
||||
</InputItem>
|
||||
<InputItem v-model="copyrightCompanySiteLink" :disabled="itemDisabled">
|
||||
{{ $t('preferences.copyright.company-site-link') }}
|
||||
{{ $t('preferences.copyright.companySiteLink') }}
|
||||
</InputItem>
|
||||
<InputItem v-model="copyrightDate" :disabled="itemDisabled">
|
||||
{{ $t('preferences.copyright.date') }}
|
||||
@ -43,6 +43,6 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
|
||||
{{ $t('preferences.copyright.icp') }}
|
||||
</InputItem>
|
||||
<InputItem v-model="copyrightIcpLink" :disabled="itemDisabled">
|
||||
{{ $t('preferences.copyright.icp-link') }}
|
||||
{{ $t('preferences.copyright.icpLink') }}
|
||||
</InputItem>
|
||||
</template>
|
||||
|
@ -17,19 +17,19 @@ const headerMode = defineModel<LayoutHeaderModeType>('headerMode');
|
||||
|
||||
const localeItems: SelectListItem[] = [
|
||||
{
|
||||
label: $t('preferences.header.mode-static'),
|
||||
label: $t('preferences.header.modeStatic'),
|
||||
value: 'static',
|
||||
},
|
||||
{
|
||||
label: $t('preferences.header.mode-fixed'),
|
||||
label: $t('preferences.header.modeFixed'),
|
||||
value: 'fixed',
|
||||
},
|
||||
{
|
||||
label: $t('preferences.header.mode-auto'),
|
||||
label: $t('preferences.header.modeAuto'),
|
||||
value: 'auto',
|
||||
},
|
||||
{
|
||||
label: $t('preferences.header.mode-auto-scroll'),
|
||||
label: $t('preferences.header.modeAutoScroll'),
|
||||
value: 'auto-scroll',
|
||||
},
|
||||
];
|
||||
|
@ -38,27 +38,27 @@ const components: Record<LayoutType, Component> = {
|
||||
const PRESET = computed((): PresetItem[] => [
|
||||
{
|
||||
name: $t('preferences.vertical'),
|
||||
tip: $t('preferences.vertical-tip'),
|
||||
tip: $t('preferences.verticalTip'),
|
||||
type: 'sidebar-nav',
|
||||
},
|
||||
{
|
||||
name: $t('preferences.two-column'),
|
||||
tip: $t('preferences.two-column-tip'),
|
||||
name: $t('preferences.twoColumn'),
|
||||
tip: $t('preferences.twoColumnTip'),
|
||||
type: 'sidebar-mixed-nav',
|
||||
},
|
||||
{
|
||||
name: $t('preferences.horizontal'),
|
||||
tip: $t('preferences.vertical-tip'),
|
||||
tip: $t('preferences.horizontalTip'),
|
||||
type: 'header-nav',
|
||||
},
|
||||
{
|
||||
name: $t('preferences.mixed-menu'),
|
||||
tip: $t('preferences.mixed-menu-tip'),
|
||||
name: $t('preferences.mixedMenu'),
|
||||
tip: $t('preferences.mixedMenuTip'),
|
||||
type: 'mixed-nav',
|
||||
},
|
||||
{
|
||||
name: $t('preferences.full-content'),
|
||||
tip: $t('preferences.full-content-tip'),
|
||||
name: $t('preferences.fullContent'),
|
||||
tip: $t('preferences.fullContentTip'),
|
||||
type: 'full-content',
|
||||
},
|
||||
]);
|
||||
|
@ -28,18 +28,18 @@ const stylesItems: SelectListItem[] = [
|
||||
:disabled="disabled"
|
||||
:items="stylesItems"
|
||||
>
|
||||
{{ $t('preferences.navigation-menu.style') }}
|
||||
{{ $t('preferences.navigationMenu.style') }}
|
||||
</ToggleItem>
|
||||
<SwitchItem
|
||||
v-model="navigationSplit"
|
||||
:disabled="disabledNavigationSplit || disabled"
|
||||
>
|
||||
{{ $t('preferences.navigation-menu.split') }}
|
||||
{{ $t('preferences.navigationMenu.split') }}
|
||||
<template #tip>
|
||||
{{ $t('preferences.navigation-menu.split-tip') }}
|
||||
{{ $t('preferences.navigationMenu.splitTip') }}
|
||||
</template>
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="navigationAccordion" :disabled="disabled">
|
||||
{{ $t('preferences.navigation-menu.accordion') }}
|
||||
{{ $t('preferences.navigationMenu.accordion') }}
|
||||
</SwitchItem>
|
||||
</template>
|
||||
|
@ -29,7 +29,7 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
|
||||
v-model="sidebarCollapsedShowTitle"
|
||||
:disabled="!sidebarEnable || disabled"
|
||||
>
|
||||
{{ $t('preferences.sidebar.collapsed-show-title') }}
|
||||
{{ $t('preferences.sidebar.collapsedShowTitle') }}
|
||||
</SwitchItem>
|
||||
<NumberFieldItem
|
||||
v-model="sidebarWidth"
|
||||
|
@ -18,13 +18,13 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
|
||||
|
||||
<template>
|
||||
<SwitchItem v-model="widgetGlobalSearch">
|
||||
{{ $t('preferences.widget.global-search') }}
|
||||
{{ $t('preferences.widget.globalSearch') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="widgetThemeToggle">
|
||||
{{ $t('preferences.widget.theme-toggle') }}
|
||||
{{ $t('preferences.widget.themeToggle') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="widgetLanguageToggle">
|
||||
{{ $t('preferences.widget.language-toggle') }}
|
||||
{{ $t('preferences.widget.languageToggle') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="widgetFullscreen">
|
||||
{{ $t('preferences.widget.fullscreen') }}
|
||||
@ -33,9 +33,9 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
|
||||
{{ $t('preferences.widget.notification') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="widgetAiAssistant">
|
||||
{{ $t('preferences.widget.ai-assistant') }}
|
||||
{{ $t('preferences.widget.aiAssistant') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="widgetSidebarToggle">
|
||||
{{ $t('preferences.widget.sidebar-toggle') }}
|
||||
{{ $t('preferences.widget.sidebarToggle') }}
|
||||
</SwitchItem>
|
||||
</template>
|
||||
|
@ -22,21 +22,21 @@ const altView = computed(() => (isWindowsOs() ? 'Alt' : '⌥'));
|
||||
|
||||
<template>
|
||||
<SwitchItem v-model="shortcutKeysEnable">
|
||||
{{ $t('preferences.shortcut-keys.title') }}
|
||||
{{ $t('preferences.shortcutKeys.title') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysGlobalSearch">
|
||||
{{ $t('preferences.shortcut-keys.search') }}
|
||||
{{ $t('preferences.shortcutKeys.search') }}
|
||||
<template #shortcut>
|
||||
{{ isWindowsOs() ? 'Ctrl' : '⌘' }}
|
||||
<kbd> K </kbd>
|
||||
</template>
|
||||
</SwitchItem>
|
||||
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysLogout">
|
||||
{{ $t('preferences.shortcut-keys.logout') }}
|
||||
{{ $t('preferences.shortcutKeys.logout') }}
|
||||
<template #shortcut> {{ altView }} Q </template>
|
||||
</SwitchItem>
|
||||
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysPreferences">
|
||||
{{ $t('preferences.shortcut-keys.preferences') }}
|
||||
{{ $t('preferences.shortcutKeys.preferences') }}
|
||||
<template #shortcut> {{ altView }} , </template>
|
||||
</SwitchItem>
|
||||
</template>
|
||||
|
@ -40,17 +40,17 @@ function typeView(name: BuiltinThemeType) {
|
||||
return $t('preferences.theme.builtin.rose');
|
||||
}
|
||||
case 'sky-blue': {
|
||||
return $t('preferences.theme.builtin.sky-blue');
|
||||
return $t('preferences.theme.builtin.skyBlue');
|
||||
}
|
||||
case 'deep-blue': {
|
||||
return $t('preferences.theme.builtin.deep-blue');
|
||||
return $t('preferences.theme.builtin.deepBlue');
|
||||
}
|
||||
|
||||
case 'green': {
|
||||
return $t('preferences.theme.builtin.green');
|
||||
}
|
||||
case 'deep-green': {
|
||||
return $t('preferences.theme.builtin.deep-green');
|
||||
return $t('preferences.theme.builtin.deepGreen');
|
||||
}
|
||||
case 'orange': {
|
||||
return $t('preferences.theme.builtin.orange');
|
||||
|
@ -18,9 +18,9 @@ const appColorGrayMode = defineModel<boolean>('appColorGrayMode', {
|
||||
|
||||
<template>
|
||||
<SwitchItem v-model="appColorWeakMode">
|
||||
{{ $t('preferences.theme.weak-mode') }}
|
||||
{{ $t('preferences.theme.weakMode') }}
|
||||
</SwitchItem>
|
||||
<SwitchItem v-model="appColorGrayMode">
|
||||
{{ $t('preferences.theme.gray-mode') }}
|
||||
{{ $t('preferences.theme.grayMode') }}
|
||||
</SwitchItem>
|
||||
</template>
|
||||
|
@ -49,7 +49,7 @@ function nameView(name: string) {
|
||||
return $t('preferences.theme.dark');
|
||||
}
|
||||
case 'auto': {
|
||||
return $t('preferences.follow-system');
|
||||
return $t('preferences.followSystem');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -79,7 +79,7 @@ function nameView(name: string) {
|
||||
:disabled="modelValue !== 'light'"
|
||||
class="mt-6"
|
||||
>
|
||||
{{ $t('preferences.theme.dark-menu') }}
|
||||
{{ $t('preferences.theme.darkMenu') }}
|
||||
</SwitchItem>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -162,7 +162,7 @@ const tabs = computed((): SegmentedItem[] => {
|
||||
value: 'layout',
|
||||
},
|
||||
{
|
||||
label: $t('preferences.shortcut-keys.title'),
|
||||
label: $t('preferences.shortcutKeys.title'),
|
||||
value: 'shortcutKey',
|
||||
},
|
||||
{
|
||||
@ -187,8 +187,8 @@ async function handleCopy() {
|
||||
await copy(JSON.stringify(diffPreference.value, null, 2));
|
||||
|
||||
toast({
|
||||
description: $t('preferences.copy'),
|
||||
title: $t('preferences.copy-success'),
|
||||
description: $t('preferences.copyPreferences'),
|
||||
title: $t('preferences.copyPreferencesSuccess'),
|
||||
});
|
||||
}
|
||||
|
||||
@ -205,12 +205,8 @@ async function handleReset() {
|
||||
resetPreferences();
|
||||
await loadLocaleMessages(preferences.app.locale);
|
||||
toast({
|
||||
description: $t('preferences.reset-title'),
|
||||
title: $t('preferences.reset-success'),
|
||||
});
|
||||
toast({
|
||||
description: $t('preferences.reset-title'),
|
||||
title: $t('preferences.reset-success'),
|
||||
description: $t('preferences.resetTitle'),
|
||||
title: $t('preferences.resetSuccess'),
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@ -236,7 +232,7 @@ async function handleReset() {
|
||||
<div class="flex items-center">
|
||||
<VbenIconButton
|
||||
:disabled="!diffPreference"
|
||||
:tooltip="$t('preferences.reset-tip')"
|
||||
:tooltip="$t('preferences.resetTip')"
|
||||
class="relative"
|
||||
>
|
||||
<span
|
||||
@ -323,7 +319,7 @@ async function handleReset() {
|
||||
/>
|
||||
</Block>
|
||||
|
||||
<Block :title="$t('preferences.navigation-menu.title')">
|
||||
<Block :title="$t('preferences.navigationMenu.title')">
|
||||
<Navigation
|
||||
v-model:navigation-accordion="navigationAccordion"
|
||||
v-model:navigation-split="navigationSplit"
|
||||
@ -384,7 +380,7 @@ async function handleReset() {
|
||||
</template>
|
||||
|
||||
<template #shortcutKey>
|
||||
<Block :title="$t('preferences.shortcut-keys.global')">
|
||||
<Block :title="$t('preferences.shortcutKeys.global')">
|
||||
<GlobalShortcutKeys
|
||||
v-model:shortcut-keys-enable="shortcutKeysEnable"
|
||||
v-model:shortcut-keys-global-search="shortcutKeysGlobalSearch"
|
||||
@ -407,7 +403,7 @@ async function handleReset() {
|
||||
@click="handleClearCache"
|
||||
>
|
||||
<IcRoundRestartAlt class="mr-2 size-4" />
|
||||
{{ $t('preferences.clear-and-logout') }}
|
||||
{{ $t('preferences.clearAndLogout') }}
|
||||
</VbenButton>
|
||||
<VbenButton
|
||||
:disabled="!diffPreference"
|
||||
@ -417,7 +413,7 @@ async function handleReset() {
|
||||
@click="handleCopy"
|
||||
>
|
||||
<IcRoundFolderCopy class="mr-2 size-3" />
|
||||
{{ $t('preferences.copy') }}
|
||||
{{ $t('preferences.copyPreferences') }}
|
||||
</VbenButton>
|
||||
</template>
|
||||
</VbenSheet>
|
||||
|
@ -49,7 +49,7 @@ const PRESETS = [
|
||||
{
|
||||
icon: IcRoundMotionPhotosAuto,
|
||||
name: 'auto',
|
||||
title: $t('preferences.follow-system'),
|
||||
title: $t('preferences.followSystem'),
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
@ -121,7 +121,7 @@ if (enableShortcutKey.value) {
|
||||
<VbenAlertDialog
|
||||
v-model:open="openDialog"
|
||||
:cancel-text="$t('common.cancel')"
|
||||
:content="$t('widgets.logout-tip')"
|
||||
:content="$t('widgets.logoutTip')"
|
||||
:submit-text="$t('common.confirm')"
|
||||
:title="$t('common.prompt')"
|
||||
@submit="handleSubmitLogout"
|
||||
|
@ -52,8 +52,8 @@ const isValidPhoneNumber = computed(() => {
|
||||
|
||||
const btnText = computed(() => {
|
||||
return countdown.value > 0
|
||||
? $t('authentication.send-text', [countdown.value])
|
||||
: $t('authentication.send-code');
|
||||
? $t('authentication.sendText', [countdown.value])
|
||||
: $t('authentication.sendCode');
|
||||
});
|
||||
const btnLoading = computed(() => {
|
||||
return countdown.value > 0;
|
||||
@ -117,10 +117,10 @@ onBeforeUnmount(() => {
|
||||
<template>
|
||||
<div>
|
||||
<Title>
|
||||
{{ $t('authentication.welcome-back') }} 📲
|
||||
{{ $t('authentication.welcomeBack') }} 📲
|
||||
<template #desc>
|
||||
<span class="text-muted-foreground">
|
||||
{{ $t('authentication.code-subtitle') }}
|
||||
{{ $t('authentication.codeSubtitle') }}
|
||||
</span>
|
||||
</template>
|
||||
</Title>
|
||||
@ -140,7 +140,7 @@ onBeforeUnmount(() => {
|
||||
:btn-loading="btnLoading"
|
||||
:btn-text="btnText"
|
||||
:code-length="4"
|
||||
:error-tip="$t('authentication.code-tip')"
|
||||
:error-tip="$t('authentication.codeTip')"
|
||||
:handle-send-code="handleSendCode"
|
||||
:label="$t('authentication.code')"
|
||||
:placeholder="$t('authentication.code')"
|
||||
|
@ -58,15 +58,15 @@ function goLogin() {
|
||||
<template>
|
||||
<div>
|
||||
<Title>
|
||||
{{ $t('authentication.forget-password') }} 🤦🏻♂️
|
||||
{{ $t('authentication.forgetPassword') }} 🤦🏻♂️
|
||||
<template #desc>
|
||||
{{ $t('authentication.forget-password-subtitle') }}
|
||||
{{ $t('authentication.forgetPasswordSubtitle') }}
|
||||
</template>
|
||||
</Title>
|
||||
<div class="mb-6">
|
||||
<VbenInput
|
||||
v-model="formState.email"
|
||||
:error-tip="$t('authentication.email-tip')"
|
||||
:error-tip="$t('authentication.emailTip')"
|
||||
:label="$t('authentication.email')"
|
||||
:status="emailStatus"
|
||||
autofocus
|
||||
@ -77,7 +77,7 @@ function goLogin() {
|
||||
</div>
|
||||
<div>
|
||||
<VbenButton class="mt-2 w-full" @click="handleSubmut">
|
||||
{{ $t('authentication.send-reset-link') }}
|
||||
{{ $t('authentication.sendResetLink') }}
|
||||
</VbenButton>
|
||||
<VbenButton class="mt-4 w-full" variant="outline" @click="goLogin()">
|
||||
{{ $t('common.back') }}
|
||||
|
@ -150,10 +150,10 @@ function handleGo(path: string) {
|
||||
<template>
|
||||
<div @keypress.enter.prevent="handleSubmit">
|
||||
<Title>
|
||||
{{ $t('authentication.welcome-back') }} 👋🏻
|
||||
{{ $t('authentication.welcomeBack') }} 👋🏻
|
||||
<template #desc>
|
||||
<span class="text-muted-foreground">
|
||||
{{ $t('authentication.login-subtitle') }}
|
||||
{{ $t('authentication.loginSubtitle') }}
|
||||
</span>
|
||||
</template>
|
||||
</Title>
|
||||
@ -161,7 +161,7 @@ function handleGo(path: string) {
|
||||
<VbenInput
|
||||
v-model="formState.username"
|
||||
:autofocus="false"
|
||||
:error-tip="$t('authentication.username-tip')"
|
||||
:error-tip="$t('authentication.usernameTip')"
|
||||
:label="$t('authentication.username')"
|
||||
:placeholder="usernamePlaceholder || $t('authentication.username')"
|
||||
:status="usernameStatus"
|
||||
@ -171,7 +171,7 @@ function handleGo(path: string) {
|
||||
/>
|
||||
<VbenInputPassword
|
||||
v-model="formState.password"
|
||||
:error-tip="$t('authentication.password-tip')"
|
||||
:error-tip="$t('authentication.passwordTip')"
|
||||
:label="$t('authentication.password')"
|
||||
:placeholder="passwordPlaceholder || $t('authentication.password')"
|
||||
:status="passwordStatus"
|
||||
@ -183,7 +183,7 @@ function handleGo(path: string) {
|
||||
<div class="mb-6 mt-4 flex justify-between">
|
||||
<div class="flex-center flex">
|
||||
<VbenCheckbox v-model:checked="formState.rememberMe" name="rememberMe">
|
||||
{{ $t('authentication.remember-me') }}
|
||||
{{ $t('authentication.rememberMe') }}
|
||||
</VbenCheckbox>
|
||||
</div>
|
||||
|
||||
@ -192,7 +192,7 @@ function handleGo(path: string) {
|
||||
class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
|
||||
@click="handleGo(forgetPasswordPath)"
|
||||
>
|
||||
{{ $t('authentication.forget-password') }}
|
||||
{{ $t('authentication.forgetPassword') }}
|
||||
</span>
|
||||
|
||||
<!-- <VbenButton variant="ghost" @click="handleGo('/auth/forget-password')">
|
||||
@ -210,7 +210,7 @@ function handleGo(path: string) {
|
||||
variant="outline"
|
||||
@click="handleGo(codeLoginPath)"
|
||||
>
|
||||
{{ $t('authentication.mobile-login') }}
|
||||
{{ $t('authentication.mobileLogin') }}
|
||||
</VbenButton>
|
||||
<VbenButton
|
||||
v-if="showQrcodeLogin"
|
||||
@ -218,7 +218,7 @@ function handleGo(path: string) {
|
||||
variant="outline"
|
||||
@click="handleGo(qrCodeLoginPath)"
|
||||
>
|
||||
{{ $t('authentication.qrcode-login') }}
|
||||
{{ $t('authentication.qrcodeLogin') }}
|
||||
</VbenButton>
|
||||
<!-- <VbenButton
|
||||
:loading="loading"
|
||||
@ -234,12 +234,12 @@ function handleGo(path: string) {
|
||||
<ThirdPartyLogin v-if="showThirdPartyLogin" />
|
||||
|
||||
<div v-if="showRegister" class="text-center text-sm">
|
||||
{{ $t('authentication.account-tip') }}
|
||||
{{ $t('authentication.accountTip') }}
|
||||
<span
|
||||
class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
|
||||
@click="handleGo(registerPath)"
|
||||
>
|
||||
{{ $t('authentication.create-account') }}
|
||||
{{ $t('authentication.createAccount') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -47,10 +47,10 @@ function goLogin() {
|
||||
<template>
|
||||
<div>
|
||||
<Title>
|
||||
{{ $t('authentication.welcome-back') }} 📱
|
||||
{{ $t('authentication.welcomeBack') }} 📱
|
||||
<template #desc>
|
||||
<span class="text-muted-foreground">
|
||||
{{ $t('authentication.qrcode-subtitle') }}
|
||||
{{ $t('authentication.qrcodeSubtitle') }}
|
||||
</span>
|
||||
</template>
|
||||
</Title>
|
||||
@ -58,7 +58,7 @@ function goLogin() {
|
||||
<div class="flex-col-center mt-6">
|
||||
<img :src="qrcode" alt="qrcode" class="w-1/2" />
|
||||
<p class="text-muted-foreground mt-4 text-sm">
|
||||
{{ $t('authentication.qrcode-prompt') }}
|
||||
{{ $t('authentication.qrcodePrompt') }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
@ -86,12 +86,12 @@ function goLogin() {
|
||||
<template>
|
||||
<div>
|
||||
<Title>
|
||||
{{ $t('authentication.create-an-account') }} 🚀
|
||||
<template #desc> {{ $t('authentication.sign-up-subtitle') }} </template>
|
||||
{{ $t('authentication.createAnAccount') }} 🚀
|
||||
<template #desc> {{ $t('authentication.signUpSubtitle') }} </template>
|
||||
</Title>
|
||||
<VbenInput
|
||||
v-model="formState.username"
|
||||
:error-tip="$t('authentication.username-tip')"
|
||||
:error-tip="$t('authentication.usernameTip')"
|
||||
:label="$t('authentication.username')"
|
||||
:placeholder="$t('authentication.username')"
|
||||
:status="usernameStatus"
|
||||
@ -101,7 +101,7 @@ function goLogin() {
|
||||
<!-- Use 8 or more characters with a mix of letters, numbers & symbols. -->
|
||||
<VbenInputPassword
|
||||
v-model="formState.password"
|
||||
:error-tip="$t('authentication.password-tip')"
|
||||
:error-tip="$t('authentication.passwordTip')"
|
||||
:label="$t('authentication.password')"
|
||||
:password-strength="true"
|
||||
:placeholder="$t('authentication.password')"
|
||||
@ -111,15 +111,15 @@ function goLogin() {
|
||||
type="password"
|
||||
>
|
||||
<template #strengthText>
|
||||
{{ $t('authentication.password-strength') }}
|
||||
{{ $t('authentication.passwordStrength') }}
|
||||
</template>
|
||||
</VbenInputPassword>
|
||||
|
||||
<VbenInputPassword
|
||||
v-model="formState.comfirmPassword"
|
||||
:error-tip="$t('authentication.comfirm-password-tip')"
|
||||
:label="$t('authentication.comfirm-password')"
|
||||
:placeholder="$t('authentication.comfirm-password')"
|
||||
:error-tip="$t('authentication.confirmPasswordTip')"
|
||||
:label="$t('authentication.confirmPassword')"
|
||||
:placeholder="$t('authentication.confirmPassword')"
|
||||
:status="comfirmPasswordStatus"
|
||||
name="comfirmPassword"
|
||||
required
|
||||
@ -132,13 +132,13 @@ function goLogin() {
|
||||
v-model:checked="formState.agreePolicy"
|
||||
name="agreePolicy"
|
||||
>
|
||||
{{ $t('authentication.sign-up-agree') }}
|
||||
{{ $t('authentication.agree') }}
|
||||
<span class="text-primary hover:text-primary-hover">{{
|
||||
$t('authentication.sign-up-privacy-policy')
|
||||
$t('authentication.agreeprivacyPolicy')
|
||||
}}</span>
|
||||
&
|
||||
<span class="text-primary hover:text-primary-hover">
|
||||
{{ $t('authentication.sign-up-terms') }}
|
||||
{{ $t('authentication.terms') }}
|
||||
</span>
|
||||
</VbenCheckbox>
|
||||
</div>
|
||||
@ -147,22 +147,22 @@ function goLogin() {
|
||||
v-show="formState.submitted && !formState.agreePolicy"
|
||||
class="text-destructive absolute bottom-1 left-0 text-xs"
|
||||
>
|
||||
{{ $t('authentication.sign-up-agree-tip') }}
|
||||
{{ $t('authentication.agreeTip') }}
|
||||
</p>
|
||||
</Transition>
|
||||
</div>
|
||||
<div>
|
||||
<VbenButton :loading="loading" class="w-full" @click="handleSubmit">
|
||||
{{ $t('authentication.sign-up') }}
|
||||
{{ $t('authentication.signUp') }}
|
||||
</VbenButton>
|
||||
</div>
|
||||
<div class="mt-4 text-center text-sm">
|
||||
{{ $t('authentication.already-account') }}
|
||||
{{ $t('authentication.alreadyHaveAccount') }}
|
||||
<span
|
||||
class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal"
|
||||
@click="goLogin()"
|
||||
>
|
||||
{{ $t('authentication.go-login') }}
|
||||
{{ $t('authentication.goToLogin') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -13,7 +13,7 @@ defineOptions({
|
||||
<div class="mt-4 flex items-center justify-between">
|
||||
<span class="border-input w-[35%] border-b dark:border-gray-600"></span>
|
||||
<span class="text-muted-foreground text-center text-xs uppercase">
|
||||
{{ $t('authentication.third-party-login') }}
|
||||
{{ $t('authentication.thirdPartyLogin') }}
|
||||
</span>
|
||||
<span class="border-input w-[35%] border-b dark:border-gray-600"></span>
|
||||
</div>
|
||||
|
@ -43,13 +43,13 @@ const titleText = computed(() => {
|
||||
return $t('fallback.forbidden');
|
||||
}
|
||||
case '404': {
|
||||
return $t('fallback.page-not-found');
|
||||
return $t('fallback.pageNotFound');
|
||||
}
|
||||
case '500': {
|
||||
return $t('fallback.internal-error');
|
||||
return $t('fallback.internalError');
|
||||
}
|
||||
case 'offline': {
|
||||
return $t('fallback.offline-error');
|
||||
return $t('fallback.offlineError');
|
||||
}
|
||||
case 'comming-soon': {
|
||||
return $t('fallback.coming-soon');
|
||||
@ -66,16 +66,16 @@ const descText = computed(() => {
|
||||
}
|
||||
switch (props.status) {
|
||||
case '403': {
|
||||
return $t('fallback.forbidden-desc');
|
||||
return $t('fallback.forbiddenDesc');
|
||||
}
|
||||
case '404': {
|
||||
return $t('fallback.page-not-found-desc');
|
||||
return $t('fallback.pageNotFoundDesc');
|
||||
}
|
||||
case '500': {
|
||||
return $t('fallback.internal-error-desc');
|
||||
return $t('fallback.internalErrorDesc');
|
||||
}
|
||||
case 'offline': {
|
||||
return $t('fallback.offline-error-desc');
|
||||
return $t('fallback.offlineErrorDesc');
|
||||
}
|
||||
default: {
|
||||
return '';
|
||||
@ -152,7 +152,7 @@ function refresh() {
|
||||
<slot v-if="$slots.action" name="action"></slot>
|
||||
<VbenButton v-else-if="showBack" size="lg" @click="back">
|
||||
<IcRoundArrowBackIosNew class="mr-2" />
|
||||
{{ $t('common.back-to-home') }}
|
||||
{{ $t('common.backToHome') }}
|
||||
</VbenButton>
|
||||
<VbenButton v-else-if="showRefresh" size="lg" @click="refresh">
|
||||
<IcRoundRefresh class="mr-2" />
|
||||
|
1022
pnpm-lock.yaml
generated
1022
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user