@nexttylabs/echo 0.2.0

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.
Files changed (579) hide show
  1. package/.changeset/README.md +21 -0
  2. package/.changeset/config.json +11 -0
  3. package/.changeset/cozy-ghosts-care.md +5 -0
  4. package/.changeset/sharp-lines-stand.md +5 -0
  5. package/.changeset/sour-doodles-eat.md +5 -0
  6. package/.changeset/tender-moose-shop.md +5 -0
  7. package/.github/pull_request_template.md +13 -0
  8. package/.github/workflows/ci.yml +41 -0
  9. package/.github/workflows/publish.yml +44 -0
  10. package/.github/workflows/release.yml +73 -0
  11. package/AGENTS.md +92 -0
  12. package/CHANGELOG.md +13 -0
  13. package/Dockerfile +57 -0
  14. package/LICENSE +661 -0
  15. package/Makefile +77 -0
  16. package/README.md +198 -0
  17. package/app/(auth)/login/page.tsx +53 -0
  18. package/app/(auth)/register/page.tsx +48 -0
  19. package/app/(auth)/sign-in/page.tsx +22 -0
  20. package/app/(dashboard)/admin/feedback/[id]/edit/page.tsx +103 -0
  21. package/app/(dashboard)/admin/feedback/[id]/page.tsx +154 -0
  22. package/app/(dashboard)/admin/feedback/new/page.tsx +91 -0
  23. package/app/(dashboard)/admin/feedback/page.tsx +81 -0
  24. package/app/(dashboard)/admin/layout.tsx +48 -0
  25. package/app/(dashboard)/analytics/portal/page.tsx +30 -0
  26. package/app/(dashboard)/dashboard/page.tsx +133 -0
  27. package/app/(dashboard)/layout.tsx +69 -0
  28. package/app/(dashboard)/no-access/page.tsx +45 -0
  29. package/app/(dashboard)/settings/access/page.tsx +56 -0
  30. package/app/(dashboard)/settings/api-keys/page.tsx +55 -0
  31. package/app/(dashboard)/settings/appearance/page.tsx +40 -0
  32. package/app/(dashboard)/settings/branding/page.tsx +62 -0
  33. package/app/(dashboard)/settings/changelog/page.tsx +51 -0
  34. package/app/(dashboard)/settings/danger-zone/page.tsx +92 -0
  35. package/app/(dashboard)/settings/feedback/page.tsx +63 -0
  36. package/app/(dashboard)/settings/integrations/page.tsx +94 -0
  37. package/app/(dashboard)/settings/layout.tsx +43 -0
  38. package/app/(dashboard)/settings/modules/page.tsx +54 -0
  39. package/app/(dashboard)/settings/notifications/page.tsx +48 -0
  40. package/app/(dashboard)/settings/organization/page.tsx +104 -0
  41. package/app/(dashboard)/settings/organization/portal/access/page.tsx +22 -0
  42. package/app/(dashboard)/settings/organization/portal/experience/page.tsx +22 -0
  43. package/app/(dashboard)/settings/organization/portal/growth/page.tsx +22 -0
  44. package/app/(dashboard)/settings/organization/portal/layout.tsx +24 -0
  45. package/app/(dashboard)/settings/organization/portal/page.tsx +22 -0
  46. package/app/(dashboard)/settings/organizations/[orgId]/members/page.tsx +69 -0
  47. package/app/(dashboard)/settings/organizations/new/page.tsx +36 -0
  48. package/app/(dashboard)/settings/page.tsx +22 -0
  49. package/app/(dashboard)/settings/portal-access/page.tsx +53 -0
  50. package/app/(dashboard)/settings/portal-branding/page.tsx +59 -0
  51. package/app/(dashboard)/settings/portal-growth/page.tsx +57 -0
  52. package/app/(dashboard)/settings/portal-modules/page.tsx +49 -0
  53. package/app/(dashboard)/settings/portal-resources/page.tsx +66 -0
  54. package/app/(dashboard)/settings/profile/page.tsx +48 -0
  55. package/app/(dashboard)/settings/widgets/page.tsx +63 -0
  56. package/app/(public)/[organizationSlug]/changelog/page.tsx +109 -0
  57. package/app/(public)/[organizationSlug]/feedback/[id]/page.tsx +146 -0
  58. package/app/(public)/[organizationSlug]/page.tsx +160 -0
  59. package/app/(public)/[organizationSlug]/roadmap/page.tsx +142 -0
  60. package/app/(public)/docs/page.tsx +48 -0
  61. package/app/(public)/feedback/[id]/not-found.tsx +33 -0
  62. package/app/(public)/feedback/[id]/page.tsx +102 -0
  63. package/app/(public)/invite/[token]/page.tsx +121 -0
  64. package/app/(public)/page.tsx +22 -0
  65. package/app/(public)/widget/[organizationId]/page.tsx +122 -0
  66. package/app/api/_utils.ts +29 -0
  67. package/app/api/admin/backup/route.ts +72 -0
  68. package/app/api/api-keys/[keyId]/route.ts +92 -0
  69. package/app/api/api-keys/route.ts +116 -0
  70. package/app/api/auth/[...all]/route.ts +21 -0
  71. package/app/api/auth/clear-session/route.ts +43 -0
  72. package/app/api/auth/register/handler.ts +176 -0
  73. package/app/api/auth/register/route.ts +26 -0
  74. package/app/api/docs/route.ts +28 -0
  75. package/app/api/feedback/[id]/comments/[commentId]/route.ts +105 -0
  76. package/app/api/feedback/[id]/comments/route.ts +421 -0
  77. package/app/api/feedback/[id]/duplicates/route.ts +285 -0
  78. package/app/api/feedback/[id]/handler.ts +91 -0
  79. package/app/api/feedback/[id]/processing-status/route.ts +199 -0
  80. package/app/api/feedback/[id]/reclassify/route.ts +145 -0
  81. package/app/api/feedback/[id]/route.ts +511 -0
  82. package/app/api/feedback/[id]/suggest-tags/route.ts +227 -0
  83. package/app/api/feedback/[id]/sync-github/route.ts +52 -0
  84. package/app/api/feedback/[id]/vote/route.ts +431 -0
  85. package/app/api/feedback/bulk/route.ts +212 -0
  86. package/app/api/feedback/handler.ts +138 -0
  87. package/app/api/feedback/route.ts +298 -0
  88. package/app/api/feedback/similar/route.ts +100 -0
  89. package/app/api/health/route.test.ts +64 -0
  90. package/app/api/health/route.ts +92 -0
  91. package/app/api/identify/jwt/route.ts +29 -0
  92. package/app/api/integrations/github/route.ts +196 -0
  93. package/app/api/internal/domain-lookup/route.ts +67 -0
  94. package/app/api/invitations/accept/handler.ts +101 -0
  95. package/app/api/invitations/accept/route.ts +29 -0
  96. package/app/api/notifications/preferences/route.ts +109 -0
  97. package/app/api/organizations/[orgId]/handler.ts +123 -0
  98. package/app/api/organizations/[orgId]/invitations/handler.ts +121 -0
  99. package/app/api/organizations/[orgId]/invitations/route.ts +29 -0
  100. package/app/api/organizations/[orgId]/members/[memberId]/handler.ts +208 -0
  101. package/app/api/organizations/[orgId]/members/[memberId]/route.ts +30 -0
  102. package/app/api/organizations/[orgId]/members/handler.ts +77 -0
  103. package/app/api/organizations/[orgId]/members/route.ts +29 -0
  104. package/app/api/organizations/[orgId]/route.ts +30 -0
  105. package/app/api/organizations/handler.ts +97 -0
  106. package/app/api/organizations/route.ts +29 -0
  107. package/app/api/tags/sync/route.ts +88 -0
  108. package/app/api/upload/handler.ts +79 -0
  109. package/app/api/upload/route.ts +37 -0
  110. package/app/api/v1/feedback/[id]/route.ts +276 -0
  111. package/app/api/v1/feedback/route.ts +250 -0
  112. package/app/api/v1/spec/route.ts +356 -0
  113. package/app/api/webhooks/[webhookId]/route.ts +213 -0
  114. package/app/api/webhooks/github/route.ts +158 -0
  115. package/app/api/webhooks/route.ts +143 -0
  116. package/app/favicon.ico +0 -0
  117. package/app/globals.css +139 -0
  118. package/app/health/route.ts +108 -0
  119. package/app/layout.tsx +60 -0
  120. package/bun.lock +2503 -0
  121. package/components/api/rate-limit-info.tsx +86 -0
  122. package/components/api-keys/api-key-manager.tsx +262 -0
  123. package/components/auth/login-form.tsx +207 -0
  124. package/components/auth/register-form.tsx +230 -0
  125. package/components/comment/comment-form.tsx +111 -0
  126. package/components/comment/internal-notes.tsx +219 -0
  127. package/components/comment/public-comments.tsx +387 -0
  128. package/components/component-example-client-only.tsx +29 -0
  129. package/components/component-example.tsx +519 -0
  130. package/components/dashboard/index.ts +22 -0
  131. package/components/dashboard/organization-switcher.tsx +96 -0
  132. package/components/dashboard/quick-actions.tsx +57 -0
  133. package/components/dashboard/recent-feedback-list.tsx +152 -0
  134. package/components/dashboard/stats-cards.tsx +88 -0
  135. package/components/dashboard/status-chart.tsx +106 -0
  136. package/components/example.tsx +70 -0
  137. package/components/feedback/attachment-list.tsx +103 -0
  138. package/components/feedback/auto-classification-badge.tsx +92 -0
  139. package/components/feedback/classification-override.tsx +64 -0
  140. package/components/feedback/duplicate-suggestions-inline.tsx +158 -0
  141. package/components/feedback/duplicate-suggestions.tsx +188 -0
  142. package/components/feedback/embedded-feedback-form.tsx +439 -0
  143. package/components/feedback/feedback-actions.tsx +160 -0
  144. package/components/feedback/feedback-bulk-actions.tsx +184 -0
  145. package/components/feedback/feedback-detail-view.tsx +321 -0
  146. package/components/feedback/feedback-detail.tsx +305 -0
  147. package/components/feedback/feedback-edit-form.tsx +131 -0
  148. package/components/feedback/feedback-filters.tsx +222 -0
  149. package/components/feedback/feedback-list-controls.tsx +433 -0
  150. package/components/feedback/feedback-list-item.tsx +298 -0
  151. package/components/feedback/feedback-list-skeleton.tsx +49 -0
  152. package/components/feedback/feedback-list.tsx +523 -0
  153. package/components/feedback/feedback-sorter.tsx +117 -0
  154. package/components/feedback/feedback-stats.tsx +124 -0
  155. package/components/feedback/file-upload.tsx +289 -0
  156. package/components/feedback/processing-status.tsx +161 -0
  157. package/components/feedback/status-history.tsx +134 -0
  158. package/components/feedback/status-selector.tsx +153 -0
  159. package/components/feedback/submit-on-behalf-form.tsx +403 -0
  160. package/components/feedback/tag-suggestions.tsx +212 -0
  161. package/components/feedback/vote-button.tsx +113 -0
  162. package/components/feedback/vote-list.tsx +108 -0
  163. package/components/integrations/github-config.tsx +200 -0
  164. package/components/landing/hero.tsx +150 -0
  165. package/components/layout/dashboard-layout.tsx +59 -0
  166. package/components/layout/index.ts +20 -0
  167. package/components/layout/language-switcher.tsx +129 -0
  168. package/components/layout/mobile-sidebar.tsx +66 -0
  169. package/components/layout/sidebar.tsx +279 -0
  170. package/components/portal/changelog-entry.tsx +132 -0
  171. package/components/portal/changelog-list.tsx +85 -0
  172. package/components/portal/contributor-badge.tsx +29 -0
  173. package/components/portal/contributors-sidebar.tsx +98 -0
  174. package/components/portal/create-post-dialog.tsx +247 -0
  175. package/components/portal/feedback-board.tsx +205 -0
  176. package/components/portal/feedback-post-card.tsx +198 -0
  177. package/components/portal/help-center.tsx +169 -0
  178. package/components/portal/leaderboard.tsx +29 -0
  179. package/components/portal/portal-header.tsx +153 -0
  180. package/components/portal/portal-layout.tsx +62 -0
  181. package/components/portal/portal-modules-panel.tsx +118 -0
  182. package/components/portal/portal-nav.tsx +59 -0
  183. package/components/portal/portal-overview.tsx +174 -0
  184. package/components/portal/portal-settings-nav.tsx +62 -0
  185. package/components/portal/portal-settings-shell.tsx +71 -0
  186. package/components/portal/portal-shell.tsx +62 -0
  187. package/components/portal/portal-tab-nav.tsx +77 -0
  188. package/components/portal/project-switcher.tsx +20 -0
  189. package/components/portal/roadmap-board.tsx +82 -0
  190. package/components/portal/roadmap-card.tsx +76 -0
  191. package/components/portal/roadmap-column.tsx +78 -0
  192. package/components/portal/settings-forms/access-form.tsx +194 -0
  193. package/components/portal/settings-forms/copy-form.tsx +95 -0
  194. package/components/portal/settings-forms/index.ts +23 -0
  195. package/components/portal/settings-forms/languages-form.tsx +223 -0
  196. package/components/portal/settings-forms/seo-form.tsx +156 -0
  197. package/components/portal/settings-forms/sharing-form.tsx +155 -0
  198. package/components/portal/settings-forms/theme-form.tsx +104 -0
  199. package/components/settings/api-keys-list.tsx +167 -0
  200. package/components/settings/appearance-form.tsx +71 -0
  201. package/components/settings/index.ts +25 -0
  202. package/components/settings/invite-member-form.tsx +119 -0
  203. package/components/settings/notification-preferences.tsx +174 -0
  204. package/components/settings/organization-form.tsx +165 -0
  205. package/components/settings/organization-members-list.tsx +197 -0
  206. package/components/settings/profile-form.tsx +124 -0
  207. package/components/settings/role-selector.tsx +57 -0
  208. package/components/settings/settings-sidebar.tsx +115 -0
  209. package/components/shared/pagination.tsx +215 -0
  210. package/components/ui/alert-dialog.tsx +201 -0
  211. package/components/ui/alert.tsx +75 -0
  212. package/components/ui/avatar.tsx +126 -0
  213. package/components/ui/badge.tsx +62 -0
  214. package/components/ui/button.tsx +77 -0
  215. package/components/ui/card.tsx +111 -0
  216. package/components/ui/combobox.tsx +311 -0
  217. package/components/ui/dialog.tsx +158 -0
  218. package/components/ui/dropdown-menu.tsx +272 -0
  219. package/components/ui/field.tsx +256 -0
  220. package/components/ui/input-group.tsx +164 -0
  221. package/components/ui/input.tsx +36 -0
  222. package/components/ui/label.tsx +41 -0
  223. package/components/ui/pagination.tsx +142 -0
  224. package/components/ui/select.tsx +202 -0
  225. package/components/ui/separator.tsx +45 -0
  226. package/components/ui/sheet.tsx +151 -0
  227. package/components/ui/skeleton.tsx +32 -0
  228. package/components/ui/switch.tsx +49 -0
  229. package/components/ui/table.tsx +118 -0
  230. package/components/ui/tabs.tsx +107 -0
  231. package/components/ui/textarea.tsx +35 -0
  232. package/components/ui/tooltip.tsx +78 -0
  233. package/components/widget/widget-form.tsx +439 -0
  234. package/components.json +24 -0
  235. package/db/init/01-init.sql +13 -0
  236. package/docker-compose.dev.yml +26 -0
  237. package/docker-compose.yml +98 -0
  238. package/docs/architecture.md +259 -0
  239. package/docs/component-inventory.md +261 -0
  240. package/docs/database-migrations.md +76 -0
  241. package/docs/development-guide.md +209 -0
  242. package/docs/e2e-user-flows.csv +31 -0
  243. package/docs/er-diagram-feedback.mmd +138 -0
  244. package/docs/er-diagram.mmd +281 -0
  245. package/docs/i18n-check-report.md +296 -0
  246. package/docs/index.md +214 -0
  247. package/docs/logic-chain.md +94 -0
  248. package/docs/plans/2026-01-02-database-migration-scripts.md +496 -0
  249. package/docs/plans/2026-01-02-user-login-design.md +37 -0
  250. package/docs/plans/2026-01-02-user-login.md +437 -0
  251. package/docs/plans/2026-01-02-user-registration-design.md +47 -0
  252. package/docs/plans/2026-01-02-user-registration.md +628 -0
  253. package/docs/plans/2026-01-03-roles-permissions-design.md +20 -0
  254. package/docs/plans/2026-01-03-roles-permissions.md +266 -0
  255. package/docs/plans/2026-01-05-authentication-middleware.md +207 -0
  256. package/docs/plans/2026-01-05-member-removal.md +186 -0
  257. package/docs/plans/2026-01-05-organization-creation.md +374 -0
  258. package/docs/plans/2026-01-05-rbac-middleware.md +112 -0
  259. package/docs/plans/2026-01-05-role-configuration.md +441 -0
  260. package/docs/plans/2026-01-06-file-upload-support.md +804 -0
  261. package/docs/plans/2026-01-06-permission-check-hook.md +155 -0
  262. package/docs/plans/2026-01-06-resource-ownership-check.md +231 -0
  263. package/docs/plans/2026-01-07-feedback-tracking-link.md +459 -0
  264. package/docs/plans/2026-01-09-logout-redirect-design.md +52 -0
  265. package/docs/plans/2026-01-09-phase2-3-plan.md +654 -0
  266. package/docs/plans/2026-01-09-portal-execution-plan.md +408 -0
  267. package/docs/plans/2026-01-09-project-delete-feature-design.md +163 -0
  268. package/docs/plans/2026-01-09-project-delete-implementation.md +451 -0
  269. package/docs/plans/2026-01-09-project-edit-delete-design.md +52 -0
  270. package/docs/plans/2026-01-09-settings-center-design.md +114 -0
  271. package/docs/plans/2026-01-09-settings-center.md +948 -0
  272. package/docs/plans/2026-01-10-organization-only-design.md +66 -0
  273. package/docs/plans/2026-01-10-organization-only-implementation.md +433 -0
  274. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +18 -0
  275. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +296 -0
  276. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +173 -0
  277. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +82 -0
  278. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +521 -0
  279. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +75 -0
  280. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +293 -0
  281. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +180 -0
  282. package/docs/plans/2026-01-16-e2e-test-fixes.md +158 -0
  283. package/docs/plans/2026-01-17-admin-feedback-filters.md +214 -0
  284. package/docs/plans/2026-01-17-admin-feedback-improvements.md +453 -0
  285. package/docs/plans/2026-01-18-changesets-design.md +40 -0
  286. package/docs/product_changes.md +37 -0
  287. package/docs/project-overview.md +159 -0
  288. package/docs/project-scan-report.json +104 -0
  289. package/docs/route-role-visibility.md +51 -0
  290. package/docs/source-tree-analysis.md +150 -0
  291. package/docs/testing/delete-project-manual-tests.md +18 -0
  292. package/docs/user-story-tracking.md +191 -0
  293. package/drizzle.config.ts +32 -0
  294. package/eslint.config.mjs +19 -0
  295. package/hooks/use-permissions.ts +56 -0
  296. package/i18n/config.ts +45 -0
  297. package/i18n/request.ts +28 -0
  298. package/i18n/resolve-locale.ts +38 -0
  299. package/lib/api/errors.ts +62 -0
  300. package/lib/auth/cli-config.ts +35 -0
  301. package/lib/auth/client.ts +20 -0
  302. package/lib/auth/config.ts +55 -0
  303. package/lib/auth/jwt-identity.ts +21 -0
  304. package/lib/auth/org-context.ts +71 -0
  305. package/lib/auth/organization.ts +107 -0
  306. package/lib/auth/permissions.ts +87 -0
  307. package/lib/auth/session.ts +23 -0
  308. package/lib/config/rate-limits.ts +64 -0
  309. package/lib/dashboard/get-dashboard-stats.ts +136 -0
  310. package/lib/db/index.ts +41 -0
  311. package/lib/db/migrate.test.ts +49 -0
  312. package/lib/db/migrate.ts +62 -0
  313. package/lib/db/migrations/.gitkeep +0 -0
  314. package/lib/db/migrations/0000_cynical_gladiator.sql +53 -0
  315. package/lib/db/migrations/0001_wandering_sunfire.sql +27 -0
  316. package/lib/db/migrations/0002_shallow_speedball.sql +1 -0
  317. package/lib/db/migrations/0003_add_org_description.sql +1 -0
  318. package/lib/db/migrations/0003_boring_wild_pack.sql +13 -0
  319. package/lib/db/migrations/0004_windy_tyrannus.sql +27 -0
  320. package/lib/db/migrations/0005_perpetual_doorman.sql +5 -0
  321. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +13 -0
  322. package/lib/db/migrations/0007_clever_captain_cross.sql +14 -0
  323. package/lib/db/migrations/0008_sparkling_pandemic.sql +2 -0
  324. package/lib/db/migrations/0009_happy_black_tom.sql +29 -0
  325. package/lib/db/migrations/0010_kind_junta.sql +8 -0
  326. package/lib/db/migrations/0011_mute_squadron_supreme.sql +25 -0
  327. package/lib/db/migrations/0012_giant_power_man.sql +24 -0
  328. package/lib/db/migrations/0013_damp_titanium_man.sql +17 -0
  329. package/lib/db/migrations/0014_blue_alice.sql +18 -0
  330. package/lib/db/migrations/0015_webhook_tables.sql +41 -0
  331. package/lib/db/migrations/0016_github_integration.sql +30 -0
  332. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +22 -0
  333. package/lib/db/migrations/0017_slimy_inhumans.sql +6 -0
  334. package/lib/db/migrations/0018_same_spitfire.sql +1 -0
  335. package/lib/db/migrations/0019_jittery_loners.sql +16 -0
  336. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +14 -0
  337. package/lib/db/migrations/meta/0000_snapshot.json +374 -0
  338. package/lib/db/migrations/meta/0001_snapshot.json +553 -0
  339. package/lib/db/migrations/meta/0002_snapshot.json +560 -0
  340. package/lib/db/migrations/meta/0003_snapshot.json +650 -0
  341. package/lib/db/migrations/meta/0004_snapshot.json +852 -0
  342. package/lib/db/migrations/meta/0005_snapshot.json +900 -0
  343. package/lib/db/migrations/meta/0006_snapshot.json +1011 -0
  344. package/lib/db/migrations/meta/0007_snapshot.json +1125 -0
  345. package/lib/db/migrations/meta/0008_snapshot.json +1146 -0
  346. package/lib/db/migrations/meta/0009_snapshot.json +1386 -0
  347. package/lib/db/migrations/meta/0010_snapshot.json +1419 -0
  348. package/lib/db/migrations/meta/0011_snapshot.json +1615 -0
  349. package/lib/db/migrations/meta/0012_snapshot.json +1805 -0
  350. package/lib/db/migrations/meta/0013_snapshot.json +1948 -0
  351. package/lib/db/migrations/meta/0014_snapshot.json +2082 -0
  352. package/lib/db/migrations/meta/0015_snapshot.json +2476 -0
  353. package/lib/db/migrations/meta/0016_snapshot.json +2633 -0
  354. package/lib/db/migrations/meta/0017_snapshot.json +2680 -0
  355. package/lib/db/migrations/meta/0018_snapshot.json +2686 -0
  356. package/lib/db/migrations/meta/0019_snapshot.json +2741 -0
  357. package/lib/db/migrations/meta/_journal.json +146 -0
  358. package/lib/db/schema/ai-processing.ts +90 -0
  359. package/lib/db/schema/api-keys.ts +61 -0
  360. package/lib/db/schema/attachments.ts +48 -0
  361. package/lib/db/schema/auth.ts +111 -0
  362. package/lib/db/schema/comments.ts +74 -0
  363. package/lib/db/schema/duplicates.ts +80 -0
  364. package/lib/db/schema/feedback.ts +88 -0
  365. package/lib/db/schema/github-integrations.ts +66 -0
  366. package/lib/db/schema/index.ts +35 -0
  367. package/lib/db/schema/invitations.ts +32 -0
  368. package/lib/db/schema/notifications.ts +85 -0
  369. package/lib/db/schema/organization-members.ts +37 -0
  370. package/lib/db/schema/organization-settings.ts +134 -0
  371. package/lib/db/schema/organizations.ts +30 -0
  372. package/lib/db/schema/projects.ts +145 -0
  373. package/lib/db/schema/status-history.ts +63 -0
  374. package/lib/db/schema/tags.ts +194 -0
  375. package/lib/db/schema/user-profiles.ts +31 -0
  376. package/lib/db/schema/votes.ts +60 -0
  377. package/lib/db/schema/webhooks.ts +106 -0
  378. package/lib/feedback/filters.ts +28 -0
  379. package/lib/feedback/find-similar.ts +49 -0
  380. package/lib/feedback/get-feedback-by-id.ts +159 -0
  381. package/lib/feedback/prefill.ts +51 -0
  382. package/lib/http/get-request-url.ts +28 -0
  383. package/lib/integrations/github.ts +159 -0
  384. package/lib/invitations.ts +22 -0
  385. package/lib/logger.test.ts +31 -0
  386. package/lib/logger.ts +58 -0
  387. package/lib/middleware/api-key.ts +126 -0
  388. package/lib/middleware/rate-limit-keys.ts +47 -0
  389. package/lib/middleware/rate-limit.ts +148 -0
  390. package/lib/middleware/rbac.ts +39 -0
  391. package/lib/middleware/request-id.test.ts +28 -0
  392. package/lib/middleware/request-id.ts +30 -0
  393. package/lib/middleware/request-logger.test.ts +36 -0
  394. package/lib/middleware/request-logger.ts +41 -0
  395. package/lib/middleware/with-rate-limit.ts +33 -0
  396. package/lib/portal/analytics.ts +20 -0
  397. package/lib/portal/contributors.ts +27 -0
  398. package/lib/portal/i18n.ts +20 -0
  399. package/lib/portal/leaderboard-settings.ts +20 -0
  400. package/lib/portal/modules.ts +20 -0
  401. package/lib/portal/portal-copy.ts +20 -0
  402. package/lib/portal/public-context.tsx +110 -0
  403. package/lib/portal/seo.ts +20 -0
  404. package/lib/portal/settings-context.ts +56 -0
  405. package/lib/portal/sharing.ts +20 -0
  406. package/lib/portal/sorting.ts +20 -0
  407. package/lib/portal/theme.ts +20 -0
  408. package/lib/services/ai/classifier.ts +296 -0
  409. package/lib/services/ai/duplicate-detector.ts +255 -0
  410. package/lib/services/ai/tag-suggester.ts +108 -0
  411. package/lib/services/api-keys.ts +164 -0
  412. package/lib/services/backup.ts +173 -0
  413. package/lib/services/email/templates.ts +158 -0
  414. package/lib/services/email.ts +68 -0
  415. package/lib/services/github-sync.ts +205 -0
  416. package/lib/services/notifications/index.ts +224 -0
  417. package/lib/services/portal-settings.ts +157 -0
  418. package/lib/swagger/config.ts +296 -0
  419. package/lib/swagger/generate.ts +400 -0
  420. package/lib/upload/file-validator.ts +52 -0
  421. package/lib/upload/storage.ts +59 -0
  422. package/lib/utils/format.ts +26 -0
  423. package/lib/utils/slug.ts +28 -0
  424. package/lib/utils.ts +23 -0
  425. package/lib/validations/auth.ts +56 -0
  426. package/lib/validations/comment.ts +44 -0
  427. package/lib/validations/feedback.ts +51 -0
  428. package/lib/validations/invitations.ts +23 -0
  429. package/lib/validations/organizations.ts +34 -0
  430. package/lib/validations/projects.ts +49 -0
  431. package/lib/validators/feedback.ts +57 -0
  432. package/lib/validators/index.ts +18 -0
  433. package/lib/webhooks/events.ts +73 -0
  434. package/lib/webhooks/index.ts +21 -0
  435. package/lib/webhooks/retry.ts +188 -0
  436. package/lib/webhooks/sender.ts +183 -0
  437. package/lib/webhooks/verify.ts +37 -0
  438. package/lib/workers/feedback-processor.ts +255 -0
  439. package/messages/en.json +965 -0
  440. package/messages/jp.json +862 -0
  441. package/messages/zh-CN.json +855 -0
  442. package/next-env.d.ts +6 -0
  443. package/next.config.ts +66 -0
  444. package/package.json +84 -0
  445. package/playwright.config.ts +44 -0
  446. package/postcss.config.mjs +7 -0
  447. package/proxy.test.ts +131 -0
  448. package/proxy.ts +190 -0
  449. package/public/file.svg +1 -0
  450. package/public/globe.svg +1 -0
  451. package/public/logo-64.svg +5 -0
  452. package/public/logo.svg +5 -0
  453. package/public/next.svg +1 -0
  454. package/public/openapi.json +673 -0
  455. package/public/uploads/.gitkeep +0 -0
  456. package/public/uploads/02695701-ded0-4c81-8a21-9326c1d65448.pdf +1 -0
  457. package/public/uploads/178843ea-2780-48ef-8988-f4cba442e4cb.pdf +1 -0
  458. package/public/uploads/24b0a9ef-da93-49da-934f-637f89c7871d.pdf +1 -0
  459. package/public/uploads/7a11626d-a8e4-4b91-a8eb-20b6213b0a5a.pdf +1 -0
  460. package/public/uploads/b0703f4d-6e7b-4aab-8191-1a7b15f1b8ee.pdf +1 -0
  461. package/public/uploads/c8de0aed-4d3a-44aa-83bb-6594b7a2ddb3.pdf +1 -0
  462. package/public/uploads/e4cce295-0d85-4525-a1b0-a61c45722e26.pdf +1 -0
  463. package/public/uploads/eb4df45e-563c-48b8-9c68-c18212312426.pdf +1 -0
  464. package/public/vercel.svg +1 -0
  465. package/public/widget/embed.js +249 -0
  466. package/public/window.svg +1 -0
  467. package/scripts/backup-db.sh +57 -0
  468. package/scripts/backup-db.ts +24 -0
  469. package/scripts/generate-openapi.ts +22 -0
  470. package/scripts/migration-helper.ts +39 -0
  471. package/scripts/pre-deploy.ts +75 -0
  472. package/scripts/restore-db.sh +60 -0
  473. package/scripts/rollback.ts +72 -0
  474. package/scripts/seed-tags.ts +48 -0
  475. package/tests/api/feedback-bulk.test.ts +47 -0
  476. package/tests/api/feedback-by-id.test.ts +67 -0
  477. package/tests/api/feedback-comments-route-import.test.ts +26 -0
  478. package/tests/api/feedback-create.test.ts +71 -0
  479. package/tests/api/feedback-delete.test.ts +160 -0
  480. package/tests/api/feedback-filter.test.ts +250 -0
  481. package/tests/api/feedback-list.test.ts +234 -0
  482. package/tests/api/feedback-route-assignee-condition.test.ts +32 -0
  483. package/tests/api/feedback-similar.test.ts +46 -0
  484. package/tests/api/feedback-sort.test.ts +261 -0
  485. package/tests/api/feedback-status-enum.test.ts +49 -0
  486. package/tests/api/feedback-status-filter.test.ts +117 -0
  487. package/tests/api/feedback-submit-on-behalf.test.ts +269 -0
  488. package/tests/api/feedback.test.ts +175 -0
  489. package/tests/api/identify-jwt.test.ts +25 -0
  490. package/tests/api/invitation-accept.test.ts +213 -0
  491. package/tests/api/organization-invitations.test.ts +186 -0
  492. package/tests/api/organization-members-list.test.ts +79 -0
  493. package/tests/api/organization-members.test.ts +340 -0
  494. package/tests/api/organizations.test.ts +149 -0
  495. package/tests/api/register.test.ts +112 -0
  496. package/tests/api/upload.test.ts +103 -0
  497. package/tests/api/vote.test.ts +82 -0
  498. package/tests/app/admin-feedback-detail-page.test.tsx +25 -0
  499. package/tests/app/admin-feedback-list-page.test.tsx +25 -0
  500. package/tests/app/admin-feedback-new-page.test.tsx +25 -0
  501. package/tests/app/health-route-helpers.test.ts +27 -0
  502. package/tests/app/login-page.test.ts +26 -0
  503. package/tests/app/portal-page.test.ts +29 -0
  504. package/tests/app/project-portal-overview.test.tsx +25 -0
  505. package/tests/app/widget-page-import.test.ts +25 -0
  506. package/tests/components/create-post-dialog-defaults.test.ts +43 -0
  507. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +27 -0
  508. package/tests/components/feedback/embedded-feedback-form.test.tsx +96 -0
  509. package/tests/components/feedback/feedback-detail.test.tsx +25 -0
  510. package/tests/components/feedback/feedback-stats.test.tsx +49 -0
  511. package/tests/components/feedback-bulk-actions.test.tsx +39 -0
  512. package/tests/components/feedback-i18n-keys.test.ts +70 -0
  513. package/tests/components/feedback-list-controls-compile.test.ts +25 -0
  514. package/tests/components/feedback-list-controls.test.tsx +204 -0
  515. package/tests/components/feedback-list-item.test.tsx +67 -0
  516. package/tests/components/landing/hero.test.tsx +46 -0
  517. package/tests/components/layout/language-switcher.test.tsx +25 -0
  518. package/tests/components/layout/sidebar.test.tsx +157 -0
  519. package/tests/components/login-form.test.ts +25 -0
  520. package/tests/components/organization-form.test.ts +32 -0
  521. package/tests/components/organization-switcher.test.ts +25 -0
  522. package/tests/components/pagination.test.tsx +43 -0
  523. package/tests/components/portal-overview.test.tsx +25 -0
  524. package/tests/components/profile-form.test.tsx +139 -0
  525. package/tests/components/role-selector.test.ts +31 -0
  526. package/tests/components/status-chart.test.tsx +90 -0
  527. package/tests/e2e/auth.e2e.ts +323 -0
  528. package/tests/e2e/feedback-actions.e2e.ts +471 -0
  529. package/tests/e2e/feedback-attachment.e2e.ts +168 -0
  530. package/tests/e2e/feedback-customer.e2e.ts +226 -0
  531. package/tests/e2e/feedback-management.e2e.ts +565 -0
  532. package/tests/e2e/feedback-submit.e2e.ts +133 -0
  533. package/tests/e2e/feedback-view.e2e.ts +297 -0
  534. package/tests/e2e/fixtures/test-data.ts +235 -0
  535. package/tests/e2e/health-check.e2e.ts +230 -0
  536. package/tests/e2e/helpers/test-utils-helpers.test.ts +43 -0
  537. package/tests/e2e/helpers/test-utils.ts +298 -0
  538. package/tests/e2e/integration-placeholders.e2e.ts +199 -0
  539. package/tests/e2e/organization.e2e.ts +292 -0
  540. package/tests/e2e/permissions.e2e.ts +424 -0
  541. package/tests/e2e/project-widget.e2e.ts +63 -0
  542. package/tests/feedback/filters.test.ts +29 -0
  543. package/tests/hooks/use-permissions.test.ts +52 -0
  544. package/tests/lib/ai/classifier.test.ts +104 -0
  545. package/tests/lib/ai/duplicate-detector.test.ts +234 -0
  546. package/tests/lib/attachments-schema.test.ts +30 -0
  547. package/tests/lib/auth/session.test.ts +49 -0
  548. package/tests/lib/auth-client.test.ts +37 -0
  549. package/tests/lib/auth-config.test.ts +26 -0
  550. package/tests/lib/feedback-prefill.test.ts +52 -0
  551. package/tests/lib/feedback-processor.test.ts +41 -0
  552. package/tests/lib/feedback-schema.test.ts +33 -0
  553. package/tests/lib/file-validator.test.ts +48 -0
  554. package/tests/lib/get-feedback-by-id.test.ts +37 -0
  555. package/tests/lib/invitations.test.ts +35 -0
  556. package/tests/lib/login-schema.test.ts +36 -0
  557. package/tests/lib/org-context.test.ts +95 -0
  558. package/tests/lib/organization-access.test.ts +44 -0
  559. package/tests/lib/organization-member-role-schema.test.ts +41 -0
  560. package/tests/lib/permissions.test.ts +88 -0
  561. package/tests/lib/portal-analytics.test.ts +25 -0
  562. package/tests/lib/portal-contributors.test.ts +25 -0
  563. package/tests/lib/portal-copy.test.ts +27 -0
  564. package/tests/lib/portal-i18n.test.ts +30 -0
  565. package/tests/lib/portal-leaderboard-settings.test.ts +25 -0
  566. package/tests/lib/portal-modules.test.ts +25 -0
  567. package/tests/lib/portal-seo.test.ts +25 -0
  568. package/tests/lib/portal-sharing.test.ts +25 -0
  569. package/tests/lib/portal-sorting.test.ts +25 -0
  570. package/tests/lib/portal-theme.test.ts +25 -0
  571. package/tests/lib/rate-limit.test.ts +142 -0
  572. package/tests/lib/resolve-locale.test.ts +34 -0
  573. package/tests/lib/services/backup.test.ts +145 -0
  574. package/tests/lib/user-organizations.test.ts +42 -0
  575. package/tests/lib/user-role-schema.test.ts +33 -0
  576. package/tests/lib/user-schema.test.ts +25 -0
  577. package/tests/setup.ts +74 -0
  578. package/tsconfig.json +34 -0
  579. package/types/bun-test.d.ts +31 -0
