@goodfellow-cms/admin 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/dev.js +7 -4
- package/dist/index.d.ts +299 -7
- package/dist/index.js +5205 -2196
- package/package.json +8 -8
- package/styles.css +246 -0
package/README.md
CHANGED
|
@@ -4,9 +4,9 @@ The admin panel: the visual editor for a site's pages, collections, media, heade
|
|
|
4
4
|
|
|
5
5
|
It's built with each site's own config, so the editor always has the site's blocks: `goodfellow build` adds it at `/admin`, and Next.js sites render `GoodfellowAdmin` from `@goodfellow-cms/next` there.
|
|
6
6
|
|
|
7
|
-
[Goodfellow](https://github.com/
|
|
7
|
+
[Goodfellow](https://github.com/goodfellow-cms/goodfellow-cms) is a website builder for people who aren't developers, with no server or database: pages are files in your own GitHub or GitLab repository, edited in a visual editor built on [Puck](https://puckeditor.com). To start a new site, run `npm create goodfellow@latest my-site`. See the [documentation](https://goodfellow-cms.github.io/goodfellow-cms/) for everything else.
|
|
8
8
|
|
|
9
|
-
More in the docs: [Edit pages](https://
|
|
9
|
+
More in the docs: [Edit pages](https://goodfellow-cms.github.io/goodfellow-cms/docs/edit-pages).
|
|
10
10
|
|
|
11
11
|
## License
|
|
12
12
|
|
package/dist/dev.js
CHANGED
|
@@ -5,8 +5,10 @@ import { ConflictError, decodeBase64, encodeBase64Bytes } from "@goodfellow-cms/
|
|
|
5
5
|
* `goodfellow dev`. For local development only: it is never part of a built site.
|
|
6
6
|
*/
|
|
7
7
|
function localStore(apiBase = "/__goodfellow/api") {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** Calls the development API. A 404 means "no such file" only where `missingIsFine` says so. */
|
|
9
|
+
async function request(path, init = {}, missingIsFine = false) {
|
|
10
|
+
const [endpoint, query] = path.split("?", 2);
|
|
11
|
+
const response = await fetch(`${apiBase}/${endpoint}/${query === void 0 ? "" : `?${query}`}`, {
|
|
10
12
|
...init,
|
|
11
13
|
headers: {
|
|
12
14
|
"x-goodfellow-request": "1",
|
|
@@ -14,6 +16,7 @@ function localStore(apiBase = "/__goodfellow/api") {
|
|
|
14
16
|
}
|
|
15
17
|
});
|
|
16
18
|
if (response.status === 409) throw new ConflictError();
|
|
19
|
+
if (response.status === 404 && !missingIsFine) throw new Error(`The development server's API isn't at ${new URL(apiBase, location.href).href} (it answered 404). Open the admin panel at the address \`goodfellow dev\` printed when it started.`);
|
|
17
20
|
if (!response.ok && response.status !== 404) {
|
|
18
21
|
const body = await response.json().catch(() => ({}));
|
|
19
22
|
throw new Error(body.message ?? `The development server answered ${response.status} (${body.error ?? "error"}).`);
|
|
@@ -22,12 +25,12 @@ function localStore(apiBase = "/__goodfellow/api") {
|
|
|
22
25
|
}
|
|
23
26
|
return {
|
|
24
27
|
async read(path) {
|
|
25
|
-
const response = await request(`file?path=${encodeURIComponent(path)}
|
|
28
|
+
const response = await request(`file?path=${encodeURIComponent(path)}`, {}, true);
|
|
26
29
|
if (response.status === 404) return void 0;
|
|
27
30
|
return (await response.json()).content;
|
|
28
31
|
},
|
|
29
32
|
async readBytes(path) {
|
|
30
|
-
const response = await request(`file?path=${encodeURIComponent(path)}&as=bytes
|
|
33
|
+
const response = await request(`file?path=${encodeURIComponent(path)}&as=bytes`, {}, true);
|
|
31
34
|
if (response.status === 404) return void 0;
|
|
32
35
|
return decodeBase64((await response.json()).base64);
|
|
33
36
|
},
|
package/dist/index.d.ts
CHANGED
|
@@ -25,8 +25,8 @@ export declare const defaultStrings: {
|
|
|
25
25
|
readonly "nav.collections": "Collections";
|
|
26
26
|
readonly "nav.media": "Media";
|
|
27
27
|
readonly "nav.blocks": "Blocks";
|
|
28
|
-
readonly "nav.layout": "Header &
|
|
29
|
-
readonly "nav.settings": "Site
|
|
28
|
+
readonly "nav.layout": "Header & Footer";
|
|
29
|
+
readonly "nav.settings": "Site Settings";
|
|
30
30
|
readonly loading: "Loading…";
|
|
31
31
|
readonly "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.";
|
|
32
32
|
readonly "signIn.title": "Sign in to edit this site";
|
|
@@ -56,7 +56,22 @@ export declare const defaultStrings: {
|
|
|
56
56
|
readonly "deploy.building": "Updating the live site…";
|
|
57
57
|
readonly "deploy.live": "The live site is up to date";
|
|
58
58
|
readonly "deploy.failed": "The live site couldn't be updated";
|
|
59
|
-
readonly "
|
|
59
|
+
readonly "build.why": "What went wrong?";
|
|
60
|
+
readonly "build.title": "Why the live site wasn't updated";
|
|
61
|
+
readonly "build.saved": "Your changes are published and saved. Visitors see the site as it was until it's rebuilt, which every publish tries again.";
|
|
62
|
+
readonly "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}.";
|
|
63
|
+
readonly "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.";
|
|
64
|
+
readonly "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.";
|
|
65
|
+
readonly "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}.";
|
|
66
|
+
readonly "build.host": "A problem on {host}'s side stopped the rebuild. That's usually a passing problem, so the next publish may work.";
|
|
67
|
+
readonly "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.";
|
|
68
|
+
readonly "build.contentHistory": "Version history of {file}";
|
|
69
|
+
readonly "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.";
|
|
70
|
+
readonly "build.blocks": "Go to Blocks";
|
|
71
|
+
readonly "build.codeFile": "The site's code couldn't be rebuilt: there's a problem in {file}. A developer needs to look at the details.";
|
|
72
|
+
readonly "build.code": "The site couldn't be rebuilt. A developer needs to look at the details.";
|
|
73
|
+
readonly "build.unknown": "{host} didn't say why the rebuild failed. Its details may help a developer.";
|
|
74
|
+
readonly "build.hostDetails": "See the details on {host}";
|
|
60
75
|
readonly "loadError.title": "The admin panel couldn't open this site";
|
|
61
76
|
readonly "loadError.contentProblems": "Some of the site's files have problems, so they can't be edited until they're fixed.";
|
|
62
77
|
readonly "loadError.other": "Something went wrong while loading the site. Check your connection and try again.";
|
|
@@ -96,6 +111,8 @@ export declare const defaultStrings: {
|
|
|
96
111
|
readonly "movePage.title": "Change the address of {title}";
|
|
97
112
|
readonly "movePage.address": "New address";
|
|
98
113
|
readonly "movePage.updateLinks": "Update menu links to this page";
|
|
114
|
+
readonly "movePage.redirect": "Keep {from} working by sending visitors on to the page";
|
|
115
|
+
readonly "movePage.redirectHint": "Links to the old address elsewhere, such as on other websites, keep working. Site Settings → Redirects lists it.";
|
|
99
116
|
readonly "movePage.warning": "Links to the old address elsewhere, such as in page text or on other websites, will stop working.";
|
|
100
117
|
readonly "movePage.submit": "Change address";
|
|
101
118
|
readonly "movePage.message": 'Move page "{title}" from {from} to {to}';
|
|
@@ -110,6 +127,31 @@ export declare const defaultStrings: {
|
|
|
110
127
|
readonly "editPage.message": 'Update page "{title}"';
|
|
111
128
|
readonly "editPage.notFound": "This page doesn't exist. It may have been moved or deleted.";
|
|
112
129
|
readonly "editPage.backToPages": "Back to pages";
|
|
130
|
+
readonly "versions.button": "Version history";
|
|
131
|
+
readonly "versions.title": "Version history: {title}";
|
|
132
|
+
readonly "versions.back": "Back to editing";
|
|
133
|
+
readonly "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.";
|
|
134
|
+
readonly "versions.notFound": "There's no history to show here. It may have been moved or deleted.";
|
|
135
|
+
readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
136
|
+
readonly "versions.demo": "Version history isn't kept in a demo.";
|
|
137
|
+
readonly "versions.loading": "Loading versions…";
|
|
138
|
+
readonly "versions.loadingVersion": "Loading this version…";
|
|
139
|
+
readonly "versions.error": "The versions couldn't be loaded. Check your connection and try again.";
|
|
140
|
+
readonly "versions.empty": "Nothing has been published here yet.";
|
|
141
|
+
readonly "versions.current": "Current version";
|
|
142
|
+
readonly "versions.by": "{date}, by {author}";
|
|
143
|
+
readonly "versions.more": "Show older versions";
|
|
144
|
+
readonly "versions.preview": "The version from {date}";
|
|
145
|
+
readonly "versions.noPreview": "This item has no page of its own, so there's nothing to preview.";
|
|
146
|
+
readonly "versions.restore": "Restore this version";
|
|
147
|
+
readonly "versions.restoreTitle": "Restore the version from {date}?";
|
|
148
|
+
readonly "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.";
|
|
149
|
+
readonly "versions.restoring": "Restoring…";
|
|
150
|
+
readonly "versions.restoreMessage": 'Restore "{title}" to the version from {date}';
|
|
151
|
+
readonly "versions.restored": "Restored the version from {date}.";
|
|
152
|
+
readonly "versions.readError": "This version couldn't be loaded. Check your connection and try again.";
|
|
153
|
+
readonly "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.";
|
|
154
|
+
readonly "versions.unknownBlocks": "This version can't be restored, because it uses blocks the site doesn't have any more: {blocks}.";
|
|
113
155
|
readonly "layout.header": "Header";
|
|
114
156
|
readonly "layout.footer": "Footer";
|
|
115
157
|
readonly "layout.headerMessage": "Update the header";
|
|
@@ -123,6 +165,13 @@ export declare const defaultStrings: {
|
|
|
123
165
|
readonly "collections.column.address": "Pages";
|
|
124
166
|
readonly "collections.noPages": "No pages of their own";
|
|
125
167
|
readonly "newCollection.title": "New collection";
|
|
168
|
+
readonly "newCollection.kind": "Start with";
|
|
169
|
+
readonly "newCollection.kindBlank": "A title and text";
|
|
170
|
+
readonly "newCollection.kindEvents": "Events";
|
|
171
|
+
readonly "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.";
|
|
172
|
+
readonly "newCollection.eventsName": "Events";
|
|
173
|
+
readonly "newCollection.eventsEntryName": "Event";
|
|
174
|
+
readonly "newCollection.timeZone": "The site's time zone will be set to {zone}. You can change it in Site Settings.";
|
|
126
175
|
readonly "newCollection.name": "Name";
|
|
127
176
|
readonly "newCollection.nameHint": "What the whole collection is called, such as Videos or Events.";
|
|
128
177
|
readonly "newCollection.nameTaken": "Another collection already has a name like this. Choose another.";
|
|
@@ -158,6 +207,7 @@ export declare const defaultStrings: {
|
|
|
158
207
|
readonly "editEntry.notFound": "This item doesn't exist. It may have been renamed or deleted.";
|
|
159
208
|
readonly "editEntry.back": "Back to {name}";
|
|
160
209
|
readonly "editEntry.required": "Fill in {fields} before publishing.";
|
|
210
|
+
readonly "editEntry.invalidEvent": "Check {fields}: an event has to end after it starts.";
|
|
161
211
|
readonly "editEntry.noPage": "Items in {name} don't have pages of their own. They appear wherever a Collection list block shows {name}.";
|
|
162
212
|
readonly "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:";
|
|
163
213
|
readonly "template.message": "Update the page design for {name}";
|
|
@@ -167,6 +217,43 @@ export declare const defaultStrings: {
|
|
|
167
217
|
readonly "collectionSettings.markdownNeedsText": "To store items as Markdown files, add a formatted-text field first.";
|
|
168
218
|
readonly "collectionSettings.markdownBody": "Field saved as the Markdown text";
|
|
169
219
|
readonly "collectionSettings.markdownConverts": "Every item will be converted when you publish.";
|
|
220
|
+
readonly "collectionSettings.calendar": "Show items in calendars";
|
|
221
|
+
readonly "collectionSettings.calendarHint": "Items become events that Calendar blocks show, which visitors can add to their own calendars or subscribe to.";
|
|
222
|
+
readonly "collectionSettings.calendarNeedsDate": 'To show items in calendars, add a "Date and time, for events" field first.';
|
|
223
|
+
readonly "collectionSettings.calendarWhen": "When items happen";
|
|
224
|
+
readonly "collectionSettings.calendarPlace": "Where";
|
|
225
|
+
readonly "collectionSettings.calendarSummary": "Summary";
|
|
226
|
+
readonly "collectionSettings.calendarNone": "None";
|
|
227
|
+
readonly "event.starts": "Starts";
|
|
228
|
+
readonly "event.ends": "Ends (optional)";
|
|
229
|
+
readonly "event.time": "Time";
|
|
230
|
+
readonly "event.allDay": "All day";
|
|
231
|
+
readonly "event.repeats": "Repeats";
|
|
232
|
+
readonly "event.repeat.none": "Doesn't repeat";
|
|
233
|
+
readonly "event.repeat.day": "Daily";
|
|
234
|
+
readonly "event.repeat.week": "Weekly";
|
|
235
|
+
readonly "event.repeat.month": "Monthly";
|
|
236
|
+
readonly "event.repeat.year": "Yearly";
|
|
237
|
+
readonly "event.interval.days": "Every how many days";
|
|
238
|
+
readonly "event.interval.weeks": "Every how many weeks";
|
|
239
|
+
readonly "event.interval.months": "Every how many months";
|
|
240
|
+
readonly "event.interval.years": "Every how many years";
|
|
241
|
+
readonly "event.onDays": "On";
|
|
242
|
+
readonly "event.monthlyOn": "On";
|
|
243
|
+
readonly "event.monthly.date": "Day {day} of the month";
|
|
244
|
+
readonly "event.monthly.weekday": "The {nth} {weekday} of the month";
|
|
245
|
+
readonly "event.monthly.last": "The last {weekday} of the month";
|
|
246
|
+
readonly "event.nth.1": "first";
|
|
247
|
+
readonly "event.nth.2": "second";
|
|
248
|
+
readonly "event.nth.3": "third";
|
|
249
|
+
readonly "event.nth.4": "fourth";
|
|
250
|
+
readonly "event.nth.5": "fifth";
|
|
251
|
+
readonly "event.until": "Until (optional)";
|
|
252
|
+
readonly "event.skip": "Dates it doesn't happen";
|
|
253
|
+
readonly "event.skipDate": "A date it doesn't happen";
|
|
254
|
+
readonly "event.addSkip": "Skip this date";
|
|
255
|
+
readonly "event.next": "Next: {when}";
|
|
256
|
+
readonly "event.when": "{when}";
|
|
170
257
|
readonly "collectionSettings.general": "General";
|
|
171
258
|
readonly "collectionSettings.path": "Address of each item's page";
|
|
172
259
|
readonly "collectionSettings.pathHint": "{slug} stands for each item's own address, as in /videos/{slug}.";
|
|
@@ -201,11 +288,13 @@ export declare const defaultStrings: {
|
|
|
201
288
|
readonly "fields.type.richtext": "Formatted text";
|
|
202
289
|
readonly "fields.type.number": "Number";
|
|
203
290
|
readonly "fields.type.date": "Date";
|
|
291
|
+
readonly "fields.type.event": "Date and time, for events";
|
|
204
292
|
readonly "fields.type.link": "Link";
|
|
205
293
|
readonly "fields.type.image": "Image (URL)";
|
|
206
294
|
readonly "fields.type.select": "Choice from a list";
|
|
207
|
-
readonly "
|
|
208
|
-
readonly "demo.
|
|
295
|
+
readonly "fields.type.tags": "Tags (any number of choices from a list)";
|
|
296
|
+
readonly "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.";
|
|
297
|
+
readonly "demo.published": "Saved in this browser. The site itself doesn't change in a demo.";
|
|
209
298
|
readonly "demo.startOver": "Start over";
|
|
210
299
|
readonly "demo.startOverTitle": "Start over?";
|
|
211
300
|
readonly "demo.startOverBody": "Everything you've changed in this demo, including uploads, will be undone.";
|
|
@@ -275,13 +364,15 @@ export declare const defaultStrings: {
|
|
|
275
364
|
readonly "media.deleteBody": "{name} will be removed from the site.";
|
|
276
365
|
readonly "media.deleteUsed": "It's used in: {places}. Those places will show a missing image or a broken link.";
|
|
277
366
|
readonly "media.notUsed": "Nothing on the site uses it.";
|
|
278
|
-
readonly "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 and
|
|
367
|
+
readonly "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).";
|
|
279
368
|
readonly "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.";
|
|
280
369
|
readonly "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.";
|
|
281
370
|
readonly "media.choose": "Choose image";
|
|
282
371
|
readonly "media.chooseFile": "Choose file";
|
|
372
|
+
readonly "media.chooseVideo": "Choose video";
|
|
283
373
|
readonly "media.pickerTitle": "Choose an image";
|
|
284
374
|
readonly "media.pickerTitleFile": "Choose a file";
|
|
375
|
+
readonly "media.pickerTitleVideo": "Choose a video";
|
|
285
376
|
readonly "media.pickerEmpty": "Nothing has been uploaded yet. Upload a file to use it here.";
|
|
286
377
|
readonly "media.clear": "Remove";
|
|
287
378
|
readonly "ai.label": "AI";
|
|
@@ -331,7 +422,7 @@ export declare const defaultStrings: {
|
|
|
331
422
|
readonly "ai.error.refused": "{service} declined to write this. Try asking a different way.";
|
|
332
423
|
readonly "ai.error.answer": "The answer couldn't be used. Try again, or try a different model or service.";
|
|
333
424
|
readonly "ai.error.service": "{service} reported a problem. Try again in a moment.";
|
|
334
|
-
readonly "settings.title": "Site
|
|
425
|
+
readonly "settings.title": "Site Settings";
|
|
335
426
|
readonly "appearance.choice": "Colors of the admin panel";
|
|
336
427
|
readonly "appearance.system": "Match my computer";
|
|
337
428
|
readonly "appearance.light": "Light";
|
|
@@ -341,16 +432,181 @@ export declare const defaultStrings: {
|
|
|
341
432
|
readonly "settings.tab.menus": "Menus";
|
|
342
433
|
readonly "settings.tab.css": "Custom CSS";
|
|
343
434
|
readonly "settings.tab.code": "Code";
|
|
435
|
+
readonly "settings.tab.redirects": "Redirects";
|
|
436
|
+
readonly "settings.tab.domain": "Domain";
|
|
344
437
|
readonly "settings.message": "Update site settings";
|
|
345
438
|
readonly "settings.preview": "Preview of the home page";
|
|
346
439
|
readonly "settings.previewEmpty": "Add a home page to see a preview here.";
|
|
440
|
+
readonly "domain.intro": "Connect a domain you own, such as example.org, so the site is at that address.";
|
|
441
|
+
readonly "domain.current": "The site is at {address} now.";
|
|
442
|
+
readonly "domain.connected": "Connected to {domain}.";
|
|
443
|
+
readonly "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.";
|
|
444
|
+
readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
445
|
+
readonly "domain.demo": "Domains can't be connected in a demo.";
|
|
446
|
+
readonly "domain.loading": "Finding where the site is published…";
|
|
447
|
+
readonly "domain.elsewhere": "This site isn't published with {host} Pages, so its domain is connected where it is published.";
|
|
448
|
+
readonly "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.";
|
|
449
|
+
readonly "domain.field": "Domain";
|
|
450
|
+
readonly "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.";
|
|
451
|
+
readonly "domain.invalid": "That isn't a domain. Type it like example.org.";
|
|
452
|
+
readonly "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.";
|
|
453
|
+
readonly "domain.connect": "Connect domain";
|
|
454
|
+
readonly "domain.connecting": "Connecting…";
|
|
455
|
+
readonly "domain.message": "Use the domain {domain}";
|
|
456
|
+
readonly "domain.records.title": "1. Add these records at your registrar";
|
|
457
|
+
readonly "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.";
|
|
458
|
+
readonly "domain.records.type": "Type";
|
|
459
|
+
readonly "domain.records.name": "Name";
|
|
460
|
+
readonly "domain.records.value": "Value";
|
|
461
|
+
readonly "domain.records.state": "Found";
|
|
462
|
+
readonly "domain.records.ok": "In place";
|
|
463
|
+
readonly "domain.records.missing": "Not there yet";
|
|
464
|
+
readonly "domain.records.wrong": "Something else is there: {found}";
|
|
465
|
+
readonly "domain.records.optional": "optional";
|
|
466
|
+
readonly "domain.purpose.site": "Points the domain at the site.";
|
|
467
|
+
readonly "domain.purpose.verification": "Proves to {host} that the domain is yours. Leave it in place.";
|
|
468
|
+
readonly "domain.purpose.www": "Sends www. to the site too.";
|
|
469
|
+
readonly "domain.guides": "How to add records at:";
|
|
470
|
+
readonly "domain.cloudflare": "On Cloudflare, set each record's proxy status to DNS only, or {host} can't set up HTTPS for the domain.";
|
|
471
|
+
readonly "domain.host.title": "2. {host} checks the domain and sets up HTTPS";
|
|
472
|
+
readonly "domain.host.unverified": "Waiting for {host} to find the record that proves the domain is yours.";
|
|
473
|
+
readonly "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.";
|
|
474
|
+
readonly "domain.host.ready": "The HTTPS certificate is ready.";
|
|
475
|
+
readonly "domain.host.failed": "The HTTPS certificate couldn't be set up. Check the records, then remove the domain and connect it again.";
|
|
476
|
+
readonly "domain.site.title": "3. The site opens at {address}";
|
|
477
|
+
readonly "domain.site.waiting": "Not yet. New records can take from a few minutes to a day to reach everyone.";
|
|
478
|
+
readonly "domain.site.ok": "It does.";
|
|
479
|
+
readonly "domain.secure": "Send everyone to {address}";
|
|
480
|
+
readonly "domain.secureHint": "Visitors always get the secure address, and the site's old address sends them there too.";
|
|
481
|
+
readonly "domain.done": "Done: the site is at {address}.";
|
|
482
|
+
readonly "domain.check": "Check again";
|
|
483
|
+
readonly "domain.checking": "Checking…";
|
|
484
|
+
readonly "domain.checkFailed": "Couldn't check the records just now. Try again in a moment.";
|
|
485
|
+
readonly "domain.remove": "Remove domain";
|
|
486
|
+
readonly "domain.removeTitle": "Remove {domain}?";
|
|
487
|
+
readonly "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.";
|
|
488
|
+
readonly "domain.removeMessage": "Stop using the domain {domain}";
|
|
489
|
+
readonly "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.";
|
|
490
|
+
readonly "domain.error.taken": "Another site on {host} already uses this domain. If it's yours too, remove it there first.";
|
|
491
|
+
readonly "domain.error.invalid": "{host} doesn't accept this domain.";
|
|
492
|
+
readonly "domain.error.not-ready": "The HTTPS certificate isn't ready yet. Try again in a while.";
|
|
493
|
+
readonly "domain.error.other": "Something went wrong.";
|
|
494
|
+
readonly "owner.token.title": "Use an owner token";
|
|
495
|
+
readonly "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.";
|
|
496
|
+
readonly "owner.token.create": "Create an owner token on {host}";
|
|
497
|
+
readonly "owner.token.chooseSite": "If {host} asks what the token can access, choose only this site.";
|
|
498
|
+
readonly "owner.token.paste": "Copy the token and paste it here:";
|
|
499
|
+
readonly "owner.token.label": "Owner token";
|
|
500
|
+
readonly "owner.token.use": "Use this token";
|
|
501
|
+
readonly "owner.token.checking": "Checking…";
|
|
502
|
+
readonly "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.";
|
|
503
|
+
readonly "owner.token.active": "This tab is using an owner token.";
|
|
504
|
+
readonly "owner.token.forget": "Stop using it";
|
|
505
|
+
readonly "settings.tab.editors": "Editors";
|
|
506
|
+
readonly "settings.tab.updates": "Updates";
|
|
507
|
+
readonly "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.";
|
|
508
|
+
readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
509
|
+
readonly "updates.demo": "Updates aren't installed in a demo.";
|
|
510
|
+
readonly "updates.loading": "Checking for updates…";
|
|
511
|
+
readonly "updates.current": "This site uses Goodfellow {version}.";
|
|
512
|
+
readonly "updates.unknownVersion": "This site's Goodfellow release couldn't be found.";
|
|
513
|
+
readonly "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.";
|
|
514
|
+
readonly "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.";
|
|
515
|
+
readonly "updates.enable": "Turn on automatic updates";
|
|
516
|
+
readonly "updates.fixes.title": "Fixes";
|
|
517
|
+
readonly "updates.fixes.ready": "Fixes up to Goodfellow {version} are ready. They install on their own tonight, or you can install them now.";
|
|
518
|
+
readonly "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.";
|
|
519
|
+
readonly "updates.fixes.now": "Install fixes now";
|
|
520
|
+
readonly "updates.fixes.none": "The site has every fix for its release.";
|
|
521
|
+
readonly "updates.newer.title": "Goodfellow {version} is out";
|
|
522
|
+
readonly "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.";
|
|
523
|
+
readonly "updates.newer.whatsNew": "What's new";
|
|
524
|
+
readonly "updates.newer.install": "Update to {version}";
|
|
525
|
+
readonly "updates.newer.onlyOwners": "Only the site's owners can install a newer release.";
|
|
526
|
+
readonly "updates.automatic.label": "Install fixes automatically each night";
|
|
527
|
+
readonly "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.";
|
|
528
|
+
readonly "updates.automatic.onlyOwners": "Only the site's owners can change this.";
|
|
529
|
+
readonly "updates.automatic.turnOff": "Turn off automatic fixes";
|
|
530
|
+
readonly "updates.automatic.turnOn": "Turn on automatic fixes";
|
|
531
|
+
readonly "updates.back.title": "Something stopped working?";
|
|
532
|
+
readonly "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.";
|
|
533
|
+
readonly "updates.back.button": "Go back to {version}";
|
|
534
|
+
readonly "updates.back.confirm": "Go back to Goodfellow {version}? It takes a few minutes.";
|
|
535
|
+
readonly "updates.skipped.title": "Releases that won't be installed";
|
|
536
|
+
readonly "updates.skipped.body": "The site went back from these releases, so updates don't install them.";
|
|
537
|
+
readonly "updates.skipped.allow": "Allow {version} again";
|
|
538
|
+
readonly "updates.skipped.allowMessage": "Allow Goodfellow {version} again";
|
|
539
|
+
readonly "updates.started": "The update has started. It takes a few minutes, and this page shows how it went.";
|
|
540
|
+
readonly "updates.last.title": "Last update";
|
|
541
|
+
readonly "updates.last.none": "No update has run yet.";
|
|
542
|
+
readonly "updates.last.running": "An update is running now. It takes a few minutes.";
|
|
543
|
+
readonly "updates.last.updated": "On {date}, Goodfellow {version} was installed.";
|
|
544
|
+
readonly "updates.last.updatedSome": "On {date}, an update was installed.";
|
|
545
|
+
readonly "updates.last.wentBack": "On {date}, the site went back to Goodfellow {version}.";
|
|
546
|
+
readonly "updates.last.paused": "On {date}, automatic fixes were turned off, so nothing was installed.";
|
|
547
|
+
readonly "updates.last.upToDate": "On {date}, there was nothing new to install.";
|
|
548
|
+
readonly "updates.last.failed": "On {date}, the update didn't work, so nothing changed and the site stayed as it was.";
|
|
549
|
+
readonly "updates.last.unknown": "An update ran on {date}.";
|
|
550
|
+
readonly "updates.last.details": "See the details on {host}";
|
|
551
|
+
readonly "updates.failed.build": "The site didn't build with Goodfellow {version}; a developer may need to look at the details.";
|
|
552
|
+
readonly "updates.failed.install": "Its packages couldn't be installed. The next night tries again.";
|
|
553
|
+
readonly "updates.failed.blocks": "One of the site's blocks couldn't be updated.";
|
|
554
|
+
readonly "updates.failed.publish": "Someone published at the same time. The next night tries again.";
|
|
555
|
+
readonly "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:";
|
|
556
|
+
readonly "updates.error.load": "The updates couldn't be checked. Check your connection and try again.";
|
|
557
|
+
readonly "updates.error.not-allowed": "Your account can't do that on {host}. Ask one of the site's owners.";
|
|
558
|
+
readonly "updates.error.missing": "This site's build setup doesn't install updates, so there's nothing to run.";
|
|
559
|
+
readonly "updates.error.save": "The change couldn't be saved. Try again in a moment.";
|
|
560
|
+
readonly "updates.error.other": "Something went wrong. Try again in a moment.";
|
|
561
|
+
readonly "editors.intro": "The people who can edit this site.";
|
|
562
|
+
readonly "editors.roles": "Editors can change and publish everything in the admin panel. Owners can also invite and remove editors, and connect a domain.";
|
|
563
|
+
readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
564
|
+
readonly "editors.demo": "Editors can't be invited in a demo.";
|
|
565
|
+
readonly "editors.loading": "Loading editors…";
|
|
566
|
+
readonly "editors.onlyOwners": "Only the site's owners can invite and remove editors.";
|
|
567
|
+
readonly "editors.cantPublish": "Editors can't publish yet: {host} only lets owners publish to the site until it's told to let editors publish too.";
|
|
568
|
+
readonly "editors.letPublish": "Let editors publish";
|
|
569
|
+
readonly "editors.person": "Person";
|
|
570
|
+
readonly "editors.role": "Can";
|
|
571
|
+
readonly "editors.roleFor": "What {name} can do";
|
|
572
|
+
readonly "editors.actions": "Actions";
|
|
573
|
+
readonly "editors.role.owner": "Owner";
|
|
574
|
+
readonly "editors.role.editor": "Editor";
|
|
575
|
+
readonly "editors.role.viewer": "Can't publish";
|
|
576
|
+
readonly "editors.you": "You";
|
|
577
|
+
readonly "editors.invited": "Invited, hasn't accepted yet";
|
|
578
|
+
readonly "editors.inherited": "Through a group on {host}";
|
|
579
|
+
readonly "editors.remove": "Remove";
|
|
580
|
+
readonly "editors.withdraw": "Withdraw invitation";
|
|
581
|
+
readonly "editors.removeTitle": "Remove {name}?";
|
|
582
|
+
readonly "editors.removeBody": "They won't be able to edit the site any more. Their account on {host} stays as it is.";
|
|
583
|
+
readonly "editors.withdrawTitle": "Withdraw the invitation to {name}?";
|
|
584
|
+
readonly "editors.withdrawBody": "The invitation stops working. You can invite them again later.";
|
|
585
|
+
readonly "editors.invite.title": "Invite someone";
|
|
586
|
+
readonly "editors.invite.field": "Their {host} username";
|
|
587
|
+
readonly "editors.invite.hint": "They need a {host} account. {host} emails them an invitation, which they accept before they can sign in here.";
|
|
588
|
+
readonly "editors.invite.fieldEmail": "Their email address or {host} username";
|
|
589
|
+
readonly "editors.invite.hintEmail": "With an email address, {host} emails them an invitation, and they make an account if they don't have one.";
|
|
590
|
+
readonly "editors.invite.submit": "Invite";
|
|
591
|
+
readonly "editors.error.load": "The editors couldn't be loaded. Check your connection and try again.";
|
|
592
|
+
readonly "editors.error.not-allowed": "You can't change who edits the site.";
|
|
593
|
+
readonly "editors.error.not-found": "There's no {host} account with that name. Check the spelling.";
|
|
594
|
+
readonly "editors.error.invalid": "That isn't a username or email address that {host} accepts.";
|
|
595
|
+
readonly "editors.error.already": "They already edit the site, or have been invited.";
|
|
596
|
+
readonly "editors.error.other": "Something went wrong. Try again in a moment.";
|
|
347
597
|
readonly "general.siteTitle": "Site name";
|
|
348
598
|
readonly "general.description": "Description";
|
|
349
599
|
readonly "general.descriptionHint": "Shown by search engines when a page doesn't have its own description.";
|
|
350
600
|
readonly "general.url": "Site address";
|
|
351
601
|
readonly "general.urlHint": "The full public address, such as https://example.org. Used for search engines and link previews.";
|
|
602
|
+
readonly "general.externalLinksInNewTab": "Open links to other sites in a new tab";
|
|
603
|
+
readonly "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.";
|
|
352
604
|
readonly "general.language": "Language code";
|
|
353
605
|
readonly "general.languageHint": "Such as en, es or fr.";
|
|
606
|
+
readonly "general.timeZone": "Time zone";
|
|
607
|
+
readonly "general.timeZoneHint": "The time zone events' times are in. Calendars show them in it, and visitors' calendars move them to their own.";
|
|
608
|
+
readonly "general.timeZoneNone": "Not set: times are shown as they're written";
|
|
609
|
+
readonly "general.timeZoneUseMine": "Use {zone}";
|
|
354
610
|
readonly "general.titleTemplate": "Browser tab title";
|
|
355
611
|
readonly "general.titleTemplateHint": '%s is replaced by the page title, so "%s | My site" shows "About | My site".';
|
|
356
612
|
readonly "general.favicon": "Browser tab icon";
|
|
@@ -362,6 +618,24 @@ export declare const defaultStrings: {
|
|
|
362
618
|
readonly "general.address": "Address";
|
|
363
619
|
readonly "general.phone": "Phone";
|
|
364
620
|
readonly "general.email": "Email";
|
|
621
|
+
readonly "forms.title": "Forms";
|
|
622
|
+
readonly "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.";
|
|
623
|
+
readonly "forms.service": "Form service";
|
|
624
|
+
readonly "forms.service.web3forms": "Web3Forms: free for 250 answers a month, with no account";
|
|
625
|
+
readonly "forms.service.formspree": "Formspree";
|
|
626
|
+
readonly "forms.service.other": "Another service";
|
|
627
|
+
readonly "forms.accessKey": "Web3Forms access key";
|
|
628
|
+
readonly "forms.accessKeyHint": "On Web3Forms' site, enter the email address answers should go to. Web3Forms emails you a key: paste it here.";
|
|
629
|
+
readonly "forms.accessKeyLink": "Get an access key from Web3Forms";
|
|
630
|
+
readonly "forms.captcha": "Ask visitors to show they aren't robots (hCaptcha)";
|
|
631
|
+
readonly "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.";
|
|
632
|
+
readonly "forms.formspree": "Formspree form address";
|
|
633
|
+
readonly "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.";
|
|
634
|
+
readonly "forms.address": "Address forms send answers to";
|
|
635
|
+
readonly "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.";
|
|
636
|
+
readonly "forms.error.key": "This isn't a Web3Forms access key. Copy it from Web3Forms' email: it looks like 0b5c4f7e-1a2b-4c3d-8e9f-0123456789ab.";
|
|
637
|
+
readonly "forms.error.formspree": "This isn't a Formspree form's address. It looks like https://formspree.io/f/xyzabcde.";
|
|
638
|
+
readonly "forms.error.address": "The address must be a full address starting with https://.";
|
|
365
639
|
readonly "theme.colors": "Colors";
|
|
366
640
|
readonly "theme.fonts": "Fonts";
|
|
367
641
|
readonly "theme.fontsHint": "Choose from Google Fonts. Site default uses each visitor's standard font.";
|
|
@@ -407,6 +681,24 @@ export declare const defaultStrings: {
|
|
|
407
681
|
readonly "menus.moveDown": "Move down";
|
|
408
682
|
readonly "menus.remove": "Remove";
|
|
409
683
|
readonly "menus.newLink": "New link";
|
|
684
|
+
readonly "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.";
|
|
685
|
+
readonly "redirects.empty": "There are no redirects yet.";
|
|
686
|
+
readonly "redirects.from": "Old address";
|
|
687
|
+
readonly "redirects.to": "Send visitors to";
|
|
688
|
+
readonly "redirects.add": "Add redirect";
|
|
689
|
+
readonly "redirects.remove": "Remove";
|
|
690
|
+
readonly "redirects.message": "Message while visitors are sent on";
|
|
691
|
+
readonly "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.";
|
|
692
|
+
readonly "redirects.unused": "A page has this address, so visitors see the page instead. Remove the redirect, or move the page.";
|
|
693
|
+
readonly "redirects.problem.noFrom": "Add the old address, such as /about-us.";
|
|
694
|
+
readonly "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.";
|
|
695
|
+
readonly "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 ?.";
|
|
696
|
+
readonly "redirects.problem.home": "The home page can't be redirected.";
|
|
697
|
+
readonly "redirects.problem.reserved": "This address is used by the site itself, so it can't be redirected.";
|
|
698
|
+
readonly "redirects.problem.noTo": "Add where to send visitors, such as /about.";
|
|
699
|
+
readonly "redirects.problem.badTo": "Send visitors to a page on this site, starting with /, or to another website's address, starting with https://.";
|
|
700
|
+
readonly "redirects.problem.loop": "This sends visitors back to the same address.";
|
|
701
|
+
readonly "redirects.problem.duplicate": "Another redirect is from the same address. Remove one of them.";
|
|
410
702
|
readonly "css.intro": "CSS here applies to every page and overrides the blocks' own styles. Tailwind's @apply works too.";
|
|
411
703
|
readonly "css.label": "Custom CSS";
|
|
412
704
|
readonly "code.editorHint": "Tab indents, and suggestions appear as you type. Press Escape, then Tab, to leave the editor. Ctrl+F finds and replaces.";
|