@goodfellow-cms/admin 0.4.0 → 0.6.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.d.ts +4 -2
- package/dist/dev.js +21 -1
- package/dist/editor.d.ts +18 -0
- package/dist/editor.js +1985 -0
- package/dist/entry-values-BrY3L0Ai.js +5082 -0
- package/dist/index.d.ts +680 -27
- package/dist/index.js +8095 -6056
- package/dist/plugin-protocol-DkvBDqsF.js +119 -0
- package/dist/plugin.d.ts +5 -0
- package/dist/plugin.js +153 -0
- package/package.json +19 -8
- package/plugin.css +215 -0
- package/styles.css +646 -7
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
import { ContentStore, GitHost,
|
|
1
|
+
import { AdminSite, ContentStore, GitHost, PluginTasks, SignInError } from "@goodfellow-cms/core";
|
|
2
2
|
import "react";
|
|
3
|
+
import "@goodfellow-cms/react";
|
|
3
4
|
import "@puckeditor/core";
|
|
4
|
-
//#region src/admin-context.d.ts
|
|
5
|
-
/** How previews load the site's styles. Provided by the dev server or build that serves the admin panel. */
|
|
6
|
-
interface PreviewOptions {
|
|
7
|
-
/** The site's compiled stylesheets. */
|
|
8
|
-
stylesheets: string[];
|
|
9
|
-
/** `@goodfellow-cms/react/theme.css`, so Tailwind in the preview knows the theme's classes. */
|
|
10
|
-
themeCss: string;
|
|
11
|
-
/** URL of `@tailwindcss/browser`, which styles classes typed in the editor before the site is rebuilt. */
|
|
12
|
-
tailwindBrowserUrl?: string;
|
|
13
|
-
}
|
|
14
|
-
//#endregion
|
|
15
5
|
//#region src/strings.d.ts
|
|
16
6
|
/**
|
|
17
7
|
* Every piece of text the admin panel shows, so it can be reworded or
|
|
@@ -38,6 +28,7 @@ export declare const defaultStrings: {
|
|
|
38
28
|
readonly "signIn.token.create": "Create a token on {host}";
|
|
39
29
|
readonly "signIn.token.createBroad": "Create a broader token instead";
|
|
40
30
|
readonly "signIn.token.createBroadHint": "Use this if the site belongs to someone else and the first link doesn't let you choose it. This kind of token can change everything your account can.";
|
|
31
|
+
readonly "signIn.token.apiTokenHint": "Use this if you can't create a token for the site itself. Paste your Atlassian account's email address, a colon, then the token, such as name@example.org:ATATT3x…, and give the token permission to read and write repositories, pull requests and pipelines.";
|
|
41
32
|
readonly "signIn.token.chooseSite": "If {host} asks what the token can access, choose this site.";
|
|
42
33
|
readonly "signIn.token.step2": "Copy the token and paste it here:";
|
|
43
34
|
readonly "signIn.token.label": "Access token";
|
|
@@ -87,6 +78,9 @@ export declare const defaultStrings: {
|
|
|
87
78
|
readonly "build.unknown": "{host} didn't say why the rebuild failed. Its details may help a developer.";
|
|
88
79
|
readonly "build.hostDetails": "See the details on {host}";
|
|
89
80
|
readonly "loadError.title": "The admin panel couldn't open this site";
|
|
81
|
+
readonly "outdatedAdminPage.title": "This site's admin page needs updating";
|
|
82
|
+
readonly "outdatedAdminPage.message": "This site's admin page is from before the editor kept blocks away from your sign-in, so the admin panel doesn't open on it. Goodfellow's next update changes it, unless someone has changed the page. Whoever looks after the site's code can also change it now: the details say how.";
|
|
83
|
+
readonly "outdatedAdminPage.details": "Run npx goodfellow-next update, or replace these files with the Next.js starter's, as they are below. The site's blocks then run in the editor's sandboxed frames, at /admin/editor/.";
|
|
90
84
|
readonly "loadError.contentProblems": "Some of the site's files have problems, so they can't be edited until they're fixed.";
|
|
91
85
|
readonly "loadError.other": "Something went wrong while loading the site. Check your connection and try again.";
|
|
92
86
|
readonly "action.tryAgain": "Try again";
|
|
@@ -99,11 +93,87 @@ export declare const defaultStrings: {
|
|
|
99
93
|
readonly "action.redoHint": "Redo what you undid (Ctrl+Shift+Z, or ⇧⌘Z on a Mac)";
|
|
100
94
|
readonly "details.show": "Details";
|
|
101
95
|
readonly "publish.button": "Publish";
|
|
96
|
+
readonly "editor.leftSidebar": "Show or hide blocks and outline";
|
|
97
|
+
readonly "editor.rightSidebar": "Show or hide settings";
|
|
98
|
+
readonly "editor.viewport": "Preview width";
|
|
99
|
+
readonly "editor.viewport.full": "Full width";
|
|
100
|
+
readonly "editor.viewport.tablet": "Tablet";
|
|
101
|
+
readonly "editor.viewport.phone": "Phone";
|
|
102
|
+
readonly "editor.failed": "The editor stopped working. Reload the page to start it again.";
|
|
103
|
+
readonly "editor.frame": "Editing {title}";
|
|
104
|
+
readonly "editor.choose": "Editor";
|
|
105
|
+
readonly "editor.standard": "Standard editor";
|
|
106
|
+
readonly "editor.plugin.failed": "{editor} didn't start. Choose the standard editor to keep editing.";
|
|
107
|
+
readonly "editor.plugin.invalid": "{editor} gave back something this site can't publish, so nothing was published. Try again, or choose the standard editor.";
|
|
102
108
|
readonly "publish.publishing": "Publishing…";
|
|
103
109
|
readonly "publish.done": "Published.";
|
|
104
110
|
readonly "publish.conflict": "Someone else changed the site since you opened this page, so your changes weren't published. Reload to see their changes, then make yours again.";
|
|
105
111
|
readonly "publish.error": "Your changes couldn't be published. Check your connection and try again.";
|
|
106
112
|
readonly "publish.invalid": "Fix the highlighted problems before publishing.";
|
|
113
|
+
readonly "draft.label": "Draft";
|
|
114
|
+
readonly "draft.add": "Add to draft";
|
|
115
|
+
readonly "draft.addHint": "Keep this change with others to publish together later, instead of publishing it now";
|
|
116
|
+
readonly "draft.adding": "Adding to the draft…";
|
|
117
|
+
readonly "draft.added": "Added to the draft.";
|
|
118
|
+
readonly "draft.banner": "You're working in a draft started {date}. What you change goes into it, and visitors see it when it's published.";
|
|
119
|
+
readonly "draft.bannerKept": "You're working in a draft started {date}, kept in this browser. What you change goes into it, and visitors see it when it's published.";
|
|
120
|
+
readonly "draft.changes": "{count} files changed";
|
|
121
|
+
readonly "draft.oneChange": "1 file changed";
|
|
122
|
+
readonly "draft.publishAll": "Publish all";
|
|
123
|
+
readonly "draft.publishing": "Publishing the draft…";
|
|
124
|
+
readonly "draft.published": "The draft is published.";
|
|
125
|
+
readonly "draft.submit": "Submit for review";
|
|
126
|
+
readonly "draft.submitted": "Submitted for review.";
|
|
127
|
+
readonly "draft.seeReview": "See it";
|
|
128
|
+
readonly "draft.discard": "Throw away";
|
|
129
|
+
readonly "draft.discardTitle": "Throw away this draft?";
|
|
130
|
+
readonly "draft.discardBody": "Everything in it will be lost. The live site stays as it is.";
|
|
131
|
+
readonly "draft.leave": "Back to the live site";
|
|
132
|
+
readonly "draft.waiting": "A draft started {date} is waiting to be published.";
|
|
133
|
+
readonly "draft.waitingMany": "{count} drafts are waiting to be published.";
|
|
134
|
+
readonly "draft.choose": "Draft to open";
|
|
135
|
+
readonly "draft.started": "Started {date}";
|
|
136
|
+
readonly "draft.open": "Open";
|
|
137
|
+
readonly "draft.gone": "That draft has been published or thrown away.";
|
|
138
|
+
readonly "draft.conflict": "Someone else has published changes to some of the same pages or settings since this draft started, so it can't be published as it is. Submit it for review, or throw it away and make the changes again.";
|
|
139
|
+
readonly "draft.conflictKept": "Someone else has published changes to some of the same pages or settings since this draft started, so it can't be published as it is. Throw it away and make the changes again.";
|
|
140
|
+
readonly "draft.error": "The draft couldn't be published. Check your connection and try again.";
|
|
141
|
+
readonly "draft.submitError": "The draft couldn't be submitted for review. Check your connection and try again.";
|
|
142
|
+
readonly "draft.discardError": "The draft couldn't be thrown away. Check your connection and try again.";
|
|
143
|
+
readonly "draft.message": "Publish the draft {name}";
|
|
144
|
+
readonly "draft.reviewTitle": "Draft {name}, from the admin panel";
|
|
145
|
+
readonly "draft.reviewDescription": "Changes made in the admin panel:";
|
|
146
|
+
readonly "checks.blocked.title": "This can't be published yet";
|
|
147
|
+
readonly "checks.blocked.intro": "Publishing this would leave links that go nowhere. Change or remove them first.";
|
|
148
|
+
readonly "checks.warnings.title": "Publish anyway?";
|
|
149
|
+
readonly "checks.warnings.intro": "A few things could be better. You can publish anyway, or go back and fix them first.";
|
|
150
|
+
readonly "checks.alsoWarnings": "These could be better too:";
|
|
151
|
+
readonly "checks.publishAnyway": "Publish anyway";
|
|
152
|
+
readonly "checks.goBack": "Go back";
|
|
153
|
+
readonly "checks.missing-page": "{place} links to {target}, which isn't a page on the site.";
|
|
154
|
+
readonly "checks.missing-media": "{place} uses {target}, which isn't in the media library.";
|
|
155
|
+
readonly "checks.no-title": "{place} has no title, so browser tabs and search results show only the site's name.";
|
|
156
|
+
readonly "checks.missing-translation": "{place} has no translation in {language} yet. Visitors reading in {language} are sent to its home page instead.";
|
|
157
|
+
readonly "checks.outdated-translation": "{place} has changed since its translation in {language} was made. Update the translation, then mark it as up to date.";
|
|
158
|
+
readonly "checks.bad-translation": "{place} says it's a translation of {target}, but only pages and items in the site's main language have translations.";
|
|
159
|
+
readonly "checks.no-description": "{place} has no description for search results and link previews to show.";
|
|
160
|
+
readonly "checks.low-contrast": 'Text in "{text}" is hard to read on "{background}": its contrast is {ratio} to 1, and text needs at least 4.5 to 1.';
|
|
161
|
+
readonly "checks.low-contrast.dark": 'In dark mode, text in "{text}" is hard to read on "{background}": its contrast is {ratio} to 1, and text needs at least 4.5 to 1.';
|
|
162
|
+
readonly "checks.no-alt": "{place} has an image, {image}, with no description for people who can't see it. Describe it in the image's settings, or say it's only decoration.";
|
|
163
|
+
readonly "checks.skipped-heading": "{place} has the heading \"{text}\" at level {level}, after one at level {previous}. Headings shouldn't skip a level, or people who move through a page by its headings think they've missed something.";
|
|
164
|
+
readonly "checks.skipped-heading.first": '{place} starts with the heading "{text}", at level {level}. Start with the page\'s title (level 1) or a section (level 2).';
|
|
165
|
+
readonly "checks.vague-link": '{place} has a link, "{text}", that doesn\'t say where it goes. Say what people will find there, such as "Our Mass times" rather than "Click here".';
|
|
166
|
+
readonly "checks.empty-link": "{place} has a link to {target} with no text, so people who can't see the page don't know where it goes.";
|
|
167
|
+
readonly "checks.accessibility": "{place}: {help}";
|
|
168
|
+
readonly "checks.place.page": 'The page "{title}"';
|
|
169
|
+
readonly "checks.place.entry": '"{title}" in {collection}';
|
|
170
|
+
readonly "checks.place.design": "The design of {collection}";
|
|
171
|
+
readonly "checks.place.header": "The header";
|
|
172
|
+
readonly "checks.place.footer": "The footer";
|
|
173
|
+
readonly "checks.place.menus": "A menu";
|
|
174
|
+
readonly "checks.place.settings": "Site Settings";
|
|
175
|
+
readonly "checks.place.redirects": "A redirect";
|
|
176
|
+
readonly "checks.place.file": "{file}";
|
|
107
177
|
readonly "unsaved.confirm": "You have changes that aren't published yet. Leave anyway and lose them?";
|
|
108
178
|
readonly "unsaved.label": "Unpublished changes";
|
|
109
179
|
readonly "pages.title": "Pages";
|
|
@@ -113,25 +183,62 @@ export declare const defaultStrings: {
|
|
|
113
183
|
readonly "pages.column.address": "Address";
|
|
114
184
|
readonly "pages.edit": "Edit";
|
|
115
185
|
readonly "pages.move": "Change address";
|
|
186
|
+
readonly "pages.duplicate": "Duplicate";
|
|
116
187
|
readonly "pages.delete": "Delete";
|
|
117
188
|
readonly "pages.view": "View";
|
|
118
189
|
readonly "pages.homeCantDelete": "The home page can't be deleted.";
|
|
190
|
+
readonly "pages.schedule": "Schedule";
|
|
191
|
+
readonly "sharePreview.title": "When a link to this page is shared";
|
|
192
|
+
readonly "sharePreview.noImage": "No image";
|
|
193
|
+
readonly "sharePreview.noAddress": "Link previews show the image once the site's address is set in Site Settings, since they need its full address.";
|
|
194
|
+
readonly "sharePreview.hidden": "This page is hidden from search engines, so it isn't in search results or the sitemap.";
|
|
195
|
+
readonly "schedulePage.title": "When “{title}” is on the site";
|
|
196
|
+
readonly "schedulePage.submit": "Publish";
|
|
197
|
+
readonly "schedulePage.message": 'Schedule page "{title}"';
|
|
198
|
+
readonly "schedule.title": "When it's on the site";
|
|
199
|
+
readonly "schedule.showFrom": "Show from";
|
|
200
|
+
readonly "schedule.showFromHint": "Leave empty to show it as soon as it's published.";
|
|
201
|
+
readonly "schedule.hideAfter": "Hide after";
|
|
202
|
+
readonly "schedule.hideAfterHint": "Leave empty to keep it on the site.";
|
|
203
|
+
readonly "schedule.zone": "Times are in the site's time zone, {zone}.";
|
|
204
|
+
readonly "schedule.zoneNew": "Times are in your computer's time zone, {zone}, which becomes the site's time zone.";
|
|
205
|
+
readonly "schedule.zoneNone": "Times are in UTC, since the site has no time zone. Choose one in Site Settings.";
|
|
206
|
+
readonly "schedule.invalid": "Enter a date and a time.";
|
|
207
|
+
readonly "schedule.order": "Choose a time after the one it's shown from.";
|
|
208
|
+
readonly "schedule.timing.exact": "The site is rebuilt at each of these times, so changes go live then.";
|
|
209
|
+
readonly "schedule.timing.hourly": "The site checks each hour for changes that are due, so changes go live within an hour of their time.";
|
|
210
|
+
readonly "schedule.timing.nightly": "The site is rebuilt each night, so changes go live with the first rebuild after their time.";
|
|
211
|
+
readonly "schedule.timing.none": "Changes go live the next time the site is rebuilt after their time, such as when someone publishes.";
|
|
212
|
+
readonly "schedule.timing.notAllowed": "{host} didn't let you have the site rebuilt at these times, so changes go live with the nightly rebuild after their time, or at their time once an owner opens the admin panel.";
|
|
213
|
+
readonly "schedule.public": "Anyone can read what's scheduled before it's shown, since the site's files on {host} are public. Don't schedule anything that must stay secret until then.";
|
|
214
|
+
readonly "schedule.internal": "Anyone signed in to {host} can read what's scheduled before it's shown, since the site's files are visible to all of them. Don't schedule anything that must stay secret until then.";
|
|
215
|
+
readonly "schedule.status.waiting": "Shown from {time}";
|
|
216
|
+
readonly "schedule.status.hides": "Hidden after {time}";
|
|
217
|
+
readonly "schedule.status.hidden": "Hidden since {time}";
|
|
218
|
+
readonly "comingUp.title": "Coming up";
|
|
219
|
+
readonly "comingUp.show": "Shown";
|
|
220
|
+
readonly "comingUp.hide": "Hidden";
|
|
221
|
+
readonly "comingUp.zone": "Times are in the site's time zone, {zone}.";
|
|
119
222
|
readonly "newPage.title": "New page";
|
|
120
223
|
readonly "newPage.pageTitle": "Page title";
|
|
121
224
|
readonly "newPage.address": "Address";
|
|
122
225
|
readonly "newPage.addressHint": "The part of the web address after the site's name, such as /about or /events/picnic.";
|
|
123
226
|
readonly "newPage.create": "Create page";
|
|
124
227
|
readonly "newPage.message": 'Add page "{title}"';
|
|
228
|
+
readonly "duplicatePage.title": 'Duplicate "{title}"';
|
|
229
|
+
readonly "duplicatePage.pageTitle": "{title} (copy)";
|
|
230
|
+
readonly "duplicatePage.create": "Duplicate page";
|
|
231
|
+
readonly "duplicatePage.message": 'Add page "{title}", a copy of "{from}"';
|
|
125
232
|
readonly "movePage.title": "Change the address of {title}";
|
|
126
233
|
readonly "movePage.address": "New address";
|
|
127
|
-
readonly "movePage.
|
|
234
|
+
readonly "movePage.links": "Links to it anywhere on this site, menus included, change to the new address.";
|
|
128
235
|
readonly "movePage.redirect": "Keep {from} working by sending visitors on to the page";
|
|
129
236
|
readonly "movePage.redirectHint": "Links to the old address elsewhere, such as on other websites, keep working. Site Settings → Redirects lists it.";
|
|
130
|
-
readonly "movePage.warning": "Links to the old address
|
|
237
|
+
readonly "movePage.warning": "Links to the old address on other websites will stop working.";
|
|
131
238
|
readonly "movePage.submit": "Change address";
|
|
132
239
|
readonly "movePage.message": 'Move page "{title}" from {from} to {to}';
|
|
133
240
|
readonly "deletePage.title": "Delete {title}?";
|
|
134
|
-
readonly "deletePage.body": "The page at {path} will be removed from the site.
|
|
241
|
+
readonly "deletePage.body": "The page at {path} will be removed from the site. If anything on the site links to it, those links need changing first.";
|
|
135
242
|
readonly "deletePage.submit": "Delete page";
|
|
136
243
|
readonly "deletePage.message": 'Delete page "{title}"';
|
|
137
244
|
readonly "address.invalid": "Use lowercase letters, numbers and hyphens, with / between parts, such as /about-us.";
|
|
@@ -146,7 +253,7 @@ export declare const defaultStrings: {
|
|
|
146
253
|
readonly "versions.back": "Back to editing";
|
|
147
254
|
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.";
|
|
148
255
|
readonly "versions.notFound": "There's no history to show here. It may have been moved or deleted.";
|
|
149
|
-
readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub or
|
|
256
|
+
readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
150
257
|
readonly "versions.demo": "Version history isn't kept in a demo.";
|
|
151
258
|
readonly "versions.loading": "Loading versions…";
|
|
152
259
|
readonly "versions.loadingVersion": "Loading this version…";
|
|
@@ -168,6 +275,8 @@ export declare const defaultStrings: {
|
|
|
168
275
|
readonly "versions.unknownBlocks": "This version can't be restored, because it uses blocks the site doesn't have any more: {blocks}.";
|
|
169
276
|
readonly "layout.header": "Header";
|
|
170
277
|
readonly "layout.footer": "Footer";
|
|
278
|
+
readonly "layout.headerWord": "header";
|
|
279
|
+
readonly "layout.footerWord": "footer";
|
|
171
280
|
readonly "layout.headerMessage": "Update the header";
|
|
172
281
|
readonly "layout.footerMessage": "Update the footer";
|
|
173
282
|
readonly "collections.title": "Collections";
|
|
@@ -215,9 +324,10 @@ export declare const defaultStrings: {
|
|
|
215
324
|
readonly "entryName.taken": "Something else on the site already uses this address.";
|
|
216
325
|
readonly "moveEntry.message": 'Move {entry} "{title}" from {from} to {to}';
|
|
217
326
|
readonly "deleteEntry.body": "{title} will be removed from {name}.";
|
|
218
|
-
readonly "deleteEntry.bodyPage": "{title} will be removed from {name}, and its page at {path} from the site.
|
|
327
|
+
readonly "deleteEntry.bodyPage": "{title} will be removed from {name}, and its page at {path} from the site. If anything on the site links to it, those links need changing first.";
|
|
219
328
|
readonly "deleteEntry.message": 'Delete {entry} "{title}"';
|
|
220
329
|
readonly "editEntry.message": 'Update {entry} "{title}"';
|
|
330
|
+
readonly "editEntry.invalidSchedule": "Check when it's on the site: each time needs a date and a time, and it can only be hidden after it's shown.";
|
|
221
331
|
readonly "editEntry.notFound": "This item doesn't exist. It may have been renamed or deleted.";
|
|
222
332
|
readonly "editEntry.back": "Back to {name}";
|
|
223
333
|
readonly "editEntry.required": "Fill in {fields} before publishing.";
|
|
@@ -271,7 +381,7 @@ export declare const defaultStrings: {
|
|
|
271
381
|
readonly "collectionSettings.general": "General";
|
|
272
382
|
readonly "collectionSettings.path": "Address of each item's page";
|
|
273
383
|
readonly "collectionSettings.pathHint": "{slug} stands for each item's own address, as in /videos/{slug}.";
|
|
274
|
-
readonly "collectionSettings.pathWarning": "Changing this changes the address of every item's page. Links to the old addresses
|
|
384
|
+
readonly "collectionSettings.pathWarning": "Changing this changes the address of every item's page, and links to them on this site change with it. Links to the old addresses on other websites will stop working.";
|
|
275
385
|
readonly "collectionSettings.sortField": "Order items by";
|
|
276
386
|
readonly "collectionSettings.sortOrder": "Direction";
|
|
277
387
|
readonly "collectionSettings.ascending": "A to Z, oldest or smallest first";
|
|
@@ -320,6 +430,7 @@ export declare const defaultStrings: {
|
|
|
320
430
|
readonly "markdown.sourceOnly": "This text uses things the formatted view can't show, such as tables or pictures, so it can only be edited as Markdown.";
|
|
321
431
|
readonly "blocks.title": "Blocks";
|
|
322
432
|
readonly "blocks.intro": "Add blocks to the editor, or remove ones you don't use. A change shows in the editor once the site has been updated, usually within a few minutes.";
|
|
433
|
+
readonly "blocks.otherRegistries": "Blocks from other registries can be added once the admin panel has an address of its own, where the site's pages can't reach it (Site Settings → Domain).";
|
|
323
434
|
readonly "blocks.installed": "Added to this site";
|
|
324
435
|
readonly "blocks.noneInstalled": "No blocks have been added yet. The editor offers the built-in ones.";
|
|
325
436
|
readonly "blocks.loading": "Loading the blocks you can add…";
|
|
@@ -361,6 +472,8 @@ export declare const defaultStrings: {
|
|
|
361
472
|
readonly "blocks.error.not-installed": "{name} hasn't been added, so there's nothing to remove.";
|
|
362
473
|
readonly "blocks.error.in-use": "{name} is still used on the site. Take it out first, then remove it.";
|
|
363
474
|
readonly "media.title": "Media";
|
|
475
|
+
readonly "media.cloudflareVideo": "This site is published with Cloudflare Pages, whose terms limit serving video and other large files on its free plans without one of its paid services. To be safe, put videos on YouTube or Vimeo and show them with the Video block, which plays them from there.";
|
|
476
|
+
readonly "media.cloudflareVideoTerms": "Cloudflare's terms";
|
|
364
477
|
readonly "media.intro": "Images and files for the site. Upload them here, or while editing a page. Large photos are made smaller, and details hidden in photos, such as where they were taken, are removed.";
|
|
365
478
|
readonly "media.upload": "Upload files";
|
|
366
479
|
readonly "media.uploading": "Uploading…";
|
|
@@ -378,20 +491,57 @@ export declare const defaultStrings: {
|
|
|
378
491
|
readonly "media.deleteMessage": "Delete {name}";
|
|
379
492
|
readonly "media.deleteTitle": "Delete {name}?";
|
|
380
493
|
readonly "media.deleteBody": "{name} will be removed from the site.";
|
|
381
|
-
readonly "media.deleteUsed": "It's used in: {places}.
|
|
494
|
+
readonly "media.deleteUsed": "It's used in: {places}. Choose another file there first, since the site can't be published using a file that's gone.";
|
|
382
495
|
readonly "media.notUsed": "Nothing on the site uses it.";
|
|
383
496
|
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).";
|
|
384
497
|
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.";
|
|
385
498
|
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.";
|
|
386
499
|
readonly "media.choose": "Choose image";
|
|
500
|
+
readonly "media.chooseAudio": "Choose sound file";
|
|
387
501
|
readonly "media.chooseFile": "Choose file";
|
|
388
502
|
readonly "media.chooseVideo": "Choose video";
|
|
389
503
|
readonly "media.pickerTitle": "Choose an image";
|
|
504
|
+
readonly "media.pickerTitleAudio": "Choose a sound file";
|
|
390
505
|
readonly "media.pickerTitleFile": "Choose a file";
|
|
391
506
|
readonly "media.pickerTitleVideo": "Choose a video";
|
|
392
507
|
readonly "media.pickerEmpty": "Nothing has been uploaded yet. Upload a file to use it here.";
|
|
393
508
|
readonly "media.clear": "Remove";
|
|
509
|
+
readonly "table.addRow": "Add a row";
|
|
510
|
+
readonly "table.addColumn": "Add a column";
|
|
511
|
+
readonly "table.removeRow": "Remove this row";
|
|
512
|
+
readonly "table.removeRowNumber": "Remove row {row}";
|
|
513
|
+
readonly "table.removeColumn": "Remove this column";
|
|
514
|
+
readonly "table.removeColumnNumber": "Remove column {column}";
|
|
515
|
+
readonly "table.cell": "Row {row}, column {column}";
|
|
394
516
|
readonly "media.credit": "Credit: {credit}";
|
|
517
|
+
readonly "media.stored": "Kept by {plugin}";
|
|
518
|
+
readonly "media.error.storageSize": "{name} is too large: {plugin} takes files up to {size}.";
|
|
519
|
+
readonly "media.storage.title": "Where media is kept";
|
|
520
|
+
readonly "media.storage.intro": "{plugin} keeps the site's media in its storage, including large files such as long videos. It keeps {count} files now. Pages show them from there, at the same addresses.";
|
|
521
|
+
readonly "media.storage.missing": "{count} files are kept in storage by {plugin}, which the site no longer has. Pages still show them, but new files go into the site's own files.";
|
|
522
|
+
readonly "media.storage.notReady": "{plugin} can't take files yet. {message}";
|
|
523
|
+
readonly "media.storage.unavailable": "{plugin} didn't answer. Reload the admin panel and try again.";
|
|
524
|
+
readonly "media.storage.settings": "Open {plugin}'s settings";
|
|
525
|
+
readonly "media.storage.failed": "{plugin} couldn't keep {name}.";
|
|
526
|
+
readonly "media.storage.uploading": "Uploading to {plugin}… This takes about a minute.";
|
|
527
|
+
readonly "media.storage.wait": "Each group of files takes about a minute.";
|
|
528
|
+
readonly "media.move.button": "Move {count} files to {plugin}";
|
|
529
|
+
readonly "media.move.title": "Move the site's media to {plugin}?";
|
|
530
|
+
readonly "media.move.body": "{plugin} will keep these files, and pages will show them from its storage at the same addresses, so nothing on them changes. They're taken out of the site's own files; Version history keeps them.";
|
|
531
|
+
readonly "media.move.moving": "Moved {done} of {total}…";
|
|
532
|
+
readonly "media.move.busy": "Moving…";
|
|
533
|
+
readonly "media.move.nothing": "No files were moved.";
|
|
534
|
+
readonly "media.move.some": "Moved {count} files to {plugin}, then stopped.";
|
|
535
|
+
readonly "media.move.done": "Moved {count} files to {plugin}.";
|
|
536
|
+
readonly "media.move.message": "Move media to {plugin}";
|
|
537
|
+
readonly "media.back.button": "Move back to the site";
|
|
538
|
+
readonly "media.back.title": "Move the media back from {plugin}?";
|
|
539
|
+
readonly "media.back.body": "The files {plugin} keeps are copied back into the site's own files, at the same addresses, and new files go there too. Each can be up to 25 MB.";
|
|
540
|
+
readonly "media.back.empty": "{plugin} keeps no files now. New files will go into the site's own files.";
|
|
541
|
+
readonly "media.back.large": "These are larger than 25 MB, so {plugin} keeps them: {names}";
|
|
542
|
+
readonly "media.back.failed": "{name} couldn't be copied back from {plugin}'s storage, which may not allow it.";
|
|
543
|
+
readonly "media.back.done": "Moved {count} files back from {plugin}.";
|
|
544
|
+
readonly "media.back.message": "Move media back from {plugin}";
|
|
395
545
|
readonly "ai.label": "AI";
|
|
396
546
|
readonly "ai.title": "Write with AI";
|
|
397
547
|
readonly "ai.mode.add": "Describe what to add to this page, and AI will write it at the end of the page.";
|
|
@@ -410,6 +560,9 @@ export declare const defaultStrings: {
|
|
|
410
560
|
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.";
|
|
411
561
|
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.";
|
|
412
562
|
readonly "ai.photos.error.publish": "The photos found couldn't be added to the media library, so their images are left empty.";
|
|
563
|
+
readonly "ai.translate": "Translate into {language}";
|
|
564
|
+
readonly "ai.translate.hint": "This page is in {language}. The AI can translate all of it, blocks and settings, keeping its layout. Anything you write below is passed on too, such as how formal to be.";
|
|
565
|
+
readonly "ai.translate.entryHint": "This item is in {language}. The AI can translate all its fields. Anything you write below is passed on too.";
|
|
413
566
|
readonly "ai.write": "Write it";
|
|
414
567
|
readonly "ai.change": "Change it";
|
|
415
568
|
readonly "ai.fill": "Fill it in";
|
|
@@ -456,11 +609,14 @@ export declare const defaultStrings: {
|
|
|
456
609
|
readonly "appearance.light": "Light";
|
|
457
610
|
readonly "appearance.dark": "Dark";
|
|
458
611
|
readonly "settings.tab.general": "General";
|
|
612
|
+
readonly "settings.tab.languages": "Languages";
|
|
459
613
|
readonly "settings.tab.theme": "Colors & fonts";
|
|
460
614
|
readonly "settings.tab.menus": "Menus";
|
|
461
615
|
readonly "settings.tab.css": "Custom CSS";
|
|
462
616
|
readonly "settings.tab.code": "Code";
|
|
463
617
|
readonly "settings.tab.redirects": "Redirects";
|
|
618
|
+
readonly "settings.sidebar.collapse": "Hide names";
|
|
619
|
+
readonly "settings.sidebar.expand": "Show names";
|
|
464
620
|
readonly "settings.tab.domain": "Domain";
|
|
465
621
|
readonly "settings.message": "Update site settings";
|
|
466
622
|
readonly "settings.preview": "Preview of the home page";
|
|
@@ -469,10 +625,42 @@ export declare const defaultStrings: {
|
|
|
469
625
|
readonly "domain.current": "The site is at {address} now.";
|
|
470
626
|
readonly "domain.connected": "Connected to {domain}.";
|
|
471
627
|
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.";
|
|
472
|
-
readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub or
|
|
628
|
+
readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
629
|
+
readonly "domain.admin.title": "Admin address";
|
|
630
|
+
readonly "domain.admin.intro": "An address of its own for the admin panel, such as admin.example.org, keeps the site's pages from reaching what the admin panel keeps, such as editors' sign-in. Editors then sign in there. Blocks from registries other than Goodfellow's can be added only once the admin panel has one.";
|
|
631
|
+
readonly "domain.admin.unsupported": "{host} serves each site at one address, so the admin panel can't have one of its own here.";
|
|
632
|
+
readonly "domain.admin.contentOnly": "The admin panel's address is named in the site's code, which is kept apart from its content, so a developer finishes setting it up there.";
|
|
633
|
+
readonly "domain.admin.code.unknown": "This sign-in can't read the site's code, so this screen can't tell whether a developer has done that yet.";
|
|
634
|
+
readonly "domain.admin.code.add": "A developer names the address in the site's code, then publishes the code:";
|
|
635
|
+
readonly "domain.admin.code.check": "Once the site has been rebuilt and works at {address}, the developer checks the address. From the next rebuild, the admin panel opens only there:";
|
|
636
|
+
readonly "domain.admin.code.remove": "To stop using it, a developer removes it from the site's code:";
|
|
637
|
+
readonly "domain.admin.noConfig": "The admin panel's address goes in the site's {file}, which doesn't have the usual defineConfig({ for it, so a developer sets it there.";
|
|
638
|
+
readonly "domain.admin.noSiteAddress": "Connect the site's own domain first: the admin address goes beside it.";
|
|
639
|
+
readonly "domain.admin.field": "Admin address";
|
|
640
|
+
readonly "domain.admin.fieldHint": "An address of the site's domain that nothing else uses, such as admin.example.org.";
|
|
641
|
+
readonly "domain.admin.connect": "Give the admin panel this address";
|
|
642
|
+
readonly "domain.admin.elsewhere": "Add this address to the site's project on {host} too, under its custom domains, so it serves the site there as well. The site's build writes {host}'s rules for it.";
|
|
643
|
+
readonly "domain.admin.message": "Give the admin panel its own address, {domain}";
|
|
644
|
+
readonly "domain.admin.connected": "The admin panel's address is {domain}";
|
|
645
|
+
readonly "domain.admin.ready": "The site answers at {address}. Open the admin panel there to start using it.";
|
|
646
|
+
readonly "domain.admin.pending": "Once the site has been rebuilt and works at {address}, open the admin panel there: it checks the address, then you can start using it.";
|
|
647
|
+
readonly "domain.admin.open": "Open the admin panel at {address}";
|
|
648
|
+
readonly "domain.admin.signInAgain": "You'll sign in again there: it's a different address, so it keeps its own sign-in.";
|
|
649
|
+
readonly "domain.admin.checking": "Checking {address}…";
|
|
650
|
+
readonly "domain.admin.check.ok": "The site's pages at this address leave it for the site's own address before running anything.";
|
|
651
|
+
readonly "domain.admin.check.no-guard": "The site's pages at this address don't start with the script that sends them away yet. Wait for the site to be rebuilt, then check again.";
|
|
652
|
+
readonly "domain.admin.check.no-sandbox": "{host} doesn't sandbox the site's pages at this address yet. Wait for the site to be rebuilt, then check again.";
|
|
653
|
+
readonly "domain.admin.check.failed": "The admin panel couldn't check this address. Try again in a moment.";
|
|
654
|
+
readonly "domain.admin.use": "Start using {address}";
|
|
655
|
+
readonly "domain.admin.useMessage": "Open the admin panel only at {domain}";
|
|
656
|
+
readonly "domain.admin.using": "The admin panel's address is {address}. Once the site has been rebuilt, the admin panel opens only there.";
|
|
657
|
+
readonly "domain.admin.stop": "Stop using the admin address";
|
|
658
|
+
readonly "domain.admin.stopMessage": "Stop using {domain} for the admin panel";
|
|
659
|
+
readonly "domain.admin.stopBody": "The admin panel goes back to the site's own address once the site has been rebuilt, and blocks from registries other than Goodfellow's can't be added there.";
|
|
473
660
|
readonly "domain.demo": "Domains can't be connected in a demo.";
|
|
474
661
|
readonly "domain.loading": "Finding where the site is published…";
|
|
475
662
|
readonly "domain.elsewhere": "This site isn't published with {host} Pages, so its domain is connected where it is published.";
|
|
663
|
+
readonly "domain.elsewhere.cloudflare": "On Cloudflare Pages: open the site's project, go to Custom domains and set up the domain. For a domain such as www.example.org, Cloudflare shows a CNAME record to add at your registrar. For example.org itself, the domain has to use Cloudflare's nameservers, which Cloudflare walks you through. Once the site works at its new address, put the address in General → Site address and publish.";
|
|
476
664
|
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.";
|
|
477
665
|
readonly "domain.field": "Domain";
|
|
478
666
|
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.";
|
|
@@ -528,6 +716,75 @@ export declare const defaultStrings: {
|
|
|
528
716
|
readonly "owner.token.create": "Create an owner token on {host}";
|
|
529
717
|
readonly "owner.token.chooseSite": "If {host} asks what the token can access, choose only this site.";
|
|
530
718
|
readonly "owner.token.paste": "Copy the token and paste it here:";
|
|
719
|
+
readonly "settings.tab.security": "Security";
|
|
720
|
+
readonly "security.demo": "A demo has no sign-in to keep safe.";
|
|
721
|
+
readonly "security.local": "The sign-in page is set in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
722
|
+
readonly "security.contentOnly": "The sign-in page is set in the site's code, which is kept apart from its content, so a developer sets it there.";
|
|
723
|
+
readonly "security.broker.title": "Sign-in page";
|
|
724
|
+
readonly "security.broker.intro": "A sign-in page of its own, called a token broker, keeps editors' sign-in and AI keys at an address that holds nothing else, and shows the admin panel from there, so nothing on the site's pages can reach them. It asks the editor before publishing the site's code. It needs an address of its own, such as signin.example.org, that serves nothing else.";
|
|
725
|
+
readonly "security.broker.useTitle": "Sign in at a sign-in page that's online";
|
|
726
|
+
readonly "security.add.title": "Add a token broker";
|
|
727
|
+
readonly "security.add.intro": "Makes a project on {host} for the sign-in page, from Goodfellow's released files and a file naming this site, and puts it online where you choose. It needs a token that can create projects, used only now and kept only until you leave this screen.";
|
|
728
|
+
readonly "security.add.place": "Where to put it online";
|
|
729
|
+
readonly "security.add.place.gitlab-pages": "GitLab Pages, at an address GitLab gives it";
|
|
730
|
+
readonly "security.add.place.gitlab-domain": "GitLab Pages, at a domain of yours";
|
|
731
|
+
readonly "security.add.place.github-domain": "GitHub Pages, at a domain of yours";
|
|
732
|
+
readonly "security.add.place.cloudflare-pages": "Cloudflare Pages";
|
|
733
|
+
readonly "security.add.place.vercel": "Vercel";
|
|
734
|
+
readonly "security.add.placeHint.gitlab-pages": "GitLab gives the project an address of its own, which nothing else shares. You'll find it under Deploy → Pages once it's online. No domain needed.";
|
|
735
|
+
readonly "security.add.placeHint.gitlab-domain": "A domain, or part of one, such as signin.example.org, that you point at GitLab Pages as its settings say.";
|
|
736
|
+
readonly "security.add.placeHint.github-domain": "GitHub Pages' own addresses are shared by every site in the same account, so the sign-in page needs a domain, or part of one, such as signin.example.org, which you point at GitHub Pages as its settings say.";
|
|
737
|
+
readonly "security.add.placeHint.cloudflare-pages": "Free, with an address of its own. Once the project is made, connect it to a Cloudflare Pages project, as its README says.";
|
|
738
|
+
readonly "security.add.placeHint.vercel": "Free for non-commercial sites, with an address of its own. Once the project is made, import it as a Vercel project, as its README says.";
|
|
739
|
+
readonly "security.add.domain": "Its domain";
|
|
740
|
+
readonly "security.add.domainHint": "Such as signin.example.org. It serves only the sign-in page.";
|
|
741
|
+
readonly "security.add.problem.domain": "That doesn't look like a domain, such as signin.example.org.";
|
|
742
|
+
readonly "security.add.problem.shared": "github.io and gitlab.io addresses are shared with other sites, so the sign-in page needs a domain of yours.";
|
|
743
|
+
readonly "security.add.problem.site": "That's the site's own address. The sign-in page needs one of its own.";
|
|
744
|
+
readonly "security.add.name": "Its name on {host}";
|
|
745
|
+
readonly "security.add.nameHint": "Made beside the site's on {host}, public, since it holds only Goodfellow's released files.";
|
|
746
|
+
readonly "security.add.token": "A {host} token that can create projects";
|
|
747
|
+
readonly "security.add.tokenHint": "Used only to make the project, and forgotten when you leave this screen.";
|
|
748
|
+
readonly "security.add.create": "Make the sign-in page";
|
|
749
|
+
readonly "security.add.creating": "Making the sign-in page…";
|
|
750
|
+
readonly "security.add.description": "The sign-in page for {site}";
|
|
751
|
+
readonly "security.add.message": "Add the sign-in page";
|
|
752
|
+
readonly "security.add.error.token": "{host} didn't accept that token. Check it's whole, and that it can create projects.";
|
|
753
|
+
readonly "security.add.error.owner": "That token can't create projects anywhere.";
|
|
754
|
+
readonly "security.add.error.taken": "There's already a project with that name. Choose another.";
|
|
755
|
+
readonly "security.add.error.release": "Goodfellow's sign-in page couldn't be downloaded. Try again in a moment.";
|
|
756
|
+
readonly "security.add.error.name-taken": "There's already a project with that name. Choose another.";
|
|
757
|
+
readonly "security.add.error.name-invalid": "{host} can't use that as a project's name.";
|
|
758
|
+
readonly "security.add.error.not-allowed": "That token can't create projects, or write their build setup.";
|
|
759
|
+
readonly "security.add.error.not-installed": "{host} needs the sign-in service's app installed there first.";
|
|
760
|
+
readonly "security.add.error.other": "The sign-in page couldn't be made.";
|
|
761
|
+
readonly "security.added.project": "The sign-in page's project is ready:";
|
|
762
|
+
readonly "security.added.github-pages": "GitHub Pages is putting it online. Point the domain at GitHub Pages as the project's Settings → Pages says, and wait for its certificate.";
|
|
763
|
+
readonly "security.added.gitlab-pages": "GitLab Pages is putting it online. Its address is under Deploy → Pages in the new project once the first build has finished.";
|
|
764
|
+
readonly "security.added.cloudflare-pages": "Now connect it to Cloudflare Pages: create a Pages project from the project, with no build command and site as the output directory.";
|
|
765
|
+
readonly "security.added.vercel": "Now import it as a Vercel project, with site as its root directory and no build command.";
|
|
766
|
+
readonly "security.added.domainUnavailable": "The domain couldn't be set for it, perhaps because another site has it. Set it in the project's Pages settings.";
|
|
767
|
+
readonly "security.added.pagesUnavailable": "Pages couldn't be turned on for it. Turn them on in the project's settings.";
|
|
768
|
+
readonly "security.added.address": "Once it opens at {address}, choose Sign in there from now on below. Editors sign in there once the site has rebuilt.";
|
|
769
|
+
readonly "security.added.then": "Once it's online, type its address below and choose Sign in there from now on. Editors sign in there once the site has rebuilt.";
|
|
770
|
+
readonly "security.broker.field": "The sign-in page's address";
|
|
771
|
+
readonly "security.broker.fieldHint": "An address that serves only the token broker, such as https://broker.example.org.";
|
|
772
|
+
readonly "security.broker.problem.invalid": "That needs to be an https:// address of its own, with nothing after the domain.";
|
|
773
|
+
readonly "security.broker.problem.shared": "github.io addresses are shared with every site in the same account, so the sign-in page needs a domain of its own.";
|
|
774
|
+
readonly "security.broker.problem.same-as-site": "That's the site's own address. The sign-in page needs one of its own.";
|
|
775
|
+
readonly "security.broker.redirect": "Editors sign in by going to {host} and coming back, so add the sign-in page's address to the redirect URIs of the application they sign in with on {host}.";
|
|
776
|
+
readonly "security.broker.use": "Sign in there from now on";
|
|
777
|
+
readonly "security.broker.message": "Sign in at {address}";
|
|
778
|
+
readonly "security.broker.error": "The sign-in page's address couldn't be published.";
|
|
779
|
+
readonly "security.broker.pending": "Once the site has been rebuilt, editors sign in at {address}, and the admin panel opens only there.";
|
|
780
|
+
readonly "security.broker.using": "Editors sign in at {address}, which keeps their sign-in and shows the admin panel.";
|
|
781
|
+
readonly "security.broker.stop": "Stop using the sign-in page";
|
|
782
|
+
readonly "security.broker.stopMessage": "Stop signing in at {address}";
|
|
783
|
+
readonly "security.broker.stopBody": "Once the site has been rebuilt, editors sign in in the admin panel itself again, which keeps their sign-in where the site's pages could reach it, and blocks from registries other than Goodfellow's can't be added there.";
|
|
784
|
+
readonly "broker.elsewhere": "Editors sign in to this site on its own sign-in page, which keeps your sign-in where the site's pages can't reach it, and shows the admin panel from there.";
|
|
785
|
+
readonly "broker.open": "Go to the sign-in page";
|
|
786
|
+
readonly "broker.invalid": "The site's config names a sign-in page whose address isn't one of its own, so the admin panel can't open. Ask the site's developer to fix the broker address in goodfellow.config.tsx.";
|
|
787
|
+
readonly "owner.token.pasteInBroker": "Copy the token, choose Use this token, and paste it where the sign-in page around the admin panel asks for it. It keeps the token, so the admin panel never sees it.";
|
|
531
788
|
readonly "owner.token.label": "Owner token";
|
|
532
789
|
readonly "owner.token.use": "Use this token";
|
|
533
790
|
readonly "owner.token.checking": "Checking…";
|
|
@@ -536,13 +793,296 @@ export declare const defaultStrings: {
|
|
|
536
793
|
readonly "owner.token.forget": "Stop using it";
|
|
537
794
|
readonly "settings.tab.editors": "Editors";
|
|
538
795
|
readonly "settings.tab.updates": "Updates";
|
|
796
|
+
readonly "settings.tab.history": "Site history";
|
|
797
|
+
readonly "settings.tab.import": "WordPress";
|
|
798
|
+
readonly "settings.tab.themes": "Themes";
|
|
799
|
+
readonly "plugins.notFound": "The site has no plugin screen at this address.";
|
|
800
|
+
readonly "plugins.failed": "{plugin}'s screen couldn't start. If it keeps happening, the plugin may need updating.";
|
|
801
|
+
readonly "themes.intro": "A theme changes your site's look: its colors, fonts and the styles of its blocks, and sometimes its header and footer. Themes are only settings and styles, with no code, and you can change anything a theme sets afterwards in Colors & fonts and Custom CSS.";
|
|
802
|
+
readonly "themes.installed": "Installed theme";
|
|
803
|
+
readonly "themes.noneInstalled": "No theme is installed. Your site uses its own colors and fonts.";
|
|
804
|
+
readonly "themes.installedBadge": "Installed";
|
|
805
|
+
readonly "themes.release": "version {version}";
|
|
806
|
+
readonly "themes.updateAvailable": "Version {version} is out";
|
|
807
|
+
readonly "themes.updateTo": "Update to {version}";
|
|
808
|
+
readonly "themes.seeVersion": "See version {version}";
|
|
809
|
+
readonly "themes.upToDate": "Up to date";
|
|
810
|
+
readonly "themes.show": "Show";
|
|
811
|
+
readonly "themes.showLabel": "Show {name}";
|
|
812
|
+
readonly "themes.find": "Find a theme";
|
|
813
|
+
readonly "themes.search": "Search themes";
|
|
814
|
+
readonly "themes.searchButton": "Search";
|
|
815
|
+
readonly "themes.loading": "Looking for themes…";
|
|
816
|
+
readonly "themes.noneFound": "No themes were found.";
|
|
817
|
+
readonly "themes.byPublisher": "{name}, published by {publisher}";
|
|
818
|
+
readonly "themes.releaseDetails": "{name}, version {version}, published {date}";
|
|
819
|
+
readonly "themes.provenance": "Built from {source}, which npm checked when it was published.";
|
|
820
|
+
readonly "themes.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.";
|
|
821
|
+
readonly "themes.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.";
|
|
822
|
+
readonly "themes.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.";
|
|
823
|
+
readonly "themes.tooNew": "This theme's versions are too new to install. Versions can be installed once they're {days} days old.";
|
|
824
|
+
readonly "themes.notCompatible": "No version of this theme says it works with Goodfellow {version}.";
|
|
825
|
+
readonly "themes.imageAlt": "A site with the {title} theme";
|
|
826
|
+
readonly "themes.loads": "This theme asks visitors' browsers for these files from other sites, which can tell those sites who visits yours:";
|
|
827
|
+
readonly "themes.useLayout": "Use the theme's header and footer in place of yours. Your menus, logo and contact details stay as they are.";
|
|
828
|
+
readonly "themes.layoutUnknown": "The theme's header and footer use blocks a theme can't add, or that your site doesn't have ({blocks}), so they can't be used.";
|
|
829
|
+
readonly "themes.kept": "You changed these since the version before, so they stay as you set them: {list}.";
|
|
830
|
+
readonly "themes.replaced": "You changed these, and installing this theme replaces your changes: {list}.";
|
|
831
|
+
readonly "themes.changed.css": "the theme's CSS";
|
|
832
|
+
readonly "themes.preview": "Your site with {title}";
|
|
833
|
+
readonly "themes.previewPage": "Page to look at";
|
|
834
|
+
readonly "themes.install": "Install and publish";
|
|
835
|
+
readonly "themes.installDemo": "Install";
|
|
836
|
+
readonly "themes.installMessage": "Install the {title} theme, version {version}";
|
|
837
|
+
readonly "themes.updateMessage": "Update the {title} theme to version {version}";
|
|
838
|
+
readonly "themes.installedNotice": "{title} is installed. Your site will show it once it's rebuilt.";
|
|
839
|
+
readonly "themes.updated": "{title} is updated to version {version}.";
|
|
840
|
+
readonly "themes.remove": "Remove";
|
|
841
|
+
readonly "themes.removeTitle": "Remove {title}?";
|
|
842
|
+
readonly "themes.removeBody": "Colors, fonts and styles the theme set go back to Goodfellow's defaults, and its CSS is removed. Anything you changed yourself, and your header and footer, stay as they are.";
|
|
843
|
+
readonly "themes.removeReplaced": "Removing it also removes your changes to: {list}.";
|
|
844
|
+
readonly "themes.removeMessage": "Remove the {title} theme";
|
|
845
|
+
readonly "themes.removed": "{title} is removed.";
|
|
846
|
+
readonly "themes.error.record": "The record of which theme is installed can't be read.";
|
|
847
|
+
readonly "themes.error.unreachable": "Themes can't be looked up right now. Check your internet connection and try again.";
|
|
848
|
+
readonly "themes.error.badFile": "This theme has a problem in its files, so it can't be installed. Its publisher needs to fix it.";
|
|
849
|
+
readonly "themes.error.notATheme": "This package isn't a Goodfellow theme.";
|
|
850
|
+
readonly "settings.tab.plugins": "Plugins";
|
|
851
|
+
readonly "plugins.intro": "Plugins add to what your site and this admin panel can do, such as blocks, screens here, and steps when your site is built. Unlike themes, they have code, which is included when your site is built and runs on its pages, so install only plugins you trust. Before you install one, this screen shows what it asks to do and reads its code for things to look at.";
|
|
852
|
+
readonly "plugins.where.none": "Plugins can be installed here once the admin panel has an address of its own, or a token broker, where your site's pages can't reach it: see the Domain and Security tabs. Until then, a developer can add plugins to the site's code.";
|
|
853
|
+
readonly "plugins.where.contentOnly": "This site's code is kept apart from its content, so a developer adds plugins there.";
|
|
854
|
+
readonly "plugins.where.demo": "Plugins can't be installed in a demo.";
|
|
855
|
+
readonly "plugins.where.local": "On this computer, a developer adds plugins with npm and lists them in goodfellow.config.tsx. The published admin panel installs them.";
|
|
856
|
+
readonly "plugins.where.setup": "Your site's build doesn't write the list of its packages' versions yet, which plugins installed here need. A developer needs to update its build setup to the starter's first.";
|
|
857
|
+
readonly "plugins.installed": "Installed plugins";
|
|
858
|
+
readonly "plugins.noneInstalled": "No plugins are installed.";
|
|
859
|
+
readonly "plugins.inCode": "Added by a developer";
|
|
860
|
+
readonly "plugins.installedBadge": "Installed";
|
|
861
|
+
readonly "plugins.release": "version {version}";
|
|
862
|
+
readonly "plugins.updateAvailable": "Version {version} is out";
|
|
863
|
+
readonly "plugins.updateTo": "Update to {version}";
|
|
864
|
+
readonly "plugins.seeVersion": "See version {version}";
|
|
865
|
+
readonly "plugins.upToDate": "Up to date";
|
|
866
|
+
readonly "plugins.show": "Show";
|
|
867
|
+
readonly "plugins.showLabel": "Show {name}";
|
|
868
|
+
readonly "plugins.find": "Find a plugin";
|
|
869
|
+
readonly "plugins.search": "Search plugins";
|
|
870
|
+
readonly "plugins.searchButton": "Search";
|
|
871
|
+
readonly "plugins.loading": "Looking for plugins…";
|
|
872
|
+
readonly "plugins.noneFound": "No plugins were found.";
|
|
873
|
+
readonly "plugins.byPublisher": "{name}, published by {publisher}";
|
|
874
|
+
readonly "plugins.releaseDetails": "{name}, version {version}, published {date}";
|
|
875
|
+
readonly "plugins.provenance": "Built from {source}, which npm checked when it was published.";
|
|
876
|
+
readonly "plugins.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.";
|
|
877
|
+
readonly "plugins.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.";
|
|
878
|
+
readonly "plugins.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.";
|
|
879
|
+
readonly "plugins.tooNew": "This plugin's versions are too new to install. Versions can be installed once they're {days} days old.";
|
|
880
|
+
readonly "plugins.notCompatible": "No version of this plugin says it works with Goodfellow {version}.";
|
|
881
|
+
readonly "plugins.asks": "What it asks to do";
|
|
882
|
+
readonly "plugins.asks.connect": "Reach these addresses from the admin panel: {list}";
|
|
883
|
+
readonly "plugins.asks.files": "Read and publish these files: {list}";
|
|
884
|
+
readonly "plugins.asks.secrets": "Get these secrets when your site is built: {list}";
|
|
885
|
+
readonly "plugins.asks.read": "Read these parts of your site when it's built: {list}";
|
|
886
|
+
readonly "plugins.asks.write": "Write these parts of the built site: {list}";
|
|
887
|
+
readonly "plugins.asks.blocks": "Add these blocks: {list}";
|
|
888
|
+
readonly "plugins.asks.admin": "Run in the admin panel, in a frame of its own that can't reach your sign-in";
|
|
889
|
+
readonly "plugins.asks.screens": "Add these screens to Site Settings: {list}";
|
|
890
|
+
readonly "plugins.asks.build": "Run these steps when your site is built: {list}";
|
|
891
|
+
readonly "plugins.asks.tasks": "Run these tasks with its secrets when the admin panel asks, each taking about a minute: {list}";
|
|
892
|
+
readonly "plugins.secrets.github.title": "Add them on GitHub";
|
|
893
|
+
readonly "plugins.secrets.github.link": "Open GitHub's form for a new secret";
|
|
894
|
+
readonly "plugins.secrets.github.open": "Open GitHub's form for a new secret with the link below. Add each key there, one at a time, opening the form again for the next.";
|
|
895
|
+
readonly "plugins.secrets.github.add": "For {name}: type {name} in Name, paste its value in Secret, and choose Add secret.";
|
|
896
|
+
readonly "plugins.secrets.github.who": "Only the site's owners on GitHub can open the form.";
|
|
897
|
+
readonly "plugins.secrets.github.kind": "This form adds secrets for this site alone, which is all it needs. GitHub's environment and organization secrets are for other things, so you can leave them alone.";
|
|
898
|
+
readonly "plugins.secrets.gitlab.title": "Add them on GitLab";
|
|
899
|
+
readonly "plugins.secrets.gitlab.link": "Open the site's CI/CD settings on GitLab";
|
|
900
|
+
readonly "plugins.secrets.gitlab.open": "Open the site's CI/CD settings on GitLab with the link below, and expand Variables. Add each key there, one at a time.";
|
|
901
|
+
readonly "plugins.secrets.gitlab.add": "For {name}: choose Add variable, choose Masked under Visibility, keep Protect variable ticked, type {name} in Key, paste its value in Value, and choose Add variable.";
|
|
902
|
+
readonly "plugins.secrets.gitlab.who": "Only the site's owners (Maintainers) on GitLab can change its CI/CD settings.";
|
|
903
|
+
readonly "plugins.secrets.bitbucket.title": "Add them on Bitbucket";
|
|
904
|
+
readonly "plugins.secrets.bitbucket.link": "Open the site's Pipelines variables on Bitbucket";
|
|
905
|
+
readonly "plugins.secrets.bitbucket.open": "Open the site's Pipelines variables on Bitbucket with the link below. Add each key there, one at a time. If Bitbucket says Pipelines isn't turned on, turn it on under Settings first.";
|
|
906
|
+
readonly "plugins.secrets.bitbucket.add": "For {name}: type {name} in Name, paste its value in Value, tick Secured, and choose Add.";
|
|
907
|
+
readonly "plugins.secrets.bitbucket.who": "Only the site's owners (with Admin permission) on Bitbucket can change its variables.";
|
|
908
|
+
readonly "plugins.secrets.development.title": "Add them on this computer";
|
|
909
|
+
readonly "plugins.secrets.development.file": "In the site's folder, beside package.json, open the file .env.local, or make it, and add a line for each of {names}:";
|
|
910
|
+
readonly "plugins.secrets.development.values": "Put each value after its =, save the file, and try again. There's no need to restart the development server.";
|
|
911
|
+
readonly "plugins.secrets.development.local": "This is only for trying the site on this computer: .env.local is never published. The live site needs them in its own secrets too.";
|
|
912
|
+
readonly "plugins.secrets.server.title": "Add them to the site's server";
|
|
913
|
+
readonly "plugins.secrets.server.add": "Add {names} as environment variables where the site's server runs, such as the project's Settings → Environment Variables on Vercel.";
|
|
914
|
+
readonly "plugins.secrets.server.deploy": "Then deploy the site again so the server has them.";
|
|
915
|
+
readonly "plugins.secrets.server.who": "Whoever set up the site's server knows where its environment variables are. Without them there, the build service's secrets below are used instead, which is slower.";
|
|
916
|
+
readonly "plugins.task.missing": "Your site's setup can't run plugins' tasks yet. A developer needs to copy the starter's plugin-task setup into the site.";
|
|
917
|
+
readonly "plugins.task.not-allowed": "Your sign-in can't run plugins' tasks. Ask the site's owner to let you publish.";
|
|
918
|
+
readonly "plugins.task.timeout": "The site's build service didn't answer in time. Try again in a few minutes.";
|
|
919
|
+
readonly "plugins.task.failed": "The site's build service couldn't run the plugin's task. Try again, or ask a developer to look at the site's builds.";
|
|
920
|
+
readonly "plugins.asks.server": "Answer requests on your site's server, with everything the server can do";
|
|
921
|
+
readonly "plugins.asks.mediaStorage": "Keep your site's media in a storage service, outside the site's own files";
|
|
922
|
+
readonly "plugins.asks.editor": "Offer its own page editor, {title}, which anyone editing the site can choose in place of the usual one, and which is given what they edit there";
|
|
923
|
+
readonly "plugins.asks.always": "Like any plugin, its code is included when your site is built, and its blocks run on your site's pages, where nothing holds them to what it asks.";
|
|
924
|
+
readonly "plugins.asks.new": "This version asks for more than the one installed:";
|
|
925
|
+
readonly "plugins.code": "What its code does";
|
|
926
|
+
readonly "plugins.code.intro": "The plugin's code, and the code of the packages it needs, read as text for things to look at. Code can hide what it does, so this is a place to start, not a promise.";
|
|
927
|
+
readonly "plugins.code.reading": "Reading its code…";
|
|
928
|
+
readonly "plugins.code.via": "needed by {via}";
|
|
929
|
+
readonly "plugins.code.none": "Nothing to look at was found.";
|
|
930
|
+
readonly "plugins.code.summary": "Its code: {list}.";
|
|
931
|
+
readonly "plugins.code.nothing": "Nothing to look at was found in its code.";
|
|
932
|
+
readonly "plugins.code.unreadSummary": "{count} of its packages couldn't be read in full.";
|
|
933
|
+
readonly "plugins.note.network": "makes network requests";
|
|
934
|
+
readonly "plugins.note.programs": "runs other programs on the computer that builds your site";
|
|
935
|
+
readonly "plugins.note.eval": "runs code made from text, which can't be read beforehand";
|
|
936
|
+
readonly "plugins.note.native": "includes native code, which can't be read";
|
|
937
|
+
readonly "plugins.note.install-script": "has a script npm would run when installing it, which your site's build doesn't run, since it installs packages with scripts turned off";
|
|
938
|
+
readonly "plugins.unread.too-large": "Too large to read in full.";
|
|
939
|
+
readonly "plugins.unread.too-many": "Not read: the plugin needs too many packages to read them all.";
|
|
940
|
+
readonly "plugins.unread.no-release": "No version of it is old enough yet, so your site couldn't be built with this plugin.";
|
|
941
|
+
readonly "plugins.unread.range": "Comes from somewhere other than npm, so it wasn't read.";
|
|
942
|
+
readonly "plugins.unread.unavailable": "Couldn't be read.";
|
|
943
|
+
readonly "plugins.install": "Install";
|
|
944
|
+
readonly "plugins.confirmTitle": "Install {title}?";
|
|
945
|
+
readonly "plugins.confirmIntro": "{name} version {version} asks to:";
|
|
946
|
+
readonly "plugins.confirmConfig": "Your site's settings file is changed too, to list the plugins installed here, since it didn't yet.";
|
|
947
|
+
readonly "plugins.confirmBuild": "Your site's build then writes down the versions of the packages it needs, without running any of their code, and rebuilds your site with it, which takes a few minutes.";
|
|
948
|
+
readonly "plugins.confirmReview": "Your site's server holds its secrets, so installing a plugin is submitted for review, for a developer to accept.";
|
|
949
|
+
readonly "plugins.confirmInstall": "Install and publish";
|
|
950
|
+
readonly "plugins.submit": "Submit for review";
|
|
951
|
+
readonly "plugins.reviewIntro": "Installs {name} version {version}, from the admin panel's Plugins screen. It asks to:";
|
|
952
|
+
readonly "plugins.installMessage": "Install the {title} plugin, version {version}";
|
|
953
|
+
readonly "plugins.updateMessage": "Update the {title} plugin to version {version}";
|
|
954
|
+
readonly "plugins.installedNotice": "{title} is installed. Your site will have it once it's rebuilt, in a few minutes.";
|
|
955
|
+
readonly "plugins.updated": "{title} is updated to version {version}.";
|
|
956
|
+
readonly "plugins.submitted": "The change to {title} is submitted for review.";
|
|
957
|
+
readonly "plugins.seeReview": "See it";
|
|
958
|
+
readonly "plugins.remove": "Remove";
|
|
959
|
+
readonly "plugins.removeReview": "Submit for review";
|
|
960
|
+
readonly "plugins.removeTitle": "Remove {title}?";
|
|
961
|
+
readonly "plugins.removeBody": "Its code is taken out of your site when it's next built. Files it kept in your site's content stay where they are.";
|
|
962
|
+
readonly "plugins.removeUsed": "Pages use its blocks ({blocks}), so it can't be removed. Take them off those pages first.";
|
|
963
|
+
readonly "plugins.removeKeepsMedia": "{title} keeps your site's media, which pages show from its storage. Move the media back into the site's own files on the Media screen first.";
|
|
964
|
+
readonly "plugins.removeMessage": "Remove the {title} plugin";
|
|
965
|
+
readonly "plugins.removed": "{title} is removed.";
|
|
966
|
+
readonly "plugins.error.record": "The record of which plugins are installed can't be read.";
|
|
967
|
+
readonly "plugins.error.unreachable": "Plugins can't be looked up right now. Check your internet connection and try again.";
|
|
968
|
+
readonly "plugins.error.badFile": "This plugin has a problem in its files, so it can't be installed. Its publisher needs to fix it.";
|
|
969
|
+
readonly "plugins.error.notAPlugin": "This package isn't a Goodfellow plugin.";
|
|
970
|
+
readonly "plugins.error.config": "Your site's settings file lists plugins of its own, so a developer needs to add the ones installed here to it first.";
|
|
971
|
+
readonly "plugins.error.inCode": "A developer added this plugin to the site's code, so it's changed there.";
|
|
972
|
+
readonly "plugins.error.blockClash": "This plugin's blocks have the same names as ones your site has: {blocks}.";
|
|
973
|
+
readonly "plugins.error.notInstalled": "This plugin wasn't installed here.";
|
|
974
|
+
readonly "updates.pluginRange": "{title}, a plugin installed here, says it works with Goodfellow {range}, so your site may not build with Goodfellow {version} until the plugin has a newer version.";
|
|
975
|
+
readonly "updates.themeRange": "Your theme, {title}, says it works with Goodfellow {range}. Goodfellow {version} may change how it looks, so check Themes for a newer version of it after updating.";
|
|
976
|
+
readonly "siteHistory.intro": "Every publish that changed the site's pages, items, settings or media, newest first. Choose one to see how the site looked after it and what has changed since, then restore the whole site as it was.";
|
|
977
|
+
readonly "siteHistory.local": "Site history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
978
|
+
readonly "siteHistory.demo": "Site history isn't kept in a demo.";
|
|
979
|
+
readonly "siteHistory.error": "The site's history couldn't be loaded. Check your connection and try again.";
|
|
980
|
+
readonly "siteHistory.current": "The site now";
|
|
981
|
+
readonly "siteHistory.preview": "The site on {date}";
|
|
982
|
+
readonly "siteHistory.loadingVersion": "Loading the site as it was…";
|
|
983
|
+
readonly "siteHistory.readError": "The site as it was then couldn't be loaded. Check your connection and try again.";
|
|
984
|
+
readonly "siteHistory.unfit": "The site as it was then can't be shown or restored, because it doesn't fit the site as it is now.";
|
|
985
|
+
readonly "siteHistory.unknownBlocks": "The site as it was then can't be restored, because it uses blocks the site doesn't have any more: {blocks}.";
|
|
986
|
+
readonly "siteHistory.same": "Nothing has changed since: this is how the site is now.";
|
|
987
|
+
readonly "siteHistory.since": "What has changed since";
|
|
988
|
+
readonly "siteHistory.changed": "Changed since (restoring puts them back as they were):";
|
|
989
|
+
readonly "siteHistory.added": "Added since (restoring removes them):";
|
|
990
|
+
readonly "siteHistory.removed": "Removed since (restoring brings them back):";
|
|
991
|
+
readonly "siteHistory.page": "Page to look at";
|
|
992
|
+
readonly "siteHistory.restore": "Restore the site as it was";
|
|
993
|
+
readonly "siteHistory.restoreTitle": "Restore the site as it was on {date}?";
|
|
994
|
+
readonly "siteHistory.restoreBody": "Everything listed ({count}) goes back to how it was then, in one publish. The site as it is now stays in the history, so you can restore it again later. The site's code and update settings stay as they are.";
|
|
995
|
+
readonly "siteHistory.restoreMessage": "Restore the site as it was on {date}";
|
|
996
|
+
readonly "siteHistory.restored": "Restored the site as it was on {date}.";
|
|
997
|
+
readonly "siteHistory.subject.page": "{title} ({path})";
|
|
998
|
+
readonly "siteHistory.subject.entry": "{title}, in {collection}";
|
|
999
|
+
readonly "siteHistory.subject.collection": "The settings and page design of {name}";
|
|
1000
|
+
readonly "siteHistory.subject.settings": "Site settings";
|
|
1001
|
+
readonly "siteHistory.subject.menus": "Menus";
|
|
1002
|
+
readonly "siteHistory.subject.redirects": "Redirects";
|
|
1003
|
+
readonly "siteHistory.subject.credits": "Photo credits";
|
|
1004
|
+
readonly "siteHistory.subject.css": "Custom CSS";
|
|
1005
|
+
readonly "siteHistory.subject.theme": "Which theme is installed";
|
|
1006
|
+
readonly "siteHistory.subject.code": "Code added to every page";
|
|
1007
|
+
readonly "import.title": "Import from WordPress";
|
|
1008
|
+
readonly "import.intro": "Bring a WordPress site's pages, posts, categories, tags, menus and media into this site. Pages keep their addresses, posts become a collection, and old addresses send visitors on to the new ones. You'll see what comes across before anything changes.";
|
|
1009
|
+
readonly "import.file": "WordPress export file";
|
|
1010
|
+
readonly "import.fileHint": "In WordPress, go to Tools → Export, choose All content and download the file. It brings the menus too.";
|
|
1011
|
+
readonly "import.address": "Or the WordPress site's address";
|
|
1012
|
+
readonly "import.addressHint": "Such as example.org. Only what visitors can see is read, and menus can't be.";
|
|
1013
|
+
readonly "import.read": "Read the site";
|
|
1014
|
+
readonly "import.reading": "Reading the WordPress site…";
|
|
1015
|
+
readonly "import.ready": "Ready to import {title}";
|
|
1016
|
+
readonly "import.summary.pages": "Pages: {count}";
|
|
1017
|
+
readonly "import.summary.posts": "Posts: {count}, at {path}, listed on {list}";
|
|
1018
|
+
readonly "import.summary.terms": "Categories: {categories}. Tags: {tags}.";
|
|
1019
|
+
readonly "import.summary.menus": "Menus: {count}";
|
|
1020
|
+
readonly "import.summary.redirects": "Old addresses sent on to new ones: {count}";
|
|
1021
|
+
readonly "import.summary.media": "Media files to copy: {count}";
|
|
1022
|
+
readonly "import.replaces": "These pages will be replaced: {pages}. Version history keeps the old ones.";
|
|
1023
|
+
readonly "import.check": "Check these";
|
|
1024
|
+
readonly "import.start": "Import";
|
|
1025
|
+
readonly "import.another": "Choose another site";
|
|
1026
|
+
readonly "import.copying": "Copying media: {done} of {total}…";
|
|
1027
|
+
readonly "import.publishing": "Publishing…";
|
|
1028
|
+
readonly "import.done": "Imported {title}.";
|
|
1029
|
+
readonly "import.viewPages": "See the pages";
|
|
1030
|
+
readonly "import.message": "Import {title} from WordPress";
|
|
1031
|
+
readonly "import.note.leftOut.drafts": "Drafts and pages waiting for review aren't imported: {count}.";
|
|
1032
|
+
readonly "import.note.leftOut.private": "Private pages and posts aren't imported: {count}.";
|
|
1033
|
+
readonly "import.note.leftOut.trash": "Pages and posts in the trash aren't imported: {count}.";
|
|
1034
|
+
readonly "import.note.leftOut.comments": "Comments aren't imported: {count}.";
|
|
1035
|
+
readonly "import.note.leftOut.other": "WordPress content of the kind “{name}” isn't imported: {count}.";
|
|
1036
|
+
readonly "import.note.more": "{items} and {count} more";
|
|
1037
|
+
readonly "import.note.block": "The “{name}” block, from another plugin, was brought across as its text and pictures: {items}.";
|
|
1038
|
+
readonly "import.note.dropped": "The “{name}” block shows something only WordPress has, so it was left out: {items}.";
|
|
1039
|
+
readonly "import.note.shortcode": "The [{name}] shortcode only works in WordPress, so it was left out: {items}.";
|
|
1040
|
+
readonly "import.note.embed": "Something from {name} is now a link to it: {items}.";
|
|
1041
|
+
readonly "import.note.form": "A form was left out. Add a Form block in its place: {items}.";
|
|
1042
|
+
readonly "import.note.script": "A script was left out: {items}.";
|
|
1043
|
+
readonly "import.note.table": "A table became text, since the site has no Table block: {items}.";
|
|
1044
|
+
readonly "import.note.posts": "A list of the latest posts was left out of a post: {items}.";
|
|
1045
|
+
readonly "import.note.video": "A video is now a link to it, since posts show videos as links: {items}.";
|
|
1046
|
+
readonly "import.note.oldLinks": "Links that still go to the WordPress site, to pages that weren't imported: {count}, such as {url}.";
|
|
1047
|
+
readonly "import.note.notCopied": "Media files that couldn't be copied, so pages show them from the WordPress site until you upload them: {count}, such as {url}. Most WordPress sites don't let other sites download their files; importing from the command line copies them.";
|
|
1048
|
+
readonly "import.note.unusedMedia": "Files in the media library that no page or post uses, so they weren't copied: {count}.";
|
|
1049
|
+
readonly "import.note.noMenus": "Menus can't be read from a site's address, so the main menu lists the top-level pages. Import an export file to bring the menus across.";
|
|
1050
|
+
readonly "import.error.notExportFile": "That file isn't a WordPress export file. In WordPress, go to Tools → Export, choose All content and download the file.";
|
|
1051
|
+
readonly "import.error.unreachable": "The WordPress site couldn't be read from {address}. Check the address. Some sites don't let other sites read them; then import an export file instead.";
|
|
1052
|
+
readonly "import.error.notWordPress": "{address} doesn't look like a WordPress site, or its API is turned off. Import an export file instead.";
|
|
1053
|
+
readonly "import.error.blocks": "Importing needs blocks this site doesn't have: {blocks}. A developer can add Goodfellow's built-in blocks to goodfellow.config.tsx.";
|
|
1054
|
+
readonly "import.error.other": "The WordPress site couldn't be imported.";
|
|
1055
|
+
readonly "import.names.posts": "Posts";
|
|
1056
|
+
readonly "import.names.post": "Post";
|
|
1057
|
+
readonly "import.names.title": "Title";
|
|
1058
|
+
readonly "import.names.date": "Date";
|
|
1059
|
+
readonly "import.names.summary": "Summary";
|
|
1060
|
+
readonly "import.names.image": "Image";
|
|
1061
|
+
readonly "import.names.categories": "Categories";
|
|
1062
|
+
readonly "import.names.tags": "Tags";
|
|
1063
|
+
readonly "import.names.text": "Text";
|
|
1064
|
+
readonly "import.names.allPosts": "All posts";
|
|
1065
|
+
readonly "export.title": "Export to WordPress";
|
|
1066
|
+
readonly "export.intro": "Download this site as a WordPress export file, to move it to WordPress or keep a copy. Pages keep their addresses and blocks become WordPress's, items of collections with pages become posts, and menus come too. In WordPress, go to Tools → Import → WordPress, choose the file and tick “Download and import file attachments”, which copies the media from this site.";
|
|
1067
|
+
readonly "export.download": "Download the export file";
|
|
1068
|
+
readonly "export.done": "Downloaded the export file.";
|
|
1069
|
+
readonly "export.error": "The export file couldn't be made.";
|
|
1070
|
+
readonly "export.summary.pages": "Pages: {count}";
|
|
1071
|
+
readonly "export.summary.posts": "Posts: {count}";
|
|
1072
|
+
readonly "export.summary.media": "Media files, which WordPress copies from this site: {count}";
|
|
1073
|
+
readonly "export.note.leftOutBlock": "WordPress has nothing like the {name} block, so it was left out: {items}.";
|
|
1074
|
+
readonly "export.note.noPages": "Collections without pages of their own aren't in the file, since WordPress's posts each have a page: {collections}.";
|
|
1075
|
+
readonly "export.note.hidden": "Hidden by their schedule, so they're drafts in the file: {items}.";
|
|
1076
|
+
readonly "export.note.redirects": "Redirects aren't in the file, since WordPress needs a plugin for them: {count}.";
|
|
1077
|
+
readonly "export.note.noAddress": "The site has no address yet, so WordPress can't copy its media. Set it on the General tab, then download the file again.";
|
|
1078
|
+
readonly "export.note.layout": "The header and footer aren't in the file. WordPress's theme shows its own, with the menus.";
|
|
539
1079
|
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.";
|
|
540
1080
|
readonly "updates.contentOnly": "This site's code is kept apart from its content, so Goodfellow's updates are installed where the code is, by the site's own setup or its developer.";
|
|
541
1081
|
readonly "updates.code": "This site's code is kept apart from its content, at {place}, where Goodfellow's updates are installed.";
|
|
542
1082
|
readonly "updates.code.link": "See it on {host}";
|
|
543
1083
|
readonly "updates.noAccess": "Your sign-in can't see the site's code, at {place}, where its updates are installed. Ask the site's developer to give you access to it. On GitHub, an access token needs to reach it too, or with Sign in with GitHub, Goodfellow's app needs to be installed there.";
|
|
544
1084
|
readonly "updates.back.skip": "Don't install Goodfellow {version} again";
|
|
545
|
-
readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub or
|
|
1085
|
+
readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
546
1086
|
readonly "updates.demo": "Updates aren't installed in a demo.";
|
|
547
1087
|
readonly "updates.loading": "Checking for updates…";
|
|
548
1088
|
readonly "updates.current": "This site uses Goodfellow {version}.";
|
|
@@ -573,6 +1113,19 @@ export declare const defaultStrings: {
|
|
|
573
1113
|
readonly "updates.skipped.body": "The site went back from these releases, so updates don't install them.";
|
|
574
1114
|
readonly "updates.skipped.allow": "Allow {version} again";
|
|
575
1115
|
readonly "updates.skipped.allowMessage": "Allow Goodfellow {version} again";
|
|
1116
|
+
readonly "updates.nightly.title": "Rebuilding overnight";
|
|
1117
|
+
readonly "updates.nightly.body": "Each night, the site can check whether it needs rebuilding: for fixes to install, for something it shows by today's date, such as an event's next date, or for a change that didn't go live.";
|
|
1118
|
+
readonly "updates.nightly.changed": "Only when something changed (recommended)";
|
|
1119
|
+
readonly "updates.nightly.always": "Every night";
|
|
1120
|
+
readonly "updates.nightly.off": "Never";
|
|
1121
|
+
readonly "updates.nightly.offWarning": "Without rebuilding overnight, what the site shows by today's date, such as lists of what's coming up, goes out of date, and fixes aren't installed on their own. The site is still rebuilt each time someone publishes.";
|
|
1122
|
+
readonly "updates.nightly.unknown": "Sign in as an owner to see or change this.";
|
|
1123
|
+
readonly "updates.nightly.onlyOwners": "Only the site's owners can change this.";
|
|
1124
|
+
readonly "updates.nightly.old": "This site's build setup rebuilds it every night. A newer setup from Goodfellow's starter rebuilds it only when something changed.";
|
|
1125
|
+
readonly "updates.rebuild.title": "Rebuild the site";
|
|
1126
|
+
readonly "updates.rebuild.body": "Rebuilds the site now without publishing anything, so the live site catches up, such as with another calendar's events or after a rebuild that didn't work.";
|
|
1127
|
+
readonly "updates.rebuild.button": "Rebuild now";
|
|
1128
|
+
readonly "updates.rebuild.started": "The site is rebuilding. It takes a few minutes.";
|
|
576
1129
|
readonly "updates.started": "The update has started. It takes a few minutes, and this page shows how it went.";
|
|
577
1130
|
readonly "updates.last.title": "Last update";
|
|
578
1131
|
readonly "updates.last.none": "No update has run yet.";
|
|
@@ -597,7 +1150,7 @@ export declare const defaultStrings: {
|
|
|
597
1150
|
readonly "updates.error.other": "Something went wrong. Try again in a moment.";
|
|
598
1151
|
readonly "editors.intro": "The people who can edit this site.";
|
|
599
1152
|
readonly "editors.roles": "Editors can change and publish everything in the admin panel. Owners can also invite and remove editors, and connect a domain.";
|
|
600
|
-
readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub or
|
|
1153
|
+
readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
|
|
601
1154
|
readonly "editors.demo": "Editors can't be invited in a demo.";
|
|
602
1155
|
readonly "editors.loading": "Loading editors…";
|
|
603
1156
|
readonly "editors.onlyOwners": "Only the site's owners can invite and remove editors.";
|
|
@@ -622,6 +1175,7 @@ export declare const defaultStrings: {
|
|
|
622
1175
|
readonly "editors.invite.title": "Invite someone";
|
|
623
1176
|
readonly "editors.invite.field": "Their {host} username";
|
|
624
1177
|
readonly "editors.invite.hint": "They need a {host} account. {host} emails them an invitation, which they accept before they can sign in here.";
|
|
1178
|
+
readonly "editors.invite.hintMembers": "They need to be in the site's {host} workspace already. They can edit as soon as you add them.";
|
|
625
1179
|
readonly "editors.invite.fieldEmail": "Their email address or {host} username";
|
|
626
1180
|
readonly "editors.invite.hintEmail": "With an email address, {host} emails them an invitation, and they make an account if they don't have one.";
|
|
627
1181
|
readonly "editors.invite.submit": "Invite";
|
|
@@ -640,6 +1194,21 @@ export declare const defaultStrings: {
|
|
|
640
1194
|
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.";
|
|
641
1195
|
readonly "general.language": "Language code";
|
|
642
1196
|
readonly "general.languageHint": "Such as en, es or fr.";
|
|
1197
|
+
readonly "languages.intro": "A site can be in several languages. Pages in the main language are at the site's address; each other language's pages are under its code, such as /es/about for Spanish. Translate a page from the Pages screen once its language is published.";
|
|
1198
|
+
readonly "languages.main": "Main language";
|
|
1199
|
+
readonly "languages.mainCodeHintUsed": "It can't change while the site has pages or items in other languages.";
|
|
1200
|
+
readonly "languages.name": "Name";
|
|
1201
|
+
readonly "languages.nameHint": "How the language switch names it, in that language.";
|
|
1202
|
+
readonly "languages.new": "New language";
|
|
1203
|
+
readonly "languages.add": "Add a language";
|
|
1204
|
+
readonly "languages.remove": "Remove this language";
|
|
1205
|
+
readonly "languages.codeHint": "Such as es, fr or pt-BR. Its pages go under its code, so it can't change once published.";
|
|
1206
|
+
readonly "languages.codeHintPublished": "Its pages are under {prefix}.";
|
|
1207
|
+
readonly "languages.codeInvalid": "Use a language code, such as es, fr or pt-BR.";
|
|
1208
|
+
readonly "languages.codeTaken": "The site has this language already.";
|
|
1209
|
+
readonly "languages.codeUsed": "The site has pages under {prefix} already. Move them first, or choose another code.";
|
|
1210
|
+
readonly "languages.titleHint": "The site's title in this language. Left empty, it's the main language's.";
|
|
1211
|
+
readonly "languages.inUse": "Pages and items in this language: {count}. To remove the language, delete them or move them out of it first.";
|
|
643
1212
|
readonly "general.timeZone": "Time zone";
|
|
644
1213
|
readonly "general.timeZoneHint": "The time zone events' times are in. Calendars show them in it, and visitors' calendars move them to their own.";
|
|
645
1214
|
readonly "general.timeZoneNone": "Not set: times are shown as they're written";
|
|
@@ -693,6 +1262,12 @@ export declare const defaultStrings: {
|
|
|
693
1262
|
readonly "theme.bodyFont": "Text";
|
|
694
1263
|
readonly "theme.radius": "Corner rounding";
|
|
695
1264
|
readonly "theme.radiusHint": "Such as 0.5rem, or 0 for square corners.";
|
|
1265
|
+
readonly "theme.parts": "Blocks' parts";
|
|
1266
|
+
readonly "theme.partsHint": "Give a part of every block of one kind classes, such as rounded-xl shadow-sm, to change how they all look. They come after the block's own classes and before what's chosen for each block.";
|
|
1267
|
+
readonly "theme.partsBlock": "Block";
|
|
1268
|
+
readonly "theme.partsBlockStyled": "{block} ({count} styled)";
|
|
1269
|
+
readonly "theme.partsName": "Its name is {name}, for custom CSS.";
|
|
1270
|
+
readonly "theme.partsNone": "This site's blocks have no named parts.";
|
|
696
1271
|
readonly "theme.color.background": "Background";
|
|
697
1272
|
readonly "theme.color.foreground": "Text";
|
|
698
1273
|
readonly "theme.color.primary": "Main color";
|
|
@@ -732,6 +1307,31 @@ export declare const defaultStrings: {
|
|
|
732
1307
|
readonly "menus.moveUp": "Move up";
|
|
733
1308
|
readonly "menus.moveDown": "Move down";
|
|
734
1309
|
readonly "menus.remove": "Remove";
|
|
1310
|
+
readonly "translations.add": "Translate into {language}";
|
|
1311
|
+
readonly "translations.current": "Up to date";
|
|
1312
|
+
readonly "translations.outdated": "Out of date";
|
|
1313
|
+
readonly "translations.optionOutdated": "{language} (out of date)";
|
|
1314
|
+
readonly "translations.optionAdd": "Translate into {language}…";
|
|
1315
|
+
readonly "translations.markCurrent": "Mark as up to date";
|
|
1316
|
+
readonly "translations.markCurrentMessage": "Mark {title} as up to date";
|
|
1317
|
+
readonly "translations.of": "Translation of {title}";
|
|
1318
|
+
readonly "translations.entryOf": "In {language}: translation of {title}";
|
|
1319
|
+
readonly "translations.inLanguage": "In {language}";
|
|
1320
|
+
readonly "translations.addTitle": "Translate {title} into {language}";
|
|
1321
|
+
readonly "translations.addHint": "This makes a copy in {language} for you to translate. The Pages screen says when the original changes, so you know to update the translation.";
|
|
1322
|
+
readonly "translations.addSubmit": "Make the copy";
|
|
1323
|
+
readonly "translations.addMessage": "Translate {title} into {language}";
|
|
1324
|
+
readonly "translations.addressLanguage": "Pages in {language} have addresses starting with {prefix}.";
|
|
1325
|
+
readonly "menus.language": "Language";
|
|
1326
|
+
readonly "layout.languageShared": "Pages in {language} show the main language's {part}, with {language}'s menus and site name. Give {language} a {part} of its own to translate the words typed into it.";
|
|
1327
|
+
readonly "layout.languageCopy": "Make a {part} for {language}";
|
|
1328
|
+
readonly "layout.languageCopyMessage": "Make a {part} for {language}";
|
|
1329
|
+
readonly "layout.languageRemove": "Use the main language's {part}";
|
|
1330
|
+
readonly "layout.languageRemoveMessage": "Use the main language's {part} in {language}";
|
|
1331
|
+
readonly "layout.languageMessage": "Update the {part} in {language}";
|
|
1332
|
+
readonly "newEntry.languageHint": "For an item only in this language. To translate an item, use “Translate into” in the list instead, which keeps the two linked.";
|
|
1333
|
+
readonly "menus.ownMenus": "{language} has menus of its own";
|
|
1334
|
+
readonly "menus.sameAsMain": "Pages in {language} show the main language's menus. Give it menus of its own to translate their links' names and point them at its pages.";
|
|
735
1335
|
readonly "menus.newLink": "New link";
|
|
736
1336
|
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.";
|
|
737
1337
|
readonly "redirects.empty": "There are no redirects yet.";
|
|
@@ -766,17 +1366,54 @@ export declare const defaultStrings: {
|
|
|
766
1366
|
type StringKey = keyof typeof defaultStrings;
|
|
767
1367
|
type Strings = Record<StringKey, string>;
|
|
768
1368
|
//#endregion
|
|
1369
|
+
//#region src/frame/host.d.ts
|
|
1370
|
+
/**
|
|
1371
|
+
* Where the admin panel loads the frames that run the site's code from: a
|
|
1372
|
+
* page of their own, such as `goodfellow build`'s `admin/editor/` or the
|
|
1373
|
+
* Next.js starter's `app/admin/editor/`, whose Content Security Policy
|
|
1374
|
+
* (`editorPolicy()`) runs only the site's scripts. Every frame is sandboxed
|
|
1375
|
+
* with `allow-scripts` alone, development servers' too, so the site's code
|
|
1376
|
+
* never shares the admin panel's origin.
|
|
1377
|
+
*/
|
|
1378
|
+
interface FrameSource {
|
|
1379
|
+
url: string;
|
|
1380
|
+
}
|
|
1381
|
+
/**
|
|
1382
|
+
* Loads every frame's page again, as development servers do once they've
|
|
1383
|
+
* rebuilt the frames with the site's new code, leaving the admin panel's own
|
|
1384
|
+
* page, and whatever is open on it, as it is. Frames reloaded this way
|
|
1385
|
+
* don't count towards the times one may start again.
|
|
1386
|
+
*/
|
|
1387
|
+
export declare function reloadFrames(): void;
|
|
1388
|
+
//#endregion
|
|
1389
|
+
//#region src/admin-context.d.ts
|
|
1390
|
+
/** How previews load the site's styles. Provided by the dev server or build that serves the admin panel. */
|
|
1391
|
+
interface PreviewOptions {
|
|
1392
|
+
/** The site's compiled stylesheets. */
|
|
1393
|
+
stylesheets: string[];
|
|
1394
|
+
/** `@goodfellow-cms/react/theme.css`, so Tailwind in the preview knows the theme's classes. */
|
|
1395
|
+
themeCss: string;
|
|
1396
|
+
/** URL of `@tailwindcss/browser`, which styles classes typed in the editor before the site is rebuilt. */
|
|
1397
|
+
tailwindBrowserUrl?: string;
|
|
1398
|
+
}
|
|
1399
|
+
//#endregion
|
|
769
1400
|
//#region src/admin.d.ts
|
|
770
1401
|
interface AdminProps {
|
|
771
|
-
/**
|
|
772
|
-
|
|
1402
|
+
/**
|
|
1403
|
+
* What the admin panel knows about the site, made from its config where the
|
|
1404
|
+
* config is loaded (`adminSite()` in `@goodfellow-cms/react`): the admin
|
|
1405
|
+
* panel's own page never loads the config, whose blocks run in sandboxed frames.
|
|
1406
|
+
*/
|
|
1407
|
+
site: AdminSite;
|
|
1408
|
+
/** Where those frames are loaded from. */
|
|
1409
|
+
frames: FrameSource;
|
|
773
1410
|
/**
|
|
774
1411
|
* Where the site's files are read from and published to, without signing in.
|
|
775
1412
|
* Used by `goodfellow dev`. Otherwise the admin panel signs in to `host`. In a
|
|
776
1413
|
* demo (the config's `demo`), it's only read from, and changes stay in the browser.
|
|
777
1414
|
*/
|
|
778
1415
|
store?: ContentStore;
|
|
779
|
-
/** The git host the site is stored on
|
|
1416
|
+
/** The git host the site is stored on, made from `site.backend`. */
|
|
780
1417
|
host?: GitHost;
|
|
781
1418
|
/**
|
|
782
1419
|
* The address of a full-stack site's API for the admin panel, such as
|
|
@@ -796,8 +1433,24 @@ interface AdminProps {
|
|
|
796
1433
|
registry?: string;
|
|
797
1434
|
}
|
|
798
1435
|
/** The admin panel. Render it on its own page, such as `/admin`. */
|
|
799
|
-
export declare function Admin({
|
|
1436
|
+
export declare function Admin({ site, frames, store, host, server, preview, siteUrl, strings, registry }: AdminProps): import("react").JSX.Element;
|
|
800
1437
|
/** Renders the admin panel into an element. */
|
|
801
1438
|
export declare function mountAdmin(element: Element, props: AdminProps): void;
|
|
802
1439
|
//#endregion
|
|
803
|
-
|
|
1440
|
+
//#region src/outdated-admin-page.d.ts
|
|
1441
|
+
interface OutdatedAdminPageProps {
|
|
1442
|
+
/** The files to change, as the starter now has them. */
|
|
1443
|
+
files: readonly {
|
|
1444
|
+
path: string;
|
|
1445
|
+
content: string;
|
|
1446
|
+
}[];
|
|
1447
|
+
strings?: Partial<Strings>;
|
|
1448
|
+
}
|
|
1449
|
+
/**
|
|
1450
|
+
* Shown in place of the admin panel by an admin page from before the editor's
|
|
1451
|
+
* frames, which loads the site's config, and every block's code, itself. It
|
|
1452
|
+
* never signs in, so no block's code runs beside a token.
|
|
1453
|
+
*/
|
|
1454
|
+
export declare function OutdatedAdminPage({ files, strings }: OutdatedAdminPageProps): import("react").JSX.Element;
|
|
1455
|
+
//#endregion
|
|
1456
|
+
export type { AdminProps, FrameSource, OutdatedAdminPageProps, PreviewOptions, StringKey, Strings };
|