@hoardodile/i18n 0.0.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 (50) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +81 -0
  3. package/dist/catalogs/ui.d.ts +2 -0
  4. package/dist/catalogs/ui.js +449 -0
  5. package/dist/catalogs/ui.js.map +1 -0
  6. package/dist/catalogs/workbench.d.ts +291 -0
  7. package/dist/catalogs/workbench.js +250 -0
  8. package/dist/catalogs/workbench.js.map +1 -0
  9. package/dist/catalogs-BF4px4Mm.d.ts +12986 -0
  10. package/dist/catalogs.d.ts +2 -0
  11. package/dist/catalogs.js +10794 -0
  12. package/dist/catalogs.js.map +1 -0
  13. package/dist/core.d.ts +32 -0
  14. package/dist/core.js +14 -0
  15. package/dist/core.js.map +1 -0
  16. package/dist/create-i18n.d.ts +35 -0
  17. package/dist/create-i18n.js +30 -0
  18. package/dist/create-i18n.js.map +1 -0
  19. package/dist/index.d.ts +42 -0
  20. package/dist/index.js +11284 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +1 -0
  23. package/dist/react.js +3 -0
  24. package/dist/react.js.map +1 -0
  25. package/dist/ui-CJPMCZT7.d.ts +548 -0
  26. package/package.json +81 -0
  27. package/src/catalogs/de.json +2155 -0
  28. package/src/catalogs/en.json +2155 -0
  29. package/src/catalogs/es.json +2155 -0
  30. package/src/catalogs/ja.json +2155 -0
  31. package/src/catalogs/ui.ts +30 -0
  32. package/src/catalogs/workbench.ts +29 -0
  33. package/src/catalogs/zh.json +2155 -0
  34. package/src/catalogs.ts +31 -0
  35. package/src/core.ts +40 -0
  36. package/src/create-i18n.ts +52 -0
  37. package/src/index.ts +66 -0
  38. package/src/language.test.ts +70 -0
  39. package/src/parity.test.ts +175 -0
  40. package/src/react.ts +25 -0
  41. package/src/ui/de.json +86 -0
  42. package/src/ui/en.json +86 -0
  43. package/src/ui/es.json +86 -0
  44. package/src/ui/ja.json +86 -0
  45. package/src/ui/zh.json +86 -0
  46. package/src/workbench/de.json +45 -0
  47. package/src/workbench/en.json +45 -0
  48. package/src/workbench/es.json +45 -0
  49. package/src/workbench/ja.json +45 -0
  50. package/src/workbench/zh.json +45 -0
