@goodfellow-cms/admin 0.1.0 → 0.3.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 +335 -7
- package/dist/index.js +7415 -4231
- package/package.json +8 -8
- package/styles.css +258 -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";
|
|
@@ -49,6 +49,13 @@ export declare const defaultStrings: {
|
|
|
49
49
|
readonly "signIn.error.no-access": "That account can't see this site. Make sure the token was given access to it.";
|
|
50
50
|
readonly "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.";
|
|
51
51
|
readonly "signIn.error.redirect-failed": "Signing in didn't finish. Try again.";
|
|
52
|
+
readonly "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.";
|
|
53
|
+
readonly "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.";
|
|
54
|
+
readonly "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.";
|
|
55
|
+
readonly "signIn.error.local-address": "Signing in with {host} works only on the published site. Sign in with an access token here.";
|
|
56
|
+
readonly "signIn.error.not-owner": "That account isn't an owner of this site on {host}.";
|
|
57
|
+
readonly "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.";
|
|
58
|
+
readonly "signIn.install": "Install Goodfellow on {host}";
|
|
52
59
|
readonly "signIn.error.expired": "You were signed out because your sign-in expired. Sign in again to keep editing.";
|
|
53
60
|
readonly "signIn.error.other": "Couldn't reach {host}. Check your connection and try again.";
|
|
54
61
|
readonly "account.signedInAs": "Signed in as {name}";
|
|
@@ -56,7 +63,22 @@ export declare const defaultStrings: {
|
|
|
56
63
|
readonly "deploy.building": "Updating the live site…";
|
|
57
64
|
readonly "deploy.live": "The live site is up to date";
|
|
58
65
|
readonly "deploy.failed": "The live site couldn't be updated";
|
|
59
|
-
readonly "
|
|
66
|
+
readonly "build.why": "What went wrong?";
|
|
67
|
+
readonly "build.title": "Why the live site wasn't updated";
|
|
68
|
+
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.";
|
|
69
|
+
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}.";
|
|
70
|
+
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.";
|
|
71
|
+
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.";
|
|
72
|
+
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}.";
|
|
73
|
+
readonly "build.host": "A problem on {host}'s side stopped the rebuild. That's usually a passing problem, so the next publish may work.";
|
|
74
|
+
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.";
|
|
75
|
+
readonly "build.contentHistory": "Version history of {file}";
|
|
76
|
+
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.";
|
|
77
|
+
readonly "build.blocks": "Go to Blocks";
|
|
78
|
+
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.";
|
|
79
|
+
readonly "build.code": "The site couldn't be rebuilt. A developer needs to look at the details.";
|
|
80
|
+
readonly "build.unknown": "{host} didn't say why the rebuild failed. Its details may help a developer.";
|
|
81
|
+
readonly "build.hostDetails": "See the details on {host}";
|
|
60
82
|
readonly "loadError.title": "The admin panel couldn't open this site";
|
|
61
83
|
readonly "loadError.contentProblems": "Some of the site's files have problems, so they can't be edited until they're fixed.";
|
|
62
84
|
readonly "loadError.other": "Something went wrong while loading the site. Check your connection and try again.";
|
|
@@ -96,6 +118,8 @@ export declare const defaultStrings: {
|
|
|
96
118
|
readonly "movePage.title": "Change the address of {title}";
|
|
97
119
|
readonly "movePage.address": "New address";
|
|
98
120
|
readonly "movePage.updateLinks": "Update menu links to this page";
|
|
121
|
+
readonly "movePage.redirect": "Keep {from} working by sending visitors on to the page";
|
|
122
|
+
readonly "movePage.redirectHint": "Links to the old address elsewhere, such as on other websites, keep working. Site Settings → Redirects lists it.";
|
|
99
123
|
readonly "movePage.warning": "Links to the old address elsewhere, such as in page text or on other websites, will stop working.";
|
|
100
124
|
readonly "movePage.submit": "Change address";
|
|
101
125
|
readonly "movePage.message": 'Move page "{title}" from {from} to {to}';
|
|
@@ -110,6 +134,31 @@ export declare const defaultStrings: {
|
|
|
110
134
|
readonly "editPage.message": 'Update page "{title}"';
|
|
111
135
|
readonly "editPage.notFound": "This page doesn't exist. It may have been moved or deleted.";
|
|
112
136
|
readonly "editPage.backToPages": "Back to pages";
|
|
137
|
+
readonly "versions.button": "Version history";
|
|
138
|
+
readonly "versions.title": "Version history: {title}";
|
|
139
|
+
readonly "versions.back": "Back to editing";
|
|
140
|
+
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.";
|
|
141
|
+
readonly "versions.notFound": "There's no history to show here. It may have been moved or deleted.";
|
|
142
|
+
readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
143
|
+
readonly "versions.demo": "Version history isn't kept in a demo.";
|
|
144
|
+
readonly "versions.loading": "Loading versions…";
|
|
145
|
+
readonly "versions.loadingVersion": "Loading this version…";
|
|
146
|
+
readonly "versions.error": "The versions couldn't be loaded. Check your connection and try again.";
|
|
147
|
+
readonly "versions.empty": "Nothing has been published here yet.";
|
|
148
|
+
readonly "versions.current": "Current version";
|
|
149
|
+
readonly "versions.by": "{date}, by {author}";
|
|
150
|
+
readonly "versions.more": "Show older versions";
|
|
151
|
+
readonly "versions.preview": "The version from {date}";
|
|
152
|
+
readonly "versions.noPreview": "This item has no page of its own, so there's nothing to preview.";
|
|
153
|
+
readonly "versions.restore": "Restore this version";
|
|
154
|
+
readonly "versions.restoreTitle": "Restore the version from {date}?";
|
|
155
|
+
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.";
|
|
156
|
+
readonly "versions.restoring": "Restoring…";
|
|
157
|
+
readonly "versions.restoreMessage": 'Restore "{title}" to the version from {date}';
|
|
158
|
+
readonly "versions.restored": "Restored the version from {date}.";
|
|
159
|
+
readonly "versions.readError": "This version couldn't be loaded. Check your connection and try again.";
|
|
160
|
+
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.";
|
|
161
|
+
readonly "versions.unknownBlocks": "This version can't be restored, because it uses blocks the site doesn't have any more: {blocks}.";
|
|
113
162
|
readonly "layout.header": "Header";
|
|
114
163
|
readonly "layout.footer": "Footer";
|
|
115
164
|
readonly "layout.headerMessage": "Update the header";
|
|
@@ -123,6 +172,13 @@ export declare const defaultStrings: {
|
|
|
123
172
|
readonly "collections.column.address": "Pages";
|
|
124
173
|
readonly "collections.noPages": "No pages of their own";
|
|
125
174
|
readonly "newCollection.title": "New collection";
|
|
175
|
+
readonly "newCollection.kind": "Start with";
|
|
176
|
+
readonly "newCollection.kindBlank": "A title and text";
|
|
177
|
+
readonly "newCollection.kindEvents": "Events";
|
|
178
|
+
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.";
|
|
179
|
+
readonly "newCollection.eventsName": "Events";
|
|
180
|
+
readonly "newCollection.eventsEntryName": "Event";
|
|
181
|
+
readonly "newCollection.timeZone": "The site's time zone will be set to {zone}. You can change it in Site Settings.";
|
|
126
182
|
readonly "newCollection.name": "Name";
|
|
127
183
|
readonly "newCollection.nameHint": "What the whole collection is called, such as Videos or Events.";
|
|
128
184
|
readonly "newCollection.nameTaken": "Another collection already has a name like this. Choose another.";
|
|
@@ -158,6 +214,7 @@ export declare const defaultStrings: {
|
|
|
158
214
|
readonly "editEntry.notFound": "This item doesn't exist. It may have been renamed or deleted.";
|
|
159
215
|
readonly "editEntry.back": "Back to {name}";
|
|
160
216
|
readonly "editEntry.required": "Fill in {fields} before publishing.";
|
|
217
|
+
readonly "editEntry.invalidEvent": "Check {fields}: an event has to end after it starts.";
|
|
161
218
|
readonly "editEntry.noPage": "Items in {name} don't have pages of their own. They appear wherever a Collection list block shows {name}.";
|
|
162
219
|
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
220
|
readonly "template.message": "Update the page design for {name}";
|
|
@@ -167,6 +224,43 @@ export declare const defaultStrings: {
|
|
|
167
224
|
readonly "collectionSettings.markdownNeedsText": "To store items as Markdown files, add a formatted-text field first.";
|
|
168
225
|
readonly "collectionSettings.markdownBody": "Field saved as the Markdown text";
|
|
169
226
|
readonly "collectionSettings.markdownConverts": "Every item will be converted when you publish.";
|
|
227
|
+
readonly "collectionSettings.calendar": "Show items in calendars";
|
|
228
|
+
readonly "collectionSettings.calendarHint": "Items become events that Calendar blocks show, which visitors can add to their own calendars or subscribe to.";
|
|
229
|
+
readonly "collectionSettings.calendarNeedsDate": 'To show items in calendars, add a "Date and time, for events" field first.';
|
|
230
|
+
readonly "collectionSettings.calendarWhen": "When items happen";
|
|
231
|
+
readonly "collectionSettings.calendarPlace": "Where";
|
|
232
|
+
readonly "collectionSettings.calendarSummary": "Summary";
|
|
233
|
+
readonly "collectionSettings.calendarNone": "None";
|
|
234
|
+
readonly "event.starts": "Starts";
|
|
235
|
+
readonly "event.ends": "Ends (optional)";
|
|
236
|
+
readonly "event.time": "Time";
|
|
237
|
+
readonly "event.allDay": "All day";
|
|
238
|
+
readonly "event.repeats": "Repeats";
|
|
239
|
+
readonly "event.repeat.none": "Doesn't repeat";
|
|
240
|
+
readonly "event.repeat.day": "Daily";
|
|
241
|
+
readonly "event.repeat.week": "Weekly";
|
|
242
|
+
readonly "event.repeat.month": "Monthly";
|
|
243
|
+
readonly "event.repeat.year": "Yearly";
|
|
244
|
+
readonly "event.interval.days": "Every how many days";
|
|
245
|
+
readonly "event.interval.weeks": "Every how many weeks";
|
|
246
|
+
readonly "event.interval.months": "Every how many months";
|
|
247
|
+
readonly "event.interval.years": "Every how many years";
|
|
248
|
+
readonly "event.onDays": "On";
|
|
249
|
+
readonly "event.monthlyOn": "On";
|
|
250
|
+
readonly "event.monthly.date": "Day {day} of the month";
|
|
251
|
+
readonly "event.monthly.weekday": "The {nth} {weekday} of the month";
|
|
252
|
+
readonly "event.monthly.last": "The last {weekday} of the month";
|
|
253
|
+
readonly "event.nth.1": "first";
|
|
254
|
+
readonly "event.nth.2": "second";
|
|
255
|
+
readonly "event.nth.3": "third";
|
|
256
|
+
readonly "event.nth.4": "fourth";
|
|
257
|
+
readonly "event.nth.5": "fifth";
|
|
258
|
+
readonly "event.until": "Until (optional)";
|
|
259
|
+
readonly "event.skip": "Dates it doesn't happen";
|
|
260
|
+
readonly "event.skipDate": "A date it doesn't happen";
|
|
261
|
+
readonly "event.addSkip": "Skip this date";
|
|
262
|
+
readonly "event.next": "Next: {when}";
|
|
263
|
+
readonly "event.when": "{when}";
|
|
170
264
|
readonly "collectionSettings.general": "General";
|
|
171
265
|
readonly "collectionSettings.path": "Address of each item's page";
|
|
172
266
|
readonly "collectionSettings.pathHint": "{slug} stands for each item's own address, as in /videos/{slug}.";
|
|
@@ -201,11 +295,13 @@ export declare const defaultStrings: {
|
|
|
201
295
|
readonly "fields.type.richtext": "Formatted text";
|
|
202
296
|
readonly "fields.type.number": "Number";
|
|
203
297
|
readonly "fields.type.date": "Date";
|
|
298
|
+
readonly "fields.type.event": "Date and time, for events";
|
|
204
299
|
readonly "fields.type.link": "Link";
|
|
205
300
|
readonly "fields.type.image": "Image (URL)";
|
|
206
301
|
readonly "fields.type.select": "Choice from a list";
|
|
207
|
-
readonly "
|
|
208
|
-
readonly "demo.
|
|
302
|
+
readonly "fields.type.tags": "Tags (any number of choices from a list)";
|
|
303
|
+
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.";
|
|
304
|
+
readonly "demo.published": "Saved in this browser. The site itself doesn't change in a demo.";
|
|
209
305
|
readonly "demo.startOver": "Start over";
|
|
210
306
|
readonly "demo.startOverTitle": "Start over?";
|
|
211
307
|
readonly "demo.startOverBody": "Everything you've changed in this demo, including uploads, will be undone.";
|
|
@@ -275,15 +371,18 @@ export declare const defaultStrings: {
|
|
|
275
371
|
readonly "media.deleteBody": "{name} will be removed from the site.";
|
|
276
372
|
readonly "media.deleteUsed": "It's used in: {places}. Those places will show a missing image or a broken link.";
|
|
277
373
|
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
|
|
374
|
+
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
375
|
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
376
|
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
377
|
readonly "media.choose": "Choose image";
|
|
282
378
|
readonly "media.chooseFile": "Choose file";
|
|
379
|
+
readonly "media.chooseVideo": "Choose video";
|
|
283
380
|
readonly "media.pickerTitle": "Choose an image";
|
|
284
381
|
readonly "media.pickerTitleFile": "Choose a file";
|
|
382
|
+
readonly "media.pickerTitleVideo": "Choose a video";
|
|
285
383
|
readonly "media.pickerEmpty": "Nothing has been uploaded yet. Upload a file to use it here.";
|
|
286
384
|
readonly "media.clear": "Remove";
|
|
385
|
+
readonly "media.credit": "Credit: {credit}";
|
|
287
386
|
readonly "ai.label": "AI";
|
|
288
387
|
readonly "ai.title": "Write with AI";
|
|
289
388
|
readonly "ai.mode.add": "Describe what to add to this page, and AI will write it at the end of the page.";
|
|
@@ -293,6 +392,15 @@ export declare const defaultStrings: {
|
|
|
293
392
|
readonly "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.";
|
|
294
393
|
readonly "ai.placeholder.edit": "For example: make it shorter and friendlier, or translate it into Spanish.";
|
|
295
394
|
readonly "ai.placeholder.fill": "For example: Fr. Smith's homily from Sunday, about hope. Paste any notes here.";
|
|
395
|
+
readonly "ai.photos": "Find openly licensed photos where the media library has none that fit";
|
|
396
|
+
readonly "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.";
|
|
397
|
+
readonly "ai.photos.finding": "Finding photos…";
|
|
398
|
+
readonly "ai.photos.message": "Add photos from Openverse: {names}";
|
|
399
|
+
readonly "ai.photos.added": "Photos from Openverse added to the media library: {names}.";
|
|
400
|
+
readonly "ai.photos.missing": "No photo was found for {count} of the images, so they're left empty.";
|
|
401
|
+
readonly "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.";
|
|
402
|
+
readonly "ai.photos.error.unreachable": "Couldn't reach Openverse, so some images are left empty. Check your connection, or choose them from the media library.";
|
|
403
|
+
readonly "ai.photos.error.publish": "The photos found couldn't be added to the media library, so their images are left empty.";
|
|
296
404
|
readonly "ai.write": "Write it";
|
|
297
405
|
readonly "ai.change": "Change it";
|
|
298
406
|
readonly "ai.fill": "Fill it in";
|
|
@@ -331,7 +439,7 @@ export declare const defaultStrings: {
|
|
|
331
439
|
readonly "ai.error.refused": "{service} declined to write this. Try asking a different way.";
|
|
332
440
|
readonly "ai.error.answer": "The answer couldn't be used. Try again, or try a different model or service.";
|
|
333
441
|
readonly "ai.error.service": "{service} reported a problem. Try again in a moment.";
|
|
334
|
-
readonly "settings.title": "Site
|
|
442
|
+
readonly "settings.title": "Site Settings";
|
|
335
443
|
readonly "appearance.choice": "Colors of the admin panel";
|
|
336
444
|
readonly "appearance.system": "Match my computer";
|
|
337
445
|
readonly "appearance.light": "Light";
|
|
@@ -341,27 +449,216 @@ export declare const defaultStrings: {
|
|
|
341
449
|
readonly "settings.tab.menus": "Menus";
|
|
342
450
|
readonly "settings.tab.css": "Custom CSS";
|
|
343
451
|
readonly "settings.tab.code": "Code";
|
|
452
|
+
readonly "settings.tab.redirects": "Redirects";
|
|
453
|
+
readonly "settings.tab.domain": "Domain";
|
|
344
454
|
readonly "settings.message": "Update site settings";
|
|
345
455
|
readonly "settings.preview": "Preview of the home page";
|
|
346
456
|
readonly "settings.previewEmpty": "Add a home page to see a preview here.";
|
|
457
|
+
readonly "domain.intro": "Connect a domain you own, such as example.org, so the site is at that address.";
|
|
458
|
+
readonly "domain.current": "The site is at {address} now.";
|
|
459
|
+
readonly "domain.connected": "Connected to {domain}.";
|
|
460
|
+
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.";
|
|
461
|
+
readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
462
|
+
readonly "domain.demo": "Domains can't be connected in a demo.";
|
|
463
|
+
readonly "domain.loading": "Finding where the site is published…";
|
|
464
|
+
readonly "domain.elsewhere": "This site isn't published with {host} Pages, so its domain is connected where it is published.";
|
|
465
|
+
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.";
|
|
466
|
+
readonly "domain.field": "Domain";
|
|
467
|
+
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.";
|
|
468
|
+
readonly "domain.invalid": "That isn't a domain. Type it like example.org.";
|
|
469
|
+
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.";
|
|
470
|
+
readonly "domain.connect": "Connect domain";
|
|
471
|
+
readonly "domain.connecting": "Connecting…";
|
|
472
|
+
readonly "domain.message": "Use the domain {domain}";
|
|
473
|
+
readonly "domain.records.title": "1. Add these records at your registrar";
|
|
474
|
+
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.";
|
|
475
|
+
readonly "domain.records.type": "Type";
|
|
476
|
+
readonly "domain.records.name": "Name";
|
|
477
|
+
readonly "domain.records.value": "Value";
|
|
478
|
+
readonly "domain.records.state": "Found";
|
|
479
|
+
readonly "domain.records.ok": "In place";
|
|
480
|
+
readonly "domain.records.missing": "Not there yet";
|
|
481
|
+
readonly "domain.records.wrong": "Something else is there: {found}";
|
|
482
|
+
readonly "domain.records.optional": "optional";
|
|
483
|
+
readonly "domain.purpose.site": "Points the domain at the site.";
|
|
484
|
+
readonly "domain.purpose.verification": "Proves to {host} that the domain is yours. Leave it in place.";
|
|
485
|
+
readonly "domain.purpose.www": "Sends www. to the site too.";
|
|
486
|
+
readonly "domain.guides": "How to add records at:";
|
|
487
|
+
readonly "domain.cloudflare": "On Cloudflare, set each record's proxy status to DNS only, or {host} can't set up HTTPS for the domain.";
|
|
488
|
+
readonly "domain.host.title": "2. {host} checks the domain and sets up HTTPS";
|
|
489
|
+
readonly "domain.host.unverified": "Waiting for {host} to find the record that proves the domain is yours.";
|
|
490
|
+
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.";
|
|
491
|
+
readonly "domain.host.ready": "The HTTPS certificate is ready.";
|
|
492
|
+
readonly "domain.host.failed": "The HTTPS certificate couldn't be set up. Check the records, then remove the domain and connect it again.";
|
|
493
|
+
readonly "domain.site.title": "3. The site opens at {address}";
|
|
494
|
+
readonly "domain.site.waiting": "Not yet. New records can take from a few minutes to a day to reach everyone.";
|
|
495
|
+
readonly "domain.site.ok": "It does.";
|
|
496
|
+
readonly "domain.secure": "Send everyone to {address}";
|
|
497
|
+
readonly "domain.secureHint": "Visitors always get the secure address, and the site's old address sends them there too.";
|
|
498
|
+
readonly "domain.done": "Done: the site is at {address}.";
|
|
499
|
+
readonly "domain.check": "Check again";
|
|
500
|
+
readonly "domain.checking": "Checking…";
|
|
501
|
+
readonly "domain.checkFailed": "Couldn't check the records just now. Try again in a moment.";
|
|
502
|
+
readonly "domain.remove": "Remove domain";
|
|
503
|
+
readonly "domain.removeTitle": "Remove {domain}?";
|
|
504
|
+
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.";
|
|
505
|
+
readonly "domain.removeMessage": "Stop using the domain {domain}";
|
|
506
|
+
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.";
|
|
507
|
+
readonly "domain.error.taken": "Another site on {host} already uses this domain. If it's yours too, remove it there first.";
|
|
508
|
+
readonly "domain.error.invalid": "{host} doesn't accept this domain.";
|
|
509
|
+
readonly "domain.error.not-ready": "The HTTPS certificate isn't ready yet. Try again in a while.";
|
|
510
|
+
readonly "domain.error.other": "Something went wrong.";
|
|
511
|
+
readonly "owner.signIn.title": "Sign in as an owner";
|
|
512
|
+
readonly "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.";
|
|
513
|
+
readonly "owner.signIn.button": "Sign in as an owner with {host}";
|
|
514
|
+
readonly "owner.signIn.orToken": "Or use an owner token";
|
|
515
|
+
readonly "owner.token.title": "Use an owner token";
|
|
516
|
+
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.";
|
|
517
|
+
readonly "owner.token.create": "Create an owner token on {host}";
|
|
518
|
+
readonly "owner.token.chooseSite": "If {host} asks what the token can access, choose only this site.";
|
|
519
|
+
readonly "owner.token.paste": "Copy the token and paste it here:";
|
|
520
|
+
readonly "owner.token.label": "Owner token";
|
|
521
|
+
readonly "owner.token.use": "Use this token";
|
|
522
|
+
readonly "owner.token.checking": "Checking…";
|
|
523
|
+
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.";
|
|
524
|
+
readonly "owner.token.active": "This tab is using an owner token.";
|
|
525
|
+
readonly "owner.token.forget": "Stop using it";
|
|
526
|
+
readonly "settings.tab.editors": "Editors";
|
|
527
|
+
readonly "settings.tab.updates": "Updates";
|
|
528
|
+
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.";
|
|
529
|
+
readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
530
|
+
readonly "updates.demo": "Updates aren't installed in a demo.";
|
|
531
|
+
readonly "updates.loading": "Checking for updates…";
|
|
532
|
+
readonly "updates.current": "This site uses Goodfellow {version}.";
|
|
533
|
+
readonly "updates.unknownVersion": "This site's Goodfellow release couldn't be found.";
|
|
534
|
+
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.";
|
|
535
|
+
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.";
|
|
536
|
+
readonly "updates.enable": "Turn on automatic updates";
|
|
537
|
+
readonly "updates.fixes.title": "Fixes";
|
|
538
|
+
readonly "updates.fixes.ready": "Fixes up to Goodfellow {version} are ready. They install on their own tonight, or you can install them now.";
|
|
539
|
+
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.";
|
|
540
|
+
readonly "updates.fixes.now": "Install fixes now";
|
|
541
|
+
readonly "updates.fixes.none": "The site has every fix for its release.";
|
|
542
|
+
readonly "updates.newer.title": "Goodfellow {version} is out";
|
|
543
|
+
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.";
|
|
544
|
+
readonly "updates.newer.whatsNew": "What's new";
|
|
545
|
+
readonly "updates.newer.install": "Update to {version}";
|
|
546
|
+
readonly "updates.newer.onlyOwners": "Only the site's owners can install a newer release.";
|
|
547
|
+
readonly "updates.automatic.label": "Install fixes automatically each night";
|
|
548
|
+
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.";
|
|
549
|
+
readonly "updates.automatic.onlyOwners": "Only the site's owners can change this.";
|
|
550
|
+
readonly "updates.automatic.turnOff": "Turn off automatic fixes";
|
|
551
|
+
readonly "updates.automatic.turnOn": "Turn on automatic fixes";
|
|
552
|
+
readonly "updates.back.title": "Something stopped working?";
|
|
553
|
+
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.";
|
|
554
|
+
readonly "updates.back.button": "Go back to {version}";
|
|
555
|
+
readonly "updates.back.confirm": "Go back to Goodfellow {version}? It takes a few minutes.";
|
|
556
|
+
readonly "updates.skipped.title": "Releases that won't be installed";
|
|
557
|
+
readonly "updates.skipped.body": "The site went back from these releases, so updates don't install them.";
|
|
558
|
+
readonly "updates.skipped.allow": "Allow {version} again";
|
|
559
|
+
readonly "updates.skipped.allowMessage": "Allow Goodfellow {version} again";
|
|
560
|
+
readonly "updates.started": "The update has started. It takes a few minutes, and this page shows how it went.";
|
|
561
|
+
readonly "updates.last.title": "Last update";
|
|
562
|
+
readonly "updates.last.none": "No update has run yet.";
|
|
563
|
+
readonly "updates.last.running": "An update is running now. It takes a few minutes.";
|
|
564
|
+
readonly "updates.last.updated": "On {date}, Goodfellow {version} was installed.";
|
|
565
|
+
readonly "updates.last.updatedSome": "On {date}, an update was installed.";
|
|
566
|
+
readonly "updates.last.wentBack": "On {date}, the site went back to Goodfellow {version}.";
|
|
567
|
+
readonly "updates.last.paused": "On {date}, automatic fixes were turned off, so nothing was installed.";
|
|
568
|
+
readonly "updates.last.upToDate": "On {date}, there was nothing new to install.";
|
|
569
|
+
readonly "updates.last.failed": "On {date}, the update didn't work, so nothing changed and the site stayed as it was.";
|
|
570
|
+
readonly "updates.last.unknown": "An update ran on {date}.";
|
|
571
|
+
readonly "updates.last.details": "See the details on {host}";
|
|
572
|
+
readonly "updates.failed.build": "The site didn't build with Goodfellow {version}; a developer may need to look at the details.";
|
|
573
|
+
readonly "updates.failed.install": "Its packages couldn't be installed. The next night tries again.";
|
|
574
|
+
readonly "updates.failed.blocks": "One of the site's blocks couldn't be updated.";
|
|
575
|
+
readonly "updates.failed.publish": "Someone published at the same time. The next night tries again.";
|
|
576
|
+
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:";
|
|
577
|
+
readonly "updates.error.load": "The updates couldn't be checked. Check your connection and try again.";
|
|
578
|
+
readonly "updates.error.not-allowed": "Your account can't do that on {host}. Ask one of the site's owners.";
|
|
579
|
+
readonly "updates.error.missing": "This site's build setup doesn't install updates, so there's nothing to run.";
|
|
580
|
+
readonly "updates.error.save": "The change couldn't be saved. Try again in a moment.";
|
|
581
|
+
readonly "updates.error.other": "Something went wrong. Try again in a moment.";
|
|
582
|
+
readonly "editors.intro": "The people who can edit this site.";
|
|
583
|
+
readonly "editors.roles": "Editors can change and publish everything in the admin panel. Owners can also invite and remove editors, and connect a domain.";
|
|
584
|
+
readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub or GitLab.";
|
|
585
|
+
readonly "editors.demo": "Editors can't be invited in a demo.";
|
|
586
|
+
readonly "editors.loading": "Loading editors…";
|
|
587
|
+
readonly "editors.onlyOwners": "Only the site's owners can invite and remove editors.";
|
|
588
|
+
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.";
|
|
589
|
+
readonly "editors.letPublish": "Let editors publish";
|
|
590
|
+
readonly "editors.person": "Person";
|
|
591
|
+
readonly "editors.role": "Can";
|
|
592
|
+
readonly "editors.roleFor": "What {name} can do";
|
|
593
|
+
readonly "editors.actions": "Actions";
|
|
594
|
+
readonly "editors.role.owner": "Owner";
|
|
595
|
+
readonly "editors.role.editor": "Editor";
|
|
596
|
+
readonly "editors.role.viewer": "Can't publish";
|
|
597
|
+
readonly "editors.you": "You";
|
|
598
|
+
readonly "editors.invited": "Invited, hasn't accepted yet";
|
|
599
|
+
readonly "editors.inherited": "Through a group on {host}";
|
|
600
|
+
readonly "editors.remove": "Remove";
|
|
601
|
+
readonly "editors.withdraw": "Withdraw invitation";
|
|
602
|
+
readonly "editors.removeTitle": "Remove {name}?";
|
|
603
|
+
readonly "editors.removeBody": "They won't be able to edit the site any more. Their account on {host} stays as it is.";
|
|
604
|
+
readonly "editors.withdrawTitle": "Withdraw the invitation to {name}?";
|
|
605
|
+
readonly "editors.withdrawBody": "The invitation stops working. You can invite them again later.";
|
|
606
|
+
readonly "editors.invite.title": "Invite someone";
|
|
607
|
+
readonly "editors.invite.field": "Their {host} username";
|
|
608
|
+
readonly "editors.invite.hint": "They need a {host} account. {host} emails them an invitation, which they accept before they can sign in here.";
|
|
609
|
+
readonly "editors.invite.fieldEmail": "Their email address or {host} username";
|
|
610
|
+
readonly "editors.invite.hintEmail": "With an email address, {host} emails them an invitation, and they make an account if they don't have one.";
|
|
611
|
+
readonly "editors.invite.submit": "Invite";
|
|
612
|
+
readonly "editors.error.load": "The editors couldn't be loaded. Check your connection and try again.";
|
|
613
|
+
readonly "editors.error.not-allowed": "You can't change who edits the site.";
|
|
614
|
+
readonly "editors.error.not-found": "There's no {host} account with that name. Check the spelling.";
|
|
615
|
+
readonly "editors.error.invalid": "That isn't a username or email address that {host} accepts.";
|
|
616
|
+
readonly "editors.error.already": "They already edit the site, or have been invited.";
|
|
617
|
+
readonly "editors.error.other": "Something went wrong. Try again in a moment.";
|
|
347
618
|
readonly "general.siteTitle": "Site name";
|
|
348
619
|
readonly "general.description": "Description";
|
|
349
620
|
readonly "general.descriptionHint": "Shown by search engines when a page doesn't have its own description.";
|
|
350
621
|
readonly "general.url": "Site address";
|
|
351
622
|
readonly "general.urlHint": "The full public address, such as https://example.org. Used for search engines and link previews.";
|
|
623
|
+
readonly "general.externalLinksInNewTab": "Open links to other sites in a new tab";
|
|
624
|
+
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
625
|
readonly "general.language": "Language code";
|
|
353
626
|
readonly "general.languageHint": "Such as en, es or fr.";
|
|
627
|
+
readonly "general.timeZone": "Time zone";
|
|
628
|
+
readonly "general.timeZoneHint": "The time zone events' times are in. Calendars show them in it, and visitors' calendars move them to their own.";
|
|
629
|
+
readonly "general.timeZoneNone": "Not set: times are shown as they're written";
|
|
630
|
+
readonly "general.timeZoneUseMine": "Use {zone}";
|
|
354
631
|
readonly "general.titleTemplate": "Browser tab title";
|
|
355
632
|
readonly "general.titleTemplateHint": '%s is replaced by the page title, so "%s | My site" shows "About | My site".';
|
|
356
633
|
readonly "general.favicon": "Browser tab icon";
|
|
357
634
|
readonly "general.logo": "Logo";
|
|
358
635
|
readonly "general.logoAlt": "Logo description";
|
|
636
|
+
readonly "general.logoDark": "Logo in dark mode";
|
|
637
|
+
readonly "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.";
|
|
359
638
|
readonly "general.socialImage": "Image when shared on social media";
|
|
360
639
|
readonly "general.contact": "Contact details";
|
|
361
640
|
readonly "general.contactHint": "Shown wherever a Contact details block is placed, such as the footer.";
|
|
362
641
|
readonly "general.address": "Address";
|
|
363
642
|
readonly "general.phone": "Phone";
|
|
364
643
|
readonly "general.email": "Email";
|
|
644
|
+
readonly "forms.title": "Forms";
|
|
645
|
+
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.";
|
|
646
|
+
readonly "forms.service": "Form service";
|
|
647
|
+
readonly "forms.service.web3forms": "Web3Forms: free for 250 answers a month, with no account";
|
|
648
|
+
readonly "forms.service.formspree": "Formspree";
|
|
649
|
+
readonly "forms.service.other": "Another service";
|
|
650
|
+
readonly "forms.accessKey": "Web3Forms access key";
|
|
651
|
+
readonly "forms.accessKeyHint": "On Web3Forms' site, enter the email address answers should go to. Web3Forms emails you a key: paste it here.";
|
|
652
|
+
readonly "forms.accessKeyLink": "Get an access key from Web3Forms";
|
|
653
|
+
readonly "forms.captcha": "Ask visitors to show they aren't robots (hCaptcha)";
|
|
654
|
+
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.";
|
|
655
|
+
readonly "forms.formspree": "Formspree form address";
|
|
656
|
+
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.";
|
|
657
|
+
readonly "forms.address": "Address forms send answers to";
|
|
658
|
+
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.";
|
|
659
|
+
readonly "forms.error.key": "This isn't a Web3Forms access key. Copy it from Web3Forms' email: it looks like 0b5c4f7e-1a2b-4c3d-8e9f-0123456789ab.";
|
|
660
|
+
readonly "forms.error.formspree": "This isn't a Formspree form's address. It looks like https://formspree.io/f/xyzabcde.";
|
|
661
|
+
readonly "forms.error.address": "The address must be a full address starting with https://.";
|
|
365
662
|
readonly "theme.colors": "Colors";
|
|
366
663
|
readonly "theme.fonts": "Fonts";
|
|
367
664
|
readonly "theme.fontsHint": "Choose from Google Fonts. Site default uses each visitor's standard font.";
|
|
@@ -392,7 +689,20 @@ export declare const defaultStrings: {
|
|
|
392
689
|
readonly "theme.color.accentForeground": "Text on highlight";
|
|
393
690
|
readonly "theme.color.border": "Borders";
|
|
394
691
|
readonly "theme.default": "Default";
|
|
692
|
+
readonly "theme.darkMode": "Dark mode";
|
|
693
|
+
readonly "theme.darkModeOn": "Follow each visitor's light or dark setting";
|
|
694
|
+
readonly "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.";
|
|
695
|
+
readonly "theme.darkColors": "Colors in dark mode";
|
|
696
|
+
readonly "theme.preview": "Preview";
|
|
697
|
+
readonly "theme.previewLight": "Light";
|
|
698
|
+
readonly "theme.previewDark": "Dark";
|
|
395
699
|
readonly "theme.pickColor": "Choose a color for {name}";
|
|
700
|
+
readonly "theme.code": "Code colors";
|
|
701
|
+
readonly "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.";
|
|
702
|
+
readonly "theme.codeLight": "Light colors";
|
|
703
|
+
readonly "theme.codeDark": "Dark colors";
|
|
704
|
+
readonly "theme.codeBackground": "Show code on the subtle background color";
|
|
705
|
+
readonly "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.";
|
|
396
706
|
readonly "menus.intro": "Menus are lists of links. Show one anywhere with the Menu block, using its name.";
|
|
397
707
|
readonly "menus.empty": "There are no menus yet.";
|
|
398
708
|
readonly "menus.add": "Add menu";
|
|
@@ -407,6 +717,24 @@ export declare const defaultStrings: {
|
|
|
407
717
|
readonly "menus.moveDown": "Move down";
|
|
408
718
|
readonly "menus.remove": "Remove";
|
|
409
719
|
readonly "menus.newLink": "New link";
|
|
720
|
+
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.";
|
|
721
|
+
readonly "redirects.empty": "There are no redirects yet.";
|
|
722
|
+
readonly "redirects.from": "Old address";
|
|
723
|
+
readonly "redirects.to": "Send visitors to";
|
|
724
|
+
readonly "redirects.add": "Add redirect";
|
|
725
|
+
readonly "redirects.remove": "Remove";
|
|
726
|
+
readonly "redirects.message": "Message while visitors are sent on";
|
|
727
|
+
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.";
|
|
728
|
+
readonly "redirects.unused": "A page has this address, so visitors see the page instead. Remove the redirect, or move the page.";
|
|
729
|
+
readonly "redirects.problem.noFrom": "Add the old address, such as /about-us.";
|
|
730
|
+
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.";
|
|
731
|
+
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 ?.";
|
|
732
|
+
readonly "redirects.problem.home": "The home page can't be redirected.";
|
|
733
|
+
readonly "redirects.problem.reserved": "This address is used by the site itself, so it can't be redirected.";
|
|
734
|
+
readonly "redirects.problem.noTo": "Add where to send visitors, such as /about.";
|
|
735
|
+
readonly "redirects.problem.badTo": "Send visitors to a page on this site, starting with /, or to another website's address, starting with https://.";
|
|
736
|
+
readonly "redirects.problem.loop": "This sends visitors back to the same address.";
|
|
737
|
+
readonly "redirects.problem.duplicate": "Another redirect is from the same address. Remove one of them.";
|
|
410
738
|
readonly "css.intro": "CSS here applies to every page and overrides the blocks' own styles. Tailwind's @apply works too.";
|
|
411
739
|
readonly "css.label": "Custom CSS";
|
|
412
740
|
readonly "code.editorHint": "Tab indents, and suggestions appear as you type. Press Escape, then Tab, to leave the editor. Ctrl+F finds and replaces.";
|