@jant/core 0.2.2 → 0.2.3

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 (82) hide show
  1. package/package.json +2 -4
  2. package/src/app.tsx +377 -0
  3. package/src/auth.ts +38 -0
  4. package/src/db/index.ts +14 -0
  5. package/src/db/migrations/0000_solid_moon_knight.sql +118 -0
  6. package/src/db/migrations/0001_add_search_fts.sql +40 -0
  7. package/src/db/migrations/0002_collection_path.sql +2 -0
  8. package/src/db/migrations/0003_collection_path_nullable.sql +21 -0
  9. package/src/db/migrations/0004_media_uuid.sql +35 -0
  10. package/src/db/migrations/meta/0000_snapshot.json +784 -0
  11. package/src/db/migrations/meta/_journal.json +41 -0
  12. package/src/db/schema.ts +159 -0
  13. package/src/i18n/EXAMPLES.md +235 -0
  14. package/src/i18n/README.md +296 -0
  15. package/src/i18n/Trans.tsx +31 -0
  16. package/src/i18n/context.tsx +101 -0
  17. package/src/i18n/detect.ts +100 -0
  18. package/src/i18n/i18n.ts +62 -0
  19. package/src/i18n/index.ts +65 -0
  20. package/src/i18n/locales/en.po +875 -0
  21. package/src/i18n/locales/en.ts +1 -0
  22. package/src/i18n/locales/zh-Hans.po +875 -0
  23. package/src/i18n/locales/zh-Hans.ts +1 -0
  24. package/src/i18n/locales/zh-Hant.po +875 -0
  25. package/src/i18n/locales/zh-Hant.ts +1 -0
  26. package/src/i18n/locales.ts +14 -0
  27. package/src/i18n/middleware.ts +59 -0
  28. package/src/index.ts +42 -0
  29. package/src/lib/assets.ts +51 -0
  30. package/src/lib/constants.ts +67 -0
  31. package/src/lib/image.ts +107 -0
  32. package/src/lib/index.ts +9 -0
  33. package/src/lib/markdown.ts +93 -0
  34. package/src/lib/schemas.ts +92 -0
  35. package/src/lib/sqid.ts +79 -0
  36. package/src/lib/sse.ts +152 -0
  37. package/src/lib/time.ts +117 -0
  38. package/src/lib/url.ts +107 -0
  39. package/src/middleware/auth.ts +59 -0
  40. package/src/routes/api/posts.ts +127 -0
  41. package/src/routes/api/search.ts +53 -0
  42. package/src/routes/api/upload.ts +240 -0
  43. package/src/routes/dash/collections.tsx +341 -0
  44. package/src/routes/dash/index.tsx +89 -0
  45. package/src/routes/dash/media.tsx +551 -0
  46. package/src/routes/dash/pages.tsx +245 -0
  47. package/src/routes/dash/posts.tsx +202 -0
  48. package/src/routes/dash/redirects.tsx +155 -0
  49. package/src/routes/dash/settings.tsx +93 -0
  50. package/src/routes/feed/rss.ts +119 -0
  51. package/src/routes/feed/sitemap.ts +75 -0
  52. package/src/routes/pages/archive.tsx +223 -0
  53. package/src/routes/pages/collection.tsx +79 -0
  54. package/src/routes/pages/home.tsx +93 -0
  55. package/src/routes/pages/page.tsx +64 -0
  56. package/src/routes/pages/post.tsx +81 -0
  57. package/src/routes/pages/search.tsx +162 -0
  58. package/src/services/collection.ts +180 -0
  59. package/src/services/index.ts +40 -0
  60. package/src/services/media.ts +97 -0
  61. package/src/services/post.ts +279 -0
  62. package/src/services/redirect.ts +74 -0
  63. package/src/services/search.ts +117 -0
  64. package/src/services/settings.ts +76 -0
  65. package/src/theme/components/ActionButtons.tsx +98 -0
  66. package/src/theme/components/CrudPageHeader.tsx +48 -0
  67. package/src/theme/components/DangerZone.tsx +77 -0
  68. package/src/theme/components/EmptyState.tsx +56 -0
  69. package/src/theme/components/ListItemRow.tsx +24 -0
  70. package/src/theme/components/PageForm.tsx +114 -0
  71. package/src/theme/components/Pagination.tsx +196 -0
  72. package/src/theme/components/PostForm.tsx +122 -0
  73. package/src/theme/components/PostList.tsx +68 -0
  74. package/src/theme/components/ThreadView.tsx +118 -0
  75. package/src/theme/components/TypeBadge.tsx +28 -0
  76. package/src/theme/components/VisibilityBadge.tsx +33 -0
  77. package/src/theme/components/index.ts +12 -0
  78. package/src/theme/index.ts +24 -0
  79. package/src/theme/layouts/BaseLayout.tsx +50 -0
  80. package/src/theme/layouts/DashLayout.tsx +108 -0
  81. package/src/theme/layouts/index.ts +2 -0
  82. package/src/types.ts +222 -0
