@rigel-cms/rigel 1.4.0-rc.1 → 1.4.0-rc.3

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.
Files changed (55) hide show
  1. package/README.md +4 -2
  2. package/docs/README.md +28 -0
  3. package/docs/authors.md +133 -0
  4. package/docs/content-locales.md +12 -3
  5. package/docs/content-model.md +131 -0
  6. package/docs/getting-started.md +139 -0
  7. package/docs/github.md +112 -0
  8. package/docs/media.md +75 -0
  9. package/docs/menus.md +95 -0
  10. package/docs/preview-hosts.md +78 -0
  11. package/docs/preview.md +100 -0
  12. package/docs/seo.md +87 -0
  13. package/docs/sidebar.md +97 -0
  14. package/package.json +2 -3
  15. package/src/article-render.ts +12 -5
  16. package/src/config.ts +5 -0
  17. package/src/editor/App.svelte +67 -21
  18. package/src/editor/i18n/de/fields.json +2 -0
  19. package/src/editor/i18n/de/shell.json +8 -2
  20. package/src/editor/i18n/en/fields.json +2 -0
  21. package/src/editor/i18n/en/shell.json +8 -2
  22. package/src/editor/i18n/es/fields.json +2 -0
  23. package/src/editor/i18n/es/shell.json +8 -2
  24. package/src/editor/i18n/fr/fields.json +2 -0
  25. package/src/editor/i18n/fr/shell.json +8 -2
  26. package/src/editor/i18n/it/fields.json +2 -0
  27. package/src/editor/i18n/it/shell.json +8 -2
  28. package/src/editor/i18n/ja/fields.json +2 -0
  29. package/src/editor/i18n/ja/shell.json +8 -2
  30. package/src/editor/i18n/nl/fields.json +2 -0
  31. package/src/editor/i18n/nl/shell.json +8 -2
  32. package/src/editor/i18n/ru/fields.json +2 -0
  33. package/src/editor/i18n/ru/shell.json +8 -2
  34. package/src/editor/i18n/zh/fields.json +2 -0
  35. package/src/editor/i18n/zh/shell.json +8 -2
  36. package/src/editor/lib/BlockEditor.svelte +4 -3
  37. package/src/editor/lib/CollectionPanel.svelte +10 -2
  38. package/src/editor/lib/MarkdownEditor.svelte +38 -5
  39. package/src/editor/lib/PropertiesTabs.svelte +8 -1
  40. package/src/editor/lib/SchemaField.svelte +16 -2
  41. package/src/editor/lib/SchemaPanel.svelte +9 -3
  42. package/src/editor/lib/Settings.svelte +37 -30
  43. package/src/editor/lib/TopBar.svelte +13 -49
  44. package/src/editor/lib/VisualEditor.svelte +64 -13
  45. package/src/editor/lib/markdown-blocks.ts +69 -0
  46. package/src/editor/lib/media-library.ts +2 -1
  47. package/src/editor/lib/settings.ts +2 -0
  48. package/src/editor/styles.css +17 -1
  49. package/src/index.ts +1 -1
  50. package/src/manifest/pages.ts +0 -4
  51. package/src/manifest/search.ts +41 -0
  52. package/src/manifest/types.ts +1 -0
  53. package/src/schema/types.ts +1 -0
  54. package/src/schema/validate.ts +1 -0
  55. package/src/vite/manifest-plugin.ts +2 -1
package/src/config.ts CHANGED
@@ -9,12 +9,15 @@ import { DEFAULT_MAX_FILE_SIZE } from "./media-types";
9
9
  import { systemMessage } from "./editor/i18n/format";
10
10
  import { localeNames, type Locale } from "./editor/i18n/locales";
11
11
  import { validateContentLocales, validateContentLocale } from "./manifest/content-locales";
12
+ import { effectiveSearchScope } from "./manifest/search";
12
13
 
13
14
  export interface ContentLocalesConfig {
14
15
  defaultLocale: string;
15
16
  locales: { code: string; label: string }[];
16
17
  }
17
18
 