@@ -0,0 +1,2155 @@
1
+ {
2
+ "common": {
3
+ "back": "Back",
4
+ "cancel": "Cancel",
5
+ "close": "Close",
6
+ "save": "Save",
7
+ "saving": "Saving…",
8
+ "loading": "Loading…",
9
+ "remove": "Remove",
10
+ "removeAria": "Remove",
11
+ "edit": "Edit",
12
+ "delete": "Delete",
13
+ "rename": "Rename",
14
+ "confirm": "Confirm",
15
+ "expand": "Expand",
16
+ "collapse": "Collapse",
17
+ "working": "Working…",
18
+ "prev": "Prev",
19
+ "next": "Next",
20
+ "previous": "Previous",
21
+ "first": "First",
22
+ "last": "Last",
23
+ "jumpToPage": "Page",
24
+ "go": "Go",
25
+ "goTo": "Go to",
26
+ "unknownError": "Unknown error",
27
+ "error": "Error",
28
+ "loadFailed": "Failed to load",
29
+ "show": "Show",
30
+ "hide": "Hide",
31
+ "selected": "Selected",
32
+ "available": "Available",
33
+ "allSelected": "All selected",
34
+ "tags": "Tags",
35
+ "filterCategory": "Filter {{name}}…",
36
+ "requestFailed": "Request failed",
37
+ "saved": "Saved",
38
+ "saveFailed": "Could not save",
39
+ "confirmByTypingPrompt": "Type \"<name>{{name}}</name>\" to confirm",
40
+ "searchIncludeIntro": "Search intro",
41
+ "underline": "Underline",
42
+ "colorPicker": {
43
+ "customColor": "Custom colour"
44
+ }
45
+ },
46
+ "entityMeta": {
47
+ "nameLabel": "Name",
48
+ "namePlaceholder": "e.g. harbor",
49
+ "introLabel": "Intro",
50
+ "introPlaceholder": "A short description…",
51
+ "colorLabel": "Color",
52
+ "colorPlaceholder": "Optional CSS color; leave empty for default",
53
+ "pinned": "Pinned"
54
+ },
55
+ "language": {
56
+ "label": "Language",
57
+ "description": "Interface language — content keeps its script.",
58
+ "english": "English",
59
+ "chinese": "中文",
60
+ "japanese": "日本語",
61
+ "german": "Deutsch",
62
+ "spanish": "Español"
63
+ },
64
+ "icons": {
65
+ "description": "Solar icons — duotone follows the theme, grayscale keeps the two tones in plain ink, linear stays single-color.",
66
+ "style": {
67
+ "duotone": "Duotone",
68
+ "grayscale": "Grayscale",
69
+ "linear": "Linear"
70
+ }
71
+ },
72
+ "theme": {
73
+ "description": "One palette, and whether it follows daylight.",
74
+ "modeLabel": "Mode",
75
+ "paletteLabel": "Palette",
76
+ "mode": {
77
+ "light": "Light",
78
+ "dark": "Dark",
79
+ "system": "System"
80
+ },
81
+ "palette": {
82
+ "mono": "Mono",
83
+ "sage": "Sage",
84
+ "parchment": "Parchment",
85
+ "azure": "Azure",
86
+ "hoardodile": "Hoardodile"
87
+ }
88
+ },
89
+ "font": {
90
+ "label": "Font",
91
+ "description": "Chrome and lists — documents keep their reading voice."
92
+ },
93
+ "dateTime": {
94
+ "description": "How dates read — right now: {{preview}}.",
95
+ "formatLabel": "Format",
96
+ "timeZoneLabel": "Time zone",
97
+ "format": {
98
+ "ymdDash": "2024-06-12 14:30:00",
99
+ "ymdSlash": "2024/06/12 14:30:00",
100
+ "dmySlash": "12/06/2024 14:30:00",
101
+ "mdySlash": "06/12/2024 14:30:00"
102
+ },
103
+ "timeZone": {
104
+ "auto": "Follow system",
105
+ "noMatches": "No matching time zones."
106
+ }
107
+ },
108
+ "appShell": {
109
+ "primaryNav": "Primary navigation",
110
+ "secondaryNav": "Secondary navigation",
111
+ "openMenu": "Open menu",
112
+ "backToMainMenu": "Back to main menu",
113
+ "backToDocumentsMenu": "Back to documents menu",
114
+ "nav": {
115
+ "overview": "Overview",
116
+ "resources": "Resources",
117
+ "characters": "Characters",
118
+ "documents": "Documents",
119
+ "messages": "Messages",
120
+ "me": "Settings",
121
+ "feedbackAbout": "Feedback & About",
122
+ "help": "Help"
123
+ },
124
+ "syncDueBadge": "A sync reminder is due",
125
+ "syncStatus": {
126
+ "synced": "Synced",
127
+ "due": "Sync due",
128
+ "syncedTitle_one": "Up to date — {{count}} device",
129
+ "syncedTitle_other": "Up to date — {{count}} devices",
130
+ "dueTitle_one": "{{count}} device due for sync",
131
+ "dueTitle_other": "{{count}} devices due for sync",
132
+ "noDevicesTitle": "No sync devices configured yet."
133
+ }
134
+ },
135
+ "search": {
136
+ "placeholder": "Search characters, resources, documents, messages…",
137
+ "placeholderShort": "Search",
138
+ "liveSearch": "Live search",
139
+ "sectionTitles": {
140
+ "characters": "Characters",
141
+ "resources": "Resources",
142
+ "documents": "Documents",
143
+ "messages": "Messages"
144
+ },
145
+ "sectionCount": "({{count}})",
146
+ "viewAll": "View all ({{count}})",
147
+ "empty": {
148
+ "title": "No results found.",
149
+ "description": "Try a different keyword."
150
+ },
151
+ "resultLabels": {
152
+ "document": "Document",
153
+ "folder": "Folder"
154
+ },
155
+ "imageSearch": {
156
+ "button": "Search by image",
157
+ "uploadFailed": "Image search failed",
158
+ "title": "Image search results",
159
+ "empty": "No similar images found in your library.",
160
+ "clear": "Clear image search",
161
+ "queryAlt": "Query image",
162
+ "similarity": "{{percent}}% similar"
163
+ }
164
+ },
165
+ "me": {
166
+ "tabs": {
167
+ "preferences": "Preferences",
168
+ "data": "Data",
169
+ "about": "About",
170
+ "desktop": "Desktop",
171
+ "custom": "Custom",
172
+ "privacy": "Privacy",
173
+ "archive": "Archive",
174
+ "plugins": "Plugins",
175
+ "sync": "Sync"
176
+ },
177
+ "section": {
178
+ "language": "Language",
179
+ "icons": "Icons",
180
+ "theme": "Theme",
181
+ "font": "Font",
182
+ "dateTime": "Date & Time",
183
+ "tagRules": "Tag rules",
184
+ "rebuild": "Rebuild",
185
+ "trash": "Trash",
186
+ "usage": "Usage history",
187
+ "trace": "Footprint log",
188
+ "privacy": "Privacy & Security"
189
+ },
190
+ "custom": {
191
+ "tab": {
192
+ "tags": "Tags",
193
+ "traits": "Traits",
194
+ "relationships": "Relationships",
195
+ "collections": "Collections"
196
+ },
197
+ "blurb": {
198
+ "tags": "Categories group tags; tags label the library.",
199
+ "traits": "Typed, searchable facts characters carry.",
200
+ "relationships": "The verbs between characters.",
201
+ "collections": "Hand-picked shelves pinned to the sidebar."
202
+ },
203
+ "unused": "Unused",
204
+ "reorder": "Reorder",
205
+ "add": "Add",
206
+ "more": "More",
207
+ "filterTagsIn": "Filter tags in {{category}}",
208
+ "tagsOf": "{{shown}} of {{total}} tags",
209
+ "unusedCount": "{{count}} unused",
210
+ "newCategory": "New category",
211
+ "moveTag": "Move tag",
212
+ "moveTagDescription": "The tag leaves its current category — its name must be free in the new one.",
213
+ "moveTagOut": "moves out of {{category}}",
214
+ "rulesTravel": "Sibling and parent rules travel with the tag.",
215
+ "entity": {
216
+ "tag": "Tag",
217
+ "category": "Category",
218
+ "trait": "Trait",
219
+ "relation": "Relation",
220
+ "collection": "Collection"
221
+ },
222
+ "link": "Link"
223
+ },
224
+ "account": {
225
+ "title": "Account",
226
+ "description": "Single-user — the account guards the door."
227
+ },
228
+ "privacy": {
229
+ "signOutSection": {
230
+ "title": "Automatic sign-out",
231
+ "description": "If this tab stays hidden past the delay, the session is signed out and the login page is shown — the only complete protection against preview thumbnails."
232
+ },
233
+ "autoLogout": {
234
+ "title": "Sign out when left unattended",
235
+ "description": "The tab watches visibility; coming back past the delay lands on the login page."
236
+ },
237
+ "delayLabel": "Sign out after",
238
+ "delay": {
239
+ "immediately": "Immediately",
240
+ "minutes_one": "{{count}} minute",
241
+ "minutes_other": "{{count}} minutes"
242
+ },
243
+ "idleTimeout": {
244
+ "label": "Session idle timeout",
245
+ "description": "Applies server-side, so it also covers closed tabs and other browsers.",
246
+ "hours_one": "{{count}} hour",
247
+ "hours_other": "{{count}} hours",
248
+ "days_one": "{{count}} day",
249
+ "days_other": "{{count}} days"
250
+ }
251
+ },
252
+ "password": {
253
+ "title": "Password",
254
+ "description": "The admin password used to sign in to this host.",
255
+ "changeButton": "Change password",
256
+ "dialogTitle": "Change password",
257
+ "currentPassword": "Current password",
258
+ "newPassword": "New password",
259
+ "confirm": "Confirm new password",
260
+ "newPasswordPlaceholder": "At least 10 characters",
261
+ "confirmPlaceholder": "Repeat it once more",
262
+ "changed": "Password changed.",
263
+ "errorIncorrect": "The current password is incorrect.",
264
+ "errorGeneric": "Could not change the password. Check the server and try again.",
265
+ "mismatch": "Passwords do not match."
266
+ },
267
+ "licenses": {
268
+ "title": "Licenses",
269
+ "description": "Open-source attribution for the app and the bundled assets.",
270
+ "viewButton": "Licenses",
271
+ "projectLicense": "Project License",
272
+ "projectLicenseDescription": "This application is released under the GNU General Public License v3.0 (GPL-3.0).",
273
+ "fullLicense": "Full license",
274
+ "dependencies": "Open Source Dependencies",
275
+ "fonts": "Fonts",
276
+ "packageCount_one": "{{count}} package",
277
+ "packageCount_other": "{{count}} packages",
278
+ "noPackages": "No packages yet."
279
+ },
280
+ "about": {
281
+ "title": "About",
282
+ "description": "What you're running and where it comes from.",
283
+ "tagline": "A modern digital hoarding tool for self-hosted archivists.",
284
+ "repository": "GitHub repository",
285
+ "website": "Website",
286
+ "bugTitle": "Report a bug",
287
+ "bugDescription": "Something went wrong? File an issue so we can fix it.",
288
+ "bugAction": "File an issue",
289
+ "featureTitle": "Request a feature",
290
+ "featureDescription": "Missing something? Tell us what to build next.",
291
+ "featureAction": "Share your idea",
292
+ "developerTitle": "Developer",
293
+ "checkUpdate": "Check for updates",
294
+ "checking": "Checking…",
295
+ "latest": "You're on the latest version.",
296
+ "outdated": "Version {{version}} is available.",
297
+ "viewRelease": "View release",
298
+ "updateError": "Update check failed. Please try again later.",
299
+ "downloading": "Downloading… {{percent}}%",
300
+ "updateReady": "Version {{version}} is ready to install.",
301
+ "updateReadyResources": "Resources v{{version}} are ready to apply.",
302
+ "applyResources": "Apply",
303
+ "resourcesVersion": "Resources v{{version}}",
304
+ "restartToUpdate": "Restart",
305
+ "portableHint": "Portable builds update by downloading a new zip from GitHub."
306
+ },
307
+ "connections": {
308
+ "title": "Recent connections",
309
+ "description": "Every sign-in with device, IP and time. Stored only on this device; rows older than 90 days are pruned.",
310
+ "empty": "No sign-ins yet.",
311
+ "loopback": "this device"
312
+ },
313
+ "desktop": {
314
+ "library": {
315
+ "title": "Library folder",
316
+ "description": "Where this app stores the archive. Changing the folder relaunches; files are not copied.",
317
+ "change": "Change folder",
318
+ "confirmTitle": "Switch library folder?",
319
+ "confirmDescription": "The app will relaunch against the folder you picked. An empty folder is a new library. A folder with app.sqlite is that library. Nothing is copied or moved."
320
+ },
321
+ "sharedFolder": {
322
+ "title": "Shared folder",
323
+ "description": "Starting folder for Browse shared folders when importing.",
324
+ "enable": "Enable shared-folder import",
325
+ "enableDescription": "When on, Browse shared folders starts from the folder below."
326
+ },
327
+ "lan": {
328
+ "title": "Local network access",
329
+ "description": "Serve this app to phones and computers on the same Wi-Fi or network.",
330
+ "enable": "Allow access from the local network",
331
+ "enableDescription": "Anyone on your network needs your password to sign in. Windows asks for a firewall exception the first time you enable this.",
332
+ "applying": "Applying…",
333
+ "portTitle": "Port",
334
+ "portDescription": "Localhost and the LAN share one port. Applying restarts the server.",
335
+ "portApply": "Apply",
336
+ "copy": "Copy",
337
+ "copied": "Address copied",
338
+ "copyFailed": "Copy failed",
339
+ "passwordRequired": "LAN sharing not enabled — set an admin password first.",
340
+ "weakPasswordTitle": "Your admin password is weak",
341
+ "weakPasswordDescription": "Anyone on your network who guesses it can access the whole library. Set a stronger password in Settings → Change password first, or enable sharing anyway.",
342
+ "enableAnyway": "Enable sharing anyway",
343
+ "primaryHint": "Open on a device on the same Wi-Fi.",
344
+ "portAdjustedTitle": "Port {{preferred}} is in use — the server is now listening on {{actual}}.",
345
+ "portAdjustedHint": "Open this address from other devices with the new port.",
346
+ "portAdjustedDismiss": "Dismiss",
347
+ "moreAddresses": "Other addresses ({{count}}) — virtual adapters and VPNs",
348
+ "noAddresses": "No reachable address found — check the network connection."
349
+ },
350
+ "autostart": {
351
+ "title": "Start with Windows",
352
+ "description": "Open hoardodile when you sign in."
353
+ },
354
+ "startInTray": {
355
+ "title": "Start in tray",
356
+ "description": "No window until you choose Open from the tray."
357
+ },
358
+ "autoUpdate": {
359
+ "title": "Automatic updates",
360
+ "description": "Download GitHub releases in the background. Restart is always confirmed."
361
+ },
362
+ "closeAction": {
363
+ "title": "When closing the window",
364
+ "description": "What the caption close button does — ask each time, hide to tray, or quit.",
365
+ "ask": "Ask me each time",
366
+ "tray": "Hide to tray",
367
+ "quit": "Quit the app"
368
+ },
369
+ "updateBanner": "Version {{version}} is ready to install.",
370
+ "updateBannerResources": "Resources v{{version}} are ready to apply.",
371
+ "updateBannerRestart": "Restart",
372
+ "updateBannerApply": "Apply",
373
+ "updateApplying": "Applying resources update…",
374
+ "updatePhaseStopping": "Stopping the local server…",
375
+ "updatePhaseSwapping": "Replacing server files…",
376
+ "updatePhaseStarting": "Starting the local server…",
377
+ "shellCache": {
378
+ "title": "Shell cache",
379
+ "description": "On-disk caches of the app window itself — HTTP responses, compiled code and GPU shaders — plus any downloaded update. Clearing never touches cookies, your preferences or offline data, and the app re-fetches from the local server right away. A downloaded update that is ready to install stays untouched.",
380
+ "currentSize": "{{size}}",
381
+ "unavailable": "Unavailable",
382
+ "clear": "Clear cache",
383
+ "clearing": "Clearing…",
384
+ "confirmTitle": "Clear the shell cache?",
385
+ "confirmDescription": "The app window will fetch its files from the local server again on the next visit. Cookies, preferences and offline data are never touched. A downloaded update that is ready to install stays untouched.",
386
+ "toastCleared": "Shell cache cleared — {{bytes}} freed.",
387
+ "clearFailed": "Could not clear the shell cache."
388
+ }
389
+ },
390
+ "usage": {
391
+ "description": "Sessions behind Stats and the footprint log — clearing asks for a typed phrase.",
392
+ "rowTitle": "Usage sessions",
393
+ "rowDescription": "The data behind Stats.",
394
+ "clearAll": "Remove all",
395
+ "confirmTitle": "Clear all usage history?",
396
+ "confirmDescription": "Permanently deletes all usage records. Stats and overview recommendations will reset. This cannot be undone.",
397
+ "confirmPhrase": "Clear all usage history",
398
+ "confirmLabel": "Confirm clear",
399
+ "clearing": "Clearing…",
400
+ "toastSuccess": "All usage history cleared",
401
+ "toastFailed": "Could not clear usage history"
402
+ },
403
+ "trace": {
404
+ "description": "Append-only log of your actions — imports, exports, deletes, restores and votes.",
405
+ "rowTitle": "Footprint log",
406
+ "clearAll": "Remove all",
407
+ "confirmTitle": "Clear footprints?",
408
+ "confirmDescription": "Permanently deletes every action record (imports, exports, deletes, restores, dislike votes). Viewing time is separate usage data and is not affected. This cannot be undone.",
409
+ "confirmPhrase": "Clear footprints",
410
+ "confirmLabel": "Confirm clear",
411
+ "clearing": "Clearing…",
412
+ "toastSuccess": "Footprints cleared",
413
+ "toastFailed": "Could not clear footprints"
414
+ },
415
+ "trash": {
416
+ "description": "Bundles waiting — each can come back.",
417
+ "view": "Review trash ({{count}})",
418
+ "loading": "Loading trash…",
419
+ "download": "Download"
420
+ },
421
+ "systemPrefs": {
422
+ "title": "System defaults",
423
+ "description": "Hidden host behavior switches — restored to factory defaults. Plugin settings are untouched; those live on the Plugins page.",
424
+ "restore": "Restore",
425
+ "resetSuccess": "All system settings have been reset",
426
+ "confirmTitle": "Reset all system settings?",
427
+ "confirmDescription": "This will delete every system preference including theme, language, font, and date format. The page will reload with default values. This cannot be undone."
428
+ },
429
+ "systemCache": {
430
+ "title": "Browser cache",
431
+ "description": "Browser-side local data — service-worker caches, localStorage and IndexedDB (offline usage queue, document drafts). The server is never touched; the page reloads afterwards.",
432
+ "clear": "Clear all",
433
+ "clearing": "Clearing…",
434
+ "resetting": "Browser cache cleared. Reloading…",
435
+ "confirmTitle": "Clear browser cache?",
436
+ "confirmDescription": "This will delete every piece of browser-side local data, including theme and language preferences, offline usage records, and saved document drafts, then reload the page. This cannot be undone."
437
+ }
438
+ },
439
+ "plugin": {
440
+ "loading": "Loading preview…",
441
+ "previewFailed": "Plugin failed to load",
442
+ "previewFallback": "Plugin {{name}} is missing or unavailable; previewing with the built-in file plugin",
443
+ "previewFallbackManage": "Manage plugins",
444
+ "previewFallbackUnknown": "unknown plugin"
445
+ },
446
+ "plugins": {
447
+ "pageHint": "Install from a .zip bundle, or rescan the plugins folder to pick up new arrivals.",
448
+ "uploadZip": "Upload .zip",
449
+ "uploadPluginSuccess": "Plugin installed",
450
+ "uploading": "Installing…",
451
+ "rescan": "Rescan plugins",
452
+ "rescanSuccess": "Plugins rescanned",
453
+ "more": "More",
454
+ "enableToggle": "Enable or disable plugin",
455
+ "dragToReorder": "Drag to reorder",
456
+ "dev": "dev",
457
+ "missing": "Missing",
458
+ "missingSource": "source missing",
459
+ "installed": "Installed",
460
+ "installedDescription": "Order decides who claims a bundle first — drag to re-prioritize.",
461
+ "filterPlaceholder": "Filter plugins",
462
+ "countInstalled": "{{count}} installed",
463
+ "listView": "List view",
464
+ "gridView": "Grid view",
465
+ "searchCategories": "Search categories",
466
+ "fileTitle": "File",
467
+ "fileDescription": "The built-in fallback viewer for unknown file types — it can't be removed or reordered.",
468
+ "alwaysOn": "always on",
469
+ "defaultsTitle": "Plugin defaults",
470
+ "defaultsDescription": "Every plugin's settings return to their defaults — content and installs stay untouched.",
471
+ "restore": "Restore",
472
+ "cachesTitle": "Plugin caches",
473
+ "cachesDescription": "Thumbnails and parsed metadata across all plugins — rebuilt on demand.",
474
+ "clearAll": "Clear all",
475
+ "pin": "Pin",
476
+ "color": "Color",
477
+ "appearance": "Appearance",
478
+ "appearanceTitle": "Appearance: {{name}}",
479
+ "appearanceDescription": "Choose a color and whether to pin this plugin to resource cards.",
480
+ "reset": "Reset",
481
+ "clear": "Clear",
482
+ "resetPluginPref": "Restore settings",
483
+ "resetPluginPrefConfirmTitle": "Reset settings for {{name}}?",
484
+ "resetPluginPrefConfirmDescription": "This will delete all saved settings for this plugin. The plugin will use its default values after restart. This cannot be undone.",
485
+ "resetPluginPrefSuccess": "Settings for {{name}} have been reset",
486
+ "clearPluginCache": "Clear cache",
487
+ "clearPluginCacheConfirmTitle": "Clear cache for {{name}}?",
488
+ "clearPluginCacheConfirmDescription": "This will delete all cached data (e.g. resume positions) for this plugin. This cannot be undone.",
489
+ "clearPluginCacheSuccess": "Cache for {{name}} has been cleared",
490
+ "uninstall": "Uninstall",
491
+ "uninstallConfirmTitle": "Uninstall plugin {{name}}?",
492
+ "uninstallConfirmDescription_one": "{{count}} resource is using this plugin. After uninstalling, it will preview with the built-in file plugin; reinstalling the plugin restores it automatically. This cannot be undone.",
493
+ "uninstallConfirmDescription_other": "{{count}} resources are using this plugin. After uninstalling, they will preview with the built-in file plugin; reinstalling the plugin restores them automatically. This cannot be undone.",
494
+ "uninstallConfirmNoUsage": "No resources are using this plugin. Reinstall it any time to use it again. This cannot be undone.",
495
+ "uninstallSuccess": "Uninstalled {{name}}",
496
+ "resetAllPluginPrefSuccess": "All plugin settings have been reset",
497
+ "resetAllPluginPrefConfirmTitle": "Reset all plugin settings?",
498
+ "resetAllPluginPrefConfirmDescription": "This will delete every plugin's saved settings. All plugins will use their default values after restart. This cannot be undone.",
499
+ "clearAllPluginCacheSuccess": "All plugin cache has been cleared",
500
+ "clearAllPluginCacheConfirmTitle": "Clear all plugin cache?",
501
+ "clearAllPluginCacheConfirmDescription": "This will delete every plugin's cached data including resume positions. This cannot be undone.",
502
+ "installConfirmTitle": "Install this plugin?",
503
+ "install": "Install",
504
+ "installConfirmRisk": "Third-party plugins run server-side code in a restricted sandbox: their main process can only read the files of the resources the host exposes to it and cannot touch your filesystem, run programs, or make network requests — except user-approved downloads: a plugin declaring the Downloads permission can fetch a URL of your choosing after you confirm it (one dialog per download, restricted to the plugin's own folder). The declared permissions above toggle host features. Only install plugins from sources you trust.",
505
+ "uploadInvalidPlugin": "Not a valid plugin package (missing or invalid manifest.json).",
506
+ "permissions": {
507
+ "sourceMeta": "Source metadata",
508
+ "searchMeta": "Search metadata",
509
+ "danmaku": "Danmaku",
510
+ "message": "Messages",
511
+ "imageHashes": "Image hashes",
512
+ "container": "Containers",
513
+ "download": "Downloads"
514
+ }
515
+ },
516
+ "overview": {
517
+ "usageHistory": {
518
+ "title": "Usage history"
519
+ },
520
+ "memories": {
521
+ "title": "On this day",
522
+ "yearsAgo_one": "Last year on this day",
523
+ "yearsAgo_other": "{{count}} years ago on this day"
524
+ },
525
+ "activity": {
526
+ "title": "Recent activity",
527
+ "updated": "Updated {{time}}"
528
+ },
529
+ "stats": {
530
+ "resources": "Resources",
531
+ "characters": "Characters",
532
+ "documents": "Documents",
533
+ "messages": "Messages"
534
+ },
535
+ "sections": {
536
+ "recentResources": "Recently updated",
537
+ "recentViewed": "Recently viewed",
538
+ "recentCharacters": "Recent characters",
539
+ "recentDocuments": "Recent documents",
540
+ "recentMessages": "Recent messages"
541
+ },
542
+ "empty": {
543
+ "resources": "No resources yet.",
544
+ "recentViewed": "No viewing history yet.",
545
+ "characters": "No characters yet.",
546
+ "documents": "No documents yet.",
547
+ "messages": "No messages yet."
548
+ },
549
+ "todayUsage": {
550
+ "label": "Today's watch time",
551
+ "sameAsYesterday": "Same as yesterday",
552
+ "moreThanYesterday": "{{duration}} more than yesterday",
553
+ "lessThanYesterday": "{{duration}} less than yesterday"
554
+ },
555
+ "footprints": {
556
+ "aria": "Footprints",
557
+ "title": "Footprints",
558
+ "description": "Every action you've taken",
559
+ "emptyPrompt": "No footprints yet — import or upload a resource to start the log.",
560
+ "uploadResource": "Upload a resource",
561
+ "importFolder": "Import a folder"
562
+ },
563
+ "viewAll": "View all",
564
+ "recentViewed": {
565
+ "description": "Your viewing history",
566
+ "unknownTime": "Unknown time",
567
+ "emptyPrompt": "No viewing history yet — start exploring or upload your first resource.",
568
+ "browseResources": "Browse resources",
569
+ "uploadResource": "Upload a resource"
570
+ },
571
+ "pinned": {
572
+ "charactersTitle": "Pinned characters",
573
+ "resourcesTitle": "Pinned resources",
574
+ "charactersEmpty": "No matching characters.",
575
+ "resourcesEmpty": "No matching resources.",
576
+ "add": "Add",
577
+ "maxReached": "Maximum {{max}} pinned items reached",
578
+ "dragToReorder": "Drag to reorder",
579
+ "settings": {
580
+ "title": "Pinned {{section}}",
581
+ "description": "Which sections the dashboard pins — drag to reorder, edit beside.",
582
+ "editTitle": "Edit section",
583
+ "editDescription": "The section as it shows on the dashboard.",
584
+ "titleLabel": "Title",
585
+ "titlePlaceholder": "Leave empty to use the default title",
586
+ "showWhenEmpty": "Show when empty",
587
+ "sizeLabel": "Size",
588
+ "sectionsCount_one": "{{count}} section",
589
+ "sectionsCount_other": "{{count}} sections",
590
+ "save": "Save section",
591
+ "done": "Done",
592
+ "delete": "Delete",
593
+ "deleteConfirmTitle": "Delete pinned view",
594
+ "deleteConfirmDescription": "Are you sure you want to delete “{{title}}”? This cannot be undone.",
595
+ "saveSuccess": "Pinned settings saved",
596
+ "deleteSuccess": "Pinned view deleted",
597
+ "toggleEnabledAria": "Enable or disable {{title}}",
598
+ "noItems": "No pinned views yet.",
599
+ "noItemsHint": "Click Add to save the current filters to the overview.",
600
+ "noItemsWithFiltersHint": "The current list page already has filters. Click the button above to save them as a pinned view.",
601
+ "noSelection": "No pinned view selected.",
602
+ "noSelectionHint": "Select an item from the list, or click Add to create a new view.",
603
+ "preview": "Preview",
604
+ "previewTitle": "Preview filters",
605
+ "item": {
606
+ "refresh": {
607
+ "label": "Auto-refresh",
608
+ "description": "How often this pinned view draws a fresh random set.",
609
+ "always": "Always",
610
+ "never": "Never",
611
+ "every60s": "Every minute",
612
+ "every1800s": "Every 30 minutes",
613
+ "every3600s": "Every hour",
614
+ "every21600s": "Every 6 hours",
615
+ "every43200s": "Every 12 hours",
616
+ "midnight": "At midnight"
617
+ }
618
+ }
619
+ },
620
+ "refreshSectionAria": "Refresh {{title}}"
621
+ },
622
+ "sort": {
623
+ "created": "Created",
624
+ "updated": "Updated"
625
+ },
626
+ "rebuildDescription": "Rebuild every resource's metadata and thumbnails from scratch, or clear all rebuildable data (local caches + recorded metadata) on this host.",
627
+ "signOut": "Sign out",
628
+ "signingOut": "Signing out…",
629
+ "precache": "Precache",
630
+ "precaching": "Precaching…",
631
+ "caching": "Warming browser cache…",
632
+ "refreshCache": "Refresh cache",
633
+ "clearCache": "Clear all",
634
+ "clearing": "Clearing…",
635
+ "progressLine": "{{done}} / {{total}} ({{percent}}%) - {{stage}}",
636
+ "cachedSummary_one": "{{count}} item precached",
637
+ "cachedSummary_other": "{{count}} items precached",
638
+ "precacheFailed": "Failed to precache: {{error}}",
639
+ "precacheStageLoading": "Rebuilding metadata and generating thumbnails…",
640
+ "precacheDefaultError": "Failed to run precache",
641
+ "precacheInProgress": "A precache is already in progress",
642
+ "abortPrecache": "Abort",
643
+ "precacheAborted": "Precache aborted",
644
+ "toastClearLocked_one": "{{count}} rebuild data file is locked and could not be deleted. Restart the server to clear it.",
645
+ "toastClearLocked_other": "{{count}} rebuild data files are locked and could not be deleted. Restart the server to clear them.",
646
+ "clearCacheSuccess": "Rebuild data cleared",
647
+ "toastClearFailed": "Could not clear rebuild data",
648
+ "toastPrecacheSuccess_one": "Precached {{count}} item",
649
+ "toastPrecacheSuccess_other": "Precached {{count}} items",
650
+ "toastPrecachePartial": "Precache completed with {{failed}} failures"
651
+ },
652
+ "login": {
653
+ "brand": "Hoardodile",
654
+ "title": "Sign in",
655
+ "description": "Enter the password for this host.",
656
+ "demoDescription": "This is a demo library. Password is {{password}}.",
657
+ "password": "Password",
658
+ "submit": "Sign in",
659
+ "submitting": "Signing in…",
660
+ "formAria": "Sign in",
661
+ "errorIncorrect": "Incorrect password.",
662
+ "errorGeneric": "Could not sign in. Check the server and try again.",
663
+ "setupTitle": "Set a password",
664
+ "setupDescription": "This host has no password yet. Set one now — whoever does this first owns the host.",
665
+ "setupPassword": "New password",
666
+ "setupConfirm": "Confirm password",
667
+ "setupSubmit": "Set password",
668
+ "setupSubmitting": "Setting up…",
669
+ "setupMismatch": "Passwords do not match.",
670
+ "setupFormAria": "Set password"
671
+ },
672
+ "dataHistory": {
673
+ "title": "Data History",
674
+ "description": "Manage your data snapshots. Backups are for migration or disaster recovery; archives freeze a version as read-only so its data can never change again.",
675
+ "status": {
676
+ "currentWritable": "Writable — v{{version}}",
677
+ "viewingArchive": "Viewing archive — v{{version}}"
678
+ },
679
+ "chip": {
680
+ "latest": "Latest",
681
+ "readOnly": "Read-only",
682
+ "auto": "Auto"
683
+ },
684
+ "archive": {
685
+ "title": "v{{version}}",
686
+ "tagCurrent": "Latest (writable)",
687
+ "tagActive": "Viewing",
688
+ "tagReadOnly": "Historical archive",
689
+ "tagCurrentShort": "latest",
690
+ "tagActiveShort": "viewing",
691
+ "nameLabel": "Name",
692
+ "namePlaceholder": "e.g. v1 milestone",
693
+ "noteLabel": "Note",
694
+ "notePlaceholder": "e.g. before migration, data freeze…",
695
+ "switchHint": "After switching, the app runs in read-only mode against this archive. Return to the latest version to edit again.",
696
+ "activeHint": "This is the version you are viewing."
697
+ },
698
+ "backup": {
699
+ "typeLabel": "Database backup",
700
+ "autoTypeLabel": "Automatic daily snapshot",
701
+ "autoBadge": "auto",
702
+ "autoDeleteHint": "This automatic snapshot is kept for a short rolling window and will be replaced automatically. You can delete it now to free up space.",
703
+ "nameLabel": "Name",
704
+ "nameEmpty": "None",
705
+ "restoreHint": "Restoring asks you to type the backup name — the current library is archived first, so nothing is lost silently.",
706
+ "deleteHint": "This backup file will be permanently deleted and cannot be recovered.",
707
+ "archivedHint": "This backup belongs to an archived version. Its data is frozen and cannot be restored or deleted."
708
+ },
709
+ "action": {
710
+ "backupNow": "Backup now",
711
+ "backingUp": "Backing up…",
712
+ "archiveNow": "Archive now",
713
+ "archiving": "Archiving…",
714
+ "restore": "Restore",
715
+ "restoring": "Restoring…",
716
+ "delete": "Delete",
717
+ "deleting": "Deleting…",
718
+ "switchToVersion": "Switch to this version",
719
+ "switching": "Switching…",
720
+ "download": "Download"
721
+ },
722
+ "reloading": "Reloading…",
723
+ "autoSnapshot": {
724
+ "enabled": "Automatic snapshot: daily · keeps {{keep}} days",
725
+ "disabled": "Automatic snapshots are disabled",
726
+ "last": "newest {{time}}"
727
+ },
728
+ "detail": {
729
+ "selectPrompt": "Select a backup or archive on the timeline to view details and available actions.",
730
+ "size": "Size",
731
+ "versionNumber": "Version",
732
+ "createdAt": "Created",
733
+ "note": "Note",
734
+ "contents": "Contents",
735
+ "contentsValue": "{{resources}} resources · {{characters}} characters · {{documents}} documents",
736
+ "backupOnVersion": "Backup on v{{version}}",
737
+ "archiveVersion": "Archive v{{version}}"
738
+ },
739
+ "note": {
740
+ "empty": "Click to add a note…",
741
+ "placeholder": "Add a short description for this snapshot…"
742
+ },
743
+ "confirm": {
744
+ "archiveTitle": "Archive latest version",
745
+ "archiveDescription": "The latest version's database and all resources, characters, and documents will be frozen as a read-only archive. Data inside an archive never changes again; a new writable version will be created for ongoing work.",
746
+ "archivePhrase": "archive",
747
+ "archiveAutoHint": "The current version's automatic snapshots freeze with this archive; a fresh snapshot is taken for the new version right away.",
748
+ "restoreTitle": "Restore this backup",
749
+ "restoreDescription": "The current library is archived first, so nothing is lost silently. This restore can be undone by restoring the archived version.",
750
+ "restorePhrase": "restore backup",
751
+ "autoPhrase": "auto",
752
+ "deleteBackupTitle": "Delete backup forever",
753
+ "deleteBackupDescription": "This backup file will be permanently deleted and cannot be recovered.",
754
+ "deleteBackupPhrase": "delete backup",
755
+ "switchTitle": "Switch to this archive version",
756
+ "switchDescription": "After switching, the app runs in read-only mode and only historical data is visible. Return to the latest version to edit again."
757
+ },
758
+ "empty": {
759
+ "title": "No data history yet.",
760
+ "description": "Create a backup now to protect against data loss."
761
+ },
762
+ "toast": {
763
+ "backupCreated": "Backup created",
764
+ "backupFailed": "Backup failed",
765
+ "archiveFailed": "Archive failed",
766
+ "backupDeleted": "Backup deleted",
767
+ "deleteFailed": "Delete failed",
768
+ "restoreFailed": "Restore failed",
769
+ "switchFailed": "Switch failed",
770
+ "metaSaved": "Saved",
771
+ "metaSaveFailed": "Could not save"
772
+ }
773
+ },
774
+ "documents": {
775
+ "title": "Documents",
776
+ "index": {
777
+ "docCount_one": "{{count}} document",
778
+ "docCount_other": "{{count}} documents",
779
+ "folderCount_one": "{{count}} folder",
780
+ "folderCount_other": "{{count}} folders",
781
+ "description": "{{docs}} in {{folders}} — everything you've written, in one place.",
782
+ "updated": "Updated {{time}}"
783
+ },
784
+ "create": "New",
785
+ "backToStart": "Back to start page",
786
+ "new": "Document",
787
+ "newFolder": "Folder",
788
+ "defaultNewTitle": "Untitled document",
789
+ "defaultNewFolderTitle": "Untitled folder",
790
+ "searchPlaceholder": "Search title or content",
791
+ "loading": "Loading documents…",
792
+ "listEmpty": "No documents yet.",
793
+ "notFound": {
794
+ "title": "Document not found",
795
+ "description": "This document no longer exists — it may have been deleted.",
796
+ "back": "Back to documents"
797
+ },
798
+ "untitled": "Untitled",
799
+ "viewAll": "View all",
800
+ "filter": {
801
+ "title": "Filter by characters and resources",
802
+ "dialogTitle": "Filter documents",
803
+ "apply": "Apply",
804
+ "clear": "Clear"
805
+ },
806
+ "placeholder": "Start writing…",
807
+ "editorPlaceholder": "View commands '/'",
808
+ "saveDraft": "Save draft",
809
+ "discardDraft": "Discard draft",
810
+ "commit": "Commit version",
811
+ "commitDialog": {
812
+ "title": "Commit version",
813
+ "description": "Save the current draft as an immutable version. Provide a short message describing what changed.",
814
+ "messageLabel": "Commit message",
815
+ "messagePlaceholder": "What changed in this version?",
816
+ "submit": "Commit",
817
+ "committing": "Committing…"
818
+ },
819
+ "discardDialog": {
820
+ "title": "Discard draft?",
821
+ "description": "Your unsaved changes will be replaced with the latest committed version. This cannot be undone.",
822
+ "confirm": "Discard",
823
+ "discarding": "Discarding…"
824
+ },
825
+ "leaveDialog": {
826
+ "confirm": "You have unsaved changes in this document. Leave anyway?"
827
+ },
828
+ "moreActions": "More actions",
829
+ "zoom": {
830
+ "label": "Text zoom",
831
+ "smaller": "Zoom out",
832
+ "larger": "Zoom in",
833
+ "reset": "Reset zoom"
834
+ },
835
+ "appearanceSettings": {
836
+ "title": "Appearance",
837
+ "description": "Tune how documents look: theme, reading width and fonts.",
838
+ "theme": "Document theme",
839
+ "inherit": "Inherit from web theme",
840
+ "readingWidth": "Reading width",
841
+ "readingWidthDescription": "Width of the centered reading column on the document page.",
842
+ "editorFont": "Editor Font",
843
+ "editorFontDescription": "Font used inside the document editor.",
844
+ "uiFont": "Page Font",
845
+ "uiFontDescription": "Font used for titles, sidebar, and other UI areas in the document page.",
846
+ "body": "Body",
847
+ "headings": "Headings"
848
+ },
849
+ "readOnly": {
850
+ "enable": "Preview",
851
+ "disable": "Exit preview"
852
+ },
853
+ "reading": {
854
+ "enter": "Reading mode",
855
+ "exit": "Exit reading mode"
856
+ },
857
+ "diff": {
858
+ "show": "Compare history",
859
+ "exit": "Exit compare",
860
+ "compareWith": "Compare with",
861
+ "selectVersion": "Select version"
862
+ },
863
+ "conflict": {
864
+ "title": "Remote changes detected",
865
+ "description": "Your changes are kept in the editor. Compare the two versions and choose which one to keep.",
866
+ "keepCurrent": "Keep current content",
867
+ "discardCurrent": "Discard current content",
868
+ "viewDiff": "Compare",
869
+ "diffLabel": "Offline vs remote draft",
870
+ "updatedHint": "Server updated {{remote}} · Local edited {{local}}",
871
+ "discardConfirm": {
872
+ "title": "Discard current edits?",
873
+ "description": "Changes not yet synced to the server will be lost. You can compare the differences first.",
874
+ "confirm": "Discard current edits"
875
+ }
876
+ },
877
+ "indent": {
878
+ "enable": "Enable first-line indent"
879
+ },
880
+ "welcome": {
881
+ "title": "Documents",
882
+ "subtitle": "Create documents or folders on the left. Documents can host nested children too."
883
+ },
884
+ "folderHint": "This is a folder. Pick a document inside it to start editing.",
885
+ "headings": "Contents",
886
+ "noHeadings": "No headings in this document.",
887
+ "untitledHeading": "Untitled heading",
888
+ "detailMeta": {
889
+ "chars_one": "{{count, number}} char",
890
+ "chars_other": "{{count, number}} chars"
891
+ },
892
+ "notes": {
893
+ "tab": "Notes",
894
+ "empty": "No notes yet."
895
+ },
896
+ "statusBar": {
897
+ "charCount": "{{count}} / {{max}} chars",
898
+ "offline": "Offline · changes not saved"
899
+ },
900
+ "autosave": {
901
+ "enable": "Enable autosave"
902
+ },
903
+ "editMode": {
904
+ "label": "Adjust order",
905
+ "toggle": "Toggle adjust order mode",
906
+ "hint": "Enable to drag-reorder documents in the tree."
907
+ },
908
+ "expandAll": "Expand all",
909
+ "collapseAll": "Collapse all",
910
+ "slash": {
911
+ "charactersGroup": "Characters",
912
+ "resourcesGroup": "Resources",
913
+ "insertCharacter": "Insert character…",
914
+ "insertResource": "Insert resource…"
915
+ },
916
+ "toast": {
917
+ "createFailed": "Could not create",
918
+ "renameFailed": "Could not rename",
919
+ "saveFailed": "Could not save draft",
920
+ "saved": "Saved",
921
+ "commitFailed": "Could not commit version",
922
+ "committed": "Version committed",
923
+ "contentTooLarge": "Content exceeds maximum character limit",
924
+ "versionLoadFailed": "Could not load version content",
925
+ "savedLocally": "Saved on this device",
926
+ "resolveConflictFirst": "Resolve the offline conflict before committing",
927
+ "movedToTrash": "Moved to recycle bin",
928
+ "restored": "Restored",
929
+ "restoreFailed": "Could not restore",
930
+ "deleteFailed": "Could not delete",
931
+ "deletedForever": "Permanently deleted",
932
+ "moveFailed": "Could not move"
933
+ },
934
+ "search": {
935
+ "empty": "No matching documents."
936
+ },
937
+ "trash": {
938
+ "open": "Recycle bin",
939
+ "empty": "No documents in trash yet.",
940
+ "restore": "Restore",
941
+ "hardDelete": "Delete forever",
942
+ "hardDeleteTitle": "Delete forever?",
943
+ "hardDeleteDescription": "This permanently removes the item. This cannot be undone.",
944
+ "hardDeleteConfirm": "Delete forever",
945
+ "hardDeleting": "Deleting…"
946
+ },
947
+ "softDeleteDialog": {
948
+ "title": "Move to recycle bin?",
949
+ "description": "The item will be hidden from the tree and can be restored later from the recycle bin.",
950
+ "folderWarning": "All descendant documents inside this folder will be moved to the recycle bin together.",
951
+ "confirm": "Move to recycle bin"
952
+ },
953
+ "toolbar": {
954
+ "bold": "Bold",
955
+ "italic": "Italic",
956
+ "strike": "Strikethrough",
957
+ "code": "Inline code",
958
+ "h1": "Heading 1",
959
+ "h2": "Heading 2",
960
+ "h3": "Heading 3",
961
+ "bulletList": "Bullet list",
962
+ "orderedList": "Numbered list",
963
+ "blockquote": "Quote",
964
+ "noFirstLineIndent": "No first-line indent (this paragraph)",
965
+ "link": "Link",
966
+ "linkPrompt": "Enter URL (leave blank to remove)",
967
+ "alignLeft": "Align left",
968
+ "alignCenter": "Align center",
969
+ "alignRight": "Align right",
970
+ "textColor": "Text color",
971
+ "tagChip": "Tag style",
972
+ "undo": "Undo",
973
+ "redo": "Redo"
974
+ }
975
+ },
976
+ "characters": {
977
+ "title": "Characters",
978
+ "searchPlaceholder": "Search characters…",
979
+ "filters": "Filters",
980
+ "sortLabel": "Sort",
981
+ "orderLabel": "Order",
982
+ "search": {
983
+ "sectionOptions": "Options",
984
+ "sectionTags": "Tags",
985
+ "sectionTraits": "Traits",
986
+ "sectionRelations": "Relations",
987
+ "clearAll": "Clear all",
988
+ "apply": "Search",
989
+ "itemCount_one": "{{count}} character",
990
+ "itemCount_other": "{{count}} characters"
991
+ },
992
+ "new": "New",
993
+ "listEmpty": "No characters yet.",
994
+ "trashEmpty": "No characters in trash yet.",
995
+ "filter": {
996
+ "trash": "Trash"
997
+ },
998
+ "traitFilter": {
999
+ "add": "Add",
1000
+ "empty": "Define traits in Settings to filter by them.",
1001
+ "opContains": "contains",
1002
+ "opEmpty": "is empty",
1003
+ "opNotEmpty": "not empty",
1004
+ "opDateAfter": "after",
1005
+ "opDateOnOrAfter": "on or after",
1006
+ "opDateBefore": "before",
1007
+ "opDateOnOrBefore": "on or before",
1008
+ "opDateOn": "on",
1009
+ "opDateMonthDayOn": "month/day on",
1010
+ "opDateMonthDayToday": "today's month/day"
1011
+ },
1012
+ "viewSelected": "Only selected",
1013
+ "viewSelectedTooMany": "Only selected supports up to {{max}} items",
1014
+ "sort": {
1015
+ "created": "Created",
1016
+ "updated": "Updated",
1017
+ "random": "Random",
1018
+ "latest": "Latest",
1019
+ "earliest": "Earliest"
1020
+ },
1021
+ "bulk": {
1022
+ "select": "Select",
1023
+ "done": "Done",
1024
+ "toolbarCount": "{{count}} selected",
1025
+ "editTags": "Edit tags",
1026
+ "clearSelection": "Clear",
1027
+ "moveToTrash": "Trash",
1028
+ "confirmSoft_one": "Move {{count}} character to trash?",
1029
+ "confirmSoft_other": "Move {{count}} characters to trash?",
1030
+ "softDeleteDescription": "The selected characters will be moved to the recycle bin. They can be restored later from the trash.",
1031
+ "toastAllOk_one": "Updated {{count}} character.",
1032
+ "toastAllOk_other": "Updated {{count}} characters.",
1033
+ "toastAllFailed": "Nothing was updated ({{count}} failed).",
1034
+ "toastPartial": "{{ok}} succeeded, {{failed}} failed."
1035
+ },
1036
+ "actionsAria": "Actions for {{name}}",
1037
+ "toast": {
1038
+ "movedToTrash": "Moved to trash",
1039
+ "deleteFailed": "Could not delete",
1040
+ "restored": "Restored",
1041
+ "restoreFailed": "Could not restore",
1042
+ "deletedForever": "Deleted forever",
1043
+ "createSuccess": "Created",
1044
+ "createFailed": "Create failed"
1045
+ },
1046
+ "create": {
1047
+ "title": "New character",
1048
+ "description": "A name is enough to start — everything else can wait.",
1049
+ "basicInfo": "Basic info",
1050
+ "basicDescription": "Who they are, in plain words.",
1051
+ "name": "Name",
1052
+ "intro": "Intro",
1053
+ "namePlaceholder": "Unnamed character",
1054
+ "nameHint": "A name is required — give them one to enable Create.",
1055
+ "introPlaceholder": "A few sentences — who they are, what they want.",
1056
+ "links": "Links",
1057
+ "linksDescription": "Tags and traits that tie this character into the library.",
1058
+ "tags": "Tags",
1059
+ "traits": "Traits",
1060
+ "appearance": "Appearance",
1061
+ "appearanceDescription": "Avatar and fullbody art — crop to fit.",
1062
+ "avatar": "Avatar",
1063
+ "fullbody": "Fullbody",
1064
+ "submit": "Create",
1065
+ "submitting": "Creating…"
1066
+ },
1067
+ "preview": {
1068
+ "aria": "Preview: {{name}}"
1069
+ },
1070
+ "detail": {
1071
+ "loadError": "Failed to load this character.",
1072
+ "noIntro": "No intro yet.",
1073
+ "relationships": "Relationships",
1074
+ "recent": "Recent resources",
1075
+ "viewAllResources": "View all",
1076
+ "fullbody": "Fullbody",
1077
+ "traits": "Traits",
1078
+ "tags": "Tags",
1079
+ "tabsAria": "character sections",
1080
+ "documentsTitle": "In documents",
1081
+ "openSidebar": "Open sidebar"
1082
+ },
1083
+ "editDialog": {
1084
+ "aria": "Edit character",
1085
+ "name": "Name",
1086
+ "intro": "Intro"
1087
+ },
1088
+ "editHub": {
1089
+ "title": "Edit - {{name}}"
1090
+ },
1091
+ "tagsDialog": {
1092
+ "title": "Edit tags - {{name}}"
1093
+ },
1094
+ "actions": {
1095
+ "uploadResource": "Upload resource",
1096
+ "editTags": "Tags",
1097
+ "editTraits": "Traits",
1098
+ "editRelations": "Relationships",
1099
+ "editBasic": "Basic info",
1100
+ "editAvatar": "Avatar",
1101
+ "editFullbody": "Fullbody",
1102
+ "openMessages": "Messages",
1103
+ "restore": "Restore",
1104
+ "hardDelete": "Delete forever",
1105
+ "softDelete": "Move to trash"
1106
+ },
1107
+ "hardDelete": {
1108
+ "title": "Delete forever?",
1109
+ "description": "This permanently deletes the character and moves its folder to local trash.",
1110
+ "confirm": "Delete forever",
1111
+ "deleting": "Deleting…"
1112
+ },
1113
+ "chips": {
1114
+ "linkCharacters": "Link characters"
1115
+ },
1116
+ "picker": {
1117
+ "selectedEmpty": "No characters selected yet.",
1118
+ "loadFailed": "Failed to load"
1119
+ },
1120
+ "selectorDialog": {
1121
+ "title": "Select character",
1122
+ "confirm": "Confirm",
1123
+ "confirmCount": "Confirm ({{count}})",
1124
+ "notSelectable": "This character cannot be selected"
1125
+ },
1126
+ "charactership": {
1127
+ "empty": "No relationships yet. Pick a type above to add one.",
1128
+ "pickerTitle": "Select character",
1129
+ "deleteEdge": "Remove",
1130
+ "deleteConfirmTitle": "Delete relationship",
1131
+ "deleteConfirmDescription": "Are you sure you want to delete this relationship? This cannot be undone.",
1132
+ "pickCharacter": "Pick character",
1133
+ "enterName": "Enter name",
1134
+ "pickEndpoint": "Pick endpoint",
1135
+ "namePlaceholder": "Name",
1136
+ "noTypesHint": "No relationship types yet.",
1137
+ "noTypesLink": "Add types on Me → Custom",
1138
+ "incompleteDraft": "Complete all new relationships before saving",
1139
+ "toast": {
1140
+ "deleteSuccess": "Relationship removed",
1141
+ "deleteFailed": "Could not remove relationship",
1142
+ "addSuccess": "Relationship added",
1143
+ "saveFailed": "Could not save relationship"
1144
+ }
1145
+ }
1146
+ },
1147
+ "collections": {
1148
+ "entityLabel": "collection",
1149
+ "usageLabelOne": "resource",
1150
+ "usageLabel": "resources",
1151
+ "chip": {
1152
+ "openLabel": "Open {{name}} collection"
1153
+ },
1154
+ "popover": {
1155
+ "empty": "No resources in this collection yet."
1156
+ },
1157
+ "picker": {
1158
+ "quickCreate": "Add",
1159
+ "searchPlaceholder": "Search collections"
1160
+ },
1161
+ "editDialog": {
1162
+ "title": "Collections for {{name}}"
1163
+ },
1164
+ "panel": {
1165
+ "empty": "No collections yet.",
1166
+ "addDialogTitle": "Add collection",
1167
+ "editDialogTitle": "Edit collection",
1168
+ "filterPlaceholder": "Filter collections",
1169
+ "reorderMode": "Reorder",
1170
+ "reorderModeAria": "Enable drag-and-drop to reorder collections"
1171
+ }
1172
+ },
1173
+ "usage": {
1174
+ "title": "Usage stats",
1175
+ "description": "Watch time across platforms — totals, the daily rhythm, and what your time goes to.",
1176
+ "history": {
1177
+ "title": "Usage history",
1178
+ "description": "What you've used, newest first",
1179
+ "empty": "No usage records yet.",
1180
+ "loading": "Loading…",
1181
+ "loadError": "Could not load usage history.",
1182
+ "today": "Today",
1183
+ "yesterday": "Yesterday",
1184
+ "unknownTime": "Unknown time",
1185
+ "totalLabel_one": "{{count}} item",
1186
+ "totalLabel_other": "{{count}} items",
1187
+ "tabs": {
1188
+ "all": "All",
1189
+ "resources": "Resources",
1190
+ "characters": "Characters",
1191
+ "documents": "Documents"
1192
+ }
1193
+ },
1194
+ "stats": {
1195
+ "totalTime": "Total watch time",
1196
+ "avgPerDay": "Avg per day",
1197
+ "mostActiveDay": "Most active day",
1198
+ "mostActiveDayFormat": "MMM D",
1199
+ "entries_one": "{{count}} entry",
1200
+ "entries_other": "{{count}} entries",
1201
+ "shareSectionTitle": "Share breakdown",
1202
+ "shareTitle": "Time",
1203
+ "shareDescription": "Ranked by watch time for the selected period.",
1204
+ "viewShareTitle": "Views",
1205
+ "viewShareDescription": "Ranked by open count for the selected period.",
1206
+ "periodComparison": "Period comparison",
1207
+ "filtersTitle": "Filters",
1208
+ "trendDescription": "Minutes per day",
1209
+ "todayHourlyDescription": "Minutes per hour · local time",
1210
+ "todayHourly": "Hourly distribution",
1211
+ "hourlyAverage": "Daily rhythm",
1212
+ "hourlyAverageDescription": "Daily average per hour · local time",
1213
+ "topEntities": "Today's top entities",
1214
+ "topEntitiesDescription": "Most viewed today",
1215
+ "trend": "Usage trend",
1216
+ "platformFilter": "Platform",
1217
+ "platformAll": "All platforms",
1218
+ "platformWebMobile": "Web mobile",
1219
+ "platformWebPc": "Web PC",
1220
+ "platformDesktop": "Desktop",
1221
+ "currentPlatform": {
1222
+ "title": "Current platform",
1223
+ "web-mobile": "Mobile",
1224
+ "web-pc": "PC",
1225
+ "desktop": "Desktop"
1226
+ },
1227
+ "platformPill": {
1228
+ "web-mobile": "Web · Mobile",
1229
+ "web-pc": "Web · PC",
1230
+ "desktop": "Desktop"
1231
+ },
1232
+ "exposureMode": "Time counting",
1233
+ "exposureDirect": "Direct",
1234
+ "exposureAssociated": "Associated",
1235
+ "exposureTotal": "Total",
1236
+ "exposureTime": {
1237
+ "direct": "Direct time",
1238
+ "associated": "Associated time",
1239
+ "total": "Total time"
1240
+ },
1241
+ "exposureModeNote": "Totals, trends, and share percentages above count direct sessions only. Rankings below use the selected mode."
1242
+ },
1243
+ "insight": {
1244
+ "moreThanPeriod": "{{duration}} more than {{period}}",
1245
+ "lessThanPeriod": "{{duration}} less than {{period}}",
1246
+ "sameAsPeriod": "Same as {{period}}",
1247
+ "comparison": {
1248
+ "yesterday": "yesterday",
1249
+ "lastWeek": "last week",
1250
+ "prior7Days": "the prior 7 days",
1251
+ "lastMonth": "last month",
1252
+ "lastYear": "last year"
1253
+ }
1254
+ },
1255
+ "entityExposure": {
1256
+ "totalTime": "{{duration}} watched",
1257
+ "views_one": "{{count}} view",
1258
+ "views_other": "{{count}} views",
1259
+ "lastViewed": "Last viewed {{time}}"
1260
+ },
1261
+ "leaderboard": {
1262
+ "entityAll": "All",
1263
+ "entityResources": "Resources",
1264
+ "entityCharacters": "Characters",
1265
+ "entityDocuments": "Documents",
1266
+ "entityPlugins": "Content plugins",
1267
+ "empty": "No usage for this period.",
1268
+ "viewsShort_one": "{{count}} view",
1269
+ "viewsShort_other": "{{count}} views",
1270
+ "associatedSessionsShort": "{{count}} associated",
1271
+ "rankLabel": "Rank {{rank}}"
1272
+ },
1273
+ "periods": {
1274
+ "today": "Today",
1275
+ "last7days": "7 days",
1276
+ "thisWeek": "This week",
1277
+ "thisMonth": "This month",
1278
+ "thisYear": "This year",
1279
+ "all": "All time"
1280
+ }
1281
+ },
1282
+ "trace": {
1283
+ "title": "Footprints",
1284
+ "description": "Append-only log of your actions — imports, exports, deletes, restores and votes. Rows keep the entity names, so they survive hard deletes.",
1285
+ "timelineTitle": "Timeline",
1286
+ "filterAll": "All",
1287
+ "filters": {
1288
+ "import": "Imports",
1289
+ "export": "Exports",
1290
+ "softDelete": "Trash",
1291
+ "restore": "Restores",
1292
+ "hardDelete": "Hard deletes",
1293
+ "dislikeAdd": "Dislikes",
1294
+ "dislikeCancel": "Vote undo",
1295
+ "messageCreate": "Messages",
1296
+ "messageSoftDelete": "Message deletes",
1297
+ "messageRestore": "Message restores",
1298
+ "messageHardDelete": "Permanent deletes",
1299
+ "messageVoteAdd": "Votes",
1300
+ "messageVoteCancel": "Vote undo",
1301
+ "messageVoteSwap": "Vote swaps",
1302
+ "documentCreate": "Document creates",
1303
+ "documentCommit": "Document updates",
1304
+ "documentSoftDelete": "Document trashes",
1305
+ "documentRestore": "Document restores",
1306
+ "documentHardDelete": "Document deletes",
1307
+ "characterCreate": "Character creates",
1308
+ "characterSoftDelete": "Character trashes",
1309
+ "characterRestore": "Character restores",
1310
+ "characterHardDelete": "Character deletes",
1311
+ "group": {
1312
+ "resource": "Resources",
1313
+ "messages": "Messages",
1314
+ "document": "Documents",
1315
+ "character": "Characters"
1316
+ }
1317
+ },
1318
+ "actions": {
1319
+ "import": "Imported {{name}}",
1320
+ "export": "Exported {{name}}",
1321
+ "softDelete": "Moved {{name}} to trash",
1322
+ "restore": "Restored {{name}}",
1323
+ "hardDelete": "Permanently deleted {{name}}",
1324
+ "dislikeAdd": "Disliked {{name}}",
1325
+ "dislikeCancel": "Undid the dislike on {{name}}",
1326
+ "messageCreate": "Left a message: \"{{name}}\"",
1327
+ "messageSoftDelete": "Deleted message \"{{name}}\"",
1328
+ "messageRestore": "Restored message \"{{name}}\"",
1329
+ "messageHardDelete": "Permanently deleted message \"{{name}}\"",
1330
+ "messageVoteAddLike": "Liked message \"{{name}}\"",
1331
+ "messageVoteAddDislike": "Disliked message \"{{name}}\"",
1332
+ "messageVoteCancelLike": "Undid the like on \"{{name}}\"",
1333
+ "messageVoteCancelDislike": "Undid the dislike on \"{{name}}\"",
1334
+ "messageVoteSwapLike": "Switched to liking \"{{name}}\"",
1335
+ "messageVoteSwapDislike": "Switched to disliking \"{{name}}\"",
1336
+ "documentCreate": "Created document \"{{name}}\"",
1337
+ "documentCommit": "Updated document \"{{name}}\"",
1338
+ "documentSoftDelete": "Moved document \"{{name}}\" to trash",
1339
+ "documentRestore": "Restored document \"{{name}}\"",
1340
+ "documentHardDelete": "Permanently deleted document \"{{name}}\"",
1341
+ "characterCreate": "Created character \"{{name}}\"",
1342
+ "characterSoftDelete": "Moved character \"{{name}}\" to trash",
1343
+ "characterRestore": "Restored character \"{{name}}\"",
1344
+ "characterHardDelete": "Permanently deleted character \"{{name}}\""
1345
+ },
1346
+ "meta": {
1347
+ "bulk": "Batch",
1348
+ "source": "From {{name}}",
1349
+ "fileCount_one": "{{count}} file",
1350
+ "fileCount_other": "{{count}} files"
1351
+ },
1352
+ "overview": {
1353
+ "title": "Period overview",
1354
+ "today": "Today",
1355
+ "last7days": "7 days",
1356
+ "thisMonth": "This month",
1357
+ "thisYear": "This year",
1358
+ "actions": {
1359
+ "today": "Actions today",
1360
+ "last7days": "Actions this week",
1361
+ "thisMonth": "Actions this month",
1362
+ "thisYear": "Actions this year"
1363
+ },
1364
+ "busiestKind": "Busiest kind",
1365
+ "restores": "Restores",
1366
+ "weekTotal": "Week total",
1367
+ "avgPerDay": "Avg per day",
1368
+ "moreThanPrev": "{{count}} more than the previous period",
1369
+ "lessThanPrev": "{{count}} less than the previous period",
1370
+ "sameAsPrev": "Same as the previous period"
1371
+ },
1372
+ "today": "Today",
1373
+ "yesterday": "Yesterday",
1374
+ "loading": "Loading footprints…",
1375
+ "loadError": "Failed to load footprints",
1376
+ "empty": "No footprints yet. Imports, exports, deletes and dislike votes will be recorded here.",
1377
+ "count_one": "{{count}} footprint",
1378
+ "count_other": "{{count}} footprints"
1379
+ },
1380
+ "resources": {
1381
+ "title": "Resources",
1382
+ "upload": "Upload",
1383
+ "import": {
1384
+ "action": "Import",
1385
+ "title": "Import",
1386
+ "description": "Bring in a whole folder at once — every top-level entry becomes one resource."
1387
+ },
1388
+ "source": {
1389
+ "fallback": "Source link",
1390
+ "aria": "Open source: {{name}}"
1391
+ },
1392
+ "new": {
1393
+ "title": "Upload",
1394
+ "description": "Stage the files first — metadata can catch up.",
1395
+ "files": "Files",
1396
+ "filesDescription": "Dropped files stage immediately — reorder freely, nothing re-uploads.",
1397
+ "filesCount": "files",
1398
+ "basicInfo": "Basic info",
1399
+ "basicDescription": "What these files are, together.",
1400
+ "links": "Links",
1401
+ "linksDescription": "Tags, characters, and collections this resource belongs to.",
1402
+ "coverDescription": "Optional — picked from the first file by default.",
1403
+ "folder": {
1404
+ "sourceShared": "Browse shared folders",
1405
+ "sourceZip": "Choose an archive",
1406
+ "browseTitle": "Browse folder",
1407
+ "browseDescription": "Select the folder to scan.",
1408
+ "previewTitle": "Scan results",
1409
+ "previewDescription": "Review the items to import.",
1410
+ "resultTitle": "Import results",
1411
+ "scanHere": "Scan",
1412
+ "noSubdirs": "No subdirectories yet.",
1413
+ "uploading": "Uploading…",
1414
+ "extracting": "Extracting…",
1415
+ "scanning": "Scanning…",
1416
+ "sharedRoot": "Shared root",
1417
+ "zipRoot": "Archive root",
1418
+ "name": "Name",
1419
+ "type": "Type",
1420
+ "plugin": "Plugin",
1421
+ "confirmImport": "Import",
1422
+ "importing": "Importing…",
1423
+ "importDone": "Done",
1424
+ "resultScanned": "Scanned",
1425
+ "resultImported": "Imported",
1426
+ "resultFailed": "Failed",
1427
+ "sourceSharedDescription": "Pick a folder from the server's shared import roots.",
1428
+ "sourceSharedDisabled": "Shared folder import is not configured.",
1429
+ "sourceZipDescription": "A .zip — extracted on the server, then scanned.",
1430
+ "importingDescription": "Resources are being created from the selected folder. This may take a moment.",
1431
+ "stepSource": "Source",
1432
+ "stepBrowse": "Browse",
1433
+ "stepPreview": "Preview",
1434
+ "stepImport": "Import",
1435
+ "stepDone": "Done",
1436
+ "stepsAria": "Import steps",
1437
+ "emptyTitle": "This folder is empty.",
1438
+ "emptyDescription": "No files or folders to import here yet.",
1439
+ "previewCount_one": "{{count}} item ready to import",
1440
+ "previewCount_other": "{{count}} items ready to import",
1441
+ "howTitle": "How it works",
1442
+ "howScan": "Scan",
1443
+ "howScanMeta": "Every top-level entry is found and sized",
1444
+ "howPreview": "Preview",
1445
+ "howPreviewMeta": "Content type detected per entry, before anything is written",
1446
+ "howImport": "Import",
1447
+ "howImportMeta": "Progress per entry, with a summary at the end"
1448
+ },
1449
+ "name": "Name",
1450
+ "intro": "Intro",
1451
+ "plugin": "Plugin",
1452
+ "contentType": "Content type",
1453
+ "sourceName": "Source name",
1454
+ "sourceUrl": "Source URL",
1455
+ "sourceHint": "At least one is recommended so you can find where this came from.",
1456
+ "sourceNamePlaceholder": "e.g. a website or platform",
1457
+ "sourceUrlPlaceholder": "e.g. https://...",
1458
+ "introPlaceholder": "What this set is about.",
1459
+ "tags": "Tags",
1460
+ "characters": "Characters",
1461
+ "cover": "Cover",
1462
+ "collections": "Collections",
1463
+ "namePlaceholder": "Name",
1464
+ "useFilenameAsName": "Use filename as name",
1465
+ "oneFilePerResource": "One file per resource — each resource contains a single file.",
1466
+ "createdCount_one": "Created {{count}} resource",
1467
+ "createdCount_other": "Created {{count}} resources",
1468
+ "duplicatesFound_one": "This resource has {{count}} image duplicating existing resources: {{names}}",
1469
+ "duplicatesFound_other": "This resource has {{count}} images duplicating existing resources: {{names}}",
1470
+ "duplicateFileNames_one": "{{count}} file has a duplicate name in this batch — it will be renamed automatically (e.g. name-1.png)",
1471
+ "duplicateFileNames_other": "{{count}} files have duplicate names in this batch — they will be renamed automatically (e.g. name-1.png)",
1472
+ "submit": "Create",
1473
+ "uploading": "Uploading…",
1474
+ "errors": {
1475
+ "pickAtLeastOne": "Pick at least one file",
1476
+ "uploadFailed": "Upload failed",
1477
+ "stagingFailed_one": "{{count}} file failed to upload — remove it and try again",
1478
+ "stagingFailed_other": "{{count}} files failed to upload — remove them and try again",
1479
+ "attachCollectionsFailed": "Created the resource but failed to attach to one or more collections",
1480
+ "batchPartialHint": "If this stopped partway, some resources may already exist — check the list."
1481
+ },
1482
+ "created": "Created",
1483
+ "autoDetect": "Auto-detect"
1484
+ },
1485
+ "search": {
1486
+ "placeholder": "Search resources…",
1487
+ "empty": "No resources yet.",
1488
+ "trashEmpty": "No resources in trash yet.",
1489
+ "filters": "Filters",
1490
+ "sectionOptions": "Options",
1491
+ "sectionTags": "Tags",
1492
+ "sectionCharacters": "Characters",
1493
+ "sectionPlugins": "Plugins",
1494
+ "sectionSource": "Source",
1495
+ "sectionCollections": "Collections",
1496
+ "clearAll": "Clear all",
1497
+ "apply": "Search",
1498
+ "viewGrid": "Grid view",
1499
+ "viewMasonry": "Masonry view",
1500
+ "sourceLabel": "Source",
1501
+ "sourceAll": "All sources",
1502
+ "sortLabel": "Sort",
1503
+ "orderLabel": "Order",
1504
+ "sortCreated": "Created",
1505
+ "sortUpdated": "Updated",
1506
+ "sortDisliked": "Dislikes",
1507
+ "orderLatest": "Latest",
1508
+ "orderEarliest": "Earliest",
1509
+ "orderMost": "Most",
1510
+ "orderLeast": "Least",
1511
+ "noCharacters": "No characters",
1512
+ "dislikedOnly": "Only disliked",
1513
+ "trash": "Trash",
1514
+ "random": "Random",
1515
+ "pageSizeLabel": "Per page",
1516
+ "itemCount_one": "{{count}} resource",
1517
+ "itemCount_other": "{{count}} resources"
1518
+ },
1519
+ "bulk": {
1520
+ "select": "Select",
1521
+ "done": "Done",
1522
+ "toolbarCount": "{{count}} selected",
1523
+ "selectCurrentPage": "Select page",
1524
+ "invertCurrentPage": "Invert",
1525
+ "clearSelection": "Clear",
1526
+ "download": "Download",
1527
+ "downloadFailed": "Download failed.",
1528
+ "downloadRejected": "Could not build the archive (empty or invalid selection).",
1529
+ "downloadTooMany": "Select at most {{max}} resources to download at once.",
1530
+ "editTags": "Edit tags",
1531
+ "moveToTrash": "Trash",
1532
+ "deleteForever": "Delete forever",
1533
+ "confirmSoft_one": "Move {{count}} resource to trash?",
1534
+ "confirmSoft_other": "Move {{count}} resources to trash?",
1535
+ "softDeleteDescription": "The selected resources will be moved to the recycle bin. They can be restored later from the trash.",
1536
+ "hardDeleteTitle": "Delete selected forever?",
1537
+ "hardDeleteDescription": "This permanently deletes the selected resources and moves their folders to local trash. This cannot be undone.",
1538
+ "hardDeleteConfirm": "Delete forever",
1539
+ "hardDeleteDeleting": "Deleting…",
1540
+ "toastAllOk_one": "Updated {{count}} resource.",
1541
+ "toastAllOk_other": "Updated {{count}} resources.",
1542
+ "toastAllFailed": "Nothing was updated ({{count}} failed).",
1543
+ "toastPartial": "{{ok}} succeeded, {{failed}} failed."
1544
+ },
1545
+ "actions": {
1546
+ "editBasic": "Basic info",
1547
+ "editCharacters": "Linked characters",
1548
+ "editTags": "Tags",
1549
+ "editCollections": "Collections",
1550
+ "editCover": "Cover",
1551
+ "download": "Download",
1552
+ "openMessages": "Messages",
1553
+ "extend": "Extend",
1554
+ "dislike": "Dislike",
1555
+ "dislikeCancellable": "Undoable",
1556
+ "restore": "Restore",
1557
+ "hardDelete": "Delete forever",
1558
+ "softDelete": "Move to trash",
1559
+ "actionsAria": "Actions for {{name}}"
1560
+ },
1561
+ "hardDelete": {
1562
+ "title": "Delete forever?",
1563
+ "description": "This permanently deletes the resource and moves its folder to local trash.",
1564
+ "confirm": "Delete forever",
1565
+ "deleting": "Deleting…"
1566
+ },
1567
+ "toast": {
1568
+ "movedToTrash": "Moved to trash",
1569
+ "deleteFailed": "Could not delete",
1570
+ "restored": "Restored",
1571
+ "restoreFailed": "Could not restore",
1572
+ "deletedForever": "Deleted forever",
1573
+ "disliked": "Disliked",
1574
+ "dislikeRemoved": "Dislike removed",
1575
+ "dislikeFailed": "Could not update dislike"
1576
+ },
1577
+ "preview": {
1578
+ "aria": "Preview: {{name}}",
1579
+ "closePreview": "Close preview",
1580
+ "enterFullscreen": "Enter fullscreen",
1581
+ "exitFullscreen": "Exit fullscreen"
1582
+ },
1583
+ "detail": {
1584
+ "docSearchTitle": "In documents",
1585
+ "emptyInline": "Empty resource",
1586
+ "notFound": "Resource not found",
1587
+ "fileCount_one": "{{count}} file",
1588
+ "fileCount_other": "{{count}} files",
1589
+ "sourceFrom": "From {{name}}",
1590
+ "openSidebar": "Open sidebar",
1591
+ "fullscreen": "Fullscreen",
1592
+ "anniversary_one": "In the library for {{count}} year",
1593
+ "anniversary_other": "In the library for {{count}} years",
1594
+ "sidebar": {
1595
+ "tagsHeading": "Tags",
1596
+ "colEmpty": "No other resources in this collection yet.",
1597
+ "noTags": "No tags assigned yet.",
1598
+ "relatedByTagsHeading": "Related by tags",
1599
+ "similarImagesHeading": "Similar images",
1600
+ "duplicateImagesHeading": "Duplicates",
1601
+ "similarWithinHeading": "Similar within this resource",
1602
+ "imageMatchCount_one": "{{count}} matching file",
1603
+ "imageMatchCount_other": "{{count}} matching files",
1604
+ "duplicateCount_one": "{{count}} duplicate file",
1605
+ "duplicateCount_other": "{{count}} duplicate files",
1606
+ "intraSimilarCount_one": "{{count}} similar file",
1607
+ "intraSimilarCount_other": "{{count}} similar files",
1608
+ "matchSimilarity": "{{name}} · {{percent}}% similar",
1609
+ "similarity": "{{percent}}% similar"
1610
+ }
1611
+ },
1612
+ "editDialog": {
1613
+ "aria": "Edit resource basic info",
1614
+ "plugin": "Plugin",
1615
+ "contentTypeMissing": "Missing: {{names}}",
1616
+ "name": "Name",
1617
+ "intro": "Intro",
1618
+ "sourceName": "Source name",
1619
+ "sourceUrl": "Source address",
1620
+ "sourceHint": "At least one is recommended so you can find where this came from.",
1621
+ "namePlaceholder": "e.g. Harbor at Dusk",
1622
+ "introPlaceholder": "What this resource is about.",
1623
+ "sourceNamePlaceholder": "e.g. a website or platform",
1624
+ "sourceUrlPlaceholder": "e.g. https://...",
1625
+ "saveChanges": "Save changes",
1626
+ "toast": {
1627
+ "contentTypeFailed": "Could not change content type"
1628
+ }
1629
+ },
1630
+ "editHub": {
1631
+ "title": "Edit - {{name}}"
1632
+ },
1633
+ "tagsDialog": {
1634
+ "title": "Edit tags - {{name}}"
1635
+ },
1636
+ "selectorDialog": {
1637
+ "title": "Select resource"
1638
+ },
1639
+ "viewSelected": "Only selected",
1640
+ "viewSelectedTooMany": "Only selected supports up to {{max}} items",
1641
+ "picker": {
1642
+ "selectedEmpty": "No selected resources.",
1643
+ "loadFailed": "Failed to load resource."
1644
+ },
1645
+ "selectAria": "Select {{name}}",
1646
+ "toggleSelectAria": "Toggle selection for {{name}}",
1647
+ "video": {
1648
+ "previewAria": "Preview {{name}}",
1649
+ "playAria": "Play {{name}}",
1650
+ "stopAria": "Stop {{name}}"
1651
+ },
1652
+ "audio": {
1653
+ "playAria": "Play {{name}}",
1654
+ "pauseAria": "Pause {{name}}",
1655
+ "seekAria": "Seek within {{name}}"
1656
+ },
1657
+ "editPanel": {
1658
+ "nameRequired": "Name is required"
1659
+ }
1660
+ },
1661
+ "relationshipTypes": {
1662
+ "panel": {
1663
+ "empty": "No relationships yet. Tap add to create one.",
1664
+ "addDialogTitle": "Add relationship",
1665
+ "editDialogTitle": "Edit relationship",
1666
+ "filterPlaceholder": "Filter relationship types",
1667
+ "linkCount_one": "{{count}} link",
1668
+ "linkCount_other": "{{count}} links",
1669
+ "reorderMode": "Reorder",
1670
+ "reorderModeAria": "Enable drag-and-drop to reorder relationships",
1671
+ "tabDefinition": "Definition",
1672
+ "tabDetails": "Details"
1673
+ },
1674
+ "preview": {
1675
+ "characterA": "Character A",
1676
+ "characterB": "Character B",
1677
+ "aCallsB": "A is B's",
1678
+ "bCallsA": "B is A's",
1679
+ "labelPlaceholder": "e.g. friend"
1680
+ },
1681
+ "kind": {
1682
+ "directed": {
1683
+ "label": "Directed",
1684
+ "iconLabel": "One-way",
1685
+ "hint": "One-way relationship from A to B only, e.g. unrequited love."
1686
+ },
1687
+ "symmetric": {
1688
+ "label": "Symmetric",
1689
+ "iconLabel": "Mutual",
1690
+ "hint": "Mutual relationship, e.g. friends or spouses."
1691
+ },
1692
+ "hierarchical": {
1693
+ "label": "Hierarchical",
1694
+ "iconLabel": "Ranked",
1695
+ "hint": "A above B, direction A→B, e.g. mentor and apprentice"
1696
+ }
1697
+ },
1698
+ "delete": {
1699
+ "kindLabel": "relationship",
1700
+ "usageLabelOne": "relationship link",
1701
+ "usageLabel": "relationship links"
1702
+ },
1703
+ "toast": {
1704
+ "created": "Relationship created",
1705
+ "createFailed": "Could not create relationship"
1706
+ }
1707
+ },
1708
+ "traits": {
1709
+ "panel": {
1710
+ "empty": "No trait definitions yet. Use Add to create one.",
1711
+ "addDialogTitle": "Add trait",
1712
+ "editDialogTitle": "Edit trait",
1713
+ "filterPlaceholder": "Filter traits",
1714
+ "reorderMode": "Reorder",
1715
+ "reorderModeAria": "Enable drag-and-drop to reorder traits",
1716
+ "toast": {
1717
+ "added": "Trait added"
1718
+ }
1719
+ },
1720
+ "kind": {
1721
+ "text": "Text",
1722
+ "multitext": "Multi-text",
1723
+ "number": "Number",
1724
+ "weight": "Weight",
1725
+ "height": "Height",
1726
+ "date": "Date"
1727
+ },
1728
+ "delete": {
1729
+ "kindLabel": "trait",
1730
+ "usageLabelOne": "character",
1731
+ "usageLabel": "characters"
1732
+ },
1733
+ "values": {
1734
+ "noDefinitions": "No trait definitions yet. Open Settings / Traits to add them.",
1735
+ "addField": "Add field",
1736
+ "removeField": "Remove field",
1737
+ "inputPlaceholder": "Enter value",
1738
+ "remove": "Remove",
1739
+ "allSet": "All traits already set.",
1740
+ "emptyError": "These traits are empty and cannot be saved: {{names}}",
1741
+ "parseError": "Invalid value for \"{{name}}\": {{value}}",
1742
+ "date": {
1743
+ "prefixPlaceholder": "Era / calendar",
1744
+ "after": "CE",
1745
+ "before": "BCE",
1746
+ "year": "Year",
1747
+ "month": "Month",
1748
+ "day": "Day"
1749
+ }
1750
+ }
1751
+ },
1752
+ "categories": {
1753
+ "panel": {
1754
+ "empty": "No categories or tags yet.",
1755
+ "kindTabsAria": "Category kind",
1756
+ "kindTab": {
1757
+ "common": "Common",
1758
+ "resource": "Resources",
1759
+ "character": "Characters"
1760
+ },
1761
+ "dependencyMessage": "This tag is used by {{parts}} and cannot be deleted directly.",
1762
+ "dependencyResources": "{{count}} res",
1763
+ "dependencyCharacters": "{{count}} char",
1764
+ "tagCharacterCount": "char {{count}}",
1765
+ "tagResourceCount": "res {{count}}",
1766
+ "copyTagName": "Copy to clipboard",
1767
+ "toast": {
1768
+ "added": "Added",
1769
+ "addFailed": "Could not add",
1770
+ "copied": "Copied to clipboard",
1771
+ "copyFailed": "Could not copy",
1772
+ "moved": "Tag moved"
1773
+ },
1774
+ "mergeTagMenu": "Merge into…",
1775
+ "specialStyle": {
1776
+ "silver": "Silver",
1777
+ "gold": "Gold",
1778
+ "rainbow": "Rainbow",
1779
+ "oilslick": "Oilslick",
1780
+ "kintsugi": "Kintsugi"
1781
+ }
1782
+ },
1783
+ "delete": {
1784
+ "kindLabelCategory": "category",
1785
+ "kindLabelTag": "tag",
1786
+ "usageLabelTagsOne": "tag",
1787
+ "usageLabelTags": "tags"
1788
+ },
1789
+ "form": {
1790
+ "createCategory": "Create category",
1791
+ "creating": "Creating…",
1792
+ "addTag": "Create tag"
1793
+ },
1794
+ "dialog": {
1795
+ "addCategoryTitle": "New category",
1796
+ "addTagTitle": "New tag",
1797
+ "editCategoryTitle": "Edit category",
1798
+ "editTagTitle": "Edit tag"
1799
+ }
1800
+ },
1801
+ "tags": {
1802
+ "picker": {
1803
+ "noCategories": "No categories yet.",
1804
+ "selectedHeader": "Selected:",
1805
+ "tagsHeader": "Tags:",
1806
+ "empty": "No tags in this category yet.",
1807
+ "emptyAll": "No tags defined yet.",
1808
+ "searchPlaceholder": "Search tags…",
1809
+ "noMatches": "No matching tags."
1810
+ },
1811
+ "bulk": {
1812
+ "nonCommonHint_one": "{{count}} tag is not shared by all selected items. You can add any tag; only shared tags can be removed.",
1813
+ "nonCommonHint_other": "{{count}} tags are not shared by all selected items. You can add any tag; only shared tags can be removed."
1814
+ },
1815
+ "toast": {
1816
+ "attachFailed": "Could not attach tag",
1817
+ "detachFailed": "Could not detach tag"
1818
+ },
1819
+ "filterMode": {
1820
+ "and": "All",
1821
+ "or": "Any",
1822
+ "not": "Not",
1823
+ "nor": "Nor"
1824
+ },
1825
+ "merge": {
1826
+ "title": "Merge tags",
1827
+ "description": "The duplicate's usage and rules move to the survivor.",
1828
+ "targetPlaceholder": "Choose the surviving tag",
1829
+ "confirm": "Confirm merge",
1830
+ "confirming": "Merging…",
1831
+ "countResources_one": "{{count}} resource",
1832
+ "countResources_other": "{{count}} resources",
1833
+ "countCharacters_one": "{{count}} character",
1834
+ "countCharacters_other": "{{count}} characters",
1835
+ "countSiblingRules_one": "{{count}} sibling rule",
1836
+ "countSiblingRules_other": "{{count}} sibling rules",
1837
+ "countParentRules_one": "{{count}} parent rule",
1838
+ "countParentRules_other": "{{count}} parent rules",
1839
+ "preview": "Moves {{resources}}, {{characters}}, {{siblingRules}} and {{parentRules}}.",
1840
+ "collision": "This category already has a tag named \"{{name}}\" — you can merge them.",
1841
+ "offer": "Merge with the duplicate",
1842
+ "toast": {
1843
+ "success": "Merged: {{resources}}, {{characters}}, {{siblingRules}}, {{parentRules}}"
1844
+ }
1845
+ },
1846
+ "rules": {
1847
+ "description": "Aliases: several tags render as one display tag everywhere (e.g. \"cat\" & \"kitten\" → \"cat\"). Parents: an entry tagged with the child also carries the parent (e.g. \"tabby\" → \"cat\"). Characters can join either side: a linked character renders as its tag, so resources attached to it show the tag weakened (marked virtual) and match its searches.",
1848
+ "displayLabel": "display tag",
1849
+ "badPlaceholder": "synonym",
1850
+ "goodPlaceholder": "display tag",
1851
+ "addAlias": "Add alias",
1852
+ "alias": "Alias",
1853
+ "addAliasDescription": "Pick the synonym and the display tag it shows as.",
1854
+ "aliasesTitle": "Aliases",
1855
+ "groupCount_one": "{{count}} group",
1856
+ "groupCount_other": "{{count}} groups",
1857
+ "setDisplay": "Set as display tag",
1858
+ "remove": "Remove",
1859
+ "pickCharacter": "Character…",
1860
+ "pickTag": "Tag…",
1861
+ "tagPickTitle": "Pick a tag",
1862
+ "characterLinkHint": "Character links: a character renders as its tag — resources attached to the character show it weakened (marked virtual) and match its searches.",
1863
+ "empty": "No sibling groups yet.",
1864
+ "displaysAs": "Shows as {{name}}",
1865
+ "groupCounts": "{{resources}} res · {{characters}} char",
1866
+ "parentsTitle": "Parents",
1867
+ "ruleCount_one": "{{count}} rule",
1868
+ "ruleCount_other": "{{count}} rules",
1869
+ "child": "Child",
1870
+ "childPlaceholder": "child",
1871
+ "parentPlaceholder": "parent",
1872
+ "addRule": "Add rule",
1873
+ "addRuleDescription": "Pick the child and the parent it shows under.",
1874
+ "endpointTag": "Tag",
1875
+ "endpointCharacter": "Character",
1876
+ "parentsEmpty": "No parent rules yet.",
1877
+ "noMatch": "No matching rules.",
1878
+ "searchPlaceholder": "Filter rules…",
1879
+ "toast": {
1880
+ "pairAdded": "Sibling pair added",
1881
+ "pairRemoved": "Sibling pair removed",
1882
+ "displaySet": "Display tag set",
1883
+ "parentAdded": "Parent rule added",
1884
+ "parentRemoved": "Parent rule removed"
1885
+ }
1886
+ },
1887
+ "errors": {
1888
+ "nameExists": "A tag with this name already exists in this category.",
1889
+ "siblingCycle": "That combination would create a loop.",
1890
+ "siblingKindIsolation": "A sibling group may combine common with only one other kind (resource and character tags cannot mix).",
1891
+ "parentSelf": "A tag cannot be its own parent.",
1892
+ "parentCycle": "That rule would create a loop.",
1893
+ "parentKindIsolation": "A parent chain may combine common with only one other kind (resource and character tags cannot mix).",
1894
+ "characterMissing": "The character no longer exists — pick a live one.",
1895
+ "mergeKindMismatch": "Cannot merge tags of different kinds (resource and character tags cannot merge).",
1896
+ "mergeCreatesCycle": "The merge would create a rule loop — adjust the related rules first."
1897
+ },
1898
+ "virtual": {
1899
+ "label": "virtual"
1900
+ }
1901
+ },
1902
+ "imageEdit": {
1903
+ "confirmDeleteTitle": "Remove image?",
1904
+ "confirmDeleteDescription": "This will remove the current image. This action cannot be undone."
1905
+ },
1906
+ "deleteEntity": {
1907
+ "dialogConfirmTitle": "Delete “{{name}}”?",
1908
+ "dialogConfirmDescription": "This will permanently delete this {{kind}}. This action cannot be undone.",
1909
+ "defaultLabel": "Delete",
1910
+ "defaultNoun": "items",
1911
+ "defaultNounOne": "item",
1912
+ "confirm": "Confirm delete",
1913
+ "deleting": "Deleting…",
1914
+ "forceTitle": "Cannot delete {{kind}}",
1915
+ "usageMessage": "This {{kind}} is used by {{count}} {{usage}} and cannot be deleted directly.",
1916
+ "toast": {
1917
+ "deleteSuccess": "{{kind}} deleted",
1918
+ "deleteFailed": "Delete failed",
1919
+ "forceDeleteSuccess": "{{kind}} force-deleted",
1920
+ "forceDeleteFailed": "Force delete failed",
1921
+ "nameMismatch": "Name does not match"
1922
+ },
1923
+ "forceConfirm": "Force delete",
1924
+ "forceDeleting": "Deleting…"
1925
+ },
1926
+ "upload": {
1927
+ "addFiles": "Add files",
1928
+ "clearAll": "Clear",
1929
+ "totalCount_one": "{{count}} file in total",
1930
+ "totalCount_other": "{{count}} files in total",
1931
+ "removeFile": "Remove file",
1932
+ "failed": "Failed",
1933
+ "duplicateName": "Duplicate name",
1934
+ "duplicateNameTitle": "Another file in this batch has the same name; it will be renamed automatically on upload"
1935
+ },
1936
+ "messages": {
1937
+ "title": "Messages",
1938
+ "empty": "No messages yet.",
1939
+ "threadCount_one": "{{count}} thread",
1940
+ "threadCount_other": "{{count}} threads",
1941
+ "replyCount_one": "{{count}} reply",
1942
+ "replyCount_other": "{{count}} replies",
1943
+ "floor": "#{{n}}",
1944
+ "replyNumber": "#{{n}}",
1945
+ "composerPlaceholder": "Write a message…",
1946
+ "replyPlaceholder": "Write a reply…",
1947
+ "submit": "Post",
1948
+ "submitting": "Posting…",
1949
+ "reply": "Reply",
1950
+ "actions": "Message actions",
1951
+ "trash": "Trash",
1952
+ "emptyTrash": "No messages in trash yet.",
1953
+ "deleted": "Deleted",
1954
+ "delete": "Delete",
1955
+ "deleteConfirmTitle": "Delete this message?",
1956
+ "deleteConfirmDescription": "It will be moved to trash. You can restore it later.",
1957
+ "restore": "Restore",
1958
+ "hardDelete": "Delete permanently",
1959
+ "hardDeleteConfirmTitle": "Delete permanently?",
1960
+ "hardDeleteConfirmDescription": "Cannot be undone. Deleting a floor removes all its replies.",
1961
+ "viewReplies": "View replies ({{count}})",
1962
+ "collapseReplies": "Collapse replies",
1963
+ "sortBy": "Sort",
1964
+ "sort": {
1965
+ "newest": "Newest",
1966
+ "oldest": "Oldest",
1967
+ "mostLikes": "Most likes",
1968
+ "leastLikes": "Least likes"
1969
+ },
1970
+ "searchPlaceholder": "Search messages…",
1971
+ "totalLabel_one": "{{count}} message",
1972
+ "totalLabel_other": "{{count}} messages",
1973
+ "clearFilter": "Clear filter",
1974
+ "charsRemaining_one": "{{count}} character left",
1975
+ "charsRemaining_other": "{{count}} characters left",
1976
+ "linkCharactersAdd": "Attach character",
1977
+ "linkResources": "Link resources",
1978
+ "linkResourcesAdd": "Attach resource",
1979
+ "toast": {
1980
+ "posted": "Message posted",
1981
+ "postFailed": "Could not post message",
1982
+ "deleted": "Moved to trash",
1983
+ "restored": "Message restored",
1984
+ "hardDeleted": "Permanently deleted",
1985
+ "voteFailed": "Could not record vote"
1986
+ }
1987
+ },
1988
+ "storage": {
1989
+ "sectionTitle": "Storage",
1990
+ "sectionDescription": "How much disk space your archive occupies, broken down by category.",
1991
+ "volumeTotal": "Disk total",
1992
+ "volumeFree": "Free",
1993
+ "volumeUsed": "Used",
1994
+ "sidebarUsed": "Used {{size}}",
1995
+ "sidebarFree": "{{size}} free",
1996
+ "volumeUnavailable": "Volume info unavailable",
1997
+ "usedByHoardodile": "hoardodile usage",
1998
+ "category": {
1999
+ "database": "Database",
2000
+ "resources": "Resources",
2001
+ "archived": "Archived copies",
2002
+ "cache": "Cache",
2003
+ "trash": "Trash",
2004
+ "backups": "Backups",
2005
+ "other": "Other",
2006
+ "unattributedResources": "Unattributed resources"
2007
+ },
2008
+ "otherHint": "Logs, installed plugins, session key, and other host-local state not listed above.",
2009
+ "unattributedCount_one": "{{count}} resource without recorded size",
2010
+ "unattributedCount_other": "{{count}} resources without recorded sizes",
2011
+ "unattributedHint": "These resources have no recorded size metadata yet (disk-measured estimate, includes covers and other extras). Run precache to attribute them to the plugins above.",
2012
+ "archivedHint": "Copies of resources, characters and documents frozen in archived versions. Measured by a disk scan, so this counts every historical copy — unlike the resource sizes above, which come from metadata of the current version only.",
2013
+ "backupsHint": "Manual backups and automatic daily snapshots.",
2014
+ "cacheHint": "Per-resource covers, thumbnails, previews, extraction caches and files-cache.json.",
2015
+ "lowSpaceBanner": "Low disk space — automatic snapshots are paused. Free some space to resume them.",
2016
+ "clearCache": "Clear",
2017
+ "clearCacheTitle": "Clear cache",
2018
+ "clearCacheDescription": "Thumbnails, previews and extraction caches will be wiped. They are rebuilt on demand — this only frees space.",
2019
+ "pluginCount_one": "{{count}} resource",
2020
+ "pluginCount_other": "{{count}} resources",
2021
+ "legend": {
2022
+ "resources": "Resources",
2023
+ "hostData": "Host data",
2024
+ "archivedVersions": "Archived versions",
2025
+ "cache": "Cache",
2026
+ "latest": "Latest"
2027
+ }
2028
+ },
2029
+ "sync": {
2030
+ "pageHint": "Per device: records entity counts, content size and storage volume · keeps the two most recent snapshots",
2031
+ "status": {
2032
+ "allUpToDate": "All devices up to date",
2033
+ "dueCount_one": "{{count}} of {{total}} device due",
2034
+ "dueCount_other": "{{count}} of {{total}} devices due"
2035
+ },
2036
+ "tip": {
2037
+ "oneWay": "Sync one-way: one master repository, the rest as mirrors, to avoid conflicts."
2038
+ },
2039
+ "config": {
2040
+ "remindLabel": "Remind me after",
2041
+ "remindDescription": "Past the interval without a synced snapshot, the dashboard asks.",
2042
+ "remindDays_one": "{{count}} day",
2043
+ "remindDays_other": "{{count}} days"
2044
+ },
2045
+ "devices": {
2046
+ "addTitle": "Add a device",
2047
+ "addAutoRecord": "The current state is synced automatically once added.",
2048
+ "namePlaceholder": "Device name",
2049
+ "notesPlaceholder": "Notes (optional)",
2050
+ "nameHint": "e.g. Laptop",
2051
+ "notesHint": "e.g. USB 4TB",
2052
+ "add": "Add device",
2053
+ "addPending": "Adding…",
2054
+ "empty": "No devices yet — add one to start syncing.",
2055
+ "loading": "Loading…",
2056
+ "neverSynced": "Never synced",
2057
+ "lastSyncedAgo_one": "Last synced {{date}} · {{count}} day ago",
2058
+ "lastSyncedAgo_other": "Last synced {{date}} · {{count}} days ago",
2059
+ "justNow": "Just now",
2060
+ "minutesAgo_one": "{{count}} minute ago",
2061
+ "minutesAgo_other": "{{count}} minutes ago",
2062
+ "hoursAgo_one": "{{count}} hour ago",
2063
+ "hoursAgo_other": "{{count}} hours ago",
2064
+ "upToDate": "Up to date",
2065
+ "overdue_one": "Overdue · {{count}} day",
2066
+ "overdue_other": "Overdue · {{count}} days",
2067
+ "neverBadge": "Not synced yet",
2068
+ "record": "Sync",
2069
+ "recordNow": "Sync now",
2070
+ "deleteTitle": "Delete {{name}}?",
2071
+ "deleteDescription": "The device and all of its sync records will be removed.",
2072
+ "delete": "Delete",
2073
+ "deletePending": "Deleting…",
2074
+ "editTitle": "Edit device",
2075
+ "edit": "Edit",
2076
+ "save": "Save",
2077
+ "editPending": "Saving…"
2078
+ },
2079
+ "fields": {
2080
+ "resources": "Resources",
2081
+ "characters": "Characters",
2082
+ "documents": "Documents",
2083
+ "messages": "Messages",
2084
+ "tags": "Tags",
2085
+ "trash": "Trash",
2086
+ "contentSize": "Content size",
2087
+ "storage": "Storage",
2088
+ "firstRecord": "First sync"
2089
+ },
2090
+ "toast": {
2091
+ "deviceAdded": "Device added and synced",
2092
+ "deviceAddFailed": "Could not add device",
2093
+ "deviceUpdated": "Device updated",
2094
+ "deviceUpdateFailed": "Could not update device",
2095
+ "deviceDeleted": "Device deleted",
2096
+ "deviceDeleteFailed": "Could not delete device",
2097
+ "recorded": "Synced",
2098
+ "recordFailed": "Could not sync"
2099
+ },
2100
+ "banner": {
2101
+ "noDevicesTitle": "No sync devices configured yet.",
2102
+ "noDevicesDescription": "Add at least one device to track syncs.",
2103
+ "configureLink": "Set up",
2104
+ "neverSyncedTitle": "{{name}} has never been synced",
2105
+ "neverSyncedDescription": "No sync recorded for this device yet.",
2106
+ "overdueTitle_one": "{{name}} last synced {{count}} day ago",
2107
+ "overdueTitle_other": "{{name}} last synced {{count}} days ago",
2108
+ "overdueDescription": "It's been longer than your {{count}}-day reminder interval.",
2109
+ "recordLink": "Sync now"
2110
+ }
2111
+ },
2112
+ "desktopShell": {
2113
+ "tray": {
2114
+ "open": "Open",
2115
+ "changeLibrary": "Change library…",
2116
+ "copyLanAddress": "Copy LAN address",
2117
+ "restartServer": "Restart server",
2118
+ "updateReady": "Update ready — Open to restart",
2119
+ "updateReadyResources": "Resources update ready — Open to apply",
2120
+ "quit": "Quit",
2121
+ "tooltipServerStopped": "hoardodile — server stopped",
2122
+ "tooltipUpdateReady": "hoardodile — update ready",
2123
+ "copied": "LAN address copied to the clipboard."
2124
+ },
2125
+ "errorPage": {
2126
+ "serverError": "The server could not be reached. It may still be starting, or it may have stopped. Wait a moment and press Retry, or use Restart server from the tray.",
2127
+ "devServerError": "The development server is not running. Start `pnpm dev` in another terminal, then press Retry."
2128
+ },
2129
+ "dialog": {
2130
+ "lanPasswordRequired": "Set an admin password first before enabling local network access.",
2131
+ "cancel": "Cancel",
2132
+ "serverStoppedBody": "The server stopped. Use Restart server from the tray.",
2133
+ "serverNotRunningMessage": "The server is not running.",
2134
+ "restartServer": "Restart server",
2135
+ "serverFailedToStart": "Server failed to start:\n{{message}}"
2136
+ },
2137
+ "shell": {
2138
+ "serverUnreachable": "Server unreachable",
2139
+ "retry": "Retry",
2140
+ "loadingLabel": "Loading"
2141
+ },
2142
+ "wizard": {
2143
+ "title": "Welcome to hoardodile",
2144
+ "intro": "Choose where this computer keeps the archive. You can change the folder later from Settings or the tray.",
2145
+ "library": "Library folder",
2146
+ "browse": "Browse",
2147
+ "autoStart": "Start with Windows",
2148
+ "autoStartHint": "Open hoardodile when you sign in.",
2149
+ "startInTray": "Start in tray",
2150
+ "startInTrayHint": "No window until you choose Open from the tray.",
2151
+ "continue": "Continue",
2152
+ "missingBridge": "Desktop bridge missing. Restart the app."
2153
+ }
2154
+ }
2155
+ }