@@ -0,0 +1,875 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "POT-Creation-Date: 2026-02-01 08:44:08+0000\n"
4
+ "MIME-Version: 1.0\n"
5
+ "Content-Type: text/plain; charset=utf-8\n"
6
+ "Content-Transfer-Encoding: 8bit\n"
7
+ "X-Generator: lingui-po-translate\n"
8
+ "Language: zh-Hant\n"
9
+ "Project-Id-Version: \n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "PO-Revision-Date: \n"
12
+ "Last-Translator: \n"
13
+ "Language-Team: \n"
14
+ "Plural-Forms: \n"
15
+
16
+ #: src/routes/pages/archive.tsx:135
17
+ #. @context: Archive post reply indicator - plural
18
+ msgid "{count} replies"
19
+ msgstr "{count} 條回覆"
20
+
21
+ #: src/routes/dash/collections.tsx:196
22
+ #. @context: Navigation link
23
+ msgid "← Back to Collections"
24
+ msgstr "← 返回收藏夾"
25
+
26
+ #: src/routes/pages/collection.tsx:67
27
+ #: src/routes/pages/post.tsx:69
28
+ #. @context: Navigation link
29
+ #. @context: Navigation link
30
+ msgid "← Back to home"
31
+ msgstr "← 返回首頁"
32
+
33
+ #: src/routes/pages/archive.tsx:134
34
+ #. @context: Archive post reply indicator - single
35
+ msgid "1 reply"
36
+ msgstr "1 條回覆"
37
+
38
+ #: src/routes/dash/redirects.tsx:95
39
+ #. @context: Redirect type option
40
+ msgid "301 (Permanent)"
41
+ msgstr "301(永久)"
42
+
43
+ #: src/routes/dash/redirects.tsx:96
44
+ #. @context: Redirect type option
45
+ msgid "302 (Temporary)"
46
+ msgstr "302(臨時)"
47
+
48
+ #: src/routes/pages/archive.tsx:85
49
+ #. @context: Archive filter - all types
50
+ msgid "All"
51
+ msgstr "所有"
52
+
53
+ #: src/routes/pages/archive.tsx:71
54
+ #: src/routes/pages/home.tsx:39
55
+ #. @context: Archive page title
56
+ #. @context: Navigation link to archive page
57
+ msgid "Archive"
58
+ msgstr "檔案館"
59
+
60
+ #: src/routes/pages/archive.tsx:169
61
+ #: src/theme/components/PostForm.tsx:32
62
+ #: src/theme/components/PostList.tsx:41
63
+ #. @context: Post type badge - article
64
+ #. @context: Post type label - article
65
+ #. @context: Post type option
66
+ msgid "Article"
67
+ msgstr "文章"
68
+
69
+ #: src/routes/pages/archive.tsx:181
70
+ #. @context: Post type label plural - articles
71
+ msgid "Articles"
72
+ msgstr "文章"
73
+
74
+ #: src/routes/dash/media.tsx:140
75
+ #. @context: Button to go back to media list
76
+ msgid "Back"
77
+ msgstr "返回"
78
+
79
+ #: src/routes/pages/archive.tsx:158
80
+ #: src/routes/pages/page.tsx:52
81
+ #: src/routes/pages/search.tsx:138
82
+ #. @context: Navigation link back to home page
83
+ #. @context: Navigation link back to home page
84
+ #. @context: Navigation link back to home page
85
+ msgid "Back to home"
86
+ msgstr "回到首頁"
87
+
88
+ #: src/routes/dash/collections.tsx:103
89
+ #: src/routes/dash/collections.tsx:249
90
+ #: src/routes/dash/redirects.tsx:105
91
+ #: src/theme/components/PageForm.tsx:113
92
+ #: src/theme/components/PostForm.tsx:120
93
+ #. @context: Button to cancel and go back
94
+ #. @context: Button to cancel form
95
+ #. @context: Button to cancel form
96
+ #. @context: Button to cancel form
97
+ #. @context: Button to cancel form
98
+ msgid "Cancel"
99
+ msgstr "取消"
100
+
101
+ #: src/routes/dash/collections.tsx:24
102
+ #: src/routes/dash/collections.tsx:26
103
+ #: src/theme/layouts/DashLayout.tsx:31
104
+ #. @context: Dashboard heading
105
+ #. @context: Dashboard navigation - collections management
106
+ #. @context: Dashboard page title
107
+ msgid "Collections"
108
+ msgstr "收藏夾"
109
+
110
+ #: src/app.tsx:151
111
+ #. @context: Setup form submit button
112
+ msgid "Complete Setup"
113
+ msgstr "完成設置"
114
+
115
+ #: src/theme/components/PageForm.tsx:75
116
+ #: src/theme/components/PostForm.tsx:60
117
+ #. @context: Page form field label - content
118
+ #. @context: Post form field
119
+ msgid "Content"
120
+ msgstr "內容"
121
+
122
+ #: src/routes/dash/media.tsx:184
123
+ #: src/routes/dash/media.tsx:210
124
+ #. @context: Button to copy Markdown to clipboard
125
+ #. @context: Button to copy URL to clipboard
126
+ msgid "Copy"
127
+ msgstr "複製"
128
+
129
+ #: src/routes/dash/collections.tsx:100
130
+ #. @context: Button to save new collection
131
+ msgid "Create Collection"
132
+ msgstr "創建收藏夾"
133
+
134
+ #: src/theme/components/PageForm.tsx:110
135
+ #. @context: Button to create new page
136
+ msgid "Create Page"
137
+ msgstr "創建頁面"
138
+
139
+ #: src/routes/dash/redirects.tsx:102
140
+ #. @context: Button to save new redirect
141
+ msgid "Create Redirect"
142
+ msgstr "建立重定向"
143
+
144
+ #: src/routes/dash/pages.tsx:46
145
+ #. @context: Button in empty state to create first page
146
+ msgid "Create your first page"
147
+ msgstr "建立您的第一個頁面"
148
+
149
+ #: src/theme/components/PostList.tsx:57
150
+ #. @context: Button in empty state to create first post
151
+ msgid "Create your first post"
152
+ msgstr "創建你的第一篇帖子"
153
+
154
+ #: src/theme/components/PostForm.tsx:104
155
+ #. @context: Post form field
156
+ msgid "Custom Path (optional)"
157
+ msgstr "自訂路徑(選填)"
158
+
159
+ #: src/routes/dash/collections.tsx:255
160
+ #: src/routes/dash/media.tsx:220
161
+ #: src/routes/dash/pages.tsx:176
162
+ #. @context: Heading for destructive actions section
163
+ #. @context: Section heading for dangerous/destructive actions
164
+ #. @context: Section heading for dangerous/destructive actions
165
+ msgid "Danger Zone"
166
+ msgstr "危險區域"
167
+
168
+ #: src/routes/dash/index.tsx:26
169
+ #: src/routes/dash/index.tsx:28
170
+ #: src/theme/layouts/DashLayout.tsx:27
171
+ #. @context: Dashboard main heading
172
+ #. @context: Dashboard navigation - main dashboard page
173
+ #. @context: Dashboard page title
174
+ msgid "Dashboard"
175
+ msgstr "儀表板"
176
+
177
+ #: src/routes/dash/redirects.tsx:47
178
+ #. @context: Button to delete redirect
179
+ msgid "Delete"
180
+ msgstr "刪除"
181
+
182
+ #: src/routes/dash/collections.tsx:258
183
+ #. @context: Button to delete collection
184
+ msgid "Delete Collection"
185
+ msgstr "刪除收藏夾"
186
+
187
+ #: src/routes/dash/media.tsx:233
188
+ #. @context: Button to delete media
189
+ msgid "Delete Media"
190
+ msgstr "刪除媒體"
191
+
192
+ #: src/routes/dash/pages.tsx:184
193
+ #. @context: Button to delete page
194
+ msgid "Delete Page"
195
+ msgstr "刪除頁面"
196
+
197
+ #: src/routes/dash/media.tsx:225
198
+ #. @context: Warning message before deleting media
199
+ msgid "Deleting this media will remove it permanently from storage."
200
+ msgstr "刪除此媒體將永久從存儲中移除它。"
201
+
202
+ #: src/routes/dash/collections.tsx:94
203
+ #: src/routes/dash/collections.tsx:238
204
+ #. @context: Collection form field
205
+ #. @context: Collection form field
206
+ msgid "Description (optional)"
207
+ msgstr "描述(可選)"
208
+
209
+ #: src/routes/dash/pages.tsx:61
210
+ #: src/theme/components/PageForm.tsx:97
211
+ #: src/theme/components/PostForm.tsx:97
212
+ #: src/theme/components/PostList.tsx:31
213
+ #. @context: Page status badge - draft
214
+ #. @context: Page status option - draft
215
+ #. @context: Post visibility badge - draft
216
+ #. @context: Post visibility option
217
+ msgid "Draft"
218
+ msgstr "草稿"
219
+
220
+ #: src/routes/dash/index.tsx:43
221
+ #. @context: Dashboard stat card - draft posts count
222
+ msgid "Drafts"
223
+ msgstr "草稿"
224
+
225
+ #: src/routes/dash/collections.tsx:49
226
+ #: src/routes/dash/collections.tsx:150
227
+ #: src/routes/dash/pages.tsx:83
228
+ #: src/routes/dash/pages.tsx:157
229
+ #: src/routes/dash/posts.tsx:94
230
+ #: src/theme/components/PostList.tsx:92
231
+ #. @context: Button to edit collection
232
+ #. @context: Button to edit collection
233
+ #. @context: Button to edit page
234
+ #. @context: Button to edit page
235
+ #. @context: Button to edit post
236
+ #. @context: Button to edit post
237
+ msgid "Edit"
238
+ msgstr "編輯"
239
+
240
+ #: src/routes/dash/collections.tsx:217
241
+ #. @context: Page heading
242
+ msgid "Edit Collection"
243
+ msgstr "編輯收藏集"
244
+
245
+ #: src/routes/dash/pages.tsx:208
246
+ #. @context: Edit page main heading
247
+ msgid "Edit Page"
248
+ msgstr "編輯頁面"
249
+
250
+ #: src/routes/dash/posts.tsx:126
251
+ #. @context: Page heading
252
+ msgid "Edit Post"
253
+ msgstr "編輯文章"
254
+
255
+ #: src/routes/dash/collections.tsx:213
256
+ #: src/routes/dash/pages.tsx:203
257
+ #: src/routes/dash/posts.tsx:122
258
+ #. @context: Edit page page title
259
+ #. @context: Page title for editing collection
260
+ #. @context: Page title for editing post
261
+ msgid "Edit: {title}"
262
+ msgstr "編輯: {title}"
263
+
264
+ #: src/app.tsx:144
265
+ #: src/app.tsx:221
266
+ #. @context: Setup/signin form field - email
267
+ #. @context: Setup/signin form field - email
268
+ msgid "Email"
269
+ msgstr "電子郵件"
270
+
271
+ #: src/routes/pages/home.tsx:69
272
+ #: src/theme/components/PostForm.tsx:91
273
+ #: src/theme/components/PostList.tsx:28
274
+ #. @context: Post visibility badge
275
+ #. @context: Post visibility badge - featured
276
+ #. @context: Post visibility option
277
+ msgid "Featured"
278
+ msgstr "精選"
279
+
280
+ #: src/routes/pages/search.tsx:92
281
+ #. @context: Search results count - multiple
282
+ msgid "Found {count} results"
283
+ msgstr "找到 {count} 個結果"
284
+
285
+ #: src/routes/pages/search.tsx:91
286
+ #. @context: Search results count - single
287
+ msgid "Found 1 result"
288
+ msgstr "找到 1 個結果"
289
+
290
+ #: src/routes/dash/redirects.tsx:69
291
+ #. @context: Redirect form field
292
+ msgid "From Path"
293
+ msgstr "來源路徑"
294
+
295
+ #: src/routes/dash/settings.tsx:30
296
+ #. @context: Settings section heading
297
+ msgid "General"
298
+ msgstr "一般設定"
299
+
300
+ #: src/routes/pages/archive.tsx:172
301
+ #: src/theme/components/PostForm.tsx:41
302
+ #: src/theme/components/PostList.tsx:44
303
+ #. @context: Post type badge - image
304
+ #. @context: Post type label - image
305
+ #. @context: Post type option
306
+ msgid "Image"
307
+ msgstr "圖片"
308
+
309
+ #: src/routes/pages/archive.tsx:184
310
+ #. @context: Post type label plural - images
311
+ msgid "Images"
312
+ msgstr "圖片"
313
+
314
+ #: src/routes/dash/settings.tsx:46
315
+ #. @context: Settings form field
316
+ msgid "Language"
317
+ msgstr "語言"
318
+
319
+ #: src/app.tsx:130
320
+ #. @context: Setup page description
321
+ msgid "Let's set up your site."
322
+ msgstr "讓我們設置您的網站。"
323
+
324
+ #: src/routes/pages/archive.tsx:170
325
+ #: src/theme/components/PostForm.tsx:35
326
+ #: src/theme/components/PostList.tsx:42
327
+ #. @context: Post type badge - link
328
+ #. @context: Post type label - link
329
+ #. @context: Post type option
330
+ msgid "Link"
331
+ msgstr "連結"
332
+
333
+ #: src/routes/pages/archive.tsx:182
334
+ #. @context: Post type label plural - links
335
+ msgid "Links"
336
+ msgstr "連結"
337
+
338
+ #: src/theme/components/Pagination.tsx:111
339
+ #. @context: Pagination button - load more items
340
+ msgid "Load more"
341
+ msgstr "載入更多"
342
+
343
+ #: src/theme/components/PageForm.tsx:63
344
+ #. @context: Page path validation message
345
+ msgid "Lowercase letters, numbers, and hyphens only"
346
+ msgstr "僅限小寫字母、數字和連字符"
347
+
348
+ #: src/routes/dash/media.tsx:195
349
+ #. @context: Media detail section - Markdown snippet
350
+ msgid "Markdown"
351
+ msgstr "Markdown"
352
+
353
+ #: src/routes/dash/media.tsx:44
354
+ #: src/routes/dash/media.tsx:47
355
+ #: src/theme/layouts/DashLayout.tsx:30
356
+ #. @context: Dashboard navigation - media library
357
+ #. @context: Media main heading
358
+ #. @context: Media page title
359
+ msgid "Media"
360
+ msgstr "媒體"
361
+
362
+ #: src/app.tsx:137
363
+ #. @context: Setup site name placeholder
364
+ msgid "My Blog"
365
+ msgstr "我的部落格"
366
+
367
+ #: src/routes/dash/collections.tsx:75
368
+ #. @context: Collection title placeholder
369
+ msgid "My Collection"
370
+ msgstr "我的收藏"
371
+
372
+ #: src/routes/dash/collections.tsx:28
373
+ #: src/routes/dash/collections.tsx:69
374
+ #: src/routes/dash/collections.tsx:70
375
+ #. @context: Button to create new collection
376
+ #. @context: Page heading
377
+ #. @context: Page title
378
+ msgid "New Collection"
379
+ msgstr "新收藏集"
380
+
381
+ #: src/routes/dash/pages.tsx:38
382
+ #: src/routes/dash/pages.tsx:105
383
+ #: src/routes/dash/pages.tsx:107
384
+ #. @context: Button to create new page
385
+ #. @context: New page main heading
386
+ #. @context: New page page title
387
+ msgid "New Page"
388
+ msgstr "新頁面"
389
+
390
+ #: src/routes/dash/index.tsx:56
391
+ #: src/routes/dash/posts.tsx:31
392
+ #: src/routes/dash/posts.tsx:45
393
+ #: src/routes/dash/posts.tsx:46
394
+ #. @context: Button to create new post
395
+ #. @context: Dashboard quick action button to create new post
396
+ #. @context: Page heading
397
+ #. @context: Page title
398
+ msgid "New Post"
399
+ msgstr "新帖子"
400
+
401
+ #: src/routes/dash/redirects.tsx:27
402
+ #: src/routes/dash/redirects.tsx:64
403
+ #: src/routes/dash/redirects.tsx:65
404
+ #. @context: Button to create new redirect
405
+ #. @context: Page heading
406
+ #. @context: Page title
407
+ msgid "New Redirect"
408
+ msgstr "新重定向"
409
+
410
+ #: src/theme/components/Pagination.tsx:50
411
+ #: src/theme/components/Pagination.tsx:164
412
+ #. @context: Pagination button - next page
413
+ #. @context: Pagination button - next page
414
+ msgid "Next"
415
+ msgstr "下一頁"
416
+
417
+ #: src/routes/dash/collections.tsx:33
418
+ #. @context: Empty state message
419
+ msgid "No collections yet."
420
+ msgstr "尚未有任何收藏。"
421
+
422
+ #: src/routes/dash/media.tsx:74
423
+ #. @context: Empty state message when no media exists
424
+ msgid "No media uploaded yet."
425
+ msgstr "尚未上傳任何媒體。"
426
+
427
+ #: src/routes/dash/pages.tsx:44
428
+ #. @context: Empty state message when no pages exist
429
+ msgid "No pages yet."
430
+ msgstr "尚未有頁面。"
431
+
432
+ #: src/routes/pages/archive.tsx:102
433
+ #. @context: Archive empty state
434
+ msgid "No posts found."
435
+ msgstr "未找到任何帖子。"
436
+
437
+ #: src/routes/dash/collections.tsx:168
438
+ #: src/routes/pages/collection.tsx:40
439
+ #. @context: Empty state message
440
+ #. @context: Empty state message
441
+ msgid "No posts in this collection."
442
+ msgstr "此集合中沒有帖子。"
443
+
444
+ #: src/routes/pages/home.tsx:49
445
+ #: src/theme/components/PostList.tsx:55
446
+ #. @context: Empty state message on home page
447
+ #. @context: Empty state message when no posts exist
448
+ msgid "No posts yet."
449
+ msgstr "尚未有帖子。"
450
+
451
+ #: src/routes/dash/redirects.tsx:32
452
+ #. @context: Empty state message
453
+ msgid "No redirects configured."
454
+ msgstr "未配置任何重定向。"
455
+
456
+ #: src/routes/pages/search.tsx:89
457
+ #. @context: Search empty results
458
+ msgid "No results found."
459
+ msgstr "未找到結果。"
460
+
461
+ #: src/routes/pages/archive.tsx:168
462
+ #: src/theme/components/PostForm.tsx:29
463
+ #: src/theme/components/PostList.tsx:40
464
+ #. @context: Post type badge - note
465
+ #. @context: Post type label - note
466
+ #. @context: Post type option
467
+ msgid "Note"
468
+ msgstr "備註"
469
+
470
+ #: src/routes/pages/archive.tsx:180
471
+ #. @context: Post type label plural - notes
472
+ msgid "Notes"
473
+ msgstr "筆記"
474
+
475
+ #: src/routes/dash/pages.tsx:147
476
+ #: src/routes/dash/pages.tsx:150
477
+ #: src/routes/dash/pages.tsx:202
478
+ #: src/routes/pages/archive.tsx:173
479
+ #: src/theme/components/PostList.tsx:45
480
+ #. @context: Default page heading when untitled
481
+ #. @context: Default page title when untitled
482
+ #. @context: Default page title when untitled
483
+ #. @context: Post type badge - page
484
+ #. @context: Post type label - page
485
+ msgid "Page"
486
+ msgstr "頁面"
487
+
488
+ #: src/theme/components/Pagination.tsx:165
489
+ #. @context: Pagination - current page indicator
490
+ msgid "Page {page}"
491
+ msgstr "頁面 {page}"
492
+
493
+ #: src/theme/components/PageForm.tsx:80
494
+ #. @context: Page content placeholder
495
+ msgid "Page content (Markdown supported)..."
496
+ msgstr "頁面內容(支持Markdown)..."
497
+
498
+ #: src/theme/components/PageForm.tsx:43
499
+ #. @context: Page title placeholder
500
+ msgid "Page title..."
501
+ msgstr "頁面標題..."
502
+
503
+ #: src/routes/dash/pages.tsx:32
504
+ #: src/routes/dash/pages.tsx:35
505
+ #: src/routes/pages/archive.tsx:185
506
+ #: src/theme/layouts/DashLayout.tsx:29
507
+ #. @context: Dashboard navigation - pages management
508
+ #. @context: Pages main heading
509
+ #. @context: Pages page title
510
+ #. @context: Post type label plural - pages
511
+ msgid "Pages"
512
+ msgstr "頁面"
513
+
514
+ #: src/app.tsx:148
515
+ #: src/app.tsx:225
516
+ #. @context: Setup/signin form field - password
517
+ #. @context: Setup/signin form field - password
518
+ msgid "Password"
519
+ msgstr "密碼"
520
+
521
+ #: src/theme/components/PageForm.tsx:52
522
+ #. @context: Page form field label - URL path
523
+ msgid "Path"
524
+ msgstr "路徑"
525
+
526
+ #: src/routes/pages/post.tsx:62
527
+ #: src/theme/components/ThreadView.tsx:66
528
+ #. @context: Link to individual post in thread
529
+ #. @context: Link to permanent URL of post
530
+ msgid "Permalink"
531
+ msgstr "永久鏈接"
532
+
533
+ #: src/routes/dash/posts.tsx:85
534
+ #: src/routes/dash/posts.tsx:121
535
+ #. @context: Default post title
536
+ #. @context: Default post title
537
+ msgid "Post"
538
+ msgstr "文章"
539
+
540
+ #: src/theme/components/PostForm.tsx:53
541
+ #. @context: Post title placeholder
542
+ msgid "Post title..."
543
+ msgstr "文章標題..."
544
+
545
+ #: src/routes/dash/posts.tsx:27
546
+ #: src/routes/dash/posts.tsx:29
547
+ #: src/theme/layouts/DashLayout.tsx:28
548
+ #. @context: Dashboard heading
549
+ #. @context: Dashboard navigation - posts management
550
+ #. @context: Dashboard page title
551
+ msgid "Posts"
552
+ msgstr "文章"
553
+
554
+ #: src/routes/dash/collections.tsx:139
555
+ #. @context: Collection posts section heading
556
+ msgid "Posts in Collection ({count})"
557
+ msgstr "收藏中的帖子 ({count})"
558
+
559
+ #: src/routes/dash/media.tsx:148
560
+ #. @context: Media detail section - preview
561
+ msgid "Preview"
562
+ msgstr "預覽"
563
+
564
+ #: src/theme/components/Pagination.tsx:49
565
+ #: src/theme/components/Pagination.tsx:163
566
+ #. @context: Pagination button - previous page
567
+ #. @context: Pagination button - previous page
568
+ msgid "Previous"
569
+ msgstr "上一頁"
570
+
571
+ #: src/theme/components/PostForm.tsx:117
572
+ #. @context: Button to publish new post
573
+ msgid "Publish"
574
+ msgstr "發佈"
575
+
576
+ #: src/routes/dash/index.tsx:34
577
+ #: src/routes/dash/pages.tsx:62
578
+ #: src/theme/components/PageForm.tsx:94
579
+ #. @context: Dashboard stat card - published posts count
580
+ #. @context: Page status badge - published
581
+ #. @context: Page status option - published
582
+ msgid "Published"
583
+ msgstr "已發佈"
584
+
585
+ #: src/theme/components/PageForm.tsx:101
586
+ #. @context: Page status helper text
587
+ msgid "Published pages are accessible via their path. Drafts are not visible."
588
+ msgstr "已發佈的頁面可以通過其路徑訪問。草稿不可見。"
589
+
590
+ #: src/routes/dash/index.tsx:52
591
+ #. @context: Dashboard stat card - quick actions section
592
+ msgid "Quick Actions"
593
+ msgstr "快速操作"
594
+
595
+ #: src/theme/components/PostList.tsx:29
596
+ #. @context: Post visibility badge - normal
597
+ msgid "Quiet"
598
+ msgstr "安靜"
599
+
600
+ #: src/theme/components/PostForm.tsx:88
601
+ #. @context: Post visibility option
602
+ msgid "Quiet (normal)"
603
+ msgstr "安靜(正常)"
604
+
605
+ #: src/routes/pages/archive.tsx:171
606
+ #: src/theme/components/PostForm.tsx:38
607
+ #: src/theme/components/PostList.tsx:43
608
+ #. @context: Post type badge - quote
609
+ #. @context: Post type label - quote
610
+ #. @context: Post type option
611
+ msgid "Quote"
612
+ msgstr "引用"
613
+
614
+ #: src/routes/pages/archive.tsx:183
615
+ #. @context: Post type label plural - quotes
616
+ msgid "Quotes"
617
+ msgstr "引用"
618
+
619
+ #: src/routes/dash/redirects.tsx:23
620
+ #: src/routes/dash/redirects.tsx:25
621
+ #: src/theme/layouts/DashLayout.tsx:32
622
+ #. @context: Dashboard heading
623
+ #. @context: Dashboard navigation - URL redirects
624
+ #. @context: Dashboard page title
625
+ msgid "Redirects"
626
+ msgstr "重定向"
627
+
628
+ #: src/routes/dash/collections.tsx:184
629
+ #. @context: Button to remove post from collection
630
+ msgid "Remove"
631
+ msgstr "移除"
632
+
633
+ #: src/routes/dash/settings.tsx:63
634
+ #. @context: Button to save settings
635
+ msgid "Save Settings"
636
+ msgstr "保存設定"
637
+
638
+ #: src/routes/pages/search.tsx:53
639
+ #: src/routes/pages/search.tsx:72
640
+ #. @context: Search page title
641
+ #. @context: Search submit button
642
+ msgid "Search"
643
+ msgstr "搜尋"
644
+
645
+ #: src/routes/pages/search.tsx:49
646
+ #. @context: Search error message
647
+ msgid "Search failed. Please try again."
648
+ msgstr "搜尋失敗。請再試一次。"
649
+
650
+ #: src/routes/pages/search.tsx:67
651
+ #. @context: Search input placeholder
652
+ msgid "Search posts..."
653
+ msgstr "搜尋帖子..."
654
+
655
+ #: src/routes/dash/settings.tsx:24
656
+ #: src/routes/dash/settings.tsx:25
657
+ #: src/theme/layouts/DashLayout.tsx:33
658
+ #. @context: Dashboard heading
659
+ #. @context: Dashboard navigation - site settings
660
+ #. @context: Dashboard page title
661
+ msgid "Settings"
662
+ msgstr "設定"
663
+
664
+ #: src/app.tsx:125
665
+ #. @context: Setup page title
666
+ msgid "Setup"
667
+ msgstr "設置"
668
+
669
+ #: src/app.tsx:211
670
+ #: src/app.tsx:215
671
+ #: src/app.tsx:228
672
+ #. @context: Sign in form submit button
673
+ #. @context: Sign in page heading
674
+ #. @context: Sign in page title
675
+ msgid "Sign In"
676
+ msgstr "登入"
677
+
678
+ #: src/theme/layouts/DashLayout.tsx:64
679
+ #. @context: Dashboard header link to sign out
680
+ msgid "Sign Out"
681
+ msgstr "登出"
682
+
683
+ #: src/routes/dash/settings.tsx:39
684
+ #. @context: Settings form field
685
+ msgid "Site Description"
686
+ msgstr "網站描述"
687
+
688
+ #: src/app.tsx:136
689
+ #: src/routes/dash/settings.tsx:34
690
+ #. @context: Settings form field
691
+ #. @context: Setup form field - site name
692
+ msgid "Site Name"
693
+ msgstr "網站名稱"
694
+
695
+ #: src/routes/dash/collections.tsx:79
696
+ #: src/routes/dash/collections.tsx:226
697
+ #. @context: Collection form field
698
+ #. @context: Collection form field
699
+ msgid "Slug"
700
+ msgstr "縮略名"
701
+
702
+ #: src/theme/components/PostForm.tsx:73
703
+ #. @context: Post form field
704
+ msgid "Source URL (optional)"
705
+ msgstr "來源網址(選填)"
706
+
707
+ #: src/theme/components/PageForm.tsx:90
708
+ #. @context: Page form field label - publish status
709
+ msgid "Status"
710
+ msgstr "狀態"
711
+
712
+ #: src/routes/dash/media.tsx:67
713
+ #. @context: Media upload instructions - supported formats
714
+ msgid "Supported formats: JPEG, PNG, GIF, WebP, SVG. Max size: 10MB."
715
+ msgstr "支援的格式:JPEG、PNG、GIF、WebP、SVG。最大大小:10MB。"
716
+
717
+ #: src/routes/dash/redirects.tsx:89
718
+ #. @context: Redirect to path help text
719
+ msgid "The destination path or URL"
720
+ msgstr "目的地路徑或 URL"
721
+
722
+ #: src/routes/dash/redirects.tsx:77
723
+ #. @context: Redirect from path help text
724
+ msgid "The path to redirect from"
725
+ msgstr "重定向來源的路徑"
726
+
727
+ #: src/theme/components/PageForm.tsx:68
728
+ #. @context: Page path helper text
729
+ msgid "The URL path for this page. Use lowercase letters, numbers, and hyphens."
730
+ msgstr "此頁面的 URL 路徑。使用小寫字母、數字和連字符。"
731
+
732
+ #: src/theme/components/ThreadView.tsx:58
733
+ #. @context: Thread view indicator - first post in thread
734
+ msgid "Thread start"
735
+ msgstr "線程開始"
736
+
737
+ #: src/theme/components/ThreadView.tsx:92
738
+ #. @context: Thread view header - multiple posts
739
+ msgid "Thread with {count} posts"
740
+ msgstr "包含 {count} 則帖子的主題"
741
+
742
+ #: src/theme/components/ThreadView.tsx:91
743
+ #. @context: Thread view header - single post
744
+ msgid "Thread with 1 post"
745
+ msgstr "包含 1 則貼文的主題"
746
+
747
+ #: src/routes/dash/collections.tsx:74
748
+ #: src/routes/dash/collections.tsx:221
749
+ #: src/theme/components/PageForm.tsx:37
750
+ #. @context: Collection form field
751
+ #. @context: Collection form field
752
+ #. @context: Page form field label - title
753
+ msgid "Title"
754
+ msgstr "標題"
755
+
756
+ #: src/theme/components/PostForm.tsx:48
757
+ #. @context: Post form field
758
+ msgid "Title (optional)"
759
+ msgstr "標題(選填)"
760
+
761
+ #: src/routes/dash/redirects.tsx:81
762
+ #. @context: Redirect form field
763
+ msgid "To Path"
764
+ msgstr "到路徑"
765
+
766
+ #: src/routes/dash/redirects.tsx:93
767
+ #: src/theme/components/PostForm.tsx:26
768
+ #. @context: Post form field - post type
769
+ #. @context: Redirect form field
770
+ msgid "Type"
771
+ msgstr "類型"
772
+
773
+ #: src/theme/components/PostForm.tsx:94
774
+ #: src/theme/components/PostList.tsx:30
775
+ #. @context: Post visibility badge - unlisted
776
+ #. @context: Post visibility option
777
+ msgid "Unlisted"
778
+ msgstr "不公開"
779
+
780
+ #: src/routes/dash/pages.tsx:72
781
+ #: src/theme/components/PostList.tsx:79
782
+ #. @context: Default title for untitled page
783
+ #. @context: Default title for untitled post
784
+ msgid "Untitled"
785
+ msgstr "無標題"
786
+
787
+ #: src/theme/components/PostForm.tsx:117
788
+ #. @context: Button to update existing post
789
+ msgid "Update"
790
+ msgstr "更新"
791
+
792
+ #: src/routes/dash/collections.tsx:246
793
+ #. @context: Button to save collection changes
794
+ msgid "Update Collection"
795
+ msgstr "更新收藏集"
796
+
797
+ #: src/theme/components/PageForm.tsx:109
798
+ #. @context: Button to update existing page
799
+ msgid "Update Page"
800
+ msgstr "更新頁面"
801
+
802
+ #: src/routes/dash/media.tsx:50
803
+ #. @context: Button to upload media file
804
+ msgid "Upload"
805
+ msgstr "上傳"
806
+
807
+ #: src/routes/dash/media.tsx:64
808
+ #. @context: Media upload instructions - API usage
809
+ msgid "Upload images via the API: POST /api/upload with a file form field."
810
+ msgstr "透過 API 上傳圖片:POST /api/upload,並使用文件表單字段。"
811
+
812
+ #: src/routes/dash/media.tsx:169
813
+ #. @context: Media detail section - URL
814
+ msgid "URL"
815
+ msgstr "網址"
816
+
817
+ #: src/routes/dash/collections.tsx:89
818
+ #. @context: Collection path help text
819
+ msgid "URL-safe identifier (lowercase, numbers, hyphens)"
820
+ msgstr "網址安全識別碼(小寫、數字、連字符)"
821
+
822
+ #: src/routes/dash/media.tsx:188
823
+ #. @context: Media URL helper text
824
+ msgid "Use this URL to embed the media in your posts."
825
+ msgstr "使用此 URL 將媒體嵌入到您的帖子中。"
826
+
827
+ #: src/routes/dash/collections.tsx:52
828
+ #: src/routes/dash/collections.tsx:153
829
+ #: src/routes/dash/pages.tsx:87
830
+ #: src/routes/dash/pages.tsx:161
831
+ #: src/routes/dash/posts.tsx:97
832
+ #: src/theme/components/PostList.tsx:95
833
+ #. @context: Button to view collection
834
+ #. @context: Button to view collection
835
+ #. @context: Button to view page on public site
836
+ #. @context: Button to view page on public site
837
+ #. @context: Button to view post
838
+ #. @context: Button to view post on public site
839
+ msgid "View"
840
+ msgstr "查看"
841
+
842
+ #: src/routes/pages/home.tsx:80
843
+ #. @context: Link to view all posts on archive page
844
+ msgid "View all posts →"
845
+ msgstr "查看所有文章 →"
846
+
847
+ #: src/theme/layouts/DashLayout.tsx:61
848
+ #. @context: Dashboard header link to view the public site
849
+ msgid "View Site"
850
+ msgstr "查看網站"
851
+
852
+ #: src/theme/components/PostForm.tsx:85
853
+ #. @context: Post form field
854
+ msgid "Visibility"
855
+ msgstr "可見性"
856
+
857
+ #: src/app.tsx:129
858
+ #. @context: Setup page welcome heading
859
+ msgid "Welcome to Jant"
860
+ msgstr "歡迎來到 Jant"
861
+
862
+ #: src/theme/components/PostForm.tsx:64
863
+ #. @context: Post content placeholder
864
+ msgid "What's on your mind?"
865
+ msgstr "你在想什麼?"
866
+
867
+ #: src/routes/dash/collections.tsx:95
868
+ #. @context: Collection description placeholder
869
+ msgid "What's this collection about?"
870
+ msgstr "這個收藏是關於什麼的?"
871
+
872
+ #: src/app.tsx:140
873
+ #. @context: Setup form field - user name
874
+ msgid "Your Name"
875
+ msgstr "您的姓名"