f9821553b3
* fix(ci): fix release workflow artifact upload issue - Split artifact upload into 3 separate steps (Chrome, Firefox, Source) - Update download steps to match new artifact names - Add if-no-files-found: error for better error handling - Fix Node.js 20 compatibility issue with upload-artifact@v4 glob pattern * docs: 更新 AGENTS.md,添加测试工具和翻译文件结构说明 * docs: 更新 AGENTS.md,完善 CI 步骤和存储键名格式说明 * fix: remove unnecessary animations from StorageCleaner page - Remove entrance animations (animate-in, fade-in, zoom-in) from all components - Remove scale effect (active:scale-[0.99]) from clean button - Remove transition effects (transition-all, transition-colors) from OptionItem, StorageOptionsGrid, AutoRefreshToggle - Remove bouncing animation from error icon - Remove pulsing animation from warning banner - Keep animate-spin on button loading spinner as functional indicator * fix: remove unnecessary animations from RightClickRestorer page * fix: remove all unnecessary animations from all pages - Remove dead code animations (animate-in, fade-in, slide-in, zoom-in, shake) from tailwindcss-animate plugin (not installed) - Remove decorative transition effects (transition-all, transition-colors) from all page components - Remove scale effects (active:scale-95) from buttons - Remove bounce animations (animate-bounce) from icons - Keep functional animate-spin on loading spinners as they provide essential loading feedback Affected pages: Dashboard, Timestamp, Jwt, JsonTools, Base64Converter, HtmlToMarkdown, MarkdownToHtml, QrCode, TextStatistics * docs: 添加项目文档(copilot-instructions、编码规范、各目录 README) - 新增 .github/copilot-instructions.md:Copilot 指令文件,涵盖构建命令、CI 流水线、项目架构、关键规范 - 新增 .github/CODING_STANDARDS.md:完整的代码编写规范文档(TypeScript、React、样式、错误处理、命名、测试、Hook、i18n、存储等 12 个章节) - 新增 11 个目录的 README.md:components、components/ui、config、entrypoints、i18n、lib、pages、providers、public、src、types、utils - 更新 AGENTS.md:补充页面组件模式说明和 components/ui 目录 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(CopyButton): use shadcn buttonVariants instead of duplicated variant classes Remove hand-written variantClasses/sizeClasses that duplicated shadcn's buttonVariants. Now extends ButtonProps and imports buttonVariants from components/ui/button for consistent styling. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(ErrorBoundary): use shadcn destructive tokens instead of hardcoded red colors Replace hardcoded red-200/red-50/red-600 with border-destructive, bg-destructive/5, text-destructive. Use variant='destructive' on Button. Align error log styling with PageErrorBoundary. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(TextInputArea): replace hardcoded Chinese strings with i18n t() calls Use existing translation keys for clear success, copy success, and copy error messages instead of hardcoded Chinese text. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(QrCodePreview): use shadcn Button instead of manual button styles Replace hand-written button class strings with shadcn Button component using outline and default variants. Removes ~15 lines of duplicated Tailwind classes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(GlobalSnackbar): clarify relationship with sonner toast Add note explaining when to use GlobalSnackbar (provider context, severity levels, custom positioning) vs sonner toast (simple one-off messages). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(ImageUploader): wrap handleClearFile with useCallback Prevents unnecessary re-renders by memoizing the callback, consistent with handleFileChange which already uses useCallback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(SwitchButtonGroup): remove redundant containerPadding conditional Both branches of the ternary returned 'p-1'. Inline the constant directly into the className string. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(TopBar): add missing openExtensionPage import The function was called in handleOpenInTab but never imported from utils/chromeTabs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(TopBar): add selectedIndex boundary protection in keyboard nav Guard against out-of-bounds access when search results change during keyboard navigation. Check selectedIndex < totalItems before accessing arrays. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(RouterContainer): remove unnecessary empty-dep useMemo getEntryPointType() is a simple config getter. Replace useMemo(() => ..., []) with a direct call — the empty dep array made the memo pointless. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(i18n): add missing translation keys for error boundaries and copy messages Add keys for errorBoundary, pageErrorBoundary, router, and messages.copyEmpty in both zh and en locales. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(CopyButton): replace hardcoded Chinese strings with i18n t() calls Use useTranslation('common') for tooltip, copy empty/success/error toast messages. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(ErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC Use react-i18next withTranslation HOC for class component to translate title, description, and refresh button text. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(PageErrorBoundary): replace hardcoded Chinese with i18n via withTranslation HOC Use react-i18next withTranslation HOC for class component to translate title, description, and retry button text. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(RouterContainer): replace hardcoded Chinese with i18n t() calls Use useTranslation('common') for 404 page title and description with entryPointType interpolation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(pages): 修复 TypeScript 错误、硬编码字符串,移除死代码 - 修复 LiveClock.tsx CopyButton size 属性类型错误 (small → sm) - 修复 ToolCard.tsx 紫色 RGB 值拼写错误 (147,51,2 purple → 147,51,232) - 替换 4 处硬编码中文为 i18n 调用 (StorageCleaner, JsonTools) - MarkdownToHtml 预览链接色改为 CSS 变量以支持暗黑模式 - 移除 Base64Converter 中已被 Base64ConverterSection 替代的死代码 (FileMode.tsx, ImageMode.tsx 及其测试文件) - 更新 README.md 移除对已删除文件的引用 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(CopyButton, LiveClock): 修改按钮大小为 'icon',移除硬编码颜色配置 * refactor(TextInputArea): 复用 CopyButton 组件替换内联复制逻辑 * fix(test): 修复 CopyButton mock 未捕获 clipboard writeText 异常 * refactor: 迁移 i18n 系统从 react-i18next 到 chrome.i18n - 移除 react-i18next、i18next 及相关依赖 - 删除旧的 i18n/ 目录和 useLazyTranslation 工具 - 新增 utils/chromeI18n.ts 类型安全 wrapper(useI18n Hook + getMessage) - 生成 public/_locales/{zh,en}/messages.json(298 个翻译 key) - 批量更新 39+ 组件文件的导入和翻译调用 - 转换翻译键格式:namespace:key → namespace_key - 修复 ErrorBoundary/PageErrorBoundary 从 withTranslation HOC 改为直接调用 getMessage - 更新 vitest.setup.ts mock 加载实际翻译文本 - 修复 11 个测试文件的断言以匹配中文翻译 - TypeScript、ESLint、547 项测试全部通过 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: 移除语言切换按钮 chrome.i18n 语言由浏览器设置决定,不支持运行时切换,移除 TopBar 中的语言切换按钮及相关逻辑。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: 移除英文翻译,仅保留中文 删除 public/_locales/en/ 目录,清理 chromeI18n.ts 中未使用的语言切换相关导出。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: 清理未使用的 i18n key(322 → 245) 移除 77 个未被源码引用的翻译 key,包括: - jsonFormat_* (17): 未接入的子模式标题和按钮 - buttons_* (15): 代码使用 common: 命名空间格式,直接 key 未引用 - qrCode_* (14): 未使用的页面标题和状态提示 - timestamp/common/storageCleaner/jsonDiff 等零散未用 key 保留了通过模板字面量动态引用的 key(storageCleaner_options_*、common_buttons_themeMode_*、jsonFormat_*InputPlaceholder 等)。 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: reorganize directory structure into src/ Move all source code directories into src/ for cleaner project structure: - pages/, components/, utils/, config/, providers/, types/, lib/, assets/, entrypoints/ → src/ - Use WXT srcDir config to resolve @/ alias to src/ - Update tsconfig, vitest, eslint, tailwind configs - Remove scattered README.md files from subdirectories - Update documentation (AGENTS.md, CODING_STANDARDS.md, README.md) - Fix pre-existing lint error in RouterProvider.tsx Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: remove meaningless comments Remove 50+ noise comments across the codebase: - AI-generated verbose prose (💡 emoji, '超进化', '大闸', etc.) - Comments that restate what the code obviously does - Comments about deleted code - Import-level noise comments - Overly verbose Chinese section markers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: clean up unused code and simplify imports - Remove unused imports and variables across 35 files - Simplify component logic and remove dead code - Clean up test files by removing unnecessary setup - Streamline CI workflow configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: remove HTML-Markdown conversion features (htmlToMarkdown & markdownToHtml) Removed both conversion tools and all related code: - Deleted page components: HtmlToMarkdown, MarkdownToHtml - Deleted utility functions: htmlToMarkdown.ts, markdownToHtml.ts - Deleted unit tests for both utilities - Removed feature configs and PageType entries from storage.d.ts - Removed preview mode types and StorageSchema keys - Removed all i18n translation keys from messages.json - Removed vendor-markdown chunk from wxt.config.ts - Removed marked dependency from package.json - Updated feature count in tests (11 -> 9, page order 10 -> 8) - Updated README, AGENTS.md, and copilot-instructions.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: redesign Dashboard layout with search and recently used tools - Add search input at top to filter tools by name/description - Add 'recently used' section showing last 3 used tools as compact chips - Add 'all tools' section header for the tool card grid - Track tool usage via new 'app/recentlyUsedTools' storage key - Update navigateTo to record recently used tools (max 3, LRU order) - Add i18n keys: dashboard_searchPlaceholder, dashboard_recentlyUsed, dashboard_allTools Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: replace ToolCard grid with compact icon+name grid on Dashboard - Replace large ToolCard layout with dense grid (3-6 columns responsive) - Each item shows icon + tool name in a compact tile - Hover highlights icon and text with smooth transitions - Remove ToolCard import from Dashboard (component retained for reuse) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: remove redundant search input from Dashboard (header already has one) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: optimize TopBar search with Cmd+K shortcut and improved styling - Add global Cmd/Ctrl+K keyboard shortcut to focus search input - Show keyboard shortcut hint (⌘K) in search input when empty - Improve input styling: rounded-lg, softer borders, focus transitions - Improve dropdown: rounded-lg, larger shadow, better spacing - Larger result icons (h-8 w-8) with rounded-lg containers - Refined history section with uppercase label and muted icon - Search icon fades in on focus via group-focus-within Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: improve search history to show recently used tools with direct navigation - Store feature keys (PageType) in history instead of translated labels - Show icon + name + description in history items (same as search results) - Click or Enter on history item navigates directly to the tool page - Remove History icon import (no longer needed) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: useI18n fallback for empty string translations from chrome.i18n * refactor: 移除设置页面 - 删除 options 入口点目录及相关文件 - 移除 wxt.config.ts 中 options_ui 配置 - 移除 TopBar 组件中的设置按钮和 onOpenOptions prop - 移除 popup/sidepanel App.tsx 中的 handleOpenOptions - 移除相关测试中的设置页面引用 - 移除 messages.json 中设置相关翻译键 - 通过 lint、typecheck、test 验证 * docs: 更新文档,移除设置页面引用 - README.md: 移除 entrypoints/options/ 目录说明 - AGENTS.md: 更新项目结构描述,移除 options/ 入口点 * docs: add comprehensive page development standards (CODING_STANDARDS.md §11) - 新增 §11 页面开发规范(10 个子节),覆盖目录结构分4级、入口组件命名统一为 Index、业务 Hook 内部结构顺序、常量/子组件/存储键/模式切换/布局约定等规范 - 新增 §11.9 页面开发检查清单(10 步逐项确认) - 更新 AGENTS.md 和 copilot-instructions.md 同步引用新规范章节 - 修正 useLazyTranslation → useI18n 与实际代码保持一致 * refactor(pages): apply UI+Hook separation and unify component naming - Dashboard, RightClickRestorer: rename page component to Index - Jwt: extract useJwt.ts hook + JwtSection.tsx sub-component (127→76 lines) - TextStatistics: extract useTextStatistics.ts hook (63→48 lines) - JsonTools: extract useJsonTools.ts hook + constants.ts (199→109 lines) - All pages now follow CODING_STANDARDS.md §11 pattern * refactor(StorageCleaner): improve style consistency and checkbox alignment - Group storage options, auto-refresh toggle, and clean button into unified card - Remove card wrappers from StorageOptionsGrid and AutoRefreshToggle (now sections within parent card) - Align OptionItem and Select All checkboxes with consistent px-3.5 padding - Distinguish indeterminate vs checked checkbox states visually - Standardize spacing (space-y-4), add select-none to page root - Fix import path for StorageCleanerConfirm to relative ./ * fix(StorageCleaner, Base64Converter): fix layout padding and checkbox alignment - StorageCleaner: add px-3.5 to grid container to prevent content sticking to border - StorageCleaner: adjust select-all bar to pl-3.5 pr-7 for checkbox alignment with grid items - Base64Converter: add px-2 to TextMode and Base64ConverterSection for consistent spacing Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: add initial CLAUDE.md file with reference to @AGENT.md * docs: add comprehensive visual style guide Add VISUAL_STYLE_GUIDE.md to standardize UI development: - Design principles and keywords - Complete color system (CSS variables, semantic usage) - Typography hierarchy and patterns - Spacing, layout, and container specs - Border radius and shadow system - Component specs (Button, Input, Card, Dialog, etc.) - Interaction and animation guidelines - Dark mode implementation rules - Tool color palette and assignment - Code organization standards - Anti-patterns checklist - Quick reference appendix Update .gitignore to allow tracking the style guide. * docs(AGENTS): update i18n section to reflect chrome.i18n migration - Replace react-i18next docs with chrome.i18n API documentation - Update translation file paths from i18n/locales/ to public/_locales/ - Update test mock description for chromeI18n - Remove references to useLazyTranslation, vendor-i18n chunk, and snackbar Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(content): simplify content script structure - Remove messageHandler.ts (6-line pass-through facade) - Import contextMenuHandler directly from content.ts - Replace local getI18nText() with shared getMessage() from utils/chromeI18n Reduces content script files from 3 to 2 and eliminates i18n logic duplication. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(RightClickRestorer): simplify setDomain logic Replace nested if/try/catch with a single ternary expression. isUnsupportedPage() already handles invalid URLs, so new URL() is safe here. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(background): extract main world injection script Move the 62-line inline main world injection function from background.ts to a dedicated utils/rightClickInjection.ts file. This separates the RightClickRestorer's DOM patching logic from the service worker's message routing concerns. - background.ts: -62 lines, now delegates to imported function - utils/rightClickInjection.ts: new file with mainWorldInjectionScript() Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(background): simplify RELOAD_TAB with setTimeout Replace the 30-line chrome.alarms API implementation with a simple setTimeout for delayed tab reloads. Rationale: The only usage is a 1-second delay after storage cleaning. Service workers don't go idle within 1 second, so alarms' persistence benefit is unnecessary here. - Removed: alarm naming, create/clear, listener register/unregister - Added: 4-line setTimeout conditional Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(storageCleaner): extract executeScript helpers Extract two generic helpers to eliminate repetitive executeScript boilerplate: - runScript<T>(): for size/query operations (5 functions) - runCleanScript(): for cleanup operations (5 functions) Also add CLEAN_OPTION_KEYS constant shared by formatCleaningResult and isEmptyResult. - 428 lines → 379 lines (-49 lines) - Eliminates ~100 lines of duplicated try/catch/result parsing Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(base64Converter): simplify utility functions - Mark formatFileSize() as @deprecated, delegate to formatBytes - Replace manual for-loop in base64ToBytes() with Uint8Array.from() - Replace nested loops in sniffMimeFromBytes() with Array.every() 5 insertions(+), 23 deletions(-) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor: replace GlobalSnackbar with sonner toast Remove the custom 373-line GlobalSnackbar component and its Provider/Hook in favor of the already-installed sonner library. Changes: - Delete src/components/GlobalSnackbar.tsx (+ tests) - Remove SnackbarProvider from popup/App.tsx and sidepanel/App.tsx - Replace useSnackbar() calls with toast.success()/toast.error() in: - ImageUploader.tsx - useQrCode.ts - ParsePanel.tsx - LiveClock.tsx - Update test mocks to use sonner instead of GlobalSnackbar -554 lines, +43 lines (net -511 lines) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(RouterContainer): remove unnecessary useMemo and hoist constant - Replace useMemo with direct expression for animationClass - Move entryPointType to module scope (value is fixed after mount) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor: remove unnecessary useMemo calls across components Replace over-cached simple computations with direct expressions: - popup/App.tsx: getEntryPointType() and routerConfig (values are stable) - Dashboard/index.tsx: visibleSet, visibleFeatures, recentFeatures (Set creation + array filter/map are cheaper than useMemo overhead) - useTextStatistics.ts: getTextStats(text) (simple string processing) - ThemeModeProvider.tsx: contextValue object (setMode is stable via useCallback) -39 lines, +28 lines (net -11 lines) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor: unify formatBytes usage and simplify useContextMenuData 1. Remove formatSize/formatByteSize delegation functions: - storageCleaner.ts:formatSize (was just formatBytes wrapper) - textStatistics.ts:formatByteSize (was just formatBytes wrapper) - Update all callers to import formatBytes directly from @/utils/format 2. Simplify useContextMenuData hook: - Remove unnecessary useCallback wrapping - Inline checkAndConsumeData logic directly in useEffect - Eliminate callback->effect dependency cycle -69 lines, +67 lines (net -2 lines, but removes 2 indirection layers) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(storageCleaner): simplify architecture and improve type semantics - Remove RELOAD_TAB message chain, use chrome.tabs.reload() directly - Rename IndexedDB label to '站点存储' for accuracy - Introduce StorageSizeInfo type to distinguish bytes vs count - Rename totalSize to totalBytes for clarity - Merge runCleanScript into runScript to reduce duplication - Rename CleaningResult.success to overallSuccess to avoid confusion - Remove unused domain state and setDomain call Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor: replace require with import for JSON module in vitest.setup.ts * refactor: simplify Timestamp and RightClickRestorer Timestamp: - Extract shared utilities (msToUnit, dayjsFromTimestamp, ModeType) - Remove unnecessary useCallback/useMemo/React.memo - Remove extra info section (relative time, ISO 8601, UTC) - Fix missing translation key timestamp_unitS RightClickRestorer: - Remove website badge (右键已解锁 overlay) - Remove mouse penetration logic for media elements - Remove unnecessary useCallback - Remove redundant setIsLoading call Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(StorageCleanerConfirm.test.tsx): update IndexedDB label to Chinese translation --------- Co-authored-by: Ubuntu <ubuntu@localhost.localdomain> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
881 lines
30 KiB
JSON
881 lines
30 KiB
JSON
{
|
||
"buttons_copy": {
|
||
"message": "复制",
|
||
"description": "Translation key: buttons_copy"
|
||
},
|
||
"buttons_clear": {
|
||
"message": "清理",
|
||
"description": "Translation key: buttons_clear"
|
||
},
|
||
|
||
"messages_copySuccess": {
|
||
"message": "已复制到剪贴板",
|
||
"description": "Translation key: messages_copySuccess"
|
||
},
|
||
"messages_copyError": {
|
||
"message": "复制失败",
|
||
"description": "Translation key: messages_copyError"
|
||
},
|
||
"messages_copyEmpty": {
|
||
"message": "无内容可复制",
|
||
"description": "Translation key: messages_copyEmpty"
|
||
},
|
||
"errorBoundary_title": {
|
||
"message": "糟糕,出了点问题",
|
||
"description": "Translation key: errorBoundary_title"
|
||
},
|
||
"errorBoundary_description": {
|
||
"message": "应用遇到了一些意外错误。您可以尝试刷新页面或重置应用。",
|
||
"description": "Translation key: errorBoundary_description"
|
||
},
|
||
"errorBoundary_refresh": {
|
||
"message": "刷新应用",
|
||
"description": "Translation key: errorBoundary_refresh"
|
||
},
|
||
"errorBoundary_retry": {
|
||
"message": "重新尝试",
|
||
"description": "Translation key: errorBoundary_retry"
|
||
},
|
||
"pageErrorBoundary_title": {
|
||
"message": "该功能运行异常",
|
||
"description": "Translation key: pageErrorBoundary_title"
|
||
},
|
||
"pageErrorBoundary_description": {
|
||
"message": "该页面在加载或渲染时遇到了内部脚本错误。您可以尝试重试,或者通过导航菜单切换到其他工具。",
|
||
"description": "Translation key: pageErrorBoundary_description"
|
||
},
|
||
"router_notFound": {
|
||
"message": "页面未找到",
|
||
"description": "Translation key: router_notFound"
|
||
},
|
||
"router_notFoundDescription": {
|
||
"message": "该功能在当前运行环境({{entryPointType}})下不可用或已被移除。",
|
||
"description": "Translation key: router_notFoundDescription"
|
||
},
|
||
"textInputArea_clear": {
|
||
"message": "清空",
|
||
"description": "Translation key: textInputArea_clear"
|
||
},
|
||
"textInputArea_copyContent": {
|
||
"message": "复制内容",
|
||
"description": "Translation key: textInputArea_copyContent"
|
||
},
|
||
"textInputArea_cleared": {
|
||
"message": "已清空",
|
||
"description": "Translation key: textInputArea_cleared"
|
||
},
|
||
"textInputArea_placeholder": {
|
||
"message": "请输入文本",
|
||
"description": "Translation key: textInputArea_placeholder"
|
||
},
|
||
"dashboard_title": {
|
||
"message": "仪表盘",
|
||
"description": "Translation key: dashboard_title"
|
||
},
|
||
"dashboard_searchPlaceholder": {
|
||
"message": "搜索工具...",
|
||
"description": "Translation key: dashboard_searchPlaceholder"
|
||
},
|
||
"dashboard_recentlyUsed": {
|
||
"message": "最近使用",
|
||
"description": "Translation key: dashboard_recentlyUsed"
|
||
},
|
||
"dashboard_allTools": {
|
||
"message": "全部工具",
|
||
"description": "Translation key: dashboard_allTools"
|
||
},
|
||
"timestamp_title": {
|
||
"message": "时间戳",
|
||
"description": "Translation key: timestamp_title"
|
||
},
|
||
"timestamp_description": {
|
||
"message": "Unix 毫秒数转换与格式化",
|
||
"description": "Translation key: timestamp_description"
|
||
},
|
||
"storageCleaner_title": {
|
||
"message": "存储清理",
|
||
"description": "Translation key: storageCleaner_title"
|
||
},
|
||
"storageCleaner_description": {
|
||
"message": "清理缓存、Cookies 及本地存储",
|
||
"description": "Translation key: storageCleaner_description"
|
||
},
|
||
"qrCode_title": {
|
||
"message": "二维码工具",
|
||
"description": "Translation key: qrCode_title"
|
||
},
|
||
"qrCode_description": {
|
||
"message": "生成当前选中的 URL 的二维码",
|
||
"description": "Translation key: qrCode_description"
|
||
},
|
||
"textStatistics_title": {
|
||
"message": "文本统计",
|
||
"description": "Translation key: textStatistics_title"
|
||
},
|
||
"textStatistics_description": {
|
||
"message": "实时分析文本字符、单词及字节",
|
||
"description": "Translation key: textStatistics_description"
|
||
},
|
||
"jwt_title": {
|
||
"message": "JWT 解析",
|
||
"description": "Translation key: jwt_title"
|
||
},
|
||
"jwt_description": {
|
||
"message": "JSON Web Token 解码与查看",
|
||
"description": "Translation key: jwt_description"
|
||
},
|
||
"jsonDiff_title": {
|
||
"message": "JSON 工具",
|
||
"description": "Translation key: jsonDiff_title"
|
||
},
|
||
"jsonDiff_description": {
|
||
"message": "差异比较、格式化、YAML/TOML 转换及压缩",
|
||
"description": "Translation key: jsonDiff_description"
|
||
},
|
||
"base64Converter_title": {
|
||
"message": "Base64 转换器",
|
||
"description": "Translation key: base64Converter_title"
|
||
},
|
||
"base64Converter_description": {
|
||
"message": "文本、文件与图像的 Base64 编码转换",
|
||
"description": "Translation key: base64Converter_description"
|
||
},
|
||
"rightClickRestorer_title": {
|
||
"message": "右键恢复",
|
||
"description": "Translation key: rightClickRestorer_title"
|
||
},
|
||
"rightClickRestorer_description": {
|
||
"message": "检测并恢复被网站禁用的浏览器右键菜单",
|
||
"description": "Translation key: rightClickRestorer_description"
|
||
},
|
||
"base64Converter_pageTitle": {
|
||
"message": "Base64 转换器",
|
||
"description": "Translation key: base64Converter_pageTitle"
|
||
},
|
||
"base64Converter_textMode": {
|
||
"message": "文本",
|
||
"description": "Translation key: base64Converter_textMode"
|
||
},
|
||
"base64Converter_fileMode": {
|
||
"message": "文件",
|
||
"description": "Translation key: base64Converter_fileMode"
|
||
},
|
||
"base64Converter_imageMode": {
|
||
"message": "图像",
|
||
"description": "Translation key: base64Converter_imageMode"
|
||
},
|
||
"base64Converter_encode": {
|
||
"message": "编码",
|
||
"description": "Translation key: base64Converter_encode"
|
||
},
|
||
"base64Converter_decode": {
|
||
"message": "解码",
|
||
"description": "Translation key: base64Converter_decode"
|
||
},
|
||
"base64Converter_clear": {
|
||
"message": "清空",
|
||
"description": "Translation key: base64Converter_clear"
|
||
},
|
||
"base64Converter_textInputPlaceholder": {
|
||
"message": "输入需要编码为 Base64 的文本...",
|
||
"description": "Translation key: base64Converter_textInputPlaceholder"
|
||
},
|
||
"base64Converter_base64InputPlaceholder": {
|
||
"message": "输入需要解码的 Base64 字符串...",
|
||
"description": "Translation key: base64Converter_base64InputPlaceholder"
|
||
},
|
||
"base64Converter_base64Output": {
|
||
"message": "Base64 编码结果",
|
||
"description": "Translation key: base64Converter_base64Output"
|
||
},
|
||
"base64Converter_textOutput": {
|
||
"message": "解码文本结果",
|
||
"description": "Translation key: base64Converter_textOutput"
|
||
},
|
||
"base64Converter_copyRaw": {
|
||
"message": "复制纯 Base64",
|
||
"description": "Translation key: base64Converter_copyRaw"
|
||
},
|
||
"base64Converter_copyDataUri": {
|
||
"message": "复制 Data URI",
|
||
"description": "Translation key: base64Converter_copyDataUri"
|
||
},
|
||
"base64Converter_clickOrDropToFile": {
|
||
"message": "点击或拖拽文件到此处",
|
||
"description": "Translation key: base64Converter_clickOrDropToFile"
|
||
},
|
||
"base64Converter_clickOrDropToImage": {
|
||
"message": "点击或拖拽图像到此处",
|
||
"description": "Translation key: base64Converter_clickOrDropToImage"
|
||
},
|
||
"base64Converter_clickOrDropToReplace": {
|
||
"message": "点击或拖拽以替换文件",
|
||
"description": "Translation key: base64Converter_clickOrDropToReplace"
|
||
},
|
||
"base64Converter_maxFileSize": {
|
||
"message": "最大文件大小:{{max}}",
|
||
"description": "Translation key: base64Converter_maxFileSize"
|
||
},
|
||
"base64Converter_supportedFormats": {
|
||
"message": "支持 PNG、JPG、WEBP、GIF、BMP、SVG 等格式",
|
||
"description": "Translation key: base64Converter_supportedFormats"
|
||
},
|
||
"base64Converter_fileSizeExceeded": {
|
||
"message": "文件大小超出限制(最大 {{max}})",
|
||
"description": "Translation key: base64Converter_fileSizeExceeded"
|
||
},
|
||
"base64Converter_unsupportedImageType": {
|
||
"message": "不支持的图像格式",
|
||
"description": "Translation key: base64Converter_unsupportedImageType"
|
||
},
|
||
"base64Converter_conversionFailed": {
|
||
"message": "转换失败",
|
||
"description": "Translation key: base64Converter_conversionFailed"
|
||
},
|
||
"base64Converter_originalSize": {
|
||
"message": "原始大小",
|
||
"description": "Translation key: base64Converter_originalSize"
|
||
},
|
||
"base64Converter_encodedSize": {
|
||
"message": "编码大小",
|
||
"description": "Translation key: base64Converter_encodedSize"
|
||
},
|
||
"base64Converter_invalidBase64": {
|
||
"message": "Base64 字符串无效",
|
||
"description": "Translation key: base64Converter_invalidBase64"
|
||
},
|
||
"base64Converter_binaryDataDetected": {
|
||
"message": "输入似乎是二进制数据(如图片)。请切换到「图像」选项卡。",
|
||
"description": "Translation key: base64Converter_binaryDataDetected"
|
||
},
|
||
"base64Converter_imageDataUriHint": {
|
||
"message": "检测到图片的 data URI,请使用「图像」选项卡进行解码。",
|
||
"description": "Translation key: base64Converter_imageDataUriHint"
|
||
},
|
||
"base64Converter_switchToImageMode": {
|
||
"message": "切换到图像模式",
|
||
"description": "Translation key: base64Converter_switchToImageMode"
|
||
},
|
||
"base64Converter_download": {
|
||
"message": "下载",
|
||
"description": "Translation key: base64Converter_download"
|
||
},
|
||
"base64Converter_decodedFileName": {
|
||
"message": "解码后文件名",
|
||
"description": "Translation key: base64Converter_decodedFileName"
|
||
},
|
||
"base64Converter_decodeBase64Placeholder": {
|
||
"message": "输入需要解码的 Base64 或 data URI...",
|
||
"description": "Translation key: base64Converter_decodeBase64Placeholder"
|
||
},
|
||
"base64Converter_decodedFileOutput": {
|
||
"message": "解码文件",
|
||
"description": "Translation key: base64Converter_decodedFileOutput"
|
||
},
|
||
"base64Converter_decodedImageOutput": {
|
||
"message": "解码图像",
|
||
"description": "Translation key: base64Converter_decodedImageOutput"
|
||
},
|
||
"base64Converter_inferredMimeType": {
|
||
"message": "推断的 MIME 类型",
|
||
"description": "Translation key: base64Converter_inferredMimeType"
|
||
},
|
||
"base64Converter_decodedSize": {
|
||
"message": "解码大小",
|
||
"description": "Translation key: base64Converter_decodedSize"
|
||
},
|
||
"jsonDiff_pageTitle": {
|
||
"message": "JSON 差异比较",
|
||
"description": "Translation key: jsonDiff_pageTitle"
|
||
},
|
||
"jsonDiff_leftPlaceholder": {
|
||
"message": "输入原始 JSON...",
|
||
"description": "Translation key: jsonDiff_leftPlaceholder"
|
||
},
|
||
"jsonDiff_rightPlaceholder": {
|
||
"message": "输入目标 JSON...",
|
||
"description": "Translation key: jsonDiff_rightPlaceholder"
|
||
},
|
||
"jsonDiff_leftLabel": {
|
||
"message": "原始 JSON",
|
||
"description": "Translation key: jsonDiff_leftLabel"
|
||
},
|
||
"jsonDiff_rightLabel": {
|
||
"message": "目标 JSON",
|
||
"description": "Translation key: jsonDiff_rightLabel"
|
||
},
|
||
"jsonDiff_sideBySideMode": {
|
||
"message": "并排",
|
||
"description": "Translation key: jsonDiff_sideBySideMode"
|
||
},
|
||
"jsonDiff_unifiedMode": {
|
||
"message": "统一",
|
||
"description": "Translation key: jsonDiff_unifiedMode"
|
||
},
|
||
"jsonDiff_previousDiff": {
|
||
"message": "上一个",
|
||
"description": "Translation key: jsonDiff_previousDiff"
|
||
},
|
||
"jsonDiff_nextDiff": {
|
||
"message": "下一个",
|
||
"description": "Translation key: jsonDiff_nextDiff"
|
||
},
|
||
"jsonDiff_noDiffs": {
|
||
"message": "无差异",
|
||
"description": "Translation key: jsonDiff_noDiffs"
|
||
},
|
||
"jsonDiff_invalidJson": {
|
||
"message": "无效的 JSON 格式",
|
||
"description": "Translation key: jsonDiff_invalidJson"
|
||
},
|
||
"jsonDiff_emptyHint": {
|
||
"message": "输入两侧 JSON 后点击比较",
|
||
"description": "Translation key: jsonDiff_emptyHint"
|
||
},
|
||
"jsonDiff_fixErrorHint": {
|
||
"message": "请修正上方 JSON 的语法错误以开启实时流式比对",
|
||
"description": "Translation key: jsonDiff_fixErrorHint"
|
||
},
|
||
"jsonDiff_added": {
|
||
"message": "新增",
|
||
"description": "Translation key: jsonDiff_added"
|
||
},
|
||
"jsonDiff_removed": {
|
||
"message": "删除",
|
||
"description": "Translation key: jsonDiff_removed"
|
||
},
|
||
"jsonDiff_modified": {
|
||
"message": "修改",
|
||
"description": "Translation key: jsonDiff_modified"
|
||
},
|
||
"jsonFormat_inputPlaceholder": {
|
||
"message": "输入需要格式化的 JSON...",
|
||
"description": "Translation key: jsonFormat_inputPlaceholder"
|
||
},
|
||
"jsonFormat_sortKeys": {
|
||
"message": "键名排序",
|
||
"description": "Translation key: jsonFormat_sortKeys"
|
||
},
|
||
"jsonFormat_indentSize": {
|
||
"message": "缩进",
|
||
"description": "Translation key: jsonFormat_indentSize"
|
||
},
|
||
"jsonFormat_outputLabel": {
|
||
"message": "格式化结果",
|
||
"description": "Translation key: jsonFormat_outputLabel"
|
||
},
|
||
"jsonFormat_invalidJson": {
|
||
"message": "无效的 JSON 格式",
|
||
"description": "Translation key: jsonFormat_invalidJson"
|
||
},
|
||
"jsonFormat_emptyHint": {
|
||
"message": "输入 JSON 后点击格式化",
|
||
"description": "Translation key: jsonFormat_emptyHint"
|
||
},
|
||
"jsonFormat_fixErrorHint": {
|
||
"message": "请修正上方 JSON 的语法错误以开启实时流式格式化",
|
||
"description": "Translation key: jsonFormat_fixErrorHint"
|
||
},
|
||
"jsonFormat_originalSize": {
|
||
"message": "原始大小",
|
||
"description": "Translation key: jsonFormat_originalSize"
|
||
},
|
||
"jsonFormat_formattedSize": {
|
||
"message": "格式化后大小",
|
||
"description": "Translation key: jsonFormat_formattedSize"
|
||
},
|
||
"jsonFormat_diffMode": {
|
||
"message": "差异比较",
|
||
"description": "Translation key: jsonFormat_diffMode"
|
||
},
|
||
"jsonFormat_formatMode": {
|
||
"message": "格式化",
|
||
"description": "Translation key: jsonFormat_formatMode"
|
||
},
|
||
"jsonFormat_yamlMode": {
|
||
"message": "YAML",
|
||
"description": "Translation key: jsonFormat_yamlMode"
|
||
},
|
||
"jsonFormat_tomlMode": {
|
||
"message": "TOML",
|
||
"description": "Translation key: jsonFormat_tomlMode"
|
||
},
|
||
"jsonFormat_minifyMode": {
|
||
"message": "压缩",
|
||
"description": "Translation key: jsonFormat_minifyMode"
|
||
},
|
||
"jsonFormat_yamlModeInputPlaceholder": {
|
||
"message": "输入需要转换的 JSON...",
|
||
"description": "Translation key: jsonFormat_yamlModeInputPlaceholder"
|
||
},
|
||
"jsonFormat_yamlModeOutputLabel": {
|
||
"message": "YAML 结果",
|
||
"description": "Translation key: jsonFormat_yamlModeOutputLabel"
|
||
},
|
||
"jsonFormat_yamlModeEmptyHint": {
|
||
"message": "输入 JSON 后点击转换",
|
||
"description": "Translation key: jsonFormat_yamlModeEmptyHint"
|
||
},
|
||
"jsonFormat_tomlModeInputPlaceholder": {
|
||
"message": "输入需要转换的 JSON...",
|
||
"description": "Translation key: jsonFormat_tomlModeInputPlaceholder"
|
||
},
|
||
"jsonFormat_tomlModeOutputLabel": {
|
||
"message": "TOML 结果",
|
||
"description": "Translation key: jsonFormat_tomlModeOutputLabel"
|
||
},
|
||
"jsonFormat_tomlModeEmptyHint": {
|
||
"message": "输入 JSON 后点击转换",
|
||
"description": "Translation key: jsonFormat_tomlModeEmptyHint"
|
||
},
|
||
"jsonFormat_minifyModeInputPlaceholder": {
|
||
"message": "输入需要压缩的 JSON...",
|
||
"description": "Translation key: jsonFormat_minifyModeInputPlaceholder"
|
||
},
|
||
"jsonFormat_minifyModeOutputLabel": {
|
||
"message": "压缩结果",
|
||
"description": "Translation key: jsonFormat_minifyModeOutputLabel"
|
||
},
|
||
"jsonFormat_minifyModeEmptyHint": {
|
||
"message": "输入 JSON 后点击压缩",
|
||
"description": "Translation key: jsonFormat_minifyModeEmptyHint"
|
||
},
|
||
"jwt_pageTitle": {
|
||
"message": "JWT 解析",
|
||
"description": "Translation key: jwt_pageTitle"
|
||
},
|
||
"jwt_placeholder": {
|
||
"message": "在此粘贴 JWT 令牌 (Encoded JWT)...",
|
||
"description": "Translation key: jwt_placeholder"
|
||
},
|
||
"jwt_headerTitle": {
|
||
"message": "HEADER: 算法 & 令牌类型",
|
||
"description": "Translation key: jwt_headerTitle"
|
||
},
|
||
"jwt_payloadTitle": {
|
||
"message": "PAYLOAD: 数据",
|
||
"description": "Translation key: jwt_payloadTitle"
|
||
},
|
||
"jwt_signatureTitle": {
|
||
"message": "签名",
|
||
"description": "Translation key: jwt_signatureTitle"
|
||
},
|
||
"jwt_noSignature": {
|
||
"message": "无签名",
|
||
"description": "Translation key: jwt_noSignature"
|
||
},
|
||
"jwt_invalidFormat": {
|
||
"message": "无法解析",
|
||
"description": "Translation key: jwt_invalidFormat"
|
||
},
|
||
"jwt_errors_invalidBase64String": {
|
||
"message": "无效的 Base64URL 字符串",
|
||
"description": "Translation key: jwt_errors_invalidBase64String"
|
||
},
|
||
"jwt_errors_failedToDecode": {
|
||
"message": "Base64URL 解码失败:",
|
||
"description": "Translation key: jwt_errors_failedToDecode"
|
||
},
|
||
"jwt_errors_invalidFormat": {
|
||
"message": "JWT 格式错误:必须包含三个由 . 分隔的部分",
|
||
"description": "Translation key: jwt_errors_invalidFormat"
|
||
},
|
||
"jwt_errors_parseHeaderFailed": {
|
||
"message": "解析 Header 失败:",
|
||
"description": "Translation key: jwt_errors_parseHeaderFailed"
|
||
},
|
||
"jwt_errors_parsePayloadFailed": {
|
||
"message": "解析 Payload 失败:",
|
||
"description": "Translation key: jwt_errors_parsePayloadFailed"
|
||
},
|
||
"qrCode_pageTitle": {
|
||
"message": "二维码工具",
|
||
"description": "Translation key: qrCode_pageTitle"
|
||
},
|
||
"qrCode_urlToQr": {
|
||
"message": "文本转二维码",
|
||
"description": "Translation key: qrCode_urlToQr"
|
||
},
|
||
"qrCode_qrToUrl": {
|
||
"message": "二维码转文本",
|
||
"description": "Translation key: qrCode_qrToUrl"
|
||
},
|
||
"qrCode_urlInputLabel": {
|
||
"message": "输入 URL 或文本",
|
||
"description": "Translation key: qrCode_urlInputLabel"
|
||
},
|
||
"qrCode_urlInputPlaceholder": {
|
||
"message": "请输入 URL 或文本内容,将自动生成二维码",
|
||
"description": "Translation key: qrCode_urlInputPlaceholder"
|
||
},
|
||
"qrCode_generating": {
|
||
"message": "生成中...",
|
||
"description": "Translation key: qrCode_generating"
|
||
},
|
||
"qrCode_qrCodeWillShow": {
|
||
"message": "二维码将显示在这里",
|
||
"description": "Translation key: qrCode_qrCodeWillShow"
|
||
},
|
||
"qrCode_downloadButton": {
|
||
"message": "下载二维码",
|
||
"description": "Translation key: qrCode_downloadButton"
|
||
},
|
||
"qrCode_copyQrButton": {
|
||
"message": "复制二维码",
|
||
"description": "Translation key: qrCode_copyQrButton"
|
||
},
|
||
"qrCode_qrCodeDownloadSuccess": {
|
||
"message": "二维码下载成功",
|
||
"description": "Translation key: qrCode_qrCodeDownloadSuccess"
|
||
},
|
||
"qrCode_qrCodeCopySuccess": {
|
||
"message": "二维码已复制到剪贴板",
|
||
"description": "Translation key: qrCode_qrCodeCopySuccess"
|
||
},
|
||
"qrCode_parseSuccess": {
|
||
"message": "二维码解析成功",
|
||
"description": "Translation key: qrCode_parseSuccess"
|
||
},
|
||
"qrCode_noQrDetected": {
|
||
"message": "未检测到二维码,请确保图片清晰且包含二维码",
|
||
"description": "Translation key: qrCode_noQrDetected"
|
||
},
|
||
"qrCode_parseError": {
|
||
"message": "解析二维码失败,请重试",
|
||
"description": "Translation key: qrCode_parseError"
|
||
},
|
||
"qrCode_copyError": {
|
||
"message": "复制失败,请重试",
|
||
"description": "Translation key: qrCode_copyError"
|
||
},
|
||
"qrCode_imagePasted": {
|
||
"message": "图片粘贴成功,正在解析...",
|
||
"description": "Translation key: qrCode_imagePasted"
|
||
},
|
||
"qrCode_imagePasteError": {
|
||
"message": "粘贴图片失败,请重试",
|
||
"description": "Translation key: qrCode_imagePasteError"
|
||
},
|
||
"qrCode_imageCleared": {
|
||
"message": "图片已清除",
|
||
"description": "Translation key: qrCode_imageCleared"
|
||
},
|
||
"qrCode_clickToUpload": {
|
||
"message": "点击、拖拽或粘贴上传二维码图片",
|
||
"description": "Translation key: qrCode_clickToUpload"
|
||
},
|
||
"qrCode_supportFormats": {
|
||
"message": "支持 PNG、JPG、WEBP、Base64 格式",
|
||
"description": "Translation key: qrCode_supportFormats"
|
||
},
|
||
"qrCode_resultLabel": {
|
||
"message": "解析结果",
|
||
"description": "Translation key: qrCode_resultLabel"
|
||
},
|
||
"qrCode_clickToChange": {
|
||
"message": "点击更换图片",
|
||
"description": "Translation key: qrCode_clickToChange"
|
||
},
|
||
"rightClickRestorer_loading": {
|
||
"message": "正在加载...",
|
||
"description": "Translation key: rightClickRestorer_loading"
|
||
},
|
||
"rightClickRestorer_currentDomain": {
|
||
"message": "当前域名",
|
||
"description": "Translation key: rightClickRestorer_currentDomain"
|
||
},
|
||
"rightClickRestorer_statusLocked": {
|
||
"message": "未解锁",
|
||
"description": "Translation key: rightClickRestorer_statusLocked"
|
||
},
|
||
"rightClickRestorer_statusUnlocked": {
|
||
"message": "已解锁",
|
||
"description": "Translation key: rightClickRestorer_statusUnlocked"
|
||
},
|
||
"rightClickRestorer_unsupported": {
|
||
"message": "不支持",
|
||
"description": "Translation key: rightClickRestorer_unsupported"
|
||
},
|
||
"rightClickRestorer_unsupportedDesc": {
|
||
"message": "当前页面为浏览器内部页面或扩展页面,无法解锁右键功能。请切换到普通网页后重试。",
|
||
"description": "Translation key: rightClickRestorer_unsupportedDesc"
|
||
},
|
||
"rightClickRestorer_unlockDesc": {
|
||
"message": "点击下方按钮,为当前网站临时解锁右键菜单。刷新页面后需要重新解锁。",
|
||
"description": "Translation key: rightClickRestorer_unlockDesc"
|
||
},
|
||
"rightClickRestorer_unlockBtn": {
|
||
"message": "解锁当前网站右键",
|
||
"description": "Translation key: rightClickRestorer_unlockBtn"
|
||
},
|
||
"rightClickRestorer_alreadyUnlocked": {
|
||
"message": "右键已解锁",
|
||
"description": "Translation key: rightClickRestorer_alreadyUnlocked"
|
||
},
|
||
"storageCleaner_pageTitle": {
|
||
"message": "存储清理",
|
||
"description": "Translation key: storageCleaner_pageTitle"
|
||
},
|
||
"storageCleaner_loading": {
|
||
"message": "加载中...",
|
||
"description": "Translation key: storageCleaner_loading"
|
||
},
|
||
"storageCleaner_initializing": {
|
||
"message": "正在读取站点数据...",
|
||
"description": "Translation key: storageCleaner_initializing"
|
||
},
|
||
"storageCleaner_cleaning": {
|
||
"message": "正在清理...",
|
||
"description": "Translation key: storageCleaner_cleaning"
|
||
},
|
||
"storageCleaner_cleanNow": {
|
||
"message": "立即清理",
|
||
"description": "Translation key: storageCleaner_cleanNow"
|
||
},
|
||
"storageCleaner_autoRefresh": {
|
||
"message": "清理后自动刷新页面",
|
||
"description": "Translation key: storageCleaner_autoRefresh"
|
||
},
|
||
"storageCleaner_selectAll": {
|
||
"message": "全选所有项",
|
||
"description": "Translation key: storageCleaner_selectAll"
|
||
},
|
||
"storageCleaner_noData": {
|
||
"message": "无数据",
|
||
"description": "Translation key: storageCleaner_noData"
|
||
},
|
||
"storageCleaner_errorNoTab": {
|
||
"message": "无法获取当前标签页",
|
||
"description": "Translation key: storageCleaner_errorNoTab"
|
||
},
|
||
"storageCleaner_errorRestricted": {
|
||
"message": "存储清理功能不支持此页面",
|
||
"description": "Translation key: storageCleaner_errorRestricted"
|
||
},
|
||
"storageCleaner_cleanSuccessReload": {
|
||
"message": "清理成功,即将刷新页面",
|
||
"description": "Translation key: storageCleaner_cleanSuccessReload"
|
||
},
|
||
"storageCleaner_errorStandardOnly": {
|
||
"message": "存储清理功能仅适用于标准网页",
|
||
"description": "Translation key: storageCleaner_errorStandardOnly"
|
||
},
|
||
"storageCleaner_confirmTitle": {
|
||
"message": "确认清理数据?",
|
||
"description": "Translation key: storageCleaner_confirmTitle"
|
||
},
|
||
"storageCleaner_confirmDesc": {
|
||
"message": "您将永久删除当前页面的以下选定存储项。",
|
||
"description": "Translation key: storageCleaner_confirmDesc"
|
||
},
|
||
"storageCleaner_irreversible": {
|
||
"message": "此操作不可撤销",
|
||
"description": "Translation key: storageCleaner_irreversible"
|
||
},
|
||
"storageCleaner_confirmAction": {
|
||
"message": "确认清理",
|
||
"description": "Translation key: storageCleaner_confirmAction"
|
||
},
|
||
"storageCleaner_cleanedSummary": {
|
||
"message": "清理了 {{items}}",
|
||
"description": "Translation key: storageCleaner_cleanedSummary"
|
||
},
|
||
"storageCleaner_noDataToClean": {
|
||
"message": "该页面没有可清理的存储数据",
|
||
"description": "Translation key: storageCleaner_noDataToClean"
|
||
},
|
||
"storageCleaner_partialFailure": {
|
||
"message": "部分清理失败",
|
||
"description": "Translation key: storageCleaner_partialFailure"
|
||
},
|
||
"storageCleaner_options_localStorage": {
|
||
"message": "Local Storage",
|
||
"description": "Translation key: storageCleaner_options_localStorage"
|
||
},
|
||
"storageCleaner_options_sessionStorage": {
|
||
"message": "Session Storage",
|
||
"description": "Translation key: storageCleaner_options_sessionStorage"
|
||
},
|
||
"storageCleaner_options_indexedDB": {
|
||
"message": "站点存储",
|
||
"description": "Translation key: storageCleaner_options_indexedDB"
|
||
},
|
||
"storageCleaner_options_cookies": {
|
||
"message": "Cookies",
|
||
"description": "Translation key: storageCleaner_options_cookies"
|
||
},
|
||
"storageCleaner_options_cacheStorage": {
|
||
"message": "Cache Storage",
|
||
"description": "Translation key: storageCleaner_options_cacheStorage"
|
||
},
|
||
"storageCleaner_options_serviceWorkers": {
|
||
"message": "Service Workers",
|
||
"description": "Translation key: storageCleaner_options_serviceWorkers"
|
||
},
|
||
"textStatistics_pageTitle": {
|
||
"message": "文本统计",
|
||
"description": "Translation key: textStatistics_pageTitle"
|
||
},
|
||
"textStatistics_placeholder": {
|
||
"message": "在此输入或粘贴文本...",
|
||
"description": "Translation key: textStatistics_placeholder"
|
||
},
|
||
"textStatistics_characters": {
|
||
"message": "字符数",
|
||
"description": "Translation key: textStatistics_characters"
|
||
},
|
||
"textStatistics_words": {
|
||
"message": "单词数",
|
||
"description": "Translation key: textStatistics_words"
|
||
},
|
||
"textStatistics_lines": {
|
||
"message": "行数",
|
||
"description": "Translation key: textStatistics_lines"
|
||
},
|
||
"textStatistics_bytes": {
|
||
"message": "字节大小",
|
||
"description": "Translation key: textStatistics_bytes"
|
||
},
|
||
"timestamp_pageTitle": {
|
||
"message": "时间戳转换",
|
||
"description": "Translation key: timestamp_pageTitle"
|
||
},
|
||
"timestamp_tsToDate": {
|
||
"message": "时间戳 → 日期",
|
||
"description": "Translation key: timestamp_tsToDate"
|
||
},
|
||
"timestamp_dateToTs": {
|
||
"message": "日期 → 时间戳",
|
||
"description": "Translation key: timestamp_dateToTs"
|
||
},
|
||
"timestamp_placeholderTs": {
|
||
"message": "输入时间戳...",
|
||
"description": "Translation key: timestamp_placeholderTs"
|
||
},
|
||
"timestamp_placeholderDate": {
|
||
"message": "YYYY-MM-DD HH:mm:ss",
|
||
"description": "Translation key: timestamp_placeholderDate"
|
||
},
|
||
"timestamp_unitMs": {
|
||
"message": "毫秒 (ms)",
|
||
"description": "Translation key: timestamp_unitMs"
|
||
},
|
||
"timestamp_unitS": {
|
||
"message": "秒 (s)",
|
||
"description": "Translation key: timestamp_unitS"
|
||
},
|
||
"timestamp_currentTs": {
|
||
"message": "当前时间戳",
|
||
"description": "Translation key: timestamp_currentTs"
|
||
},
|
||
"timestamp_useNowTooltip": {
|
||
"message": "填充到下方",
|
||
"description": "Translation key: timestamp_useNowTooltip"
|
||
},
|
||
"timestamp_copyTsTooltip": {
|
||
"message": "复制时间戳",
|
||
"description": "Translation key: timestamp_copyTsTooltip"
|
||
},
|
||
"timestamp_usedSuccess": {
|
||
"message": "已使用当前时间戳",
|
||
"description": "Translation key: timestamp_usedSuccess"
|
||
},
|
||
"timestamp_resultLabel": {
|
||
"message": "转换结果",
|
||
"description": "Translation key: timestamp_resultLabel"
|
||
},
|
||
"timestamp_copyResultTooltip": {
|
||
"message": "复制结果",
|
||
"description": "Translation key: timestamp_copyResultTooltip"
|
||
},
|
||
"timestamp_relativeTime": {
|
||
"message": "相对时间",
|
||
"description": "Translation key: timestamp_relativeTime"
|
||
},
|
||
"timestamp_iso8601": {
|
||
"message": "ISO 8601",
|
||
"description": "Translation key: timestamp_iso8601"
|
||
},
|
||
"timestamp_utcTime": {
|
||
"message": "UTC 时间",
|
||
"description": "Translation key: timestamp_utcTime"
|
||
},
|
||
"timestamp_copyTooltip": {
|
||
"message": "复制",
|
||
"description": "Translation key: timestamp_copyTooltip"
|
||
},
|
||
"timestamp_resultEmpty": {
|
||
"message": "请输入并点击转换",
|
||
"description": "Translation key: timestamp_resultEmpty"
|
||
},
|
||
"common_buttons_cancel": {
|
||
"message": "取消",
|
||
"description": "Translation key: buttons_cancel"
|
||
},
|
||
"common_buttons_copy": {
|
||
"message": "复制",
|
||
"description": "Translation key: buttons_copy"
|
||
},
|
||
"common_buttons_themeMode_light": {
|
||
"message": "切换到深色模式",
|
||
"description": "Translation key: buttons_themeMode_light"
|
||
},
|
||
"common_buttons_themeMode_dark": {
|
||
"message": "切换到系统模式",
|
||
"description": "Translation key: buttons_themeMode_dark"
|
||
},
|
||
"common_buttons_themeMode_system": {
|
||
"message": "切换到浅色模式",
|
||
"description": "Translation key: buttons_themeMode_system"
|
||
},
|
||
"common_buttons_search": {
|
||
"message": "搜索工具...",
|
||
"description": "Translation key: buttons_search"
|
||
},
|
||
"common_buttons_back": {
|
||
"message": "返回",
|
||
"description": "Translation key: buttons_back"
|
||
},
|
||
"common_buttons_clearSearch": {
|
||
"message": "清除搜索",
|
||
"description": "Translation key: buttons_clearSearch"
|
||
},
|
||
"common_buttons_recentSearch": {
|
||
"message": "最近搜索",
|
||
"description": "Translation key: buttons_recentSearch"
|
||
},
|
||
"common_buttons_noResults": {
|
||
"message": "未找到相关工具",
|
||
"description": "Translation key: buttons_noResults"
|
||
},
|
||
"common_buttons_openInTab": {
|
||
"message": "在标签页打开",
|
||
"description": "Translation key: buttons_openInTab"
|
||
},
|
||
|
||
"common_errorBoundary_title": {
|
||
"message": "糟糕,出了点问题",
|
||
"description": "Translation key: errorBoundary_title"
|
||
},
|
||
"common_errorBoundary_description": {
|
||
"message": "应用遇到了一些意外错误。您可以尝试刷新页面或重置应用。",
|
||
"description": "Translation key: errorBoundary_description"
|
||
},
|
||
"common_errorBoundary_refresh": {
|
||
"message": "刷新应用",
|
||
"description": "Translation key: errorBoundary_refresh"
|
||
},
|
||
"common_errorBoundary_retry": {
|
||
"message": "重新尝试",
|
||
"description": "Translation key: errorBoundary_retry"
|
||
},
|
||
"common_pageErrorBoundary_title": {
|
||
"message": "该功能运行异常",
|
||
"description": "Translation key: pageErrorBoundary_title"
|
||
},
|
||
"common_pageErrorBoundary_description": {
|
||
"message": "该页面在加载或渲染时遇到了内部脚本错误。您可以尝试重试,或者通过导航菜单切换到其他工具。",
|
||
"description": "Translation key: pageErrorBoundary_description"
|
||
}
|
||
}
|