@meith/i18n 0.15.0 → 0.17.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meith/i18n",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "description": "The message catalog and the locale-aware formatters: ICU messages, plural categories, locale negotiation, and the registry themes and plugins add their own catalogs to.",
5
5
  "license": "LGPL-3.0-or-later",
6
6
  "repository": {
@@ -146,6 +146,12 @@
146
146
  "admin.none": "— none —",
147
147
  "admin.remove": "Remove",
148
148
  "admin.saved": "Saved.",
149
+ "admin.undo": "Undo",
150
+ "admin.undoExpired": "This undo has expired, was already used, or belongs to another admin.",
151
+ "admin.undoInvalid": "The undo request is invalid.",
152
+ "admin.undoSucceeded": "The admin action was undone.",
153
+ "admin.undoUnavailable": "Undo is unavailable while the board uses sample data.",
154
+ "admin.undoUntil": "Undo is available until {time}.",
149
155
  "adminAction.codeReplayed": "That code has been used already. Wait for the next one.",
150
156
  "adminAction.codeWrong": "That code is not right.",
151
157
  "adminAction.twoFactorRequired": "This board requires two-factor authentication of anyone who can reach the control panel. Set up an authenticator app on your account security page first.",
@@ -470,6 +476,27 @@
470
476
  "adminLog.everything": "Everything",
471
477
  "adminLog.filter": "Filter",
472
478
  "adminLog.from": "from {address}",
479
+ "adminMarketplace.browseLede": "The meith.dev catalog, cached on this board and checked against what this build actually contains. Nothing here installs anything.",
480
+ "adminMarketplace.browsePluginsTitle": "Browse plugins",
481
+ "adminMarketplace.browseThemesTitle": "Browse themes",
482
+ "adminMarketplace.emptyPlugins": "The catalog has no plugin listings right now.",
483
+ "adminMarketplace.emptyThemes": "The catalog has no theme listings right now.",
484
+ "adminMarketplace.graduationLink": "This board can't install anything itself — moving to a custom board",
485
+ "adminMarketplace.installDocsLink": "More about the marketplace",
486
+ "adminMarketplace.installSteps": "To install this on your own board:",
487
+ "adminMarketplace.installedVersion": "This board runs {version}.",
488
+ "adminMarketplace.lastFetched": "Catalog fetched {time}",
489
+ "adminMarketplace.neverFetched": "The catalog has not been fetched yet — it refreshes once a day, or press Refresh.",
490
+ "adminMarketplace.repository": "Source",
491
+ "adminMarketplace.status.active": "Active",
492
+ "adminMarketplace.status.incompatible": "Incompatible",
493
+ "adminMarketplace.status.installedDisabled": "Installed — disabled",
494
+ "adminMarketplace.status.notInstalled": "Not installed",
495
+ "adminMarketplace.status.updateAvailable": "Update available",
496
+ "adminMarketplace.tab.browse": "Browse",
497
+ "adminMarketplace.tab.installed": "Installed",
498
+ "adminMarketplace.tabsLabel": "Installed and Browse",
499
+ "adminMarketplace.unreachable": "The catalog could not be loaded — unreachable, or it did not answer with a feed this board understands. The installed list above is still accurate; try Refresh, or check the feed URL under Settings → Marketplace.",
473
500
  "adminNav.admin-antispam.blurb": "The honeypot, the question, the limits, and first-post moderation.",
474
501
  "adminNav.admin-antispam.title": "Anti-spam",
475
502
  "adminNav.admin-api-tokens.blurb": "Issue and revoke tokens, and see what each one may reach.",
@@ -562,6 +589,8 @@
562
589
  "adminPanel.mail.testNote": "Goes to the address on your own account, through the configuration the board has {saved} — so save any changes below first, or you will be testing the old one. A provider that rejects the message says why, and that message is shown here verbatim.",
563
590
  "adminPanel.mail.testNoteSaved": "saved",
564
591
  "adminPanel.mail.title": "How this board sends mail",
592
+ "adminPanel.marketplace.refresh": "Refresh",
593
+ "adminPanel.marketplace.refreshed": "Catalog refreshed.",
565
594
  "adminPanel.password": "Password",
566
595
  "adminPanel.plugin.advanced": " · advanced",
567
596
  "adminPanel.plugin.clearFailures": "Clear failures and re-enable",
@@ -740,6 +769,8 @@
740
769
  "adminSystem.task.countersReconcile.title": "Reconcile denormalised counters",
741
770
  "adminSystem.task.groupsExpire.description": "Deletes secondary group memberships whose expiry has passed and bumps the permission version so derived caches follow. Actor assembly already excludes a lapsed row, so access ended on time regardless — this tidies the table rather than enforcing the boundary, and a doubled tick deletes nothing twice.",
742
771
  "adminSystem.task.groupsExpire.title": "Expire timed group memberships",
772
+ "adminSystem.task.marketplaceRefreshCatalog.description": "Fetches the marketplace feed, validates it and caches it for the admin panel's Browse tab, then notifies administrators once per plugin version that becomes available for the first time. A board with no outbound network fails this quietly — logged, not alarmed — and the Browse tab falls back to a plain note that the catalog is unreachable.",
773
+ "adminSystem.task.marketplaceRefreshCatalog.title": "Refresh the plugin and theme catalog",
743
774
  "adminSystem.task.outboxRelay.description": "Moves committed events from the outbox onto the queue. Runs most frequently because user-visible side effects (notifications, search indexing) wait on it.",
744
775
  "adminSystem.task.outboxRelay.title": "Relay domain events",
745
776
  "adminSystem.task.postsRenderBackfill.description": "Rewrites the stored HTML of posts rendered by an older version of the renderer, and converts any body still stored as BBCode. A stale render is rendered live on read, so this never gates correctness — it stops a renderer change, or an import that wrote none, from making every thread page pay for it. Idempotent, and its own progress marker is the row.",
@@ -1012,6 +1043,20 @@
1012
1043
  "adminUsers.ban": "Ban",
1013
1044
  "adminUsers.banned": "Banned",
1014
1045
  "adminUsers.bannedStateLede": "This member is banned. Lift the ban below to change their state — flipping the column here would leave the ban record active.",
1046
+ "adminUsers.bulkAction": "Bulk action",
1047
+ "adminUsers.bulkApply": "Apply to selected",
1048
+ "adminUsers.bulkBan": "Ban selected",
1049
+ "adminUsers.bulkBanned": "Selected members were banned.",
1050
+ "adminUsers.bulkChoose": "Choose a bulk action.",
1051
+ "adminUsers.bulkGroup": "Add selected to a secondary group",
1052
+ "adminUsers.bulkGrouped": "Selected members were added to the group.",
1053
+ "adminUsers.bulkInvalid": "Select between 1 and 500 members.",
1054
+ "adminUsers.bulkPrune": "Add selected to prune confirmation",
1055
+ "adminUsers.bulkReason": "Shared staff reason",
1056
+ "adminUsers.bulkSelect": "Select {username}",
1057
+ "adminUsers.bulkSelectPage": "Select all members on this page",
1058
+ "adminUsers.bulkSelf": "You cannot include your own account in this bulk action.",
1059
+ "adminUsers.bulkStale": "One or more selected accounts no longer exist or are closed. Refresh and try again.",
1015
1060
  "adminUsers.clear": "Clear",
1016
1061
  "adminUsers.deleted": "deleted",
1017
1062
  "adminUsers.edit": "Edit",
@@ -1054,6 +1099,7 @@
1054
1099
  "adminUsers.pruneLede": "Closes dormant accounts in batches. It will never touch anybody who has posted — including posts still held for approval or already removed — anybody in a staff group or any group carrying staff powers, any forum moderator, or a banned account. Those are exclusions rather than options, because closing one of them does damage a date filter cannot justify.",
1055
1100
  "adminUsers.pruneMemberMeta": "— {email}, registered {date}",
1056
1101
  "adminUsers.pruneNoMatches": "Nothing matches. Every account registered before that date has written something, is staff, moderates a forum, or is banned.",
1102
+ "adminUsers.pruneReview": "Review selected accounts",
1057
1103
  "adminUsers.search": "Search",
1058
1104
  "adminUsers.sharedNetwork": "{count, plural, one {# other account on the same network. A household, an office and a campus all look like this.} other {# other accounts on the same network. A household, an office and a campus all look like this.}}",
1059
1105
  "adminUsers.shownToMember": "Shown to them: {reason}",
@@ -1347,6 +1393,9 @@
1347
1393
  "composer.attachment.uploading": "Uploading…",
1348
1394
  "composer.attachments.hint": "Drop files here, or choose up to {count, plural, one {# file} other {# files}} of {size} each — PNG, JPEG, PDF or ZIP. Images are re-encoded, which removes any metadata they carry.",
1349
1395
  "composer.attachments.label": "Attachments",
1396
+ "composer.autosave.failed": "Autosave failed. Use Save draft to keep this version on the server.",
1397
+ "composer.autosave.saved": "Saved just now.",
1398
+ "composer.autosave.saving": "Saving…",
1350
1399
  "composer.draftSaved": "Draft saved.",
1351
1400
  "composer.edit.delete": "Delete this post",
1352
1401
  "composer.edit.deleteBlurb": "Deleting hides this post from the thread. A moderator can put it back.",
@@ -1387,6 +1436,10 @@
1387
1436
  "composer.newThread.noPrefix": "None",
1388
1437
  "composer.newThread.option": "Option {number}",
1389
1438
  "composer.newThread.optional": "Optional",
1439
+ "composer.newThread.pollChoices": "Options each member may pick",
1440
+ "composer.newThread.pollChoicesHint": "1 for a single choice, or 0 for no limit.",
1441
+ "composer.newThread.pollPublic": "Show who voted for what",
1442
+ "composer.newThread.pollRevote": "Let members change their vote",
1390
1443
  "composer.newThread.prefix": "Prefix",
1391
1444
  "composer.newThread.prefixOptional": "Prefix (optional)",
1392
1445
  "composer.newThread.question": "Question",
@@ -1400,6 +1453,9 @@
1400
1453
  "composer.preview": "Preview",
1401
1454
  "composer.previewEmpty": "Nothing to preview yet.",
1402
1455
  "composer.previewFailed": "The preview could not be rendered. Your post is untouched — switch back to Write.",
1456
+ "composer.recovery.available": "A newer unsent version was recovered from this browser.",
1457
+ "composer.recovery.discard": "Discard",
1458
+ "composer.recovery.restore": "Restore",
1403
1459
  "composer.rendering": "Rendering…",
1404
1460
  "composer.reply.draftSaved": "Draft saved",
1405
1461
  "composer.reply.quick": "Quick reply",
@@ -1827,13 +1883,24 @@
1827
1883
  "error.moderation.warning-type-exist": "That warning type does not exist.",
1828
1884
  "error.moderation.whole-thread-move-instead-splitting": "That is the whole thread. Move it instead of splitting it.",
1829
1885
  "error.notFound": "That page could not be found.",
1886
+ "error.polls.already-voted": "You have already voted in this poll.",
1887
+ "error.polls.choice-limit": "A poll may allow between 1 and {max} choices, or no limit.",
1888
+ "error.polls.choose-at-most": "Choose at most {max} options.",
1889
+ "error.polls.choose-option": "Choose at least one option.",
1830
1890
  "error.polls.choose-rating-from-1-5": "Choose a rating from 1 to 5.",
1891
+ "error.polls.edit-poll": "You may not edit this poll.",
1892
+ "error.polls.edit-window": "A poll may only be edited within {minutes} minutes of being posted.",
1831
1893
  "error.polls.option-count": "A poll needs 2–{max} options.",
1832
1894
  "error.polls.option-length": "A poll option may be at most {max} characters.",
1895
+ "error.polls.option-not-on-poll": "That option is not on this poll.",
1896
+ "error.polls.poll-closed": "That poll is closed.",
1833
1897
  "error.polls.poll-closed-already-voted": "That poll is closed or you have already voted.",
1898
+ "error.polls.poll-exist": "That poll does not exist.",
1834
1899
  "error.polls.poll-must-close-future": "A poll must close in the future.",
1835
1900
  "error.polls.poll-options-must-distinct": "Poll options must be distinct.",
1901
+ "error.polls.public-after-voting": "Voters cannot be made public once voting has started.",
1836
1902
  "error.polls.question-length": "A poll question must be 1–{max} characters.",
1903
+ "error.polls.remove-voted-option": "An option that already has votes cannot be removed.",
1837
1904
  "error.polls.thread-exist": "That thread does not exist.",
1838
1905
  "error.polls.thread-ratings-switched-off": "Thread ratings are switched off.",
1839
1906
  "error.polls.vote-polls": "You may not vote in polls.",
@@ -2050,6 +2117,8 @@
2050
2117
  "installPreflight.warning.other": "You can install without resolving those. Nothing will fail at the time — which is what makes them worth reading.",
2051
2118
  "legal.page.privacy.footer": "Privacy",
2052
2119
  "legal.page.privacy.title": "Privacy policy",
2120
+ "legal.page.rules.footer": "Rules & FAQ",
2121
+ "legal.page.rules.title": "Rules & FAQ",
2053
2122
  "legal.page.terms.footer": "Terms",
2054
2123
  "legal.page.terms.title": "Terms of service",
2055
2124
  "mail.action.fallback": "If the button does not work, open this address in your browser:",
@@ -2230,6 +2299,8 @@
2230
2299
  "notice.pushUnsubscribed": "This browser will no longer receive pushed notifications.",
2231
2300
  "notification.mail.boardFallback": "the forum",
2232
2301
  "notification.mail.greeting": "Hello {username},",
2302
+ "notification.marketplace.update_available.description": "The daily catalog fetch finds a newer, compatible version of a plugin this board runs. Sent once per version, whether or not anybody installs it.",
2303
+ "notification.marketplace.update_available.title": "An installed plugin has a newer listed version",
2233
2304
  "notification.pm.receipt.description": "Somebody opens a private message you sent with a read receipt requested. Raised once, on the first read.",
2234
2305
  "notification.pm.receipt.title": "A message you asked to track is read",
2235
2306
  "notification.pm.received.description": "Somebody sends you a private message. The notification carries who from and the subject, never the message itself.",
@@ -2246,6 +2317,8 @@
2246
2317
  "notification.render.digest.subject": "Your {cadence} digest: {posts, plural, one {# post} other {# posts}} in {threads, plural, one {# thread} other {# threads}}",
2247
2318
  "notification.render.digest.weekly": "weekly",
2248
2319
  "notification.render.generic": "Notification: {kind}",
2320
+ "notification.render.marketplace.body": "Version {version} of {package} is now listed in the marketplace catalog. See the Browse tab on /admin/plugins for the install steps.",
2321
+ "notification.render.marketplace.subject": "{name} has a new version: {version}",
2249
2322
  "notification.render.mentioned.body": "{by} mentioned you by name in a post in {title}.",
2250
2323
  "notification.render.mentioned.subject": "{by} mentioned you in {title}",
2251
2324
  "notification.render.occurrences": "{subject} ({count} times)",
@@ -2295,6 +2368,12 @@
2295
2368
  "offline.kicker": "Offline",
2296
2369
  "offline.logIn": "Log in",
2297
2370
  "offline.title": "The board is closed",
2371
+ "onboarding.dismiss": "Dismiss",
2372
+ "onboarding.firstPost.cta": "Read the rules & FAQ",
2373
+ "onboarding.firstPost.message": "Before you post, here's a quick heads-up.",
2374
+ "onboarding.profile.cta": "Complete your profile",
2375
+ "onboarding.profile.message": "Add a photo and a short bio so other members know who they're talking to.",
2376
+ "onboarding.welcome.message": "Welcome! Have a look around, and post whenever you're ready.",
2298
2377
  "page.account-security": "Account security",
2299
2378
  "page.add-forum": "Add a forum",
2300
2379
  "page.add-group": "Add a group",
@@ -2337,6 +2416,7 @@
2337
2416
  "page.create-account": "Create account",
2338
2417
  "page.create-account-2": "Create your account",
2339
2418
  "page.custom-directives": "Custom directives",
2419
+ "page.edit-poll": "Edit poll",
2340
2420
  "page.edit-post": "Edit post",
2341
2421
  "page.email-cannot-be-unsent": "An email cannot be unsent.",
2342
2422
  "page.email-contains": "Email contains",
@@ -2468,6 +2548,7 @@
2468
2548
  "page.required-without-it-prune-matches": "Required. Without it a prune matches everybody.",
2469
2549
  "page.reset-password": "Reset password",
2470
2550
  "page.reset-password-2": "Reset your password",
2551
+ "page.rules-faq": "Rules & FAQ",
2471
2552
  "page.run-it": "Run it",
2472
2553
  "page.running-this-server": "Running on this server",
2473
2554
  "page.scheduled-tasks": "Scheduled tasks",
@@ -2550,8 +2631,30 @@
2550
2631
  "page.write-message": "Write a message",
2551
2632
  "panel.otherPanels": "Other panels",
2552
2633
  "panel.sections": "Sections",
2634
+ "pollEdit.allowRevote": "Let members change their vote",
2635
+ "pollEdit.back": "Back to the thread",
2636
+ "pollEdit.closesAt": "Closing time",
2637
+ "pollEdit.closesAtHint": "Times are UTC. Leave it empty for a poll that stays open.",
2638
+ "pollEdit.lede": "Options may be added at any time. One that already has votes cannot be removed.",
2639
+ "pollEdit.maxOptions": "Options each member may pick",
2640
+ "pollEdit.maxOptionsHint": "1 for a single choice, or 0 for no limit.",
2641
+ "pollEdit.option": "Option {number}",
2642
+ "pollEdit.optionEmpty": "No votes yet. Clear the label to remove it.",
2643
+ "pollEdit.optionVoted": "{count, plural, one {# vote} other {# votes}}. It can no longer be removed.",
2644
+ "pollEdit.publicVotes": "Show who voted for what",
2645
+ "pollEdit.publicVotesHint": "It cannot be switched on once voting has started.",
2646
+ "pollEdit.question": "Question",
2647
+ "pollEdit.save": "Save poll",
2648
+ "pollForm.changeVote": "Change your vote",
2649
+ "pollForm.chooseAny": "Choose as many options as you like.",
2650
+ "pollForm.chooseUpTo": "Choose up to {max} options.",
2651
+ "pollForm.closed": "Voting has closed.",
2652
+ "pollForm.edit": "Edit poll",
2553
2653
  "pollForm.label": "Poll",
2654
+ "pollForm.moreVoters": "and {count, plural, one {# other} other {# others}}",
2655
+ "pollForm.publicNotice": "Your name is shown beside what you vote for.",
2554
2656
  "pollForm.vote": "Vote",
2657
+ "pollForm.votedBy": "Voted for by {names}",
2555
2658
  "pollForm.votes": "{count, plural, one {# vote} other {# votes}}",
2556
2659
  "postForm.backToForum": "Back to {forum}",
2557
2660
  "postForm.backToThread": "Back to the thread",
@@ -2559,6 +2662,17 @@
2559
2662
  "postForm.editPost": "Edit post",
2560
2663
  "postForm.newThread": "Post a new thread in {forum}",
2561
2664
  "postForm.reply": "Reply to {thread}",
2665
+ "postHistory.back": "Back to post",
2666
+ "postHistory.comparePrevious": "Compare with previous",
2667
+ "postHistory.comparing": "Comparing revision {from} with {to}",
2668
+ "postHistory.confirmRollback": "I understand this creates a new revision",
2669
+ "postHistory.current": "Current version",
2670
+ "postHistory.editedBy": "By {username}, {date}",
2671
+ "postHistory.lede": "See what changed and who made each edit.",
2672
+ "postHistory.revision": "Revision {revision}",
2673
+ "postHistory.revisions": "All revisions",
2674
+ "postHistory.rollback": "Restore this version",
2675
+ "postHistory.title": "Post revision history",
2562
2676
  "presence.invisible": "{count, plural, one {# browsing invisibly.} other {# browsing invisibly.}}",
2563
2677
  "presence.reading": "Reading {title}",
2564
2678
  "presence.somewhere": "Somewhere on the board",
@@ -2639,8 +2753,8 @@
2639
2753
  "setting.antispam.upload_per_hour.label": "Uploads per hour",
2640
2754
  "setting.board.description.description": "Used as the default meta description for the board index.",
2641
2755
  "setting.board.description.label": "Board description",
2642
- "setting.board.legacy_redirects.description": "Answer MyBB addresses — showthread.php, forumdisplay.php, member.php, index.php, and the rewritten Thread-Title-91, Thread-Title--4102 and Forum-Name-3 forms — with a permanent redirect (308) to the imported content. Needs an import: the redirect is a lookup in the legacy id map.",
2643
- "setting.board.legacy_redirects.label": "Redirect old MyBB URLs",
2756
+ "setting.board.legacy_redirects.description": "Answer legacy addresses — MyBB’s showthread.php forms and rewritten routes, plus phpBB’s viewtopic.php, viewforum.php and memberlist.php — with a permanent redirect (308) to the imported content. Needs an import: the redirect is a lookup in the legacy id map.",
2757
+ "setting.board.legacy_redirects.label": "Redirect old forum URLs",
2644
2758
  "setting.board.logo_alt.description": "What a screen reader announces in place of the logo. Leave empty to use the board name, which is usually what the logo says anyway.",
2645
2759
  "setting.board.logo_alt.label": "Logo alt text",
2646
2760
  "setting.board.logo_dark.description": "Used when the reader is in dark mode. Falls back to the light one.",
@@ -2695,6 +2809,7 @@
2695
2809
  "setting.group.federation": "Sign-in providers",
2696
2810
  "setting.group.legal": "Legal",
2697
2811
  "setting.group.mail": "Mail",
2812
+ "setting.group.marketplace": "Marketplace",
2698
2813
  "setting.group.posting": "Posting",
2699
2814
  "setting.group.push": "Push",
2700
2815
  "setting.group.registration": "Registration",
@@ -2703,6 +2818,8 @@
2703
2818
  "setting.group.security": "Security",
2704
2819
  "setting.legal.privacy.description": "Markdown, published at /privacy and linked from the footer. Emptied, the page and the link go. It ships as a template describing what this software does by default — your host, your mail provider and anything you have added are yours to describe.",
2705
2820
  "setting.legal.privacy.label": "Privacy policy",
2821
+ "setting.legal.rules.description": "Markdown, published at /rules and linked from the footer. Left empty by default — a board explains itself in its own terms, not a template. Once published, the first-post onboarding guidance links new members to it.",
2822
+ "setting.legal.rules.label": "Rules & FAQ",
2706
2823
  "setting.legal.terms.description": "Markdown, published at /terms and linked from the footer. Registration asks the visitor to accept it before the account is created, so emptying this box takes the page, the footer link and the checkbox away together. What ships is a template written to be replaced: read it, make it say what your community actually does, and take advice on it if it matters.",
2707
2824
  "setting.legal.terms.label": "Terms of service",
2708
2825
  "setting.mail.from.description": "The address every message comes from. It must be on a domain the provider has verified — a sender the provider does not recognise is rejected outright, and the rejection is not retried because it would fail identically every time.",
@@ -2725,6 +2842,8 @@
2725
2842
  "setting.mail.smtp_username.label": "SMTP username",
2726
2843
  "setting.mail.transport.description": "A provider’s JSON API, an SMTP server, or nothing at all. \"Not sending\" writes each message to the server log and delivers none of them — which is the right default for a board nobody has configured yet, and a broken board the moment registration asks anybody to confirm an address.",
2727
2844
  "setting.mail.transport.label": "How mail is sent",
2845
+ "setting.marketplace.feed_url.description": "Where the daily catalog fetch and the Browse tab’s Refresh button read the marketplace feed from. The default is meith.dev’s own curated feed; point it at a self-hosted mirror serving the same /v1.json shape to run a private catalog instead. The board fetches this address itself — a member’s browser never does.",
2846
+ "setting.marketplace.feed_url.label": "Catalog feed URL",
2728
2847
  "setting.posting.edit_grace_seconds.description": "Seconds after posting during which an author fixing their own post leaves no \"edited by\" notice on it. 0 always shows the notice. A moderator editing somebody else's post is never silent, however soon it happens, and the revision history records every edit either way — this hides the line under the post, nothing else.",
2729
2848
  "setting.posting.edit_grace_seconds.label": "Silent edit window",
2730
2849
  "setting.posting.flood_seconds.description": "Minimum seconds between posts by one user. 0 disables the check. Users with \"bypass flood check\" are exempt.",