* feat: enable project-scoped preferences extension tabs Add a typed extension schema so subprojects can define extra settings, render them in the shared preferences drawer only when configured, and consume them in playground as a real feature demo. Extension labels now follow locale keys instead of hardcoded app-specific strings. Constraint: Reuse the shared preferences drawer and field blocks Rejected: Add app-specific fields to core preferences | too tightly coupled Rejected: Inline localized label objects | breaks existing locale-key flow Confidence: high Scope-risk: moderate Reversibility: clean Directive: Keep extension labels as locale keys rendered via $t in UI Tested: Vitest preferences tests Tested: Turbo typecheck for preferences, layouts, web-antd, and playground Tested: ESLint for touched preferences and playground files Not-tested: Manual browser interaction in playground preferences drawer * fix: satisfy lint formatting for preferences extension demo Adjust the playground preferences extension demo template so formatter and Vue template lint rules agree on the rendered markup. This keeps CI green without changing runtime behavior. Constraint: Must preserve the existing demo behavior while fixing CI only Rejected: Disable the Vue newline rule | would weaken shared lint guarantees Confidence: high Scope-risk: narrow Reversibility: clean Directive: Prefer computed/template structures that avoid formatter-vs-lint conflicts Tested: pnpm run lint Not-tested: Manual browser interaction in playground preferences extension demo * fix: harden custom preferences validation and i18n labels Tighten custom preferences handling so numeric extension fields respect min, max, and step constraints. Number inputs now ignore NaN values, and web-antd extension metadata uses locale keys instead of raw strings. Also align tip-based hover guards in shared preference inputs/selects. Constraint: Keep fixes scoped to verified findings only Rejected: Broader refactor of preferences field components | not needed for these fixes Confidence: high Scope-risk: narrow Reversibility: clean Directive: Reuse the same validation path for updates and cache hydration Tested: Vitest preferences tests Tested: ESLint for touched preferences and widget files Tested: Typecheck for web-antd, layouts, and core preferences Not-tested: Manual browser interaction for all preference field variants * fix: remove localized default from playground extension config Drop the hardcoded Chinese default value from the playground extension report title field and fall back to an empty string instead. This keeps extension config locale-neutral while preserving localized labels and placeholders through translation keys. Constraint: Keep the fix limited to the verified localized default issue Rejected: Compute the default from runtime locale in config | unnecessary for this finding Confidence: high Scope-risk: narrow Reversibility: clean Directive: Avoid embedding localized literals in extension default values Tested: ESLint for playground/src/preferences.ts Tested: Oxfmt check for playground/src/preferences.ts Not-tested: Manual playground preferences interaction * docs: document project-scoped preferences extension workflow Add Chinese and English guide sections explaining how to define, initialize, read, and update project-scoped preferences extensions. Also document numeric field validation and point readers to the playground demo for a complete example. Constraint: Keep this docs-only and aligned with the shipped API Rejected: Update only Chinese docs | would leave English docs inconsistent Confidence: high Scope-risk: narrow Reversibility: clean Directive: Keep zh/en examples and playground demo paths synchronized Tested: git diff --check; pnpm build:docs Not-tested: Manual browser review of the rendered docs site * fix: harden custom preferences defaults and baselines Use a locale-neutral default for the web-antd report title. Also stop preference getters from exposing mutable baseline or extension schema objects, and add a regression test for external mutation attempts. Constraint: Keep behavior compatible with the shipped preferences API Rejected: Return raw refs with readonly typing only | callers could still mutate internals Confidence: high Scope-risk: narrow Reversibility: clean Directive: Keep defensive copies for baseline and schema getters unless storage semantics change Tested: eslint, oxlint, targeted vitest, filtered typecheck, git diff --check Not-tested: Full monorepo typecheck and test suite * test: relax custom preference cache key matching Avoid coupling the custom-number cache test to one exact localStorage key string. Match the intended cache lookup more loosely so the test still verifies filtering behavior without depending on the full namespaced cache key. Constraint: Focus the test on cache filtering behavior Rejected: Assert one exact key | brittle with namespace changes Confidence: high Scope-risk: narrow Reversibility: clean Directive: Prefer behavior tests over literal storage keys Tested: targeted vitest, eslint, git diff --check Not-tested: Full monorepo test suite --------- Co-authored-by: caisin <caisin@caisins-Mac-mini.local>
230 lines
7.5 KiB
JSON
230 lines
7.5 KiB
JSON
{
|
|
"title": "Preferences",
|
|
"subtitle": "Customize Preferences & Preview in Real Time",
|
|
"enableStickyPreferencesNavigationBar": "Enable sticky preferences navigation bar",
|
|
"disableStickyPreferencesNavigationBar": "Disable sticky preferences navigation bar",
|
|
"resetTip": "Data has changed, click to reset",
|
|
"resetTitle": "Reset Preferences",
|
|
"resetSuccess": "Preferences reset successfully",
|
|
"appearance": "Appearance",
|
|
"layout": "Layout",
|
|
"content": "Content",
|
|
"other": "Other",
|
|
"wide": "Wide",
|
|
"compact": "Fixed",
|
|
"followSystem": "Follow System",
|
|
"vertical": "Vertical",
|
|
"verticalTip": "Side vertical menu mode",
|
|
"horizontal": "Horizontal",
|
|
"horizontalTip": "Horizontal menu mode, all menus displayed at the top",
|
|
"twoColumn": "Two Column",
|
|
"twoColumnTip": "Vertical Two Column Menu Mode",
|
|
"headerSidebarNav": "Header Vertical",
|
|
"headerSidebarNavTip": "Header Full Width, Sidebar Navigation Mode",
|
|
"headerTwoColumn": "Header Two Column",
|
|
"headerTwoColumnTip": "Header Navigation & Sidebar Two Column co-exists",
|
|
"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",
|
|
"copyPreferences": "Copy Preferences",
|
|
"enableCopyPreferences": "Show copy preferences button",
|
|
"copyPreferencesSuccessTitle": "Copy successful",
|
|
"copyPreferencesSuccess": "Copy successful, please override in `src/preferences.ts` under app",
|
|
"clearAndLogout": "Clear Cache & Logout",
|
|
"mode": "Mode",
|
|
"general": "General",
|
|
"language": "Language",
|
|
"dynamicTitle": "Dynamic Title",
|
|
"watermark": "Watermark",
|
|
"watermarkContent": "Please input Watermark content",
|
|
"checkUpdates": "Periodic update check",
|
|
"position": {
|
|
"title": "Preferences Postion",
|
|
"header": "Header",
|
|
"auto": "Auto",
|
|
"fixed": "Fixed"
|
|
},
|
|
"sidebar": {
|
|
"buttons": "Show Buttons",
|
|
"buttonFixed": "Fixed",
|
|
"buttonCollapsed": "Collapsed",
|
|
"title": "Sidebar",
|
|
"width": "Width",
|
|
"visible": "Show Sidebar",
|
|
"draggable": "Drag Sidebar Menu",
|
|
"collapsed": "Collpase Menu",
|
|
"collapsedShowTitle": "Show Menu Title",
|
|
"autoActivateChild": "Auto Activate SubMenu",
|
|
"autoActivateChildTip": "`Enabled` to automatically activate the submenu while click menu.",
|
|
"expandOnHover": "Expand On Hover",
|
|
"expandOnHoverTip": "When the mouse hovers over menu, \n `Enabled` to expand children menus \n `Disabled` to expand whole sidebar."
|
|
},
|
|
"tabbar": {
|
|
"title": "Tabbar",
|
|
"enable": "Enable Tab Bar",
|
|
"icon": "Show Tabbar Icon",
|
|
"showMore": "Show More Button",
|
|
"showMaximize": "Show Maximize Button",
|
|
"persist": "Persist Tabs",
|
|
"visitHistory": "Visit History",
|
|
"visitHistoryTip": "When enabled, the tab bar records tab visit history. \nClosing the current tab will automatically select the last opened tab.",
|
|
"maxCount": "Max Count of Tabs",
|
|
"maxCountTip": "When the number of tabs exceeds the maximum,\nthe oldest tab will be closed.\n Set to 0 to disable count checking.",
|
|
"draggable": "Enable Draggable Sort",
|
|
"wheelable": "Support Mouse Wheel",
|
|
"middleClickClose": "Close Tab when Mouse Middle Button Click",
|
|
"wheelableTip": "When enabled, the Tabbar area responds to vertical scrolling events of the scroll wheel.",
|
|
"styleType": {
|
|
"title": "Tabs Style",
|
|
"chrome": "Chrome",
|
|
"card": "Card",
|
|
"plain": "Plain",
|
|
"brisk": "Brisk"
|
|
},
|
|
"contextMenu": {
|
|
"reload": "Reload",
|
|
"close": "Close",
|
|
"pin": "Pin",
|
|
"unpin": "Unpin",
|
|
"closeLeft": "Close Left Tabs",
|
|
"closeRight": "Close Right Tabs",
|
|
"closeOther": "Close Other Tabs",
|
|
"closeAll": "Close All Tabs",
|
|
"openInNewWindow": "Open in New Window",
|
|
"maximize": "Maximize",
|
|
"restoreMaximize": "Restore"
|
|
}
|
|
},
|
|
"navigationMenu": {
|
|
"title": "Navigation Menu",
|
|
"style": "Navigation Menu Style",
|
|
"accordion": "Sidebar Accordion Menu",
|
|
"split": "Navigation Menu Separation",
|
|
"splitTip": "When enabled, the sidebar displays the top bar's submenu"
|
|
},
|
|
"breadcrumb": {
|
|
"title": "Breadcrumb",
|
|
"home": "Show Home Button",
|
|
"enable": "Enable Breadcrumb",
|
|
"icon": "Show Breadcrumb Icon",
|
|
"background": "background",
|
|
"style": "Breadcrumb Style",
|
|
"hideOnlyOne": "Hidden when only one"
|
|
},
|
|
"animation": {
|
|
"title": "Animation",
|
|
"loading": "Page Loading",
|
|
"transition": "Page Transition",
|
|
"progress": "Page Progress"
|
|
},
|
|
"theme": {
|
|
"title": "Theme",
|
|
"radius": "Radius",
|
|
"fontSize": "Font Size",
|
|
"fontSizeTip": "Adjust global font size with real-time preview",
|
|
"light": "Light",
|
|
"dark": "Dark",
|
|
"darkSidebar": "Semi Dark Sidebar",
|
|
"darkSidebarTip": "It can be enabled when the theme is light, and the layout is neither 'Horizontal' nor 'Full Content'.",
|
|
"darkSidebarSub": "Semi Dark Sidebar Sub",
|
|
"darkSidebarSubTip": "It can be enabled when the theme is light, the semi dark sidebar is enabled, and the layout uses 'Two-Column' menu mode.",
|
|
"darkHeader": "Semi Dark Header",
|
|
"weakMode": "Weak Mode",
|
|
"grayMode": "Gray Mode",
|
|
"builtin": {
|
|
"title": "Built-in",
|
|
"default": "Default",
|
|
"violet": "Violet",
|
|
"pink": "Pink",
|
|
"rose": "Rose",
|
|
"skyBlue": "Sky Blue",
|
|
"deepBlue": "Deep Blue",
|
|
"green": "Green",
|
|
"deepGreen": "Deep Green",
|
|
"orange": "Orange",
|
|
"yellow": "Yellow",
|
|
"zinc": "Zinc",
|
|
"neutral": "Neutral",
|
|
"slate": "Slate",
|
|
"gray": "Gray",
|
|
"custom": "Custom"
|
|
}
|
|
},
|
|
"header": {
|
|
"title": "Header",
|
|
"visible": "Show Header",
|
|
"modeStatic": "Static",
|
|
"modeFixed": "Fixed",
|
|
"modeAuto": "Auto hide & Show",
|
|
"modeAutoScroll": "Scroll to Hide & Show",
|
|
"menuAlign": "Menu Align",
|
|
"menuAlignStart": "Start",
|
|
"menuAlignEnd": "End",
|
|
"menuAlignCenter": "Center"
|
|
},
|
|
"footer": {
|
|
"title": "Footer",
|
|
"visible": "Show Footer",
|
|
"fixed": "Fixed at Bottom"
|
|
},
|
|
"copyright": {
|
|
"title": "Copyright",
|
|
"enable": "Enable Copyright",
|
|
"companyName": "Company Name",
|
|
"companySiteLink": "Company Site Link",
|
|
"date": "Date",
|
|
"icp": "ICP License Number",
|
|
"icpLink": "ICP Site Link"
|
|
},
|
|
"shortcutKeys": {
|
|
"title": "Shortcut Keys",
|
|
"global": "Global",
|
|
"search": "Global Search",
|
|
"logout": "Logout",
|
|
"preferences": "Preferences"
|
|
},
|
|
"widget": {
|
|
"title": "Widget",
|
|
"globalSearch": "Enable Global Search",
|
|
"fullscreen": "Enable Fullscreen",
|
|
"themeToggle": "Enable Theme Toggle",
|
|
"languageToggle": "Enable Language Toggle",
|
|
"notification": "Enable Notification",
|
|
"sidebarToggle": "Enable Sidebar Toggle",
|
|
"lockScreen": "Enable Lock Screen",
|
|
"refresh": "Enable Refresh"
|
|
},
|
|
"antd": {
|
|
"tabLabel": "Antd Extension",
|
|
"title": "Business Preferences",
|
|
"fields": {
|
|
"enableFormFullscreen": {
|
|
"label": "Enable Form Fullscreen Mode",
|
|
"tip": "Subprojects can read this extension configuration in their own business scenarios."
|
|
},
|
|
"tenantMode": {
|
|
"label": "Tenant Mode",
|
|
"options": {
|
|
"single": {
|
|
"label": "Single Tenant"
|
|
},
|
|
"multi": {
|
|
"label": "Multi Tenant"
|
|
}
|
|
}
|
|
},
|
|
"defaultTableSize": {
|
|
"label": "Default Page Size"
|
|
},
|
|
"reportTitle": {
|
|
"label": "Default Report Title",
|
|
"placeholder": "Please enter the default report title"
|
|
}
|
|
}
|
|
}
|
|
}
|