19
+ export type SearchScope = "all" | "currentLocale";
20
+
18
21
  export interface RigelConfig {
19
22
  copyDir: string;
20
23
  mediaDir?: string;
@@ -25,6 +28,7 @@ export interface RigelConfig {
25
28
  demo?: boolean;
26
29
  languages?: Locale[];
27
30
  contentLocales?: ContentLocalesConfig;
31
+ search?: { scope: SearchScope };
28
32
  extensions?: string[];
29
33
  collections?: CollectionConfig[];
30
34
  menus?: { folder: string; maxDepth?: number };
@@ -56,6 +60,7 @@ const DEFAULTS: Pick<RigelConfig, "copyDir" | "backend"> = {
56
60
 
57
61
  export function parseConfig(options: Partial<RigelConfig> = {}): RigelConfig {
58
62
  const cfg = { ...DEFAULTS, ...options };
63
+ cfg.search = { scope: effectiveSearchScope(cfg.search, undefined) };
59
64
  if (cfg.contentLocales !== undefined) {
60
65
  validateContentLocales(cfg.contentLocales);
61
66
  cfg.contentLocales = { ...cfg.contentLocales, locales: cfg.contentLocales.locales.map(locale => ({ ...locale })) };
@@ -12,10 +12,11 @@
12
12
  import SitePreview from "./lib/SitePreview.svelte";
13
13
  import ImagePicker from "./lib/ImagePicker.svelte";
14
14
  import Settings from "./lib/Settings.svelte";
15
+ import { effectiveSearchScope } from "../manifest/search";
15
16
  import TopBar from "./lib/TopBar.svelte";
16
17
  import Select from "./lib/Select.svelte";
17
18
  import { contentForLocale, selectionInContent } from "../manifest/content-locales";
18
- import { pageCategories, pageTemplates, inPageCategory, defaultPageCategory } from "../manifest/pages";
19
+ import { pageCategories, pageTemplates, inPageCategory } from "../manifest/pages";
19
20
  import { validateDocumentSlugs } from "../slugs";
20
21
  import Shortcuts from "./lib/Shortcuts.svelte";
21
22
  import CollectionPanel from "./lib/CollectionPanel.svelte";
@@ -160,7 +161,7 @@
160
161
  if (!Array.isArray(data.pages) || (data.backend === "github" && !data.github)) throw new Error($t("shell.configurationIncomplete"));
161
162
  blueprint = data;
162
163
  manifest = data;
163
- pagesFilter = defaultPageCategory(contentForLocale(data, data.contentLocales?.defaultLocale));
164
+ pagesFilter = null;
164
165
  ready = true;
165
166
  if (data.backend === "github" && data.github) {
166
167
  const session = readSession(data.github);
@@ -470,7 +471,9 @@
470
471
 
471
472
  const sortedPosts = $derived.by(() => {
472
473
  if (!coll) return [];
473
- const posts = [...coll.posts];
474
+ const query = (Object.hasOwn(collectionQueries, coll.name) ? collectionQueries[coll.name] : "").trim().toLocaleLowerCase();
475
+ const fields = coll.fields.filter(field => (field.key === "description" && (field.type === "string" || field.type === "text")) || (field.key === "tags" && field.type === "tags"));
476
+ const posts = coll.posts.filter(post => !query || [post.frontmatter.title, effectiveSlug(post.frontmatter, post.slug), ...fields.flatMap(field => post.frontmatter[field.key] ?? [])].some(value => typeof value === "string" && value.toLocaleLowerCase().includes(query)));
474
477
  if (!sortBy) return posts;
475
478
  return posts.sort((a, b) => {
476
479
  const va = cellValue(a, sortBy);
@@ -480,7 +483,16 @@
480
483
  });
481
484
 
482
485
  const sidebar = $derived(buildSidebar(visibleContent, $t));
483
- let pagesFilter = $state<string | null>("");
486
+ let pagesFilter = $state<string | null>(null);
487
+ let pagesQuery = $state("");
488
+ let collectionQueries = $state<Record<string, string>>({});
489
+ const tableQuery = $derived(sel?.kind === "collection" ? Object.hasOwn(collectionQueries, sel.name) ? collectionQueries[sel.name] : "" : pagesQuery);
490
+ const searchLabel = $derived(sel?.kind === "collection" && coll ? $t("shell.searchNamedEntries", { name: coll.label }) : $t("shell.searchPages"));
491
+ function setTableQuery(value: string) {
492
+ if (sel?.kind === "collection") collectionQueries[sel.name] = value;
493
+ else pagesQuery = value;
494
+ }
495
+ let pagesSearch: HTMLInputElement;
484
496
  let entryList = $state<Sel | null>(null);
485
497
  const categories = $derived(pageCategories(visibleContent));
486
498
  const pageCategory = $derived(sel?.kind === "pages" && sel.category !== undefined ? sel.category : pagesFilter);
@@ -521,11 +533,12 @@
521
533
  ...visibleContent.pages.filter((p) => !p.shared && inPageCategory(p.category, pageCategory))
522
534
  .map((p) => ({ slug: p.slug, path: previewPath(manifest.preview ?? {}, { kind: "page", slug: p.slug }), title: p.label, category: p.category, draft: false, target: { kind: "page", slug: p.slug } as Sel })),
523
535
  ...pageDocuments
524
- .map((doc) => ({ slug: effectiveSlug(doc.data, doc.slug), path: previewPath(manifest.preview ?? {}, { kind: "document", type: doc.type, slug: effectiveSlug(doc.data, doc.slug) }), title: String(doc.data.title ?? doc.slug), category: docTypes.find(type => type.name === doc.type)?.category, draft: doc.data.draft === true, target: { kind: "document", type: doc.type, id: doc.id } as Sel }))
536
+ .map((doc) => ({ slug: effectiveSlug(doc.data, doc.slug), path: previewPath(manifest.preview ?? {}, { kind: "document", type: doc.type, slug: effectiveSlug(doc.data, doc.slug) }), title: String(doc.data.title ?? doc.data.name ?? doc.slug), category: docTypes.find(type => type.name === doc.type)?.category, draft: doc.data.draft === true, target: { kind: "document", type: doc.type, id: doc.id } as Sel }))
525
537
  .filter(doc => inPageCategory(doc.category, pageCategory)),
526
538
  ];
527
539
  const key = sortBy === "slug" || sortBy === "category" || sortBy === "path" ? sortBy : "title";
528
- return rows.sort((a, b) => String(a[key] ?? "").localeCompare(String(b[key] ?? "")) * sortDir);
540
+ const query = pagesQuery.trim().toLocaleLowerCase();
541
+ return rows.filter(row => !query || [row.title, row.slug, row.category ?? (categories.length ? $t("shell.coreCategory") : "")].some(value => value.toLocaleLowerCase().includes(query))).sort((a, b) => String(a[key] ?? "").localeCompare(String(b[key] ?? "")) * sortDir);
529
542
  });
530
543
  function documentCell(doc: ContentDocument, key: string): string {
531
544
  return String(key === "title" ? doc.data.title ?? doc.data.name ?? doc.slug : key === "slug" ? activeDocType?.shared ? doc.slug : effectiveSlug(doc.data, doc.slug) : doc.data[key] ?? "");
@@ -639,10 +652,19 @@
639
652
  action?.();
640
653
  }
641
654
 
642
- function select(next: Sel | null) {
655
+ function select(next: Sel | null, fromSidebar = false) {
643
656
  if (manifest.contentLocales && !selectionInContent(visibleContent, next)) return;
644
- if (sel && next && sameSel(sel, next)) return;
645
- requestNavigation(() => openSelection(next));
657
+ const resetPages = fromSidebar && next?.kind === "pages";
658
+ const resetCollection = fromSidebar && next?.kind === "collection";
659
+ if (sel && next && sameSel(sel, next) && !resetPages && !resetCollection) return;
660
+ requestNavigation(() => {
661
+ if (resetPages) {
662
+ pagesFilter = next.category ?? null;
663
+ pagesQuery = "";
664
+ }
665
+ if (resetCollection) collectionQueries[next.name] = "";
666
+ openSelection(next);
667
+ });
646
668
  }
647
669
 
648
670
  function openSelection(next: Sel | null) {
@@ -694,19 +716,25 @@
694
716
  void tick().then(() => document.querySelector<HTMLButtonElement>(".content-language button[role=combobox]")?.focus({ preventScroll: true }));
695
717
  }
696
718
 
697
- function switchContentLocale(value: string | string[]) {
719
+ function switchContentLocale(value: string | string[], target?: Sel) {
698
720
  localeControlRevision += 1;
699
721
  if (typeof value !== "string" || value === contentLocale || !manifest.contentLocales?.locales.some(locale => locale.code === value)) return;
700
722
  requestNavigation(() => {
701
723
  const destination = contentForLocale(manifest, value);
702
724
  selectedContentLocale = value;
703
- if (pagesFilter && !pageCategories(destination).includes(pagesFilter)) pagesFilter = defaultPageCategory(destination);
725
+ if (pagesFilter && !pageCategories(destination).includes(pagesFilter)) pagesFilter = null;
704
726
  if (!selectionInContent(destination, entryList)) entryList = null;
705
727
  if (!selectionInContent(destination, sel)) openSelection(null);
728
+ if (target && selectionInContent(destination, target)) openSelection(target);
706
729
  focusContentLocale();
707
730
  }, focusContentLocale);
708
731
  }
709
732
 
733
+ function selectSearch(next: Sel, locale?: string) {
734
+ if (locale && locale !== contentLocale && manifest.contentLocales?.locales.some(entry => entry.code === locale)) switchContentLocale(locale, next);
735
+ else select(next);
736
+ }
737
+
710
738
  function sort(key: string) {
711
739
  if (sortBy === key) sortDir = sortDir === 1 ? -1 : 1;
712
740
  else {
@@ -877,7 +905,7 @@
877
905
  <img src={logo} alt="" width="32" height="32" />
878
906
  <span>Rigel <span class="brand-suffix">CMS</span></span>
879
907
  </a>
880
- <TopBar manifest={visibleContent} {sel} onselect={select} />
908
+ <TopBar {manifest} {sel} {contentLocale} scope={effectiveSearchScope(manifest.search, settings.userPref.searchScope)} onselect={selectSearch} />
881
909
  {#if manifest.contentLocales && manifest.contentLocales.locales.length > 1}
882
910
  <div class="content-language" data-locale={contentLocale}>
883
911
  {#key localeControlRevision}
@@ -905,7 +933,7 @@
905
933
  data-tooltip={node.label}
906
934
  class:active={navActive(node.target)}
907
935
  aria-current={navActive(node.target) ? "page" : undefined}
908
- onclick={() => select(node.target)}
936
+ onclick={() => select(node.target, true)}
909
937
  >
910
938
  <SidebarIcon name={node.icon ?? ({ pages: "files", page: "file-text", collection: "newspaper", documents: "squares-four", document: "file-text", menus: "list", media: "images" }[node.target.kind])} /><span class="sidebar-label">{node.label}</span>
911
939
  </button>
@@ -995,11 +1023,27 @@
995
1023
  {/if}
996
1024
  <div class="titlebar">
997
1025
  <h2>{sel.kind === "page" ? page?.label : sel.kind === "menu" ? String(draft.title || menu?.slug || "") : sel.kind === "post" ? String(draft.title || post?.slug || "") : sel.kind === "document" ? activeDocType?.singleton ? activeDocType.title : String(draft.title || draft.name || activeDocument?.slug || sel.id) : listTitle}</h2>
998
- {#if sel.kind === "pages" && categories.length}
999
- <Select label={$t("shell.category")} value={JSON.stringify(pageCategory)} options={[{ value: "null", label: $t("shell.allPages") }, { value: JSON.stringify(""), label: $t("shell.coreCategory") }, ...categories.map(category => ({ value: JSON.stringify(category), label: category }))]} onchange={(value) => { if (typeof value === "string") { pagesFilter = JSON.parse(value); select({ kind: "pages" }); } }} />
1026
+ {#if sel.kind === "pages"}
1027
+ {#if templates.length}
1028
+ <button class="primary" onclick={() => newPage(pageDocType, true)}>{$t("shell.addNew")}</button>
1029
+ {/if}
1000
1030
  {/if}
1001
- {#if (sel?.kind === "collection" && coll) || (sel?.kind === "pages" && templates.length) || (sel?.kind === "documents" && activeDocType && activeDocType.creatable !== false && !activeDocType.singleton)}
1002
- <button class="primary" onclick={() => (sel?.kind === "collection" ? newPost(coll!) : newPage(sel?.kind === "documents" ? activeDocType : pageDocType, sel?.kind === "pages"))}>{$t("shell.addNew")}</button>
1031
+ {#if (sel?.kind === "collection" && coll) || (sel?.kind === "documents" && activeDocType && activeDocType.creatable !== false && !activeDocType.singleton)}
1032
+ <button class="primary" onclick={() => (sel?.kind === "collection" ? newPost(coll!) : newPage(activeDocType))}>{$t("shell.addNew")}</button>
1033
+ {/if}
1034
+ {#if sel.kind === "pages" || (sel.kind === "collection" && coll)}
1035
+ <div class="pages-controls">
1036
+ {#if sel.kind === "pages" && categories.length}
1037
+ <Select ariaLabel={$t("shell.category")} value={JSON.stringify(pageCategory)} options={[{ value: "null", label: $t("shell.allPages") }, { value: JSON.stringify(""), label: $t("shell.coreCategory") }, ...categories.map(category => ({ value: JSON.stringify(category), label: category }))]} onchange={(value) => { if (typeof value === "string") { pagesFilter = JSON.parse(value); select({ kind: "pages" }); } }} />
1038
+ {/if}
1039
+ <div class="pages-search">
1040
+ <Icon name="magnifier" size={18} />
1041
+ <input type="search" aria-label={searchLabel} placeholder={searchLabel} value={tableQuery} oninput={(event) => setTableQuery(event.currentTarget.value)} bind:this={pagesSearch} />
1042
+ {#if tableQuery}
1043
+ <button type="button" class="icon-btn" aria-label={$t("fields.clear")} onclick={() => { setTableQuery(""); pagesSearch.focus(); }}><Icon name="x" size={16} /></button>
1044
+ {/if}
1045
+ </div>
1046
+ </div>
1003
1047
  {/if}
1004
1048
  {#if sel?.kind === "post" && post}
1005
1049
  <button class="icon-btn" aria-label={$t("shell.deletePost")} data-tooltip={$t("shell.deletePost")} disabled={saveState === "saving"} onclick={deletePost}>
@@ -1025,6 +1069,7 @@
1025
1069
  {:else if sel?.kind === "media"}
1026
1070
  <ImagePicker inline />
1027
1071
  {:else if sel?.kind === "pages" || sel?.kind === "documents" || sel?.kind === "menus" || (sel?.kind === "collection" && coll)}
1072
+
1028
1073
  <div class="table-card">
1029
1074
  <table>
1030
1075
  <thead>
@@ -1061,7 +1106,7 @@
1061
1106
  {/each}
1062
1107
  </tr>
1063
1108
  {:else}
1064
- <tr><td colspan={columns.length}>{$t("shell.noEntries")}</td></tr>
1109
+ <tr><td colspan={columns.length}>{$t((sel?.kind === "pages" || sel?.kind === "collection") && tableQuery.trim() ? "shell.noResults" : "shell.noEntries")}</td></tr>
1065
1110
  {/each}
1066
1111
  </tbody>
1067
1112
  </table>
@@ -1081,6 +1126,7 @@
1081
1126
  documents={draftDocuments}
1082
1127
  previewPath={documentPreview("draft")}
1083
1128
  websitePath={documentPreview("website")}
1129
+ bodyInline={settings.userPref.editorExperience === "inline"}
1084
1130
  creating={newDocument?.id === sel.id}
1085
1131
  devMode={settings.devMode}
1086
1132
  reloadToken={documentReload}
@@ -1136,8 +1182,8 @@
1136
1182
  devMode={settings.devMode}
1137
1183
  onchange={(next) => { draft = next; touch(); }}
1138
1184
  >
1139
- {#snippet properties(selected, focusToken, bodyInline, oneditbody, bodyLoading)}
1140
- <CollectionPanel fields={coll.fields} values={draft} storageSlug={post.slug} documents={manifest.documents ?? []} body={bodyDraft as ArticleBody} {bodyInline} {bodyLoading} {oneditbody} {selected} {focusToken} devMode={settings.devMode} onchange={(key, value) => { draft[key] = value; touch(); }} onbody={(value) => { bodyDraft = value; touch(); }} />
1185
+ {#snippet properties(selected, focusToken, bodyInline, oneditbody, bodyLoading, inlineFields, oneditfield)}
1186
+ <CollectionPanel fields={coll.fields} values={draft} storageSlug={post.slug} documents={manifest.documents ?? []} body={bodyDraft as ArticleBody} {bodyInline} {bodyLoading} {inlineFields} {oneditbody} {oneditfield} {selected} {focusToken} devMode={settings.devMode} onchange={(key, value) => { draft[key] = value; touch(); }} onbody={(value) => { bodyDraft = value; touch(); }} />
1141
1187
  {/snippet}
1142
1188
  </VisualEditor>
1143
1189
  {/key}
@@ -1166,7 +1212,7 @@
1166
1212
  {/if}
1167
1213
 
1168
1214
  {#if settingsOpen}
1169
- <Settings bind:s={settings} github={githubMode ? manifest.github : undefined} user={githubAccess?.user} error={settingsError} saving={saveState === "saving"} onerase={eraseBrowserData} onclose={() => (settingsOpen = false)} />
1215
+ <Settings bind:s={settings} search={manifest.search} contentLocales={manifest.contentLocales} github={githubMode ? manifest.github : undefined} user={githubAccess?.user} error={settingsError} saving={saveState === "saving"} onerase={eraseBrowserData} onclose={() => (settingsOpen = false)} />
1170
1216
  {/if}
1171
1217
  {#if shortcutsOpen}
1172
1218
  <Shortcuts onclose={() => (shortcutsOpen = false)} />
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Artikeltext in der Vorschau bearbeiten",
51
51
  "fields.loadingPreview": "Vorschau wird geladen…",
52
52
  "fields.editArticleBodyHint": "Klicken Sie zum Bearbeiten auf den Artikeltext in der Vorschau. Änderungen an den Inhalten müssen gespeichert werden.",
53
+ "fields.editRichText": "In der Vorschau bearbeiten",
54
+ "fields.editRichTextHint": "Klicke in der Vorschau auf diesen Text, um ihn zu bearbeiten. Änderungen müssen gespeichert werden.",
53
55
  "fields.seoNotSet": "Nicht festgelegt",
54
56
  "fields.seoTooShort": "Zu kurz",
55
57
  "fields.seoTooLong": "Zu lang",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Inhaltssprachen durchsuchen",
3
+ "shell.searchScopeDefault": "Website-Standard ({scope})",
4
+ "shell.searchScopeAll": "Alle Sprachen",
5
+ "shell.searchScopeCurrent": "Aktuelle Inhaltssprache",
2
6
  "shell.coreCategory": "Standard",
7
+ "shell.searchPages": "Seiten suchen",
8
+ "shell.searchNamedEntries": "In {name} suchen",
3
9
  "shell.template": "Vorlage",
4
10
  "shell.chooseTemplate": "Vorlage auswählen",
5
11
  "shell.search": "Suchen",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "navigieren",
25
31
  "shell.searchOpen": "öffnen",
26
32
  "shell.searchClose": "schließen",
27
- "shell.appearance": "Darstellung",
33
+ "shell.interface": "Benutzeroberfläche",
28
34
  "shell.editor": "Editor",
29
35
  "shell.connection": "Verbindung",
30
36
  "shell.media": "Medien",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Artikeltext bearbeiten",
45
51
  "shell.sidebar": "Seitenleiste",
46
52
  "shell.inlinePreview": "Inline-Vorschau",
47
- "shell.editorExperienceHint": "Mit der Inline-Vorschau kannst du auf einen Artikeltext klicken und direkt auf der Seite schreiben. Andere Felder bleiben in der Seitenleiste. Diese Einstellung wird in diesem Browser gespeichert; Inhalte müssen weiterhin mit Speichern gesichert werden.",
53
+ "shell.editorExperienceHint": "Mit der Inline-Vorschau kannst du auf Rich-Text-Bereiche klicken und direkt auf der Seite schreiben. Felder ohne Vorschau-Bindung bleiben in der Seitenleiste. Diese Einstellung wird in diesem Browser gespeichert; Inhalte müssen weiterhin mit Speichern gesichert werden.",
48
54
  "shell.githubAccount": "GitHub-Konto",
49
55
  "shell.noGithubAccount": "Kein GitHub-Konto verbunden.",
50
56
  "shell.repository": "Repository",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Edit article body in preview",
51
51
  "fields.loadingPreview": "Loading preview…",
52
52
  "fields.editArticleBodyHint": "Click the article body in the preview to edit. Content changes require Save.",
53
+ "fields.editRichText": "Edit in preview",
54
+ "fields.editRichTextHint": "Click this text in the preview to edit. Content changes require Save.",
53
55
  "fields.seoNotSet": "Not set",
54
56
  "fields.seoTooShort": "Too short",
55
57
  "fields.seoTooLong": "Too long",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Search content languages",
3
+ "shell.searchScopeDefault": "Website default ({scope})",
4
+ "shell.searchScopeAll": "All languages",
5
+ "shell.searchScopeCurrent": "Current content language",
2
6
  "shell.coreCategory": "Core",
7
+ "shell.searchPages": "Search pages",
8
+ "shell.searchNamedEntries": "Search {name}",
3
9
  "shell.template": "Template",
4
10
  "shell.chooseTemplate": "Choose a template",
5
11
  "shell.search": "Search",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "navigate",
25
31
  "shell.searchOpen": "open",
26
32
  "shell.searchClose": "close",
27
- "shell.appearance": "Appearance",
33
+ "shell.interface": "Interface",
28
34
  "shell.editor": "Editor",
29
35
  "shell.connection": "Connection",
30
36
  "shell.media": "Media",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Article body editing",
45
51
  "shell.sidebar": "Sidebar",
46
52
  "shell.inlinePreview": "Inline preview",
47
- "shell.editorExperienceHint": "Inline preview lets you click an article body and write directly on the page. Other fields stay in the sidebar. This preference saves in this browser; content still requires Save.",
53
+ "shell.editorExperienceHint": "Inline preview lets you click bound rich text and write directly on the page. Fields without a preview binding stay in the sidebar. This preference saves in this browser; content still requires Save.",
48
54
  "shell.githubAccount": "GitHub account",
49
55
  "shell.noGithubAccount": "No GitHub account connected.",
50
56
  "shell.repository": "Repository",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Editar el cuerpo del artículo en la vista previa",
51
51
  "fields.loadingPreview": "Cargando vista previa…",
52
52
  "fields.editArticleBodyHint": "Haz clic en el cuerpo del artículo en la vista previa para editarlo. Los cambios en el contenido requieren pulsar Guardar.",
53
+ "fields.editRichText": "Editar en la vista previa",
54
+ "fields.editRichTextHint": "Haz clic en este texto de la vista previa para editarlo. Los cambios requieren pulsar Guardar.",
53
55
  "fields.seoNotSet": "Sin definir",
54
56
  "fields.seoTooShort": "Demasiado corto",
55
57
  "fields.seoTooLong": "Demasiado largo",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Idiomas del contenido de búsqueda",
3
+ "shell.searchScopeDefault": "Predeterminado del sitio ({scope})",
4
+ "shell.searchScopeAll": "Todos los idiomas",
5
+ "shell.searchScopeCurrent": "Idioma actual del contenido",
2
6
  "shell.coreCategory": "Principales",
7
+ "shell.searchPages": "Buscar páginas",
8
+ "shell.searchNamedEntries": "Buscar en {name}",
3
9
  "shell.template": "Plantilla",
4
10
  "shell.chooseTemplate": "Elige una plantilla",
5
11
  "shell.search": "Buscar",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "navegar",
25
31
  "shell.searchOpen": "abrir",
26
32
  "shell.searchClose": "cerrar",
27
- "shell.appearance": "Apariencia",
33
+ "shell.interface": "Interfaz",
28
34
  "shell.editor": "Editor",
29
35
  "shell.connection": "Conexión",
30
36
  "shell.media": "Archivos multimedia",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Edición del cuerpo del artículo",
45
51
  "shell.sidebar": "Barra lateral",
46
52
  "shell.inlinePreview": "Vista previa en línea",
47
- "shell.editorExperienceHint": "La vista previa en línea permite hacer clic en el cuerpo de un artículo y escribir directamente en la página. Los demás campos permanecen en la barra lateral. Esta preferencia se guarda en este navegador; para guardar el contenido sigue siendo necesario pulsar Guardar.",
53
+ "shell.editorExperienceHint": "La vista previa en línea permite hacer clic en los textos enriquecidos vinculados y escribir directamente en la página. Los campos sin vínculo de vista previa permanecen en la barra lateral. Esta preferencia se guarda en este navegador; para guardar el contenido sigue siendo necesario pulsar Guardar.",
48
54
  "shell.githubAccount": "Cuenta de GitHub",
49
55
  "shell.noGithubAccount": "No hay ninguna cuenta de GitHub conectada.",
50
56
  "shell.repository": "Repositorio",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Modifier le corps de l’article dans l’aperçu",
51
51
  "fields.loadingPreview": "Chargement de l’aperçu…",
52
52
  "fields.editArticleBodyHint": "Cliquez sur le corps de l’article dans l’aperçu pour le modifier. Enregistrez pour conserver les modifications du contenu.",
53
+ "fields.editRichText": "Modifier dans l’aperçu",
54
+ "fields.editRichTextHint": "Cliquez sur ce texte dans l’aperçu pour le modifier. Enregistrez pour conserver les modifications du contenu.",
53
55
  "fields.seoNotSet": "Non défini",
54
56
  "fields.seoTooShort": "Trop court",
55
57
  "fields.seoTooLong": "Trop long",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Langues du contenu recherché",
3
+ "shell.searchScopeDefault": "Par défaut du site ({scope})",
4
+ "shell.searchScopeAll": "Toutes les langues",
5
+ "shell.searchScopeCurrent": "Langue actuelle du contenu",
2
6
  "shell.coreCategory": "Principales",
7
+ "shell.searchPages": "Rechercher des pages",
8
+ "shell.searchNamedEntries": "Rechercher dans {name}",
3
9
  "shell.template": "Modèle",
4
10
  "shell.chooseTemplate": "Choisir un modèle",
5
11
  "shell.search": "Rechercher",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "parcourir",
25
31
  "shell.searchOpen": "ouvrir",
26
32
  "shell.searchClose": "fermer",
27
- "shell.appearance": "Apparence",
33
+ "shell.interface": "Interface",
28
34
  "shell.editor": "Éditeur",
29
35
  "shell.connection": "Connexion",
30
36
  "shell.media": "Médias",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Édition du corps des articles",
45
51
  "shell.sidebar": "Barre latérale",
46
52
  "shell.inlinePreview": "Aperçu avec édition intégrée",
47
- "shell.editorExperienceHint": "L’aperçu avec édition intégrée permet de cliquer sur le corps d’un article pour écrire directement sur la page. Les autres champs restent dans la barre latérale. Cette préférence est enregistrée dans ce navigateur ; le contenu nécessite toujours un clic sur Enregistrer.",
53
+ "shell.editorExperienceHint": "L’aperçu avec édition intégrée permet de cliquer sur les textes enrichis liés pour écrire directement sur la page. Les champs sans liaison d’aperçu restent dans la barre latérale. Cette préférence est enregistrée dans ce navigateur ; le contenu nécessite toujours un clic sur Enregistrer.",
48
54
  "shell.githubAccount": "Compte GitHub",
49
55
  "shell.noGithubAccount": "Aucun compte GitHub connecté.",
50
56
  "shell.repository": "Dépôt",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Modifica il corpo dell’articolo nell’anteprima",
51
51
  "fields.loadingPreview": "Caricamento dell’anteprima…",
52
52
  "fields.editArticleBodyHint": "Fai clic sul corpo dell’articolo nell’anteprima per modificarlo. Premi Salva per salvare le modifiche ai contenuti.",
53
+ "fields.editRichText": "Modifica nell’anteprima",
54
+ "fields.editRichTextHint": "Fai clic su questo testo nell’anteprima per modificarlo. Premi Salva per salvare le modifiche ai contenuti.",
53
55
  "fields.seoNotSet": "Non impostato",
54
56
  "fields.seoTooShort": "Troppo breve",
55
57
  "fields.seoTooLong": "Troppo lungo",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Lingue dei contenuti da cercare",
3
+ "shell.searchScopeDefault": "Predefinito del sito ({scope})",
4
+ "shell.searchScopeAll": "Tutte le lingue",
5
+ "shell.searchScopeCurrent": "Lingua attuale del contenuto",
2
6
  "shell.coreCategory": "Principali",
7
+ "shell.searchPages": "Cerca pagine",
8
+ "shell.searchNamedEntries": "Cerca in {name}",
3
9
  "shell.template": "Modello",
4
10
  "shell.chooseTemplate": "Scegli un modello",
5
11
  "shell.search": "Cerca",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "naviga",
25
31
  "shell.searchOpen": "apri",
26
32
  "shell.searchClose": "chiudi",
27
- "shell.appearance": "Aspetto",
33
+ "shell.interface": "Interfaccia",
28
34
  "shell.editor": "Editor",
29
35
  "shell.connection": "Connessione",
30
36
  "shell.media": "Media",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Modifica del corpo dell’articolo",
45
51
  "shell.sidebar": "Barra laterale",
46
52
  "shell.inlinePreview": "Anteprima con modifica diretta",
47
- "shell.editorExperienceHint": "L’anteprima con modifica diretta permette di fare clic sul corpo di un articolo e scrivere direttamente nella pagina. Gli altri campi restano nella barra laterale. Questa preferenza viene salvata in questo browser; per salvare i contenuti devi comunque premere Salva.",
53
+ "shell.editorExperienceHint": "L’anteprima con modifica diretta permette di fare clic sui testi formattati collegati e scrivere direttamente nella pagina. I campi senza collegamento all’anteprima restano nella barra laterale. Questa preferenza viene salvata in questo browser; per salvare i contenuti devi comunque premere Salva.",
48
54
  "shell.githubAccount": "Account GitHub",
49
55
  "shell.noGithubAccount": "Nessun account GitHub collegato.",
50
56
  "shell.repository": "Repository",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "プレビューで記事本文を編集",
51
51
  "fields.loadingPreview": "プレビューを読み込み中…",
52
52
  "fields.editArticleBodyHint": "プレビューの記事本文をクリックすると編集できます。コンテンツの変更には保存が必要です。",
53
+ "fields.editRichText": "プレビューで編集",
54
+ "fields.editRichTextHint": "プレビューのこのテキストをクリックすると編集できます。変更には保存が必要です。",
53
55
  "fields.seoNotSet": "未設定",
54
56
  "fields.seoTooShort": "短すぎます",
55
57
  "fields.seoTooLong": "長すぎます",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "検索するコンテンツの言語",
3
+ "shell.searchScopeDefault": "サイトの既定値({scope})",
4
+ "shell.searchScopeAll": "すべての言語",
5
+ "shell.searchScopeCurrent": "現在のコンテンツ言語",
2
6
  "shell.coreCategory": "基本",
7
+ "shell.searchPages": "ページを検索",
8
+ "shell.searchNamedEntries": "{name}内を検索",
3
9
  "shell.template": "テンプレート",
4
10
  "shell.chooseTemplate": "テンプレートを選択",
5
11
  "shell.search": "検索",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "移動",
25
31
  "shell.searchOpen": "開く",
26
32
  "shell.searchClose": "閉じる",
27
- "shell.appearance": "外観",
33
+ "shell.interface": "インターフェース",
28
34
  "shell.editor": "エディター",
29
35
  "shell.connection": "接続",
30
36
  "shell.media": "メディア",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "記事本文の編集",
45
51
  "shell.sidebar": "サイドバー",
46
52
  "shell.inlinePreview": "インラインプレビュー",
47
- "shell.editorExperienceHint": "インラインプレビューでは、記事本文をクリックしてページ上で直接編集できます。他のフィールドはサイドバーに表示されます。この設定はこのブラウザーに保存されますが、コンテンツには引き続き「保存」が必要です。",
53
+ "shell.editorExperienceHint": "インラインプレビューでは、プレビューに紐づいたリッチテキストをクリックしてページ上で直接編集できます。プレビューに紐づかないフィールドはサイドバーに表示されます。この設定はこのブラウザーに保存されますが、コンテンツには引き続き「保存」が必要です。",
48
54
  "shell.githubAccount": "GitHubアカウント",
49
55
  "shell.noGithubAccount": "GitHubアカウントが接続されていません。",
50
56
  "shell.repository": "リポジトリ",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "Artikeltekst in het voorbeeld bewerken",
51
51
  "fields.loadingPreview": "Voorbeeld laden…",
52
52
  "fields.editArticleBodyHint": "Klik op de artikeltekst in het voorbeeld om deze te bewerken. Wijzigingen in de inhoud moeten worden opgeslagen.",
53
+ "fields.editRichText": "Bewerken in het voorbeeld",
54
+ "fields.editRichTextHint": "Klik op deze tekst in het voorbeeld om deze te bewerken. Wijzigingen moeten worden opgeslagen.",
53
55
  "fields.seoNotSet": "Niet ingesteld",
54
56
  "fields.seoTooShort": "Te kort",
55
57
  "fields.seoTooLong": "Te lang",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Inhoudstalen doorzoeken",
3
+ "shell.searchScopeDefault": "Websitestandaard ({scope})",
4
+ "shell.searchScopeAll": "Alle talen",
5
+ "shell.searchScopeCurrent": "Huidige inhoudstaal",
2
6
  "shell.coreCategory": "Standaard",
7
+ "shell.searchPages": "Pagina’s zoeken",
8
+ "shell.searchNamedEntries": "Zoeken in {name}",
3
9
  "shell.template": "Sjabloon",
4
10
  "shell.chooseTemplate": "Kies een sjabloon",
5
11
  "shell.search": "Zoeken",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "navigeren",
25
31
  "shell.searchOpen": "openen",
26
32
  "shell.searchClose": "sluiten",
27
- "shell.appearance": "Weergave",
33
+ "shell.interface": "Interface",
28
34
  "shell.editor": "Editor",
29
35
  "shell.connection": "Verbinding",
30
36
  "shell.media": "Media",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Artikeltekst bewerken",
45
51
  "shell.sidebar": "Zijbalk",
46
52
  "shell.inlinePreview": "Inline voorbeeld",
47
- "shell.editorExperienceHint": "Met het inline voorbeeld kun je op een artikeltekst klikken en direct op de pagina schrijven. Andere velden blijven in de zijbalk. Deze voorkeur wordt in deze browser opgeslagen; inhoud moet je nog steeds opslaan met Opslaan.",
53
+ "shell.editorExperienceHint": "Met het inline voorbeeld kun je op gekoppelde rich text klikken en direct op de pagina schrijven. Velden zonder koppeling met het voorbeeld blijven in de zijbalk. Deze voorkeur wordt in deze browser opgeslagen; inhoud moet je nog steeds opslaan met Opslaan.",
48
54
  "shell.githubAccount": "GitHub-account",
49
55
  "shell.noGithubAccount": "Er is geen GitHub-account gekoppeld.",
50
56
  "shell.repository": "Repository",
@@ -52,6 +52,8 @@
52
52
  "fields.editArticleBody": "Редактировать текст статьи в предпросмотре",
53
53
  "fields.loadingPreview": "Загрузка предпросмотра…",
54
54
  "fields.editArticleBodyHint": "Нажмите на текст статьи в предпросмотре, чтобы редактировать его. Изменения содержимого нужно сохранить.",
55
+ "fields.editRichText": "Редактировать в предпросмотре",
56
+ "fields.editRichTextHint": "Нажмите на этот текст в предпросмотре, чтобы редактировать его. Изменения нужно сохранить.",
55
57
  "fields.seoNotSet": "Не задано",
56
58
  "fields.seoTooShort": "Слишком коротко",
57
59
  "fields.seoTooLong": "Слишком длинно",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "Языки содержимого для поиска",
3
+ "shell.searchScopeDefault": "По умолчанию на сайте ({scope})",
4
+ "shell.searchScopeAll": "Все языки",
5
+ "shell.searchScopeCurrent": "Текущий язык содержимого",
2
6
  "shell.coreCategory": "Основные",
7
+ "shell.searchPages": "Поиск страниц",
8
+ "shell.searchNamedEntries": "Поиск в {name}",
3
9
  "shell.template": "Шаблон",
4
10
  "shell.chooseTemplate": "Выберите шаблон",
5
11
  "shell.search": "Поиск",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "перемещение",
25
31
  "shell.searchOpen": "открыть",
26
32
  "shell.searchClose": "закрыть",
27
- "shell.appearance": "Оформление",
33
+ "shell.interface": "Интерфейс",
28
34
  "shell.editor": "Редактор",
29
35
  "shell.connection": "Подключение",
30
36
  "shell.media": "Медиафайлы",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "Редактирование текста статьи",
45
51
  "shell.sidebar": "Боковая панель",
46
52
  "shell.inlinePreview": "Прямо в предпросмотре",
47
- "shell.editorExperienceHint": "Этот режим позволяет нажать на текст статьи и редактировать его прямо на странице. Остальные поля остаются на боковой панели. Настройка сохраняется в этом браузере; для сохранения содержимого по-прежнему нужно нажать «Сохранить».",
53
+ "shell.editorExperienceHint": "Этот режим позволяет нажать на связанный форматированный текст и редактировать его прямо на странице. Поля без привязки к предпросмотру остаются на боковой панели. Настройка сохраняется в этом браузере; для сохранения содержимого по-прежнему нужно нажать «Сохранить».",
48
54
  "shell.githubAccount": "Учётная запись GitHub",
49
55
  "shell.noGithubAccount": "Учётная запись GitHub не подключена.",
50
56
  "shell.repository": "Репозиторий",
@@ -50,6 +50,8 @@
50
50
  "fields.editArticleBody": "在预览中编辑文章正文",
51
51
  "fields.loadingPreview": "正在加载预览…",
52
52
  "fields.editArticleBodyHint": "点击预览中的文章正文即可编辑。内容更改后需保存。",
53
+ "fields.editRichText": "在预览中编辑",
54
+ "fields.editRichTextHint": "点击预览中的这段文字即可编辑。更改后需保存。",
53
55
  "fields.seoNotSet": "未设置",
54
56
  "fields.seoTooShort": "过短",
55
57
  "fields.seoTooLong": "过长",
@@ -1,5 +1,11 @@
1
1
  {
2
+ "shell.searchScope": "搜索内容语言",
3
+ "shell.searchScopeDefault": "网站默认({scope})",
4
+ "shell.searchScopeAll": "所有语言",
5
+ "shell.searchScopeCurrent": "当前内容语言",
2
6
  "shell.coreCategory": "基础",
7
+ "shell.searchPages": "搜索页面",
8
+ "shell.searchNamedEntries": "在{name}中搜索",
3
9
  "shell.template": "模板",
4
10
  "shell.chooseTemplate": "选择模板",
5
11
  "shell.search": "搜索",
@@ -24,7 +30,7 @@
24
30
  "shell.searchNavigate": "切换",
25
31
  "shell.searchOpen": "打开",
26
32
  "shell.searchClose": "关闭",
27
- "shell.appearance": "外观",
33
+ "shell.interface": "界面",
28
34
  "shell.editor": "编辑器",
29
35
  "shell.connection": "连接",
30
36
  "shell.media": "媒体",
@@ -44,7 +50,7 @@
44
50
  "shell.articleBodyEditing": "文章正文编辑",
45
51
  "shell.sidebar": "侧边栏",
46
52
  "shell.inlinePreview": "行内预览",
47
- "shell.editorExperienceHint": "行内预览让你点击文章正文,直接在页面上编辑。其他字段仍在侧边栏中。此偏好设置保存在当前浏览器中;内容仍需点击“保存”才会保存。",
53
+ "shell.editorExperienceHint": "行内预览让你点击预览中绑定的富文本,直接在页面上编辑。没有预览绑定的字段仍在侧边栏中。此偏好设置保存在当前浏览器中;内容仍需点击“保存”才会保存。",
48
54
  "shell.githubAccount": "GitHub 账号",
49
55
  "shell.noGithubAccount": "未连接 GitHub 账号。",
50
56
  "shell.repository": "仓库",