feat(design): the Copy rule — names, verbs, dates and units (E28 S3g)

The owner's picks (all the recommended options) become DESIGN.md's Copy
chapter and a sweep of both languages (742 values, no key drift):

- One name per feature: the rail's label, which may shorten it (Alerts
  -> Notifications, Fiókok -> Felhasználók, Download Center -> Downloads,
  Channel manager -> Channels); one "sync from YouTube" verb.
- Four verbs, four meanings (Delete / Remove / Dismiss / Discard, and
  their Hungarian pairs), checked against what each action does.
- Sentence case, the app's places capitalised; "…" on a command that
  asks first (a popover or form title got its own key without it);
  one-sentence messages without a stop or a tick, "Couldn't …"; curly
  quotes.
- Dates only from lib/format.ts, in the UI language: formatDateTime
  names the month and stops at the minute (it printed "9/27/2026,
  8:30:14 AM"), formatDateTimeSec for the log, the audit and the
  recorder; ui/RelativeTime pairs "3d ago" with the exact minute on
  hover. local/date-format refuses toLocale*String and Intl date
  formatters elsewhere.
- Units from Intl, short (formatUnit): runtimes, totals, the Scheduler
  countdown, the stats range, the player's tap skip. "2h 13m" was
  English in both languages.
- src/i18n/copyRule.test.ts holds the machine-readable part (quotes,
  "...", ticks, bare unit letters).
This commit is contained in:
2026-09-27 05:46:17 +02:00
parent 2c65edfffd
commit bd6aaa1e43
100 changed files with 1193 additions and 964 deletions
+11 -11
View File
@@ -1,6 +1,6 @@
{
"actionsLabel": "Catalog actions",
"syncSubscriptions": "Read subscriptions from YouTube",
"syncSubscriptions": "Sync subscriptions from YouTube",
"syncSubscriptionsHint": "Re-import your subscription list from YouTube — adds channels you've newly followed and drops ones you've unfollowed. The videos themselves keep syncing automatically in the background; this does not re-fetch them.",
"backfillEverything": "Backfill everything",
"backfillEverythingHint": "Request full back-catalog backfill for every channel you're subscribed to. Older videos and search become complete as the shared daily quota allows — this can take a while.",
@@ -31,8 +31,8 @@
"needWriteHint": "Enable playlist editing in Settings to subscribe on YouTube.",
"subscribedTitle": "Subscribed on YouTube",
"subscribedBody": "You're now following {{name}} — its new uploads will start arriving in your Feed.",
"subscribeFailed": "Subscribe failed",
"confirmSubscribe": "Subscribe to \"{{name}}\" on YouTube? This changes your real YouTube account and spends a little API quota.",
"subscribeFailed": "Couldn't subscribe",
"confirmSubscribe": "Subscribe to “{{name}}” on YouTube? This changes your real YouTube account and spends a little API quota.",
"cols": {
"totalVideos": "Videos",
"inPlaylists": "In playlists",
@@ -54,8 +54,8 @@
"noneYet": "No tags yet — create one below.",
"create": "Create tag",
"createPlaceholder": "New tag…",
"createFailed": "Could not create the tag.",
"updateFailed": "Could not update the tag.",
"createFailed": "Couldn't create the tag",
"updateFailed": "Couldn't update the tag",
"noTag": "No tag",
"moreCount_one": "{{count}} more tag",
"moreCount_other": "{{count}} more tags",
@@ -102,7 +102,7 @@
},
"row": {
"openOnYouTube": "Open on YouTube",
"editTags": "Edit tags",
"editTags": "Edit tags…",
"filterFeedByTag": "Filter the Feed by “{{name}}”",
"priorityHint": "Your ranking for this channel. Sort the Feed by “Channel priority” to bring higher-priority channels to the top.",
"fullHint": "Full history fetched.",
@@ -126,20 +126,20 @@
},
"notify": {
"synced": "Synced {{count}} subscriptions",
"syncFailed": "Subscription sync failed",
"syncFailed": "Couldn't sync subscriptions",
"unsubscribed": "Unsubscribed from {{name}} on YouTube",
"unsubscribeFailed": "Unsubscribe failed",
"unsubscribeFailed": "Couldn't unsubscribe",
"fullHistoryRequested": "Full history requested for {{count}} channels",
"fullHistoryFailed": "Couldn't request full history",
"needYouTube": "Connect your YouTube account to do this.",
"needYouTube": "Connect your YouTube account to do this",
"connect": "Connect",
"filteredByTag": "Feed filtered by tag: {{name}}",
"resetDone": "{{name}} reset — re-fetching now",
"resetFailed": "Couldn't reset this channel",
"hidden": "“{{name}}” hidden from your Feed"
},
"confirmUnsubscribe": "Unsubscribe from \"{{name}}\" on YouTube? This changes your real YouTube account. To just remove it from your Feed, hide it instead.",
"confirmReset": "Re-fetch \"{{name}}\" from scratch? This re-runs its backfill (recent + full history) and spends some API quota.",
"confirmUnsubscribe": "Unsubscribe from “{{name}}” on YouTube? This changes your real YouTube account. To just remove it from your Feed, hide it instead.",
"confirmReset": "Re-fetch “{{name}}” from scratch? This re-runs its backfill (recent + full history) and spends some API quota.",
"searchPlaceholder": "Search channels…",
"blocked": {
"title": "Blocked channels",