@agent-native/core 0.79.2 → 0.79.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +24 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/corpus/core/docs/content/locales/zh-TW/actions.md +583 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/corpus/core/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/corpus/core/docs/content/locales/zh-TW/authentication.md +332 -0
- package/corpus/core/docs/content/locales/zh-TW/automations.md +268 -0
- package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/client.md +398 -0
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/corpus/core/docs/content/locales/zh-TW/components.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/corpus/core/docs/content/locales/zh-TW/database.md +183 -0
- package/corpus/core/docs/content/locales/zh-TW/deployment.md +348 -0
- package/corpus/core/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/corpus/core/docs/content/locales/zh-TW/evals.md +155 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.md +360 -0
- package/corpus/core/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/corpus/core/docs/content/locales/zh-TW/faq.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/corpus/core/docs/content/locales/zh-TW/frames.md +153 -0
- package/corpus/core/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/corpus/core/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/corpus/core/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.md +461 -0
- package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/notifications.md +231 -0
- package/corpus/core/docs/content/locales/zh-TW/observability.md +294 -0
- package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/corpus/core/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/corpus/core/docs/content/locales/zh-TW/processors.md +106 -0
- package/corpus/core/docs/content/locales/zh-TW/progress.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/routing.md +79 -0
- package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/corpus/core/docs/content/locales/zh-TW/security.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/server.md +265 -0
- package/corpus/core/docs/content/locales/zh-TW/sharing.md +219 -0
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/corpus/core/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/corpus/core/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/corpus/core/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/template-content.md +402 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.md +173 -0
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/corpus/core/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/corpus/core/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/corpus/core/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/corpus/core/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/corpus/core/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/corpus/core/docs/content/locales/zh-TW/tracking.md +236 -0
- package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/corpus/core/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace.md +323 -0
- package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/ErrorBoundary.tsx +10 -0
- package/corpus/core/src/client/FeedbackButton.tsx +12 -0
- package/corpus/core/src/client/blocks/library/block-copy.ts +32 -0
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +33 -0
- package/corpus/core/src/client/i18n.tsx +5 -0
- package/corpus/core/src/localization/actions/set-localization-preference.ts +2 -1
- package/corpus/core/src/localization/shared.ts +45 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +38 -0
- package/corpus/core/src/server/onboarding-html.ts +99 -0
- package/corpus/core/src/templates/default/app/i18n/index.ts +2 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/corpus/core/src/templates/default/app/root.tsx +8 -0
- package/corpus/templates/analytics/app/i18n/index.ts +2 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +818 -0
- package/corpus/templates/analytics/app/i18n-data.ts +9 -0
- package/corpus/templates/assets/app/i18n/index.ts +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +860 -0
- package/corpus/templates/assets/app/i18n-data.ts +3 -0
- package/corpus/templates/brain/app/i18n/index.ts +2 -0
- package/corpus/templates/brain/app/i18n/zh-TW.ts +709 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +836 -0
- package/corpus/templates/calendar/app/i18n-data.ts +4 -0
- package/corpus/templates/chat/app/i18n/index.ts +2 -0
- package/corpus/templates/chat/app/i18n/zh-TW.ts +67 -0
- package/corpus/templates/chat/app/i18n-data.ts +3 -0
- package/corpus/templates/clips/app/i18n/index.ts +2 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +1280 -0
- package/corpus/templates/content/app/i18n/index.ts +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +906 -0
- package/corpus/templates/content/app/i18n-data.ts +4 -0
- package/corpus/templates/design/app/i18n/index.ts +2 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +517 -0
- package/corpus/templates/design/app/i18n-data.ts +6 -0
- package/corpus/templates/dispatch/app/i18n/index.ts +2 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +195 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -0
- package/corpus/templates/forms/app/i18n/index.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +349 -0
- package/corpus/templates/macros/app/i18n/index.ts +2 -0
- package/corpus/templates/macros/app/i18n/zh-TW.ts +224 -0
- package/corpus/templates/mail/app/i18n/index.ts +2 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +562 -0
- package/corpus/templates/mail/app/root.tsx +6 -0
- package/corpus/templates/plan/app/i18n/index.ts +2 -0
- package/corpus/templates/plan/app/i18n/zh-TW.ts +712 -0
- package/corpus/templates/slides/app/i18n/index.ts +2 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +531 -0
- package/corpus/templates/videos/app/i18n/index.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +435 -0
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +10 -0
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +12 -0
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/blocks/library/block-copy.d.ts.map +1 -1
- package/dist/client/blocks/library/block-copy.js +32 -0
- package/dist/client/blocks/library/block-copy.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +32 -0
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +5 -0
- package/dist/client/i18n.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/localization/actions/set-localization-preference.d.ts.map +1 -1
- package/dist/localization/actions/set-localization-preference.js +2 -2
- package/dist/localization/actions/set-localization-preference.js.map +1 -1
- package/dist/localization/shared.d.ts +1 -1
- package/dist/localization/shared.d.ts.map +1 -1
- package/dist/localization/shared.js +43 -0
- package/dist/localization/shared.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +39 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +96 -0
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/templates/default/app/i18n/index.ts +2 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +466 -0
- package/dist/templates/default/app/root.tsx +8 -0
- package/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/docs/content/locales/zh-TW/actions.md +583 -0
- package/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/docs/content/locales/zh-TW/authentication.md +332 -0
- package/docs/content/locales/zh-TW/automations.md +268 -0
- package/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/docs/content/locales/zh-TW/client.md +398 -0
- package/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/docs/content/locales/zh-TW/components.md +368 -0
- package/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/docs/content/locales/zh-TW/database.md +183 -0
- package/docs/content/locales/zh-TW/deployment.md +348 -0
- package/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/docs/content/locales/zh-TW/evals.md +155 -0
- package/docs/content/locales/zh-TW/extensions.md +360 -0
- package/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/docs/content/locales/zh-TW/faq.md +142 -0
- package/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/docs/content/locales/zh-TW/frames.md +153 -0
- package/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/docs/content/locales/zh-TW/messaging.md +461 -0
- package/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/docs/content/locales/zh-TW/notifications.md +231 -0
- package/docs/content/locales/zh-TW/observability.md +294 -0
- package/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/docs/content/locales/zh-TW/processors.md +106 -0
- package/docs/content/locales/zh-TW/progress.md +199 -0
- package/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/docs/content/locales/zh-TW/routing.md +79 -0
- package/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/docs/content/locales/zh-TW/security.md +330 -0
- package/docs/content/locales/zh-TW/server.md +265 -0
- package/docs/content/locales/zh-TW/sharing.md +219 -0
- package/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/docs/content/locales/zh-TW/template-content.md +402 -0
- package/docs/content/locales/zh-TW/template-design.md +173 -0
- package/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/docs/content/locales/zh-TW/tracking.md +236 -0
- package/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/docs/content/locales/zh-TW/workspace.md +323 -0
- package/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/package.json +1 -1
- package/src/templates/default/app/i18n/index.ts +2 -0
- package/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/src/templates/default/app/root.tsx +8 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
const messages = {
|
|
2
|
+
root: {
|
|
3
|
+
commandVideos: "影片",
|
|
4
|
+
searchCompositions: "搜尋合成",
|
|
5
|
+
commandAppearance: "外觀",
|
|
6
|
+
toggleTheme: "切換主題",
|
|
7
|
+
},
|
|
8
|
+
header: {
|
|
9
|
+
videos: "影片",
|
|
10
|
+
components: "元件",
|
|
11
|
+
designSystems: "設計系統",
|
|
12
|
+
team: "團隊",
|
|
13
|
+
settings: "設定",
|
|
14
|
+
extensions: "擴充功能",
|
|
15
|
+
newComposition: "新建合成",
|
|
16
|
+
studio: "工作室",
|
|
17
|
+
},
|
|
18
|
+
navigation: {
|
|
19
|
+
settings: "設定",
|
|
20
|
+
brand: "影片",
|
|
21
|
+
animations: "動畫",
|
|
22
|
+
components: "元件",
|
|
23
|
+
designSystems: "設計系統",
|
|
24
|
+
team: "團隊",
|
|
25
|
+
},
|
|
26
|
+
settings: {
|
|
27
|
+
title: "設定",
|
|
28
|
+
description: "此應用的語言和工作區偏好設定。",
|
|
29
|
+
languageTitle: "語言",
|
|
30
|
+
languageDescription: "選取介面語言。此偏好會儲存到你的帳戶。",
|
|
31
|
+
languageLabel: "介面語言",
|
|
32
|
+
workspaceTitle: "工作區",
|
|
33
|
+
workspaceDescription: "管理團隊成員、組織存取權限和共用工作區偏好。",
|
|
34
|
+
openTeamSettings: "開啟團隊設定",
|
|
35
|
+
openResourceSettings: "開啟資源設定",
|
|
36
|
+
agentTitle: "代理設定",
|
|
37
|
+
agentDescription:
|
|
38
|
+
"開啟代理側邊欄設定,管理模型、API 金鑰、自動化、語音和其他代理控制項。",
|
|
39
|
+
openAgentSettings: "開啟代理設定",
|
|
40
|
+
},
|
|
41
|
+
agent: {
|
|
42
|
+
emptyState: "可以詢問我任何關於影片的問題",
|
|
43
|
+
suggestionLogo: "為 Acme 制作標志揭示動畫",
|
|
44
|
+
suggestionZoom: "給這個場景新增鏡頭縮放",
|
|
45
|
+
suggestionSlow: "放慢開場動畫",
|
|
46
|
+
},
|
|
47
|
+
sidebar: {
|
|
48
|
+
navigation: "導覽",
|
|
49
|
+
openNavigation: "開啟導覽",
|
|
50
|
+
},
|
|
51
|
+
studio: {
|
|
52
|
+
closeSidebar: "關閉側邊欄",
|
|
53
|
+
openSidebar: "開啟側邊欄",
|
|
54
|
+
share: "分享",
|
|
55
|
+
shareVideos: "分享影片",
|
|
56
|
+
shareVideosDescription:
|
|
57
|
+
"若要分享或匯出影片,請連線雲端資料庫,讓你的合成可從任何地方存取。",
|
|
58
|
+
compositions: "合成",
|
|
59
|
+
properties: "屬性",
|
|
60
|
+
},
|
|
61
|
+
newComposition: {
|
|
62
|
+
runFailed: "代理執行失敗,合成尚未建立。",
|
|
63
|
+
readFailed: "無法讀取附件。",
|
|
64
|
+
startFailed: "無法啟動合成請求。",
|
|
65
|
+
button: "新建合成",
|
|
66
|
+
title: "新建合成",
|
|
67
|
+
description: "描述你想建立的影片",
|
|
68
|
+
placeholder: "描述你想建立的影片...",
|
|
69
|
+
timedOut: "作品請求超時。請從側邊欄重試。",
|
|
70
|
+
generating: "正在生成...",
|
|
71
|
+
emptyTitle: "準備制作影片了嗎?",
|
|
72
|
+
emptyDescription: "在代理側邊欄描述一個合成,即可生成你的第一個影片。",
|
|
73
|
+
},
|
|
74
|
+
notFound: {
|
|
75
|
+
message: "此頁面尚不存在。繼續提示即可建置它。",
|
|
76
|
+
backToStudio: "返回 Studio",
|
|
77
|
+
},
|
|
78
|
+
raw: {
|
|
79
|
+
camera: {
|
|
80
|
+
noKeyframeSelected: "未選取關鍵幀",
|
|
81
|
+
createKeyframesHelp: "使用影片上方的相機工具列建立關鍵幀",
|
|
82
|
+
panX: "平移 X",
|
|
83
|
+
panY: "平移 Y",
|
|
84
|
+
tiltX: "傾斜 X",
|
|
85
|
+
tiltY: "傾斜 Y",
|
|
86
|
+
addKeyframe: "新增關鍵幀",
|
|
87
|
+
createKeyframe: "在目前幀建立相機關鍵幀",
|
|
88
|
+
adjusting: "正在調整...",
|
|
89
|
+
pan: "平移",
|
|
90
|
+
panHint: "點擊並拖動以行動相機",
|
|
91
|
+
zoom: "縮放",
|
|
92
|
+
zoomHint: "上下拖動以縮放",
|
|
93
|
+
tilt: "傾斜",
|
|
94
|
+
tiltHint: "拖動以進行 3D 旋轉",
|
|
95
|
+
resetToDefaultView: "將此關鍵幀的相機重置為預設視圖",
|
|
96
|
+
},
|
|
97
|
+
cloud: {
|
|
98
|
+
authToken: "驗證權杖",
|
|
99
|
+
setupSteps: "設定步驟",
|
|
100
|
+
connectedReloading: "連線成功。正在重新載入...",
|
|
101
|
+
testConnect: "測試並連線",
|
|
102
|
+
savingCredentials: "正在儲存憑證...",
|
|
103
|
+
testingConnection: "正在測試連線...",
|
|
104
|
+
connectionFailed: "連線失敗",
|
|
105
|
+
providers: {
|
|
106
|
+
sqliteEdge: "邊缘 SQLite",
|
|
107
|
+
serverlessPostgres: "無伺服器 Postgres",
|
|
108
|
+
firebaseAlternative: "Firebase 的開來源替代方案",
|
|
109
|
+
sqliteCloudflareEdge: "Cloudflare 邊缘上的 SQLite",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
compositionSettings: {
|
|
113
|
+
outputSize: "輸出尺寸",
|
|
114
|
+
},
|
|
115
|
+
componentsSidebar: {
|
|
116
|
+
reusable: "可複用 UI 元件",
|
|
117
|
+
emptyTitle: "還沒有元件",
|
|
118
|
+
emptyDescription: "元件會顯示在這裡",
|
|
119
|
+
},
|
|
120
|
+
cursor: {
|
|
121
|
+
addAnimated: "新增動畫光標",
|
|
122
|
+
addAnimatedDescription: "為教程、演示和螢幕錄製新增動畫光標疊層",
|
|
123
|
+
animation: "光標動畫",
|
|
124
|
+
type: "光標型別",
|
|
125
|
+
interactiveComposition: "互動式合成",
|
|
126
|
+
defaultPointerHelp:
|
|
127
|
+
'光標型別應為 "default";懸停在互動元素上時會自動變為 "pointer"',
|
|
128
|
+
playClick: "播放點擊",
|
|
129
|
+
clickOn: "點擊開啟",
|
|
130
|
+
addClick: "新增點擊",
|
|
131
|
+
position: "位置",
|
|
132
|
+
visibility: "可見性",
|
|
133
|
+
visible: "可見",
|
|
134
|
+
hidden: "隱藏",
|
|
135
|
+
clickDragPosition: "點擊並拖動以定位光標",
|
|
136
|
+
},
|
|
137
|
+
folders: {
|
|
138
|
+
rename: "重命名資料夾",
|
|
139
|
+
delete: "刪除資料夾",
|
|
140
|
+
dragVideosHere: "將影片拖到這裡",
|
|
141
|
+
removeFromFolder: "從資料夾移除",
|
|
142
|
+
newFolder: "新建資料夾",
|
|
143
|
+
dropToRemove: "拖放到這裡以從資料夾移除",
|
|
144
|
+
},
|
|
145
|
+
motion: {
|
|
146
|
+
controlsKeyframe: "控制動畫如何行動到此關鍵幀",
|
|
147
|
+
},
|
|
148
|
+
props: {
|
|
149
|
+
emptyTitle: "沒有可設定的屬性",
|
|
150
|
+
emptyDescription: "請讓代理建立內容以新增到影片",
|
|
151
|
+
},
|
|
152
|
+
sidebar: {
|
|
153
|
+
animationTrack: "動畫軌道",
|
|
154
|
+
selectTrack: "選取軌道以編輯屬性",
|
|
155
|
+
clickAnyTrack: "點擊下方時間線中的任意軌道",
|
|
156
|
+
cursorInteractions: "光標互動",
|
|
157
|
+
selectComposition: "選取合成以編輯屬性",
|
|
158
|
+
},
|
|
159
|
+
timeline: {
|
|
160
|
+
clearTrack: "清空軌道",
|
|
161
|
+
deleteTrack: "刪除軌道",
|
|
162
|
+
keyframeOverlap: "關鍵幀重疊",
|
|
163
|
+
replaceExistingKeyframes: "替換現有關鍵幀",
|
|
164
|
+
undoMove: "撤銷行動",
|
|
165
|
+
},
|
|
166
|
+
player: {
|
|
167
|
+
goToStart: "回到開頭",
|
|
168
|
+
playbackSpeed: "播放速度",
|
|
169
|
+
},
|
|
170
|
+
designPreview: {
|
|
171
|
+
compositionPreview: "合成預覽",
|
|
172
|
+
compositionTitle: "合成標題",
|
|
173
|
+
supportingText:
|
|
174
|
+
"輔助文本會顯示在這裡,並在所有合成中一致應用你的品牌樣式。",
|
|
175
|
+
colors: "顏色",
|
|
176
|
+
typography: "排版",
|
|
177
|
+
logos: "標志",
|
|
178
|
+
section: "章節",
|
|
179
|
+
headingSample: "標題",
|
|
180
|
+
bodyTextPrefix: "內文使用",
|
|
181
|
+
bodyTextMiddle: "字重",
|
|
182
|
+
bodyTextSuffix: "段落內容將以這種方式顯示。",
|
|
183
|
+
},
|
|
184
|
+
designSetup: {
|
|
185
|
+
companyBrand: "公司 / 品牌",
|
|
186
|
+
companyPlaceholder: "Acme Inc. — 我們建置開發者工具...",
|
|
187
|
+
websiteUrl: "網站 URL",
|
|
188
|
+
githubRepository: "GitHub 倉庫",
|
|
189
|
+
codeFiles: "程式碼檔案",
|
|
190
|
+
codeDrop: "CSS、Tailwind 設定、主題檔案 — 拖放或點擊",
|
|
191
|
+
documents: "檔案和演示文稿",
|
|
192
|
+
documentsDrop: "PPTX、DOCX、PDF — 品牌指南、路演文稿",
|
|
193
|
+
screenshots: "截圖和視覺參考",
|
|
194
|
+
screenshotsDrop: "產品截圖、情緒板、標志",
|
|
195
|
+
customInstructions: "自訂說明",
|
|
196
|
+
customInstructionsPlaceholder: "設計偏好、限制、品牌指南...",
|
|
197
|
+
designSystemUpdated: "設計系統已更新",
|
|
198
|
+
failedToUpdate: "更新失敗",
|
|
199
|
+
forkExisting: "複用現有設計系統",
|
|
200
|
+
saving: "正在儲存...",
|
|
201
|
+
savedInstructions:
|
|
202
|
+
"已隨設計系統儲存。每次代理用它生成合成時都會重新應用。",
|
|
203
|
+
},
|
|
204
|
+
keyframes: {
|
|
205
|
+
duplicateAhead: "向前 30 幀複製關鍵幀",
|
|
206
|
+
remove: "移除關鍵幀",
|
|
207
|
+
resetDefaults: "重置為預設值",
|
|
208
|
+
},
|
|
209
|
+
componentLibrary: {
|
|
210
|
+
noSelection: "未選取元件",
|
|
211
|
+
selectToPreview: "從側邊欄選取元件進行預覽",
|
|
212
|
+
},
|
|
213
|
+
routes: {
|
|
214
|
+
notFound: "未找到 — Remotion Studio",
|
|
215
|
+
studio: "Remotion Studio",
|
|
216
|
+
components: "元件 — Remotion Studio",
|
|
217
|
+
designSystems: "設計系統 — Videos",
|
|
218
|
+
settings: "設定 - Videos",
|
|
219
|
+
team: "團隊 — Remotion Studio",
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
designSystems: {
|
|
223
|
+
new: "新建設計系統",
|
|
224
|
+
setupBrand: "設定你的品牌",
|
|
225
|
+
emptyTitle: "設定你的品牌標識",
|
|
226
|
+
emptyDescription:
|
|
227
|
+
"使用你的品牌顏色、字型和徽標建立設計系統。每個新作品都會遵循你的視覺標識。",
|
|
228
|
+
},
|
|
229
|
+
editor: {
|
|
230
|
+
common: {
|
|
231
|
+
cancel: "取消",
|
|
232
|
+
ok: "確定",
|
|
233
|
+
},
|
|
234
|
+
tweaks: {
|
|
235
|
+
title: "微調",
|
|
236
|
+
closePanel: "關閉微調面板",
|
|
237
|
+
togglePanel: "切換微調面板",
|
|
238
|
+
controls: {
|
|
239
|
+
accentColor: "強調色",
|
|
240
|
+
bgColor: "背景",
|
|
241
|
+
fps: "幀率",
|
|
242
|
+
easing: "預設緩動",
|
|
243
|
+
animationSpeed: "動畫速度",
|
|
244
|
+
motionBlur: "運動模糊",
|
|
245
|
+
},
|
|
246
|
+
options: {
|
|
247
|
+
Cyan: "青色",
|
|
248
|
+
Blue: "藍色",
|
|
249
|
+
Green: "綠色",
|
|
250
|
+
Pink: "粉色",
|
|
251
|
+
Gold: "金色",
|
|
252
|
+
Black: "黑色",
|
|
253
|
+
Slate: "板岩色",
|
|
254
|
+
Zinc: "鋅灰色",
|
|
255
|
+
Stone: "石色",
|
|
256
|
+
White: "白色",
|
|
257
|
+
Linear: "線性",
|
|
258
|
+
Spring: "彈簧",
|
|
259
|
+
Expo: "指數",
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
library: {
|
|
263
|
+
componentsTab: "元件",
|
|
264
|
+
propertiesTab: "屬性",
|
|
265
|
+
title: "元件庫",
|
|
266
|
+
organizedByAtomicDesign: "按原子設計組織",
|
|
267
|
+
noComponents: "還沒有元件",
|
|
268
|
+
componentsWillAppear: "元件會顯示在這裡",
|
|
269
|
+
categories: {
|
|
270
|
+
Atoms: "原子",
|
|
271
|
+
Molecules: "分子",
|
|
272
|
+
Organisms: "組織",
|
|
273
|
+
Templates: "範本",
|
|
274
|
+
Pages: "頁面",
|
|
275
|
+
},
|
|
276
|
+
cursorInteractions: "光標互動",
|
|
277
|
+
textAnimations: "文本動畫",
|
|
278
|
+
interactiveTextInput: "互動式文本輸入",
|
|
279
|
+
interactiveTextInputHelp:
|
|
280
|
+
'在下方 "Ask Builder" 文本區輸入。輸入文本後發送按鈕會變為藍色。',
|
|
281
|
+
fullyInteractive: "此元件現在已完全可互動:",
|
|
282
|
+
typeToSeeSendButton: "在文本區輸入以檢視藍色發送按鈕",
|
|
283
|
+
clickSendToClear: "點擊發送按鈕清空文本",
|
|
284
|
+
hoverToSeeEffect: "懸停按鈕以檢視放大/亮度效果",
|
|
285
|
+
previewOnly: "更改僅用於預覽,不會儲存",
|
|
286
|
+
componentInfo: "元件資訊",
|
|
287
|
+
selectComponent: "選取元件以檢視其屬性",
|
|
288
|
+
},
|
|
289
|
+
properties: {
|
|
290
|
+
title: "屬性",
|
|
291
|
+
closePanel: "關閉面板",
|
|
292
|
+
componentProps: "元件屬性",
|
|
293
|
+
noConfigurableProps: "沒有可設定屬性",
|
|
294
|
+
defaultValue: "預設值:",
|
|
295
|
+
animations: "動畫",
|
|
296
|
+
animationsDescription:
|
|
297
|
+
"此元件包含預設懸停和點擊動畫。動畫由互動系統控制,可通過動畫 API 自訂。",
|
|
298
|
+
hoverAnimation: "懸停動畫",
|
|
299
|
+
hoverAnimationDescription: "帶平滑過渡的縮放效果",
|
|
300
|
+
clickAnimation: "點擊動畫",
|
|
301
|
+
clickAnimationDescription: "點擊時的按下效果",
|
|
302
|
+
tracks: "軌道",
|
|
303
|
+
dimensions: "尺寸",
|
|
304
|
+
duration: "時長",
|
|
305
|
+
componentId: "元件 ID",
|
|
306
|
+
},
|
|
307
|
+
currentElement: {
|
|
308
|
+
noComponentSelected: "未選取元件",
|
|
309
|
+
noComponentSelectedHelp:
|
|
310
|
+
"將滑鼠懸停在預覽中的互動元素上,以編輯其光標行為和動畫",
|
|
311
|
+
hoverState: "懸停狀態",
|
|
312
|
+
clickState: "點擊狀態",
|
|
313
|
+
durationSeconds: "時長(秒)",
|
|
314
|
+
motionCurve: "運動曲線",
|
|
315
|
+
addProperty: "新增屬性",
|
|
316
|
+
selectProperty: "選取屬性",
|
|
317
|
+
animatedProperties: "動畫屬性",
|
|
318
|
+
editingComponent: "正在編輯元件",
|
|
319
|
+
cursorType: "光標型別",
|
|
320
|
+
resetToDefault: "重置為預設值",
|
|
321
|
+
arrowDefault: "箭頭(預設)",
|
|
322
|
+
pointerHand: "指針(手形)",
|
|
323
|
+
textIBeam: "文本(I 形光標)",
|
|
324
|
+
customCursorType: "自訂光標型別(點擊垃圾桶重置)",
|
|
325
|
+
usingInferredCursorType: "正在使用推斷的光標型別",
|
|
326
|
+
addHover: "新增懸停",
|
|
327
|
+
addClickState: "新增點擊狀態",
|
|
328
|
+
properties: {
|
|
329
|
+
scale: "規模",
|
|
330
|
+
translateX: "翻譯 X",
|
|
331
|
+
translateY: "翻譯 Y",
|
|
332
|
+
translateZ: "平移Z",
|
|
333
|
+
rotateX: "旋轉 X",
|
|
334
|
+
rotateY: "旋轉 Y",
|
|
335
|
+
rotateZ: "旋轉Z軸",
|
|
336
|
+
opacity: "不透明度",
|
|
337
|
+
brightness: "亮度",
|
|
338
|
+
blur: "模糊",
|
|
339
|
+
skewX: "傾斜 X",
|
|
340
|
+
skewY: "Y 軸斜度",
|
|
341
|
+
borderRadius: "邊界半徑",
|
|
342
|
+
borderWidth: "邊框寬度",
|
|
343
|
+
borderOpacity: "邊框不透明度",
|
|
344
|
+
backgroundOpacity: "背景不透明度",
|
|
345
|
+
shadowBlur: "陰影模糊",
|
|
346
|
+
shadowSpread: "陰影蔓延",
|
|
347
|
+
backgroundColor: "背景顏色",
|
|
348
|
+
borderColor: "邊框顏色",
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
track: {
|
|
352
|
+
readOnly: "唯讀",
|
|
353
|
+
copied: "已複製",
|
|
354
|
+
copy: "複製",
|
|
355
|
+
hide: "隱藏",
|
|
356
|
+
code: "程式碼",
|
|
357
|
+
hideCode: "隱藏程式碼",
|
|
358
|
+
viewExpressionCode: "檢視表達式程式碼",
|
|
359
|
+
removeProperty: "移除 {{property}}",
|
|
360
|
+
parameters: "參數",
|
|
361
|
+
parametersByName: {},
|
|
362
|
+
howItWorks: "工作原理",
|
|
363
|
+
values: "值",
|
|
364
|
+
from: "從",
|
|
365
|
+
to: "到",
|
|
366
|
+
editValuesInAnimatedProperties:
|
|
367
|
+
"請在上方軌道的“動畫屬性”部分編輯這些值。",
|
|
368
|
+
expression: "表達式",
|
|
369
|
+
cssPropertyPlaceholder: "CSS 屬性...",
|
|
370
|
+
hideDetails: "隱藏詳情",
|
|
371
|
+
howThisWorks: "工作原理",
|
|
372
|
+
fromExample: "例如 translateX(-100%) rotate(10deg)",
|
|
373
|
+
toExample: "例如 translateX(0) rotate(0deg)",
|
|
374
|
+
appliesToAllKeyframes: "應用於所有關鍵幀片段",
|
|
375
|
+
addProperty: "新增屬性...",
|
|
376
|
+
label: "標籤",
|
|
377
|
+
timingFunction: "計時函數",
|
|
378
|
+
start: "開始",
|
|
379
|
+
end: "結束",
|
|
380
|
+
noProperties: "沒有屬性 - 在下方新增一個",
|
|
381
|
+
},
|
|
382
|
+
preview: {
|
|
383
|
+
noZonesFound: "未找到區域",
|
|
384
|
+
noZonesFoundDescription: "按 D 啟用偵錯模式並先調整區域。",
|
|
385
|
+
invalidSavedZones: "已儲存的區域無效",
|
|
386
|
+
invalidSavedZonesDescription: "重新調整區域,然後儲存。",
|
|
387
|
+
zoneCoordinatesCopied: "區域坐標已複製",
|
|
388
|
+
zoneCoordinatesReady: "區域坐標已就緒",
|
|
389
|
+
zoneCoordinatesCopiedDescription: "將它們貼上到合成區域對應中。",
|
|
390
|
+
clipboardUnavailable: "此瀏覽器環境無法存取剪貼簿。",
|
|
391
|
+
debugMode: "偵錯模式 - 按 'D' 切換",
|
|
392
|
+
saveZones: "儲存區域",
|
|
393
|
+
remotionError: "Remotion 錯誤:",
|
|
394
|
+
restart: "重新開始",
|
|
395
|
+
pause: "暫停",
|
|
396
|
+
play: "播放",
|
|
397
|
+
timeline: "預覽時間線",
|
|
398
|
+
timelineDescriptionPrefix: "按",
|
|
399
|
+
timelineDescriptionSuffix: "以檢視光標演示懸停和點擊互動:",
|
|
400
|
+
cursorApproaches: "光標接近",
|
|
401
|
+
hoversOverComponent: "懸停在元件上",
|
|
402
|
+
clicksComponent: "點擊元件",
|
|
403
|
+
continuesHovering: "繼續懸停",
|
|
404
|
+
cursorExits: "光標離開",
|
|
405
|
+
quickDebug: "快速偵錯",
|
|
406
|
+
jumpToFrames: "使用 URL 參數跳轉到指定幀:",
|
|
407
|
+
},
|
|
408
|
+
composition: {
|
|
409
|
+
editOutputSize: "點擊編輯輸出尺寸",
|
|
410
|
+
editFrameRate: "點擊編輯幀率",
|
|
411
|
+
editDuration: "點擊編輯時長",
|
|
412
|
+
save: "儲存",
|
|
413
|
+
saveRequiresLocalDev: "儲存到註冊表需要本機開發模式",
|
|
414
|
+
saveCurrentAsDefault: "將目前設定儲存為此合成的預設值",
|
|
415
|
+
allChangesSavedDatabase: "所有更改已儲存到資料庫",
|
|
416
|
+
allChangesSavedRegistry: "所有更改已儲存到註冊表",
|
|
417
|
+
deleteComposition: "刪除合成",
|
|
418
|
+
saveComposition: "儲存合成",
|
|
419
|
+
saveCompositionDescription:
|
|
420
|
+
'將目前設定儲存為 "{{title}}" 的預設值?這會更新其軌道、動畫、屬性和合成設定。',
|
|
421
|
+
saved: "已儲存",
|
|
422
|
+
savedDescription: '已儲存 "{{title}}"。頁面將重新載入以獲取更改。',
|
|
423
|
+
saveFailed: "儲存失敗",
|
|
424
|
+
saveFailedDescription:
|
|
425
|
+
"儲存到註冊表失敗:{{message}}\n\n這通常表示需要重啟開發伺服器,或 API 端點不可用。你的更改仍儲存在瀏覽器存儲中,並會一直保留到重新載入。",
|
|
426
|
+
deleteCompositionTitle: '刪除 "{{title}}"?',
|
|
427
|
+
deleteCompositionDescription: "此操作無法撤銷。",
|
|
428
|
+
delete: "刪除",
|
|
429
|
+
requestTimedOut: "請求超時",
|
|
430
|
+
serverError: "伺服器錯誤:{{status}} - {{message}}",
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
export default messages;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"AA2SA,wBAAgB,aAAa,gCAI5B"}
|
|
@@ -26,6 +26,16 @@ const errorCopy = {
|
|
|
26
26
|
goHome: "回到首页",
|
|
27
27
|
reload: "重新加载",
|
|
28
28
|
},
|
|
29
|
+
"zh-TW": {
|
|
30
|
+
loadingLatest: "正在載入最新版本...",
|
|
31
|
+
genericTitle: "發生錯誤",
|
|
32
|
+
genericDetails: "發生未預期的錯誤。",
|
|
33
|
+
notFoundTitle: "找不到頁面",
|
|
34
|
+
notFoundDetails: "找不到這個頁面。",
|
|
35
|
+
statusTitle: (status) => `${status} 錯誤`,
|
|
36
|
+
goHome: "回首頁",
|
|
37
|
+
reload: "重新載入",
|
|
38
|
+
},
|
|
29
39
|
"es-ES": {
|
|
30
40
|
loadingLatest: "Cargando la versión más reciente...",
|
|
31
41
|
genericTitle: "Algo salió mal",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst homeLinkClassName =\n \"mt-6 inline-flex items-center gap-1.5 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <a href={appPath(\"/\")} className={homeLinkClassName}>\n {copy.goHome}\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent\"\n >\n {copy.reload}\n </button>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst homeLinkClassName =\n \"mt-6 inline-flex items-center gap-1.5 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n },\n \"zh-TW\": {\n loadingLatest: \"正在載入最新版本...\",\n genericTitle: \"發生錯誤\",\n genericDetails: \"發生未預期的錯誤。\",\n notFoundTitle: \"找不到頁面\",\n notFoundDetails: \"找不到這個頁面。\",\n statusTitle: (status) => `${status} 錯誤`,\n goHome: \"回首頁\",\n reload: \"重新載入\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <a href={appPath(\"/\")} className={homeLinkClassName}>\n {copy.goHome}\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent\"\n >\n {copy.reload}\n </button>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAmNf,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,uCAAuC;IACvC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAeD,wBAAgB,cAAc,CAAC,EAC7B,OAAmB,EACnB,KAAK,EACL,GAA0B,EAC1B,SAAS,EACT,IAAI,EACJ,KAAa,EACb,WAAW,EACX,aAAa,EACb,cAAc,EACd,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,OAAO,EAAE,aAAa,GACvB,EAAE,mBAAmB,+BAwQrB"}
|
|
@@ -34,6 +34,18 @@ const FEEDBACK_COPY = {
|
|
|
34
34
|
sendError: "无法发送反馈",
|
|
35
35
|
keyboardHint: "{{shortcut}}+Enter 发送",
|
|
36
36
|
},
|
|
37
|
+
"zh-TW": {
|
|
38
|
+
label: "意見回饋",
|
|
39
|
+
placeholder: "哪些地方好用、哪裡壞了,或你想改什麼?",
|
|
40
|
+
submit: "送出意見回饋",
|
|
41
|
+
submitting: "正在送出...",
|
|
42
|
+
success: "感謝你的意見回饋。",
|
|
43
|
+
loadError: "無法載入意見回饋表單",
|
|
44
|
+
invalidUrl: "意見回饋 URL 無效",
|
|
45
|
+
emptyError: "請先輸入內容",
|
|
46
|
+
sendError: "無法送出意見回饋",
|
|
47
|
+
keyboardHint: "{{shortcut}}+Enter 送出",
|
|
48
|
+
},
|
|
37
49
|
"es-ES": {
|
|
38
50
|
label: "Comentarios",
|
|
39
51
|
placeholder: "¿Qué funciona, qué falla o qué cambiarías?",
|