@@ -0,0 +1,862 @@
1
+ {
2
+ "navigation": {
3
+ "dashboard": "ダッシュボード",
4
+ "feedback": "フィードバック",
5
+ "sectionLabel": "ナビゲーション",
6
+ "settings": "設定",
7
+ "logout": "ログアウト",
8
+ "openMenu": "メニューを開く",
9
+ "organization": "組織",
10
+ "selectOrganization": "組織を選択",
11
+ "newOrganization": "新しい組織"
12
+ },
13
+ "language": {
14
+ "label": "言語",
15
+ "en": "English",
16
+ "zh-CN": "简体中文",
17
+ "jp": "日本語"
18
+ },
19
+ "hero": {
20
+ "title": "Echo",
21
+ "login": "ログイン",
22
+ "register": "無料登録",
23
+ "headline": "オープンソース製品フィードバック管理プラットフォーム",
24
+ "description": "スタートアップ向けに設計され、製品フィードバックを一元管理し、洞察を発見し、情報に基づいた製品決定を下すことができます。",
25
+ "subtitle": "ゼロコストで開始、データを完全に制御。",
26
+ "cta1": "開始する",
27
+ "cta2": "ドキュメントを見る",
28
+ "coreValues": "中核価値",
29
+ "feature1": {
30
+ "title": "ゼロコースト開始",
31
+ "description": "オープンソースのコア機能、無料セルフホスティング、5分でデプロイ完了"
32
+ },
33
+ "feature2": {
34
+ "title": "データ主権",
35
+ "description": "ユーザーフィードバックデータを完全に制御し、GDPRなどのコンプライアンス要件に準拠"
36
+ },
37
+ "feature3": {
38
+ "title": "AIネイティブ",
39
+ "description": "スマート分類、重複検出、洞察発見でより効率的な意思決定を支援"
40
+ },
41
+ "feature4": {
42
+ "title": "簡単な統合",
43
+ "description": "オープンAPIとWebhookで既存のワークフローとシームレスに統合"
44
+ },
45
+ "ready": {
46
+ "title": "準備はできましたか?",
47
+ "description": "Echoをすでに使用しているスタートアップに参加し、すべてのユーザーフィードバックが聞かれるようにしましょう。",
48
+ "cta1": "無料アカウントを作成",
49
+ "cta2": "アカウントをお持ちですか?ログイン"
50
+ },
51
+ "footer": {
52
+ "title": "Echo - オープンソース製品フィードバック管理プラットフォーム",
53
+ "docs": "ドキュメント"
54
+ }
55
+ },
56
+ "common": {
57
+ "loading": "読み込み中...",
58
+ "save": "保存",
59
+ "saving": "保存中...",
60
+ "cancel": "キャンセル",
61
+ "delete": "削除",
62
+ "edit": "編集",
63
+ "create": "作成",
64
+ "comingSoon": "近日公開",
65
+ "noData": "データがありません",
66
+ "settingsSaved": "設定を保存しました",
67
+ "saveFailed": "保存に失敗しました。後でもう一度お試しください",
68
+ "viewAll": "すべて表示",
69
+ "submitFirst": "最初のフィードバックを送信",
70
+ "noOrganization": "関連する組織が見つかりませんでした。"
71
+ },
72
+ "validation": {
73
+ "titleRequired": "タイトルは必須です",
74
+ "titleMax200": "タイトルは200文字以内で入力してください",
75
+ "descriptionRequired": "説明は必須です",
76
+ "descriptionMax5000": "説明は5000文字以内で入力してください",
77
+ "customerNameRequired": "顧客名は必須です",
78
+ "customerNameMax100": "顧客名は100文字以内で入力してください",
79
+ "emailInvalid": "有効なメールアドレスを入力してください",
80
+ "typeRequired": "タイプを選択してください",
81
+ "priorityRequired": "優先度を選択してください"
82
+ },
83
+ "settings": {
84
+ "title": "設定",
85
+ "groups": {
86
+ "general": "一般",
87
+ "brandingCustomizations": "ブランディングとカスタマイズ",
88
+ "accessAuthentication": "アクセスと認証",
89
+ "modules": "モジュール",
90
+ "other": "その他",
91
+ "resources": "リソース"
92
+ },
93
+ "items": {
94
+ "profile": "プロフィール",
95
+ "organization": "組織",
96
+ "teamMembers": "チームメンバー",
97
+ "appearance": "外観",
98
+ "branding": "ブランディング",
99
+ "notificationEmails": "メール通知",
100
+ "organizationAccess": "組織アクセス",
101
+ "securitySso": "セキュリティとSSO",
102
+ "apiKeys": "APIキー",
103
+ "customizeModules": "モジュールのカスタマイズ",
104
+ "feedbackRoadmap": "フィードバックとロードマップ",
105
+ "changelog": "更新履歴",
106
+ "widgetsEmbeds": "ウィジェットと埋め込み",
107
+ "integrations": "インテグレーション",
108
+ "advanced": "詳細設定",
109
+ "dangerZone": "危険なゾーン",
110
+ "developerDocs": "開発者ドキュメント",
111
+ "joinCommunity": "コミュニティに参加"
112
+ },
113
+ "organizationForm": {
114
+ "titleEdit": "組織設定",
115
+ "titleCreate": "新しい組織を作成",
116
+ "descEdit": "組織の基本情報を管理します",
117
+ "descCreate": "複数のプロジェクトやチームを管理するための組織を作成します",
118
+ "nameLabel": "組織名",
119
+ "descriptionLabel": "説明",
120
+ "savingEdit": "保存中...",
121
+ "savingCreate": "作成中...",
122
+ "submitEdit": "変更を保存",
123
+ "submitCreate": "作成",
124
+ "updateFailed": "更新に失敗しました",
125
+ "createFailed": "作成に失敗しました",
126
+ "updatedSuccess": "組織情報を更新しました",
127
+ "genericError": "エラーが発生しました。後でもう一度お試しください。"
128
+ },
129
+ "profile": {
130
+ "pageTitle": "プロフィール",
131
+ "pageDescription": "アカウント情報と設定を管理",
132
+ "avatarTitle": "アバター",
133
+ "avatarDescription": "プロフィール画像",
134
+ "changeAvatar": "アバターを変更",
135
+ "avatarHint": "アバターアップロード機能は近日公開",
136
+ "cardTitle": "個人情報",
137
+ "cardDescription": "個人情報を更新",
138
+ "nameLabel": "名前",
139
+ "namePlaceholder": "名前を入力",
140
+ "nameRequired": "名前は必須です",
141
+ "nameTooLong": "名前は100文字以内で入力してください",
142
+ "emailLabel": "メールアドレス",
143
+ "emailNote": "メールアドレスは変更できません",
144
+ "saveChanges": "変更を保存",
145
+ "updating": "保存中...",
146
+ "updateSuccess": "プロフィールを更新しました",
147
+ "updateFailed": "プロフィールの更新に失敗しました"
148
+ },
149
+ "appearance": {
150
+ "pageTitle": "外観設定",
151
+ "pageDescription": "アプリの表示スタイルをカスタマイズ",
152
+ "cardTitle": "外観設定",
153
+ "cardDescription": "アプリの表示スタイルをカスタマイズ",
154
+ "themeLabel": "テーマ",
155
+ "themeLight": "ライト",
156
+ "themeDark": "ダーク",
157
+ "themeSystem": "システム設定に従う",
158
+ "themeComingSoon": "テーマ切り替え機能は近日公開"
159
+ },
160
+ "notifications": {
161
+ "pageTitle": "通知設定",
162
+ "pageDescription": "受け取りたい通知の種類を選択",
163
+ "cardTitle": "メール通知",
164
+ "cardDescription": "受け取りたいメール通知の種類を選択",
165
+ "statusChange": "フィードバックステータス変更",
166
+ "statusChangeDesc": "送信したフィードバックのステータスが変更されたときに通知を受け取る",
167
+ "newComment": "新しいコメント通知",
168
+ "newCommentDesc": "フォローしているフィードバックに他の人がコメントしたときに通知を受け取る",
169
+ "saveSettings": "設定を保存"
170
+ },
171
+ "apiKeys": {
172
+ "pageTitle": "APIキー",
173
+ "pageDescription": "APIアクセスキーを管理",
174
+ "createTitle": "新しいキーを作成",
175
+ "createDescription": "外部連携用の新しいAPIキーを作成",
176
+ "keyNameLabel": "キー名",
177
+ "keyNamePlaceholder": "キー名を入力",
178
+ "createButton": "キーを作成",
179
+ "existingTitle": "既存のキー",
180
+ "existingDescription": "APIキーを管理",
181
+ "noKeys": "APIキーがありません",
182
+ "keyCreatedAlert": "新しいキーが作成されました: {key}\n\nこのキーは今すぐ保存してください。再度表示されることはありません。",
183
+ "deleteConfirm": "このAPIキーを削除してもよろしいですか?この操作は取り消せません。"
184
+ },
185
+ "dangerZone": {
186
+ "pageTitle": "危険なゾーン",
187
+ "pageDescription": "不可逆的で危険な操作",
188
+ "deleteOrg": "組織を削除",
189
+ "deleteOrgDesc": "組織とすべてのデータを完全に削除します。この操作は取り消せません。",
190
+ "resetData": "すべてのデータをリセット",
191
+ "resetDataDesc": "すべてのフィードバック、ロードマップ項目、更新履歴を削除します。組織の設定は保持されます。",
192
+ "transferOwnership": "所有権を譲渡",
193
+ "transferOwnershipDesc": "組織の所有権を別の管理者に譲渡します。所有者権限を失います。"
194
+ },
195
+ "advanced": {
196
+ "pageTitle": "詳細設定",
197
+ "pageDescription": "詳細な設定と構成",
198
+ "dataExport": "データエクスポート",
199
+ "dataExportDesc": "すべてのデータをエクスポート",
200
+ "dataExportComingSoon": "データエクスポート機能は近日公開",
201
+ "webhooks": "Webhooks",
202
+ "webhooksDesc": "Webhookエンドポイントを構成",
203
+ "webhooksComingSoon": "Webhook構成は近日公開",
204
+ "developerMode": "開発者モード",
205
+ "developerModeDesc": "高度なデバッグ機能を有効化",
206
+ "developerModeComingSoon": "開発者モードは近日公開"
207
+ },
208
+ "security": {
209
+ "pageTitle": "セキュリティとSSO",
210
+ "pageDescription": "セキュリティ設定とシングルサインオンを管理",
211
+ "sso": "シングルサインオン(SSO)",
212
+ "ssoDesc": "SAMLまたはOAuthプロバイダーを構成",
213
+ "ssoComingSoon": "SSO構成は近日公開",
214
+ "twoFactor": "二要素認証",
215
+ "twoFactorDesc": "チームメンバーに2FAを要求",
216
+ "twoFactorComingSoon": "2FA設定は近日公開"
217
+ },
218
+ "integrations": {
219
+ "pageTitle": "インテグレーション",
220
+ "pageDescription": "サードパーティツールとサービスに接続",
221
+ "availableTitle": "利用可能なインテグレーション",
222
+ "availableDesc": "お気に入りのツールと接続",
223
+ "slack": "Slack",
224
+ "slackDesc": "Slackで通知を受け取る",
225
+ "jira": "Jira",
226
+ "jiraDesc": "Jiraの課題と同期",
227
+ "linear": "Linear",
228
+ "linearDesc": "Linearプロジェクトに接続",
229
+ "discord": "Discord",
230
+ "discordDesc": "Discordに更新を投稿"
231
+ },
232
+ "widgets": {
233
+ "pageTitle": "ウィジェットと埋め込み",
234
+ "pageDescription": "ウェブサイトにフィードバックウィジェットを埋め込む",
235
+ "feedbackWidget": "フィードバックウィジェット",
236
+ "feedbackWidgetDesc": "サイトにフィードバックボタンを埋め込む",
237
+ "feedbackWidgetComingSoon": "ウィジェット構成は近日公開",
238
+ "changelogWidget": "更新履歴ウィジェット",
239
+ "changelogWidgetDesc": "アプリ内に更新履歴を表示",
240
+ "changelogWidgetComingSoon": "更新履歴ウィジェットは近日公開"
241
+ },
242
+ "access": {
243
+ "pageTitle": "組織アクセス",
244
+ "pageDescription": "公開アクセスと権限を制御",
245
+ "visibilityTitle": "可視性と権限",
246
+ "visibilityDesc": "公開アクセス、投票、インデックス設定を構成"
247
+ },
248
+ "branding": {
249
+ "pageTitle": "ブランディング",
250
+ "pageDescription": "ポータルのビジュアルスタイルとコピーをカスタマイズ",
251
+ "themeTitle": "テーマ",
252
+ "themeDesc": "色、フォント、外観を制御",
253
+ "copyTitle": "コピー",
254
+ "copyDesc": "ポータルのタイトルとガイドテキストを構成",
255
+ "languagesTitle": "言語",
256
+ "languagesDesc": "デフォルト言語と利用可能な言語を構成"
257
+ },
258
+ "modules": {
259
+ "pageTitle": "モジュールのカスタマイズ",
260
+ "pageDescription": "機能モジュールを有効化または無効化",
261
+ "configTitle": "モジュール構成",
262
+ "configDesc": "必要に応じてフィードバック、ロードマップ、更新履歴を有効化"
263
+ },
264
+ "changelog": {
265
+ "pageTitle": "更新履歴",
266
+ "pageDescription": "更新履歴の表示と通知を構成",
267
+ "settingsTitle": "更新履歴設定",
268
+ "settingsDesc": "更新履歴エントリの表示方法を制御",
269
+ "settingsComingSoon": "更新履歴構成は近日公開"
270
+ },
271
+ "feedbackSettings": {
272
+ "pageTitle": "フィードバックとロードマップ",
273
+ "pageDescription": "フィードバック収集とロードマップ表示を構成",
274
+ "settingsTitle": "フィードバック設定",
275
+ "settingsDesc": "ユーザーがフィードバックを送信・表示する方法を構成",
276
+ "settingsComingSoon": "フィードバック構成は近日公開",
277
+ "roadmapTitle": "ロードマップ表示",
278
+ "roadmapDesc": "ロードマップの可視性とレイアウトを制御",
279
+ "roadmapComingSoon": "ロードマップ設定は近日公開"
280
+ },
281
+ "portal": {
282
+ "branding": {
283
+ "title": "ポータルブランディング",
284
+ "description": "ポータルのビジュアルスタイルとコピー言語を管理",
285
+ "theme": {
286
+ "title": "ポータルテーマ",
287
+ "description": "色、フォント、ビジュアル体験を制御"
288
+ },
289
+ "copy": {
290
+ "title": "ポータルコピー",
291
+ "description": "ポータルタイトルとガイドコピーを統一"
292
+ },
293
+ "copyForm": {
294
+ "defaults": {
295
+ "title": "フィードバックセンター",
296
+ "ctaLabel": "フィードバックを送信",
297
+ "emptyStateMessage": "まだフィードバックがありません。最初のアイデアを共有しましょう!",
298
+ "successMessage": "フィードバックありがとうございます。内容を確認します。",
299
+ "placeholders": {
300
+ "titleInput": "フィードバックのタイトルを入力...",
301
+ "descriptionInput": "アイデアを詳しく記述..."
302
+ }
303
+ },
304
+ "labels": {
305
+ "title": "ポータルタイトル",
306
+ "description": "ポータル説明",
307
+ "ctaLabel": "送信ボタンの文言",
308
+ "emptyStateMessage": "空状態メッセージ",
309
+ "successMessage": "成功メッセージ",
310
+ "placeholdersSection": "入力プレースホルダー",
311
+ "placeholders": {
312
+ "titleInput": "タイトル入力",
313
+ "descriptionInput": "説明入力"
314
+ }
315
+ },
316
+ "placeholders": {
317
+ "title": "フィードバックセンター",
318
+ "description": "アイデアを共有して、製品改善にご協力ください",
319
+ "ctaLabel": "フィードバックを送信",
320
+ "emptyStateMessage": "フィードバックがありません...",
321
+ "successMessage": "フィードバックありがとうございます!",
322
+ "titleInput": "フィードバックのタイトルを入力...",
323
+ "descriptionInput": "アイデアを詳しく記述..."
324
+ },
325
+ "help": {
326
+ "title": "ポータル上部に表示されます",
327
+ "description": "タイトルの下に表示される短い説明",
328
+ "emptyStateMessage": "まだフィードバックがない場合に表示されます",
329
+ "successMessage": "ユーザーが送信に成功した後に表示されます"
330
+ },
331
+ "buttons": {
332
+ "save": "変更を保存"
333
+ },
334
+ "status": {
335
+ "saved": "コピー設定を保存しました",
336
+ "saveFailed": "保存に失敗しました"
337
+ }
338
+ },
339
+ "languages": {
340
+ "title": "ポータル言語",
341
+ "description": "デフォルト言語とオプション言語を設定"
342
+ },
343
+ "themeForm": {
344
+ "labels": {
345
+ "mode": "カラーモード",
346
+ "primaryColor": "メインカラー",
347
+ "accentColor": "アクセントカラー",
348
+ "borderRadius": "角丸サイズ",
349
+ "fontFamily": "カスタムフォント",
350
+ "customCSS": "カスタム CSS"
351
+ },
352
+ "placeholders": {
353
+ "mode": "カラーモードを選択",
354
+ "borderRadius": "角丸サイズを選択"
355
+ },
356
+ "options": {
357
+ "mode": {
358
+ "light": "ライトモード",
359
+ "dark": "ダークモード",
360
+ "system": "システムに従う"
361
+ },
362
+ "borderRadius": {
363
+ "none": "角丸なし",
364
+ "sm": "小さい角丸",
365
+ "md": "中程度の角丸",
366
+ "lg": "大きい角丸",
367
+ "full": "完全な角丸"
368
+ }
369
+ },
370
+ "help": {
371
+ "primaryColor": "ボタン、リンクなどの主要要素に使用",
372
+ "accentColor": "ハイライトや補助アクションに使用",
373
+ "fontFamily": "空欄でシステムデフォルトフォントを使用",
374
+ "customCSS": "上級ユーザー向けカスタムスタイル"
375
+ },
376
+ "buttons": {
377
+ "save": "変更を保存"
378
+ },
379
+ "status": {
380
+ "saved": "テーマ設定を保存しました",
381
+ "saveFailed": "保存に失敗しました"
382
+ }
383
+ }
384
+ },
385
+ "access": {
386
+ "title": "ポータルアクセス"
387
+ },
388
+ "overview": {
389
+ "themeSummary": {
390
+ "custom": "メインカラー {color}",
391
+ "default": "デフォルトテーマを使用"
392
+ },
393
+ "seoSummary": {
394
+ "unset": "SEOタイトル未設定"
395
+ },
396
+ "status": {
397
+ "title": "ポータルステータス",
398
+ "description": "現在の組織のポータル入口と可視性",
399
+ "badgeEnabled": "公開中",
400
+ "badgeDisabled": "非公開",
401
+ "preview": "ポータルをプレビュー",
402
+ "open": "ポータルを開く",
403
+ "portalLink": "ポータルリンク:"
404
+ },
405
+ "cards": {
406
+ "action": "設定へ",
407
+ "experience": {
408
+ "title": "体験",
409
+ "description": "テーマ、コピー、言語",
410
+ "items": {
411
+ "copyTitle": "タイトル:{title}",
412
+ "copyTitleUnset": "ポータルタイトル未設定",
413
+ "defaultLanguage": "デフォルト言語:{locale}"
414
+ }
415
+ },
416
+ "growth": {
417
+ "title": "成長",
418
+ "description": "共有とSEO設定",
419
+ "items": {
420
+ "socialSharingEnabled": "ソーシャル共有設定済み",
421
+ "socialSharingDisabled": "ソーシャル共有未設定",
422
+ "ogImageSet": "OG画像設定済み",
423
+ "ogImageUnset": "OG画像未設定"
424
+ }
425
+ },
426
+ "visibility": {
427
+ "title": "可視性",
428
+ "description": "公開権限とインデックス",
429
+ "items": {
430
+ "portalEnabled": "ポータル公開",
431
+ "portalDisabled": "ポータル非公開",
432
+ "publicVotingEnabled": "公開投票を許可",
433
+ "publicVotingDisabled": "公開投票を無効",
434
+ "noIndex": "インデックス禁止",
435
+ "index": "インデックス許可"
436
+ }
437
+ }
438
+ },
439
+ "modules": {
440
+ "badge": "モジュール切替",
441
+ "summary": "ポータルモジュール表示を管理"
442
+ }
443
+ },
444
+ "modules": {
445
+ "title": "ポータルモジュール",
446
+ "panelTitle": "ポータルモジュール切り替え",
447
+ "panelDescription": "ポータルに表示する機能モジュールを制御します。",
448
+ "rows": {
449
+ "feedback": {
450
+ "label": "フィードバック",
451
+ "description": "ユーザーがフィードバックを送信・閲覧できるようにします"
452
+ },
453
+ "roadmap": {
454
+ "label": "ロードマップ",
455
+ "description": "計画中の機能と進捗を表示します"
456
+ },
457
+ "changelog": {
458
+ "label": "更新履歴",
459
+ "description": "更新内容とリリース告知を公開します"
460
+ }
461
+ },
462
+ "saveButton": "モジュール設定を保存",
463
+ "saving": "保存中...",
464
+ "saved": "モジュール設定を保存しました",
465
+ "saveFailed": "保存に失敗しました"
466
+ },
467
+ "resources": {
468
+ "title": "ポータルリソース",
469
+ "links": {
470
+ "title": "ポータルリンク"
471
+ }
472
+ },
473
+ "growth": {
474
+ "title": "ポータル成長",
475
+ "seo": {
476
+ "title": "SEO 設定"
477
+ }
478
+ }
479
+ }
480
+ },
481
+ "invite": {
482
+ "status": {
483
+ "loading": {
484
+ "title": "招待を受け入れ中",
485
+ "description": "招待情報を確認しています。しばらくお待ちください。"
486
+ },
487
+ "success": {
488
+ "title": "組織へようこそ",
489
+ "description": "招待が正常に確認されました。コラボレーションを開始できます。"
490
+ },
491
+ "expired": {
492
+ "title": "招待の有効期限切れ",
493
+ "description": "この招待は有効期限が切れています。管理者に再送信を依頼してください。"
494
+ },
495
+ "unauthorized": {
496
+ "title": "先にログインしてください",
497
+ "description": "ログインして招待を受け入れ、組織に参加してください。"
498
+ },
499
+ "error": {
500
+ "title": "招待を受け入れられません",
501
+ "description": "招待リンクが無効な可能性があります。管理者にお問い合わせください。"
502
+ }
503
+ },
504
+ "buttons": {
505
+ "dashboard": "ダッシュボードへ",
506
+ "login": "ログインへ",
507
+ "back": "戻る"
508
+ }
509
+ },
510
+ "auth": {
511
+ "login": {
512
+ "pageTitle": "Echo",
513
+ "pageSubtitle": "フィードバックと組織にアクセスするにはログインしてください",
514
+ "cardTitle": "ログイン",
515
+ "cardDescription": "メールアドレスとパスワードを入力してログイン",
516
+ "emailLabel": "メールアドレス",
517
+ "passwordLabel": "パスワード",
518
+ "rememberMe": "ログインを記憶",
519
+ "forgotPassword": "パスワードをお忘れですか?",
520
+ "submitButton": "ログイン",
521
+ "submitting": "ログイン中...",
522
+ "noAccount": "アカウントをお持ちでないですか?",
523
+ "register": "登録",
524
+ "invalidCredentials": "メールアドレスまたはパスワードが正しくありません"
525
+ },
526
+ "register": {
527
+ "pageTitle": "Echo",
528
+ "pageSubtitle": "フィードバック収集を開始するために新しいアカウントを作成",
529
+ "cardTitle": "アカウント作成",
530
+ "cardDescription": "以下の情報を入力して新しいアカウントを登録",
531
+ "nameLabel": "名前",
532
+ "namePlaceholder": "山田太郎",
533
+ "emailLabel": "メールアドレス",
534
+ "passwordLabel": "パスワード",
535
+ "passwordHint": "8文字以上、大文字小文字と数字または特殊文字を含む",
536
+ "confirmPasswordLabel": "パスワードを確認",
537
+ "submitButton": "登録",
538
+ "submitting": "登録中...",
539
+ "hasAccount": "すでにアカウントをお持ちですか?",
540
+ "login": "ログイン",
541
+ "emailExists": "このメールアドレスは既に使用されています",
542
+ "registerFailed": "登録に失敗しました。後でもう一度お試しください"
543
+ },
544
+ "validation": {
545
+ "nameRequired": "名前を入力してください",
546
+ "emailRequired": "メールアドレスを入力してください",
547
+ "emailInvalid": "有効なメールアドレスを入力してください",
548
+ "passwordRequired": "パスワードを入力してください",
549
+ "passwordMinLength": "パスワードは8文字以上必要です",
550
+ "passwordUppercase": "パスワードには大文字を含める必要があります",
551
+ "passwordLowercase": "パスワードには小文字を含める必要があります",
552
+ "passwordNumberOrSpecial": "パスワードには数字または特殊文字を含める必要があります",
553
+ "passwordMismatch": "パスワードが一致しません"
554
+ }
555
+ },
556
+ "dashboard": {
557
+ "pageTitle": "ダッシュボード",
558
+ "pageDescription": "フィードバック管理の概要",
559
+ "visitPortal": "Web Portalにアクセス",
560
+ "stats": {
561
+ "totalFeedback": "総フィードバック数",
562
+ "pending": "保留中",
563
+ "weeklyNew": "今週の新規",
564
+ "resolved": "解決済み"
565
+ },
566
+ "recentFeedback": {
567
+ "title": "最近のフィードバック",
568
+ "noData": "フィードバックデータがありません",
569
+ "count": "{count} 件",
570
+ "quantity": "数量"
571
+ },
572
+ "quickActions": {
573
+ "submitFeedback": "新しいフィードバックを送信",
574
+ "viewAllFeedback": "すべてのフィードバックを表示",
575
+ "settings": "設定",
576
+ "organizationSettings": "組織設定"
577
+ },
578
+ "statusChart": {
579
+ "title": "ステータス分布",
580
+ "noData": "データがありません"
581
+ }
582
+ },
583
+ "feedback": {
584
+ "trigger": "フィードバック",
585
+ "dialogTitle": "フィードバックを送信",
586
+ "dialogDescription": "提案や問題を送信するためにフォームに記入してください。",
587
+ "form": {
588
+ "title": "タイトル",
589
+ "titlePlaceholder": "フィードバックを簡単に説明してください",
590
+ "description": "説明",
591
+ "descriptionPlaceholder": "何が起こったか、またはどのような改善を望むかを説明してください",
592
+ "type": "フィードバックタイプ",
593
+ "selectType": "フィードバックタイプを選択",
594
+ "priority": "優先度",
595
+ "selectPriority": "優先度を選択",
596
+ "submit": "送信",
597
+ "submitting": "送信中...",
598
+ "cancel": "キャンセル"
599
+ },
600
+ "fileUpload": {
601
+ "errors": {
602
+ "size": "ファイルサイズは {maxMb}MB 以下にしてください",
603
+ "type": "対応していないファイル形式です",
604
+ "missingFeedbackId": "先にフィードバックを送信してください"
605
+ },
606
+ "dropzone": {
607
+ "title": "ここにドラッグするか、クリックしてファイルを選択",
608
+ "subtitle": "PNG, JPG, GIF, PDF に対応(最大 {maxMb}MB)"
609
+ },
610
+ "status": {
611
+ "pending": "待機中",
612
+ "uploading": "アップロード中...",
613
+ "success": "✓ アップロード完了",
614
+ "error": "✗ アップロード失敗"
615
+ },
616
+ "buttons": {
617
+ "upload": "ファイルをアップロード"
618
+ }
619
+ },
620
+ "detail": {
621
+ "info": "情報",
622
+ "createdAt": "作成日時",
623
+ "updatedAt": "更新日時",
624
+ "feedbackId": "フィードバックID: #{id}",
625
+ "copyLinkAriaLabel": "追跡リンクをコピー",
626
+ "priorityLabel": "優先度: {priority}",
627
+ "votes": "投票数",
628
+ "description": "詳細説明",
629
+ "attachments": "添付ファイル",
630
+ "votesTitle": "投票",
631
+ "statusHistory": "ステータス履歴",
632
+ "backToList": "一覧に戻る",
633
+ "customerInfo": "顧客情報(代理送信)",
634
+ "customerName": "氏名",
635
+ "customerEmail": "メール",
636
+ "customerPhone": "電話",
637
+ "descriptionTitle": "説明",
638
+ "attachmentsTitle": "添付ファイル ({count})",
639
+ "onBehalf": {
640
+ "title": "代理送信",
641
+ "submitter": "送信者",
642
+ "customerInfo": "顧客情報",
643
+ "name": "名前",
644
+ "email": "メール",
645
+ "phone": "電話",
646
+ "unknownUser": "不明なユーザー",
647
+ "customerHidden": "顧客情報はプライバシー保護のため非表示です。"
648
+ },
649
+ "timeline": {
650
+ "title": "タイムライン",
651
+ "createdAt": "作成日時",
652
+ "updatedAt": "最終更新"
653
+ },
654
+ "shareHint": "このリンクを共有してフィードバックの進捗を追跡",
655
+ "shareLinkLabel": "共有リンク",
656
+ "copyLink": "リンクをコピー",
657
+ "copied": "コピーしました",
658
+ "feedbackIdLabel": "フィードバック ID",
659
+ "voteHistory": "投票履歴",
660
+ "publicTitle": "フィードバック詳細",
661
+ "publicDescription": "フィードバックの詳細と進捗を確認できます。",
662
+ "publicHeader": "フィードバック詳細",
663
+ "publicBackHome": "ホームに戻る",
664
+ "publicContinueSubmit": "続けて送信"
665
+ },
666
+ "submitOnBehalf": {
667
+ "roleNotice": "あなたは {strong}{role}{/strong} として、顧客の代わりにフィードバックを送信しています。",
668
+ "submitSuccess": "フィードバックを送信しました!",
669
+ "submitFailed": "送信に失敗しました",
670
+ "networkError": "ネットワークエラー。後でもう一度お試しください。",
671
+ "viewDetail": "フィードバック詳細を見る →",
672
+ "cardTitle": "顧客の代わりにフィードバックを送信",
673
+ "cardDescription": "顧客の代わりにフィードバックを送信します。システムはあなたと顧客の情報を記録します。",
674
+ "sections": {
675
+ "feedback": "フィードバック",
676
+ "customer": "顧客情報"
677
+ },
678
+ "labels": {
679
+ "title": "タイトル",
680
+ "description": "説明",
681
+ "type": "タイプ",
682
+ "priority": "優先度",
683
+ "customerName": "顧客名",
684
+ "customerEmail": "顧客メール",
685
+ "customerPhone": "顧客電話(任意)"
686
+ },
687
+ "placeholders": {
688
+ "title": "問題や要望を簡単に説明してください",
689
+ "description": "問題や要望の内容を詳しく説明してください",
690
+ "type": "タイプを選択",
691
+ "priority": "優先度を選択",
692
+ "customerName": "顧客名",
693
+ "customerEmail": "customer@example.com",
694
+ "customerPhone": "+86 138 0000 0000"
695
+ },
696
+ "submit": "フィードバックを送信",
697
+ "submitting": "送信中..."
698
+ },
699
+ "success": "フィードバックが正常に送信されました",
700
+ "tracking": "追跡リンク",
701
+ "copy": "リンクをコピー",
702
+ "copied": "コピーしました",
703
+ "close": "閉じる",
704
+ "pageTitle": "フィードバック管理",
705
+ "pageDescription": "すべてのユーザーフィードバックを表示・管理",
706
+ "filters": {
707
+ "title": "フィルター",
708
+ "activeCount": "({count} 件有効)",
709
+ "clearAll": "フィルターをクリア",
710
+ "logicHint": "グループ内はいずれか一致・グループ間はすべて一致",
711
+ "statusLabel": "ステータス",
712
+ "statusPlaceholder": "ステータスを選択",
713
+ "typeLabel": "タイプ",
714
+ "typePlaceholder": "タイプを選択",
715
+ "priorityLabel": "優先度",
716
+ "priorityPlaceholder": "優先度を選択"
717
+ },
718
+ "status": {
719
+ "all": "すべてのステータス",
720
+ "new": "新規",
721
+ "inProgress": "進行中",
722
+ "planned": "計画済み",
723
+ "completed": "完了",
724
+ "closed": "クローズ",
725
+ "resolved": "解決済み",
726
+ "updating": "更新中...",
727
+ "updateFailed": "更新に失敗しました。後でもう一度お試しください"
728
+ },
729
+ "type": {
730
+ "all": "すべてのタイプ",
731
+ "bug": "バグ",
732
+ "feature": "機能リクエスト",
733
+ "issue": "問題",
734
+ "other": "その他",
735
+ "improvement": "改善",
736
+ "question": "質問"
737
+ },
738
+ "priority": {
739
+ "label": "優先度",
740
+ "all": "すべての優先度",
741
+ "low": "低",
742
+ "medium": "中",
743
+ "high": "高",
744
+ "critical": "緊急"
745
+ },
746
+ "filterTags": {
747
+ "status": "ステータス: {value}",
748
+ "type": "タイプ: {value}",
749
+ "priority": "優先度: {value}"
750
+ },
751
+ "list": {
752
+ "searchPlaceholder": "タイトルまたは説明を検索…",
753
+ "searchButton": "検索",
754
+ "sortLabel": "並び替え",
755
+ "sortNewest": "新しい順",
756
+ "sortOldest": "古い順",
757
+ "sortMostVotes": "票数が多い順",
758
+ "sortFewestVotes": "票数が少ない順",
759
+ "sort": {
760
+ "createdAt_desc": "最新",
761
+ "createdAt_asc": "最古",
762
+ "voteCount_desc": "投票数順",
763
+ "priority_desc": "優先度順",
764
+ "status_asc": "ステータス"
765
+ },
766
+ "pageSizeLabel": "表示件数",
767
+ "summary": "合計 {total} 件 / 1ページ {pageSize} 件",
768
+ "empty": "フィードバックはまだありません",
769
+ "error": "エラー: {message}",
770
+ "filtersEmpty": "フィルターなし",
771
+ "hasVotes": "投票あり",
772
+ "hasReplies": "返信あり",
773
+ "boolYes": "はい",
774
+ "boolNo": "いいえ",
775
+ "selectLabel": "フィードバックを選択",
776
+ "delete": "フィードバックを削除",
777
+ "selectAll": "このページを全選択"
778
+ },
779
+ "pagination": {
780
+ "previous": "前へ",
781
+ "next": "次へ",
782
+ "jumpTo": "移動",
783
+ "go": "移動",
784
+ "goToPage": "{page} ページへ移動"
785
+ },
786
+ "bulk": {
787
+ "selectedCount": "{count} 件選択済み",
788
+ "updateStatus": "ステータス更新",
789
+ "updatePriority": "優先度更新",
790
+ "delete": "削除",
791
+ "deleteConfirmTitle": "選択したフィードバックを削除しますか?",
792
+ "deleteConfirmDesc": "削除すると一覧に表示されなくなります。",
793
+ "clearSelection": "選択をクリア"
794
+ },
795
+ "vote": {
796
+ "vote": "投票",
797
+ "voted": "投票済み",
798
+ "count": "{count} 票",
799
+ "noVotes": "まだ投票はありません",
800
+ "visitor": "ビジター",
801
+ "anonymous": "匿名"
802
+ },
803
+ "relative": {
804
+ "today": "今日",
805
+ "yesterday": "昨日",
806
+ "daysAgo": "{count} 日前"
807
+ },
808
+ "actions": {
809
+ "label": "フィードバック操作"
810
+ }
811
+ },
812
+ "comments": {
813
+ "internal": {
814
+ "title": "内部メモ",
815
+ "loading": "読み込み中...",
816
+ "empty": "内部メモはまだありません",
817
+ "beFirst": "最初のメモを追加して議論を始めましょう",
818
+ "formLabel": "内部メモ",
819
+ "placeholder": "内部メモを追加してください。例:背景や次のアクション…",
820
+ "submit": "メモを追加",
821
+ "submitting": "追加中...",
822
+ "deleteAriaLabel": "メモを削除",
823
+ "errors": {
824
+ "loadFailed": "内部メモの読み込みに失敗しました",
825
+ "addFailed": "内部メモの追加に失敗しました",
826
+ "deleteFailed": "内部メモの削除に失敗しました"
827
+ }
828
+ },
829
+ "public": {
830
+ "title": "公開コメント",
831
+ "loading": "読み込み中...",
832
+ "empty": "コメントはまだありません",
833
+ "beFirst": "最初のコメントを投稿しましょう",
834
+ "loginPrompt": "ログインしてコメント、または匿名で投稿",
835
+ "loginRequired": "コメントするにはログインが必要です",
836
+ "login": "ログイン",
837
+ "guestComment": "匿名コメント",
838
+ "formLabel": "コメント",
839
+ "placeholder": "感想を共有してください。例:良かった点や改善点…",
840
+ "submit": "コメントを投稿",
841
+ "submitting": "投稿中...",
842
+ "anonymous": "匿名",
843
+ "guest": "ゲスト",
844
+ "errors": {
845
+ "loadFailed": "コメントの読み込みに失敗しました",
846
+ "submitFailed": "コメントの投稿に失敗しました"
847
+ },
848
+ "guestForm": {
849
+ "title": "匿名コメント",
850
+ "nameLabel": "お名前",
851
+ "emailLabel": "メールアドレス",
852
+ "contentLabel": "コメント内容",
853
+ "namePlaceholder": "お名前(例:山田太郎…)",
854
+ "emailPlaceholder": "メールアドレス(例:taro@example.com…)",
855
+ "contentPlaceholder": "感想を共有してください。例:良かった点や改善点…",
856
+ "cancel": "キャンセル",
857
+ "submit": "投稿",
858
+ "submitting": "投稿中..."
859
+ }
860
+ }
861
+ }
862
+ }