perf: optimize the naming of locale key

This commit is contained in:
vince 2024-07-10 21:55:16 +08:00
parent 25a1e93ab2
commit 4674380266
59 changed files with 664 additions and 1253 deletions

View File

@ -1,3 +0,0 @@
{
"exclude": ["zx", "eslint", "eslint-plugin-unused-imports"]
}

View File

@ -50,31 +50,31 @@ export class MenuController {
const createDemosMenus = (role: 'admin' | 'super' | 'user') => { const createDemosMenus = (role: 'admin' | 'super' | 'user') => {
const roleWithMenus = { const roleWithMenus = {
admin: { admin: {
component: '/demos/access/backend/access-test-2', component: '/demos/access/backend/admin-visible',
meta: { meta: {
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: 'page.demos.access.access-test-2', title: 'page.demos.access.adminVisible',
}, },
name: 'AccessBackendTest2', name: 'AccessBackendAdminVisible',
path: 'access-test-2', path: 'admin-visible',
}, },
super: { super: {
component: '/demos/access/backend/access-test-1', component: '/demos/access/backend/super-visible',
meta: { meta: {
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: 'page.demos.access.access-test-1', title: 'page.demos.access.superVisible',
}, },
name: 'AccessBackendTest1', name: 'AccessBackendSuperVisible',
path: 'access-test-1', path: 'super-visible',
}, },
user: { user: {
component: '/demos/access/backend/access-test-3', component: '/demos/access/backend/user-visible',
meta: { meta: {
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: 'page.demos.access.access-test-3', title: 'page.demos.access.userVisible',
}, },
name: 'AccessBackendTest3', name: 'AccessBackendUserVisible',
path: 'access-test-3', path: 'user-visible',
}, },
}; };
@ -105,7 +105,7 @@ export class MenuController {
path: 'backend', path: 'backend',
meta: { meta: {
icon: 'mdi:cloud-key-outline', icon: 'mdi:cloud-key-outline',
title: 'page.demos.access.backend-control', title: 'page.demos.access.backendControl',
}, },
redirect: '/demos/access/backend/page-control', redirect: '/demos/access/backend/page-control',
children: [ children: [
@ -115,7 +115,7 @@ export class MenuController {
component: '/demos/access/backend/index', component: '/demos/access/backend/index',
meta: { meta: {
icon: 'mdi:page-previous-outline', 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', component: '/demos/access/backend/button-control',
meta: { meta: {
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: 'page.demos.access.button', title: 'page.demos.access.buttonControl',
}, },
}, },
roleWithMenus[role], roleWithMenus[role],

View File

@ -1,14 +1,14 @@
import type { UserInfo } from '@vben/types'; import type { UserInfo } from '@vben/types';
import type { UserApiType } from '../types'; import type { UserApi } from '../types';
import { requestClient } from '#/forward'; import { requestClient } from '#/forward';
/** /**
* *
*/ */
async function userLogin(data: UserApiType.LoginParams) { async function userLogin(data: UserApi.LoginParams) {
return requestClient.post<UserApiType.LoginResult>('/auth/login', data); return requestClient.post<UserApi.LoginResult>('/auth/login', data);
} }
/** /**

View File

@ -1,4 +1,4 @@
namespace UserApiType { namespace UserApi {
/** 登录接口参数 */ /** 登录接口参数 */
export interface LoginParams { export interface LoginParams {
password: string; password: string;
@ -16,4 +16,4 @@ namespace UserApiType {
} }
} }
export type { UserApiType }; export type { UserApi };

View File

@ -17,7 +17,7 @@ async function bootstrap(namespace: string) {
await setupI18n(app, { await setupI18n(app, {
defaultLocale: preferences.app.locale, defaultLocale: preferences.app.locale,
loadMessages, loadMessages,
missingWarn: import.meta.env.PROD, missingWarn: !import.meta.env.PROD,
}); });
// 配置 pinia-store // 配置 pinia-store

View File

@ -25,7 +25,7 @@ async function generateAccess(options: GeneratorMenuAndRoutesOptions) {
...options, ...options,
fetchMenuListAsync: async () => { fetchMenuListAsync: async () => {
message.loading({ message.loading({
content: `${$t('common.loading-menu')}...`, content: `${$t('common.loadingMenu')}...`,
duration: 1.5, duration: 1.5,
}); });
return await getAllMenus(); return await getAllMenus();

View File

@ -16,6 +16,7 @@ const localesMap = loadLocalesMap(modules);
/** /**
* *
*
* @param lang * @param lang
*/ */
async function loadMessages(lang: SupportedLanguagesType) { async function loadMessages(lang: SupportedLanguagesType) {

View File

@ -4,29 +4,28 @@
"title": "Demos", "title": "Demos",
"access": { "access": {
"title": "Access Control", "title": "Access Control",
"frontend-control": "Front-end Control", "frontendControl": "Frontend Control",
"backend-control": "Backend Control", "backendControl": "Backend Control",
"page": "Page visit", "pageAccess": "Page Access",
"button": "Button control", "buttonControl": "Button Control",
"loading-menu": "In the loading menu", "superVisible": "Visible to Super",
"access-test-1": "Super visit", "adminVisible": "Visible to Admin",
"access-test-2": "Admin visit", "userVisible": "Visible to User"
"access-test-3": "User visit"
}, },
"nested": { "nested": {
"title": "Nested Menu", "title": "Nested Menu",
"menu1": "Menu 1", "menu1": "Menu 1",
"menu2": "Menu 2", "menu2": "Menu 2",
"menu21": "Menu 2-1", "menu2_1": "Menu 2-1",
"menu3": "Menu 3", "menu3": "Menu 3",
"menu31": "Menu 3-1", "menu3_1": "Menu 3-1",
"menu32": "Menu 3-2", "menu3_2": "Menu 3-2",
"menu321": "Menu 3-2-1" "menu3_2_1": "Menu 3-2-1"
}, },
"outside": { "outside": {
"title": "External Page", "title": "External Pages",
"embedded": "embedded Page", "embedded": "Embedded",
"external-link": "External Link" "externalLink": "External Link"
}, },
"fallback": { "title": "Fallback Page" } "fallback": { "title": "Fallback Page" }
} }

View File

@ -4,28 +4,28 @@
"title": "演示", "title": "演示",
"access": { "access": {
"title": "访问控制", "title": "访问控制",
"frontend-control": "前端控制", "frontendControl": "前端控制",
"backend-control": "后端控制", "backendControl": "后端控制",
"page": "页面访问", "pageAccess": "页面访问",
"button": "按钮控制", "buttonControl": "按钮控制",
"access-test-1": "Super 可见", "superVisible": "Super 可见",
"access-test-2": "Admin 可见", "adminVisible": "Admin 可见",
"access-test-3": "User 可见" "userVisible": "User 可见"
}, },
"nested": { "nested": {
"title": "嵌套菜单", "title": "嵌套菜单",
"menu1": "菜单 1", "menu1": "菜单 1",
"menu2": "菜单 2", "menu2": "菜单 2",
"menu21": "菜单 2-1", "menu2_1": "菜单 2-1",
"menu3": "菜单 3", "menu3": "菜单 3",
"menu31": "菜单 3-1", "menu3_1": "菜单 3-1",
"menu32": "菜单 3-2", "menu3_2": "菜单 3-2",
"menu321": "菜单 3-2-1" "menu3_2_1": "菜单 3-2-1"
}, },
"outside": { "outside": {
"title": "外部页面", "title": "外部页面",
"embedded": "内嵌", "embedded": "内嵌",
"external-link": "外链" "externalLink": "外链"
}, },
"fallback": { "fallback": {
"title": "缺省页" "title": "缺省页"

View File

@ -60,7 +60,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
component: () => component: () =>
import('#/views/_essential/authentication/qrcode-login.vue'), import('#/views/_essential/authentication/qrcode-login.vue'),
meta: { meta: {
title: $t('page.essentials.qrcode-login'), title: $t('page.essentials.qrcodeLogin'),
}, },
}, },
{ {
@ -69,7 +69,7 @@ const essentialsRoutes: RouteRecordRaw[] = [
component: () => component: () =>
import('#/views/_essential/authentication/forget-password.vue'), import('#/views/_essential/authentication/forget-password.vue'),
meta: { meta: {
title: $t('page.essentials.forget-password'), title: $t('page.essentials.forgetPassword'),
}, },
}, },
{ {

View File

@ -31,7 +31,7 @@ const routes: RouteRecordRaw[] = [
redirect: '/demos/access/frontend/page-control', redirect: '/demos/access/frontend/page-control',
meta: { meta: {
icon: 'mdi:table-key', icon: 'mdi:table-key',
title: $t('page.demos.access.frontend-control'), title: $t('page.demos.access.frontendControl'),
}, },
children: [ children: [
{ {
@ -41,7 +41,7 @@ const routes: RouteRecordRaw[] = [
import('#/views/demos/access/frontend/index.vue'), import('#/views/demos/access/frontend/index.vue'),
meta: { meta: {
icon: 'mdi:page-previous-outline', 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'), import('#/views/demos/access/frontend/button-control.vue'),
meta: { meta: {
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: $t('page.demos.access.button'), title: $t('page.demos.access.buttonControl'),
}, },
}, },
{ {
name: 'AccessFrontendTest1', name: 'AccessFrontendSuperVisible',
path: 'access-test-1', path: 'super-visible',
component: () => component: () =>
import('#/views/demos/access/frontend/access-test-1.vue'), import('#/views/demos/access/frontend/super-visible.vue'),
meta: { meta: {
authority: ['super'], authority: ['super'],
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: $t('page.demos.access.access-test-1'), title: $t('page.demos.access.superVisible'),
}, },
}, },
{ {
name: 'AccessFrontendTest2', name: 'AccessFrontendAdminVisible',
path: 'access-test-2', path: 'admin-visible',
component: () => component: () =>
import('#/views/demos/access/frontend/access-test-2.vue'), import('#/views/demos/access/frontend/admin-visible.vue'),
meta: { meta: {
authority: ['admin'], authority: ['admin'],
icon: 'mdi:button-cursor', icon: 'mdi:button-cursor',
title: $t('page.demos.access.access-test-2'), title: $t('page.demos.access.adminVisible'),
}, },
}, },
{ {
name: 'AccessFrontendTest3', name: 'AccessFrontendUserVisible',
path: 'access-test-3', path: 'user-visible',
component: () => component: () =>
import('#/views/demos/access/frontend/access-test-3.vue'), import('#/views/demos/access/frontend/user-visible.vue'),
meta: { meta: {
authority: ['user'], authority: ['user'],
icon: 'mdi:button-cursor', 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'), component: () => import('#/views/demos/access/backend/index.vue'),
meta: { meta: {
icon: 'mdi:cloud-key-outline', icon: 'mdi:cloud-key-outline',
title: $t('page.demos.access.backend-control'), title: $t('page.demos.access.backendControl'),
}, },
children: [ children: [
{ {
@ -105,7 +105,7 @@ const routes: RouteRecordRaw[] = [
import('#/views/demos/access/frontend/index.vue'), import('#/views/demos/access/frontend/index.vue'),
meta: { meta: {
icon: 'mdi:page-previous-outline', 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', path: 'external-link',
meta: { meta: {
icon: 'mdi:newspaper-variant-multiple-outline', icon: 'mdi:newspaper-variant-multiple-outline',
title: $t('page.demos.outside.external-link'), title: $t('page.demos.outside.externalLink'),
}, },
redirect: '/outside/external-link/vite', redirect: '/outside/external-link/vite',
children: [ children: [
@ -273,7 +273,7 @@ const routes: RouteRecordRaw[] = [
meta: { meta: {
icon: 'ic:round-menu', icon: 'ic:round-menu',
keepAlive: true, keepAlive: true,
title: $t('page.demos.nested.menu21'), title: $t('page.demos.nested.menu2_1'),
}, },
}, },
], ],
@ -294,7 +294,7 @@ const routes: RouteRecordRaw[] = [
meta: { meta: {
icon: 'ic:round-menu', icon: 'ic:round-menu',
keepAlive: true, 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', path: 'menu3-2',
meta: { meta: {
icon: 'ic:round-menu', 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', redirect: '/nested/menu3/menu3-2/menu3-2-1',
children: [ children: [
@ -314,7 +314,7 @@ const routes: RouteRecordRaw[] = [
meta: { meta: {
icon: 'ic:round-menu', icon: 'ic:round-menu',
keepAlive: true, keepAlive: true,
title: $t('page.demos.nested.menu321'), title: $t('page.demos.nested.menu3_2_1'),
}, },
}, },
], ],

View File

@ -20,9 +20,9 @@ async function handleLogin(params: LoginAndRegisterParams) {
const { userInfo } = await accessStore.authLogin(params); const { userInfo } = await accessStore.authLogin(params);
if (userInfo?.realName) { if (userInfo?.realName) {
notification.success({ notification.success({
description: `${$t('authentication.login-success-desc')}:${userInfo?.realName}`, description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
duration: 3, duration: 3,
message: $t('authentication.login-success'), message: $t('authentication.loginSuccess'),
}); });
} }
} }

View File

@ -27,6 +27,7 @@
"sonner", "sonner",
"unplugin", "unplugin",
"vben", "vben",
"vbenjs",
"vueuse", "vueuse",
"yxxx", "yxxx",
"nuxt", "nuxt",

View File

@ -46,7 +46,7 @@
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-regexp": "^2.6.0", "eslint-plugin-regexp": "^2.6.0",
"eslint-plugin-unicorn": "^54.0.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-vitest": "^0.5.4",
"eslint-plugin-vue": "^9.27.0", "eslint-plugin-vue": "^9.27.0",
"globals": "^15.8.0", "globals": "^15.8.0",

View File

@ -30,7 +30,7 @@
"dependencies": { "dependencies": {
"@stylistic/stylelint-plugin": "^2.1.2", "@stylistic/stylelint-plugin": "^2.1.2",
"stylelint-config-recess-order": "^5.0.1", "stylelint-config-recess-order": "^5.0.1",
"stylelint-scss": "^6.4.0" "stylelint-scss": "^6.4.1"
}, },
"devDependencies": { "devDependencies": {
"postcss": "^8.4.39", "postcss": "^8.4.39",

View File

@ -37,6 +37,6 @@
"pkg-types": "^1.1.3", "pkg-types": "^1.1.3",
"prettier": "^3.3.2", "prettier": "^3.3.2",
"rimraf": "^6.0.0", "rimraf": "^6.0.0",
"zx": "^7.2.3" "zx": "^8.1.4"
} }
} }

View File

@ -46,7 +46,7 @@
"rollup": "^4.18.1", "rollup": "^4.18.1",
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"sass": "^1.77.7", "sass": "^1.77.7",
"unplugin-turbo-console": "^1.9.0", "unplugin-turbo-console": "^1.9.2",
"vite": "^5.3.3", "vite": "^5.3.3",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-dts": "^3.9.1", "vite-plugin-dts": "^3.9.1",

View File

@ -44,7 +44,8 @@
"publint": "vsh publint", "publint": "vsh publint",
"reinstall": "pnpm clean --del-lock && pnpm bootstrap", "reinstall": "pnpm clean --del-lock && pnpm bootstrap",
"test": "vitest", "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": { "devDependencies": {
"@changesets/changelog-github": "^0.5.0", "@changesets/changelog-github": "^0.5.0",
@ -68,7 +69,6 @@
"is-ci": "^3.0.1", "is-ci": "^3.0.1",
"jsdom": "^24.1.0", "jsdom": "^24.1.0",
"rimraf": "^6.0.0", "rimraf": "^6.0.0",
"taze": "^0.14.2",
"turbo": "^2.0.6", "turbo": "^2.0.6",
"typescript": "^5.5.3", "typescript": "^5.5.3",
"unbuild": "^2.0.0", "unbuild": "^2.0.0",
@ -88,6 +88,12 @@
"clsx": "^2.1.1", "clsx": "^2.1.1",
"vue": "^3.4.31" "vue": "^3.4.31"
}, },
"peerDependencyRules": {
"allowedVersions": {
"eslint": "*",
" @typescript-eslint/eslint-plugin": "*"
}
},
"neverBuiltDependencies": [ "neverBuiltDependencies": [
"canvas", "canvas",
"node-gyp", "node-gyp",
@ -95,8 +101,7 @@
], ],
"updateConfig": { "updateConfig": {
"ignoreDependencies": [ "ignoreDependencies": [
"eslint", "eslint"
"zx"
] ]
} }
} }

View File

@ -101,7 +101,7 @@ describe('useCoreAccessStore', () => {
const store = useCoreTabbarStore(); const store = useCoreTabbarStore();
store.cachedTabs.add('Home'); store.cachedTabs.add('Home');
store.cachedTabs.add('About'); store.cachedTabs.add('About');
expect(store.cachedTabs).toEqual(['Home', 'About']); expect(store.getCachedTabs).toEqual(['Home', 'About']);
}); });
it('returns all tabs, including affix tabs', () => { it('returns all tabs, including affix tabs', () => {

View File

@ -28,10 +28,11 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
// 在控制台打印警告 // 在控制台打印警告
i18n.global.setMissingHandler((locale, key) => { i18n.global.setMissingHandler((locale, key) => {
options.missingWarn && if (options.missingWarn && key.includes('.')) {
console.warn( console.warn(
`[intlify] Not found '${key}' key in '${locale}' locale messages.`, `[intlify] Not found '${key}' key in '${locale}' locale messages.`,
); );
}
}); });
} }

View File

@ -3,9 +3,9 @@
"essentials": { "essentials": {
"login": "Login", "login": "Login",
"register": "Register", "register": "Register",
"code-login": "Code Login", "codeLogin": "Code Login",
"qrcode-login": "Qrcode Login", "qrcodeLogin": "Qr Code Login",
"forget-password": "Forget Password" "forgetPassword": "Forget Password"
}, },
"dashboard": { "dashboard": {
"title": "Dashboard", "title": "Dashboard",
@ -19,197 +19,193 @@
}, },
"common": { "common": {
"back": "Back", "back": "Back",
"back-to-home": "Back To Home", "backToHome": "Back To Home",
"login": "Login", "login": "Login",
"logout": "Logout", "logout": "Logout",
"prompt": "Prompt", "prompt": "Prompt",
"cancel": "Cancel", "cancel": "Cancel",
"confirm": "Comfirm", "confirm": "Comfirm",
"not-data": "No data", "noData": "No Data",
"refresh": "Refresh" "refresh": "Refresh",
"loadingMenu": "Loading Menu"
}, },
"fallback": { "fallback": {
"page-not-found": "Oops! Page Not Found", "pageNotFound": "Oops! Page Not Found",
"page-not-found-desc": "Sorry, we couldn't find the page you were looking for.", "pageNotFoundDesc": "Sorry, we couldn't find the page you were looking for.",
"forbidden": "Oops! Access Denied", "forbidden": "Oops! Access Denied",
"forbidden-desc": "Sorry, but you don't have permission to access this page.", "forbiddenDesc": "Sorry, but you don't have permission to access this page.",
"internal-error": "Oops! Something Went Wrong", "internalError": "Oops! Something Went Wrong",
"internal-error-desc": "Sorry, but the server encountered an error.", "internalErrorDesc": "Sorry, but the server encountered an error.",
"offline": "Offline Page", "offline": "Offline Page",
"offline-error": "Oops! Network Error", "offlineError": "Oops! Network Error",
"offline-error-desc": "Sorry, can't connect to the internet. Check your connection.", "offlineErrorDesc": "Sorry, can't connect to the internet. Check your connection.",
"coming-soon": "Coming soon" "coming-soon": "Coming Soon"
}, },
"widgets": { "widgets": {
"document": "Document", "document": "Document",
"qa": "FAQ & Help", "qa": "Q&A",
"setting": "Setting", "setting": "Settings",
"logout-tip": "Do you want to log out?", "logoutTip": "Do you want to logout?",
"view-all": "View all messages", "viewAll": "View All Messages",
"notifications": "Notifications", "notifications": "Notifications",
"make-all-as-read": "Make all as read", "markAllAsRead": "Make All as Read",
"clear-notifications": "Clear", "clearNotifications": "Clear",
"search": { "search": {
"title": "Search", "title": "Search",
"search-navigate": "Search Navigate", "searchNavigate": "Search Navigation",
"select": "To select", "select": "Select",
"navigate": "To navigate", "navigate": "Navigate",
"close": "To close", "close": "Close",
"no-results": "No results for", "noResults": "No Search Results Found",
"no-recent": "No recent searches", "noRecent": "No Search History",
"recent": "Recent" "recent": "Search History"
} }
}, },
"authentication": { "authentication": {
"welcome-back": "Welcome Back", "welcomeBack": "Welcome Back",
"page-title": "Plug-and-play backend system", "pageTitle": "Plug-and-play Admin system",
"page-desc": "Efficient, versatile frontend template", "pageDesc": "Efficient, versatile frontend template",
"login-success": "Login successful", "loginSuccess": "Login Successful",
"login-success-desc": "Welcome back", "loginSuccessDesc": "Welcome Back",
"login-subtitle": "Enter your account details to manage your projects", "loginSubtitle": "Enter your account details to manage your projects",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"username-tip": "Username is required", "usernameTip": "Please enter username",
"password-tip": "Password is required", "passwordTip": "Please enter password",
"remember-me": "Remember Me", "rememberMe": "Remember Me",
"create-an-account": "Create an account", "createAnAccount": "Create an Account",
"create-account": "Create account", "createAccount": "Create Account",
"already-account": "Already have an account?", "alreadyHaveAccount": "Already have an account?",
"account-tip": "Don't have an account yet?", "accountTip": "Don't have an account?",
"sign-up": "Sign Up", "signUp": "Sign Up",
"sign-up-subtitle": "Make managing your applications simple and fun", "signUpSubtitle": "Make managing your applications simple and fun",
"comfirm-password": "Comfirm Password", "confirmPassword": "Comfirm Password",
"comfirm-password-tip": "The passwords entered twice do not match", "confirmPasswordTip": "The passwords do not match",
"sign-up-agree": "I agree to", "agree": "I agree to",
"sign-up-privacy-policy": "Privacy-policy", "agreeprivacyPolicy": "Privacy-policy",
"sign-up-terms": "Terms", "terms": "Terms",
"sign-up-agree-tip": "Please agree to the Privacy Policy and Terms", "agreeTip": "Please agree to the Privacy Policy and Terms",
"go-login": "Login instead", "goToLogin": "Login instead",
"password-strength": "Use 8 or more characters with a mix of letters, numbers & symbols", "passwordStrength": "Use 8 or more characters with a mix of letters, numbers & symbols",
"forget-password": "Forget Password?", "forgetPassword": "Forget Password?",
"forget-password-subtitle": "Enter your email and we'll send you instructions to reset your password", "forgetPasswordSubtitle": "Enter your email and we'll send you instructions to reset your password",
"email-tip": "Email is required", "emailTip": "Please enter email",
"send-reset-link": "Send Reset Link", "sendResetLink": "Send Reset Link",
"email": "Email", "email": "Email",
"qrcode-subtitle": "Please scan the QR code to log in on your mobile device", "qrcodeSubtitle": "Scan the QR code with your phone to login",
"qrcode-prompt": "Scanning the code to complete the login", "qrcodePrompt": "Click 'Confirm' after scanning to complete login",
"qrcode-login": "QR Login", "qrcodeLogin": "QR Code Login",
"code-subtitle": "Please enter your phone number to start managing your projects", "codeSubtitle": "Enter your phone number to start managing your project",
"code": "Security code", "code": "Security code",
"code-tip": "Security code is required", "codeTip": "Security code is required",
"mobile": "Mobile", "mobile": "Mobile",
"mobile-login": "Mobile Login", "mobileLogin": "Mobile Login",
"mobile-tip": "Mobile is required", "mobile-tip": "Please enter phone number",
"send-code": "Get Security code", "sendCode": "Get Security code",
"send-text": "Reacquire in {0}s", "sendText": "Resend in {0}s",
"third-party-login": "Or continue with", "thirdPartyLogin": "Or continue with",
"layout": { "layout": {
"center": "Align Center", "center": "Align Center",
"align-left": "Align Left", "alignLeft": "Align Left",
"align-right": "Align Right" "alignRight": "Align Right"
} }
}, },
"preferences": { "preferences": {
"title": "Preferences", "title": "Preferences",
"subtitle": "Customize Preferences & Preview in Real Time", "subtitle": "Customize Preferences & Preview in Real Time",
"reset-tip": "The data has changed, click to reset", "resetTip": "Data has changed, click to reset",
"reset-title": "Preferences reset", "resetTitle": "Reset Preferences",
"reset-success": "Preferences reset successfully", "resetSuccess": "Preferences reset successfully",
"appearance": "Appearance", "appearance": "Appearance",
"layout": "Layout", "layout": "Layout",
"content": "Content", "content": "Content",
"other": "Other", "other": "Other",
"wide": "Fluid", "wide": "Wide",
"compact": "Fixed Width", "compact": "Fixed",
"follow-system": "Follow System", "followSystem": "Follow System",
"vertical": "Vertical", "vertical": "Vertical",
"vertical-tip": "Side Vertical Menu Mode", "verticalTip": "Side vertical menu mode",
"horizontal": "Horizontal", "horizontal": "Horizontal",
"horizontal-tip": "Top Horizontal Menu", "horizontalTip": "Horizontal menu mode, all menus displayed at the top",
"two-column": "Two Column", "twoColumn": "Two Column",
"two-column-tip": "Vertical Two Column Menu Mode", "twoColumnTip": "Vertical Two Column Menu Mode",
"mixed-menu": "Mixed Menu", "mixedMenu": "Mixed Menu",
"split-menu": "Split Menu", "mixedMenuTip": "Vertical & Horizontal Menu Co-exists",
"mixed-menu-tip": "Vertical & Horizontal Menu Co-exists", "fullContent": "Full Content",
"full-content": "Full Content", "fullContentTip": "Only display content body, hide all menus",
"full-content-tip": "Display only the main content, no menus",
"weak-mode": "Color Weak Mode",
"gray-mode": "Gray Mode",
"normal": "Normal", "normal": "Normal",
"plain": "Plain", "plain": "Plain",
"rounded": "Rounded", "rounded": "Rounded",
"interface-control": "Interface Layout Control", "copyPreferences": "Copy Preferences",
"copy": "Copy Preferences", "copyPreferencesSuccess": "Copy successful, please override in `src/preferences.ts` under app",
"copy-success": "Copy successful. Please replace in `src/preferences.ts` of the app", "clearAndLogout": "Clear Cache & Logout",
"clear-and-logout": "Clear Cache & Logout",
"mode": "Mode", "mode": "Mode",
"logo-visible": "Display Logo",
"general": "General", "general": "General",
"language": "Language", "language": "Language",
"dynamic-title": "Dynamic Title", "dynamicTitle": "Dynamic Title",
"sidebar": { "sidebar": {
"title": "Sidebar", "title": "Sidebar",
"width": "Width", "width": "Width",
"visible": "Display Sidebar", "visible": "Show Sidebar",
"collapsed": "Collpase Menu", "collapsed": "Collpase Menu",
"collapsed-show-title": "Display menu name" "collapsedShowTitle": "Show Menu Title"
}, },
"tabbar": { "tabbar": {
"title": "Tabbar", "title": "Tabbar",
"enable": "Enable Tab Bar", "enable": "Enable Tab Bar",
"icon": "Display Tabbar Icon", "icon": "Show Tabbar Icon",
"persist": "Persistent tabs", "persist": "Persist Tabs",
"context-menu": { "contextMenu": {
"reload": "Reload", "reload": "Reload",
"close": "Close", "close": "Close Tab",
"pin": "Pin", "pin": "Pin Tab",
"unpin": "Unpin", "unpin": "Unpin Tab",
"close-left": "Close Left", "closeLeft": "Close Left Tabs",
"close-right": "Close Right", "closeRight": "Close Right Tabs",
"close-other": "Close Other", "closeOther": "Close Other Tabs",
"close-all": "Close All" "closeAll": "Close All Tabs"
} }
}, },
"navigation-menu": { "navigationMenu": {
"title": "Navigation Menu", "title": "Navigation Menu",
"style": "Navigation menu style", "style": "Navigation Menu Style",
"accordion": "Sidebar Accordion Menu",
"split": "Navigation Menu Separation", "split": "Navigation Menu Separation",
"accordion": "Sidebar Navigation Menu Accordion mode", "splitTip": "When enabled, the sidebar displays the top bar's submenu"
"split-tip": "When enabled, the sidebar shows the top bar's submenu"
}, },
"breadcrumb": { "breadcrumb": {
"title": "Breadcrumb", "title": "Breadcrumb",
"home": "Display the home button", "home": "Show Home Button",
"enable": "Enable Breadcrumb", "enable": "Enable Breadcrumb",
"icon": "Display breadcrumb icon", "icon": "Show Breadcrumb Icon",
"background": "background", "background": "background",
"style": "Breadcrumb Type", "style": "Breadcrumb Style",
"hide-only-one": "Hidden when only one left" "hideOnlyOne": "Hidden when only one"
}, },
"animation": { "animation": {
"title": "Animation", "title": "Animation",
"loading": "Page transition loading", "loading": "Page Loading",
"transition": "Page transition animation", "transition": "Page Transition",
"progress": "Page transition progress" "progress": "Page Progress"
}, },
"theme": { "theme": {
"title": "Theme", "title": "Theme",
"radius": "Radius", "radius": "Radius",
"light": "Light", "light": "Light",
"dark": "Dark", "dark": "Dark",
"dark-menu": "Semi Dark Menu", "darkMenu": "Semi Dark Menu",
"weak-mode": "Color Weak Mode", "weakMode": "Weak Mode",
"gray-mode": "Gray Mode", "grayMode": "Gray Mode",
"builtin": { "builtin": {
"title": "Built-in", "title": "Built-in",
"default": "Default", "default": "Default",
"violet": "Violet", "violet": "Violet",
"pink": "Pink", "pink": "Pink",
"rose": "Rose", "rose": "Rose",
"sky-blue": "Sky Blue", "skyBlue": "Sky Blue",
"deep-blue": "Deep Blue", "deepBlue": "Deep Blue",
"green": "Green", "green": "Green",
"deep-green": "Deep Green", "deepGreen": "Deep Green",
"orange": "Orange", "orange": "Orange",
"yellow": "Yellow", "yellow": "Yellow",
"zinc": "Zinc", "zinc": "Zinc",
@ -221,27 +217,27 @@
}, },
"header": { "header": {
"title": "Header", "title": "Header",
"visible": "Display Header", "visible": "Show Header",
"mode-static": "Static", "modeStatic": "Static",
"mode-fixed": "Fixed", "modeFixed": "Fixed",
"mode-auto": "Auto hide/display", "modeAuto": "Auto hide & Show",
"mode-auto-scroll": "Scroll hide/display" "modeAutoScroll": "Scroll to Hide & Show"
}, },
"footer": { "footer": {
"title": "Footer", "title": "Footer",
"visible": "Display Footer", "visible": "Show Footer",
"fixed": "Fixed at the bottom" "fixed": "Fixed at Bottom"
}, },
"copyright": { "copyright": {
"title": "Copyright", "title": "Copyright",
"enable": "Enable copyright", "enable": "Enable Copyright",
"company-name": "Company name", "companyName": "Company Name",
"company-site-link": "Company homepage", "companySiteLink": "Company Site Link",
"date": "Date", "date": "Date",
"icp": "ICP number", "icp": "ICP License Number",
"icp-link": "ICP Site Link" "icpLink": "ICP Site Link"
}, },
"shortcut-keys": { "shortcutKeys": {
"title": "Shortcut Keys", "title": "Shortcut Keys",
"global": "Global", "global": "Global",
"search": "Global Search", "search": "Global Search",
@ -250,13 +246,13 @@
}, },
"widget": { "widget": {
"title": "Widget", "title": "Widget",
"global-search": "Enable Global Search", "globalSearch": "Enable Global Search",
"fullscreen": "Enable Fullscreen", "fullscreen": "Enable Fullscreen",
"theme-toggle": "Enable Theme Toggle", "themeToggle": "Enable Theme Toggle",
"language-toggle": "Enable Language Toggle", "languageToggle": "Enable Language Toggle",
"notification": "Enable Notification", "notification": "Enable Notification",
"sidebar-toggle": "Enable Sidebar Toggle", "sidebarToggle": "Enable Sidebar Toggle",
"ai-assistant": "Enable AI Assistant" "aiAssistant": "Enable AI Assistant"
} }
} }
} }

View File

@ -3,9 +3,9 @@
"essentials": { "essentials": {
"login": "登陆", "login": "登陆",
"register": "注册", "register": "注册",
"code-login": "验证码登陆", "codeLogin": "验证码登陆",
"qrcode-login": "二维码登陆", "qrcodeLogin": "二维码登陆",
"forget-password": "忘记密码" "forgetPassword": "忘记密码"
}, },
"dashboard": { "dashboard": {
"title": "概览", "title": "概览",
@ -19,162 +19,159 @@
}, },
"common": { "common": {
"back": "返回", "back": "返回",
"back-to-home": "返回首页", "backToHome": "返回首页",
"login": "登录", "login": "登录",
"logout": "退出登录", "logout": "退出登录",
"prompt": "提示", "prompt": "提示",
"cancel": "取消", "cancel": "取消",
"confirm": "确认", "confirm": "确认",
"not-data": "暂无数据", "noData": "暂无数据",
"refresh": "刷新", "refresh": "刷新",
"loading-menu": "加载菜单中" "loadingMenu": "加载菜单中"
}, },
"fallback": { "fallback": {
"page-not-found": "哎呀!未找到页面", "pageNotFound": "哎呀!未找到页面",
"page-not-found-desc": "抱歉,我们无法找到您要找的页面。", "pageNotFoundDesc": "抱歉,我们无法找到您要找的页面。",
"forbidden": "哎呀!访问被拒绝", "forbidden": "哎呀!访问被拒绝",
"forbidden-desc": "抱歉,您没有权限访问此页面。", "forbiddenDesc": "抱歉,您没有权限访问此页面。",
"internal-error": "哎呀!出错了", "internalError": "哎呀!出错了",
"internal-error-desc": "抱歉,服务器遇到错误。", "internalErrorDesc": "抱歉,服务器遇到错误。",
"offline": "离线页面", "offline": "离线页面",
"offline-error": "哎呀!网络错误", "offlineError": "哎呀!网络错误",
"offline-error-desc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。", "offlineErrorDesc": "抱歉,无法连接到互联网,请检查您的网络连接并重试。",
"coming-soon": "即将推出" "coming-soon": "即将推出"
}, },
"widgets": { "widgets": {
"document": "文档", "document": "文档",
"qa": "问题 & 帮助", "qa": "问题 & 帮助",
"setting": "设置", "setting": "设置",
"logout-tip": "是否退出登录?", "logoutTip": "是否退出登录?",
"view-all": "查看所有消息", "viewAll": "查看所有消息",
"notifications": "通知", "notifications": "通知",
"make-all-as-read": "全部标记为已读", "markAllAsRead": "全部标记为已读",
"clear-notifications": "清空", "clearNotifications": "清空",
"search": { "search": {
"title": "搜索", "title": "搜索",
"search-navigate": "搜索导航菜单", "searchNavigate": "搜索导航菜单",
"select": "选择", "select": "选择",
"navigate": "导航", "navigate": "导航",
"close": "关闭", "close": "关闭",
"no-results": "未找到搜索结果", "noResults": "未找到搜索结果",
"no-recent": "没有搜索历史", "noRecent": "没有搜索历史",
"recent": "搜索历史" "recent": "搜索历史"
} }
}, },
"authentication": { "authentication": {
"welcome-back": "欢迎回来", "welcomeBack": "欢迎回来",
"page-title": "开箱即用的大型中后台管理系统", "pageTitle": "开箱即用的大型中后台管理系统",
"page-desc": "工程化、高性能、跨组件库的前端模版", "pageDesc": "工程化、高性能、跨组件库的前端模版",
"login-success": "登录成功", "loginSuccess": "登录成功",
"login-success-desc": "欢迎回来", "loginSuccessDesc": "欢迎回来",
"login-subtitle": "请输入您的帐户信息以开始管理您的项目", "loginSubtitle": "请输入您的帐户信息以开始管理您的项目",
"username": "账号", "username": "账号",
"password": "密码", "password": "密码",
"username-tip": "请输入用户名", "usernameTip": "请输入用户名",
"password-tip": "请输入密码", "passwordTip": "请输入密码",
"remember-me": "记住账号", "rememberMe": "记住账号",
"create-an-account": "创建一个账号", "createAnAccount": "创建一个账号",
"create-account": "创建账号", "createAccount": "创建账号",
"already-account": "已经有账号了?", "alreadyHaveAccount": "已经有账号了?",
"account-tip": "还没有账号?", "accountTip": "还没有账号?",
"sign-up": "注册", "signUp": "注册",
"sign-up-subtitle": "让您的应用程序管理变得简单而有趣", "signUpSubtitle": "让您的应用程序管理变得简单而有趣",
"comfirm-password": "确认密码", "confirmPassword": "确认密码",
"comfirm-password-tip": "两次输入的密码不一致", "confirmPasswordTip": "两次输入的密码不一致",
"sign-up-agree": "我同意", "agree": "我同意",
"sign-up-privacy-policy": "隐私政策", "agreeprivacyPolicy": "隐私政策",
"sign-up-terms": "条款", "terms": "条款",
"sign-up-agree-tip": "请同意隐私政策和条款", "agreeTip": "请同意隐私政策和条款",
"go-login": "去登录", "goToLogin": "去登录",
"password-strength": "使用 8 个或更多字符,混合字母、数字和符号", "passwordStrength": "使用 8 个或更多字符,混合字母、数字和符号",
"forget-password": "忘记密码?", "forgetPassword": "忘记密码?",
"forget-password-subtitle": "输入您的电子邮件,我们将向您发送重置密码的连接", "forgetPasswordSubtitle": "输入您的电子邮件,我们将向您发送重置密码的连接",
"email-tip": "请输入邮箱", "emailTip": "请输入邮箱",
"send-reset-link": "发送重置链接", "sendResetLink": "发送重置链接",
"email": "邮箱", "email": "邮箱",
"qrcode-subtitle": "请用手机扫描二维码登录", "qrcodeSubtitle": "请用手机扫描二维码登录",
"qrcode-prompt": "扫码后点击 '确认',即可完成登录", "qrcodePrompt": "扫码后点击 '确认',即可完成登录",
"qrcode-login": "扫码登录", "qrcodeLogin": "扫码登录",
"code-subtitle": "请输入您的手机号码以开始管理您的项目", "codeSubtitle": "请输入您的手机号码以开始管理您的项目",
"code": "验证码", "code": "验证码",
"code-tip": "请输入验证码", "codeTip": "请输入验证码",
"mobile": "手机号码", "mobile": "手机号码",
"mobile-login": "手机号登录", "mobileLogin": "手机号登录",
"mobile-tip": "请输入手机号码", "mobile-tip": "请输入手机号码",
"send-code": "获取验证码", "sendCode": "获取验证码",
"send-text": "{0}秒后重新获取", "sendText": "{0}秒后重新获取",
"third-party-login": "其他登录方式", "thirdPartyLogin": "其他登录方式",
"layout": { "layout": {
"center": "居中", "center": "居中",
"align-left": "居左", "alignLeft": "居左",
"align-right": "居右" "alignRight": "居右"
} }
}, },
"preferences": { "preferences": {
"title": "偏好设置", "title": "偏好设置",
"subtitle": "自定义偏好设置 & 实时预览", "subtitle": "自定义偏好设置 & 实时预览",
"reset-title": "重置偏好设置", "resetTitle": "重置偏好设置",
"reset-tip": "数据有变化,点击可进行重置", "resetTip": "数据有变化,点击可进行重置",
"reset-success": "重置偏好设置成功", "resetSuccess": "重置偏好设置成功",
"appearance": "外观", "appearance": "外观",
"layout": "布局", "layout": "布局",
"content": "内容", "content": "内容",
"other": "其它", "other": "其它",
"wide": "流式", "wide": "流式",
"compact": "定宽", "compact": "定宽",
"follow-system": "跟随系统", "followSystem": "跟随系统",
"vertical": "垂直", "vertical": "垂直",
"vertical-tip": "侧边垂直菜单模式", "verticalTip": "侧边垂直菜单模式",
"horizontal": "水平", "horizontal": "水平",
"horizontal-tip": "水平菜单模式,菜单全部显示在顶部", "horizontalTip": "水平菜单模式,菜单全部显示在顶部",
"two-column": "双列菜单", "twoColumn": "双列菜单",
"two-column-tip": "垂直双列菜单模式", "twoColumnTip": "垂直双列菜单模式",
"mixed-menu": "混合菜单", "mixedMenu": "混合菜单",
"mixed-menu-tip": "垂直水平菜单共存", "mixedMenuTip": "垂直水平菜单共存",
"split-menu": "切割菜单", "fullContent": "内容全屏",
"full-content": "内容全屏", "fullContentTip": "不显示任何菜单,只显示内容主体",
"full-content-tip": "不显示任何菜单,只显示内容主体", "normal": "常规",
"interface-control": "界面布局控制",
"normal": "默认",
"plain": "朴素", "plain": "朴素",
"rounded": "圆润", "rounded": "圆润",
"copy": "复制偏好设置", "copyPreferences": "复制偏好设置",
"copy-success": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖", "copyPreferencesSuccess": "复制成功,请在 app 下的 `src/preferences.ts`内进行覆盖",
"clear-and-logout": "清空缓存 & 退出登录", "clearAndLogout": "清空缓存 & 退出登录",
"mode": "模式", "mode": "模式",
"logo-visible": "显示 Logo",
"general": "通用", "general": "通用",
"language": "语言", "language": "语言",
"dynamic-title": "动态标题", "dynamicTitle": "动态标题",
"sidebar": { "sidebar": {
"title": "侧边栏", "title": "侧边栏",
"width": "宽度", "width": "宽度",
"visible": "显示侧边栏", "visible": "显示侧边栏",
"collapsed": "折叠菜单", "collapsed": "折叠菜单",
"collapsed-show-title": "显示菜单名" "collapsedShowTitle": "显示菜单名"
}, },
"tabbar": { "tabbar": {
"title": "标签栏", "title": "标签栏",
"enable": "启用标签栏", "enable": "启用标签栏",
"icon": "显示标签栏图标", "icon": "显示标签栏图标",
"persist": "持久化标签页", "persist": "持久化标签页",
"context-menu": { "contextMenu": {
"reload": "重新加载", "reload": "重新加载",
"close": "关闭标签页", "close": "关闭标签页",
"pin": "固定标签页", "pin": "固定标签页",
"unpin": "取消固定标签页", "unpin": "取消固定标签页",
"close-left": "关闭左侧标签页", "closeLeft": "关闭左侧标签页",
"close-right": "关闭右侧标签页", "closeRight": "关闭右侧标签页",
"close-other": "关闭其它标签页", "closeOther": "关闭其它标签页",
"close-all": "关闭全部标签页" "closeAll": "关闭全部标签页"
} }
}, },
"navigation-menu": { "navigationMenu": {
"title": "导航菜单", "title": "导航菜单",
"style": "导航菜单风格", "style": "导航菜单风格",
"accordion": "侧边导航菜单手风琴模式", "accordion": "侧边导航菜单手风琴模式",
"split": "导航菜单分离", "split": "导航菜单分离",
"split-tip": "开启时,侧边栏显示顶栏对应菜单的子菜单" "splitTip": "开启时,侧边栏显示顶栏对应菜单的子菜单"
}, },
"breadcrumb": { "breadcrumb": {
"title": "面包屑导航", "title": "面包屑导航",
@ -182,7 +179,7 @@
"icon": "显示面包屑图标", "icon": "显示面包屑图标",
"home": "显示首页按钮", "home": "显示首页按钮",
"style": "面包屑风格", "style": "面包屑风格",
"hide-only-one": "仅有一个时隐藏", "hideOnlyOne": "仅有一个时隐藏",
"background": "背景" "background": "背景"
}, },
"animation": { "animation": {
@ -196,19 +193,19 @@
"radius": "圆角", "radius": "圆角",
"light": "浅色", "light": "浅色",
"dark": "深色", "dark": "深色",
"dark-menu": "深色菜单", "darkMenu": "深色菜单",
"weak-mode": "色弱模式", "weakMode": "色弱模式",
"gray-mode": "灰色模式", "grayMode": "灰色模式",
"builtin": { "builtin": {
"title": "内置主题", "title": "内置主题",
"default": "默认", "default": "默认",
"violet": "紫罗兰", "violet": "紫罗兰",
"pink": "樱花粉", "pink": "樱花粉",
"rose": "玫瑰红", "rose": "玫瑰红",
"sky-blue": "天蓝色", "skyBlue": "天蓝色",
"deep-blue": "深蓝色", "deepBlue": "深蓝色",
"green": "浅绿色", "green": "浅绿色",
"deep-green": "深绿色", "deepGreen": "深绿色",
"orange": "橙黄色", "orange": "橙黄色",
"yellow": "柠檬黄", "yellow": "柠檬黄",
"zinc": "锌色灰", "zinc": "锌色灰",
@ -220,10 +217,10 @@
}, },
"header": { "header": {
"title": "顶栏", "title": "顶栏",
"mode-static": "静止", "modeStatic": "静止",
"mode-fixed": "固定", "modeFixed": "固定",
"mode-auto": "自动隐藏和显示", "modeAuto": "自动隐藏和显示",
"mode-auto-scroll": "滚动隐藏和显示", "modeAutoScroll": "滚动隐藏和显示",
"visible": "显示顶栏" "visible": "显示顶栏"
}, },
"footer": { "footer": {
@ -234,13 +231,13 @@
"copyright": { "copyright": {
"title": "版权", "title": "版权",
"enable": "启用版权", "enable": "启用版权",
"company-name": "公司名", "companyName": "公司名",
"company-site-link": "公司主页", "companySiteLink": "公司主页",
"date": "日期", "date": "日期",
"icp": "ICP 备案号", "icp": "ICP 备案号",
"icp-link": "ICP 网站链接" "icpLink": "ICP 网站链接"
}, },
"shortcut-keys": { "shortcutKeys": {
"title": "快捷键", "title": "快捷键",
"global": "全局", "global": "全局",
"search": "全局搜索", "search": "全局搜索",
@ -249,13 +246,13 @@
}, },
"widget": { "widget": {
"title": "小部件", "title": "小部件",
"global-search": "启用全局搜索", "globalSearch": "启用全局搜索",
"fullscreen": "启用全屏", "fullscreen": "启用全屏",
"theme-toggle": "启用主题切换", "themeToggle": "启用主题切换",
"language-toggle": "启用语言切换", "languageToggle": "启用语言切换",
"notification": "启用通知", "notification": "启用通知",
"sidebar-toggle": "启用侧边栏切换", "sidebarToggle": "启用侧边栏切换",
"ai-assistant": "启用 AI 助手" "aiAssistant": "启用 AI 助手"
} }
} }
} }

View File

@ -37,6 +37,6 @@
}, },
"dependencies": { "dependencies": {
"@ant-design/colors": "^7.1.0", "@ant-design/colors": "^7.1.0",
"@ctrl/tinycolor": "4.1.0" "@ctrl/tinycolor": "^4.1.0"
} }
} }

View File

@ -37,7 +37,7 @@
}, },
"dependencies": { "dependencies": {
"@vue/shared": "^3.4.31", "@vue/shared": "^3.4.31",
"clsx": "2.1.1", "clsx": "^2.1.1",
"defu": "^6.1.4", "defu": "^6.1.4",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",

View File

@ -49,10 +49,10 @@ const appName = computed(() => preferences.app.name);
<div class="flex-col-center -enter-x mr-20 h-full"> <div class="flex-col-center -enter-x mr-20 h-full">
<SloganIcon :alt="appName" class="animate-float h-64 w-2/5" /> <SloganIcon :alt="appName" class="animate-float h-64 w-2/5" />
<div class="text-1xl mt-6 font-sans text-white lg:text-2xl"> <div class="text-1xl mt-6 font-sans text-white lg:text-2xl">
{{ $t('authentication.page-title') }} {{ $t('authentication.pageTitle') }}
</div> </div>
<div class="dark:text-muted-foreground mt-2 text-white/60"> <div class="dark:text-muted-foreground mt-2 text-white/60">
{{ $t('authentication.page-desc') }} {{ $t('authentication.pageDesc') }}
</div> </div>
</div> </div>
</div> </div>

View File

@ -117,7 +117,7 @@ function useTabs() {
}, },
icon: IcRoundRefresh, icon: IcRoundRefresh,
key: 'reload', key: 'reload',
text: $t('preferences.tabbar.context-menu.reload'), text: $t('preferences.tabbar.contextMenu.reload'),
}, },
{ {
disabled: !!affixTab || disabled, disabled: !!affixTab || disabled,
@ -126,7 +126,7 @@ function useTabs() {
}, },
icon: IcRoundClose, icon: IcRoundClose,
key: 'close', key: 'close',
text: $t('preferences.tabbar.context-menu.close'), text: $t('preferences.tabbar.contextMenu.close'),
}, },
{ {
handler: async () => { handler: async () => {
@ -138,8 +138,8 @@ function useTabs() {
key: 'affix', key: 'affix',
separator: true, separator: true,
text: affixTab text: affixTab
? $t('preferences.tabbar.context-menu.unpin') ? $t('preferences.tabbar.contextMenu.unpin')
: $t('preferences.tabbar.context-menu.pin'), : $t('preferences.tabbar.contextMenu.pin'),
}, },
{ {
disabled: closeLeftDisabled, disabled: closeLeftDisabled,
@ -148,7 +148,7 @@ function useTabs() {
}, },
icon: MdiFormatHorizontalAlignLeft, icon: MdiFormatHorizontalAlignLeft,
key: 'close-left', key: 'close-left',
text: $t('preferences.tabbar.context-menu.close-left'), text: $t('preferences.tabbar.contextMenu.closeLeft'),
}, },
{ {
disabled: closeRightDisabled, disabled: closeRightDisabled,
@ -158,7 +158,7 @@ function useTabs() {
icon: MdiFormatHorizontalAlignRight, icon: MdiFormatHorizontalAlignRight,
key: 'close-right', key: 'close-right',
separator: true, separator: true,
text: $t('preferences.tabbar.context-menu.close-right'), text: $t('preferences.tabbar.contextMenu.closeRight'),
}, },
{ {
disabled: closeOtherDisabled, disabled: closeOtherDisabled,
@ -167,7 +167,7 @@ function useTabs() {
}, },
icon: MdiArrowExpandHorizontal, icon: MdiArrowExpandHorizontal,
key: 'close-other', key: 'close-other',
text: $t('preferences.tabbar.context-menu.close-other'), text: $t('preferences.tabbar.contextMenu.closeOther'),
}, },
{ {
disabled, disabled,
@ -176,7 +176,7 @@ function useTabs() {
}, },
icon: IcRoundMultipleStop, icon: IcRoundMultipleStop,
key: 'close-all', 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]', // icon: 'icon-[material-symbols--back-to-tab-sharp]',

View File

@ -116,7 +116,7 @@ onMounted(() => {
<IcRoundSearch class="mt-1 size-4" /> <IcRoundSearch class="mt-1 size-4" />
<input <input
v-model="keyword" 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" 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> </DialogTitle>

View File

@ -223,7 +223,7 @@ onMounted(() => {
> >
<IcRoundSearchOff class="size-12" /> <IcRoundSearchOff class="size-12" />
<p class="my-10 text-xs"> <p class="my-10 text-xs">
{{ $t('widgets.search.no-results') }} {{ $t('widgets.search.noResults') }}
<span class="text-foreground text-sm font-medium"> <span class="text-foreground text-sm font-medium">
"{{ keyword }}" "{{ keyword }}"
</span> </span>
@ -235,7 +235,7 @@ onMounted(() => {
class="text-muted-foreground text-center" class="text-muted-foreground text-center"
> >
<p class="my-10 text-xs"> <p class="my-10 text-xs">
{{ $t('widgets.search.no-recent') }} {{ $t('widgets.search.noRecent') }}
</p> </p>
</div> </div>

View File

@ -21,7 +21,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
{ {
icon: MdiDockLeft, icon: MdiDockLeft,
key: 'panel-left', key: 'panel-left',
text: $t('authentication.layout.align-left'), text: $t('authentication.layout.alignLeft'),
}, },
{ {
icon: MdiDockBottom, icon: MdiDockBottom,
@ -31,7 +31,7 @@ const menus = computed((): VbenDropdownMenuItem[] => [
{ {
icon: MdiDockRight, icon: MdiDockRight,
key: 'panel-right', key: 'panel-right',
text: $t('authentication.layout.align-right'), text: $t('authentication.layout.alignRight'),
}, },
]); ]);

View File

@ -84,7 +84,7 @@ function handleClick(item: NotificationItem) {
<div class="flex items-center justify-between p-4 py-3"> <div class="flex items-center justify-between p-4 py-3">
<div class="text-foreground">{{ $t('widgets.notifications') }}</div> <div class="text-foreground">{{ $t('widgets.notifications') }}</div>
<VbenIconButton <VbenIconButton
:tooltip="$t('widgets.make-all-as-read')" :tooltip="$t('widgets.markAllAsRead')"
@click="handleMakeAll" @click="handleMakeAll"
> >
<IcRoundMarkEmailRead /> <IcRoundMarkEmailRead />
@ -127,7 +127,7 @@ function handleClick(item: NotificationItem) {
<template v-else> <template v-else>
<div class="flex-center text-muted-foreground min-h-[150px] w-full"> <div class="flex-center text-muted-foreground min-h-[150px] w-full">
{{ $t('common.not-data') }} {{ $t('common.noData') }}
</div> </div>
</template> </template>
@ -135,10 +135,10 @@ function handleClick(item: NotificationItem) {
class="border-border flex items-center justify-between border-t px-4 py-3" class="border-border flex items-center justify-between border-t px-4 py-3"
> >
<VbenButton size="sm" variant="ghost" @click="handleClear"> <VbenButton size="sm" variant="ghost" @click="handleClear">
{{ $t('widgets.clear-notifications') }} {{ $t('widgets.clearNotifications') }}
</VbenButton> </VbenButton>
<VbenButton size="sm" @click="handleViewAll"> <VbenButton size="sm" @click="handleViewAll">
{{ $t('widgets.view-all') }} {{ $t('widgets.viewAll') }}
</VbenButton> </VbenButton>
</div> </div>
</div> </div>

View File

@ -25,6 +25,6 @@ const localeItems: SelectListItem[] = SUPPORT_LANGUAGES.map((item) => ({
{{ $t('preferences.language') }} {{ $t('preferences.language') }}
</SelectItem> </SelectItem>
<SwitchItem v-model="appDynamicTitle"> <SwitchItem v-model="appDynamicTitle">
{{ $t('preferences.dynamic-title') }} {{ $t('preferences.dynamicTitle') }}
</SwitchItem> </SwitchItem>
</template> </template>

View File

@ -35,7 +35,7 @@ const disableItem = computed(() => {
{{ $t('preferences.breadcrumb.enable') }} {{ $t('preferences.breadcrumb.enable') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="breadcrumbHideOnlyOne" :disabled="disableItem"> <SwitchItem v-model="breadcrumbHideOnlyOne" :disabled="disableItem">
{{ $t('preferences.breadcrumb.hide-only-one') }} {{ $t('preferences.breadcrumb.hideOnlyOne') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="breadcrumbShowIcon" :disabled="disableItem"> <SwitchItem v-model="breadcrumbShowIcon" :disabled="disableItem">
{{ $t('preferences.breadcrumb.icon') }} {{ $t('preferences.breadcrumb.icon') }}

View File

@ -30,10 +30,10 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
</SwitchItem> </SwitchItem>
<InputItem v-model="copyrightCompanyName" :disabled="itemDisabled"> <InputItem v-model="copyrightCompanyName" :disabled="itemDisabled">
{{ $t('preferences.copyright.company-name') }} {{ $t('preferences.copyright.companyName') }}
</InputItem> </InputItem>
<InputItem v-model="copyrightCompanySiteLink" :disabled="itemDisabled"> <InputItem v-model="copyrightCompanySiteLink" :disabled="itemDisabled">
{{ $t('preferences.copyright.company-site-link') }} {{ $t('preferences.copyright.companySiteLink') }}
</InputItem> </InputItem>
<InputItem v-model="copyrightDate" :disabled="itemDisabled"> <InputItem v-model="copyrightDate" :disabled="itemDisabled">
{{ $t('preferences.copyright.date') }} {{ $t('preferences.copyright.date') }}
@ -43,6 +43,6 @@ const itemDisabled = computed(() => props.disabled || !copyrightEnable.value);
{{ $t('preferences.copyright.icp') }} {{ $t('preferences.copyright.icp') }}
</InputItem> </InputItem>
<InputItem v-model="copyrightIcpLink" :disabled="itemDisabled"> <InputItem v-model="copyrightIcpLink" :disabled="itemDisabled">
{{ $t('preferences.copyright.icp-link') }} {{ $t('preferences.copyright.icpLink') }}
</InputItem> </InputItem>
</template> </template>

View File

@ -17,19 +17,19 @@ const headerMode = defineModel<LayoutHeaderModeType>('headerMode');
const localeItems: SelectListItem[] = [ const localeItems: SelectListItem[] = [
{ {
label: $t('preferences.header.mode-static'), label: $t('preferences.header.modeStatic'),
value: 'static', value: 'static',
}, },
{ {
label: $t('preferences.header.mode-fixed'), label: $t('preferences.header.modeFixed'),
value: 'fixed', value: 'fixed',
}, },
{ {
label: $t('preferences.header.mode-auto'), label: $t('preferences.header.modeAuto'),
value: 'auto', value: 'auto',
}, },
{ {
label: $t('preferences.header.mode-auto-scroll'), label: $t('preferences.header.modeAutoScroll'),
value: 'auto-scroll', value: 'auto-scroll',
}, },
]; ];

View File

@ -38,27 +38,27 @@ const components: Record<LayoutType, Component> = {
const PRESET = computed((): PresetItem[] => [ const PRESET = computed((): PresetItem[] => [
{ {
name: $t('preferences.vertical'), name: $t('preferences.vertical'),
tip: $t('preferences.vertical-tip'), tip: $t('preferences.verticalTip'),
type: 'sidebar-nav', type: 'sidebar-nav',
}, },
{ {
name: $t('preferences.two-column'), name: $t('preferences.twoColumn'),
tip: $t('preferences.two-column-tip'), tip: $t('preferences.twoColumnTip'),
type: 'sidebar-mixed-nav', type: 'sidebar-mixed-nav',
}, },
{ {
name: $t('preferences.horizontal'), name: $t('preferences.horizontal'),
tip: $t('preferences.vertical-tip'), tip: $t('preferences.horizontalTip'),
type: 'header-nav', type: 'header-nav',
}, },
{ {
name: $t('preferences.mixed-menu'), name: $t('preferences.mixedMenu'),
tip: $t('preferences.mixed-menu-tip'), tip: $t('preferences.mixedMenuTip'),
type: 'mixed-nav', type: 'mixed-nav',
}, },
{ {
name: $t('preferences.full-content'), name: $t('preferences.fullContent'),
tip: $t('preferences.full-content-tip'), tip: $t('preferences.fullContentTip'),
type: 'full-content', type: 'full-content',
}, },
]); ]);

View File

@ -28,18 +28,18 @@ const stylesItems: SelectListItem[] = [
:disabled="disabled" :disabled="disabled"
:items="stylesItems" :items="stylesItems"
> >
{{ $t('preferences.navigation-menu.style') }} {{ $t('preferences.navigationMenu.style') }}
</ToggleItem> </ToggleItem>
<SwitchItem <SwitchItem
v-model="navigationSplit" v-model="navigationSplit"
:disabled="disabledNavigationSplit || disabled" :disabled="disabledNavigationSplit || disabled"
> >
{{ $t('preferences.navigation-menu.split') }} {{ $t('preferences.navigationMenu.split') }}
<template #tip> <template #tip>
{{ $t('preferences.navigation-menu.split-tip') }} {{ $t('preferences.navigationMenu.splitTip') }}
</template> </template>
</SwitchItem> </SwitchItem>
<SwitchItem v-model="navigationAccordion" :disabled="disabled"> <SwitchItem v-model="navigationAccordion" :disabled="disabled">
{{ $t('preferences.navigation-menu.accordion') }} {{ $t('preferences.navigationMenu.accordion') }}
</SwitchItem> </SwitchItem>
</template> </template>

View File

@ -29,7 +29,7 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
v-model="sidebarCollapsedShowTitle" v-model="sidebarCollapsedShowTitle"
:disabled="!sidebarEnable || disabled" :disabled="!sidebarEnable || disabled"
> >
{{ $t('preferences.sidebar.collapsed-show-title') }} {{ $t('preferences.sidebar.collapsedShowTitle') }}
</SwitchItem> </SwitchItem>
<NumberFieldItem <NumberFieldItem
v-model="sidebarWidth" v-model="sidebarWidth"

View File

@ -18,13 +18,13 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
<template> <template>
<SwitchItem v-model="widgetGlobalSearch"> <SwitchItem v-model="widgetGlobalSearch">
{{ $t('preferences.widget.global-search') }} {{ $t('preferences.widget.globalSearch') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="widgetThemeToggle"> <SwitchItem v-model="widgetThemeToggle">
{{ $t('preferences.widget.theme-toggle') }} {{ $t('preferences.widget.themeToggle') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="widgetLanguageToggle"> <SwitchItem v-model="widgetLanguageToggle">
{{ $t('preferences.widget.language-toggle') }} {{ $t('preferences.widget.languageToggle') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="widgetFullscreen"> <SwitchItem v-model="widgetFullscreen">
{{ $t('preferences.widget.fullscreen') }} {{ $t('preferences.widget.fullscreen') }}
@ -33,9 +33,9 @@ const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
{{ $t('preferences.widget.notification') }} {{ $t('preferences.widget.notification') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="widgetAiAssistant"> <SwitchItem v-model="widgetAiAssistant">
{{ $t('preferences.widget.ai-assistant') }} {{ $t('preferences.widget.aiAssistant') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="widgetSidebarToggle"> <SwitchItem v-model="widgetSidebarToggle">
{{ $t('preferences.widget.sidebar-toggle') }} {{ $t('preferences.widget.sidebarToggle') }}
</SwitchItem> </SwitchItem>
</template> </template>

View File

@ -22,21 +22,21 @@ const altView = computed(() => (isWindowsOs() ? 'Alt' : '⌥'));
<template> <template>
<SwitchItem v-model="shortcutKeysEnable"> <SwitchItem v-model="shortcutKeysEnable">
{{ $t('preferences.shortcut-keys.title') }} {{ $t('preferences.shortcutKeys.title') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysGlobalSearch"> <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysGlobalSearch">
{{ $t('preferences.shortcut-keys.search') }} {{ $t('preferences.shortcutKeys.search') }}
<template #shortcut> <template #shortcut>
{{ isWindowsOs() ? 'Ctrl' : '⌘' }} {{ isWindowsOs() ? 'Ctrl' : '⌘' }}
<kbd> K </kbd> <kbd> K </kbd>
</template> </template>
</SwitchItem> </SwitchItem>
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysLogout"> <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysLogout">
{{ $t('preferences.shortcut-keys.logout') }} {{ $t('preferences.shortcutKeys.logout') }}
<template #shortcut> {{ altView }} Q </template> <template #shortcut> {{ altView }} Q </template>
</SwitchItem> </SwitchItem>
<SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysPreferences"> <SwitchItem v-if="shortcutKeysEnable" v-model="shortcutKeysPreferences">
{{ $t('preferences.shortcut-keys.preferences') }} {{ $t('preferences.shortcutKeys.preferences') }}
<template #shortcut> {{ altView }} , </template> <template #shortcut> {{ altView }} , </template>
</SwitchItem> </SwitchItem>
</template> </template>

View File

@ -40,17 +40,17 @@ function typeView(name: BuiltinThemeType) {
return $t('preferences.theme.builtin.rose'); return $t('preferences.theme.builtin.rose');
} }
case 'sky-blue': { case 'sky-blue': {
return $t('preferences.theme.builtin.sky-blue'); return $t('preferences.theme.builtin.skyBlue');
} }
case 'deep-blue': { case 'deep-blue': {
return $t('preferences.theme.builtin.deep-blue'); return $t('preferences.theme.builtin.deepBlue');
} }
case 'green': { case 'green': {
return $t('preferences.theme.builtin.green'); return $t('preferences.theme.builtin.green');
} }
case 'deep-green': { case 'deep-green': {
return $t('preferences.theme.builtin.deep-green'); return $t('preferences.theme.builtin.deepGreen');
} }
case 'orange': { case 'orange': {
return $t('preferences.theme.builtin.orange'); return $t('preferences.theme.builtin.orange');

View File

@ -18,9 +18,9 @@ const appColorGrayMode = defineModel<boolean>('appColorGrayMode', {
<template> <template>
<SwitchItem v-model="appColorWeakMode"> <SwitchItem v-model="appColorWeakMode">
{{ $t('preferences.theme.weak-mode') }} {{ $t('preferences.theme.weakMode') }}
</SwitchItem> </SwitchItem>
<SwitchItem v-model="appColorGrayMode"> <SwitchItem v-model="appColorGrayMode">
{{ $t('preferences.theme.gray-mode') }} {{ $t('preferences.theme.grayMode') }}
</SwitchItem> </SwitchItem>
</template> </template>

View File

@ -49,7 +49,7 @@ function nameView(name: string) {
return $t('preferences.theme.dark'); return $t('preferences.theme.dark');
} }
case 'auto': { case 'auto': {
return $t('preferences.follow-system'); return $t('preferences.followSystem');
} }
} }
} }
@ -79,7 +79,7 @@ function nameView(name: string) {
:disabled="modelValue !== 'light'" :disabled="modelValue !== 'light'"
class="mt-6" class="mt-6"
> >
{{ $t('preferences.theme.dark-menu') }} {{ $t('preferences.theme.darkMenu') }}
</SwitchItem> </SwitchItem>
</div> </div>
</template> </template>

View File

@ -162,7 +162,7 @@ const tabs = computed((): SegmentedItem[] => {
value: 'layout', value: 'layout',
}, },
{ {
label: $t('preferences.shortcut-keys.title'), label: $t('preferences.shortcutKeys.title'),
value: 'shortcutKey', value: 'shortcutKey',
}, },
{ {
@ -187,8 +187,8 @@ async function handleCopy() {
await copy(JSON.stringify(diffPreference.value, null, 2)); await copy(JSON.stringify(diffPreference.value, null, 2));
toast({ toast({
description: $t('preferences.copy'), description: $t('preferences.copyPreferences'),
title: $t('preferences.copy-success'), title: $t('preferences.copyPreferencesSuccess'),
}); });
} }
@ -205,12 +205,8 @@ async function handleReset() {
resetPreferences(); resetPreferences();
await loadLocaleMessages(preferences.app.locale); await loadLocaleMessages(preferences.app.locale);
toast({ toast({
description: $t('preferences.reset-title'), description: $t('preferences.resetTitle'),
title: $t('preferences.reset-success'), title: $t('preferences.resetSuccess'),
});
toast({
description: $t('preferences.reset-title'),
title: $t('preferences.reset-success'),
}); });
} }
</script> </script>
@ -236,7 +232,7 @@ async function handleReset() {
<div class="flex items-center"> <div class="flex items-center">
<VbenIconButton <VbenIconButton
:disabled="!diffPreference" :disabled="!diffPreference"
:tooltip="$t('preferences.reset-tip')" :tooltip="$t('preferences.resetTip')"
class="relative" class="relative"
> >
<span <span
@ -323,7 +319,7 @@ async function handleReset() {
/> />
</Block> </Block>
<Block :title="$t('preferences.navigation-menu.title')"> <Block :title="$t('preferences.navigationMenu.title')">
<Navigation <Navigation
v-model:navigation-accordion="navigationAccordion" v-model:navigation-accordion="navigationAccordion"
v-model:navigation-split="navigationSplit" v-model:navigation-split="navigationSplit"
@ -384,7 +380,7 @@ async function handleReset() {
</template> </template>
<template #shortcutKey> <template #shortcutKey>
<Block :title="$t('preferences.shortcut-keys.global')"> <Block :title="$t('preferences.shortcutKeys.global')">
<GlobalShortcutKeys <GlobalShortcutKeys
v-model:shortcut-keys-enable="shortcutKeysEnable" v-model:shortcut-keys-enable="shortcutKeysEnable"
v-model:shortcut-keys-global-search="shortcutKeysGlobalSearch" v-model:shortcut-keys-global-search="shortcutKeysGlobalSearch"
@ -407,7 +403,7 @@ async function handleReset() {
@click="handleClearCache" @click="handleClearCache"
> >
<IcRoundRestartAlt class="mr-2 size-4" /> <IcRoundRestartAlt class="mr-2 size-4" />
{{ $t('preferences.clear-and-logout') }} {{ $t('preferences.clearAndLogout') }}
</VbenButton> </VbenButton>
<VbenButton <VbenButton
:disabled="!diffPreference" :disabled="!diffPreference"
@ -417,7 +413,7 @@ async function handleReset() {
@click="handleCopy" @click="handleCopy"
> >
<IcRoundFolderCopy class="mr-2 size-3" /> <IcRoundFolderCopy class="mr-2 size-3" />
{{ $t('preferences.copy') }} {{ $t('preferences.copyPreferences') }}
</VbenButton> </VbenButton>
</template> </template>
</VbenSheet> </VbenSheet>

View File

@ -49,7 +49,7 @@ const PRESETS = [
{ {
icon: IcRoundMotionPhotosAuto, icon: IcRoundMotionPhotosAuto,
name: 'auto', name: 'auto',
title: $t('preferences.follow-system'), title: $t('preferences.followSystem'),
}, },
]; ];
</script> </script>

View File

@ -121,7 +121,7 @@ if (enableShortcutKey.value) {
<VbenAlertDialog <VbenAlertDialog
v-model:open="openDialog" v-model:open="openDialog"
:cancel-text="$t('common.cancel')" :cancel-text="$t('common.cancel')"
:content="$t('widgets.logout-tip')" :content="$t('widgets.logoutTip')"
:submit-text="$t('common.confirm')" :submit-text="$t('common.confirm')"
:title="$t('common.prompt')" :title="$t('common.prompt')"
@submit="handleSubmitLogout" @submit="handleSubmitLogout"

View File

@ -52,8 +52,8 @@ const isValidPhoneNumber = computed(() => {
const btnText = computed(() => { const btnText = computed(() => {
return countdown.value > 0 return countdown.value > 0
? $t('authentication.send-text', [countdown.value]) ? $t('authentication.sendText', [countdown.value])
: $t('authentication.send-code'); : $t('authentication.sendCode');
}); });
const btnLoading = computed(() => { const btnLoading = computed(() => {
return countdown.value > 0; return countdown.value > 0;
@ -117,10 +117,10 @@ onBeforeUnmount(() => {
<template> <template>
<div> <div>
<Title> <Title>
{{ $t('authentication.welcome-back') }} 📲 {{ $t('authentication.welcomeBack') }} 📲
<template #desc> <template #desc>
<span class="text-muted-foreground"> <span class="text-muted-foreground">
{{ $t('authentication.code-subtitle') }} {{ $t('authentication.codeSubtitle') }}
</span> </span>
</template> </template>
</Title> </Title>
@ -140,7 +140,7 @@ onBeforeUnmount(() => {
:btn-loading="btnLoading" :btn-loading="btnLoading"
:btn-text="btnText" :btn-text="btnText"
:code-length="4" :code-length="4"
:error-tip="$t('authentication.code-tip')" :error-tip="$t('authentication.codeTip')"
:handle-send-code="handleSendCode" :handle-send-code="handleSendCode"
:label="$t('authentication.code')" :label="$t('authentication.code')"
:placeholder="$t('authentication.code')" :placeholder="$t('authentication.code')"

View File

@ -58,15 +58,15 @@ function goLogin() {
<template> <template>
<div> <div>
<Title> <Title>
{{ $t('authentication.forget-password') }} 🤦🏻 {{ $t('authentication.forgetPassword') }} 🤦🏻
<template #desc> <template #desc>
{{ $t('authentication.forget-password-subtitle') }} {{ $t('authentication.forgetPasswordSubtitle') }}
</template> </template>
</Title> </Title>
<div class="mb-6"> <div class="mb-6">
<VbenInput <VbenInput
v-model="formState.email" v-model="formState.email"
:error-tip="$t('authentication.email-tip')" :error-tip="$t('authentication.emailTip')"
:label="$t('authentication.email')" :label="$t('authentication.email')"
:status="emailStatus" :status="emailStatus"
autofocus autofocus
@ -77,7 +77,7 @@ function goLogin() {
</div> </div>
<div> <div>
<VbenButton class="mt-2 w-full" @click="handleSubmut"> <VbenButton class="mt-2 w-full" @click="handleSubmut">
{{ $t('authentication.send-reset-link') }} {{ $t('authentication.sendResetLink') }}
</VbenButton> </VbenButton>
<VbenButton class="mt-4 w-full" variant="outline" @click="goLogin()"> <VbenButton class="mt-4 w-full" variant="outline" @click="goLogin()">
{{ $t('common.back') }} {{ $t('common.back') }}

View File

@ -150,10 +150,10 @@ function handleGo(path: string) {
<template> <template>
<div @keypress.enter.prevent="handleSubmit"> <div @keypress.enter.prevent="handleSubmit">
<Title> <Title>
{{ $t('authentication.welcome-back') }} 👋🏻 {{ $t('authentication.welcomeBack') }} 👋🏻
<template #desc> <template #desc>
<span class="text-muted-foreground"> <span class="text-muted-foreground">
{{ $t('authentication.login-subtitle') }} {{ $t('authentication.loginSubtitle') }}
</span> </span>
</template> </template>
</Title> </Title>
@ -161,7 +161,7 @@ function handleGo(path: string) {
<VbenInput <VbenInput
v-model="formState.username" v-model="formState.username"
:autofocus="false" :autofocus="false"
:error-tip="$t('authentication.username-tip')" :error-tip="$t('authentication.usernameTip')"
:label="$t('authentication.username')" :label="$t('authentication.username')"
:placeholder="usernamePlaceholder || $t('authentication.username')" :placeholder="usernamePlaceholder || $t('authentication.username')"
:status="usernameStatus" :status="usernameStatus"
@ -171,7 +171,7 @@ function handleGo(path: string) {
/> />
<VbenInputPassword <VbenInputPassword
v-model="formState.password" v-model="formState.password"
:error-tip="$t('authentication.password-tip')" :error-tip="$t('authentication.passwordTip')"
:label="$t('authentication.password')" :label="$t('authentication.password')"
:placeholder="passwordPlaceholder || $t('authentication.password')" :placeholder="passwordPlaceholder || $t('authentication.password')"
:status="passwordStatus" :status="passwordStatus"
@ -183,7 +183,7 @@ function handleGo(path: string) {
<div class="mb-6 mt-4 flex justify-between"> <div class="mb-6 mt-4 flex justify-between">
<div class="flex-center flex"> <div class="flex-center flex">
<VbenCheckbox v-model:checked="formState.rememberMe" name="rememberMe"> <VbenCheckbox v-model:checked="formState.rememberMe" name="rememberMe">
{{ $t('authentication.remember-me') }} {{ $t('authentication.rememberMe') }}
</VbenCheckbox> </VbenCheckbox>
</div> </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" class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
@click="handleGo(forgetPasswordPath)" @click="handleGo(forgetPasswordPath)"
> >
{{ $t('authentication.forget-password') }} {{ $t('authentication.forgetPassword') }}
</span> </span>
<!-- <VbenButton variant="ghost" @click="handleGo('/auth/forget-password')"> <!-- <VbenButton variant="ghost" @click="handleGo('/auth/forget-password')">
@ -210,7 +210,7 @@ function handleGo(path: string) {
variant="outline" variant="outline"
@click="handleGo(codeLoginPath)" @click="handleGo(codeLoginPath)"
> >
{{ $t('authentication.mobile-login') }} {{ $t('authentication.mobileLogin') }}
</VbenButton> </VbenButton>
<VbenButton <VbenButton
v-if="showQrcodeLogin" v-if="showQrcodeLogin"
@ -218,7 +218,7 @@ function handleGo(path: string) {
variant="outline" variant="outline"
@click="handleGo(qrCodeLoginPath)" @click="handleGo(qrCodeLoginPath)"
> >
{{ $t('authentication.qrcode-login') }} {{ $t('authentication.qrcodeLogin') }}
</VbenButton> </VbenButton>
<!-- <VbenButton <!-- <VbenButton
:loading="loading" :loading="loading"
@ -234,12 +234,12 @@ function handleGo(path: string) {
<ThirdPartyLogin v-if="showThirdPartyLogin" /> <ThirdPartyLogin v-if="showThirdPartyLogin" />
<div v-if="showRegister" class="text-center text-sm"> <div v-if="showRegister" class="text-center text-sm">
{{ $t('authentication.account-tip') }} {{ $t('authentication.accountTip') }}
<span <span
class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal" class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal"
@click="handleGo(registerPath)" @click="handleGo(registerPath)"
> >
{{ $t('authentication.create-account') }} {{ $t('authentication.createAccount') }}
</span> </span>
</div> </div>
</div> </div>

View File

@ -47,10 +47,10 @@ function goLogin() {
<template> <template>
<div> <div>
<Title> <Title>
{{ $t('authentication.welcome-back') }} 📱 {{ $t('authentication.welcomeBack') }} 📱
<template #desc> <template #desc>
<span class="text-muted-foreground"> <span class="text-muted-foreground">
{{ $t('authentication.qrcode-subtitle') }} {{ $t('authentication.qrcodeSubtitle') }}
</span> </span>
</template> </template>
</Title> </Title>
@ -58,7 +58,7 @@ function goLogin() {
<div class="flex-col-center mt-6"> <div class="flex-col-center mt-6">
<img :src="qrcode" alt="qrcode" class="w-1/2" /> <img :src="qrcode" alt="qrcode" class="w-1/2" />
<p class="text-muted-foreground mt-4 text-sm"> <p class="text-muted-foreground mt-4 text-sm">
{{ $t('authentication.qrcode-prompt') }} {{ $t('authentication.qrcodePrompt') }}
</p> </p>
</div> </div>

View File

@ -86,12 +86,12 @@ function goLogin() {
<template> <template>
<div> <div>
<Title> <Title>
{{ $t('authentication.create-an-account') }} 🚀 {{ $t('authentication.createAnAccount') }} 🚀
<template #desc> {{ $t('authentication.sign-up-subtitle') }} </template> <template #desc> {{ $t('authentication.signUpSubtitle') }} </template>
</Title> </Title>
<VbenInput <VbenInput
v-model="formState.username" v-model="formState.username"
:error-tip="$t('authentication.username-tip')" :error-tip="$t('authentication.usernameTip')"
:label="$t('authentication.username')" :label="$t('authentication.username')"
:placeholder="$t('authentication.username')" :placeholder="$t('authentication.username')"
:status="usernameStatus" :status="usernameStatus"
@ -101,7 +101,7 @@ function goLogin() {
<!-- Use 8 or more characters with a mix of letters, numbers & symbols. --> <!-- Use 8 or more characters with a mix of letters, numbers & symbols. -->
<VbenInputPassword <VbenInputPassword
v-model="formState.password" v-model="formState.password"
:error-tip="$t('authentication.password-tip')" :error-tip="$t('authentication.passwordTip')"
:label="$t('authentication.password')" :label="$t('authentication.password')"
:password-strength="true" :password-strength="true"
:placeholder="$t('authentication.password')" :placeholder="$t('authentication.password')"
@ -111,15 +111,15 @@ function goLogin() {
type="password" type="password"
> >
<template #strengthText> <template #strengthText>
{{ $t('authentication.password-strength') }} {{ $t('authentication.passwordStrength') }}
</template> </template>
</VbenInputPassword> </VbenInputPassword>
<VbenInputPassword <VbenInputPassword
v-model="formState.comfirmPassword" v-model="formState.comfirmPassword"
:error-tip="$t('authentication.comfirm-password-tip')" :error-tip="$t('authentication.confirmPasswordTip')"
:label="$t('authentication.comfirm-password')" :label="$t('authentication.confirmPassword')"
:placeholder="$t('authentication.comfirm-password')" :placeholder="$t('authentication.confirmPassword')"
:status="comfirmPasswordStatus" :status="comfirmPasswordStatus"
name="comfirmPassword" name="comfirmPassword"
required required
@ -132,13 +132,13 @@ function goLogin() {
v-model:checked="formState.agreePolicy" v-model:checked="formState.agreePolicy"
name="agreePolicy" name="agreePolicy"
> >
{{ $t('authentication.sign-up-agree') }} {{ $t('authentication.agree') }}
<span class="text-primary hover:text-primary-hover">{{ <span class="text-primary hover:text-primary-hover">{{
$t('authentication.sign-up-privacy-policy') $t('authentication.agreeprivacyPolicy')
}}</span> }}</span>
& &
<span class="text-primary hover:text-primary-hover"> <span class="text-primary hover:text-primary-hover">
{{ $t('authentication.sign-up-terms') }} {{ $t('authentication.terms') }}
</span> </span>
</VbenCheckbox> </VbenCheckbox>
</div> </div>
@ -147,22 +147,22 @@ function goLogin() {
v-show="formState.submitted && !formState.agreePolicy" v-show="formState.submitted && !formState.agreePolicy"
class="text-destructive absolute bottom-1 left-0 text-xs" class="text-destructive absolute bottom-1 left-0 text-xs"
> >
{{ $t('authentication.sign-up-agree-tip') }} {{ $t('authentication.agreeTip') }}
</p> </p>
</Transition> </Transition>
</div> </div>
<div> <div>
<VbenButton :loading="loading" class="w-full" @click="handleSubmit"> <VbenButton :loading="loading" class="w-full" @click="handleSubmit">
{{ $t('authentication.sign-up') }} {{ $t('authentication.signUp') }}
</VbenButton> </VbenButton>
</div> </div>
<div class="mt-4 text-center text-sm"> <div class="mt-4 text-center text-sm">
{{ $t('authentication.already-account') }} {{ $t('authentication.alreadyHaveAccount') }}
<span <span
class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal" class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal"
@click="goLogin()" @click="goLogin()"
> >
{{ $t('authentication.go-login') }} {{ $t('authentication.goToLogin') }}
</span> </span>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@ defineOptions({
<div class="mt-4 flex items-center justify-between"> <div class="mt-4 flex items-center justify-between">
<span class="border-input w-[35%] border-b dark:border-gray-600"></span> <span class="border-input w-[35%] border-b dark:border-gray-600"></span>
<span class="text-muted-foreground text-center text-xs uppercase"> <span class="text-muted-foreground text-center text-xs uppercase">
{{ $t('authentication.third-party-login') }} {{ $t('authentication.thirdPartyLogin') }}
</span> </span>
<span class="border-input w-[35%] border-b dark:border-gray-600"></span> <span class="border-input w-[35%] border-b dark:border-gray-600"></span>
</div> </div>

View File

@ -43,13 +43,13 @@ const titleText = computed(() => {
return $t('fallback.forbidden'); return $t('fallback.forbidden');
} }
case '404': { case '404': {
return $t('fallback.page-not-found'); return $t('fallback.pageNotFound');
} }
case '500': { case '500': {
return $t('fallback.internal-error'); return $t('fallback.internalError');
} }
case 'offline': { case 'offline': {
return $t('fallback.offline-error'); return $t('fallback.offlineError');
} }
case 'comming-soon': { case 'comming-soon': {
return $t('fallback.coming-soon'); return $t('fallback.coming-soon');
@ -66,16 +66,16 @@ const descText = computed(() => {
} }
switch (props.status) { switch (props.status) {
case '403': { case '403': {
return $t('fallback.forbidden-desc'); return $t('fallback.forbiddenDesc');
} }
case '404': { case '404': {
return $t('fallback.page-not-found-desc'); return $t('fallback.pageNotFoundDesc');
} }
case '500': { case '500': {
return $t('fallback.internal-error-desc'); return $t('fallback.internalErrorDesc');
} }
case 'offline': { case 'offline': {
return $t('fallback.offline-error-desc'); return $t('fallback.offlineErrorDesc');
} }
default: { default: {
return ''; return '';
@ -152,7 +152,7 @@ function refresh() {
<slot v-if="$slots.action" name="action"></slot> <slot v-if="$slots.action" name="action"></slot>
<VbenButton v-else-if="showBack" size="lg" @click="back"> <VbenButton v-else-if="showBack" size="lg" @click="back">
<IcRoundArrowBackIosNew class="mr-2" /> <IcRoundArrowBackIosNew class="mr-2" />
{{ $t('common.back-to-home') }} {{ $t('common.backToHome') }}
</VbenButton> </VbenButton>
<VbenButton v-else-if="showRefresh" size="lg" @click="refresh"> <VbenButton v-else-if="showRefresh" size="lg" @click="refresh">
<IcRoundRefresh class="mr-2" /> <IcRoundRefresh class="mr-2" />

File diff suppressed because it is too large Load Diff