@goodfellow-cms/admin 0.7.0 → 0.9.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.
@@ -0,0 +1,2018 @@
1
+ import { createContext, useContext, useMemo } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/strings.tsx
4
+ /**
5
+ * Every piece of text the admin panel shows, so it can be reworded or
6
+ * translated. `{name}` placeholders are filled in when the text is used.
7
+ * Puck's own editor text is translated separately, with its `dictionary`.
8
+ */
9
+ const defaultStrings = {
10
+ "app.title": "Site admin",
11
+ "app.viewSite": "View site",
12
+ "nav.pages": "Pages",
13
+ "nav.collections": "Collections",
14
+ "nav.media": "Media",
15
+ "nav.blocks": "Blocks",
16
+ "nav.layout": "Header & Footer",
17
+ "nav.settings": "Site Settings",
18
+ "nav.menu": "Menu",
19
+ loading: "Loading…",
20
+ "setup.noBackend": "This site's settings don't say where the site is stored, so the admin panel can't open it. A developer needs to add a backend to goodfellow.config.tsx.",
21
+ "signIn.title": "Sign in to edit this site",
22
+ "signIn.intro": "The site is stored on {host}. Sign in with a {host} account that's allowed to change it.",
23
+ "signIn.redirect": "Sign in with {host}",
24
+ "signIn.orToken": "Or sign in with an access token",
25
+ "signIn.token.title": "Sign in with an access token",
26
+ "signIn.token.step1": "Create an access token on {host}. This link opens {host} with the right settings already chosen:",
27
+ "signIn.token.create": "Create a token on {host}",
28
+ "signIn.token.createBroad": "Create a broader token instead",
29
+ "signIn.token.createBroadHint": "Use this if the site belongs to someone else and the first link doesn't let you choose it. This kind of token can change everything your account can.",
30
+ "signIn.token.apiTokenHint": "Use this if you can't create a token for the site itself. Paste your Atlassian account's email address, a colon, then the token, such as name@example.org:ATATT3x…, and give the token permission to read and write repositories, pull requests and pipelines.",
31
+ "signIn.token.chooseSite": "If {host} asks what the token can access, choose this site.",
32
+ "signIn.token.step2": "Copy the token and paste it here:",
33
+ "signIn.token.label": "Access token",
34
+ "signIn.remember": "Stay signed in on this device",
35
+ "signIn.rememberHint": "Leave this off on shared or public computers.",
36
+ "signIn.submit": "Sign in",
37
+ "signIn.checking": "Signing in…",
38
+ "signIn.error.invalid": "That sign-in didn't work. Check that the whole token was copied and that it hasn't expired.",
39
+ "signIn.error.no-access": "That account can't see this site. Make sure the token was given access to it.",
40
+ "signIn.error.cant-publish": "That account can see the site but isn't allowed to change it. Ask the site's owner to give it permission.",
41
+ "signIn.error.redirect-failed": "Signing in didn't finish. Try again.",
42
+ "signIn.error.not-installed": "Goodfellow isn't installed on this site on {host} yet, so editors can't sign in with {host}. If you own the site, install it now, which signs you in too. Otherwise, ask an owner to, or sign in with an access token.",
43
+ "signIn.error.no-address": "Signing in with {host} needs the site's address in Site settings. Sign in with an access token for now, and add the address there.",
44
+ "signIn.error.wrong-address": "Signing in with {host} works only at the site's own address, as Site settings give it. Sign in there, or with an access token here.",
45
+ "signIn.error.local-address": "Signing in with {host} works only on the published site. Sign in with an access token here.",
46
+ "signIn.error.not-owner": "That account isn't an owner of this site on {host}.",
47
+ "signIn.error.unavailable": "Signing in with {host} isn't available right now, perhaps because it's been used as much as it can be today. Sign in with an access token instead.",
48
+ "signIn.install": "Install Goodfellow on {host}",
49
+ "signIn.error.expired": "You were signed out because your sign-in expired. Sign in again to keep editing.",
50
+ "signIn.error.other": "Couldn't reach {host}. Check your connection and try again.",
51
+ "signIn.app.intro": "Sign in with your account on this site to edit it.",
52
+ "signIn.app.button": "Sign in",
53
+ "signIn.app.expired": "You've been signed out. Sign in again to keep editing.",
54
+ "signIn.app.notAllowed": "You're signed in, but your account isn't allowed to edit this site. Ask one of its owners to give you access.",
55
+ "signIn.app.error": "Couldn't reach the site. Check your connection and try again.",
56
+ "owners.only": "Only the site's owners can change this.",
57
+ "owners.onlyHint": "Ask one of them if something here needs changing.",
58
+ "account.signedInAs": "Signed in as {name}",
59
+ "account.signOut": "Sign out",
60
+ "deploy.building": "Updating the live site…",
61
+ "deploy.live": "The live site is up to date",
62
+ "deploy.failed": "The live site couldn't be updated",
63
+ "build.why": "What went wrong?",
64
+ "build.title": "Why the live site wasn't updated",
65
+ "build.saved": "Your changes are published and saved. Visitors see the site as it was until it's rebuilt, which every publish tries again.",
66
+ "build.notStarted": "{host} didn't start rebuilding the site. That usually means the account the site belongs to has used up its free build minutes for the month, or its billing on {host} needs attention. One of the site's owners can check the account's billing settings on {host}.",
67
+ "build.install": "The site's packages couldn't be installed, so it couldn't be rebuilt. That's sometimes a passing problem with the service the packages come from, so publishing again later may work. If it keeps happening, a developer needs to look at the details.",
68
+ "build.pages": "{host} Pages isn't set up for the site, so there's nowhere to put it online. One of the site's owners needs to turn it on in the site's settings on {host}, under Pages.",
69
+ "build.deploy": "The site was rebuilt, but {host} couldn't put it online. That's usually a passing problem, so the next publish may work. If it keeps happening, check the site's Pages settings on {host}.",
70
+ "build.host": "A problem on {host}'s side stopped the rebuild. That's usually a passing problem, so the next publish may work.",
71
+ "build.content": "The site couldn't be rebuilt, because {file} has a problem. Fix it in the admin panel, or put back a version that worked from its version history.",
72
+ "build.contentHistory": "Version history of {file}",
73
+ "build.codeChanged": "The site couldn't be rebuilt after its blocks changed. Undo the change under Blocks, by removing what was just added or adding back what was removed, and ask a developer to look at the details.",
74
+ "build.blocks": "Go to Blocks",
75
+ "build.codeFile": "The site's code couldn't be rebuilt: there's a problem in {file}. A developer needs to look at the details.",
76
+ "build.code": "The site couldn't be rebuilt. A developer needs to look at the details.",
77
+ "build.unknown": "{host} didn't say why the rebuild failed. Its details may help a developer.",
78
+ "build.hostDetails": "See the details on {host}",
79
+ "loadError.title": "The admin panel couldn't open this site",
80
+ "outdatedAdminPage.title": "This site's admin page needs updating",
81
+ "outdatedAdminPage.message": "This site's admin page is from before the editor kept blocks away from your sign-in, so the admin panel doesn't open on it. Goodfellow's next update changes it, unless someone has changed the page. Whoever looks after the site's code can also change it now: the details say how.",
82
+ "outdatedAdminPage.details": "Run npx goodfellow-next update, or replace these files with the Next.js starter's, as they are below. The site's blocks then run in the editor's sandboxed frames, at /admin/editor/.",
83
+ "loadError.contentProblems": "Some of the site's files have problems, so they can't be edited until they're fixed.",
84
+ "loadError.other": "Something went wrong while loading the site. Check your connection and try again.",
85
+ "action.tryAgain": "Try again",
86
+ "action.cancel": "Cancel",
87
+ "action.close": "Close",
88
+ "action.reload": "Reload",
89
+ "action.undo": "Undo",
90
+ "action.redo": "Redo",
91
+ "action.undoHint": "Undo the last change (Ctrl+Z, or ⌘Z on a Mac)",
92
+ "action.redoHint": "Redo what you undid (Ctrl+Shift+Z, or ⇧⌘Z on a Mac)",
93
+ "details.show": "Details",
94
+ "publish.button": "Publish",
95
+ "editor.leftSidebar": "Show or hide blocks and outline",
96
+ "editor.rightSidebar": "Show or hide settings",
97
+ "editor.viewport": "Preview width",
98
+ "editor.viewport.full": "Full width",
99
+ "editor.viewport.tablet": "Tablet",
100
+ "editor.viewport.phone": "Phone",
101
+ "editor.failed": "The editor stopped working. Reload the page to start it again.",
102
+ "editor.frame": "Editing {title}",
103
+ "editor.choose": "Editor",
104
+ "editor.blockSearch": "Search blocks",
105
+ "editor.blockSearchNone": "No blocks match. Try another word, such as \"picture\" or \"columns\".",
106
+ "editor.blockSearchFound": "Blocks found",
107
+ "editor.standard": "Standard editor",
108
+ "editor.plugin.switchLoses": "Some of what you changed in {editor} can't be kept in the other editor, so switching now leaves behind everything you changed since you opened {editor}. Switch anyway?\n\n{problems}",
109
+ "editor.plugin.pageSettings": "The page's settings",
110
+ "editor.plugin.problem": "{block}: {message}",
111
+ "editor.plugin.problemField": "{block}, {field}: {message}",
112
+ "editor.plugin.loading": "Opening {editor}…",
113
+ "editor.plugin.failed": "{editor} didn't start. Choose the standard editor to keep editing.",
114
+ "editor.invalid": "The editor gave back something this site can't publish, so nothing was published. Reload the page and try again.",
115
+ "editor.plugin.invalid": "{editor} gave back something this site can't publish, so nothing was published. Try again, or choose the standard editor.",
116
+ "publish.publishing": "Publishing…",
117
+ "publish.done": "Published.",
118
+ "publish.conflict": "Someone else changed the site since you opened this page, so your changes weren't published. Reload to see their changes, then make yours again.",
119
+ "publish.error": "Your changes couldn't be published. Check your connection and try again.",
120
+ "publish.reloaded": "This is the page as the other person left it. Make your changes again, or put yours back to publish them over theirs.",
121
+ "publish.putMineBack": "Put my changes back",
122
+ "kept.found": "You have changes here from {time} that weren't published.",
123
+ "kept.theirs": "Someone has published changes here since then. If you put yours back, publishing them replaces theirs.",
124
+ "kept.putBack": "Put them back",
125
+ "kept.throwAway": "Throw them away",
126
+ "kept.invalid": "Your changes from {time} can't be put back, since the site's blocks have changed since.",
127
+ "publish.invalid": "Fix the highlighted problems before publishing.",
128
+ "draft.label": "Draft",
129
+ "draft.add": "Add to draft",
130
+ "draft.addHint": "Keep this change with others to publish together later, instead of publishing it now",
131
+ "draft.adding": "Adding to the draft…",
132
+ "draft.added": "Added to the draft.",
133
+ "draft.banner": "You're working in a draft started {date}. What you change goes into it, and visitors see it when it's published.",
134
+ "draft.bannerKept": "You're working in a draft started {date}, kept in this browser. What you change goes into it, and visitors see it when it's published.",
135
+ "draft.changes": "{count} files changed",
136
+ "draft.oneChange": "1 file changed",
137
+ "draft.publishAll": "Publish all",
138
+ "draft.publishing": "Publishing the draft…",
139
+ "draft.published": "The draft is published.",
140
+ "draft.submit": "Submit for review",
141
+ "draft.submitted": "Submitted for review.",
142
+ "draft.seeReview": "See it",
143
+ "draft.discard": "Throw away",
144
+ "draft.discardTitle": "Throw away this draft?",
145
+ "draft.discardBody": "Everything in it will be lost. The live site stays as it is.",
146
+ "draft.leave": "Back to the live site",
147
+ "draft.waiting": "A draft started {date} is waiting to be published.",
148
+ "draft.waitingMany": "{count} drafts are waiting to be published.",
149
+ "draft.reviewWaiting": "A draft is waiting for review: {title}.",
150
+ "draft.reviewWaitingMany": "{count} drafts are waiting for review.",
151
+ "draft.inReview": "Submitted for review.",
152
+ "draft.choose": "Draft to open",
153
+ "draft.started": "Started {date}",
154
+ "draft.open": "Open",
155
+ "draft.gone": "That draft has been published or thrown away.",
156
+ "draft.conflict": "Someone else has published changes to some of the same pages or settings since this draft started, so it can't be published as it is. Submit it for review, or throw it away and make the changes again.",
157
+ "draft.conflictKept": "Someone else has published changes to some of the same pages or settings since this draft started, so it can't be published as it is. Throw it away and make the changes again.",
158
+ "draft.error": "The draft couldn't be published. Check your connection and try again.",
159
+ "draft.submitError": "The draft couldn't be submitted for review. Check your connection and try again.",
160
+ "draft.discardError": "The draft couldn't be thrown away. Check your connection and try again.",
161
+ "draft.message": "Publish the draft {name}",
162
+ "draft.reviewTitle": "Draft {name}, from the admin panel",
163
+ "draft.reviewDescription": "Changes made in the admin panel:",
164
+ "checks.blocked.title": "This can't be published yet",
165
+ "checks.blocked.intro": "Publishing this would leave links that go nowhere. Change or remove them first.",
166
+ "checks.warnings.title": "Publish anyway?",
167
+ "checks.warnings.intro": "A few things could be better. You can publish anyway, or go back and fix them first.",
168
+ "checks.alsoWarnings": "These could be better too:",
169
+ "checks.publishAnyway": "Publish anyway",
170
+ "checks.goBack": "Go back",
171
+ "limits.title": "Some of this is outside what you can change",
172
+ "limits.intro": "An owner has limited what you can change on this site, and these changes are outside it:",
173
+ "limits.review": "Submit them for review instead: the site's reviewers are asked to look, and can publish them for you.",
174
+ "limits.noReview": "Ask an owner to make these changes for you, or to let you make them on Site Settings' Editors screen.",
175
+ "limits.goBack": "Go back",
176
+ "limits.submitting": "Submitting for review…",
177
+ "limits.submitted": "Submitted for review. The live site stays as it is until a reviewer publishes it.",
178
+ "limits.submitError": "The changes couldn't be submitted for review. Check your connection and try again.",
179
+ "limits.page": "The page {name}",
180
+ "limits.entry": "{name}, in {collection}",
181
+ "limits.media": "The media library",
182
+ "limits.layout": "The header and footer",
183
+ "limits.menus": "The menus",
184
+ "limits.other": "The site's settings, or other things only owners change",
185
+ "limits.readOnly": "You can look at this, but an owner has limited what you can change, and it's outside it.",
186
+ "limits.mediaReadOnly": "An owner has limited what you can change, and the media library is outside it. You can still use its files on pages you can change.",
187
+ "checks.missing-page": "{place} links to {target}, which isn't a page on the site.",
188
+ "checks.missing-item": "{place} links to {target} in {collection}, which isn't there any more.",
189
+ "checks.missing-media": "{place} uses {target}, which isn't in the media library.",
190
+ "checks.unsafe-link": "{place} links to {target}, an address that would run code on the site. Pages leave it out: use an address that starts with https://, or one of the site's own pages.",
191
+ "checks.no-title": "{place} has no title, so browser tabs and search results show only the site's name.",
192
+ "checks.missing-translation": "{place} has no translation in {language} yet. Visitors reading in {language} are sent to its home page instead.",
193
+ "checks.outdated-translation": "{place} has changed since its translation in {language} was made. Update the translation, then mark it as up to date.",
194
+ "checks.bad-translation": "{place} says it's a translation of {target}, but only pages and items in the site's main language have translations.",
195
+ "checks.no-description": "{place} has no description for search results and link previews to show.",
196
+ "checks.low-contrast": "Text in \"{text}\" is hard to read on \"{background}\": its contrast is {ratio} to 1, and text needs at least 4.5 to 1.",
197
+ "checks.low-contrast.dark": "In dark mode, text in \"{text}\" is hard to read on \"{background}\": its contrast is {ratio} to 1, and text needs at least 4.5 to 1.",
198
+ "checks.no-alt": "{place} has an image, {image}, with no description for people who can't see it. Describe it in the image's settings, or say it's only decoration.",
199
+ "checks.skipped-heading": "{place} has the heading \"{text}\" at level {level}, after one at level {previous}. Headings shouldn't skip a level, or people who move through a page by its headings think they've missed something.",
200
+ "checks.skipped-heading.first": "{place} starts with the heading \"{text}\", at level {level}. Start with the page's title (level 1) or a section (level 2).",
201
+ "checks.vague-link": "{place} has a link, \"{text}\", that doesn't say where it goes. Say what people will find there, such as \"Our Mass times\" rather than \"Click here\".",
202
+ "checks.empty-link": "{place} has a link to {target} with no text, so people who can't see the page don't know where it goes.",
203
+ "checks.accessibility": "{place}: {help}",
204
+ "checks.place.page": "The page \"{title}\"",
205
+ "checks.place.entry": "\"{title}\" in {collection}",
206
+ "checks.place.design": "The design of {collection}",
207
+ "checks.place.header": "The header",
208
+ "checks.place.footer": "The footer",
209
+ "checks.place.menus": "A menu",
210
+ "checks.place.settings": "Site Settings",
211
+ "checks.place.redirects": "A redirect",
212
+ "checks.place.file": "{file}",
213
+ "unsaved.confirm": "You have changes that aren't published yet. Leave anyway and lose them?",
214
+ "unsaved.label": "Unpublished changes",
215
+ "pages.title": "Pages",
216
+ "pages.new": "New page",
217
+ "pages.empty": "This site has no pages yet.",
218
+ "pages.column.title": "Title",
219
+ "pages.column.address": "Address",
220
+ "pages.look": "Look",
221
+ "pages.edit": "Edit",
222
+ "pages.move": "Change address",
223
+ "pages.duplicate": "Duplicate",
224
+ "pages.delete": "Delete",
225
+ "pages.view": "View",
226
+ "pages.homeCantDelete": "The home page can't be deleted.",
227
+ "pages.schedule": "Schedule",
228
+ "sharePreview.title": "When a link to this page is shared",
229
+ "sharePreview.noImage": "No image",
230
+ "sharePreview.noAddress": "Link previews show the image once the site's address is set in Site Settings, since they need its full address.",
231
+ "sharePreview.hidden": "This page is hidden from search engines, so it isn't in search results or the sitemap.",
232
+ "schedulePage.title": "When “{title}” is on the site",
233
+ "schedulePage.submit": "Publish",
234
+ "schedulePage.message": "Schedule page \"{title}\"",
235
+ "schedule.title": "When it's on the site",
236
+ "schedule.showFrom": "Show from",
237
+ "schedule.showFromHint": "Leave empty to show it as soon as it's published.",
238
+ "schedule.hideAfter": "Hide after",
239
+ "schedule.hideAfterHint": "Leave empty to keep it on the site.",
240
+ "schedule.zone": "Times are in the site's time zone, {zone}.",
241
+ "schedule.zoneNew": "Times are in your computer's time zone, {zone}, which becomes the site's time zone.",
242
+ "schedule.zoneNone": "Times are in UTC, since the site has no time zone. Choose one in Site Settings.",
243
+ "schedule.invalid": "Enter a date and a time.",
244
+ "schedule.order": "Choose a time after the one it's shown from.",
245
+ "schedule.timing.exact": "The site is rebuilt at each of these times, so changes go live then.",
246
+ "schedule.timing.hourly": "The site checks each hour for changes that are due, so changes go live within an hour of their time.",
247
+ "schedule.timing.nightly": "The site is rebuilt each night, so changes go live with the first rebuild after their time.",
248
+ "schedule.timing.none": "Changes go live the next time the site is rebuilt after their time, such as when someone publishes.",
249
+ "schedule.timing.notAllowed": "{host} didn't let you have the site rebuilt at these times, so changes go live with the nightly rebuild after their time, or at their time once an owner opens the admin panel.",
250
+ "schedule.public": "Anyone can read what's scheduled before it's shown, since the site's files on {host} are public. Don't schedule anything that must stay secret until then.",
251
+ "schedule.internal": "Anyone signed in to {host} can read what's scheduled before it's shown, since the site's files are visible to all of them. Don't schedule anything that must stay secret until then.",
252
+ "schedule.status.waiting": "Shown from {time}",
253
+ "schedule.status.hides": "Hidden after {time}",
254
+ "schedule.status.hidden": "Hidden since {time}",
255
+ "comingUp.title": "Coming up",
256
+ "comingUp.show": "Shown",
257
+ "comingUp.hide": "Hidden",
258
+ "comingUp.zone": "Times are in the site's time zone, {zone}.",
259
+ "newPage.title": "New page",
260
+ "newPage.pageTitle": "Page title",
261
+ "newPage.address": "Address",
262
+ "newPage.addressHint": "The part of the web address after the site's name, such as /about or /events/picnic.",
263
+ "newPage.create": "Create page",
264
+ "newPage.message": "Add page \"{title}\"",
265
+ "duplicatePage.title": "Duplicate \"{title}\"",
266
+ "duplicatePage.pageTitle": "{title} (copy)",
267
+ "duplicatePage.create": "Duplicate page",
268
+ "duplicatePage.message": "Add page \"{title}\", a copy of \"{from}\"",
269
+ "movePage.title": "Change the address of {title}",
270
+ "movePage.address": "New address",
271
+ "movePage.links": "Links to it anywhere on this site, menus included, change to the new address.",
272
+ "movePage.redirect": "Keep {from} working by sending visitors on to the page",
273
+ "movePage.redirectHint": "Links to the old address elsewhere, such as on other websites, keep working. Site Settings → Redirects lists it.",
274
+ "movePage.warning": "Links to the old address on other websites will stop working.",
275
+ "movePage.submit": "Change address",
276
+ "movePage.message": "Move page \"{title}\" from {from} to {to}",
277
+ "deletePage.title": "Delete {title}?",
278
+ "deletePage.body": "The page at {path} will be removed from the site. If anything on the site links to it, those links need changing first.",
279
+ "deletePage.submit": "Delete page",
280
+ "deletePage.message": "Delete page \"{title}\"",
281
+ "address.invalid": "Use lowercase letters, numbers and hyphens, with / between parts, such as /about-us.",
282
+ "address.reserved": "This address can't be used: the admin panel uses it, or it ends in /index, which is the page above it. Choose another.",
283
+ "address.taken": "Another page already uses this address.",
284
+ "field.required": "This can't be empty.",
285
+ "editPage.message": "Update page \"{title}\"",
286
+ "editPage.notFound": "This page doesn't exist. It may have been moved or deleted.",
287
+ "editPage.backToPages": "Back to pages",
288
+ "versions.button": "Version history",
289
+ "versions.title": "Version history: {title}",
290
+ "versions.back": "Back to editing",
291
+ "versions.intro": "Every version that's been published, newest first. Choose one to see it, then restore it to put it back. Something that was moved to a new address starts a new history there.",
292
+ "versions.notFound": "There's no history to show here. It may have been moved or deleted.",
293
+ "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
294
+ "versions.demo": "Version history isn't kept in a demo.",
295
+ "versions.loading": "Loading versions…",
296
+ "versions.loadingVersion": "Loading this version…",
297
+ "versions.error": "The versions couldn't be loaded. Check your connection and try again.",
298
+ "versions.empty": "Nothing has been published here yet.",
299
+ "versions.current": "Current version",
300
+ "versions.by": "{date}, by {author}",
301
+ "versions.more": "Show older versions",
302
+ "versions.preview": "The version from {date}",
303
+ "versions.noPreview": "This item has no page of its own, so there's nothing to preview.",
304
+ "versions.restore": "Restore this version",
305
+ "versions.restoreTitle": "Restore the version from {date}?",
306
+ "versions.restoreBody": "{title} goes back to how it was then, and that's published straight away. The current version stays in the history, so you can restore it later.",
307
+ "versions.restoring": "Restoring…",
308
+ "versions.restoreMessage": "Restore \"{title}\" to the version from {date}",
309
+ "versions.restored": "Restored the version from {date}.",
310
+ "versions.readError": "This version couldn't be loaded. Check your connection and try again.",
311
+ "versions.unfit": "This version can't be restored, because it doesn't fit the site as it is now, for example because the choices for one of its fields have changed.",
312
+ "versions.unknownBlocks": "This version can't be restored, because it uses blocks the site doesn't have any more: {blocks}.",
313
+ "layout.header": "Header",
314
+ "layout.footer": "Footer",
315
+ "layout.headerWord": "header",
316
+ "layout.footerWord": "footer",
317
+ "layout.headerMessage": "Update the header",
318
+ "layout.footerMessage": "Update the footer",
319
+ "collections.title": "Collections",
320
+ "collections.intro": "Collections are groups of similar items, such as videos, events or staff. Each collection has its own fields, and can give every item a page that shares one design.",
321
+ "collections.new": "New collection",
322
+ "collections.empty": "There are no collections yet.",
323
+ "collections.column.name": "Name",
324
+ "collections.column.count": "Items",
325
+ "collections.column.address": "Pages",
326
+ "collections.noPages": "No pages of their own",
327
+ "newCollection.title": "New collection",
328
+ "newCollection.kind": "Start with",
329
+ "newCollection.kindBlank": "A title and text",
330
+ "newCollection.kindEvents": "Events",
331
+ "newCollection.kindEventsHint": "Each item has a date and time, which can repeat, a place and a summary. Calendar blocks show them, and visitors can add them to their own calendars.",
332
+ "newCollection.eventsName": "Events",
333
+ "newCollection.eventsEntryName": "Event",
334
+ "newCollection.timeZone": "The site's time zone will be set to {zone}. You can change it in Site Settings.",
335
+ "newCollection.name": "Name",
336
+ "newCollection.nameHint": "What the whole collection is called, such as Videos or Events.",
337
+ "newCollection.nameTaken": "Another collection already has a name like this. Choose another.",
338
+ "newCollection.entryName": "One item is called",
339
+ "newCollection.entryNameHint": "Such as Video or Event.",
340
+ "newCollection.pages": "Give each item its own page",
341
+ "newCollection.address": "Address of the pages",
342
+ "newCollection.addressHint": "Each item's page goes inside this address, such as /videos/easter-vigil.",
343
+ "newCollection.create": "Create collection",
344
+ "newCollection.message": "Add collection \"{name}\"",
345
+ "collection.tab.entries": "Items",
346
+ "collection.tab.template": "Page design",
347
+ "collection.tab.settings": "Settings",
348
+ "collection.notFound": "This collection doesn't exist. It may have been deleted.",
349
+ "collection.back": "Back to collections",
350
+ "entries.add": "Add {entry}",
351
+ "entries.empty": "There's nothing in {name} yet.",
352
+ "entries.column.title": "Title",
353
+ "entries.column.address": "Address",
354
+ "newEntry.title": "Add {entry}",
355
+ "newEntry.entryTitle": "Title",
356
+ "newEntry.address": "Address",
357
+ "newEntry.addressHint": "The last part of the page's address, as in {example}.",
358
+ "newEntry.message": "Add {entry} \"{title}\"",
359
+ "entryName.invalid": "Use lowercase letters, numbers and hyphens only, such as easter-vigil.",
360
+ "entryName.reserved": "This address can't be used: the admin panel uses it, or it ends in /index, which is the page above it. Choose another.",
361
+ "entryName.taken": "Something else on the site already uses this address.",
362
+ "moveEntry.message": "Move {entry} \"{title}\" from {from} to {to}",
363
+ "deleteEntry.body": "{title} will be removed from {name}.",
364
+ "deleteEntry.linked": "These items link to it, and their links to it will be taken out:",
365
+ "deleteEntry.linkedMore": "and {count} more",
366
+ "deleteEntry.bodyPage": "{title} will be removed from {name}, and its page at {path} from the site. If anything on the site links to it, those links need changing first.",
367
+ "deleteEntry.message": "Delete {entry} \"{title}\"",
368
+ "editEntry.message": "Update {entry} \"{title}\"",
369
+ "editEntry.invalidSchedule": "Check when it's on the site: each time needs a date and a time, and it can only be hidden after it's shown.",
370
+ "editEntry.notFound": "This item doesn't exist. It may have been renamed or deleted.",
371
+ "editEntry.back": "Back to {name}",
372
+ "editEntry.items.search": "Search {name}",
373
+ "editEntry.items.none": "Nothing in {name} matches.",
374
+ "editEntry.items.empty": "{name} has nothing to link to yet.",
375
+ "editEntry.items.missing": "The collection this field links to isn't on the site any more.",
376
+ "editEntry.items.remove": "Take out {title}",
377
+ "editEntry.images.up": "Move earlier",
378
+ "editEntry.images.down": "Move later",
379
+ "editEntry.images.remove": "Take out",
380
+ "editEntry.required": "Fill in {fields} before publishing.",
381
+ "editEntry.invalidEvent": "Check {fields}: an event has to end after it starts.",
382
+ "editEntry.noPage": "Items in {name} don't have pages of their own. They appear wherever a Collection list block shows {name}.",
383
+ "template.help": "Every item's page uses this design. To show an item's information, add an Entry field block, or type a field's name in braces in any text:",
384
+ "template.message": "Update the page design for {name}",
385
+ "template.noPages": "Items in {name} don't have pages of their own, so there's no page design. To give them pages, turn that on in Settings.",
386
+ "collectionSettings.markdown": "Store items as Markdown files",
387
+ "collectionSettings.markdownHint": "Each item's text is saved as Markdown, a plain-text format that developers can also edit in their own tools. It's edited here as before.",
388
+ "collectionSettings.markdownNeedsText": "To store items as Markdown files, add a formatted-text field first.",
389
+ "collectionSettings.markdownBody": "Field saved as the Markdown text",
390
+ "collectionSettings.markdownConverts": "Every item will be converted when you publish.",
391
+ "collectionSettings.calendar": "Show items in calendars",
392
+ "collectionSettings.calendarHint": "Items become events that Calendar blocks show, which visitors can add to their own calendars or subscribe to.",
393
+ "collectionSettings.calendarNeedsDate": "To show items in calendars, add a \"Date and time, for events\" field first.",
394
+ "collectionSettings.calendarWhen": "When items happen",
395
+ "collectionSettings.calendarPlace": "Where",
396
+ "collectionSettings.calendarSummary": "Summary",
397
+ "collectionSettings.calendarNone": "None",
398
+ "event.starts": "Starts",
399
+ "event.ends": "Ends (optional)",
400
+ "event.time": "Time",
401
+ "event.allDay": "All day",
402
+ "event.repeats": "Repeats",
403
+ "event.repeat.none": "Doesn't repeat",
404
+ "event.repeat.day": "Daily",
405
+ "event.repeat.week": "Weekly",
406
+ "event.repeat.month": "Monthly",
407
+ "event.repeat.year": "Yearly",
408
+ "event.interval.days": "Every how many days",
409
+ "event.interval.weeks": "Every how many weeks",
410
+ "event.interval.months": "Every how many months",
411
+ "event.interval.years": "Every how many years",
412
+ "event.onDays": "On",
413
+ "event.monthlyOn": "On",
414
+ "event.monthly.date": "Day {day} of the month",
415
+ "event.monthly.weekday": "The {nth} {weekday} of the month",
416
+ "event.monthly.last": "The last {weekday} of the month",
417
+ "event.nth.1": "first",
418
+ "event.nth.2": "second",
419
+ "event.nth.3": "third",
420
+ "event.nth.4": "fourth",
421
+ "event.nth.5": "fifth",
422
+ "event.until": "Until (optional)",
423
+ "event.skip": "Dates it doesn't happen",
424
+ "event.skipDate": "A date it doesn't happen",
425
+ "event.addSkip": "Skip this date",
426
+ "event.next": "Next: {when}",
427
+ "event.when": "{when}",
428
+ "collectionSettings.general": "General",
429
+ "collectionSettings.path": "Address of each item's page",
430
+ "collectionSettings.pathHint": "{slug} stands for each item's own address, as in /videos/{slug}.",
431
+ "collectionSettings.pathWarning": "Changing this changes the address of every item's page, and links to them on this site change with it. Links to the old addresses on other websites will stop working.",
432
+ "collectionSettings.sortField": "Order items by",
433
+ "collectionSettings.sortOrder": "Direction",
434
+ "collectionSettings.ascending": "A to Z, oldest or smallest first",
435
+ "collectionSettings.descending": "Z to A, newest or largest first",
436
+ "collectionSettings.message": "Update the settings for {name}",
437
+ "collectionSettings.addressClash": "With this address, {title} would have the same address as another page.",
438
+ "collectionSettings.delete": "Delete collection",
439
+ "collectionSettings.deleteTitle": "Delete {name}?",
440
+ "collectionSettings.deleteBody": "{name} and everything in it ({count} items) will be removed from the site, along with their pages. Collection lists showing it will be empty.",
441
+ "collectionSettings.deleteLinked": "{name} can't be deleted while other collections link to its items: {collections}. Remove those fields first.",
442
+ "collectionSettings.deleteMessage": "Delete collection \"{name}\"",
443
+ "fields.title": "Fields",
444
+ "fields.intro": "The information each item has. Every item has a title. A field's kind can't be changed once it's published, but you can add a new field instead.",
445
+ "fields.add": "Add field",
446
+ "fields.label": "Label",
447
+ "fields.type": "Kind of information",
448
+ "fields.required": "Must be filled in",
449
+ "fields.hint": "Help text",
450
+ "fields.options": "Choices",
451
+ "fields.option": "Choice {number}",
452
+ "fields.addOption": "Add choice",
453
+ "fields.optionsRequired": "Add at least one choice.",
454
+ "fields.placeholder": "Show it on the page design with {placeholder}",
455
+ "fields.remove": "Remove field",
456
+ "fields.removed": "Removed fields are also removed from every item when you publish.",
457
+ "fields.newLabel": "New field",
458
+ "fields.linksTo": "Links to items in",
459
+ "fields.multiple": "Can link to several",
460
+ "fields.collectionRequired": "Choose the collection it links to.",
461
+ "fields.groupFields": "Each row's fields",
462
+ "fields.addGroupField": "Add a field to each row",
463
+ "fields.type.text": "Short text",
464
+ "fields.type.textarea": "Long text",
465
+ "fields.type.richtext": "Formatted text",
466
+ "fields.type.number": "Number",
467
+ "fields.type.date": "Date",
468
+ "fields.type.event": "Date and time, for events",
469
+ "fields.type.link": "Link",
470
+ "fields.type.image": "Image (URL)",
471
+ "fields.type.select": "Choice from a list",
472
+ "fields.type.tags": "Tags (any number of choices from a list)",
473
+ "fields.type.yesno": "Yes or no",
474
+ "fields.type.item": "Link to items in a collection",
475
+ "fields.type.images": "Several images",
476
+ "fields.type.file": "File",
477
+ "fields.type.group": "Repeating group (rows of a few fields)",
478
+ "demo.banner": "This is a demo. Try anything you like: your changes show here in the admin panel and are saved in this browser only. The site itself never changes.",
479
+ "demo.published": "Saved in this browser. The site itself doesn't change in a demo.",
480
+ "demo.startOver": "Start over",
481
+ "demo.startOverTitle": "Start over?",
482
+ "demo.startOverBody": "Everything you've changed in this demo, including uploads, will be undone.",
483
+ "blocks.contentOnly": "This site's blocks are added by its developer.",
484
+ "blocks.contentOnlyHint": "Its code is kept apart from its content, so adding or removing a block is done where the code is, and shows up here once the site has been rebuilt.",
485
+ "blocks.demo": "In this demo you can see which blocks there are, but not add or remove them: a block is added to a real site by updating its code.",
486
+ "markdown.formatted": "Formatted",
487
+ "markdown.source": "Markdown",
488
+ "markdown.sourceOnly": "This text uses things the formatted view can't show, such as tables or pictures, so it can only be edited as Markdown.",
489
+ "blocks.title": "Blocks",
490
+ "blocks.intro": "Add blocks to the editor, or remove ones you don't use. A change shows in the editor once the site has been updated, usually within a few minutes.",
491
+ "blocks.otherRegistries": "Blocks from other registries can be added once the admin panel has an address of its own, where the site's pages can't reach it (Site Settings → Domain).",
492
+ "blocks.installed": "Added to this site",
493
+ "blocks.noneInstalled": "No blocks have been added yet. The editor offers the built-in ones.",
494
+ "blocks.loading": "Loading the blocks you can add…",
495
+ "blocks.recommended": "Recommended",
496
+ "blocks.add": "Add",
497
+ "blocks.addLabel": "Add {name}",
498
+ "blocks.added": "Added",
499
+ "blocks.remove": "Remove",
500
+ "blocks.removeLabel": "Remove {name}",
501
+ "blocks.undo": "Undo",
502
+ "blocks.undoAddLabel": "Don't add {name}",
503
+ "blocks.undoRemoveLabel": "Don't remove {name}",
504
+ "blocks.willAdd": "Will be added",
505
+ "blocks.willRemove": "Will be removed",
506
+ "blocks.pendingTitle": "Changes to publish",
507
+ "blocks.pendingAdd": "Add {name}",
508
+ "blocks.pendingRemove": "Remove {name}",
509
+ "blocks.discard": "Discard changes",
510
+ "blocks.publish": "Publish",
511
+ "blocks.publishedNotice": "Published. Added blocks will be in the editor's list of blocks, and removed ones gone from it, once the site has been updated.",
512
+ "blocks.submit": "Submit for review",
513
+ "blocks.reviewHint": "Blocks' code runs on this site's server, which holds its secrets, so adding and removing blocks is submitted for review, for a developer to accept.",
514
+ "blocks.reviewDescription": "From the admin panel's Blocks screen. The blocks' code runs on the site's server.",
515
+ "blocks.submittedNotice": "Submitted for review. Once a developer accepts it and the site has been updated, the editor's list of blocks will change.",
516
+ "blocks.seeReview": "See it",
517
+ "blocks.addMessage": "Add the {name} block",
518
+ "blocks.removeMessage": "Remove the {name} block",
519
+ "blocks.changeMessage": "Change blocks: {changes}",
520
+ "blocks.addPart": "add {names}",
521
+ "blocks.removePart": "remove {names}",
522
+ "blocks.inUseTitle": "{name} can't be removed yet",
523
+ "blocks.inUse": "{name} is used in: {places}. Take it out of those first, then remove it.",
524
+ "blocks.usedTemplate": "the page design of {name}",
525
+ "blocks.error.record": "The list of blocks added to this site couldn't be read. Tell whoever looks after the site.",
526
+ "blocks.error.unreachable": "The blocks you can add couldn't be loaded. Check your internet connection and try again.",
527
+ "blocks.error.invalid": "The list of blocks you can add has a problem, so it couldn't be read. Try again later.",
528
+ "blocks.error.untrusted": "This block comes from somewhere this site doesn't trust, so it can't be added.",
529
+ "blocks.error.not-a-block": "This can't be added to the editor as a block.",
530
+ "blocks.error.already-installed": "{name} has already been added.",
531
+ "blocks.error.name-taken": "The site already has a block with the same name as {name}, so it can't be added.",
532
+ "blocks.error.packages": "This block needs software the site doesn't have ({packages}). Ask whoever looks after the site to add it.",
533
+ "blocks.error.unsupported-file": "This block includes a file that can't be added from here ({path}). Ask whoever looks after the site to add it.",
534
+ "blocks.error.file-exists": "The site already has a different file where this block goes ({path}). Ask whoever looks after the site to add it.",
535
+ "blocks.error.not-installed": "{name} hasn't been added, so there's nothing to remove.",
536
+ "blocks.error.in-use": "{name} is still used on the site. Take it out first, then remove it.",
537
+ "media.title": "Media",
538
+ "media.cloudflareVideo": "This site is published with Cloudflare Pages, whose terms limit serving video and other large files on its free plans without one of its paid services. To be safe, put videos on YouTube or Vimeo and show them with the Video block, which plays them from there.",
539
+ "media.cloudflareVideoTerms": "Cloudflare's terms",
540
+ "media.intro": "Images and files for the site. Upload them here, or while editing a page. Large photos are made smaller, and details hidden in photos, such as where they were taken, are removed.",
541
+ "media.upload": "Upload files",
542
+ "media.uploading": "Uploading…",
543
+ "media.drop": "Drop files here to upload them",
544
+ "media.empty": "There are no images or files yet.",
545
+ "media.search": "Find a file",
546
+ "media.noMatches": "No files match.",
547
+ "media.copy": "Copy address",
548
+ "media.copied": "Copied",
549
+ "media.replace": "Replace",
550
+ "media.delete": "Delete",
551
+ "media.uploaded": "Uploaded. Visitors see new files once the live site is updated.",
552
+ "media.uploadMessage": "Add {names}",
553
+ "media.replaceMessage": "Replace {name}",
554
+ "media.replaceKind": "{name} is a different kind of file from {target}. Replace it with a file of the same kind, or upload {name} as a new file.",
555
+ "media.deleteMessage": "Delete {name}",
556
+ "media.deleteTitle": "Delete {name}?",
557
+ "media.deleteBody": "{name} will be removed from the site.",
558
+ "media.deleteUsed": "It's used in: {places}. Choose another file there first, since the site can't be published using a file that's gone.",
559
+ "media.notUsed": "Nothing on the site uses it.",
560
+ "media.select": "Select files",
561
+ "media.selection": "Selected files",
562
+ "media.selected": "{count} selected",
563
+ "media.selectShown": "Select all shown",
564
+ "media.selectFile": "Select {name}",
565
+ "media.selectDone": "Done",
566
+ "media.deleteSelected": "Delete selected ({count})",
567
+ "media.deleteManyMessage": "Delete {count} files",
568
+ "media.deleteManyTitle": "Delete {count} files?",
569
+ "media.deleteManyBody": "These {count} files will be removed from the site.",
570
+ "media.deleteManyUsed": "Some are used on the site. Choose other files there first, since the site can't be published using files that are gone:",
571
+ "media.usedIn": "{name}: {places}",
572
+ "media.noneUsed": "Nothing on the site uses them.",
573
+ "media.noDescription": "No description yet",
574
+ "media.describeHint": "Say what the image shows, for people who can't see it, such as \"Children singing in the choir at the Christmas service\". Wherever the image's own description is left empty, it uses this one.",
575
+ "media.description": "Description",
576
+ "media.descriptionIn": "Description in {language}",
577
+ "media.describeLanguages": "Languages left empty use the description in the site's main language.",
578
+ "media.details": "Details",
579
+ "media.detailsTitle": "Details of {name}",
580
+ "media.detailsMessage": "Change the details of {name}",
581
+ "media.focus": "Focal point",
582
+ "media.focusHint": "Click the part of the picture that must stay in view wherever it's cut to fit, such as a face. The arrow keys move it too.",
583
+ "media.focusNone": "None: the picture is cut around its middle.",
584
+ "media.focusClear": "Clear focal point",
585
+ "media.focusLabel": "{name}: choose its focal point",
586
+ "media.tags": "Tags",
587
+ "media.tagsHint": "Words to find files by, such as \"Events\" or \"Staff\". Visitors don't see them.",
588
+ "media.tagAdd": "Add a tag",
589
+ "media.tagRemove": "Take off {tag}",
590
+ "media.tagFilter": "Show files tagged",
591
+ "media.tagAll": "All",
592
+ "media.tagSelected": "Tag selected ({count})",
593
+ "media.tagFilesTitle": "Tag {count} files",
594
+ "media.tagFilesAdd": "Add these tags",
595
+ "media.tagFilesRemove": "Take these tags off",
596
+ "media.tagMessage": "Tag {count} files",
597
+ "media.crop": "Crop or turn",
598
+ "media.cropTitle": "Crop or turn {name}",
599
+ "media.cropHint": "Drag the box to choose what to keep, and its corner to change its size. With the box chosen, the arrow keys move it, and with Shift change its size.",
600
+ "media.cropBox": "The part of the picture to keep",
601
+ "media.cropShape": "Shape",
602
+ "media.cropFree": "Any shape",
603
+ "media.cropSquare": "Square",
604
+ "media.cropPhoto": "Photo (4:3)",
605
+ "media.cropWide": "Wide (16:9)",
606
+ "media.rotateLeft": "Turn left",
607
+ "media.rotateRight": "Turn right",
608
+ "media.cropSize": "{width} × {height} pixels",
609
+ "media.cropReplaceHint": "A new image is used only where you choose it. Replacing the original changes the picture everywhere it's used, and clears its description and focal point.",
610
+ "media.cropSaveNew": "Save as a new image",
611
+ "media.cropReplace": "Replace the original",
612
+ "media.cropFailed": "The picture couldn't be saved. Try again, or crop it on your computer and upload it.",
613
+ "media.cropUnreadable": "This picture couldn't be read, so it can't be cropped here.",
614
+ "media.cropSaved": "Saved {name}.",
615
+ "media.error.type": "{name} can't be uploaded. The site can use images (JPEG, PNG, GIF, WebP, AVIF and SVG), PDFs, office documents, MP3 audio, MP4 and WebM video, and captions for videos (WebVTT).",
616
+ "media.error.size": "{name} is too large: files can be up to 25 MB. For long videos, upload them to YouTube or Vimeo and link to them instead.",
617
+ "media.error.unreadable": "{name} couldn't be read. It may be damaged, or in a format browsers can't open, such as HEIC. Save it as a JPEG and try again.",
618
+ "media.error.font": "{name} is a font. Fonts are added in Site Settings, under Colors & fonts.",
619
+ "media.choose": "Choose image",
620
+ "media.chooseAudio": "Choose sound file",
621
+ "media.chooseFile": "Choose file",
622
+ "media.chooseVideo": "Choose video",
623
+ "media.pickerTitle": "Choose an image",
624
+ "media.pickerTitleAudio": "Choose a sound file",
625
+ "media.pickerTitleFile": "Choose a file",
626
+ "media.pickerTitleVideo": "Choose a video",
627
+ "media.pickerEmpty": "Nothing has been uploaded yet. Upload a file to use it here.",
628
+ "media.clear": "Remove",
629
+ "table.addRow": "Add a row",
630
+ "table.addColumn": "Add a column",
631
+ "table.removeRow": "Remove this row",
632
+ "table.removeRowNumber": "Remove row {row}",
633
+ "table.removeColumn": "Remove this column",
634
+ "table.removeColumnNumber": "Remove column {column}",
635
+ "table.cell": "Row {row}, column {column}",
636
+ "table.bold": "Bold",
637
+ "table.italic": "Italic",
638
+ "table.link": "Link",
639
+ "table.unlink": "Remove link",
640
+ "table.linkAddress": "Where the link goes",
641
+ "table.linkApply": "Add the link",
642
+ "table.linkSelect": "Select some words in a cell first, then choose Link.",
643
+ "style.align": "Text alignment",
644
+ "style.align.default": "As the block has it",
645
+ "style.align.left": "Left",
646
+ "style.align.center": "Centered",
647
+ "style.align.right": "Right",
648
+ "style.align.justify": "Justified",
649
+ "style.fontSize": "Text size",
650
+ "style.fontSize.xs": "Extra small",
651
+ "style.fontSize.sm": "Small",
652
+ "style.fontSize.base": "Normal",
653
+ "style.fontSize.lg": "Large",
654
+ "style.fontSize.xl": "Extra large",
655
+ "style.fontSize.2xl": "Very large",
656
+ "style.fontSize.3xl": "Huge",
657
+ "style.fontSize.4xl": "Very huge",
658
+ "style.fontSize.5xl": "Giant",
659
+ "style.fontSize.6xl": "Enormous",
660
+ "style.color": "Text color",
661
+ "style.background": "Background color",
662
+ "style.colorDefault": "As the block has it",
663
+ "style.colorCustom": "Choose a color",
664
+ "style.contrast": "This text may be hard to read on this background. Try colors further apart.",
665
+ "style.padding": "Space inside",
666
+ "style.margin": "Space around",
667
+ "style.eachSide": "Set each side",
668
+ "style.side.top": "Top",
669
+ "style.side.right": "Right",
670
+ "style.side.bottom": "Bottom",
671
+ "style.side.left": "Left",
672
+ "style.allSides": "All sides",
673
+ "style.none": "None",
674
+ "style.radius": "Rounded corners",
675
+ "style.hiddenOn": "Hide on",
676
+ "style.hiddenOn.phones": "Phones (narrower than 640px)",
677
+ "style.hiddenOn.tablets": "Tablets (640px to 1023px)",
678
+ "style.hiddenOn.computers": "Computers (1024px and wider)",
679
+ "style.hiddenOnHint": "Choose a preview width above the page to see it as each size of screen does. A block hidden there is still in the Outline, where you can choose it.",
680
+ "style.hiddenOnAll": "This block is hidden on every size of screen, so visitors never see it.",
681
+ "style.radius.none": "Square",
682
+ "style.radius.sm": "Slightly rounded",
683
+ "style.radius.md": "Rounded",
684
+ "style.radius.lg": "The theme's rounding",
685
+ "style.radius.xl": "Very rounded",
686
+ "style.radius.full": "Round",
687
+ "style.default": "As the block has it",
688
+ "style.custom": "Your own…",
689
+ "style.customLength": "Your own size, such as 12px or 1.5rem",
690
+ "style.customLengthInvalid": "Write a number with px, rem, em or %, such as 12px.",
691
+ "style.other": "Other CSS classes",
692
+ "style.otherHint": "Tailwind classes, or your own from Custom CSS, separated by spaces.",
693
+ "style.reset": "Back to the block's own look",
694
+ "media.credit": "Credit: {credit}",
695
+ "media.stored": "Kept by {plugin}",
696
+ "media.error.storageSize": "{name} is too large: {plugin} takes files up to {size}.",
697
+ "media.storage.title": "Where media is kept",
698
+ "media.storage.intro": "{plugin} keeps the site's media in its storage, including large files such as long videos. It keeps {count} files now. Pages show them from there, at the same addresses.",
699
+ "media.storage.missing": "{count} files are kept in storage by {plugin}, which the site no longer has. Pages still show them, but new files go into the site's own files.",
700
+ "media.storage.notReady": "{plugin} can't take files yet. {message}",
701
+ "media.storage.unavailable": "{plugin} didn't answer. Reload the admin panel and try again.",
702
+ "media.storage.settings": "Open {plugin}'s settings",
703
+ "media.storage.failed": "{plugin} couldn't keep {name}.",
704
+ "media.storage.uploading": "Uploading to {plugin}… This takes about a minute.",
705
+ "media.storage.wait": "Each group of files takes about a minute.",
706
+ "media.move.button": "Move {count} files to {plugin}",
707
+ "media.move.title": "Move the site's media to {plugin}?",
708
+ "media.move.body": "{plugin} will keep these files, and pages will show them from its storage at the same addresses, so nothing on them changes. They're taken out of the site's own files; Version history keeps them.",
709
+ "media.move.moving": "Moved {done} of {total}…",
710
+ "media.move.busy": "Moving…",
711
+ "media.move.nothing": "No files were moved.",
712
+ "media.move.some": "Moved {count} files to {plugin}, then stopped.",
713
+ "media.move.done": "Moved {count} files to {plugin}.",
714
+ "media.move.message": "Move media to {plugin}",
715
+ "media.back.button": "Move back to the site",
716
+ "media.back.title": "Move the media back from {plugin}?",
717
+ "media.back.body": "The files {plugin} keeps are copied back into the site's own files, at the same addresses, and new files go there too. Each can be up to 25 MB.",
718
+ "media.back.empty": "{plugin} keeps no files now. New files will go into the site's own files.",
719
+ "media.back.large": "These are larger than 25 MB, so {plugin} keeps them: {names}",
720
+ "media.back.failed": "{name} couldn't be copied back from {plugin}'s storage, which may not allow it.",
721
+ "media.back.done": "Moved {count} files back from {plugin}.",
722
+ "media.back.message": "Move media back from {plugin}",
723
+ "ai.label": "AI",
724
+ "ai.title": "Write with AI",
725
+ "ai.mode.add": "Describe what to add to this page, and AI will write it at the end of the page.",
726
+ "ai.mode.edit": "Describe how to change the selected {block}.",
727
+ "ai.mode.fill": "Describe this {item}, or paste your notes, and AI will fill in its fields.",
728
+ "ai.instruction": "What should it write?",
729
+ "ai.placeholder.add": "For example: a section about our Christmas Mass schedule, with a heading, a short welcome and a button to the contact page.",
730
+ "ai.placeholder.edit": "For example: make it shorter and friendlier, or translate it into Spanish.",
731
+ "ai.placeholder.fill": "For example: Fr. Smith's homily from Sunday, about hope. Paste any notes here.",
732
+ "ai.photos": "Find openly licensed photos where the media library has none that fit",
733
+ "ai.photosHint": "Photos come from Openverse and are added to the media library. Pages that use them credit who made them, as their licenses require.",
734
+ "ai.photos.finding": "Finding photos…",
735
+ "ai.photos.message": "Add photos from Openverse: {names}",
736
+ "ai.photos.added": "Photos from Openverse added to the media library: {names}.",
737
+ "ai.photos.missing": "No photo was found for {count} of the images, so they're left empty.",
738
+ "ai.photos.error.busy": "Openverse has had too many requests from this computer, so some images are left empty. Try again later, or choose them from the media library.",
739
+ "ai.photos.error.unreachable": "Couldn't reach Openverse, so some images are left empty. Check your connection, or choose them from the media library.",
740
+ "ai.photos.error.publish": "The photos found couldn't be added to the media library, so their images are left empty.",
741
+ "ai.translate": "Translate into {language}",
742
+ "ai.translate.hint": "This page is in {language}. The AI can translate all of it, blocks and settings, keeping its layout. Anything you write below is passed on too, such as how formal to be.",
743
+ "ai.translate.entryHint": "This item is in {language}. The AI can translate all its fields. Anything you write below is passed on too.",
744
+ "ai.write": "Write it",
745
+ "ai.change": "Change it",
746
+ "ai.fill": "Fill it in",
747
+ "ai.stop": "Stop",
748
+ "ai.working": "Writing…",
749
+ "ai.progress": "Writing… {count} characters so far",
750
+ "ai.done": "Done. Check it over, then publish when you're happy. Undo takes it back.",
751
+ "ai.check": "AI can get things wrong, so read what it writes before publishing. It won't make up times, names or prices: it leaves [placeholders] for you to fill in.",
752
+ "ai.needsKey": "To use {service}, add an API key under the AI service settings below, or choose another service.",
753
+ "ai.settings": "AI service: {service}",
754
+ "ai.provider": "AI service",
755
+ "ai.provider.manual": "Copy and paste into a chat app (free)",
756
+ "ai.provider.custom": "Another service (OpenAI-compatible)",
757
+ "ai.noKey": "(free, no key needed)",
758
+ "ai.siteKey": "(provided by this site)",
759
+ "ai.siteKeyHint": "This site provides {service}, so you don't need a key of your own.",
760
+ "ai.baseUrl": "Address of the service's API",
761
+ "ai.baseUrlHint": "Such as https://example.org/v1.",
762
+ "ai.key": "API key",
763
+ "ai.keyHint": "Your key stays in this browser and is only ever sent to {service}.",
764
+ "ai.getKey": "Get a key from {service}",
765
+ "ai.remember": "Remember the key on this device",
766
+ "ai.forget": "Forget the key",
767
+ "ai.costHint": "{service} may charge the account the key belongs to for each request. Setting a spending limit there is a good idea.",
768
+ "ai.model": "Model",
769
+ "ai.modelHint": "Choose one from the list, or type its name.",
770
+ "ai.model.claude-opus-5-5": "Claude Opus 5.5 (best results)",
771
+ "ai.model.claude-sonnet-5-5": "Claude Sonnet 5.5 (faster, costs less)",
772
+ "ai.model.claude-haiku-4-5": "Claude Haiku 4.5 (fastest, costs least)",
773
+ "ai.manual.step1": "Copy this request into Claude.ai, ChatGPT or another chat app:",
774
+ "ai.manual.copy": "Copy the request",
775
+ "ai.manual.copied": "Copied",
776
+ "ai.manual.step2": "Then paste the chat app's whole answer here:",
777
+ "ai.manual.use": "Use this answer",
778
+ "ai.error.key": "{service} didn't accept the API key. Check that it was copied in full, that it hasn't been deleted, and that it can use this model.",
779
+ "ai.error.limit": "{service} is limiting requests right now, or the account is out of credit. Wait a minute and try again, or choose another service.",
780
+ "ai.error.network": "Couldn't reach {service}. Check your connection and try again.",
781
+ "ai.error.refused": "{service} declined to write this. Try asking a different way.",
782
+ "ai.error.answer": "The answer couldn't be used. Try again, or try a different model or service.",
783
+ "ai.error.service": "{service} reported a problem. Try again in a moment.",
784
+ "settings.title": "Site Settings",
785
+ "appearance.darkMode": "Dark mode",
786
+ "adminLanguage.label": "Language of the admin panel",
787
+ "settings.tab.adminLanguages": "Admin panel languages",
788
+ "adminText.intro": "The admin panel comes in English and Spanish. Add another language here and have your AI service translate it; editors then choose it from the language menu at the top. The translation is kept in the site, so it's done only once.",
789
+ "adminText.machine": "Machine translation can be wrong. Where a mistake could cost something, such as signing in or deleting, the admin panel shows the English beside the translation.",
790
+ "adminText.empty": "The site has no languages of its own for the admin panel yet.",
791
+ "adminText.edit": "Edit",
792
+ "adminText.own.title": "Goodfellow's own languages",
793
+ "adminText.own.intro": "Change any of the admin panel's own words in English or Spanish. What you don't change stays as Goodfellow writes it, and follows its updates.",
794
+ "adminText.own.change": "Change words",
795
+ "adminText.own.changed": "{count} changed",
796
+ "adminText.editor.back": "All languages",
797
+ "adminText.editor.title": "{language}: the admin panel's words",
798
+ "adminText.editor.intro": "Each string shows its English and what the admin panel shows instead. Change any of them, and mark the ones someone who speaks the language has read. Empty a box to show {fallback} again. Keep the words in curly braces as they are: the admin panel fills them in.",
799
+ "adminText.editor.introOwn": "Each string shows its English. Write the words you'd rather the admin panel used; empty a box to show {fallback} again. Keep the words in curly braces as they are: the admin panel fills them in.",
800
+ "adminText.editor.fallbackEnglish": "the English",
801
+ "adminText.editor.fallbackOwn": "Goodfellow's words",
802
+ "adminText.editor.search": "Search",
803
+ "adminText.editor.show": "Show",
804
+ "adminText.editor.show.all": "Everything",
805
+ "adminText.editor.show.missing": "Not written yet",
806
+ "adminText.editor.show.outdated": "Out of date",
807
+ "adminText.editor.show.unusable": "Can't be used",
808
+ "adminText.editor.show.unreviewed": "Not read yet",
809
+ "adminText.editor.count": "Showing {shown} of {total}",
810
+ "adminText.editor.none": "Nothing matches.",
811
+ "adminText.editor.more": "Show more",
812
+ "adminText.editor.english": "English",
813
+ "adminText.editor.shown": "In {language}",
814
+ "adminText.editor.reviewed": "Read by someone who speaks it",
815
+ "adminText.editor.state.outdated": "Out of date: the English has changed since.",
816
+ "adminText.editor.state.unusable": "Can't be used, so {fallback} shows instead.",
817
+ "adminText.editor.problems": "{count} strings need fixing before they can be published.",
818
+ "adminText.editor.message": "Change the admin panel's words in {language}",
819
+ "adminText.problem.placeholders": "This needs the same words in curly braces as the English, no more and no fewer.",
820
+ "adminText.problem.too-long": "This is too long.",
821
+ "adminText.problem.empty": "This is empty.",
822
+ "adminText.table.strings": "The admin panel",
823
+ "adminText.table.puck": "The editor's controls",
824
+ "adminText.table.labels": "Blocks' labels",
825
+ "adminText.column.language": "Language",
826
+ "adminText.column.translated": "Translated",
827
+ "adminText.status": "{current} of {total} strings translated",
828
+ "adminText.outdated": "{count} out of date, since the English changed",
829
+ "adminText.unusable": "{count} that can't be used, shown in English",
830
+ "adminText.reviewed": "{count} read by someone who speaks it",
831
+ "adminText.translate": "Translate what's missing",
832
+ "adminText.translateOutdated": "Translate again what's out of date",
833
+ "adminText.translating": "Translating… {done} of {total}",
834
+ "adminText.stop": "Stop",
835
+ "adminText.done": "Translated and published {count} strings.",
836
+ "adminText.nothing": "Nothing to translate.",
837
+ "adminText.left": "{count} strings couldn't be translated, and stay in English. Translate again to try them.",
838
+ "adminText.failed": "The AI service stopped before the end. What it had translated was published; translate again for the rest.",
839
+ "adminText.message": "Translate the admin panel into {language}",
840
+ "adminText.remove": "Remove",
841
+ "adminText.removeTitle": "Remove {language}?",
842
+ "adminText.removeBody": "The admin panel will no longer be offered in {language}. Editors who chose it will see it in their browser's language instead.",
843
+ "adminText.removeMessage": "Remove the admin panel in {language}",
844
+ "adminText.add.title": "Add a language",
845
+ "adminText.add.code": "Language code",
846
+ "adminText.add.codeHint": "Such as fr, de or pt-BR.",
847
+ "adminText.add.name": "Its name, in that language",
848
+ "adminText.add.nameHint": "Such as Français or Deutsch, as the language menu will show it.",
849
+ "adminText.add.submit": "Add and translate",
850
+ "adminText.add.badCode": "That isn't a language's code. Use one such as fr or pt-BR.",
851
+ "adminText.add.noName": "Give the language's name.",
852
+ "adminText.add.exists": "The admin panel already speaks that language.",
853
+ "adminText.instruction": "Anything the translation should know (optional)",
854
+ "adminText.instructionHint": "Such as how formal to be.",
855
+ "adminText.service": "AI service",
856
+ "adminText.noService": "Choose an AI service and its key first, under AI service.",
857
+ "adminText.manual": "Translating needs an AI service the admin panel can ask itself; a chat app can't do it. Choose another service under AI service.",
858
+ "adminText.pack.title": "Language packs",
859
+ "adminText.pack.intro": "Language packs are translations of the admin panel that others have shared. They hold only words, so installing one runs nothing, and every string is checked as it's used, as your own are.",
860
+ "adminText.pack.installedAs": "{name}, version {version}, for {code}",
861
+ "adminText.pack.search": "Search language packs",
862
+ "adminText.pack.searchButton": "Search",
863
+ "adminText.pack.loading": "Looking for language packs…",
864
+ "adminText.pack.noneFound": "No language packs were found.",
865
+ "adminText.pack.show": "Show",
866
+ "adminText.pack.showLabel": "Show {name}",
867
+ "adminText.pack.byPublisher": "{name}, published by {publisher}",
868
+ "adminText.pack.installedBadge": "Installed",
869
+ "adminText.pack.from": "From {name}, version {version}",
870
+ "adminText.pack.language": "The admin panel in {language} ({code})",
871
+ "adminText.pack.releaseDetails": "{name}, version {version}, published {date}",
872
+ "adminText.pack.provenance": "Built from {source}, which npm checked when it was published.",
873
+ "adminText.pack.noProvenance": "npm doesn't say where this version was built.",
874
+ "adminText.pack.waiting": "Version {version} will be offered once it's {days} days old.",
875
+ "adminText.pack.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.",
876
+ "adminText.pack.tooNew": "This language pack is newer than {days} days, so it isn't offered yet.",
877
+ "adminText.pack.notCompatible": "No version of this language pack says it works with Goodfellow {version}.",
878
+ "adminText.pack.coverage": "With it, {current} of the admin panel's {total} strings are in {language}.",
879
+ "adminText.pack.builtIn": "Goodfellow already speaks {language}: the pack's words go over Goodfellow's own.",
880
+ "adminText.pack.other": "{language} is from {name} now. The pack's words replace that one's, apart from what you changed.",
881
+ "adminText.pack.kept": "You have your own words for {count} strings the pack says differently, which stay as you set them.",
882
+ "adminText.pack.replaceOwn": "Use the pack's words for those too",
883
+ "adminText.pack.replaced": "The pack's words replace yours for {count} strings.",
884
+ "adminText.pack.removed": "{count} strings the version before had and this one doesn't are taken out.",
885
+ "adminText.pack.upToDate": "Version {version} is installed, the newest offered.",
886
+ "adminText.pack.install": "Install and publish",
887
+ "adminText.pack.update": "Update to {version}",
888
+ "adminText.pack.installMessage": "Install {name} {version}, the admin panel in {language}",
889
+ "adminText.pack.updateMessage": "Update {name} to {version}, the admin panel in {language}",
890
+ "adminText.pack.installed": "The admin panel in {language} is installed from {name}.",
891
+ "adminText.pack.remove": "Remove the pack",
892
+ "adminText.pack.removeTitle": "Remove {name}?",
893
+ "adminText.pack.removeBody": "This takes out the pack's words that nobody has changed. Any you wrote or changed yourself stay, and {language} goes from the language menu if none are left.",
894
+ "adminText.pack.removeMessage": "Remove {name}, the admin panel in {language}",
895
+ "adminText.pack.removedNotice": "{name} is removed.",
896
+ "adminText.pack.error.unreachable": "Language packs can't be looked up right now. Check your internet connection and try again.",
897
+ "adminText.pack.error.badFile": "This language pack's file can't be read, so it can't be installed.",
898
+ "adminText.pack.error.notAPack": "This package isn't a Goodfellow language pack.",
899
+ "settings.tab.general": "General",
900
+ "settings.tab.languages": "Languages",
901
+ "settings.tab.theme": "Colors & fonts",
902
+ "settings.tab.menus": "Menus",
903
+ "settings.tab.css": "Custom CSS",
904
+ "settings.tab.code": "Code",
905
+ "settings.tab.redirects": "Redirects",
906
+ "settings.sidebar.collapse": "Hide names",
907
+ "settings.sidebar.expand": "Show names",
908
+ "settings.tab.domain": "Domain",
909
+ "settings.message": "Update site settings",
910
+ "settings.preview": "Preview of the home page",
911
+ "settings.previewEmpty": "Add a home page to see a preview here.",
912
+ "domain.intro": "Connect a domain you own, such as example.org, so the site is at that address.",
913
+ "domain.current": "The site is at {address} now.",
914
+ "domain.copy": "This admin panel is a copy of the site's, such as a staging site, at {address}. That address is set where the copy is built, so the domain this screen connects is the main site's.",
915
+ "domain.connected": "Connected to {domain}.",
916
+ "domain.signIn": "Editors sign in by going to {host} and coming back here. Add {address} to the redirect URIs of the application they sign in with on {host}, or signing in will stop working once the site moves.",
917
+ "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
918
+ "domain.admin.title": "Admin address",
919
+ "domain.admin.intro": "An address of its own for the admin panel, such as admin.example.org, keeps the site's pages from reaching what the admin panel keeps, such as editors' sign-in. Editors then sign in there. Blocks from registries other than Goodfellow's can be added only once the admin panel has one.",
920
+ "domain.admin.unsupported": "{host} serves each site at one address, so the admin panel can't have one of its own here.",
921
+ "domain.admin.contentOnly": "The admin panel's address is named in the site's code, which is kept apart from its content, so a developer finishes setting it up there.",
922
+ "domain.admin.code.unknown": "This sign-in can't read the site's code, so this screen can't tell whether a developer has done that yet.",
923
+ "domain.admin.code.add": "A developer names the address in the site's code, then publishes the code:",
924
+ "domain.admin.code.check": "Once the site has been rebuilt and works at {address}, the developer checks the address. From the next rebuild, the admin panel opens only there:",
925
+ "domain.admin.code.remove": "To stop using it, a developer removes it from the site's code:",
926
+ "domain.admin.noConfig": "The admin panel's address goes in the site's {file}, which doesn't have the usual defineConfig({ for it, so a developer sets it there.",
927
+ "domain.admin.noSiteAddress": "Connect the site's own domain first: the admin address goes beside it.",
928
+ "domain.admin.field": "Admin address",
929
+ "domain.admin.fieldHint": "An address of the site's domain that nothing else uses, such as admin.example.org.",
930
+ "domain.admin.connect": "Give the admin panel this address",
931
+ "domain.admin.elsewhere": "Add this address to the site's project on {host} too, under its custom domains, so it serves the site there as well. The site's build writes {host}'s rules for it.",
932
+ "domain.admin.elsewhereGuarded": "Add this address to the site on {host} too, as a domain alias, so it serves the site there as well. {host} can't send rules for one address, so the script every page of the site starts with keeps them from it, as on GitLab Pages.",
933
+ "domain.admin.message": "Give the admin panel its own address, {domain}",
934
+ "domain.admin.connected": "The admin panel's address is {domain}",
935
+ "domain.admin.ready": "The site answers at {address}. Open the admin panel there to start using it.",
936
+ "domain.admin.pending": "Once the site has been rebuilt and works at {address}, open the admin panel there: it checks the address, then you can start using it.",
937
+ "domain.admin.open": "Open the admin panel at {address}",
938
+ "domain.admin.signInAgain": "You'll sign in again there: it's a different address, so it keeps its own sign-in.",
939
+ "domain.admin.checking": "Checking {address}…",
940
+ "domain.admin.check.ok": "The site's pages at this address leave it for the site's own address before running anything.",
941
+ "domain.admin.check.no-guard": "The site's pages at this address don't start with the script that sends them away yet. Wait for the site to be rebuilt, then check again.",
942
+ "domain.admin.check.no-sandbox": "{host} doesn't sandbox the site's pages at this address yet. Wait for the site to be rebuilt, then check again.",
943
+ "domain.admin.check.failed": "The admin panel couldn't check this address. Try again in a moment.",
944
+ "domain.admin.use": "Start using {address}",
945
+ "domain.admin.useMessage": "Open the admin panel only at {domain}",
946
+ "domain.admin.using": "The admin panel's address is {address}. Once the site has been rebuilt, the admin panel opens only there.",
947
+ "domain.admin.stop": "Stop using the admin address",
948
+ "domain.admin.stopMessage": "Stop using {domain} for the admin panel",
949
+ "domain.admin.stopBody": "The admin panel goes back to the site's own address once the site has been rebuilt, and blocks from registries other than Goodfellow's can't be added there.",
950
+ "domain.demo": "Domains can't be connected in a demo.",
951
+ "domain.loading": "Finding where the site is published…",
952
+ "domain.elsewhere": "This site isn't published with {host} Pages, so its domain is connected where it is published.",
953
+ "domain.elsewhere.cloudflare": "On Cloudflare Pages: open the site's project, go to Custom domains and set up the domain. For a domain such as www.example.org, Cloudflare shows a CNAME record to add at your registrar. For example.org itself, the domain has to use Cloudflare's nameservers, which Cloudflare walks you through. Once the site works at its new address, put the address in General → Site address and publish.",
954
+ "domain.elsewhere.vercel": "On Vercel: open the site's project, go to Settings → Domains and add the domain. Vercel shows the records to add at your registrar. Once the site works at its new address, put the address in General → Site address and publish.",
955
+ "domain.elsewhere.netlify": "On Netlify: open the site, go to Domain management and add the domain. Netlify shows the records to add at your registrar, or offers to look after the domain's DNS itself. Once the site works at its new address, put the address in General → Site address and publish.",
956
+ "domain.elsewhere.other": "On any other host: connect the domain in the host's own settings, as it explains. Once the site works at its new address, put the address in General → Site address and publish.",
957
+ "domain.field": "Domain",
958
+ "domain.fieldHint": "Such as example.org or www.example.org. Buy one first from a registrar, such as Cloudflare, Namecheap or Porkbun. For example.org, www.example.org works too.",
959
+ "domain.invalid": "That isn't a domain. Type it like example.org.",
960
+ "domain.warning": "Once it's connected, the site's current address sends visitors to the new one, which works only once the records are in place. Have your registrar's DNS settings open, and add the records straight away.",
961
+ "domain.connect": "Connect domain",
962
+ "domain.connecting": "Connecting…",
963
+ "domain.message": "Use the domain {domain}",
964
+ "domain.records.title": "1. Add these records at your registrar",
965
+ "domain.records.hint": "Your registrar is where you bought the domain. In its DNS settings, add each record below. Delete any other A, AAAA or CNAME records with the same names, such as a page the registrar shows on new domains.",
966
+ "domain.records.type": "Type",
967
+ "domain.records.name": "Name",
968
+ "domain.records.value": "Value",
969
+ "domain.records.state": "Found",
970
+ "domain.records.ok": "In place",
971
+ "domain.records.missing": "Not there yet",
972
+ "domain.records.wrong": "Something else is there: {found}",
973
+ "domain.records.optional": "optional",
974
+ "domain.purpose.site": "Points the domain at the site.",
975
+ "domain.purpose.verification": "Proves to {host} that the domain is yours. Leave it in place.",
976
+ "domain.purpose.www": "Sends www. to the site too.",
977
+ "domain.guides": "How to add records at:",
978
+ "domain.cloudflare": "On Cloudflare, set each record's proxy status to DNS only, or {host} can't set up HTTPS for the domain.",
979
+ "domain.host.title": "2. {host} checks the domain and sets up HTTPS",
980
+ "domain.host.unverified": "Waiting for {host} to find the record that proves the domain is yours.",
981
+ "domain.host.pending": "Waiting for the HTTPS certificate, which {host} asks for once the records are in place. It can take up to a day.",
982
+ "domain.host.ready": "The HTTPS certificate is ready.",
983
+ "domain.host.failed": "The HTTPS certificate couldn't be set up. Check the records, then remove the domain and connect it again.",
984
+ "domain.site.title": "3. The site opens at {address}",
985
+ "domain.site.waiting": "Not yet. New records can take from a few minutes to a day to reach everyone.",
986
+ "domain.site.ok": "It does.",
987
+ "domain.secure": "Send everyone to {address}",
988
+ "domain.secureHint": "Visitors always get the secure address, and the site's old address sends them there too.",
989
+ "domain.done": "Done: the site is at {address}.",
990
+ "domain.check": "Check again",
991
+ "domain.checking": "Checking…",
992
+ "domain.checkFailed": "Couldn't check the records just now. Try again in a moment.",
993
+ "domain.remove": "Remove domain",
994
+ "domain.removeTitle": "Remove {domain}?",
995
+ "domain.removeBody": "The site goes back to its address on {host}. Delete the records at your registrar afterwards, so nobody else can use the domain for a site.",
996
+ "domain.removeMessage": "Stop using the domain {domain}",
997
+ "domain.error.not-allowed": "Your account can't change the site's {host} Pages settings. Ask one of the site's owners to make you an owner too, or to connect the domain for you.",
998
+ "domain.error.taken": "Another site on {host} already uses this domain. If it's yours too, remove it there first.",
999
+ "domain.error.invalid": "{host} doesn't accept this domain.",
1000
+ "domain.error.not-ready": "The HTTPS certificate isn't ready yet. Try again in a while.",
1001
+ "domain.error.other": "Something went wrong.",
1002
+ "owner.signIn.title": "Sign in as an owner",
1003
+ "owner.signIn.intro": "Inviting and removing editors, and connecting a domain, need an owner's access on {host}, which everyday sign-in doesn't have. Sign in as an owner for this tab only.",
1004
+ "owner.signIn.button": "Sign in as an owner with {host}",
1005
+ "owner.signIn.orToken": "Or use an owner token",
1006
+ "owner.token.title": "Use an owner token",
1007
+ "owner.token.intro": "Inviting and removing editors, and connecting a domain, need more access on {host} than signing in has. Create a second token for them. It's kept only until you close this tab, and stops working after a day; you can delete it on {host} sooner.",
1008
+ "owner.token.create": "Create an owner token on {host}",
1009
+ "owner.token.chooseSite": "If {host} asks what the token can access, choose only this site.",
1010
+ "owner.token.paste": "Copy the token and paste it here:",
1011
+ "settings.tab.security": "Security",
1012
+ "security.demo": "A demo has no sign-in to keep safe.",
1013
+ "security.local": "The sign-in page is set in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
1014
+ "security.contentOnly": "The sign-in page is set in the site's code, which is kept apart from its content, so a developer sets it there.",
1015
+ "security.broker.title": "Sign-in page",
1016
+ "security.broker.intro": "A sign-in page of its own, called a token broker, keeps editors' sign-in and AI keys at an address that holds nothing else, and shows the admin panel from there, so nothing on the site's pages can reach them. It asks the editor before publishing the site's code. It needs an address of its own, such as signin.example.org, that serves nothing else.",
1017
+ "security.exposed": "Editors sign in at the site's own address, where its pages could reach their sign-in: code added on the Code tab, or by a block, could act as anyone signed in. A sign-in page of its own, below, keeps it out of their reach, and needs no domain on GitLab, Cloudflare Pages or Vercel. Where you have a domain and the host allows it, an admin address of its own, on the Domain screen, does too.",
1018
+ "security.broker.useTitle": "Sign in at a sign-in page that's online",
1019
+ "security.add.title": "Add a token broker",
1020
+ "security.add.intro": "Makes a project on {host} for the sign-in page, from Goodfellow's released files and a file naming this site, and puts it online where you choose. It needs a token that can create projects, used only now and kept only until you leave this screen.",
1021
+ "security.add.place": "Where to put it online",
1022
+ "security.add.place.gitlab-pages": "GitLab Pages, at an address GitLab gives it",
1023
+ "security.add.place.gitlab-domain": "GitLab Pages, at a domain of yours",
1024
+ "security.add.place.github-domain": "GitHub Pages, at a domain of yours",
1025
+ "security.add.place.cloudflare-pages": "Cloudflare Pages",
1026
+ "security.add.place.vercel": "Vercel",
1027
+ "security.add.placeHint.gitlab-pages": "GitLab gives the project an address of its own, which nothing else shares. You'll find it under Deploy → Pages once it's online. No domain needed.",
1028
+ "security.add.placeHint.gitlab-domain": "A domain, or part of one, such as signin.example.org, that you point at GitLab Pages as its settings say.",
1029
+ "security.add.placeHint.github-domain": "GitHub Pages' own addresses are shared by every site in the same account, so the sign-in page needs a domain, or part of one, such as signin.example.org, which you point at GitHub Pages as its settings say.",
1030
+ "security.add.placeHint.cloudflare-pages": "Free, with an address of its own. Once the project is made, connect it to a Cloudflare Pages project, as its README says.",
1031
+ "security.add.placeHint.vercel": "Free for non-commercial sites, with an address of its own. Once the project is made, import it as a Vercel project, as its README says.",
1032
+ "security.add.domain": "Its domain",
1033
+ "security.add.domainHint": "Such as signin.example.org. It serves only the sign-in page.",
1034
+ "security.add.problem.domain": "That doesn't look like a domain, such as signin.example.org.",
1035
+ "security.add.problem.shared": "github.io and gitlab.io addresses are shared with other sites, so the sign-in page needs a domain of yours.",
1036
+ "security.add.problem.site": "That's the site's own address. The sign-in page needs one of its own.",
1037
+ "security.add.name": "Its name on {host}",
1038
+ "security.add.nameHint": "Made beside the site's on {host}, public, since it holds only Goodfellow's released files.",
1039
+ "security.add.token": "A {host} token that can create projects",
1040
+ "security.add.tokenHint": "Used only to make the project, and forgotten when you leave this screen.",
1041
+ "security.add.create": "Make the sign-in page",
1042
+ "security.add.creating": "Making the sign-in page…",
1043
+ "security.add.description": "The sign-in page for {site}",
1044
+ "security.add.message": "Add the sign-in page",
1045
+ "security.add.error.token": "{host} didn't accept that token. Check it's whole, and that it can create projects.",
1046
+ "security.add.error.owner": "That token can't create projects anywhere.",
1047
+ "security.add.error.taken": "There's already a project with that name. Choose another.",
1048
+ "security.add.error.release": "Goodfellow's sign-in page couldn't be downloaded. Try again in a moment.",
1049
+ "security.add.error.name-taken": "There's already a project with that name. Choose another.",
1050
+ "security.add.error.name-invalid": "{host} can't use that as a project's name.",
1051
+ "security.add.error.not-allowed": "That token can't create projects, or write their build setup.",
1052
+ "security.add.error.not-installed": "{host} needs the sign-in service's app installed there first.",
1053
+ "security.add.error.other": "The sign-in page couldn't be made.",
1054
+ "security.added.project": "The sign-in page's project is ready:",
1055
+ "security.added.github-pages": "GitHub Pages is putting it online. Point the domain at GitHub Pages as the project's Settings → Pages says, and wait for its certificate.",
1056
+ "security.added.gitlab-pages": "GitLab Pages is putting it online. Its address is under Deploy → Pages in the new project once the first build has finished.",
1057
+ "security.added.cloudflare-pages": "Now connect it to Cloudflare Pages: create a Pages project from the project, with no build command and site as the output directory.",
1058
+ "security.added.vercel": "Now import it as a Vercel project, with site as its root directory and no build command.",
1059
+ "security.added.domainUnavailable": "The domain couldn't be set for it, perhaps because another site has it. Set it in the project's Pages settings.",
1060
+ "security.added.pagesUnavailable": "Pages couldn't be turned on for it. Turn them on in the project's settings.",
1061
+ "security.added.address": "Once it opens at {address}, choose Sign in there from now on below. Editors sign in there once the site has rebuilt.",
1062
+ "security.added.then": "Once it's online, type its address below and choose Sign in there from now on. Editors sign in there once the site has rebuilt.",
1063
+ "security.broker.field": "The sign-in page's address",
1064
+ "security.broker.fieldHint": "An address that serves only the token broker, such as https://broker.example.org.",
1065
+ "security.broker.problem.invalid": "That needs to be an https:// address of its own, with nothing after the domain.",
1066
+ "security.broker.problem.shared": "github.io addresses are shared with every site in the same account, so the sign-in page needs a domain of its own.",
1067
+ "security.broker.problem.same-as-site": "That's the site's own address. The sign-in page needs one of its own.",
1068
+ "security.broker.redirect": "Editors sign in by going to {host} and coming back, so add the sign-in page's address to the redirect URIs of the application they sign in with on {host}.",
1069
+ "security.broker.use": "Sign in there from now on",
1070
+ "security.broker.message": "Sign in at {address}",
1071
+ "security.broker.error": "The sign-in page's address couldn't be published.",
1072
+ "security.broker.pending": "Once the site has been rebuilt, editors sign in at {address}, and the admin panel opens only there.",
1073
+ "security.broker.using": "Editors sign in at {address}, which keeps their sign-in and shows the admin panel.",
1074
+ "security.broker.stop": "Stop using the sign-in page",
1075
+ "security.broker.stopMessage": "Stop signing in at {address}",
1076
+ "security.broker.stopBody": "Once the site has been rebuilt, editors sign in in the admin panel itself again, which keeps their sign-in where the site's pages could reach it, and blocks from registries other than Goodfellow's can't be added there.",
1077
+ "broker.elsewhere": "Editors sign in to this site on its own sign-in page, which keeps your sign-in where the site's pages can't reach it, and shows the admin panel from there.",
1078
+ "broker.open": "Go to the sign-in page",
1079
+ "broker.invalid": "The site's config names a sign-in page whose address isn't one of its own, so the admin panel can't open. Ask the site's developer to fix the broker address in goodfellow.config.tsx.",
1080
+ "owner.token.pasteInBroker": "Copy the token, choose Use this token, and paste it where the sign-in page around the admin panel asks for it. It keeps the token, so the admin panel never sees it.",
1081
+ "owner.token.label": "Owner token",
1082
+ "owner.token.use": "Use this token",
1083
+ "owner.token.checking": "Checking…",
1084
+ "owner.token.error": "That token can't manage this site. Check that it was made by one of the site's owners, that it can access this site, and that the whole token was copied.",
1085
+ "owner.token.active": "This tab is using an owner token.",
1086
+ "owner.token.forget": "Stop using it",
1087
+ "settings.tab.editors": "Editors",
1088
+ "settings.tab.updates": "Updates",
1089
+ "settings.tab.history": "Site history",
1090
+ "settings.tab.comments": "Comments",
1091
+ "comments.intro": "Visitors' comments are shown on pages with the Comments block. They're kept either on GitHub, in a public project of their own, through Giscus, where visitors sign in with a GitHub account to comment, or by Disqus, where visitors sign in with Disqus or another account Disqus offers, or comment as guests where its settings allow it.",
1092
+ "comments.demo": "Comments can't be set up in the demo.",
1093
+ "settings.tab.stats": "Visit counts",
1094
+ "stats.intro": "Count how many people visit the site's pages, and which pages, with Plausible, Umami or GoatCounter. They count without cookies, and keep the counts on their own sites, where you read them. Visits aren't counted while you try the site on your computer, or in the admin panel.",
1095
+ "stats.state.title": "Counting visits",
1096
+ "stats.state.counting": "Visits to the site's pages are counted with {service}. Changes show on the site once it has been rebuilt.",
1097
+ "stats.dashboard": "Open {service}'s dashboard",
1098
+ "stats.consent.label": "Count only visitors who agree",
1099
+ "stats.consent.hint": "On a site that asks visitors first (General → Visitors' consent), the notice asks about statistics, and visits are counted only once a visitor allows them. Untick this only if you're sure the law where your visitors are lets you count without asking.",
1100
+ "stats.consent.notAsking": "The site doesn't ask visitors first yet (General → Visitors' consent), so visits are counted straight away.",
1101
+ "stats.consent.onMessage": "Count visits only once visitors agree",
1102
+ "stats.consent.offMessage": "Count visits without asking",
1103
+ "stats.change": "Change",
1104
+ "stats.stop": "Stop counting",
1105
+ "stats.stop.title": "Stop counting visits?",
1106
+ "stats.stop.body": "The site's pages will stop sending visits to {service}. The counts you have stay in {service}.",
1107
+ "stats.stop.message": "Stop counting visits",
1108
+ "stats.form.title": "Count visits",
1109
+ "stats.service": "Service",
1110
+ "stats.paste": "Code or details",
1111
+ "stats.paste.plausible": "Paste the script Plausible gives you under Site settings → Site installation, or just your site's domain in Plausible, such as example.org.",
1112
+ "stats.paste.umami": "Paste the tracking code Umami gives you under Settings → Websites → Edit, or just the website ID.",
1113
+ "stats.paste.goatcounter": "Paste the script GoatCounter gives you under Settings → Site code, or just your site's code, such as mysite for mysite.goatcounter.com.",
1114
+ "stats.domain": "Your site's domain in Plausible",
1115
+ "stats.domainHint": "As Plausible lists it, such as example.org. Its dashboard is named by it.",
1116
+ "stats.unreadable": "This doesn't look like that service's code. Check you chose the right service and pasted all of it. Only https:// addresses on the internet work.",
1117
+ "stats.publish": "Start counting",
1118
+ "stats.message": "Count visits with {service}",
1119
+ "comments.local": "Comments on GitHub are set up from the admin panel on the live site, which signs in to GitHub. Pages here show them once they are. Disqus can be set up here.",
1120
+ "comments.unavailable": "The admin panel can set up comments on GitHub only where it signs in to GitHub itself. Set them up on GitHub as the documentation's Comments page says, then paste Giscus's code into the Comments block, or use Disqus.",
1121
+ "comments.setup.title": "Set up comments",
1122
+ "comments.setup.new": "Make a new project for comments",
1123
+ "comments.setup.existing": "Use a project I already have",
1124
+ "comments.setup.name": "Name of the new project",
1125
+ "comments.setup.nameHint": "It's made beside the site's own on GitHub. Anyone can read it, since visitors read the comments from there.",
1126
+ "comments.setup.existingName": "The project, as owner/name or its address on GitHub",
1127
+ "comments.setup.existingHint": "It must be public. Its Discussions are turned on if they're off.",
1128
+ "comments.setup.button": "Set up comments",
1129
+ "comments.setup.working": "Setting up…",
1130
+ "comments.setup.description": "Visitors' comments on {site}",
1131
+ "comments.setup.message": "Set up comments",
1132
+ "comments.install.title": "Last step: install Giscus",
1133
+ "comments.install.intro": "Giscus is the GitHub app that shows comments on pages and posts what visitors write. Install it on {project}, choosing only that project.",
1134
+ "comments.install.button": "Install Giscus",
1135
+ "comments.install.then": "Then add the Comments block to a page, or to a collection's template. Pages show comments once the site has been rebuilt.",
1136
+ "comments.place.title": "Where comments are kept",
1137
+ "comments.place.kept": "Comments are kept as {category} discussions in",
1138
+ "comments.place.install": "If pages don't show comments, check that Giscus is installed on the project:",
1139
+ "comments.place.giscus": "Giscus on GitHub",
1140
+ "comments.stop.button": "Stop using comments",
1141
+ "comments.stop.title": "Stop using comments?",
1142
+ "comments.stop.body": "Pages stop showing comments once the site has been rebuilt. Everything visitors wrote stays in {project} on GitHub, so you can set comments up with it again later.",
1143
+ "comments.stop.message": "Stop using comments",
1144
+ "comments.disqus.title": "Use Disqus",
1145
+ "comments.disqus.intro": "Disqus keeps comments on its own service, where you approve, hide and delete them. Its free plan shows ads with them.",
1146
+ "comments.disqus.create": "Make a site on Disqus",
1147
+ "comments.disqus.then": ", then paste its shortname, which Disqus shows in its settings, or the code it gives you to install it.",
1148
+ "comments.disqus.label": "Disqus's shortname, or its code",
1149
+ "comments.disqus.invalid": "That isn't a shortname or Disqus's code. A shortname has only letters, numbers and hyphens, such as stjoseph.",
1150
+ "comments.disqus.button": "Use Disqus",
1151
+ "comments.disqus.message": "Use Disqus for comments",
1152
+ "comments.disqus.kept": "Comments are kept by Disqus, for its site",
1153
+ "comments.disqus.moderateHint": "Approve, hide and delete comments, and block people, on Disqus.",
1154
+ "comments.disqus.moderate": "Moderate comments on Disqus",
1155
+ "comments.disqus.stopBody": "Pages stop showing comments once the site has been rebuilt. Everything visitors wrote stays on Disqus, so you can use it again later.",
1156
+ "comments.garrul.title": "Use Garrul",
1157
+ "comments.garrul.intro": "Garrul keeps comments in a Cloudflare account of your own, on Cloudflare's free plan, with no ads. Visitors comment as guests or sign in with GitHub, Google, Facebook, X or Discord. It needs setting up on Cloudflare first, by someone used to running commands on a computer.",
1158
+ "comments.garrul.start": "Garrul's instructions",
1159
+ "comments.garrul.then": " say how to set it up. Then paste its address, or the code it gives you for a page.",
1160
+ "comments.garrul.label": "Garrul's address, or its code",
1161
+ "comments.garrul.invalid": "That isn't an address or Garrul's code. Garrul's address starts with https://, such as https://comments.example.org.",
1162
+ "comments.garrul.button": "Use Garrul",
1163
+ "comments.garrul.message": "Use Garrul for comments",
1164
+ "comments.garrul.kept": "Comments are kept by Garrul, at",
1165
+ "comments.garrul.origins": "Garrul shows comments only at the addresses its settings allow, so its ALLOWED_ORIGINS must include the site's address.",
1166
+ "comments.garrul.moderateHint": "Approve, hide and delete comments on Garrul's own pages, signed in with an email address its settings name as an admin.",
1167
+ "comments.garrul.moderate": "Moderate comments on Garrul",
1168
+ "comments.garrul.stopBody": "Pages stop showing comments once the site has been rebuilt. Everything visitors wrote stays in Garrul, so you can use it again later.",
1169
+ "comments.moderate.title": "What visitors have written",
1170
+ "comments.moderate.empty": "No one has commented yet.",
1171
+ "comments.moderate.more": "Show more pages",
1172
+ "comments.moderate.block": "To stop someone commenting at all, block them on GitHub.",
1173
+ "comments.moderate.blockLink": "How to block someone",
1174
+ "comments.thread.count": "Comments: {count}",
1175
+ "comments.thread.locked": "Closed to new comments",
1176
+ "comments.thread.lock": "Close to new comments",
1177
+ "comments.thread.unlock": "Open to new comments",
1178
+ "comments.openOnGitHub": "Open on GitHub",
1179
+ "comments.comment.hidden": "Hidden",
1180
+ "comments.comment.hiddenAs": "Hidden as {reason}",
1181
+ "comments.comment.hide": "Hide",
1182
+ "comments.comment.show": "Show again",
1183
+ "comments.comment.delete": "Delete",
1184
+ "comments.hide.title": "Hide this comment?",
1185
+ "comments.hide.body": "It stays on the page, folded away and marked with why it was hidden, until you show it again.",
1186
+ "comments.hide.reason": "Why",
1187
+ "comments.reason.spam": "spam",
1188
+ "comments.reason.abuse": "abusive",
1189
+ "comments.reason.off-topic": "off topic",
1190
+ "comments.delete.title": "Delete this comment?",
1191
+ "comments.delete.body": "It's removed for good.",
1192
+ "comments.delete.bodyReplies": "It's removed for good, with the replies to it.",
1193
+ "comments.token.title": "Use a GitHub token for comments",
1194
+ "comments.token.intro": "The admin panel's sign-in can reach only the site's own project on GitHub. To set up and moderate comments, use a GitHub token of your own. It's kept only in this tab, until you sign out.",
1195
+ "comments.token.create": "Create a token on GitHub",
1196
+ "comments.token.scope": "It's filled in with what comments need: leave the choices as they are.",
1197
+ "comments.token.paste": "Copy the token and paste it here:",
1198
+ "comments.token.label": "GitHub token",
1199
+ "comments.token.active": "This tab is using a GitHub token of your own for comments.",
1200
+ "comments.error.no-access": "GitHub didn't let this sign-in do that. Use a GitHub token of your own, made by someone who can manage the project.",
1201
+ "comments.error.not-found": "GitHub has no project with that name, or this sign-in can't see it.",
1202
+ "comments.error.not-public": "That project is private, so visitors couldn't read its comments. Make it public on GitHub, then try again.",
1203
+ "comments.error.name-taken": "There's already a project with that name. Choose another name, or use it as a project you already have.",
1204
+ "comments.error.name-invalid": "A project's name can have only letters, numbers, hyphens, underscores and dots.",
1205
+ "comments.error.no-discussions": "Discussions are off in that project, and this sign-in can't turn them on. Turn them on in the project's settings on GitHub, then try again.",
1206
+ "comments.error.no-category": "That project's Discussions have no categories yet. Open its Discussions on GitHub once, then try again.",
1207
+ "comments.error.other": "Something went wrong on GitHub. Try again in a moment.",
1208
+ "comments.error.fix": "Open it on GitHub",
1209
+ "settings.tab.import": "Import",
1210
+ "settings.tab.themes": "Themes",
1211
+ "plugins.notFound": "The site has no plugin screen at this address.",
1212
+ "plugins.failed": "{plugin}'s screen couldn't start. If it keeps happening, the plugin may need updating.",
1213
+ "themes.intro": "A theme changes your site's look: its colors, fonts and the styles of its blocks, and sometimes its header and footer. Themes are only settings and styles, with no code, and you can change anything a theme sets afterwards in Colors & fonts and Custom CSS.",
1214
+ "themes.installed": "Installed theme",
1215
+ "themes.noneInstalled": "No theme is installed. Your site uses its own colors and fonts.",
1216
+ "themes.installedBadge": "Installed",
1217
+ "themes.release": "version {version}",
1218
+ "themes.updateAvailable": "Version {version} is out",
1219
+ "themes.updateTo": "Update to {version}",
1220
+ "themes.seeVersion": "See version {version}",
1221
+ "themes.upToDate": "Up to date",
1222
+ "themes.show": "Show",
1223
+ "themes.showLabel": "Show {name}",
1224
+ "themes.find": "Find a theme",
1225
+ "themes.search": "Search themes",
1226
+ "themes.searchButton": "Search",
1227
+ "themes.loading": "Looking for themes…",
1228
+ "themes.noneFound": "No themes were found.",
1229
+ "themes.byPublisher": "{name}, published by {publisher}",
1230
+ "themes.releaseDetails": "{name}, version {version}, published {date}",
1231
+ "themes.provenance": "Built from {source}, which npm checked when it was published.",
1232
+ "themes.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.",
1233
+ "themes.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.",
1234
+ "themes.installNow": "Install {version} now",
1235
+ "themes.early": "{version} was built from the same place as {installed}, the version installed ({source}), by the same publishing setup, so it can be installed now, without the wait. The site's build checks that before it uses it.",
1236
+ "themes.earlyNotice": "Installing {version} before it's {days} days old, since it was built where {installed} was.",
1237
+ "themes.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.",
1238
+ "themes.tooNew": "This theme's versions are too new to install. Versions can be installed once they're {days} days old.",
1239
+ "themes.notCompatible": "No version of this theme says it works with Goodfellow {version}.",
1240
+ "themes.imageAlt": "A site with the {title} theme",
1241
+ "themes.loads": "This theme asks visitors' browsers for these files from other sites, which can tell those sites who visits yours:",
1242
+ "themes.useLayout": "Use the theme's header and footer in place of yours. Your menus, logo and contact details stay as they are.",
1243
+ "themes.layoutUnknown": "The theme's header and footer use blocks a theme can't add, or that your site doesn't have ({blocks}), so they can't be used.",
1244
+ "themes.kept": "You changed these since the version before, so they stay as you set them: {list}.",
1245
+ "themes.replaced": "You changed these, and installing this theme replaces your changes: {list}.",
1246
+ "themes.changed.css": "the theme's CSS",
1247
+ "themes.preview": "Your site with {title}",
1248
+ "themes.previewPage": "Page to look at",
1249
+ "themes.install": "Install and publish",
1250
+ "themes.installDemo": "Install",
1251
+ "themes.installMessage": "Install the {title} theme, version {version}",
1252
+ "themes.updateMessage": "Update the {title} theme to version {version}",
1253
+ "themes.installedNotice": "{title} is installed. Your site will show it once it's rebuilt.",
1254
+ "themes.updated": "{title} is updated to version {version}.",
1255
+ "themes.remove": "Remove",
1256
+ "themes.removeTitle": "Remove {title}?",
1257
+ "themes.removeBody": "Colors, fonts and styles the theme set go back to Goodfellow's defaults, and its CSS is removed. Anything you changed yourself, and your header and footer, stay as they are.",
1258
+ "themes.removeReplaced": "Removing it also removes your changes to: {list}.",
1259
+ "themes.removeMessage": "Remove the {title} theme",
1260
+ "themes.removed": "{title} is removed.",
1261
+ "themes.error.record": "The record of which theme is installed can't be read.",
1262
+ "themes.error.unreachable": "Themes can't be looked up right now. Check your internet connection and try again.",
1263
+ "themes.error.badFile": "This theme has a problem in its files, so it can't be installed. Its publisher needs to fix it.",
1264
+ "themes.error.notATheme": "This package isn't a Goodfellow theme.",
1265
+ "settings.tab.plugins": "Plugins",
1266
+ "plugins.intro": "Plugins add to what your site and this admin panel can do, such as blocks, screens here, and steps when your site is built. Unlike themes, they have code, which is included when your site is built and runs on its pages, so install only plugins you trust. Before you install one, this screen shows what it asks to do and reads its code for things to look at.",
1267
+ "plugins.where.none": "Plugins can be installed here once the admin panel has an address of its own, or a token broker, where your site's pages can't reach it: see the Domain and Security tabs. Until then, a developer can add plugins to the site's code.",
1268
+ "plugins.where.contentOnly": "This site's code is kept apart from its content, so a developer adds plugins there.",
1269
+ "plugins.where.demo": "Plugins can't be installed in a demo.",
1270
+ "plugins.where.local": "On this computer, a developer adds plugins with npm and lists them in goodfellow.config.tsx. The published admin panel installs them.",
1271
+ "plugins.where.setup": "Your site's build doesn't write the list of its packages' versions yet, which plugins installed here need. A developer needs to update its build setup to the starter's first.",
1272
+ "plugins.installed": "Installed plugins",
1273
+ "plugins.noneInstalled": "No plugins are installed.",
1274
+ "plugins.inCode": "Added by a developer",
1275
+ "plugins.installedBadge": "Installed",
1276
+ "plugins.release": "version {version}",
1277
+ "plugins.updateAvailable": "Version {version} is out",
1278
+ "plugins.updateTo": "Update to {version}",
1279
+ "plugins.seeVersion": "See version {version}",
1280
+ "plugins.upToDate": "Up to date",
1281
+ "plugins.show": "Show",
1282
+ "plugins.showLabel": "Show {name}",
1283
+ "plugins.find": "Find a plugin",
1284
+ "plugins.search": "Search plugins",
1285
+ "plugins.searchButton": "Search",
1286
+ "plugins.loading": "Looking for plugins…",
1287
+ "plugins.noneFound": "No plugins were found.",
1288
+ "plugins.byPublisher": "{name}, published by {publisher}",
1289
+ "plugins.releaseDetails": "{name}, version {version}, published {date}",
1290
+ "plugins.provenance": "Built from {source}, which npm checked when it was published.",
1291
+ "plugins.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.",
1292
+ "plugins.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.",
1293
+ "plugins.installNow": "Install {version} now",
1294
+ "plugins.early": "{version} was built from the same place as {installed}, the version installed ({source}), by the same publishing setup, so it can be installed now, without the wait. The site's build checks that before it uses it.",
1295
+ "plugins.earlyNotice": "Installing {version} before it's {days} days old, since it was built where {installed} was.",
1296
+ "plugins.earlyRefused": "The site wouldn't take {version} before it's {days} days old: {reasons}",
1297
+ "plugins.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.",
1298
+ "plugins.tooNew": "This plugin's versions are too new to install. Versions can be installed once they're {days} days old.",
1299
+ "plugins.notCompatible": "No version of this plugin says it works with Goodfellow {version}.",
1300
+ "plugins.asks": "What it asks to do",
1301
+ "plugins.asks.connect": "Reach these addresses from the admin panel: {list}",
1302
+ "plugins.asks.files": "Read and publish these files: {list}",
1303
+ "plugins.asks.secrets": "Get these secrets when your site is built: {list}",
1304
+ "plugins.asks.read": "Read these parts of your site when it's built: {list}",
1305
+ "plugins.asks.write": "Write these parts of the built site: {list}",
1306
+ "plugins.asks.blocks": "Add these blocks: {list}",
1307
+ "plugins.asks.admin": "Run in the admin panel, in a frame of its own that can't reach your sign-in",
1308
+ "plugins.asks.screens": "Add these screens to Site Settings: {list}",
1309
+ "plugins.asks.build": "Run these steps when your site is built: {list}",
1310
+ "plugins.asks.tasks": "Run these tasks with its secrets when the admin panel asks, each taking about a minute: {list}",
1311
+ "plugins.secrets.github.title": "Add them on GitHub",
1312
+ "plugins.secrets.github.link": "Open GitHub's form for a new secret",
1313
+ "plugins.secrets.github.open": "Open GitHub's form for a new secret with the link below. Add each key there, one at a time, opening the form again for the next.",
1314
+ "plugins.secrets.github.add": "For {name}: type {name} in Name, paste its value in Secret, and choose Add secret.",
1315
+ "plugins.secrets.github.who": "Only the site's owners on GitHub can open the form.",
1316
+ "plugins.secrets.github.kind": "This form adds secrets for this site alone, which is all it needs. GitHub's environment and organization secrets are for other things, so you can leave them alone.",
1317
+ "plugins.secrets.gitlab.title": "Add them on GitLab",
1318
+ "plugins.secrets.gitlab.link": "Open the site's CI/CD settings on GitLab",
1319
+ "plugins.secrets.gitlab.open": "Open the site's CI/CD settings on GitLab with the link below, and expand Variables. Add each key there, one at a time.",
1320
+ "plugins.secrets.gitlab.add": "For {name}: choose Add variable, choose Masked under Visibility, keep Protect variable ticked, type goodfellow-tasks under Environments where GitLab offers it, so only the task gets it, type {name} in Key, paste its value in Value, and choose Add variable.",
1321
+ "plugins.secrets.gitlab.who": "Only the site's owners (Maintainers) on GitLab can change its CI/CD settings.",
1322
+ "plugins.secrets.bitbucket.title": "Add them on Bitbucket",
1323
+ "plugins.secrets.bitbucket.link": "Open the site's Pipelines variables on Bitbucket",
1324
+ "plugins.secrets.bitbucket.open": "Open the site's Pipelines variables on Bitbucket with the link below. Add each key there, one at a time. If Bitbucket says Pipelines isn't turned on, turn it on under Settings first.",
1325
+ "plugins.secrets.bitbucket.add": "For {name}: type {name} in Name, paste its value in Value, tick Secured, and choose Add.",
1326
+ "plugins.secrets.bitbucket.who": "Only the site's owners (with Admin permission) on Bitbucket can change its variables.",
1327
+ "plugins.secrets.development.title": "Add them on this computer",
1328
+ "plugins.secrets.development.file": "In the site's folder, beside package.json, open the file .env.local, or make it, and add a line for each of {names}:",
1329
+ "plugins.secrets.development.values": "Put each value after its =, save the file, and try again. There's no need to restart the development server.",
1330
+ "plugins.secrets.development.local": "This is only for trying the site on this computer: .env.local is never published. The live site needs them in its own secrets too.",
1331
+ "plugins.secrets.server.title": "Add them to the site's server",
1332
+ "plugins.secrets.server.add": "Add {names} as environment variables where the site's server runs, such as the project's Settings → Environment Variables on Vercel.",
1333
+ "plugins.secrets.server.deploy": "Then deploy the site again so the server has them.",
1334
+ "plugins.secrets.server.who": "Whoever set up the site's server knows where its environment variables are. Without them there, the build service's secrets below are used instead, which is slower.",
1335
+ "plugins.task.missing": "Your site's setup can't run plugins' tasks yet. A developer needs to copy the starter's plugin-task setup into the site.",
1336
+ "plugins.task.not-allowed": "Your sign-in can't run plugins' tasks. Ask the site's owner to let you publish.",
1337
+ "plugins.task.timeout": "The site's build service didn't answer in time. Try again in a few minutes.",
1338
+ "plugins.task.failed": "The site's build service couldn't run the plugin's task. Try again, or ask a developer to look at the site's builds.",
1339
+ "plugins.asks.server": "Answer requests on your site's server, with everything the server can do",
1340
+ "plugins.asks.mediaStorage": "Keep your site's media in a storage service, outside the site's own files",
1341
+ "plugins.asks.editor": "Offer its own page editor, {title}, which anyone editing the site can choose in place of the usual one, and which is given what they edit there",
1342
+ "plugins.asks.always": "Like any plugin, its code is included when your site is built, and its blocks run on your site's pages, where nothing holds them to what it asks.",
1343
+ "plugins.asks.new": "This version asks for more than the one installed:",
1344
+ "plugins.code": "What its code does",
1345
+ "plugins.code.intro": "The plugin's code, and the code of the packages it needs, read as text for things to look at. Code can hide what it does, so this is a place to start, not a promise.",
1346
+ "plugins.code.reading": "Reading its code…",
1347
+ "plugins.code.via": "needed by {via}",
1348
+ "plugins.code.none": "Nothing to look at was found.",
1349
+ "plugins.code.summary": "Its code: {list}.",
1350
+ "plugins.code.nothing": "Nothing to look at was found in its code.",
1351
+ "plugins.code.unreadSummary": "{count} of its packages couldn't be read in full.",
1352
+ "plugins.note.network": "makes network requests",
1353
+ "plugins.note.programs": "runs other programs on the computer that builds your site",
1354
+ "plugins.note.eval": "runs code made from text, which can't be read beforehand",
1355
+ "plugins.note.native": "includes native code, which can't be read",
1356
+ "plugins.note.install-script": "has a script npm would run when installing it, which your site's build doesn't run, since it installs packages with scripts turned off",
1357
+ "plugins.unread.too-large": "Too large to read in full.",
1358
+ "plugins.unread.too-many": "Not read: the plugin needs too many packages to read them all.",
1359
+ "plugins.unread.no-release": "No version of it is old enough yet, so your site couldn't be built with this plugin.",
1360
+ "plugins.unread.range": "Comes from somewhere other than npm, so it wasn't read.",
1361
+ "plugins.unread.unavailable": "Couldn't be read.",
1362
+ "plugins.install": "Install",
1363
+ "plugins.confirmTitle": "Install {title}?",
1364
+ "plugins.confirmIntro": "{name} version {version} asks to:",
1365
+ "plugins.confirmConfig": "Your site's settings file is changed too, to list the plugins installed here, since it didn't yet.",
1366
+ "plugins.confirmBuild": "Your site's build then writes down the versions of the packages it needs, without running any of their code, and rebuilds your site with it, which takes a few minutes.",
1367
+ "plugins.confirmReview": "Your site's server holds its secrets, so installing a plugin is submitted for review, for a developer to accept.",
1368
+ "plugins.confirmInstall": "Install and publish",
1369
+ "plugins.submit": "Submit for review",
1370
+ "plugins.reviewIntro": "Installs {name} version {version}, from the admin panel's Plugins screen. It asks to:",
1371
+ "plugins.installMessage": "Install the {title} plugin, version {version}",
1372
+ "plugins.updateMessage": "Update the {title} plugin to version {version}",
1373
+ "plugins.installedNotice": "{title} is installed. Your site will have it once it's rebuilt, in a few minutes.",
1374
+ "plugins.updated": "{title} is updated to version {version}.",
1375
+ "plugins.submitted": "The change to {title} is submitted for review.",
1376
+ "plugins.seeReview": "See it",
1377
+ "plugins.remove": "Remove",
1378
+ "plugins.removeReview": "Submit for review",
1379
+ "plugins.removeTitle": "Remove {title}?",
1380
+ "plugins.removeBody": "Its code is taken out of your site when it's next built. Files it kept in your site's content stay where they are.",
1381
+ "plugins.removeUsed": "Pages use its blocks ({blocks}), so it can't be removed. Take them off those pages first.",
1382
+ "plugins.removeKeepsMedia": "{title} keeps your site's media, which pages show from its storage. Move the media back into the site's own files on the Media screen first.",
1383
+ "plugins.removeMessage": "Remove the {title} plugin",
1384
+ "plugins.removed": "{title} is removed.",
1385
+ "plugins.error.record": "The record of which plugins are installed can't be read.",
1386
+ "plugins.error.unreachable": "Plugins can't be looked up right now. Check your internet connection and try again.",
1387
+ "plugins.error.badFile": "This plugin has a problem in its files, so it can't be installed. Its publisher needs to fix it.",
1388
+ "plugins.error.notAPlugin": "This package isn't a Goodfellow plugin.",
1389
+ "plugins.error.config": "Your site's settings file lists plugins of its own, so a developer needs to add the ones installed here to it first.",
1390
+ "plugins.error.inCode": "A developer added this plugin to the site's code, so it's changed there.",
1391
+ "plugins.error.blockClash": "This plugin's blocks have the same names as ones your site has: {blocks}.",
1392
+ "plugins.error.notInstalled": "This plugin wasn't installed here.",
1393
+ "updates.pluginRange": "{title}, a plugin installed here, says it works with Goodfellow {range}, so your site may not build with Goodfellow {version} until the plugin has a newer version.",
1394
+ "updates.themeRange": "Your theme, {title}, says it works with Goodfellow {range}. Goodfellow {version} may change how it looks, so check Themes for a newer version of it after updating.",
1395
+ "siteHistory.intro": "Every publish that changed the site's pages, items, settings or media, newest first. Choose one to see how the site looked after it and what has changed since, then restore the whole site as it was.",
1396
+ "siteHistory.local": "Site history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
1397
+ "siteHistory.demo": "Site history isn't kept in a demo.",
1398
+ "siteHistory.error": "The site's history couldn't be loaded. Check your connection and try again.",
1399
+ "siteHistory.current": "The site now",
1400
+ "siteHistory.preview": "The site on {date}",
1401
+ "siteHistory.loadingVersion": "Loading the site as it was…",
1402
+ "siteHistory.readError": "The site as it was then couldn't be loaded. Check your connection and try again.",
1403
+ "siteHistory.unfit": "The site as it was then can't be shown or restored, because it doesn't fit the site as it is now.",
1404
+ "siteHistory.unknownBlocks": "The site as it was then can't be restored, because it uses blocks the site doesn't have any more: {blocks}.",
1405
+ "siteHistory.same": "Nothing has changed since: this is how the site is now.",
1406
+ "siteHistory.since": "What has changed since",
1407
+ "siteHistory.changed": "Changed since (restoring puts them back as they were):",
1408
+ "siteHistory.added": "Added since (restoring removes them):",
1409
+ "siteHistory.removed": "Removed since (restoring brings them back):",
1410
+ "siteHistory.page": "Page to look at",
1411
+ "siteHistory.restore": "Restore the site as it was",
1412
+ "siteHistory.restoreTitle": "Restore the site as it was on {date}?",
1413
+ "siteHistory.restoreBody": "Everything listed ({count}) goes back to how it was then, in one publish. The site as it is now stays in the history, so you can restore it again later. The site's code and update settings stay as they are.",
1414
+ "siteHistory.restoreMessage": "Restore the site as it was on {date}",
1415
+ "siteHistory.restored": "Restored the site as it was on {date}.",
1416
+ "siteHistory.subject.page": "{title} ({path})",
1417
+ "siteHistory.subject.entry": "{title}, in {collection}",
1418
+ "siteHistory.subject.collection": "The settings and page design of {name}",
1419
+ "siteHistory.subject.settings": "Site settings",
1420
+ "siteHistory.subject.menus": "Menus",
1421
+ "siteHistory.subject.redirects": "Redirects",
1422
+ "siteHistory.subject.credits": "Photo credits and descriptions",
1423
+ "siteHistory.subject.css": "Custom CSS",
1424
+ "siteHistory.subject.theme": "Which theme is installed",
1425
+ "siteHistory.subject.code": "Code added to every page",
1426
+ "goTo.title": "Go to…",
1427
+ "goTo.label": "Page, item or screen",
1428
+ "goTo.placeholder": "Type a page, item or screen",
1429
+ "goTo.empty": "Nothing matches.",
1430
+ "goTo.kind.screen": "Screen",
1431
+ "goTo.kind.settings": "Site Settings",
1432
+ "goTo.kind.page": "Page",
1433
+ "goTo.kind.item": "Item",
1434
+ "goTo.kind.collection": "Collection",
1435
+ "goTo.kind.synced": "Synced block",
1436
+ "shortcuts.title": "Keyboard shortcuts",
1437
+ "shortcuts.save": "Add your changes to a draft, in an editor",
1438
+ "shortcuts.undo": "Undo",
1439
+ "shortcuts.redo": "Redo",
1440
+ "shortcuts.goTo": "Go to a page, item or screen",
1441
+ "shortcuts.help": "Show these shortcuts",
1442
+ "shortcuts.or": "or",
1443
+ "shortcuts.typing": "Undo, Redo and ? work outside text boxes, which keep their own undo.",
1444
+ "siteHistory.download.title": "Download a copy",
1445
+ "siteHistory.download.intro": "A zip file of the site's pages, items, settings and media library as they are here, with a list of the blocks and plugins it added, to keep somewhere safe. The site's code isn't in it.",
1446
+ "siteHistory.download.stored": "Media kept in a storage service isn't in the copy: it stays in the storage service, and the copy lists it.",
1447
+ "siteHistory.download.button": "Download a copy",
1448
+ "siteHistory.download.working": "Making the copy: {done} of {total} files…",
1449
+ "siteHistory.download.error": "The copy couldn't be made. Check your connection and try again.",
1450
+ "import.title": "Import from WordPress",
1451
+ "import.intro": "Bring a WordPress site's pages, posts, categories, tags, menus and media into this site. Pages keep their addresses, posts become a collection, and old addresses send visitors on to the new ones. You'll see what comes across before anything changes.",
1452
+ "import.file": "WordPress export file",
1453
+ "import.fileHint": "In WordPress, go to Tools → Export, choose All content and download the file. It brings the menus too.",
1454
+ "import.address": "Or the WordPress site's address",
1455
+ "import.addressHint": "Such as example.org. Only what visitors can see is read, and menus can't be.",
1456
+ "import.read": "Read the site",
1457
+ "import.reading": "Reading the WordPress site…",
1458
+ "import.ready": "Ready to import {title}",
1459
+ "import.summary.pages": "Pages: {count}",
1460
+ "import.summary.posts": "Posts: {count}, at {path}, listed on {list}",
1461
+ "import.summary.terms": "Categories: {categories}. Tags: {tags}.",
1462
+ "import.summary.menus": "Menus: {count}",
1463
+ "import.summary.synced": "Synced blocks, from synced patterns: {count}",
1464
+ "import.summary.redirects": "Old addresses sent on to new ones: {count}",
1465
+ "import.summary.media": "Media files to copy: {count}",
1466
+ "import.replaces": "These pages will be replaced: {pages}. Version history keeps the old ones.",
1467
+ "import.check": "Check these",
1468
+ "import.start": "Import",
1469
+ "import.another": "Choose another site",
1470
+ "import.copying": "Copying media: {done} of {total}…",
1471
+ "import.publishing": "Publishing…",
1472
+ "import.done": "Imported {title}.",
1473
+ "import.viewPages": "See the pages",
1474
+ "import.message": "Import {title} from WordPress",
1475
+ "import.note.leftOut.drafts": "Drafts and pages waiting for review aren't imported: {count}.",
1476
+ "import.note.leftOut.private": "Private pages and posts aren't imported: {count}.",
1477
+ "import.note.leftOut.trash": "Pages and posts in the trash aren't imported: {count}.",
1478
+ "import.note.leftOut.comments": "Comments aren't imported: {count}.",
1479
+ "import.note.leftOut.other": "WordPress content of the kind “{name}” isn't imported: {count}.",
1480
+ "import.note.more": "{items} and {count} more",
1481
+ "import.note.block": "The “{name}” block, from another plugin, was brought across as its text and pictures: {items}.",
1482
+ "import.note.dropped": "The “{name}” block shows something only WordPress has, so it was left out: {items}.",
1483
+ "import.note.shortcode": "The [{name}] shortcode only works in WordPress, so it was left out: {items}.",
1484
+ "import.note.embed": "Something from {name} is now a link to it: {items}.",
1485
+ "import.note.form": "A form was left out. Add a Form block in its place: {items}.",
1486
+ "import.note.script": "A script was left out: {items}.",
1487
+ "import.note.table": "A table became text, since the site has no Table block: {items}.",
1488
+ "import.note.posts": "A list of the latest posts was left out of a post: {items}.",
1489
+ "import.note.video": "A video is now a link to it, since posts show videos as links: {items}.",
1490
+ "import.note.oldLinks": "Links that still go to the WordPress site, to pages that weren't imported: {count}, such as {url}.",
1491
+ "import.note.notCopied": "Media files that couldn't be copied, so pages show them from the WordPress site until you upload them: {count}, such as {url}. Most WordPress sites don't let other sites download their files; importing from the command line copies them.",
1492
+ "import.note.unusedMedia": "Files in the media library that no page or post uses, so they weren't copied: {count}.",
1493
+ "import.note.noMenus": "Menus can't be read from a site's address, so the main menu lists the top-level pages. Import an export file to bring the menus across.",
1494
+ "import.error.notExportFile": "That file isn't a WordPress export file. In WordPress, go to Tools → Export, choose All content and download the file.",
1495
+ "import.error.unreachable": "The WordPress site couldn't be read from {address}. Check the address. Some sites don't let other sites read them; then import an export file instead.",
1496
+ "import.error.notWordPress": "{address} doesn't look like a WordPress site, or its API is turned off. Import an export file instead.",
1497
+ "import.error.blocks": "Importing needs blocks this site doesn't have: {blocks}. A developer can add Goodfellow's built-in blocks to goodfellow.config.tsx.",
1498
+ "import.error.other": "The WordPress site couldn't be imported.",
1499
+ "markdownImport.title": "Import Markdown files",
1500
+ "markdownImport.intro": "Bring in a folder of Markdown files, such as another website's content or notes. You choose which folders become pages and which become collections, and see what comes across before anything changes. Links between the files and the pictures beside them come too.",
1501
+ "markdownImport.folder": "Folder of Markdown files",
1502
+ "markdownImport.folderHint": "Choose the folder itself. Your browser may ask before sharing its files with this page.",
1503
+ "markdownImport.reading": "Reading the files…",
1504
+ "markdownImport.ready": "Ready to import {name}. Choose how each folder comes across:",
1505
+ "markdownImport.folders": "Folders",
1506
+ "markdownImport.folderName": "{name} ({count} files)",
1507
+ "markdownImport.topFiles": "Files at the top ({count})",
1508
+ "markdownImport.asCollection": "A collection",
1509
+ "markdownImport.asPages": "Pages",
1510
+ "markdownImport.replaceHome": "Replace the home page with the top's index file",
1511
+ "markdownImport.replacePages": "Replace pages the site already has at the same addresses",
1512
+ "markdownImport.drafts": "Import drafts too, into a draft for you to check",
1513
+ "markdownImport.menu": "Add the top-level pages to the main menu",
1514
+ "markdownImport.keepFields": "Keep other front matter as fields",
1515
+ "markdownImport.summary.collection": "{name}: {count} items, at {path}",
1516
+ "markdownImport.summary.menu": "Pages added to the main menu: {count}",
1517
+ "markdownImport.intoDraft": "With {count} drafts, everything goes into a draft, so nothing goes live until you publish it.",
1518
+ "markdownImport.another": "Choose another folder",
1519
+ "markdownImport.done": "Imported {name}.",
1520
+ "markdownImport.doneDraft": "Imported {name} into a draft. Publish it from the bar at the top when it's ready.",
1521
+ "markdownImport.message": "Import the Markdown files in {name}",
1522
+ "markdownImport.error.none": "That folder has no Markdown files in it. Choose the folder the .md files are in.",
1523
+ "markdownImport.error.other": "The files couldn't be imported.",
1524
+ "markdownImport.names.item": "Item",
1525
+ "markdownImport.names.all": "See all",
1526
+ "markdownImport.note.drafts": "Drafts aren't imported unless you ask: {items}.",
1527
+ "markdownImport.note.taken": "Left out, since the site already has pages at their addresses: {items}.",
1528
+ "markdownImport.note.frontMatter": "Their front matter couldn't be read, so they come without it: {items}.",
1529
+ "markdownImport.note.missingLinks": "Links to files or pages the import doesn't have are just their words now: {items}.",
1530
+ "markdownImport.note.missingMedia": "Pictures or files the folder doesn't have were left out: {items}.",
1531
+ "markdownImport.note.notCopied": "Files that couldn't be copied, such as ones too large, were left out: {items}.",
1532
+ "markdownImport.note.templateCode": "Another website's template code, such as {{< … >}}, shows as written: {items}.",
1533
+ "markdownImport.note.html": "HTML in these items shows as text, since items keep their Markdown: {items}.",
1534
+ "markdownImport.note.fields": "Front matter left out: {names}. Tick “Keep other front matter as fields” to keep it.",
1535
+ "markdownImport.note.converted": "Something in these pages was simplified: {items}.",
1536
+ "import.names.posts": "Posts",
1537
+ "import.names.post": "Post",
1538
+ "import.names.title": "Title",
1539
+ "import.names.date": "Date",
1540
+ "import.names.summary": "Summary",
1541
+ "import.names.image": "Image",
1542
+ "import.names.categories": "Categories",
1543
+ "import.names.tags": "Tags",
1544
+ "import.names.text": "Text",
1545
+ "import.names.allPosts": "All posts",
1546
+ "export.title": "Export to WordPress",
1547
+ "export.intro": "Download this site as a WordPress export file, to move it to WordPress or keep a copy. Pages keep their addresses and blocks become WordPress's, items of collections with pages become posts, and menus come too. In WordPress, go to Tools → Import → WordPress, choose the file and tick “Download and import file attachments”, which copies the media from this site.",
1548
+ "export.download": "Download the export file",
1549
+ "export.done": "Downloaded the export file.",
1550
+ "export.error": "The export file couldn't be made.",
1551
+ "export.summary.pages": "Pages: {count}",
1552
+ "export.summary.posts": "Posts: {count}",
1553
+ "export.summary.media": "Media files, which WordPress copies from this site: {count}",
1554
+ "export.note.leftOutBlock": "WordPress has nothing like the {name} block, so it was left out: {items}.",
1555
+ "export.note.noPages": "Collections without pages of their own aren't in the file, since WordPress's posts each have a page: {collections}.",
1556
+ "export.note.hidden": "Hidden by their schedule, so they're drafts in the file: {items}.",
1557
+ "export.note.redirects": "Redirects aren't in the file, since WordPress needs a plugin for them: {count}.",
1558
+ "export.note.noAddress": "The site has no address yet, so WordPress can't copy its media. Set it on the General tab, then download the file again.",
1559
+ "export.note.layout": "The header and footer aren't in the file. WordPress's theme shows its own, with the menus.",
1560
+ "updates.intro": "Goodfellow, the software the site runs on, gets fixes and new releases. Fixes install on their own each night, and only once the site has been checked to still build with them.",
1561
+ "updates.contentOnly": "This site's code is kept apart from its content, so Goodfellow's updates are installed where the code is, by the site's own setup or its developer.",
1562
+ "updates.code": "This site's code is kept apart from its content, at {place}, where Goodfellow's updates are installed.",
1563
+ "updates.code.link": "See it on {host}",
1564
+ "updates.noAccess": "Your sign-in can't see the site's code, at {place}, where its updates are installed. Ask the site's developer to give you access to it. On GitHub, an access token needs to reach it too, or with Sign in with GitHub, Goodfellow's app needs to be installed there.",
1565
+ "updates.back.skip": "Don't install Goodfellow {version} again",
1566
+ "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
1567
+ "updates.demo": "Updates aren't installed in a demo.",
1568
+ "updates.loading": "Checking for updates…",
1569
+ "updates.current": "This site uses Goodfellow {version}.",
1570
+ "updates.unknownVersion": "This site's Goodfellow release couldn't be found.",
1571
+ "updates.missing": "This site's build setup doesn't install updates on its own, for example because it was made before it could, or because it's published with Vercel. A developer can add it, as the documentation explains.",
1572
+ "updates.needsSetup": "Automatic updates aren't turned on yet. They need {host} to let the site's build publish the update, and to run it each night.",
1573
+ "updates.enable": "Turn on automatic updates",
1574
+ "updates.fixes.title": "Fixes",
1575
+ "updates.fixes.ready": "Fixes up to Goodfellow {version} are ready. They install on their own tonight, or you can install them now.",
1576
+ "updates.fixes.readyPaused": "Fixes up to Goodfellow {version} are ready. Automatic fixes are turned off, so they're only installed if you install them now.",
1577
+ "updates.fixes.now": "Install fixes now",
1578
+ "updates.fixes.none": "The site has every fix for its release.",
1579
+ "updates.newer.title": "Goodfellow {version} is out",
1580
+ "updates.newer.body": "Newer releases can change how some things work, so they're only installed when one of the site's owners chooses to. Read what's new first.",
1581
+ "updates.newer.whatsNew": "What's new",
1582
+ "updates.newer.install": "Update to {version}",
1583
+ "updates.newer.onlyOwners": "Only the site's owners can install a newer release.",
1584
+ "updates.automatic.label": "Install fixes automatically each night",
1585
+ "updates.automatic.hint": "Turn this off to keep the site on the release it has now, for example while something an update changed is looked into. Fixes are then only installed when someone installs them here.",
1586
+ "updates.automatic.onlyOwners": "Only the site's owners can change this.",
1587
+ "updates.automatic.turnOff": "Turn off automatic fixes",
1588
+ "updates.automatic.turnOn": "Turn on automatic fixes",
1589
+ "updates.back.title": "Something stopped working?",
1590
+ "updates.back.body": "If something stopped working when Goodfellow {current} was installed, you can go back to {version}. The site is checked to still build with it first. Updates won't install {current} again, but will install fixes that come after it.",
1591
+ "updates.back.button": "Go back to {version}",
1592
+ "updates.back.confirm": "Go back to Goodfellow {version}? It takes a few minutes.",
1593
+ "updates.skipped.title": "Releases that won't be installed",
1594
+ "updates.skipped.body": "The site went back from these releases, so updates don't install them.",
1595
+ "updates.skipped.allow": "Allow {version} again",
1596
+ "updates.skipped.allowMessage": "Allow Goodfellow {version} again",
1597
+ "updates.nightly.title": "Rebuilding overnight",
1598
+ "updates.nightly.body": "Each night, the site can check whether it needs rebuilding: for fixes to install, for something it shows by today's date, such as an event's next date, or for a change that didn't go live.",
1599
+ "updates.nightly.changed": "Only when something changed (recommended)",
1600
+ "updates.nightly.always": "Every night",
1601
+ "updates.nightly.off": "Never",
1602
+ "updates.nightly.offWarning": "Without rebuilding overnight, what the site shows by today's date, such as lists of what's coming up, goes out of date, and fixes aren't installed on their own. The site is still rebuilt each time someone publishes.",
1603
+ "updates.nightly.unknown": "Sign in as an owner to see or change this.",
1604
+ "updates.nightly.onlyOwners": "Only the site's owners can change this.",
1605
+ "updates.nightly.old": "This site's build setup rebuilds it every night. A newer setup from Goodfellow's starter rebuilds it only when something changed.",
1606
+ "updates.rebuild.title": "Rebuild the site",
1607
+ "updates.rebuild.body": "Rebuilds the site now without publishing anything, so the live site catches up, such as with another calendar's events or after a rebuild that didn't work.",
1608
+ "updates.rebuild.button": "Rebuild now",
1609
+ "updates.rebuild.started": "The site is rebuilding. It takes a few minutes.",
1610
+ "updates.started": "The update has started. It takes a few minutes, and this page shows how it went.",
1611
+ "updates.last.title": "Last update",
1612
+ "updates.last.none": "No update has run yet.",
1613
+ "updates.last.running": "An update is running now. It takes a few minutes.",
1614
+ "updates.last.updated": "On {date}, Goodfellow {version} was installed.",
1615
+ "updates.last.updatedSome": "On {date}, an update was installed.",
1616
+ "updates.last.wentBack": "On {date}, the site went back to Goodfellow {version}.",
1617
+ "updates.last.paused": "On {date}, automatic fixes were turned off, so nothing was installed.",
1618
+ "updates.last.upToDate": "On {date}, there was nothing new to install.",
1619
+ "updates.last.failed": "On {date}, the update didn't work, so nothing changed and the site stayed as it was.",
1620
+ "updates.last.unknown": "An update ran on {date}.",
1621
+ "updates.last.details": "See the details on {host}",
1622
+ "updates.failed.build": "The site didn't build with Goodfellow {version}; a developer may need to look at the details.",
1623
+ "updates.failed.install": "Its packages couldn't be installed. The next night tries again.",
1624
+ "updates.failed.blocks": "One of the site's blocks couldn't be updated.",
1625
+ "updates.failed.publish": "Someone published at the same time. The next night tries again.",
1626
+ "updates.kept": "Someone changed these files of the site's blocks, so the update left them as they were. A developer can compare them with the new versions:",
1627
+ "updates.error.load": "The updates couldn't be checked. Check your connection and try again.",
1628
+ "updates.error.not-allowed": "Your account can't do that on {host}. Ask one of the site's owners.",
1629
+ "updates.error.missing": "This site's build setup doesn't install updates, so there's nothing to run.",
1630
+ "updates.error.save": "The change couldn't be saved. Try again in a moment.",
1631
+ "updates.error.other": "Something went wrong. Try again in a moment.",
1632
+ "editors.intro": "The people who can edit this site.",
1633
+ "editors.roles": "Editors can change and publish everything in the admin panel, unless their limits below say otherwise. Owners can also invite and remove editors, limit what they can change, and connect a domain.",
1634
+ "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.",
1635
+ "editors.demo": "Editors can't be invited in a demo.",
1636
+ "editors.loading": "Loading editors…",
1637
+ "editors.onlyOwners": "Only the site's owners can invite and remove editors.",
1638
+ "editors.cantPublish": "Editors can't publish yet: {host} only lets owners publish to the site until it's told to let editors publish too.",
1639
+ "editors.letPublish": "Let editors publish",
1640
+ "editors.person": "Person",
1641
+ "editors.role": "Can",
1642
+ "editors.roleFor": "What {name} can do",
1643
+ "editors.actions": "Actions",
1644
+ "editors.role.owner": "Owner",
1645
+ "editors.role.editor": "Editor",
1646
+ "editors.role.viewer": "Can't publish",
1647
+ "editors.you": "You",
1648
+ "editors.invited": "Invited, hasn't accepted yet",
1649
+ "editors.inherited": "Through a group on {host}",
1650
+ "editors.remove": "Remove",
1651
+ "editors.withdraw": "Withdraw invitation",
1652
+ "editors.removeTitle": "Remove {name}?",
1653
+ "editors.removeBody": "They won't be able to edit the site any more. Their account on {host} stays as it is.",
1654
+ "editors.withdrawTitle": "Withdraw the invitation to {name}?",
1655
+ "editors.withdrawBody": "The invitation stops working. You can invite them again later.",
1656
+ "editors.invite.title": "Invite someone",
1657
+ "editors.invite.field": "Their {host} username",
1658
+ "editors.invite.hint": "They need a {host} account. {host} emails them an invitation, which they accept before they can sign in here.",
1659
+ "editors.invite.hintMembers": "They need to be in the site's {host} workspace already. They can edit as soon as you add them.",
1660
+ "editors.invite.fieldEmail": "Their email address or {host} username",
1661
+ "editors.invite.hintEmail": "With an email address, {host} emails them an invitation, and they make an account if they don't have one.",
1662
+ "editors.invite.submit": "Invite",
1663
+ "editors.error.load": "The editors couldn't be loaded. Check your connection and try again.",
1664
+ "editors.error.not-allowed": "You can't change who edits the site.",
1665
+ "editors.error.not-found": "There's no {host} account with that name. Check the spelling.",
1666
+ "editors.error.invalid": "That isn't a username or email address that {host} accepts.",
1667
+ "editors.error.already": "They already edit the site, or have been invited.",
1668
+ "editors.error.other": "Something went wrong. Try again in a moment.",
1669
+ "permissions.title": "Limits",
1670
+ "permissions.intro": "Limit what someone can change: some pages, some collections, the media library, the header and footer, or the menus. Anyone not listed here can change everything their role allows. Changes outside someone's limits go to a reviewer, who publishes them or not.",
1671
+ "permissions.where": "The admin panel keeps people to their limits, so nobody changes the wrong page by mistake. People who can publish to the site on {host} could still change other files there, so only a site with its own server holds everyone to them.",
1672
+ "permissions.whereServer": "The site's server holds everyone to their limits, whatever they try.",
1673
+ "permissions.host": "the site's host",
1674
+ "permissions.person": "Their username",
1675
+ "permissions.personHint": "The name they sign in with, as the list above shows it.",
1676
+ "permissions.add": "Limit what they can change",
1677
+ "permissions.change": "Change",
1678
+ "permissions.remove": "Remove limits",
1679
+ "permissions.nothing": "Nothing yet",
1680
+ "permissions.allPages": "Every page",
1681
+ "permissions.editTitle": "What {name} can change",
1682
+ "permissions.editIntro": "Tick what they can change. They can look at everything else, and submit changes to it for review.",
1683
+ "permissions.pages": "Pages",
1684
+ "permissions.pagesHint": "Each with the pages under it, and their translations.",
1685
+ "permissions.collections": "Collections' items",
1686
+ "permissions.more": "Also",
1687
+ "permissions.languages": "Languages",
1688
+ "permissions.everyLanguage": "Every language",
1689
+ "permissions.save": "Publish limits",
1690
+ "permissions.message": "Change what {name} can change",
1691
+ "permissions.removeMessage": "Let {name} change everything",
1692
+ "permissions.reviewers": "Who reviews changes outside someone's limits",
1693
+ "permissions.reviewersHint": "Usernames, separated by commas. Leave it empty for every owner.",
1694
+ "permissions.saveReviewers": "Publish reviewers",
1695
+ "permissions.reviewersMessage": "Change who reviews changes outside editors' limits",
1696
+ "general.siteTitle": "Site name",
1697
+ "general.description": "Description",
1698
+ "general.descriptionHint": "Shown by search engines when a page doesn't have its own description.",
1699
+ "general.url": "Site address",
1700
+ "general.urlHint": "The full public address, such as https://example.org. Used for search engines and link previews.",
1701
+ "general.externalLinksInNewTab": "Open links to other sites in a new tab",
1702
+ "general.externalLinksInNewTabHint": "Applies to every link to another site: menus, buttons and text. Links to this site's own pages open in the same tab.",
1703
+ "general.language": "Language code",
1704
+ "general.languageHint": "Such as en, es or fr.",
1705
+ "languages.intro": "A site can be in several languages. Pages in the main language are at the site's address; each other language's pages are under its code, such as /es/about for Spanish. Translate a page from the Pages screen once its language is published.",
1706
+ "languages.main": "Main language",
1707
+ "languages.mainCodeHintUsed": "It can't change while the site has pages or items in other languages.",
1708
+ "languages.name": "Name",
1709
+ "languages.nameHint": "How the language switch names it, in that language.",
1710
+ "languages.new": "New language",
1711
+ "languages.add": "Add a language",
1712
+ "languages.remove": "Remove this language",
1713
+ "languages.codeHint": "Such as es, fr or pt-BR. Its pages go under its code, so it can't change once published.",
1714
+ "languages.codeHintPublished": "Its pages are under {prefix}.",
1715
+ "languages.codeInvalid": "Use a language code, such as es, fr or pt-BR.",
1716
+ "languages.codeTaken": "The site has this language already.",
1717
+ "languages.codeUsed": "The site has pages under {prefix} already. Move them first, or choose another code.",
1718
+ "languages.titleHint": "The site's title in this language. Left empty, it's the main language's.",
1719
+ "languages.inUse": "Pages and items in this language: {count}. To remove the language, delete them or move them out of it first.",
1720
+ "general.timeZone": "Time zone",
1721
+ "general.timeZoneHint": "The time zone events' times are in. Calendars show them in it, and visitors' calendars move them to their own.",
1722
+ "general.timeZoneNone": "Not set: times are shown as they're written",
1723
+ "general.timeZoneUseMine": "Use {zone}",
1724
+ "general.titleTemplate": "Browser tab title",
1725
+ "general.titleTemplateHint": "%s is replaced by the page title, so \"%s | My site\" shows \"About | My site\".",
1726
+ "general.favicon": "Browser tab icon",
1727
+ "general.logo": "Logo",
1728
+ "general.logoAlt": "Logo description",
1729
+ "general.logoDark": "Logo in dark mode",
1730
+ "general.logoDarkHint": "A version of the logo that shows up on dark backgrounds, such as a white one. Leave it empty to use the same logo.",
1731
+ "general.socialImage": "Image when shared on social media",
1732
+ "general.aiTraining": "Let AI companies use the site's pages to train their models",
1733
+ "general.aiTrainingHint": "Turned off, the site asks the crawlers AI companies train their models with, such as OpenAI's GPTBot, Anthropic's ClaudeBot and Google-Extended, to leave it alone. Search engines still list it, and assistants can still read a page someone asks them about. Well-behaved crawlers follow the request, but it isn't a lock: anyone can still read the site's pages.",
1734
+ "general.contact": "Contact details",
1735
+ "general.contactHint": "Shown wherever a Contact details block is placed, such as the footer.",
1736
+ "general.address": "Address",
1737
+ "general.phone": "Phone",
1738
+ "general.email": "Email",
1739
+ "forms.title": "Forms",
1740
+ "forms.hint": "Where answers to the site's forms go. The form service emails them to you: they're never kept with the site's pages.",
1741
+ "forms.service": "Form service",
1742
+ "forms.service.web3forms": "Web3Forms: free for 250 answers a month, with no account",
1743
+ "forms.service.formspree": "Formspree",
1744
+ "forms.service.other": "Another service",
1745
+ "forms.accessKey": "Web3Forms access key",
1746
+ "forms.accessKeyHint": "On Web3Forms' site, enter the email address answers should go to. Web3Forms emails you a key: paste it here.",
1747
+ "forms.accessKeyLink": "Get an access key from Web3Forms",
1748
+ "forms.captcha": "Ask visitors to show they aren't robots (hCaptcha)",
1749
+ "forms.captchaHint": "Adds Web3Forms' hCaptcha and its script to pages with a form. To turn away answers without it, also turn hCaptcha on for the form in a Web3Forms account.",
1750
+ "consent.title": "Visitors' consent",
1751
+ "consent.ask": "Ask visitors before showing content from other sites",
1752
+ "consent.hint": "Videos from YouTube and Vimeo, Google forms and maps, hCaptcha and the code under Code wait until visitors agree, with a notice at the bottom of the page that asks them. Their answer is kept in their browser. Links to #consent, such as in a menu, open the notice again.",
1753
+ "consent.message": "What the notice says",
1754
+ "consent.accept": "Button that agrees",
1755
+ "consent.decline": "Button that doesn't",
1756
+ "consent.held": "What's shown in a video's or form's place",
1757
+ "consent.heldHint": "{site} is where it comes from, such as youtube-nocookie.com.",
1758
+ "consent.show": "Button there that shows it",
1759
+ "consent.policy": "Privacy page",
1760
+ "consent.policyHint": "The page that says what the site and the sites it shows content from do, such as /privacy.",
1761
+ "consent.policyLabel": "Words of the link to it",
1762
+ "consent.choose": "Button that shows the choices",
1763
+ "consent.save": "Button that keeps the choices",
1764
+ "consent.kind.content": "Choice for content from other sites",
1765
+ "consent.kind.statistics": "Choice for statistics",
1766
+ "consent.kind.marketing": "Choice for advertising",
1767
+ "consent.days": "Ask again after this many days",
1768
+ "consent.daysHint": "Visitors' answers last this long, then the notice asks again. 180 days, about six months, is common; regulators in Europe accept up to 395, 13 months.",
1769
+ "forms.formspree": "Formspree form address",
1770
+ "forms.formspreeHint": "Make a form in Formspree and copy its address, such as https://formspree.io/f/xyzabcde. On Formspree's free plan, visitors see Formspree's own thank-you page.",
1771
+ "forms.address": "Address forms send answers to",
1772
+ "forms.addressHint": "The service's address for forms, starting with https://. Forms send the thank-you page's address as _next, the subject as _subject, and a hidden _gotcha field that only robots fill in, as Formspree, FormSubmit and Formcarry expect.",
1773
+ "forms.error.key": "This isn't a Web3Forms access key. Copy it from Web3Forms' email: it looks like 0b5c4f7e-1a2b-4c3d-8e9f-0123456789ab.",
1774
+ "forms.error.formspree": "This isn't a Formspree form's address. It looks like https://formspree.io/f/xyzabcde.",
1775
+ "forms.error.address": "The address must be a full address starting with https://.",
1776
+ "theme.colors": "Colors",
1777
+ "theme.fonts": "Fonts",
1778
+ "theme.fontsHint": "Choose from Google Fonts, or your own fonts. Site default uses each visitor's standard font.",
1779
+ "font.own.group": "Your fonts",
1780
+ "font.google.group": "Google Fonts",
1781
+ "theme.ownFonts": "Your own fonts",
1782
+ "theme.ownFontsHint": "Fonts you've bought or have the right to use on a website, as WOFF2 files. They're kept with the site, and the font menus above offer them.",
1783
+ "theme.noOwnFonts": "No fonts of your own yet.",
1784
+ "theme.ownFontFiles": "Files: {count}",
1785
+ "theme.addFont": "Add a font",
1786
+ "theme.removeFont": "Remove",
1787
+ "theme.removeFontLabel": "Remove {family}",
1788
+ "font.add.title": "Add a font",
1789
+ "font.add.files": "Font files (WOFF2)",
1790
+ "font.add.filesHint": "Choose all the font's files at once: one for each weight and style, such as Regular, Bold and Italic, or one variable font file. Up to 5 MB each.",
1791
+ "font.add.family": "Font's name",
1792
+ "font.add.familyHint": "As the font menus show it, such as Brandon Grotesque. Letters, numbers and spaces.",
1793
+ "font.add.category": "Kind of font",
1794
+ "font.add.categoryHint": "Pages show a font of the same kind until this one loads.",
1795
+ "font.add.file": "File",
1796
+ "font.add.weight": "Weight",
1797
+ "font.add.style": "Style",
1798
+ "font.add.upright": "Upright",
1799
+ "font.add.italic": "Italic",
1800
+ "font.add.removeFile": "Remove {name}",
1801
+ "font.weight.variable": "Every weight (variable font)",
1802
+ "font.weight.100": "Thin (100)",
1803
+ "font.weight.200": "Extra light (200)",
1804
+ "font.weight.300": "Light (300)",
1805
+ "font.weight.400": "Regular (400)",
1806
+ "font.weight.500": "Medium (500)",
1807
+ "font.weight.600": "Semibold (600)",
1808
+ "font.weight.700": "Bold (700)",
1809
+ "font.weight.800": "Extra bold (800)",
1810
+ "font.weight.900": "Black (900)",
1811
+ "font.add.allowed": "I'm allowed to use this font on a website",
1812
+ "font.add.allowedInfo": "About fonts' licenses",
1813
+ "font.add.allowedTip": "A font's license says where you may use it. Many fonts bought for printing or for a computer don't allow websites, so check yours does (often called a web font license). Choose to read more.",
1814
+ "font.add.button": "Add font",
1815
+ "font.add.checking": "Checking the files…",
1816
+ "font.add.notWoff2": "{name} isn't a WOFF2 font. The font's maker or shop usually offers WOFF2 files for websites.",
1817
+ "font.add.tooLarge": "{name} is larger than 5 MB.",
1818
+ "font.add.unreadable": "{name} couldn't be read as a font. It may be damaged.",
1819
+ "font.add.familyInvalid": "Use letters, numbers and spaces, up to 60 characters.",
1820
+ "font.add.familyTaken": "You already have a font named {family}. Remove it first, or choose another name.",
1821
+ "font.add.duplicate": "Two files have the same weight and style. Change one, or remove it.",
1822
+ "font.add.tooMany": "A font can have up to {count} files.",
1823
+ "font.add.full": "A site can have up to {count} fonts of its own. Remove one to add another.",
1824
+ "font.add.needAllowed": "Tick the box to say you're allowed to use this font on a website.",
1825
+ "font.default": "Site default",
1826
+ "font.defaultHint": "Visitor's standard font",
1827
+ "font.search": "Search fonts",
1828
+ "font.searchHint": "Type to search Google Fonts, then use the arrow keys and Enter to choose.",
1829
+ "font.loading": "Loading fonts…",
1830
+ "font.noMatch": "No fonts match “{query}”.",
1831
+ "font.category.sans-serif": "Sans serif",
1832
+ "font.category.serif": "Serif",
1833
+ "font.category.display": "Display",
1834
+ "font.category.handwriting": "Handwriting",
1835
+ "font.category.monospace": "Monospace",
1836
+ "theme.headingFont": "Headings",
1837
+ "theme.bodyFont": "Text",
1838
+ "theme.radius": "Corner rounding",
1839
+ "theme.radiusHint": "Such as 0.5rem, or 0 for square corners.",
1840
+ "theme.parts": "Blocks' parts",
1841
+ "theme.partsHint": "Give a part of every block of one kind classes, such as rounded-xl shadow-sm, to change how they all look. They come after the block's own classes and before what's chosen for each block.",
1842
+ "theme.partsBlock": "Block",
1843
+ "theme.partsBlockStyled": "{block} ({count} styled)",
1844
+ "theme.partsName": "Its name is {name}, for custom CSS.",
1845
+ "theme.partsNone": "This site's blocks have no named parts.",
1846
+ "theme.color.background": "Background",
1847
+ "theme.color.foreground": "Text",
1848
+ "theme.color.primary": "Main color",
1849
+ "theme.color.primaryForeground": "Text on main color",
1850
+ "theme.color.secondary": "Second color",
1851
+ "theme.color.secondaryForeground": "Text on second color",
1852
+ "theme.color.muted": "Subtle background",
1853
+ "theme.color.mutedForeground": "Subtle text",
1854
+ "theme.color.accent": "Highlight",
1855
+ "theme.color.accentForeground": "Text on highlight",
1856
+ "theme.color.border": "Borders",
1857
+ "theme.default": "Default",
1858
+ "theme.darkMode": "Dark mode",
1859
+ "theme.darkModeOn": "Follow each visitor's light or dark setting",
1860
+ "theme.darkModeHint": "Off by default, so the site is always light. When it's on, visitors whose computer or phone is set to dark see the site in the colors below.",
1861
+ "theme.darkColors": "Colors in dark mode",
1862
+ "theme.preview": "Preview",
1863
+ "theme.previewLight": "Light",
1864
+ "theme.previewDark": "Dark",
1865
+ "theme.pickColor": "Choose a color for {name}",
1866
+ "theme.code": "Code colors",
1867
+ "theme.codeHint": "The colors of code in Code blocks and Markdown. Code that looks like the page uses the light colors, and the dark colors in dark mode.",
1868
+ "theme.codeLight": "Light colors",
1869
+ "theme.codeDark": "Dark colors",
1870
+ "theme.codeBackground": "Show code on the subtle background color",
1871
+ "theme.codeBackgroundHint": "Code that looks like the page sits on the site's Subtle background color instead of its colors' own background, so it matches the rest of the site. Check that it's still easy to read.",
1872
+ "menus.intro": "Menus are lists of links. Show one anywhere with the Menu block, using its name.",
1873
+ "menus.empty": "There are no menus yet.",
1874
+ "menus.add": "Add menu",
1875
+ "menus.newName": "New menu name",
1876
+ "menus.nameInvalid": "Use lowercase letters, numbers and hyphens, and a name no other menu uses.",
1877
+ "menus.deleteMenu": "Delete menu",
1878
+ "menus.addLink": "Add link",
1879
+ "menus.addSublink": "Add link below this one",
1880
+ "menus.label": "Label",
1881
+ "menus.href": "Link to",
1882
+ "menus.moveUp": "Move up",
1883
+ "menus.moveDown": "Move down",
1884
+ "menus.remove": "Remove",
1885
+ "translations.add": "Translate into {language}",
1886
+ "translations.current": "Up to date",
1887
+ "translations.outdated": "Out of date",
1888
+ "translations.optionOutdated": "{language} (out of date)",
1889
+ "translations.optionAdd": "Translate into {language}…",
1890
+ "translations.markCurrent": "Mark as up to date",
1891
+ "translations.markCurrentMessage": "Mark {title} as up to date",
1892
+ "translations.of": "Translation of {title}",
1893
+ "translations.entryOf": "In {language}: translation of {title}",
1894
+ "translations.inLanguage": "In {language}",
1895
+ "translations.addTitle": "Translate {title} into {language}",
1896
+ "translations.addHint": "This makes a copy in {language} for you to translate. The Pages screen says when the original changes, so you know to update the translation.",
1897
+ "translations.addSubmit": "Make the copy",
1898
+ "translations.addMessage": "Translate {title} into {language}",
1899
+ "translations.addressLanguage": "Pages in {language} have addresses starting with {prefix}.",
1900
+ "menus.language": "Language",
1901
+ "layout.languageShared": "Pages in {language} show the main language's {part}, with {language}'s menus and site name. Give {language} a {part} of its own to translate the words typed into it.",
1902
+ "layout.languageCopy": "Make a {part} for {language}",
1903
+ "layout.languageCopyMessage": "Make a {part} for {language}",
1904
+ "layout.languageRemove": "Use the main language's {part}",
1905
+ "layout.languageRemoveMessage": "Use the main language's {part} in {language}",
1906
+ "layout.languageMessage": "Update the {part} in {language}",
1907
+ "newEntry.languageHint": "For an item only in this language. To translate an item, use “Translate into” in the list instead, which keeps the two linked.",
1908
+ "menus.ownMenus": "{language} has menus of its own",
1909
+ "menus.sameAsMain": "Pages in {language} show the main language's menus. Give it menus of its own to translate their links' names and point them at its pages.",
1910
+ "menus.newLink": "New link",
1911
+ "redirects.intro": "Send visitors from an old address to a new one, such as when a page has moved or this site replaced an older one. Search engines move the old address's place in their results to the new one.",
1912
+ "redirects.empty": "There are no redirects yet.",
1913
+ "redirects.from": "Old address",
1914
+ "redirects.to": "Send visitors to",
1915
+ "redirects.add": "Add redirect",
1916
+ "redirects.remove": "Remove",
1917
+ "redirects.message": "Message while visitors are sent on",
1918
+ "redirects.messageHint": "Shown at an old address for a moment, or for good in browsers without JavaScript. {placeholder} becomes a link to where visitors are going. Leave it empty for the message shown here.",
1919
+ "redirects.unused": "A page has this address, so visitors see the page instead. Remove the redirect, or move the page.",
1920
+ "redirects.problem.noFrom": "Add the old address, such as /about-us.",
1921
+ "redirects.problem.badFrom": "This isn't an address on this site. Start with /, such as /about-us, or paste the old page's full address.",
1922
+ "redirects.problem.query": "Addresses with a ? in them can't be redirected, since the site can't tell them apart from the address before the ?.",
1923
+ "redirects.problem.home": "The home page can't be redirected.",
1924
+ "redirects.problem.reserved": "This address is used by the site itself, so it can't be redirected.",
1925
+ "redirects.problem.noTo": "Add where to send visitors, such as /about.",
1926
+ "redirects.problem.badTo": "Send visitors to a page on this site, starting with /, or to another website's address, starting with https://.",
1927
+ "redirects.problem.loop": "This sends visitors back to the same address.",
1928
+ "redirects.problem.duplicate": "Another redirect is from the same address. Remove one of them.",
1929
+ "css.intro": "CSS here applies to every page and overrides the blocks' own styles. Tailwind's @apply works too.",
1930
+ "css.label": "Custom CSS",
1931
+ "code.editorHint": "Tab indents, and suggestions appear as you type. Press Escape, then Tab, to leave the editor. Ctrl+F finds and replaces.",
1932
+ "code.intro": "Code from services such as analytics or site verification, added to every page of the site. It never runs in the admin panel, so check it on the site once it's published. Paste only code you trust: it can change anything on the site.",
1933
+ "code.exposed": "Editors sign in at the same address as the site's pages, so code here runs where it could act as anyone signed in to the admin panel, and publish changes as them.",
1934
+ "code.exposedFix": "A sign-in page or an admin address of its own, on the Security tab, keeps their sign-in out of its reach.",
1935
+ "code.head": "In the page head",
1936
+ "code.headHint": "Script, style, link, meta and noscript tags, such as the ones Google Analytics gives you.",
1937
+ "code.purpose.head": "What the code in the page head is for",
1938
+ "code.purpose.body": "What the code at the end of the page is for",
1939
+ "code.purposeHint": "Visitors choose which kinds to allow. Code needed for the site to work loads for everyone without asking, so choose it only for code that doesn't follow visitors.",
1940
+ "code.purpose.needed": "Needed for the site to work: loads without asking",
1941
+ "code.purpose.content": "Content from other sites, such as a chat widget",
1942
+ "code.purpose.statistics": "Statistics, such as Google Analytics",
1943
+ "code.purpose.marketing": "Advertising",
1944
+ "code.body": "At the end of the page",
1945
+ "code.bodyHint": "Any HTML, such as a chat widget, added just before the end of every page.",
1946
+ "code.error.text": "The code in the page head has text outside a tag: \"{text}\". Only tags such as <script> and <meta> can go there.",
1947
+ "code.error.tag": "A <{tag}> tag can't go in the page head. Put it in \"At the end of the page\" instead.",
1948
+ "code.error.unclosed": "A {tag} tag in the page head isn't closed.",
1949
+ "code.error.template": "This code has </template> in it. While the site asks visitors before loading other sites' content, that would let the code run before they agree. Take it out.",
1950
+ "nav.synced": "Synced blocks",
1951
+ "blocks.usedSyncedBlock": "the synced block {title}",
1952
+ "checks.missing-synced-block": "{place} places the synced block {target}, which the site doesn't have any more.",
1953
+ "checks.unchosen-synced-block": "{place} has a Synced block that doesn't say which synced block it shows. Choose one in its settings, or take it out.",
1954
+ "checks.nested-synced-block": "{place} has a Synced block in it. Synced blocks can't show other synced blocks: take it out.",
1955
+ "checks.place.synced": "The synced block \"{title}\"",
1956
+ "synced.screenTitle": "Synced blocks",
1957
+ "synced.intro": "A synced block is kept once and shown wherever it's placed: change it here, and every page that shows it changes when you publish. Place one on a page with the Synced block block, or choose a block on a page and use Save as synced block.",
1958
+ "synced.empty": "There are no synced blocks yet.",
1959
+ "synced.new": "New synced block",
1960
+ "synced.newTitle": "New synced block",
1961
+ "synced.create": "Create",
1962
+ "synced.newMessage": "Add the synced block {title}",
1963
+ "synced.title": "Name",
1964
+ "synced.titleHint": "What editors see when they choose it, such as “Mass times”. Visitors never see it.",
1965
+ "synced.column.title": "Name",
1966
+ "synced.column.used": "Shown on",
1967
+ "synced.unused": "Nowhere yet",
1968
+ "synced.rename": "Rename",
1969
+ "synced.renameTitle": "Rename the synced block",
1970
+ "synced.renameMessage": "Rename the synced block {title}",
1971
+ "synced.delete": "Delete",
1972
+ "synced.deleteTitle": "Delete {title}?",
1973
+ "synced.deleteBody": "Nothing shows it, so deleting it changes no page.",
1974
+ "synced.deleteUsed": "It's still shown on these. Take its Synced block out of them, or detach it there to keep its blocks on that page alone, then delete it.",
1975
+ "synced.deleteMessage": "Delete the synced block {title}",
1976
+ "synced.notFound": "This synced block isn't in the site. It may have been deleted.",
1977
+ "synced.back": "All synced blocks",
1978
+ "synced.message": "Update the synced block {title}",
1979
+ "synced.editorUsed": "Changes show on {places} when you publish.",
1980
+ "synced.editorUnused": "Nothing shows this synced block yet. Place it on a page with the Synced block block.",
1981
+ "synced.languageShared": "Pages in {language} show the main language's version of this synced block. Give {language} a version of its own to translate its words.",
1982
+ "synced.languageCopy": "Make a version for {language}",
1983
+ "synced.languageCopyMessage": "Make a version of the synced block {title} for {language}",
1984
+ "synced.languageRemove": "Use the main language's version",
1985
+ "synced.languageRemoveMessage": "Use the main language's version of the synced block {title} in {language}",
1986
+ "synced.label": "Synced block: {title}",
1987
+ "synced.edit": "Edit synced block",
1988
+ "synced.missing": "The synced block {name} isn't in the site any more. Choose another, or take this block out.",
1989
+ "synced.choose": "Choose which synced block to show here, in this block's settings.",
1990
+ "synced.save": "Save as synced block",
1991
+ "synced.saveHint": "Keep the chosen block once, to show it on other pages too and change it everywhere at once",
1992
+ "synced.saveTitle": "Save as synced block",
1993
+ "synced.saveAction": "Save",
1994
+ "synced.detach": "Detach",
1995
+ "synced.detachHint": "Put the synced block's own blocks here, to change them on this page alone"
1996
+ };
1997
+ const StringsContext = createContext(defaultStrings);
1998
+ function StringsProvider({ strings, children }) {
1999
+ const value = useMemo(() => ({
2000
+ ...defaultStrings,
2001
+ ...strings
2002
+ }), [strings]);
2003
+ return /* @__PURE__ */ jsx(StringsContext.Provider, {
2004
+ value,
2005
+ children
2006
+ });
2007
+ }
2008
+ /** The whole table, with any strings the admin panel was given, for frames, which show some of the admin panel's text. */
2009
+ function useStringTable() {
2010
+ return useContext(StringsContext);
2011
+ }
2012
+ /** Returns `t(key, values)`, which looks up a string and fills in its `{placeholders}`. */
2013
+ function useStrings() {
2014
+ const strings = useContext(StringsContext);
2015
+ return (key, values) => strings[key].replace(/\{(\w+)\}/g, (match, name) => values?.[name] ?? match);
2016
+ }
2017
+ //#endregion
2018
+ export { useStrings as i, defaultStrings as n, useStringTable as r, StringsProvider as t };