diff --git a/@webwriter/build/document.js b/@webwriter/build/document.js index 289f1282..09f0324c 100644 --- a/@webwriter/build/document.js +++ b/@webwriter/build/document.js @@ -224,7 +224,7 @@ const themeIDs = memberIDs.filter(id => id.startsWith("./themes/")) const widgetsTemplate = widgetIDs.map(id => widgetMarkdown(pkg, manifest, id)).join("\n\n") -const snippetsTemplate = !snippetIDs.length? "": +const snippetsTemplate = !snippetIDs.length? "": `## Snippets [Snippets](https://webwriter.app/docs/snippets/snippets/) are examples and templates using the package's widgets. @@ -232,7 +232,7 @@ const snippetsTemplate = !snippetIDs.length? "": | :--: | :---------: | ${snippetIDs.map(id => `| ${id.replace("./snippets/", "").replace(".html", "").split("-").map(part => part[0].toUpperCase() + part.slice(1)).join(" ")} | \`${pkg.name + id.slice(1)}\` |`).join("\n")}` -const themesTemplate = !themeIDs.length? "": +const themesTemplate = !themeIDs.length? "": `## Themes [Themes](https://webwriter.app/docs/themes/themes/) are stylesheets to apply to a whole document. @@ -240,12 +240,12 @@ const themesTemplate = !themeIDs.length? "": | :--: | :---------: | ${themeIDs.map(id => `| ${id.replace("./themes/", "")} | ${pkg.name + id.slice(1)} |`).join("\n")}` -const prettyName = +const prettyName = pkg?.editingConfig?.["."]?.label?._ ?? pkg.name.slice(1).split("/")[1].split("-").map(part => part[0].toUpperCase() + part.slice(1)).join(" ") const description = pkg?.editingConfig?.["."]?.description?._ ?? pkg?.description -const template = +const template = `# ${prettyName} (\`${pkg.name}@${pkg.version}\`) [License: ${pkg.license}](LICENSE) | Version: ${pkg.version} diff --git a/@webwriter/core/@webwriter/core/viewmodel/localizationcontroller/localization/generated/locales.ts b/@webwriter/core/@webwriter/core/viewmodel/localizationcontroller/localization/generated/locales.ts new file mode 100644 index 00000000..649f4741 --- /dev/null +++ b/@webwriter/core/@webwriter/core/viewmodel/localizationcontroller/localization/generated/locales.ts @@ -0,0 +1,83 @@ +// Do not modify this file by hand! +// Re-generate this file by running lit-localize. + +/** + * The locale code that templates in this source code are written in. + */ +export const sourceLocale = `en`; + +/** + * The other locale codes that this application is localized into. Sorted + * lexicographically. + */ +export const targetLocales = [ + `ar`, + `bg`, + `cs`, + `da`, + `de`, + `el`, + `es`, + `et`, + `fi`, + `fr`, + `hu`, + `id`, + `it`, + `ja`, + `ko`, + `lt`, + `lv`, + `nb`, + `nl`, + `pl`, + `pt-BR`, + `pt-PT`, + `ro`, + `ru`, + `sk`, + `sl`, + `sv`, + `tr`, + `uk`, + `zh-Hans`, + `zh-Hant`, +] as const; + +/** + * All valid project locale codes. Sorted lexicographically. + */ +export const allLocales = [ + `ar`, + `bg`, + `cs`, + `da`, + `de`, + `el`, + `en`, + `es`, + `et`, + `fi`, + `fr`, + `hu`, + `id`, + `it`, + `ja`, + `ko`, + `lt`, + `lv`, + `nb`, + `nl`, + `pl`, + `pt-BR`, + `pt-PT`, + `ro`, + `ru`, + `sk`, + `sl`, + `sv`, + `tr`, + `uk`, + `zh-Hans`, + `zh-Hant`, +] as const; diff --git a/@webwriter/core/model/marshal/html.ts b/@webwriter/core/model/marshal/html.ts index 72f9a123..4c1cd419 100644 --- a/@webwriter/core/model/marshal/html.ts +++ b/@webwriter/core/model/marshal/html.ts @@ -180,12 +180,12 @@ export async function docToBundle(doc: Node, head: Node, noDeps=false, minify=fa css = "" } else { - const jsUrl = new URL("https://api.webwriter.app/ww/v1/_bundles") + const jsUrl = new URL("https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_bundles") minify && jsUrl.searchParams.append("minify", "true") importIDs.forEach(id => jsUrl.searchParams.append("id", id)) const bundleJS = await (await fetch(jsUrl)).text() js = bundleJS? scopedCustomElementRegistry + ";" + `(function () {${bundleJS}})();`: "" - const cssUrl = new URL("https://api.webwriter.app/ww/v1/_bundles") + const cssUrl = new URL("https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_bundles") cssUrl.searchParams.append("pkg", "true") cssUrl.searchParams.append("type", "css") minify && cssUrl.searchParams.append("minify", "true") diff --git a/@webwriter/core/model/schemas/package.ts b/@webwriter/core/model/schemas/package.ts index b6bd5aa2..ba27b184 100644 --- a/@webwriter/core/model/schemas/package.ts +++ b/@webwriter/core/model/schemas/package.ts @@ -536,7 +536,8 @@ export class Package { const isWidgetLang = kw.startsWith("widget-lang-") const isWidgetOnlineStatus = ["widget-online", "widget-online-edit", "widget-online-use"].includes(kw) const isWebWriterMarker = kw === "webwriter-widget" - return isProgramme || isField || isWidgetType || isWidgetLang || isWidgetOnlineStatus || isWebWriterMarker + const isAIKeyword = kw === "ww-ai-tested" + return isProgramme || isField || isWidgetType || isWidgetLang || isWidgetOnlineStatus || isWebWriterMarker || isAIKeyword } get nonstandardKeywords() { diff --git a/@webwriter/core/model/schemas/resource/index.ts b/@webwriter/core/model/schemas/resource/index.ts index 2718ea3b..8cc1462b 100644 --- a/@webwriter/core/model/schemas/resource/index.ts +++ b/@webwriter/core/model/schemas/resource/index.ts @@ -1,35 +1,37 @@ -import { z } from "zod"; -import { Schema, Node } from "prosemirror-model"; +import {z} from "zod"; +import {Schema, Node} from "prosemirror-model"; import { - EditorState, - EditorStateConfig, - TextSelection, + EditorState, + EditorStateConfig, + TextSelection, } from "prosemirror-state"; -export { undo, redo } from "prosemirror-history"; + +export {undo, redo} from "prosemirror-history"; import * as marshal from "../../marshal"; -import { Package } from "../.."; +import {Package} from "../.."; import { - basePlugin, - configFromSchemaPlugins, - formPlugin, - phrasingPlugin, - listPlugin, - mathPlugin, - mediaPlugin, - modalPlugin, - stylePlugin, - svgPlugin, - tablePlugin, - textblockPlugin, - widgetPlugin, - canvasPlugin, - deprecatedPlugin, - headingPlugin, - sectionPlugin, - grammarPlugin, + basePlugin, + configFromSchemaPlugins, + formPlugin, + phrasingPlugin, + listPlugin, + mathPlugin, + mediaPlugin, + modalPlugin, + stylePlugin, + svgPlugin, + tablePlugin, + textblockPlugin, + widgetPlugin, + canvasPlugin, + deprecatedPlugin, + headingPlugin, + sectionPlugin, + grammarPlugin, + aiPlugin } from "./plugins"; -import { EditorStateWithHead, headSchema, initialHeadState } from "./head"; +import {EditorStateWithHead, headSchema, initialHeadState} from "./head"; export * from "./plugins"; export * from "./htmlelementspec"; @@ -38,79 +40,80 @@ export * from "./head"; export * as themes from "./themes"; export function createEditorStateConfig(packages: Package[]) { - return configFromSchemaPlugins([ - textblockPlugin(), - headingPlugin(), - mediaPlugin(), - listPlugin(), - sectionPlugin(), - canvasPlugin(), - formPlugin(), - modalPlugin(), - stylePlugin(), - mathPlugin(), - phrasingPlugin(), - svgPlugin(), - // deprecatedPlugin(), - widgetPlugin(packages), - tablePlugin(), - basePlugin(), - grammarPlugin(), - ]); + return configFromSchemaPlugins([ + textblockPlugin(), + headingPlugin(), + mediaPlugin(), + listPlugin(), + sectionPlugin(), + canvasPlugin(), + formPlugin(), + modalPlugin(), + stylePlugin(), + mathPlugin(), + phrasingPlugin(), + svgPlugin(), + // deprecatedPlugin(), + widgetPlugin(packages), + tablePlugin(), + basePlugin(), + grammarPlugin(), + aiPlugin() + ]); } export const defaultConfig = createEditorStateConfig([]); export const createEditorState = ( - { - schema = defaultConfig.schema, - doc = defaultConfig.doc, - selection = defaultConfig.selection, - storedMarks = defaultConfig.storedMarks, - plugins = defaultConfig.plugins, - lang = "en", - }: EditorStateConfig & { lang?: string }, - head?: Node + { + schema = defaultConfig.schema, + doc = defaultConfig.doc, + selection = defaultConfig.selection, + storedMarks = defaultConfig.storedMarks, + plugins = defaultConfig.plugins, + lang = "en", + }: EditorStateConfig & { lang?: string }, + head?: Node ) => { - const resolvedDoc = doc; - let state = EditorState.create({ - selection, - storedMarks, - plugins, - doc: resolvedDoc, - }); - state = state.apply(state.tr.setSelection(TextSelection.atStart(state.doc))); - const head$ = EditorState.create({ - schema: headSchema, - doc: head ?? initialHeadState({ lang }).doc, - }); + const resolvedDoc = doc; + let state = EditorState.create({ + selection, + storedMarks, + plugins, + doc: resolvedDoc, + }); + state = state.apply(state.tr.setSelection(TextSelection.atStart(state.doc))); + const head$ = EditorState.create({ + schema: headSchema, + doc: head ?? initialHeadState({lang}).doc, + }); - return ( - head || lang ? Object.assign(state, { head$ }) : state - ) as EditorStateWithHead; + return ( + head || lang ? Object.assign(state, {head$}) : state + ) as EditorStateWithHead; }; type Format = keyof typeof marshal; const ResourceSchema = z.object({ - url: z.string().url({ message: "Not a valid URL" }), - editorState: z.instanceof(EditorState).or( - z - .object({ - value: z.any(), - schema: z.instanceof(Schema), - }) - .transform(async ({ value, schema }) => { // @ts-ignore - for (const parse of Object.values(marshal).map(({ parse }) => parse)) { - try { - return await parse(value, schema); - } catch (e) { - return z.NEVER; - } - } - return z.NEVER; - }) - ), + url: z.string().url({message: "Not a valid URL"}), + editorState: z.instanceof(EditorState).or( + z + .object({ + value: z.any(), + schema: z.instanceof(Schema), + }) + .transform(async ({value, schema}) => { // @ts-ignore + for (const parse of Object.values(marshal).map(({parse}) => parse)) { + try { + return await parse(value, schema); + } catch (e) { + return z.NEVER; + } + } + return z.NEVER; + }) + ), }); export type Resource = z.infer; diff --git a/@webwriter/core/model/schemas/resource/plugins/ai.css b/@webwriter/core/model/schemas/resource/plugins/ai.css new file mode 100644 index 00000000..7656dc90 --- /dev/null +++ b/@webwriter/core/model/schemas/resource/plugins/ai.css @@ -0,0 +1,121 @@ +/** + * AI Suggestion Styles for ProseMirror AI Plugin. + * Styles for highlighting AI-generated suggestions and their action buttons. + */ + +/* Highlighting of suggested content */ +.ai-suggestion { + background: linear-gradient(90deg, rgba(0, 106, 255, 0.10), rgba(0, 106, 255, 0.06)); + border-left: 3px solid rgba(0, 106, 255, 0.45); + border-radius: 2px; + box-shadow: inset 0 0 0 1px rgba(0,0,0,0.04); +} + +/* Container for badge and buttons */ +.ai-suggestion-buttons { + display: inline-flex; + align-items: center; + padding-left: 8px; + background: rgba(255, 255, 255, 0.85); + border: 1px solid rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08); + border-radius: 999px; + user-select: none; + backdrop-filter: saturate(150%) blur(6px); + margin-left: 8px; +} + +/* AI Badge */ +.ai-badge { + display: inline-flex; + align-items: center; + justify-content: center; + height: 20px; + padding: 0 8px; + margin-right: 8px; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.02em; + text-transform: uppercase; + color: #0B5FFF; + background: rgba(11,95,255,0.05); + border: 1px solid rgba(11,95,255,0.25); + border-radius: 999px; +} + +/* Buttons */ +.ai-btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 0 12px; + border: 1px solid transparent; + background: #f7f8fa; + color: #1f2937; + font-size: 12px; + font-weight: 600; + line-height: 1; + cursor: pointer; + transition: background-color 120ms ease, border-color 120ms ease, box-shadow 120ms ease, transform 80ms ease; + flex: 1; + justify-content: center; + height: 32px; + border-radius: 0; +} + +.ai-btn:hover { background: #eef1f5; } +.ai-btn:active { transform: translateY(0.5px); } +.ai-btn:focus-visible { outline: none; box-shadow: 0 0 0 2px rgba(11,95,255,0.4); } + +/* Primary button: Accept - rounded only on left */ +.ai-accept { + background: #16a34a; + color: white; + box-shadow: 0 1px 2px rgba(22, 163, 74, 0.35), inset 0 -1px 0 rgba(0,0,0,0.05); + border-top-left-radius: 999px; + border-bottom-left-radius: 999px; +} +.ai-accept:hover { background: #149043; } +.ai-accept:focus-visible { box-shadow: 0 0 0 2px rgba(34,197,94,0.45); } + +/* Secondary/Danger button: Reject - rounded only on right */ +.ai-reject { + background: transparent; + color: #dc2626; + border-color: rgba(220, 38, 38, 0.35); + border-top-right-radius: 999px; + border-bottom-right-radius: 999px; +} +.ai-reject:hover { background: rgba(220, 38, 38, 0.06); } +.ai-reject:focus-visible { box-shadow: 0 0 0 2px rgba(220,38,38,0.35); } + +/* Icon base style */ +.ai-icon { + display: inline-block; + width: 1em; + height: 1em; + color: currentColor; + /* Icons via mask so color is inherited */ + background-color: currentColor; +} + +/* Check icon */ +.ai-icon-check { + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat; +} + +/* X icon */ +.ai-icon-x { + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6L6 18M6 6l12 12'/%3E%3C/svg%3E") center / contain no-repeat; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6L6 18M6 6l12 12'/%3E%3C/svg%3E") center / contain no-repeat; +} + +/* Label in button */ +.ai-btn-label { white-space: nowrap; } + +/* Compact on very narrow widths: hide text, show only icons */ +@media (max-width: 420px) { + .ai-btn-label { display: none; } + .ai-btn { padding: 0 8px; } +} diff --git a/@webwriter/core/model/schemas/resource/plugins/ai.ts b/@webwriter/core/model/schemas/resource/plugins/ai.ts new file mode 100644 index 00000000..1e4b1496 --- /dev/null +++ b/@webwriter/core/model/schemas/resource/plugins/ai.ts @@ -0,0 +1,422 @@ +import {SchemaPlugin} from "."; +import {Plugin, PluginKey, Transaction, EditorState} from "prosemirror-state"; +import {Decoration, DecorationSet} from "prosemirror-view"; +import {Slice, Schema} from "prosemirror-model"; +import {ReplaceStep} from "prosemirror-transform"; +import css from "./ai.css?raw" +import {msg} from "@lit/localize"; + +/** + * Represents an AI suggestion with its position and original content. + */ +interface Suggestion { + id: string; + from: number; + to: number; + originalContent: Slice; +} + +/** + * State of the AI plugin, including decorations and suggestions. + */ +interface AIState { + decorations: DecorationSet; + suggestions: Suggestion[]; + didLazyLoad?: boolean; +} + +/** + * Generates a unique ID for a suggestion based on transaction time. + */ +function createSuggestionId(tr: Transaction): string { + return `suggestion-${Date.now()}-${tr.time}`; +} + +// Persistence helpers +const STORAGE_KEY = 'ww-ai-suggestions'; + +/** + * Serialized form of a suggestion for storage. + */ +type SerializedSuggestion = { + id: string; + from: number; + to: number; + originalContent: any; // Slice JSON +}; + +/** + * Data structure for persisted suggestions. + */ +type PersistedData = { + docHash: string; + suggestions: SerializedSuggestion[]; +}; + +/** + * FNV-1a hash implementation for strings (32-bit, hex output). + */ +function hashStringFNV1a(str: string): string { + let h = 0x811c9dc5; + for (let i = 0; i < str.length; i++) { + h ^= str.charCodeAt(i); + h = (h >>> 0) * 0x01000193; + } + return (h >>> 0).toString(16); +} + +/** + * Computes a hash for the document based on its JSON representation. + */ +function computeDocHashJSON(doc: { toJSON: () => any }): string { + try { + const json = JSON.stringify(doc.toJSON()); + return hashStringFNV1a(json); + } catch (_) { + return '0'; + } +} + +/** + * Serializes suggestions for storage. + */ +function serializeSuggestions(suggestions: Suggestion[]): SerializedSuggestion[] { + return suggestions.map(s => ({ + id: s.id, + from: s.from, + to: s.to, + originalContent: s.originalContent.toJSON() + })); +} + +/** + * Deserializes suggestions from storage. + */ +function deserializeSuggestions(schema: Schema, data: SerializedSuggestion[]): Suggestion[] { + return data.map(d => ({ + id: d.id, + from: d.from, + to: d.to, + originalContent: Slice.fromJSON(schema, d.originalContent) + })); +} + +/** + * Saves suggestions to localStorage with document hash. + */ +function saveToLocalStorage(state: EditorState, suggestions: Suggestion[]) { + if (typeof window === 'undefined' || !window.localStorage) { + return; + } + try { + const docHash = computeDocHashJSON(state.doc); + const payload: PersistedData = { + docHash, + suggestions: serializeSuggestions(suggestions) + }; + window.localStorage.setItem(STORAGE_KEY, JSON.stringify(payload)); + } catch { + // Ignore errors + } +} + +/** + * Loads suggestions from localStorage if document hash matches. + */ +function loadFromLocalStorage(state: EditorState): Suggestion[] | null { + if (typeof window === 'undefined' || !window.localStorage) { + return null; + } + try { + const raw = window.localStorage.getItem(STORAGE_KEY); + if (!raw) { + return null; + } + const payload = JSON.parse(raw) as PersistedData; + const currentHash = computeDocHashJSON(state.doc); + const match = payload?.docHash === currentHash; + if (payload && match) { + return deserializeSuggestions(state.schema, payload.suggestions); + } + return null; + } catch { + return null; + } +} + +/** + * Creates decorations for a single suggestion, including inline/node decorations and action buttons. + */ +function createDecorationsForSuggestion(doc: any, suggestion: Suggestion): Decoration[] { + const {id, from, to} = suggestion; + const $from = doc.resolve(from); + const $to = doc.resolve(to); + const isSingleTextblockRange = $from.sameParent($to) && $from.parent.isTextblock && from !== to; + + const decos: Decoration[] = []; + + if (isSingleTextblockRange) { + const decoInline = Decoration.inline(from, to, { + class: "ai-suggestion", + "data-suggestion-id": id, + }, {id}); + decos.push(decoInline); + } else { + doc.nodesBetween(from, to, (node: any, pos: number) => { + if (node.isBlock) { + const decoId = `${id}-${pos}`; + const decoNode = Decoration.node(pos, pos + node.nodeSize, { + class: "ai-suggestion", + "data-suggestion-id": decoId, + }, {id: decoId}); + decos.push(decoNode); + return false; + } + return true; + }); + } + + const isTopLevel = $from.depth === 0; + const widgetPos = isTopLevel ? to : $to.after($from.depth); + + const decoWidget = Decoration.widget(widgetPos, () => { + const buttonWrapper = document.createElement('div'); + buttonWrapper.className = 'ai-suggestion-buttons'; + (buttonWrapper as HTMLElement).dataset.suggestionId = id; + + const badge = document.createElement('span'); + badge.className = 'ai-badge'; + badge.textContent = msg('WebWriter AI Suggestion'); + badge.setAttribute('title', msg('WebWriter AI Suggestion')); + + const acceptButton = document.createElement('button'); + acceptButton.type = 'button'; + acceptButton.className = 'ai-btn ai-accept'; + acceptButton.setAttribute('title', msg('Accept suggestion')); + acceptButton.setAttribute('aria-label', msg('Accept suggestion')); + (acceptButton as HTMLElement).dataset.action = 'accept'; + acceptButton.innerHTML = '' + msg("Accept") + ''; + + const rejectButton = document.createElement('button'); + rejectButton.type = 'button'; + rejectButton.className = 'ai-btn ai-reject'; + rejectButton.setAttribute('title', msg('Reject suggestion')); + rejectButton.setAttribute('aria-label', msg('Reject suggestion')); + (rejectButton as HTMLElement).dataset.action = 'reject'; + rejectButton.innerHTML = '' + msg("Reject") + ''; + + buttonWrapper.appendChild(badge); + buttonWrapper.appendChild(acceptButton); + buttonWrapper.appendChild(rejectButton); + return buttonWrapper; + }, { + id: id, + key: id, + side: 1 + }); + + return [...decos, decoWidget]; +} + +/** + * Normalizes suggestions by removing duplicates and nested ones. + */ +function normalizeSuggestions(suggestions: Suggestion[]): Suggestion[] { + if (suggestions.length <= 1) { + return suggestions; + } + + const toRemoveIds = new Set(); + for (let i = 0; i < suggestions.length; i++) { + const a = suggestions[i]; + for (let j = 0; j < suggestions.length; j++) { + if (i === j) continue; + const b = suggestions[j]; + + // If ranges are identical, keep the first one + if (a.from === b.from && a.to === b.to) { + if (i < j) { + toRemoveIds.add(b.id); + } + continue; + } + + // Remove nested suggestions + if (a.from <= b.from && a.to >= b.to) { + toRemoveIds.add(b.id); + } + } + } + + if (toRemoveIds.size > 0) { + return suggestions.filter(s => !toRemoveIds.has(s.id)); + } + + return suggestions; +} + +export const aiPluginKey = new PluginKey('ai'); + +/** + * Creates the AI plugin for managing suggestions. + */ +export const aiPlugin = () => ({ + plugin: new Plugin({ + key: aiPluginKey, + state: { + init(_config, editorState): AIState { + const loaded = loadFromLocalStorage(editorState); + if (loaded && loaded.length) { + const allDecos: Decoration[] = loaded.flatMap(s => createDecorationsForSuggestion(editorState.doc, s)); + return { + decorations: DecorationSet.create(editorState.doc, allDecos), + suggestions: loaded, + didLazyLoad: true, + }; + } + return { + decorations: DecorationSet.empty, + suggestions: [], + didLazyLoad: false, + }; + }, + apply(tr, state, _oldState, newState): AIState { + let {suggestions, decorations} = state; + let didLazyLoad = state.didLazyLoad ?? false; + let suggestionsChanged = false; + + const initialSuggestions = [...suggestions]; + + // Identify suggestions deleted by replace steps + const deletedSuggestionIds = new Set(); + if (tr.docChanged) { + tr.steps.forEach(step => { + if (step instanceof ReplaceStep && step.from < step.to) { + suggestions.forEach(suggestion => { + if (suggestion.from >= step.from && suggestion.to <= step.to) { + deletedSuggestionIds.add(suggestion.id); + } + }); + } + }); + } + + // Force re-decoration if content inside suggestion changes + if (tr.docChanged && !suggestionsChanged) { + tr.steps.forEach(step => { + if (step instanceof ReplaceStep) { + const { from, to } = step; + const modifiedSuggestion = suggestions.find(s => from >= s.from && to <= s.to); + if (modifiedSuggestion) { + suggestionsChanged = true; + } + } + }); + } + + // Map suggestions through transaction + if (tr.docChanged) { + suggestions = suggestions.map(suggestion => ({ + ...suggestion, + from: tr.mapping.map(suggestion.from), + to: tr.mapping.map(suggestion.to), + })); + } + + // Filter out deleted or collapsed suggestions + suggestions = suggestions.filter(s => !deletedSuggestionIds.has(s.id) && s.from < s.to); + + // Handle actions (add/remove) + const action = tr.getMeta(aiPluginKey); + if (action) { + if (action.add) { + const {from, to, originalContent} = action.add; + const id = createSuggestionId(tr); + const newSuggestion: Suggestion = {id, from, to, originalContent}; + suggestions.push(newSuggestion); + } else if (action.remove) { + const {id} = action.remove; + suggestions = suggestions.filter(s => s.id !== id); + } + } + + // Normalize suggestions + suggestions = normalizeSuggestions(suggestions); + + // Check if suggestions changed + if (initialSuggestions.length !== suggestions.length || !initialSuggestions.every((s, i) => s.id === suggestions[i]?.id)) { + suggestionsChanged = true; + } + + // Rebuild decorations if needed + if (suggestionsChanged) { + const allDecos = suggestions.flatMap(s => createDecorationsForSuggestion(newState.doc, s)); + decorations = DecorationSet.create(newState.doc, allDecos); + } else if (tr.docChanged) { + decorations = decorations.map(tr.mapping, tr.doc); + } + + // Lazy load if not done yet + if (!didLazyLoad && suggestions.length === 0 && !action) { + const lateLoaded = loadFromLocalStorage(newState); + if (lateLoaded && lateLoaded.length) { + suggestions = lateLoaded; + const allDecos = suggestions.flatMap(s => createDecorationsForSuggestion(newState.doc, s)); + decorations = DecorationSet.create(newState.doc, allDecos); + didLazyLoad = true; + } + } + + // Save to localStorage on changes + if (suggestionsChanged) { + try { + saveToLocalStorage(newState, suggestions); + } catch { + } + } + + return {suggestions, decorations, didLazyLoad}; + } + }, + props: { + decorations(state) { + return aiPluginKey.getState(state)?.decorations || DecorationSet.empty; + }, + handleDOMEvents: { + click: (view, event: MouseEvent) => { + const target = event.target as HTMLElement; + const buttonEl = target.closest('button'); + const wrapper = target.closest('.ai-suggestion-buttons'); + if (!buttonEl || !wrapper) return false; + + const suggestionId = wrapper.dataset.suggestionId; + if (!suggestionId) return false; + + const aiState = aiPluginKey.getState(view.state); + const suggestion = aiState?.suggestions.find(s => s.id === suggestionId); + if (!suggestion) return false; + + const action = (buttonEl as HTMLButtonElement).dataset.action || buttonEl.textContent?.trim().toLowerCase(); + + if (action === 'accept' || action === 'annehmen') { + const tr = view.state.tr.setMeta(aiPluginKey, {remove: {id: suggestionId}}); + setTimeout(() => view.dispatch(tr), 0); + return true; + } + + if (action === 'reject' || action === 'verwerfen') { + const {from, to, originalContent} = suggestion; + const tr = view.state.tr.replaceWith(from, to, originalContent.content); + tr.setMeta('addToHistory', false); + tr.setMeta(aiPluginKey, {remove: {id: suggestionId}}); + view.dispatch(tr); + return true; + } + + return false; + } + } + } + }), + styles: [css] +} as SchemaPlugin); diff --git a/@webwriter/core/model/schemas/resource/plugins/index.ts b/@webwriter/core/model/schemas/resource/plugins/index.ts index 07378bb5..57d51583 100644 --- a/@webwriter/core/model/schemas/resource/plugins/index.ts +++ b/@webwriter/core/model/schemas/resource/plugins/index.ts @@ -104,3 +104,4 @@ export * from "./table"; export * from "./textblock"; export * from "./widget"; export * from "./grammar"; +export * from "./ai"; diff --git a/@webwriter/core/model/stores/aistore.ts b/@webwriter/core/model/stores/aistore.ts new file mode 100644 index 00000000..763adf21 --- /dev/null +++ b/@webwriter/core/model/stores/aistore.ts @@ -0,0 +1,876 @@ +import {DOMParser} from "prosemirror-model"; +import {App, ProsemirrorEditor} from "#view"; +import {Node as ProseMirrorNode} from "prosemirror-model"; +import {aiPluginKey} from "../../model/schemas/resource/plugins/ai"; +import {renderToString as latexToMathML} from "temml/dist/temml.cjs" +import {msg} from "@lit/localize"; + +/** + * Transforms LaTeX components in the given HTML string by converting elements to MathML. + * This function parses the HTML, finds all tags, converts their LaTeX content to MathML using latexToMathML, + * and replaces the elements in place. If conversion fails, it falls back to a span with an error class. + * + * @param {string} html - The HTML string containing elements to transform. + * @returns {string} The transformed HTML string with elements replaced by MathML. + */ +export function transformLatexComponents(html: string): string { + if (!html) return html; + + // Using a container element to parse the HTML + const container = document.createElement('div'); + container.innerHTML = html; + + // Find all elements and replace them + const latexEls = Array.from(container.querySelectorAll('latex')); + + // Process each element + latexEls.forEach(el => { + + // Extract LaTeX content and convert to MathML + const latex = el.textContent || ''; + let mathml = ''; + try { + mathml = latexToMathML(latex); + } catch (e) { + console.error('Error converting LaTeX to MathML:', e); + // Fallback: keep the original LaTeX in case of error + mathml = `${latex}`; + } + + // Replace element with MathML + const frag = document.createElement('div'); + frag.innerHTML = mathml; + const parent = el.parentNode; + if (parent) { + while (frag.firstChild) parent.insertBefore(frag.firstChild, el); + parent.removeChild(el); + } + }); + + return container.innerHTML; +} + +/** + * Custom error class for unauthorized access to the AI service. + */ +export class UnauthorizedError extends Error { + status: number; + + constructor(message = "Unauthorized", status = 401) { + super(message); + this.name = "UnauthorizedError"; + this.status = status; + Object.setPrototypeOf(this, UnauthorizedError.prototype); + } +} + +// WebWriter AI System Prompt +export const PROMPT = ` +You are the writing assistant in the application WebWriter. In general, you should be helpful, friendly, and professional. The application WebWriter is a writing tool that allows users to create and edit interactive documents or explorables. It is your task to help the user with their writing tasks. You can answer questions, provide suggestions, and assist with various writing-related tasks. You may not answer any questions on the UI or technical aspects. You should only focus on writing-related tasks. You should not provide any personal opinions or engage in discussions that are not related to writing tasks. If the request of the user is not writing-related, politely inform the user that you are not able to help with that and suggest to ask a human or another AI for help. You should respond in the language of the user, which is determined by the language of the input text. + +The document content is given and written in HTML format. Besides the default HTML tags, there are some custom tags that are used to create interactive elements. These tags are custom web components that are registered in the application, you MAY NOT load or request them in any way. You MUST request the documentation for these custom tags before using any of them. Make sure to use the exact name with the correct "@organization/widget" syntax for the request. Make sure to only use them as specified in the documentation and snippets and only use elements standalone if they are meant to be used standalone, indicated by the 'uninsertable' property. You MUST follow the rules on how the custom elements might be used regarding nesting. Towards, the user, refer to them as "widgets". You may not use any custom attributes or properties that are not supported by the custom widgets. You cannot install widgets, but you can suggest that the user install them, and then they will be available for you as well. + +You are not allowed to create any HTML that has capabilities beyond the ones provided by these custom widgets except basic HTML tags like p, h1, h2, span, etc. You can use these basic HTML tags to structure the content. For bold formatting, use the b tag; do not use the strong tag. WebWriter displays formulas using the MathML syntax. You MUST use the [formular] to insert any formulas. When modifying the document, the latex tags will be automatically replaced with the corresponding MathML to be used in the document. You MAY NOT use the name in the correspondence with the user; it only refers to an internal shortcut for you to simplify the insertion of formulas. You MAY NOT replace MathML with the same content latex – that will not change the document. You MAY NOT share such internal details like the tag with the user. Do not use other ways of inserting mathematical formulars. + +Make sure to always insert the content in the location that makes most sense for the content. If there is uncertainty where the user would want the content, you MUST ask the user for clarification. Many types of content do not make sense to be inserted at the bottom of the document, so you SHOULD NOT do that unless the user explicitly asks for it. If the document is empty, insert the content at the bottom of the document. + +Towards the user, you are not allowed to give any technical details on how the content is created or managed. You MAY NOT share any kind of code with the user directly, you may only suggest changes to the document. Through the use of the provided functions, your changes are inserted as suggestions that can be easily accepted or rejected by the user. You MAY NOT try to remove or suggest to remove the suggestions from the content. In the messages towards the user, you may NOT use any HTML, just markdown for formatting. You are only allowed to use HTML in the content you provide to the functions. + +When the user's request requires many small changes or edits to the document, you should try to consolidate them into a single change that achieves the same goal. This is to minimize the number of changes and make it easier for the user to review and accept them. As larger suggestions are more annoying to review and accept, you should try to keep your suggestions as small as possible while still achieving the user's goal in time. + +Before doing any generation or manipulation, you must be sure that you understood the user's request correctly and that you have all the necessary information to proceed. If you are unsure, ask the user for clarification. Be proactive and do not overcomplicate the users requests. If it is likely that the user is referring to any content in the document, make sure to understand the document. When suggesting any changes, give the user a clear and concise explanation of what you are doing and why. + +Always be proactive to help the user with their writing tasks. If you see an opportunity to improve the content or suggest a better way to achieve the user's goal, do so. However, always respect the user's choices and preferences. If you see the opportunity to make relevant suggestions, do so but always ask for the user's permission before making any changes. Respond with at most a few sentences, keep your responses concise and to the point. Do not delay, procrastinate or waste time, always try to help the user as quickly as possible and be efficient in your responses and actions. + +If there is uncertainty that your results would meet the expectations of the user, break down the aspects that are critical for the quality of the result and ask the user for his/her preference. This will help you to ensure that you are on the right track and that the user is satisfied with the results. + +` +// Tool definitions for the AI to use in the OpenAI function calling format +const toolDefinitions = [ + { + type: "function", + function: { + name: "insert_at_bottom", + description: "Insert some html at the bottom of the document", + parameters: { + type: "object", + properties: { + content: { + type: "string", + description: "The html to insert at the bottom of the document" + }, + }, + required: ["content"] + } + } + }, + { + type: "function", + function: { + name: "replace_in_document", + description: "Replace part of the document with new content based on a CSS selector", + parameters: { + type: "object", + properties: { + query: { + type: "string", + description: "The CSS selector for the element of the document to be replaced with the new content. If the query matches multiple elements, the first one will be replaced. Only elements within the document body are considered. The query should be a valid CSS selector that matches an element in the document." + }, + newContent: { + type: "string", + description: "The new HTML content to replace the matched element with. This should be a valid HTML string." + }, + }, + required: ["query", "newContent"] + } + } + }, + { + type: "function", + function: { + name: "fetch_widget_documentation", + description: "Fetch the documentation for a specific widget", + parameters: { + type: "object", + properties: { + widget_name: { + type: "string", + description: "The name of the widget to request documentation for" + }, + }, + required: ["widget_name"] + } + } + }, + { + type: "function", + function: { + name: "get_list_of_installable_widgets", + description: "Get a list of all installable widgets with their name and description. This is useful for suggesting widgets to the user that they might want to install. ", + parameters: { + type: "object", + properties: {}, + required: [] + } + } + }, + { + type: "function", + function: { + name: "insert_into_element", + description: "Insert some HTML at the end of the innerHTML of a selected element in the document. This is useful for adding content to specific parts of the document without relying on a replace operation. ", + parameters: { + type: "object", + properties: { + query: { + type: "string", + description: "The CSS selector for the element of the document to insert the content into. If the query matches multiple elements, the first one will be used." + }, + content: { + "type": "string", + "description": "The HTML to insert into the selected element, which MUST be a VALID HTML string. DO NOT USE HTML THAT IS NOT VALID BY ITSELF. This content will be appended to the end of the innerHTML of the selected element. ", + }, + }, + required: ["query", "content"] + } + } + } +]; + +// Friendly names for the tools to be displayed in the UI +export const toolFriendlyNames = { + "insert_at_bottom": msg("Insert content..."), + "fetch_widget_documentation": msg("Read widget documentation..."), + "replace_in_document": msg("Replace content..."), + "insert_into_element": msg("Insert into element..."), + "get_list_of_installable_widgets": msg("Get list of installable widgets...") +} + +/** + * Replace the content in the given range with newContent as a suggestion instead of directly applying the change. + * + * @param view Wrapper of the Editor View + * @param from Start Position + * @param to End Position + * @param newContent New Content to be suggested + */ +export function suggestChange(view: ProsemirrorEditor | any, from: number, to: number, newContent: ProseMirrorNode | ProseMirrorNode[]) { + const state = (view as any).state; + + // Save the original content (even if from==to, results in an empty slice) + const originalContent = state.doc.slice(from, to); + + // Replace/insert content + let tr = state.tr.replaceWith(from, to, newContent); + + // Calculate new end position + const newContentSize = Array.isArray(newContent) + ? newContent.reduce((size, node) => size + node.nodeSize, 0) + : newContent.nodeSize; + const newTo = from + newContentSize; + + // Metadata for AI plugin + tr = tr.setMeta(aiPluginKey, { + add: { + from, + to: newTo, + originalContent + } + }); + tr = tr.setMeta('addToHistory', false); + + (view as any).dispatch(tr); +} + +/** + * Generates a list of installed modules in the format "name: description". + * @param app - The application instance. + * @returns A string containing the list of installed modules. + */ +export function generateListOfInstalledWidgets(app: App) { + return app.store.packages.installed.map(p => p.name + ": " + p.description).join("\n"); +} + +/** + * Finds the corresponding ProseMirror node and its start position from a given DOM node. + * @param view - The ProseMirror editor view. + * @param domNode - The DOM node to find the corresponding ProseMirror node for. + * @returns An object containing the node and startPos, or null if not found. + */ +function findNodeAndPosFromDOM(view: ProsemirrorEditor, domNode: Node): { + node: any, + startPos: number +} | null { + // Normalize text nodes to their parent element + if (domNode.nodeType === Node.TEXT_NODE && domNode.parentNode) { + domNode = domNode.parentNode; + } + + // 1) Primary: Determine position and traverse upwards + let innerPos: number | null = null; + try { + innerPos = (view as any).posAtDOM(domNode, 0, -1); + } catch { + } + + if (innerPos != null) { + const $pos = (view as any).state.doc.resolve(innerPos); + for (let depth = $pos.depth; depth >= 1; depth--) { + const startPos = $pos.before(depth); + const dom = (view as any).nodeDOM(startPos) as Node | null; + if (dom && (dom === domNode || dom.contains(domNode) || domNode.contains(dom))) { + const node = $pos.node(depth); + return {node, startPos}; + } + } + } + + // 2) Fallback: Determine position BEFORE domNode + const parent = domNode.parentNode; + if (!parent) return null; + const index = Array.prototype.indexOf.call(parent.childNodes, domNode); + if (index < 0) return null; + + let posBefore: number; + try { + posBefore = (view as any).posAtDOM(parent, index, -1); + } catch { + return null; + } + const $before = (view as any).state.doc.resolve(posBefore); + const nodeAfter = $before.nodeAfter as any; + if (nodeAfter) { + return {node: nodeAfter, startPos: posBefore}; + } + + return null; +} + +/** + * Generates documentation for a specific widget by fetching its README, custom elements, and snippets. + * @param app - The application instance. + * @param name - The name of the widget. + * @returns A promise that resolves to a JSON string containing the widget documentation. + */ +export async function generateWidgetDocumentation(app: App, name: string): Promise { + const pkg = app.store.packages.installed.find(p => p.name === name); + + if (!pkg) { + // If the package is not found, return an error message + return JSON.stringify({error: `Widget with name ${name} not installed.`}); + } + + const installedWidgetUrl = app.store.packages.packetApiBaseUrl(pkg); + + + // Fetch the README file from the package's CDN path + const readmePath = `${installedWidgetUrl}/README.md`; + let readmeContent = ""; + try { + const readmeResponse = await fetch(readmePath); + if (!readmeResponse.ok) { + throw new Error(`Failed to fetch README from ${readmePath}`); + } + readmeContent = await readmeResponse.text(); + readmeContent = readmeContent.includes("@webwriter/build") ? "No relevant README available for this widget." : readmeContent; + + } catch (error) { + console.info(`Error fetching README from ${readmePath}:`, error); + readmeContent = "No README available for this widget."; + } + + const customElements = []; + try { + const customElementsRequest = await fetch(`${installedWidgetUrl}/custom-elements.json`); + if (!customElementsRequest.ok) { + throw new Error(`Failed to fetch custom-elements.json from ${installedWidgetUrl}/custom-elements.json`); + } + const customElementsData = await customElementsRequest.json(); + + // Transform the raw declarations into a simplified object structure containing only + // the information needed to use the elements (safe access to optional fields). + const simplified = (customElementsData.modules || []) + .flatMap((m: any) => m.declarations || []) + .map((decl: any) => { + const attributes = (decl.attributes || []).map((a: any) => ({ + name: a.name || null, + type: (a.type && (a.type.text || a.type.name)) || null, + description: a.description || null, + default: a.default || null, + })); + + const slots = (decl.slots || []).map((s: any) => ({ + name: s.name || 'default', + description: s.description || null, + })); + + const events = (decl.events || []).map((e: any) => ({ + name: e.name || null, + description: e.description || null, + type: (e.type && (e.type.text || e.type.name)) || null, + })); + + return { + tagName: decl.tagName || decl.name || null, + name: decl.name || null, + description: decl.description || null, + summary: decl.summary || null, + deprecated: decl.deprecated || false, + attributes, + slots, + events, + source: decl.source || null, + }; + }); + + customElements.push(...simplified); + } catch (e) { + console.info(`Error fetching custom-elements.json from ${installedWidgetUrl}/custom-elements.json`, e); + } + + // Identify snippet paths from the package exports + const snippetPaths = Object.keys(pkg.exports) + .filter(key => key.includes("snippets")) + .map(key => `${installedWidgetUrl}/${pkg.exports[key]}`); + + // Fetch all snippets in parallel + const snippets = await Promise.all(snippetPaths.map(async (snippetPath) => { + try { + const response = await fetch(snippetPath); + if (!response.ok) { + throw new Error(`Failed to fetch snippet from ${snippetPath}`); + } + return await response.text(); + } catch (error) { + console.error(`Error fetching snippet from ${snippetPath}:`, error); + return null; // Return null if the snippet cannot be fetched + } + })); + + const documentation = { + name: pkg.name, + author: pkg.author, + description: pkg.description, + /* editingConfig: pkg.editingConfig, */ + exampleSnippets: snippets.filter(snippet => snippet !== null), // Filter out any null snippets + readme: readmeContent, + customElements + }; + + console.log("Documentation generated for", pkg.name, documentation); + + return JSON.stringify(documentation, null, 2); +} + +export class AIStore { + + chatMessages: { + role: 'user' | 'assistant' | 'system' | 'tool'; + content: string; + timestamp: Date, + isUpdate: boolean, + tool_calls?: any | null + }[] = []; + + // Abort controller for the current in-flight request (if any) + private currentAbortController: AbortController | null = null; + + // When starting a generation we save a snapshot of messages so we can + // restore them if the request is cancelled or if the user retries. + private _snapshotForRetry: typeof this.chatMessages | null = null; + + // Internal flag to indicate cancellation requested + private _cancelled: boolean = false; + + /* The toolResolvers are functions that are called when a tool is requested by the AI, corresponding to the functions defined for the AI above */ + toolResolvers = { + insert_at_bottom: (app: App, {content}: { content: string }) => { + const editor = app.activeEditor?.pmEditor as ProsemirrorEditor | undefined; + + // Ensuring there is an active editor + if (!editor) { + return {success: false, message: 'No active editor available.'}; + } + + // Determine the end position of the document + const endPos = (editor as any).state.doc.content.size; + + // Transform any components to MathML before parsing + content = transformLatexComponents(content); + + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = content; + + // Parse the HTML content into ProseMirror nodes + const parser = DOMParser.fromSchema((editor as any).state.schema); + const slice = parser.parseSlice(tempDiv); + const nodes: ProseMirrorNode[] = []; + for (let i = 0; i < slice.content.childCount; i++) { + nodes.push(slice.content.child(i)!); + } + if (nodes.length === 0) { + return {success: false, message: 'No valid content to insert.'}; + } + + // Suggest change at the end of the document + suggestChange(editor, endPos, endPos, nodes); + + return { + success: true, + message: `HTML content has been suggested at the bottom of the document.`, + }; + }, + get_list_of_installable_widgets: (app: App) => { + return { + success: true, + content: app.store.packages.available.map(p => ({name: p.name, description: p.description})), + } + }, + fetch_widget_documentation: async (app: App, {widget_name}: { widget_name: string }) => { + return { + success: true, + content: await generateWidgetDocumentation(app, widget_name), + } + }, + replace_in_document: (app: App, {query, newContent}: { query: string, newContent: string }) => { + const editor = app.activeEditor?.pmEditor as ProsemirrorEditor | undefined; + if (!editor) { + return {success: false, message: 'No active editor available.'}; + } + + // Special case: replace entire body + if (query.toLowerCase() === 'body') { + const endPos = (editor as any).state.doc.content.size; + const tempDiv = document.createElement('div'); + const transformed = transformLatexComponents(newContent); + tempDiv.innerHTML = transformed; + const parser = DOMParser.fromSchema((editor as any).state.schema); + const slice = parser.parseSlice(tempDiv); + + const nodes: ProseMirrorNode[] = []; + for (let i = 0; i < slice.content.childCount; i++) { + nodes.push(slice.content.child(i)!); + } + + suggestChange(editor, 0, endPos, nodes); + + return { + success: true, + message: `The entire document content has been replaced.`, + }; + } + + // Find the element to replace based on the query + const elementToReplace = (editor as any).dom.querySelector(query) as Element | null; + if (!elementToReplace) { + return {success: false, message: `No element found matching query: ${query}`}; + } + + + // Safe extraction of node and start position + const found = findNodeAndPosFromDOM(editor, elementToReplace); + if (!found) { + return {success: false, message: "Could not find corresponding PM node for DOM element."}; + } + + // Calculate end position + const {node, startPos} = found; + const endPos = startPos + node.nodeSize; + + // Prepare slice and insert as suggestion + const tempDiv = document.createElement('div'); + // Transform any components to MathML before parsing + const transformed = transformLatexComponents(newContent); + tempDiv.innerHTML = transformed; + const parser = DOMParser.fromSchema((editor as any).state.schema); + const slice = parser.parseSlice(tempDiv); + + const nodes: ProseMirrorNode[] = []; + for (let i = 0; i < slice.content.childCount; i++) { + nodes.push(slice.content.child(i)!); + } + + // Suggest the change in the editor + suggestChange(editor, startPos, endPos, nodes); + + return { + success: true, + message: `Element matching query "${query}" has been replaced with new content.`, + }; + }, + insert_into_element: (app: App, {query, content}: { query: string, content: string }) => { + const editor = app.activeEditor?.pmEditor as ProsemirrorEditor | undefined; + if (!editor) { + return {success: false, message: 'No active editor available.'}; + } + + const elementToInsertInto = (editor as any).dom.querySelector(query) as Element | null; + if (!elementToInsertInto) { + return { + success: false, + message: `No element found matching the query: ${query}`, + }; + } + + // Transform any components to MathML before parsing + content = transformLatexComponents(content); + + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = content; + + const parser = DOMParser.fromSchema((editor as any).state.schema); + const slice = parser.parseSlice(tempDiv); + + const nodes: ProseMirrorNode[] = []; + for (let i = 0; i < slice.content.childCount; i++) { + nodes.push(slice.content.child(i)!); + } + + const pos = (editor as any).posAtDOM(elementToInsertInto, elementToInsertInto.childNodes.length); + suggestChange(editor, pos, pos, nodes); + + return { + success: true, + message: `Content suggestion has been created for the selected element.`, + }; + }, + } + + addMessage({role, content, isUpdate = false, timestamp, tool_calls = null}: { + role: 'user' | 'assistant' | 'system' | 'tool'; + content: string; + timestamp: Date; + isUpdate: boolean; + tool_calls?: any | null + }) { + this.chatMessages.push({role, content, isUpdate, timestamp, tool_calls}); + } + + // State on whether a request is currently in progress + loading: boolean = false; + + /** + * Cancel the current in-progress request, if any. Restores the chatMessages + * to the state before the request started and prevents any incoming + * responses from being appended. + */ + cancelRequest(updateCallback?: () => void) { + this._cancelled = true; + try { + this.currentAbortController?.abort(); + } catch (e) { + // ignore + } + + // Restore snapshot if available (remove any messages added during the request) + if (this._snapshotForRetry) { + this.chatMessages = this._snapshotForRetry.slice(); + this._snapshotForRetry = null; + } + + this.loading = false; + if (updateCallback) updateCallback(); + } + + /** + * Retry the last request that failed or was cancelled. Returns the promise + * from generateResponse or undefined if there's nothing to retry. + */ + retryLastRequest(updateCallback: () => void, app: App): Promise | undefined { + if (!this._snapshotForRetry) return undefined; + // Restore messages to snapshot and start generation again + this.chatMessages = this._snapshotForRetry.slice(); + // Clear the snapshot now; generateResponse will set it again at start + this._snapshotForRetry = null; + return this.generateResponse(updateCallback, app); + } + + /** + * Gets whether a retry is available for the last failed or cancelled request. + * @returns True if a snapshot for retry exists, false otherwise. + */ + get canRetry(): boolean { + return !!this._snapshotForRetry; + } + + /** + * Add system messages with the current document state to the chat. + * This method removes any previous system update messages before adding new ones. + * The system prompt is only added once at the beginning of the chat history. + * @param app + */ + addSystemMessages(app: App) { + + // Identify the last message actually displayed to the user (assistant or user role) + const lastAssistantOrUserIndex = [...this.chatMessages].reverse().findIndex(m => m.role === 'user' || m.role === 'assistant'); + + // Remove previous system update messages after that point + const cutoffIndex = lastAssistantOrUserIndex >= 0 + ? this.chatMessages.length - 1 - lastAssistantOrUserIndex + : 0; + + this.chatMessages = this.chatMessages.filter((m, i) => { + if (i <= cutoffIndex) return true; + if (m.role === 'system' && m.isUpdate) return false; + return true; + }); + + // Add the system message with the prompt only if it's not already present at the beginning + const hasSystemPrompt = this.chatMessages.length > 0 && + this.chatMessages[0].role === 'system' && + this.chatMessages[0].content === PROMPT; + + if (!hasSystemPrompt) { + // Insert the system prompt at the beginning + this.chatMessages.unshift({ + role: "system", + content: PROMPT, + timestamp: new Date(), + isUpdate: false, + tool_calls: null + }); + } + + // Add current document state (robust against missing editor) + const editorDom = app.activeEditor?.pmEditor?.dom as HTMLElement | undefined; + const currentHtml = editorDom ? editorDom.innerHTML : ""; + + // Remove any attributes that are too long from the HTML to avoid excessive length + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = currentHtml; + tempDiv.querySelectorAll('*').forEach(el => { + Array.from(el.attributes).forEach(attr => { + if (attr.value.length > 1000) { + el.removeAttribute(attr.name); + } + }); + }); + + this.addMessage({ + role: "system", + content: (currentHtml ? `Current document content:\n\n${tempDiv.innerHTML}` : 'Document empty') + `\n\nList of installed widgets:\n\n${generateListOfInstalledWidgets(app)}`, + timestamp: new Date(), + isUpdate: true, + }); + } + + /** + * Get the authorization header for PocketBase from the app's stored accounts. + * @param app + */ + getAuthHeader(app: App) { + const pocketBaseAccounts = app.store.accounts.accounts.pocketbase; + const name = Object.keys(pocketBaseAccounts)[0]; + const token = pocketBaseAccounts[name]?.token; + if (!token) { + throw new UnauthorizedError("No PocketBase token available"); + } + return `Bearer ${token}`; + } + + /** + * Generates a response from the AI based on the current chat messages. + * Handles tool calls, retries, and updates the chat state. + * @param updateCallback - Callback to update the UI after changes. + * @param app - The application instance. + * @returns A promise that resolves to the AI's response content or undefined if cancelled. + */ + async generateResponse(updateCallback: () => void, app: App): Promise { + this.loading = true; + updateCallback(); + try { + + // Save a snapshot of the chat prior to starting the request so we + // can restore it if the user cancels or if a retry is requested. + this._snapshotForRetry = this.chatMessages.slice(); + + // Reset cancellation state and prepare an AbortController for the fetch + this._cancelled = false; + this.currentAbortController = new AbortController(); + + // Add system messages with current document state + this.addSystemMessages(app); + + let isResponseToHuman = false; + + // Function calling loop only breaking when we have a final response to the user + while (!isResponseToHuman) { + + // If the request has been cancelled before starting fetch, abort + if (this._cancelled) { + // restore snapshot + if (this._snapshotForRetry) this.chatMessages = this._snapshotForRetry.slice(); + return undefined; + } + + const authHeader = this.getAuthHeader(app); + const response = await fetch("https://node1.webwriter.elearn.rwth-aachen.de/api/chat", { + method: "POST", + headers: {"Content-Type": "application/json", "Authorization": authHeader}, + signal: this.currentAbortController?.signal, + body: JSON.stringify({ + messages: this.chatMessages, + tools: toolDefinitions, + tool_choice: "auto", + model: "o4-mini", + max_completion_tokens: 32768, + }), + }); + + // If cancellation happened while the response was in flight, discard + if (this._cancelled) { + if (this._snapshotForRetry) this.chatMessages = this._snapshotForRetry.slice(); + return undefined; + } + + const data = await response.json(); + + if (!response.ok || !data?.success) { + if (response.status === 401) { + throw new UnauthorizedError(); + } + throw new Error(data?.error || `API request failed with status ${response.status}`); + } + + const lastMessage = data?.lastMessage + + // Add the newly generated message to the array + this.addMessage({ + ...lastMessage, timestamp: new Date(), + }); + + // Notify UI of update + updateCallback(); + + // check if the response is a tool call + if (lastMessage["tool_calls"]?.length > 0) { + const toolCalls = lastMessage["tool_calls"] as any[]; + + // For all tool calls, resolve them using the toolResolvers + const resolvedToolCalls = await Promise.all(toolCalls.map(async (toolCall: any) => { + const callFunction = toolCall.function.name as string; + const callArguments = JSON.parse(toolCall.function.arguments || '{}'); + + let result: any = {}; + + try { + const fn = (this.toolResolvers as any)[callFunction]; + if (typeof fn !== 'function') { + result = {success: false, message: `Unknown tool: ${callFunction}`}; + } else { + result = { + success: true, + ...(await fn.apply(this, [app, callArguments])) || {}, + }; + } + } catch (e) { + const err: any = e; + console.error(`Error resolving tool call ${callFunction}:`, e); + result = { + success: false, + message: `Error resolving tool call ${callFunction}: ${err?.message ?? String(e)}`, + }; + } + + return { + role: "tool", + "tool_call_id": toolCall.id, + content: JSON.stringify(result), + timestamp: new Date(), + isUpdate: false, + tool_calls: null, + } + })) + + // If the request was cancelled while resolving tool calls, + // discard the resolved results and restore snapshot. + if (this._cancelled) { + if (this._snapshotForRetry) this.chatMessages = this._snapshotForRetry.slice(); + return undefined; + } + + this.chatMessages = this.chatMessages.concat(resolvedToolCalls); + + // Add system messages for new round of request + this.addSystemMessages(app) + } else { + + /* we have a response without tool requests */ + isResponseToHuman = true; + + updateCallback(); + + // Clear the snapshot on successful completion so retry cannot + // accidentally re-run the same request state. + this._snapshotForRetry = null; + this.currentAbortController = null; + + return this.chatMessages.at(-1)?.content; + } + } + + // if we get here, there must have been a mistake + throw new Error("Unable to generate message") + } catch (e: any) { + // If the fetch was aborted, treat as cancellation and silently restore + if (e && (e.name === 'AbortError' || e.message?.includes('aborted'))) { + // already restored snapshot in cancellation branches above + console.error('AI request was aborted'); + } else if (e instanceof UnauthorizedError) + console.error("Not authorized to use the AI service"); + else + console.error("Error generating AI response", e); + } finally { + this.loading = false; + this.currentAbortController = null; + updateCallback(); + } + } + + /** + * Clears all chat messages from the store. + */ + clearMessages() { + this.chatMessages = []; + } +} diff --git a/@webwriter/core/model/stores/index.ts b/@webwriter/core/model/stores/index.ts index 1281028e..8e011a03 100644 --- a/@webwriter/core/model/stores/index.ts +++ b/@webwriter/core/model/stores/index.ts @@ -1,4 +1,5 @@ export * from "./packagestore" export * from "./documentstore" export * from "./uistore" -export * from "./rootstore" \ No newline at end of file +export * from "./rootstore" +export * from "./aistore" \ No newline at end of file diff --git a/@webwriter/core/model/stores/packagestore.ts b/@webwriter/core/model/stores/packagestore.ts index 09437fa8..cb21c5b4 100644 --- a/@webwriter/core/model/stores/packagestore.ts +++ b/@webwriter/core/model/stores/packagestore.ts @@ -719,6 +719,10 @@ export class PackageStore { return this.apiBase? this.installed.flatMap(pkg => Object.keys(pkg?.widgets ?? {}).flatMap(k => new URL(pkg.id + k.slice(1), this.apiBase).href)): [] } + packetApiBaseUrl(pkg: Packet) { + return this.apiBase ? new URL(pkg.id, this.apiBase).href : null + } + get widgetTagNames() { return Object.entries(filterObject(this.widgets, k => this.installed.some(pkg => pkg.id === k))) .flatMap(([pkgID, widgetConfig]) => Object.keys(widgetConfig)) diff --git a/@webwriter/core/model/stores/rootstore.ts b/@webwriter/core/model/stores/rootstore.ts index b3ee5eef..9f891b48 100644 --- a/@webwriter/core/model/stores/rootstore.ts +++ b/@webwriter/core/model/stores/rootstore.ts @@ -1,6 +1,6 @@ import { ZodSchema } from "zod" -import { Package, PackageStore, DocumentStore, UIStore, createEditorStateConfig } from "#model" +import {Package, PackageStore, DocumentStore, UIStore, createEditorStateConfig, AIStore} from "#model" import { AccountStore } from "#model/stores/accountstore.js" type StoreOptions any> = ConstructorParameters[0] @@ -25,6 +25,7 @@ export class RootStore { document: DocumentStore accounts: AccountStore ui: UIStore + ai: AIStore constructor({corePackages, apiBase, settings, initializePackages}: AllOptions) { const onBundleChange = this.onBundleChange @@ -32,6 +33,7 @@ export class RootStore { this.packages = new PackageStore({...settings?.packages, corePackages, initializePackages, apiBase, resetOnInitialize: this.ui.resetOnInitialize, onBundleChange}) this.accounts = new AccountStore(settings?.accounts?.accounts) this.document = new DocumentStore({...settings?.document, lang: this.ui.locale, defaultAccount: this.accounts.getAccount("file")}, this.accounts) + this.ai = new AIStore(); } onBundleChange = (packages: Package[]) => { diff --git a/@webwriter/core/package.json b/@webwriter/core/package.json index 41f6ebc1..cc8c74d7 100644 --- a/@webwriter/core/package.json +++ b/@webwriter/core/package.json @@ -59,7 +59,7 @@ "langchain": "^0.3.2", "lit": "^3.2.1", "lodash": "^4.17.21", - "marked": "^14.0.0", + "marked": "^14.1.4", "mathml-to-latex": "^1.5.0", "mdn-data": "2.13.0", "mime": "^3.0.0", @@ -122,4 +122,4 @@ "vite": "^6.3.5", "vite-plugin-pwa": "^0.21.1" } -} +} \ No newline at end of file diff --git a/@webwriter/core/view/app/palette/index.style.ts b/@webwriter/core/view/app/palette/index.style.ts index 8507ca94..2d006c97 100644 --- a/@webwriter/core/view/app/palette/index.style.ts +++ b/@webwriter/core/view/app/palette/index.style.ts @@ -707,6 +707,10 @@ import {css} from "lit"; export default css` &.package-locale { background: var(--sl-color-red-100); } + + &.package-ww-ai-tested { + background: var(--sl-color-blue-100); + } } :host(.intro-target) *, .intro-target { diff --git a/@webwriter/core/view/app/palette/index.ts b/@webwriter/core/view/app/palette/index.ts index db174e76..4af34ffa 100644 --- a/@webwriter/core/view/app/palette/index.ts +++ b/@webwriter/core/view/app/palette/index.ts @@ -579,6 +579,18 @@ export class Palette extends LitElement { ` } + PackageAITested(pkg: Package) { + const tested = pkg.keywords?.includes("ww-ai-tested") + if(!tested) { + return undefined + } + + return html` + + ${msg("WebWriter AI Compatible")} + ` + } + PackageWidgetTypes(pkg: Package) { return pkg.widgetTypes?.map(type => { return html` @@ -602,6 +614,7 @@ export class Palette extends LitElement { ${this.PackageFields(pkg)} ${this.PackageOnlineStatus(pkg)} ${this.PackageProgramme(pkg)} + ${this.PackageAITested(pkg)} ${pkg.nonstandardKeywords?.map(kw => this.PackageKeyword(kw))} ` diff --git a/@webwriter/core/view/app/settings/accountform.ts b/@webwriter/core/view/app/settings/accountform.ts index 30a22c1a..49b49fef 100644 --- a/@webwriter/core/view/app/settings/accountform.ts +++ b/@webwriter/core/view/app/settings/accountform.ts @@ -18,7 +18,7 @@ import { filterObject } from "#utility"; export class PocketbaseAccountForm extends LitElement { static get defaults() { return { - url: "https://api.webwriter.app", + url: "https://node1.webwriter.elearn.rwth-aachen.de", email: "", password: "", }; diff --git a/@webwriter/core/view/app/toolbox/ai-widget.ts b/@webwriter/core/view/app/toolbox/ai-widget.ts new file mode 100644 index 00000000..16861014 --- /dev/null +++ b/@webwriter/core/view/app/toolbox/ai-widget.ts @@ -0,0 +1,507 @@ +import {LitElement, css, html} from "lit"; +import {customElement, property} from "lit/decorators.js"; +import {App} from "#view"; +import {toolFriendlyNames} from "#model"; +import {marked} from "marked"; +import {unsafeHTML} from 'lit/directives/unsafe-html.js'; +import {msg} from "@lit/localize"; + + +@customElement("ww-ai-toolbox-widget") +export class AIToolboxWidget extends LitElement { + static styles = css` + .ai-container { + border-radius: 4px; + position: relative; + border: 2px solid var(--sl-color-primary-800); + color: var(--sl-color-primary-800); + width: 100%; + padding: 8px; + } + + .ai-label { + position: absolute; + top: -0.8em; + left: 3px; + background: #f4f4f5; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; + padding: 0 3px; + gap: 3px; + } + + .ai-delete-button { + position: absolute; + right: 0; + top: 0; + background: rgba(244, 244, 245, 0.75); + display: flex; + align-items: center; + justify-content: center; + border-left: 2px solid var(--sl-color-primary-800); + border-bottom: 2px solid var(--sl-color-primary-800); + border-bottom-left-radius: 10px; + width: 30px; + height: 30px; + transition: all 250ms ease-in; + } + + input { + width: 100%; + padding: 8px; + box-sizing: border-box; + } + + .chat-container { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 8px; + max-height: 350px; + overflow-y: auto; + } + + .chat-bubble { + max-width: 70%; + padding: 7px 12px; + border-radius: 16px; + font-size: 0.75rem; + line-height: 1.3; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03); + word-break: break-word; + display: inline-block; + } + + .chat-bubble p { + margin: 0; + margin-bottom: 10px; + } + + .chat-bubble ol { + padding-left: 25px; + } + + .chat-bubble.user { + background: var(--sl-color-neutral-700); + color: white; + align-self: flex-end; + border-bottom-right-radius: 4px; + } + + .chat-bubble.ai { + background: var(--sl-color-primary-700); + color: white; + align-self: flex-start; + border-bottom-left-radius: 4px; + } + + .function-call { + font-size: 0.65rem; + } + + .chat-sender { + font-size: 0.65rem; + font-weight: bold; + margin-bottom: 1px; + opacity: 0.6; + } + + .chat-input-row { + display: flex; + background: #f8fafc; + border-radius: 20px; + align-items: center; + gap: 6px; + margin-top: 4px; + border: 2px solid var(--sl-color-primary-700); + overflow: hidden; + } + + .chat-input { + flex: 1; + /* Platz für den Senden-Button */ + padding: 7px 40px 7px 12px; + resize: none; + border-radius: 18px; + border: none; + font-size: 0.8rem; + outline: none; + background: #f8fafc; + color: var(--sl-color-primary-900); + transition: border-color 0.2s; + } + + .chat-input:focus { + border-color: var(--sl-color-primary-500); + background: #fff; + } + + .send-btn { + background: var(--sl-color-primary-700); + color: #fff; + border: none; + border-top-left-radius: 50%; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: background 0.2s; + } + + .send-btn svg { + width: 16px; + height: 16px; + } + + /* Red variant used for active loading and retry state */ + + .send-btn.red { + background: var(--sl-color-danger-600); + } + + .send-btn[disabled] { + opacity: 0.6; + cursor: not-allowed; + } + + .spinner { + animation: spin 1.4s linear infinite; + /* ensure rotation around center in SVG */ + transform-origin: 50% 50%; + transform-box: fill-box; + } + + .spinner circle { + stroke-linecap: round; + /* draw only a part of the circle and animate it */ + stroke-dasharray: 90 150; + stroke-dashoffset: 0; + animation: dash 1.4s ease-in-out infinite; + } + + .example-prompt { + text-align: left; + background: var(--sl-color-primary-50); + border: 1px solid var(--sl-color-primary-200); + color: var(--sl-color-primary-900); + border-radius: 12px; + padding: 8px 12px; + font-size: 0.75em; + cursor: pointer; + transition: background 0.2s; + line-height: 1.2; + } + + .example-prompt:hover { + background: var(--sl-color-primary-100); + } + + @keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } + + @keyframes dash { + 0% { + stroke-dasharray: 1 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90 200; + stroke-dashoffset: -35px; + } + 100% { + stroke-dasharray: 90 200; + stroke-dashoffset: -124px; + } + } + ` + + @property() + app: App + + constructor() { + super(); + } + + // Handle cancel button click + handleCancel() { + this.app.store.ai.cancelRequest(() => this.requestUpdate()); + } + + // Handle retry button click + handleRetry() { + this.app.store.ai.retryLastRequest(() => this.requestUpdate(), this.app); + + // clean input + const input = this.shadowRoot?.getElementById('chatInput') as HTMLTextAreaElement; + if (input) { + input.value = ""; + } + } + + // Handle send button click or enter key press + async handleSend() { + const input = this.shadowRoot?.getElementById('chatInput') as HTMLTextAreaElement; + if (!input) + return; + + const query = input.value.trim(); + if (!query) + return; + + // Add user message to chat + this.app.store.ai.addMessage({ + timestamp: new Date(), + role: "user", + content: query, + tool_calls: null, + isUpdate: false + }); + + // Render update in AI toolbox + this.requestUpdate() + + // Clear input field + input.value = ""; + + // Generate AI response and provide reqeust update callback + this.app.store.ai.generateResponse(() => this.requestUpdate(), this.app); + } + + handleKeyDown(event: KeyboardEvent) { + if (event.key === "Enter" && !event.shiftKey) { + event.preventDefault(); + this.handleSend(); + } + } + + handleDeleteChat(e) { + // Confirm deletion + if (confirm(msg("Are you sure you want to clear the chat history? This action cannot be undone."))) { + this.handleCancel(); + this.app.store.ai.clearMessages(); + this.requestUpdate(); + } + } + + render() { + // This check makes sure the user is logged in and shows a message if not + if (Object.keys(this.app.store.accounts.accounts.pocketbase).find(k => k.includes("@")) === undefined) { + return html` +
+ + + + ${msg("WebWriter AI")} + +
+ ${msg("To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.")} +
+
+ `; + } + + const loading = this.app.store.ai.loading; + const chatMessages = this.app.store.ai.chatMessages; + const examplePrompts = [ + msg("Create an exercise sheet about ..."), + msg("What task would complement this well?"), + msg("Is my text simple and easy to understand?"), + msg("Which widgets suit my content best?"), + ]; + return html` +
+ + + + ${msg("WebWriter AI")} + + + + ${chatMessages.length > 0 ? html` + + + + ` : null} + + +
+ ${chatMessages.length === 0 ? html` + + +
+ ${examplePrompts.map(prompt => html` + + `)} +
+ + ` : chatMessages.map(chatMessage => { + + // Render different message types + switch (chatMessage.role) { + case "system": + return null; + case "tool": + return null; + case "user": + // Simple user message in a chat bubble + return html` +
+
${msg("You")}
+ ${chatMessage.content} +
+ `; + case "assistant": + + // if it is one or multiple tool calls, rendem them first + const toolsContent = chatMessage["tool_calls"] ? chatMessage["tool_calls"].map((call: any) => { + return html` +
${toolFriendlyNames[call.function.name]}
` + }) : null; + + // then render the content if available + const content = chatMessage.content ? html` +
+
${msg("WebWriter AI")}
+ ${unsafeHTML(marked.parse(chatMessage.content) as string)} +
` : null; + + // Combine both types; unlikely but possible that both tools and content exist + return html`${toolsContent} ${content}`; + } + })} +
+ + +
+ + + + + +
+ ${loading ? html` + + + ` : this.app.store.ai.canRetry ? html` + + + ` : html` + + + `} +
+
+ + + ${msg("WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.")} +
+ `; + } + + // Function to insert example prompt into the input field upon clicking the corresponding button + insertPrompt(prompt: string) { + const input = this.shadowRoot?.getElementById('chatInput') as HTMLTextAreaElement; + if (input) { + input.value = prompt; + input.focus(); + } + } + + // Show detailed info message about AI limitations and usage upon clicking the disclosure link + showInfoMessage() { + const messages = [ + msg("WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications."), + msg("It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing."), + msg("Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them."), + ]; + + alert(messages.join("\n\n")); + } + + // After each update, scroll to the latest message + updated() { + // Scroll chat to the top of the last message + const chatContainer = this.shadowRoot?.getElementById('chatContainer'); + const lastChild = chatContainer?.lastElementChild as HTMLElement; + if (chatContainer && lastChild) { + chatContainer.scrollTo({ + top: lastChild.offsetTop, + behavior: 'smooth' + }); + } + } +} diff --git a/@webwriter/core/view/app/toolbox/index.ts b/@webwriter/core/view/app/toolbox/index.ts index a4fbba16..1fadbcd7 100644 --- a/@webwriter/core/view/app/toolbox/index.ts +++ b/@webwriter/core/view/app/toolbox/index.ts @@ -10,16 +10,18 @@ import { Command, LayoutCommand } from "#viewmodel" import { spreadProps } from "@open-wc/lit-helpers" import { ifDefined } from "lit/directives/if-defined.js" -import { App, URLFileInput, TextPicker, Button } from "#view" -import { AllSelection, EditorState, NodeSelection, TextSelection } from "prosemirror-state" +import { App, URLFileInput, TextPicker } from "#view" +import { AllSelection, EditorState, TextSelection } from "prosemirror-state" import {GapCursor} from "prosemirror-gapcursor" +import {AIToolboxWidget} from "#view/app/toolbox/ai-widget"; // @ts-ignore import {render as latexToMathML} from "temml/dist/temml.cjs" -import { SlColorPicker, SlTextarea, SlTree } from "@shoelace-style/shoelace" -import { CSSPropertySpecs, MATHML_TAGS, Package, PackageStore, TEST_RESULT, TestNode, TestResult } from "#model/index.js" +import { SlColorPicker, SlTree } from "@shoelace-style/shoelace" +import { CSSPropertySpecs, MATHML_TAGS, Package } from "#model/index.js" import { LitPickerElement } from "#view/elements/stylepickers/index.js" import { findParentNodeClosestToPos } from "prosemirror-utils"; import "./widgetoptions" +import "./ai-widget" import styles from "./index.style" import ar from "emoji-picker-element/i18n/ar" @@ -1002,7 +1004,9 @@ export class Toolbox extends LitElement { ${this.BlockToolbox(this.activeElement)} ${this.InlineToolbox()} - emitCustomEvent(this, "ww-close")}> + + emitCustomEvent(this, "ww-close")}> ` } } \ No newline at end of file diff --git a/@webwriter/core/viewmodel/apicontroller/index.service.ts b/@webwriter/core/viewmodel/apicontroller/index.service.ts index ec802941..66c735b2 100644 --- a/@webwriter/core/viewmodel/apicontroller/index.service.ts +++ b/@webwriter/core/viewmodel/apicontroller/index.service.ts @@ -392,7 +392,7 @@ const extensions: any = { } const compiler = new Compiler({wasmURL}) const CDN_URL = "https://cdn.jsdelivr.net/npm/" -const API_URL = "https://api.webwriter.app/ww/v1/" +const API_URL = "https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/" const exactPkgRegEx = /^((?:@[^\/\\%@]+\/)?[^.\/\\%@][^\/\\%@]*)@([^\/]+)(\/.*)?$/ const filesystem: Provider = { @@ -740,10 +740,10 @@ function urlToAction(url: URL, method?: Action["method"], content?: any) { } else if(suffix.startsWith("_snippets")) { collection = "snippets" - // POST https://api.webwriter.app/ww/v1/_snippets/ - // GET https://api.webwriter.app/ww/v1/_snippets/ - // PUT https://api.webwriter.app/ww/v1/_snippets/ - // DELETE https://api.webwriter.app/ww/v1/_snippets/ + // POST https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_snippets/ + // GET https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_snippets/ + // PUT https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_snippets/ + // DELETE https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/_snippets/ } else if(suffix.startsWith("_")) { throw Error(`Unsupported collection type ${suffix}`) @@ -883,7 +883,7 @@ worker.addEventListener("activate", async (e) => { worker.addEventListener("fetch", e => { const url = new URL(e.request.url) let method = e.request.method === "GET"? undefined: e.request.method - const shouldIntercept = url.hostname === "api.webwriter.app" && url.pathname.startsWith("/ww/v1/") + const shouldIntercept = url.hostname === "node1.webwriter.elearn.rwth-aachen.de" && url.pathname.startsWith("/ww/v1/") if(shouldIntercept) { try { const response = getFetchResponse(url, method as any, e.request) as any @@ -902,7 +902,7 @@ worker.addEventListener("error", function(e) { const bundleserviceFetch = (req: RequestInfo | URL, ...args: any[]) => { const url = new URL(req instanceof Request? req.url: req) - const shouldIntercept = url.hostname === "api.webwriter.app" && url.pathname.startsWith("/ww/v1/") + const shouldIntercept = url.hostname === "node1.webwriter.elearn.rwth-aachen.de" && url.pathname.startsWith("/ww/v1/") if(shouldIntercept) { return getFetchResponse(url) } @@ -966,7 +966,7 @@ async function getListPackageIDs(list="https://webwriter.app/webwriter-package-i } } -/** API api.webwriter.app/bundle/ +/** API node1.webwriter.elearn.rwth-aachen.de/bundle/ * GET ·/[Package ID]/[Widget Path] {Accept: [TYPE]} -> widget content/style * GET ·/_bundle?w=[Package ID]/[Widget Path]&w=... {Accept: [TYPE]} -> bundle * GET ·/[Package ID]/package.json -> package diff --git a/@webwriter/core/viewmodel/index.ts b/@webwriter/core/viewmodel/index.ts index 77581dc6..4e594fb3 100644 --- a/@webwriter/core/viewmodel/index.ts +++ b/@webwriter/core/viewmodel/index.ts @@ -75,7 +75,7 @@ export const ViewModelMixin = (cls: LitElementConstructor, isSettings=false) => } this.icons = new IconController(this) const userSettings = await SettingsController.getUserSettings() - this.store = StoreController(new RootStore({settings: userSettings, corePackages: CORE_PACKAGES, initializePackages: true, apiBase: "https://api.webwriter.app/ww/v1/"}), this) + this.store = StoreController(new RootStore({settings: userSettings, corePackages: CORE_PACKAGES, initializePackages: true, apiBase: "https://node1.webwriter.elearn.rwth-aachen.de/ww/v1/"}), this) this.settings = new SettingsController(this, this.store) this.localization = new LocalizationController(this, this.store) this.commands = new CommandController(this as any, this.store) diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/ar.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/ar.xlf index b6fc5d8d..24d8e58e 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/ar.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/ar.xlf @@ -4086,17 +4086,13 @@ لا توجد أنماط محددة متاحة - Select - ... - + Select ... اختر ... - Or drop - here - + Or drop here أو أسقط هنا @@ -4222,10 +4218,7 @@ هذه الكلمة الأساسية مطلوبة للأدوات - Generate a - LICENSE - file - + Generate a LICENSE file إنشاء ترخيص ملف @@ -4284,17 +4277,13 @@ خطأ في الاتصال - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? سيتم حذفها نهائيًا. هل أنت متأكد؟ - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? سيتم الكتابة فوقها. هل أنت متأكد؟ @@ -4324,9 +4313,7 @@ نوع الخاصية غير المدعوم "${desc.type}" (تتم المعالجة كـ JSON) - - is not supported - + is not supported غير مدعوم @@ -4411,6 +4398,87 @@ Update language across document تحديث اللغة عبر المستند + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/bg.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/bg.xlf index e010fe00..d920ac82 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/bg.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/bg.xlf @@ -835,17 +835,13 @@ Улавяне - Select - ... - + Select ... Изберете ... - Or drop - here - + Or drop here Или да отпадне тук @@ -911,10 +907,7 @@ Тази ключова дума е задължителна за джаджите - Generate a - LICENSE - file - + Generate a LICENSE file Генериране на LICENSE файл @@ -1499,18 +1492,14 @@ Грешка при свързването - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? ще бъдат изтрити завинаги. Сигурни ли сте? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? ще бъдат презаписани. Сигурни ли сте? @@ -1549,9 +1538,7 @@ Неподдържан тип на свойството '${desc.type}' (обработва се като JSON) - - is not supported - + is not supported не се поддържа @@ -4420,6 +4407,87 @@ Update language across document Актуализиране на езика в целия документ + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/cs.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/cs.xlf index c2ea6346..b4f634b0 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/cs.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/cs.xlf @@ -834,17 +834,13 @@ Zachycení - Select - ... - + Select ... Vyberte ... - Or drop - here - + Or drop here Nebo upusťte od zde @@ -910,10 +906,7 @@ Toto klíčové slovo je vyžadováno pro widgety. - Generate a - LICENSE - file - + Generate a LICENSE file Vytvořit LICENCE soubor @@ -1497,18 +1490,14 @@ Chyba při připojování - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? budou trvale odstraněny. Jste si jisti? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? budou přepsány. Jste si jisti? @@ -1547,9 +1536,7 @@ Nepodporovaný typ vlastnosti '${desc.type}' (zpracování jako JSON) - - is not supported - + is not supported není podporován @@ -4418,6 +4405,87 @@ Update language across document Aktualizace jazyka v celém dokumentu + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/da.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/da.xlf index 8b5c50a2..fe9db2c5 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/da.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/da.xlf @@ -830,17 +830,13 @@ Indfangning - Select - ... - + Select ... Vælg ... - Or drop - here - + Or drop here Eller aflever her @@ -906,10 +902,7 @@ Dette nøgleord er påkrævet for widgets - Generate a - LICENSE - file - + Generate a LICENSE file Generer en LICENSE fil @@ -1494,18 +1487,14 @@ Fejl ved tilslutning - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? vil blive slettet permanent. Er du sikker på det? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? vil blive overskrevet. Er du sikker på det? @@ -1544,9 +1533,7 @@ Ikke-understøttet egenskabstype '${desc.type}' (behandles som JSON) - - is not supported - + is not supported er ikke understøttet @@ -4419,6 +4406,87 @@ Update language across document Opdater sproget i hele dokumentet + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/de.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/de.xlf index 9880dfd0..78d05855 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/de.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/de.xlf @@ -3106,106 +3106,6 @@ Orient from metadata Bildorientierung aus Metadaten - - Ruby - Ruby - - - Ruby alignment - Ruby-Anordnugn - - - Over - Darüber - - - Inter-character - Zwischen Zeichen - - - Alternate - Abwechselnd - - - Alternate over - Abwechselnd darüber - - - Alternate under - Abwechselnd darunter - - - Ruby position - Ruby-Position - - - Flow - Fluss - - - List item - Listenpunkt - - - Contents - Inhalt - - - Display - Anzeige - - - Root - Wurzel - - - Role - Rolle - - - Table caption - Tabellen-Beschreibung - - - Table header group - Tabellen-Kopfzeilen-Gruppe - - - Table footer group - Tabellen-Fußzeilen-Gruppe - - - Table row group - Tabellen-Zeilen-Gruppe - - - Table column group - Tabellen-Spalten-Gruppe - - - Table row - Tabellen-Zeile - - - Table column - Tabellen-Spalte - - - Ruby base container - Ruby-Basis-Container - - - Ruby text container - Ruby-Text-Container - - - Ruby base - Ruby-Basis - - - Ruby text - Ruby-Text - No specific styles available Keine spezifischen Styles verfügbar @@ -4082,7 +3982,7 @@ Maltese Maltesisch - + Maori Māori @@ -4386,6 +4286,107 @@ Update language across document Sprache im gesamten Dokument ändern + + WebWriter AI Compatible + WebWriter AI-kompatibel + + + Are you sure you want to clear the chat history? This action cannot be undone. + Möchten Sie den Chat-Verlauf wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden. + + + WebWriter AI + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + Um WebWriter AI zu verwenden, melden Sie sich bitte zuerst in den Einstellungen unter "Konten" mit Ihrem Konto an. Bitte aktualisieren Sie die Seite nach der Anmeldung. + + + Create an exercise sheet about ... + Erstelle ein Übungsblatt über ... + + + What task would complement this well? + Welche Aufgabe würde dies gut ergänzen? + + + Is my text simple and easy to understand? + Ist mein Text einfach und leicht verständlich? + + + Which widgets suit my content best? + Welche Widgets passen am besten zu meinem Inhalt? + + + Clear chat history + Chatverlauf löschen + + + You + Du + + + AI is thinking... + KI denkt nach... + + + Ask AI... + KI fragen... + + + Ask AI + KI fragen + + + Stop + Stopp + + + Retry + Wiederholen + + + Send message + Nachricht senden + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + WebWriter AI kann helfen, Ihr Explorable zu verbessern. Es funktioniert möglicherweise nicht perfekt mit allen Widgets und kann Fehler verursachen. Klicken Sie, um mehr zu erfahren. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + WebWriter AI kann helfen, Ihr Explorable zu verbessern, indem es Verbesserungen für Textinhalte vorschlägt. Sie können die KI nach neuen Inhaltsideen, Verbesserungen oder Vereinfachungen fragen. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + Es funktioniert möglicherweise nicht perfekt mit allen Widgets und kann Fehler verursachen. Bitte überprüfen Sie die von der KI generierten Inhalte auf Richtigkeit und Angemessenheit, bevor Sie sie veröffentlichen. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + Änderungen von der KI werden nicht automatisch auf Ihr Explorable angewendet. Sie müssen die Vorschläge, die Sie behalten möchten, manuell akzeptieren; andernfalls können Sie sie schnell verwerfen. + + + Insert content... + Inhalt einfügen... + + + Read widget documentation... + Widget-Dokumentation lesen... + + + Replace content... + Inhalt ersetzen... + + + Insert into element... + In Element einfügen... + + + Get list of installable widgets... + Liste der installierbaren Widgets abrufen... + + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/el.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/el.xlf index d553922a..5c017c67 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/el.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/el.xlf @@ -834,17 +834,13 @@ Σύλληψη - Select - ... - + Select ... Επιλέξτε ... - Or drop - here - + Or drop here Ή ρίξτε εδώ @@ -910,10 +906,7 @@ Αυτή η λέξη-κλειδί απαιτείται για τα widgets - Generate a - LICENSE - file - + Generate a LICENSE file Δημιουργήστε ένα LICENSE αρχείο @@ -1499,18 +1492,14 @@ Σφάλμα σύνδεσης - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? θα διαγραφούν οριστικά. Είστε σίγουροι; - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? θα αντικατασταθεί. Είστε σίγουροι; @@ -1549,9 +1538,7 @@ Μη υποστηριζόμενος τύπος ιδιότητας '${desc.type}' (επεξεργασία ως JSON) - - is not supported - + is not supported δεν υποστηρίζεται @@ -4420,6 +4407,87 @@ Update language across document Ενημέρωση της γλώσσας σε όλο το έγγραφο + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/es.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/es.xlf index 2e8e4c7a..20598af6 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/es.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/es.xlf @@ -835,17 +835,13 @@ Capture - Select - ... - + Select ... Seleccione ... - Or drop - here - + Or drop here O deje aquí @@ -911,10 +907,7 @@ Esta palabra clave es necesaria para los widgets - Generate a - LICENSE - file - + Generate a LICENSE file Generar una LICENCIA archivo @@ -1499,18 +1492,14 @@ Error de conexión - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? se borrará permanentemente. ¿Está seguro? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? se sobrescribirá. ¿Está seguro? @@ -1549,9 +1538,7 @@ Tipo de propiedad '${desc.type}' no admitido (procesamiento como JSON) - - is not supported - + is not supported no es compatible @@ -4420,6 +4407,87 @@ Update language across document Actualizar el lenguaje en todo el documento + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/et.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/et.xlf index 025b8c28..8be6b569 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/et.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/et.xlf @@ -834,17 +834,13 @@ Capture - Select - ... - + Select ... Valige ... - Or drop - here - + Or drop here Või tilkuda siia @@ -910,10 +906,7 @@ See märksõna on vajalik vidinate jaoks - Generate a - LICENSE - file - + Generate a LICENSE file Genereeri LITSENTSI faili @@ -1498,18 +1491,14 @@ Ühendamise viga - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? kustutatakse lõplikult. Kas olete kindel? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? kirjutatakse üle. Kas olete kindel? @@ -1548,9 +1537,7 @@ Toetamata omaduse tüüp '${desc.type}' (töötlemine JSON-ina) - - is not supported - + is not supported ei ole toetatud @@ -4419,6 +4406,87 @@ Update language across document Kogu dokumendi keele ajakohastamine + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/fi.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/fi.xlf index 9021d36f..bf3da19b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/fi.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/fi.xlf @@ -834,17 +834,13 @@ Capture - Select - ... - + Select ... Valitse ... - Or drop - here - + Or drop here Tai pudota tänne @@ -910,10 +906,7 @@ Tämä avainsana tarvitaan widgettejä varten - Generate a - LICENSE - file - + Generate a LICENSE file Luo LICENSE tiedosto @@ -1498,18 +1491,14 @@ Virhe yhteyden muodostamisessa - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? poistetaan pysyvästi. Oletko varma? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? ylikirjoitetaan. Oletko varma? @@ -1548,9 +1537,7 @@ Ei tuettu ominaisuustyyppi '${desc.type}' (käsittely JSON-muodossa) - - is not supported - + is not supported ei tueta @@ -4419,6 +4406,87 @@ Update language across document Kielen päivittäminen koko asiakirjassa + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/fr.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/fr.xlf index 409cdc7b..c9d26086 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/fr.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/fr.xlf @@ -834,17 +834,13 @@ Capture - Select - ... - + Select ... Sélectionner ... - Or drop - here - + Or drop here Ou déposer ici @@ -910,10 +906,7 @@ Ce mot-clé est nécessaire pour les widgets - Generate a - LICENSE - file - + Generate a LICENSE file Générer une LICENSE fichier @@ -1492,17 +1485,13 @@ Erreur de connexion - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? sera définitivement supprimée. Vous êtes sûr de vous ? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? sera écrasé. Vous êtes sûr de vous ? @@ -1540,9 +1529,7 @@ Type de propriété non pris en charge "${desc.type}" (traitement en tant que JSON) - - is not supported - + is not supported n'est pas pris en charge @@ -4411,6 +4398,87 @@ Update language across document Mise à jour de la langue dans l'ensemble du document + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ar.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ar.ts index 3ad77ce5..b9730977 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ar.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ar.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `الفضاء`, 'tabKey': `⭾ علامة التبويب`, 'upKey': `↑ لأعلى`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/bg.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/bg.ts index d49ffa93..1f79afec 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/bg.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/bg.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Space`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Нагоре`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/cs.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/cs.ts index 0f2654fd..b9b5de5e 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/cs.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/cs.ts @@ -1125,5 +1125,35 @@ 'spaceKey': `Prostor`, 'tabKey': `⭾ Karta`, 'upKey': `↑ Nahoru`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/da.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/da.ts index 1bda0cfe..fd67fdd2 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/da.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/da.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Rummet`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Op`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/de.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/de.ts index 6459033e..589de85c 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/de.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/de.ts @@ -57,7 +57,6 @@ 's0312976fe9da5951': `Knopf`, 's03608a32f05eded2': `Kneif-Zoom`, 's036d35e03be98d22': `Mathe-Tiefe`, -'s037b1dc850a89273': `Abwechselnd darunter`, 's0396202b716732ec': `Markiere die Auswahl als durchgestrichen`, 's03f49e598ffb11cc': `Polnisch`, 's0448f1059fa01720': `Speichere, teile oder drucke das Explorable. Bearbeite Informationen wie den Titel, die Sprache, oder die Lizenz.`, @@ -68,9 +67,9 @@ 's063fa5a0a4903bf4': `Seitlich, Links-nach-rechts`, 's064339c229374050': `Encoding`, 's06634274f19b0572': `Auswahl anheften`, +'s0670a1c678483b5c': `Inhalt ersetzen...`, 's06743b24499f0035': `Anker-Mitte`, 's07808b0ca6da8fef': `Abgegrenzte Website`, -'s07970793b21351fd': `Ruby-Basis-Container`, 's079cf7850d9327f0': `Schrift`, 's07aa10850d9ddcc7': `Formular`, 's07e6118e838b2e23': `Navigation`, @@ -92,6 +91,7 @@ 's0bdca49248ba4820': `Tastenkürzel`, 's0befccf152b6c0a9': `Bildorientierung aus Metadaten`, 's0c11e479416c8421': `Tabellen-Unterschrift einfügen`, +'s0c1a8fb75a68b484': `Es funktioniert möglicherweise nicht perfekt mit allen Widgets und kann Fehler verursachen. Bitte überprüfen Sie die von der KI generierten Inhalte auf Richtigkeit und Angemessenheit, bevor Sie sie veröffentlichen.`, 's0c27336067c59611': `Scroll-Innenabstand`, 's0c4593d81f147042': `Grundlinie`, 's0c4b2e98d4ab7f5a': `App-Befehle`, @@ -116,7 +116,6 @@ 's106b274b5af798e5': `Sätze`, 's1082e1649793dca9': `Auswahl als definierten Begriff markieren`, 's10f3845975a0351e': `Metadaten bearbeiten`, -'s1125d159f7e64df5': `Anzeige`, 's11326fd2590f4e5e': `Standard`, 's1155ec07a221e739': `Scrollbar`, 's1173bf7a3e0b74c9': `Minimum (y)`, @@ -141,6 +140,7 @@ 's166bd56d19670a72': `Zoom`, 's1696c76a23c0834e': `Fortgeschritten: Zeige Packages mit Versionen wie 0.x.x im Package-Manager`, 's16b9446e3a70e1f4': `Attribute`, +'s16e45b897930024a': `KI fragen...`, 's16f205466761e583': `Keine opt. Schriftgröße`, 's16f2f1c2c516d307': `Öffne ein Dokument`, 's1749014f3f87fa6a': `Strecken`, @@ -219,7 +219,9 @@ 's2b2ae20d26f78ac2': `Block`, 's2b8f50c64be440f7': str`${0} auswählen...`, 's2ba5f4d8f3bd7c57': `Ordnung`, +'s2bab699694281d06': `Liste der installierbaren Widgets abrufen...`, 's2bad2d24def4aa0b': `Zeilenumbruch (CJK-Spr.)`, +'s2c8189544e3ea679': `Wiederholen`, 's2ceb11be2290bb1b': `Abbrechen`, 's2ced8e8fafb499f6': `Element löschen`, 's2d986d31f8d67357': `Formularbereich einfügen`, @@ -271,11 +273,11 @@ 's382a2aa3984474dd': `Erstellen`, 's38980f98cb07ceb8': `Speichere das aktive Dokument als Kopie`, 's3914cb410fca44d4': `Importieren`, -'s3a179f6db2972384': `Ruby-Position`, 's3a5ca02f282d247e': `Teilen...`, 's3ae67088bbefba98': `Pakete`, 's3b0ab4b52326316f': `Hell`, 's3bc203a3f8a6409c': `Sprache im gesamten Dokument ändern`, +'s3bc387c25520c3d0': `Chatverlauf löschen`, 's3bdad99768e11911': `Explorable`, 's3cb47df8290fa94c': `Option einfügen`, 's3cf89cb47fdde7e9': `Link`, @@ -305,7 +307,6 @@ 's417b90913e05bc17': `Vorschau`, 's418f2020fe996832': `Änderungen bestätigen`, 's41c724f0698148e9': `Die Auswahl als Tastenkürzel markieren`, -'s41f65a763f8e44ab': `Tabellen-Kopfzeilen-Gruppe`, 's42721130228841b0': `Stroke-Box`, 's429bd646f1cf8bc6': `LLM-Accounts ermöglichen es, Grammatik-Korrektur für Texte zu nutzen.`, 's429dd933ba95549b': `Adressbereich einfügen`, @@ -343,6 +344,7 @@ 's4b58c01e2578f5e4': `Legende`, 's4bbff4e008690da1': `Seiten vermeiden`, 's4c402ff5355fd310': `Bidirektionale Überschreibung`, +'s4c98376ea2d302d7': `WebWriter AI kann helfen, Ihr Explorable zu verbessern. Es funktioniert möglicherweise nicht perfekt mit allen Widgets und kann Fehler verursachen. Klicken Sie, um mehr zu erfahren.`, 's4caed5b7a7e5d89b': `Englisch`, 's4cb38675a21b2c98': ``, 's4cc8391f172c0cdf': `Einführung beenden`, @@ -398,7 +400,6 @@ 's59b20e8af32606ed': `Afar`, 's5a1a0898baf20675': `Auswahl als Daten-Annotation markieren`, 's5a356677b61a6b7e': `Moldawisch`, -'s5b474b5c0ac0c7c4': `Tabellen-Spalten-Gruppe`, 's5b517ac216f9ee62': `Seitlich`, 's5b8cc9bb61ddce15': `Absatz einfügen`, 's5bba2ac2e53bd1fd': `Kirgiesisch`, @@ -449,7 +450,6 @@ 's6827930ef1aeaf99': `Base URL`, 's684a16f3c711394d': `Rechts darüber`, 's687e27f036a71b32': `Isolieren`, -'s68b87d7b61052dc3': `Tabellen-Zeile`, 's68e0e3a2bab7ce3e': `Vermeiden`, 's690da6b432987c6f': `Änderungen am aktuellen Dokument automatisch sichern. Änderungen werden wiederhergestellt, wenn WebWriter neu geladen wird.`, 's69311c4e25074fb3': `Sekundarstufe II`, @@ -500,6 +500,7 @@ 's74cd20a7aece9b91': `Fill-Box`, 's75109f5307578a61': `Willkommen bei WebWriter`, 's75a27f43413e02c5': `Französisch`, +'s75ae80431286eb97': `WebWriter AI kann helfen, Ihr Explorable zu verbessern, indem es Verbesserungen für Textinhalte vorschlägt. Sie können die KI nach neuen Inhaltsideen, Verbesserungen oder Vereinfachungen fragen.`, 's75d83fc3f0cfab40': `Kopfzeile`, 's762e5704cc84089d': `Setze andere Stil-Optionen der ausgewählten Elemente`, 's77318393dfdb0775': `Zeile entfernen`, @@ -524,7 +525,6 @@ 's7c95876637f6a9d7': `Filter`, 's7cb4e55c59663b1c': `Firma`, 's7cfe12cd14df9950': `Abmelden`, -'s7d27db3c9639c6dd': `Abwechselnd`, 's7d8103f6f06f83d6': `Innenabstand`, 's7d864465dddbb50d': `Skalieren erlauben`, 's7de0e28d6c309a4e': `Berührungs-Gesten erlauben`, @@ -551,6 +551,8 @@ 's828b1ecea8715884': `Schwenken (links)`, 's833bd0422a7ef95d': `Tab-Größe`, 's83420ad7b6a14db5': `Entwickler-Werkzeuge umschalten`, +'s8348fb959cf65b2c': `Um WebWriter AI zu verwenden, melden Sie sich bitte zuerst in den Einstellungen unter "Konten" mit Ihrem Konto an. Bitte aktualisieren Sie die Seite nach der Anmeldung.`, +'s838137b16af746c3': `Möchten Sie den Chat-Verlauf wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.`, 's83c15613b6f6f3c8': `Nur online`, 's83cd32b685ccc9b7': `Steuerung`, 's83f26d02dd7aa681': `Sichtbar`, @@ -561,7 +563,6 @@ 's8517ae4da104b004': `Tabellen-Spaltengruppe`, 's85186a61e0d55bac': `Video`, 's851a7deea5984646': `Als Creative Commons OER lizenzieren?`, -'s85f9aa6d3ea0e421': `Tabellen-Fußzeilen-Gruppe`, 's864b0e6270e97246': `Auswahl als Nebenkommentar markieren`, 's8670e5ad3bf0dcf8': `Speichern unter`, 's8688d74dd3716d6e': `Tastenkürzel für Befehle`, @@ -584,7 +585,9 @@ 's8b7580c35e2aef87': `Oben links (y)`, 's8bc4affa761aa8a2': `Bild einfügen`, 's8c7f51cb067644c7': `Datenliste`, +'s8cdbc0d41dcc9230': `Welche Aufgabe würde dies gut ergänzen?`, 's8d342ecaa9e75b9b': `Verhältnis`, +'s8d660f3376fba2d6': `WebWriter AI-kompatibel`, 's8d797888455f4147': `Leerzeichen umbrechen`, 's8d83386457e91813': `Änderungen rückgängig machen, wiederholen, oder die Vorschau aus Lernerperspektive aktivieren.`, 's8d8643013a7754d1': `Text anordnen`, @@ -593,7 +596,6 @@ 's8f29e48d6b9a1aa8': `Tabellen-Kopfzeile einfügen`, 's8f4be9f086eb530f': `Rückgängig`, 's8f533296a536965e': `Speichern unter...`, -'s8fad58c831ecf017': `Ruby-Text-Container`, 's8ffe7abcbed8eb43': `Vertikal, Links-nach-rechts`, 's90105521fcc40453': `Konten in WebWriter Cloud erlauben es dir, Dokumente online zu speichern und mit deinen Lernenden zu teilen. Fügst du hier ein Konto hinzu, dann ist es als Ort zum Speichern, Laden, Teilen und Öffnen verfügbar.`, 's9095f01a80a91594': `Hochstellung`, @@ -646,7 +648,6 @@ 's9c11f2d9335d8bd1': `Oriya`, 's9c356016f81585f6': `Hintergrundfarbe`, 's9ca757effd747da9': `Urdu`, -'s9caf10388ab3562f': `Tabellen-Spalte`, 's9cf68f87b8e6122f': `Aserbaidschanisch`, 's9d167ef77aed79b6': `Ebene`, 's9d2d00982edafabb': `Türkisch`, @@ -699,7 +700,6 @@ 'sa5c80e623459ffe4': `Kopfzeile einfügen`, 'sa5df1bcdba46c3fb': `Abbildungsbeschriftung`, 'sa602e3fd3f2d98fd': `Animation`, -'sa644d580d8a11e60': `Ruby-Anordnugn`, 'sa645d315510dc09e': `Wähle einen Festplatten-Dateipfad`, 'sa65d4ad99f1d8c06': `Text-Hintergrund setzen`, 'sa6607436f60ccc1a': `Estnisch`, @@ -722,7 +722,6 @@ 'saa33768e03c45fc8': `Dateigröße`, 'saaad98061a20ac39': `Matheformel einfügen`, 'saab875d8cfcfe712': `Theme`, -'saad4380b9cc6cefd': `Abwechselnd darüber`, 'saaec15c97a9e4245': `Spalte umgekehrt`, 'sab0c57df694a0a09': `Anfang zuschneiden`, 'sab4d9283896d9422': `Auflösungs-Pixel einrasten`, @@ -731,6 +730,7 @@ 'sab726d2db7e6b93d': `Kirundi`, 'sac687b8649989de8': `Rechts anordnen`, 'sac895c732f350ac5': `Dunkel`, +'sacdeedb5763e8a55': `Widget-Dokumentation lesen...`, 'saced41ddda8b2354': `Flex-Basis`, 'sad190f86451081c0': `Nepalesisch`, 'sad6be321164d08c8': `Kompaktes Mathe`, @@ -739,7 +739,6 @@ 'sae185e6af80ec81e': `Schwedisch`, 'sae1c7f13b7c0c47f': `Start`, 'sae76e25497dcee58': `Recto`, -'sae9c790b88be7eb9': `Māori`, 'sae9d739068eee2c5': `Tatarisch`, 'saf312eaeec77a802': `Definitionsliste einfügen (Glossar, Begriffsliste)`, 'saf3da7c95cb17260': `Markiere die Auswahl als hochgestellt`, @@ -750,7 +749,6 @@ 'sb0a974028c99ca6d': `Adaptionen erlauben?`, 'sb0d4f0f7993cf085': `Schriftgröße festlegen`, 'sb0f3327210fe18fc': `Spalten`, -'sb0f93c1c60c0249a': `Ruby-Basis`, 'sb1494c08c8c720d1': `Textfarbe setzen`, 'sb19611adbc88f711': `Fortgeschritten: Zeige Befehle zum Bearbeiten von Quelltext, z.B. das HTML des Dokuments oder zum Hinzufügen eigener Styles und Skripte.`, 'sb206d700d26b14ff': `Unterstrichen`, @@ -763,6 +761,7 @@ 'sb3ba3276ae93627c': `Einen Block vorformatierten Text einfügen`, 'sb430f5b4824de0d3': `Layout wählen`, 'sb43db07b24da018a': `Amharisch`, +'sb452f6d7a8f3c794': `Änderungen von der KI werden nicht automatisch auf Ihr Explorable angewendet. Sie müssen die Vorschläge, die Sie behalten möchten, manuell akzeptieren; andernfalls können Sie sie schnell verwerfen.`, 'sb45f9fb4dba6e71a': `Ungesetzt`, 'sb4e003a459464d85': `Kurdisch`, 'sb4f0310e6787d098': `Usbekisch`, @@ -797,6 +796,7 @@ 'sb8f855b49234b81b': `Anwenden`, 'sb905da066c10182c': `Plus dunkler`, 'sb940ade1bd81be7e': `Links darunter`, +'sb9e306d8fcfb3c1c': `Nachricht senden`, 'sb9e9a7dd45966756': `Markiere die Auswahl als fett`, 'sba509fd8ed61d1d5': `Ungespeicherte Datei`, 'sba64d8954d027206': `Deckkraft`, @@ -818,7 +818,6 @@ 'sbc5f2e81604bb667': `Überschrift 2`, 'sbc6953a36ced943f': `Datenschutzrichtlinie`, 'sbd181cd54b8402a4': `Auswahl bearbeiten`, -'sbd35ee879d9cf770': `Ruby-Text`, 'sbd40f40cbadd38d5': `Dieses Paket entfernen`, 'sbd72dc858de95ce8': `Burmesisch`, 'sbe3c60c65f129daa': `Gesellschaftswiss.`, @@ -827,12 +826,12 @@ 'sbefb6064cba01844': `Fügt einen Zeilenumbruch ein`, 'sbf00e1ee999ea94e': `Skript einfügen`, 'sbf519920c2017d67': `Hängend`, +'sbf7da65f05e91211': `Inhalt einfügen...`, 'sbfa01f189a68d3e9': `Flex-Wachsen`, 'sbff54e740c4086eb': `Zeige unbekannte Packages`, 'sbfff51feacf30196': `Sanskrit`, 'sc0ceaa9843510f67': `Turkmenisch`, 'sc1611c0558728a2a': `Position`, -'sc1a155cc25899250': `Tabellen-Zeilen-Gruppe`, 'sc1aa1f6051b7102a': `Rumänisch`, 'sc1edebeaef92b7bd': `Festes Tabellen-Layout`, 'sc1fff4f356dfb2fb': `Transformieren`, @@ -855,11 +854,9 @@ 'sc50d09edf9325339': `Dialog`, 'sc52b67794c06a0d3': `Perspektiven-Ursprung (y)`, 'sc52e8b794c0913d6': `Perspektiven-Ursprung (x)`, -'sc53de149fcaad713': `Zwischen Zeichen`, 'sc546f489f9c0cced': `Test-Modus für das aktive Dokument umschalten`, 'sc5bcf50d1b578d9f': `Schrift-Eigenschaften`, 'sc5cb39478b9b7625': `Markiere die Auswahl als tiefgestellt`, -'sc6415b50ff928294': `Listenpunkt`, 'sc650ff15b20fe9d3': `Rotieren (z)`, 'sc6578b15b2154365': `Rotieren (x)`, 'sc65aff15b2183e58': `Rotieren (y)`, @@ -876,13 +873,13 @@ 'sc94e314312a8900c': `Tschechisch`, 'sc980855a000b76ea': `Unten`, 'sc98b103772de63f4': `Finnisch`, -'sca7cfe2bef51b2a5': `Wurzel`, -'sca7fed2bef53cb99': `Rolle`, 'scabe6ecee5e01fd2': `Maltesisch`, 'scace301a88231cce': `Einbettung`, +'scb6a9c1a1757adbc': `Du`, 'scbc55f622ec078c1': `View-Box`, 'scbe537fc38ff4c13': `Grid-Auto-Spalten`, 'scc1db59d292cbc4c': `Abschnitt`, +'scc466fb3738544bf': `Ist mein Text einfach und leicht verständlich?`, 'scc56b218a2689c42': `Armenisch`, 'scc5ba32e0de06744': `Sesotho`, 'scd15088c39fe9edf': `Padding Box`, @@ -930,6 +927,7 @@ 'sd66c4767fa3dde28': `Akzentfarbe`, 'sd679c8b1bf8cc8a5': `Kapitälchen`, 'sd7086c4425c53c80': `Schriftart`, +'sd72cf4022acf3d3c': `In Element einfügen...`, 'sd837f42ac7cbfb58': `Form (außen)`, 'sd88076d2994ee0fb': `Exklusion`, 'sd89a2e529b31ef43': `Zurückfallen`, @@ -937,7 +935,9 @@ 'sd8ce9e57270b030d': `Schrift-Streckung`, 'sd8ecf227c7c49331': `Mathematisch`, 'sd8f923198e0c5c6a': `Ende`, +'sd9ad53251f2330a5': `Stopp`, 'sd9c21e5f60d6bdd8': `Dänisch`, +'sd9c2eb8ad4c45fd4': `KI fragen`, 'sd9ff8e2612e63d50': `Box-Größe mit Rand`, 'sda2d76b976502a8d': `Öffnen...`, 'sda344aacb837387e': `Position im Container`, @@ -986,7 +986,9 @@ 'se64f418b4e733b6c': `Ausgabe einfügen`, 'se79c0a3ac70d8fb3': `Seitenverh. (x)`, 'se79fae3ac710dc36': `Seitenverh. (y)`, +'se7c14f7bef66c5bb': `KI denkt nach...`, 'se7fad370d8fb4cec': `Lesbarkeit optimieren`, +'se8865daa67c89672': `Erstelle ein Übungsblatt über ...`, 'se8a94b4effa2033e': `Alphabetisch`, 'se95d4e55ea186d9a': `Scrollbar-Farbe`, 'se96d43a515b8451c': `Slovenisch`, @@ -994,7 +996,6 @@ 'se9ac05f36b004eb0': `Verstecke die Einführung. Deaktivieren, damit die Einführung wieder angezeigt wird.`, 'se9b1fec72ffd8f48': `Lokal`, 'sea24bdcaa2bd2dec': `Einrasten erzwingen`, -'sea52df2b70a5c10d': `Ruby`, 'sea6e7291e27ec53f': `Metadaten-Editor umschalten`, 'sea896ed51ad33287': `Keine spezifischen Styles verfügbar`, 'seaaaeb09e3b4e78b': `Editor-Befehle`, @@ -1011,8 +1012,8 @@ 'sec30fbb20f102670': `Zusammenfassung einfügen`, 'sec8b0b6c729816b6': `Überschrifts-Gruppe`, 'seccd05955adb76bc': `Poster`, +'secf4269bd99a41e4': `Welche Widgets passen am besten zu meinem Inhalt?`, 'sed17285cd25d6389': `Verzeichnis mit package.json`, -'sed318ec045c5144f': `Darüber`, 'sed713f1b916fb469': `Rand-Abstand (x)`, 'sed74a31b9172942c': `Rand-Abstand (y)`, 'sed86bd0deb2e5372': `Text umformen`, @@ -1026,7 +1027,6 @@ 'sef75f458d77491af': `Optionsgruppe`, 'sefcf950b3cc4fc3b': `Sprache`, 'sf0c8e2b013e5ff18': `Dzongkha`, -'sf0ca10f343249063': `Inhalt`, 'sf0cab2483f66aa2e': `Spezifisch`, 'sf0e261e04eda82ff': `Erscheinungsbidl`, 'sf1045382c1fd9a85': `Exakte Druckfarben`, @@ -1051,7 +1051,6 @@ 'sf39736a666dbb038': `Spur einfügen`, 'sf3c4da68b08a2590': `Malagasy`, 'sf471ec2496f904cc': `Änderungen verwerfen`, -'sf4849bc200e279ed': `Tabellen-Beschreibung`, 'sf486ca1fdbe08645': `Abbildung einfügen`, 'sf4b537d4cbd8f5fd': `Text oben`, 'sf4e0e02a5277ef23': `Textfeld einfügen`, @@ -1060,6 +1059,7 @@ 'sf4fa67d41f05a008': `Skalieren (z)`, 'sf5197db2d5f2926a': `Rotieren`, 'sf52d840949a980d1': str`${0} wird permanent gelöscht. Fortfahren?`, +'sf544ad71477d4ff8': `WebWriter AI`, 'sf55d634dcc743595': `Dienstleist.`, 'sf59c9081d106dd9c': `Auswahl als Variable markieren`, 'sf5e76f774beb33c2': `Inuktitut`, @@ -1090,7 +1090,6 @@ 'sfc63e31ac7c956ed': `Auswahlfeld`, 'sfc815c9078bba30a': `QR-Code als Bild herunterladen`, 'sfcdd8e672c75b713': `Adressbereich`, -'sfcebd18506f1e535': `Fluss`, 'sfd0cde85070d2eb2': `Flex`, 'sfd77270c3f54f664': `Ausgabe`, 'sfdb1e4d90981a535': `Teile dieses Dokument`, @@ -1105,5 +1104,36 @@ 'spaceKey': `Leertaste`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Hoch`, +'sc6415b50ff928294': `List item`, +'sae9c790b88be7eb9': `Maori`, +'sea52df2b70a5c10d': `Ruby`, +'sa644d580d8a11e60': `Ruby alignment`, +'sed318ec045c5144f': `Over`, +'sc53de149fcaad713': `Inter-character`, +'s7d27db3c9639c6dd': `Alternate`, +'saad4380b9cc6cefd': `Alternate over`, +'s037b1dc850a89273': `Alternate under`, +'s3a179f6db2972384': `Ruby position`, +'sfcebd18506f1e535': `Flow`, +'sf0ca10f343249063': `Contents`, +'s1125d159f7e64df5': `Display`, +'sca7cfe2bef51b2a5': `Root`, +'sca7fed2bef53cb99': `Role`, +'sf4849bc200e279ed': `Table caption`, +'s41f65a763f8e44ab': `Table header group`, +'s85f9aa6d3ea0e421': `Table footer group`, +'sc1a155cc25899250': `Table row group`, +'s5b474b5c0ac0c7c4': `Table column group`, +'s68b87d7b61052dc3': `Table row`, +'s9caf10388ab3562f': `Table column`, +'s07970793b21351fd': `Ruby base container`, +'s8fad58c831ecf017': `Ruby text container`, +'sb0f93c1c60c0249a': `Ruby base`, +'sbd35ee879d9cf770': `Ruby text`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/el.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/el.ts index db478752..bcce17e2 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/el.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/el.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Διάστημα`, 'tabKey': `⭾ Καρτέλα`, 'upKey': `↑ Πάνω`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/es.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/es.ts index 4fdf1637..0f725e89 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/es.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/es.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Espacio`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Arriba`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/et.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/et.ts index 77459646..577db32b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/et.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/et.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Kosmos`, 'tabKey': `⭾ Tab`, 'upKey': `↑ üles`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fi.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fi.ts index b9270ba8..6eb39cf3 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fi.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fi.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Avaruus`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Ylös`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fr.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fr.ts index 9205b939..10a1de0d 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fr.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/fr.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `L'espace`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Vers le haut`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/hu.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/hu.ts index ebd6edfd..a96dbbfa 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/hu.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/hu.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Űr`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Fel`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/id.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/id.ts index 28c21e3f..dd3b9a6e 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/id.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/id.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Ruang`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Naik`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/it.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/it.ts index 57c7c7e3..216f642b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/it.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/it.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Spazio`, 'tabKey': `Scheda`, 'upKey': `↑ Su`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ja.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ja.ts index 6bdc1777..825eda14 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ja.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ja.ts @@ -1121,5 +1121,35 @@ 'spaceKey': `スペース`, 'tabKey': `⭾ タブ`, 'upKey': `↑ アップ`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ko.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ko.ts index 976c2a55..2c21a284 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ko.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ko.ts @@ -1122,5 +1122,35 @@ 'spaceKey': `공간`, 'tabKey': `⭾ 탭`, 'upKey': `↑ Up`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lt.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lt.ts index 579d933e..6d16052c 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lt.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lt.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Erdvė`, 'tabKey': `⭾ Skirtukas`, 'upKey': `↑ Į viršų`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lv.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lv.ts index efd601d2..6407129f 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lv.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/lv.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Telpa`, 'tabKey': `⭾ Cilne`, 'upKey': `↑ Uz augšu`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nb.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nb.ts index c0c8352b..544f49de 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nb.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nb.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Plass`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Opp`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nl.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nl.ts index c9259f11..609cb6be 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nl.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/nl.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Ruimte`, 'tabKey': `Tab`, 'upKey': `↑ Omhoog`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pl.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pl.ts index ff106820..69423a82 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pl.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pl.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Przestrzeń`, 'tabKey': `⭾ Tab`, 'upKey': `↑ W górę`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-BR.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-BR.ts index d7fc0dc3..13c2d05e 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-BR.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-BR.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `Espaço`, 'tabKey': `⭾ Tabulação`, 'upKey': `↑ Para cima`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-PT.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-PT.ts index cee415d9..176baeba 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-PT.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/pt-PT.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `Espaço`, 'tabKey': `⭾ Tabulação`, 'upKey': `↑ Para cima`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ro.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ro.ts index 98b16a12..af06af10 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ro.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ro.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Spațiu`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Sus`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ru.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ru.ts index 67dcae78..61d56662 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ru.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/ru.ts @@ -1127,5 +1127,35 @@ 'spaceKey': `Космос`, 'tabKey': `⭾ Вкладка`, 'upKey': `↑ Вверх`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sk.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sk.ts index 3dfc4a95..764578d7 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sk.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sk.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Priestor`, 'tabKey': `⭾ Karta`, 'upKey': `↑ Nahor`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sl.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sl.ts index caf959ed..95849f6d 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sl.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sl.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Prostor`, 'tabKey': `⭾ Tab`, 'upKey': `↑ navzgor`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sv.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sv.ts index ff3af45e..78683089 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sv.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/sv.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Utrymme`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Upp`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/tr.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/tr.ts index c305bb34..9f6f3edb 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/tr.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/tr.ts @@ -1125,5 +1125,35 @@ 'spaceKey': `Uzay`, 'tabKey': `⭾ Tab`, 'upKey': `↑ Yukarı`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/uk.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/uk.ts index 33190d60..d07a6d69 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/uk.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/uk.ts @@ -1126,5 +1126,35 @@ 'spaceKey': `Простір`, 'tabKey': `⭾ Вкладка`, 'upKey': `↑ Вгору`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hans.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hans.ts index c0515197..63e549c0 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hans.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hans.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `空间`, 'tabKey': `⭾ 标签`, 'upKey': `↑ 向上`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hant.ts b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hant.ts index 86738b26..cdcf2325 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hant.ts +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/generated/zh-hant.ts @@ -1118,5 +1118,35 @@ 'spaceKey': `空間`, 'tabKey': `⭾ Tab`, 'upKey': `↑ 向上`, +'s8d660f3376fba2d6': `WebWriter AI Compatible`, +'s838137b16af746c3': `Are you sure you want to clear the chat history? This action cannot be undone.`, +'sf544ad71477d4ff8': `WebWriter AI`, +'s8348fb959cf65b2c': `To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login.`, +'se8865daa67c89672': `Create an exercise sheet about ...`, +'s8cdbc0d41dcc9230': `What task would complement this well?`, +'scc466fb3738544bf': `Is my text simple and easy to understand?`, +'secf4269bd99a41e4': `Which widgets suit my content best?`, +'s3bc387c25520c3d0': `Clear chat history`, +'scb6a9c1a1757adbc': `You`, +'se7c14f7bef66c5bb': `AI is thinking...`, +'s16e45b897930024a': `Ask AI...`, +'sd9c2eb8ad4c45fd4': `Ask AI`, +'sd9ad53251f2330a5': `Stop`, +'s2c8189544e3ea679': `Retry`, +'sb9e306d8fcfb3c1c': `Send message`, +'s4c98376ea2d302d7': `WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more.`, +'s75ae80431286eb97': `WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications.`, +'s0c1a8fb75a68b484': `It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing.`, +'sb452f6d7a8f3c794': `Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them.`, +'s87f8922eeb2dfecc': `WebWriter AI Suggestion`, +'s9ab2057f0a31be23': `Accept suggestion`, +'s13be1af9766661e9': `Accept`, +'s6d359260c09544fe': `Reject suggestion`, +'s123da0f92f97dd86': `Reject`, +'sbf7da65f05e91211': `Insert content...`, +'sacdeedb5763e8a55': `Read widget documentation...`, +'s0670a1c678483b5c': `Replace content...`, +'sd72cf4022acf3d3c': `Insert into element...`, +'s2bab699694281d06': `Get list of installable widgets...`, }; \ No newline at end of file diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/hu.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/hu.xlf index 405b7e6c..ed703b72 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/hu.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/hu.xlf @@ -834,17 +834,13 @@ Capture - Select - ... - + Select ... Válassza ki a címet. ... - Or drop - here - + Or drop here Vagy ejtsd itt @@ -910,10 +906,7 @@ Ez a kulcsszó szükséges a widgetekhez - Generate a - LICENSE - file - + Generate a LICENSE file Generáljon egy LICENSE fájlt @@ -1498,18 +1491,14 @@ Csatlakozási hiba - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? véglegesen törlésre kerül. Biztos vagy benne? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? felülírásra kerül. Biztos vagy benne? @@ -1548,9 +1537,7 @@ Nem támogatott tulajdonságtípus '${desc.type}' (JSON-ként történő feldolgozás) - - is not supported - + is not supported nem támogatott @@ -4419,6 +4406,87 @@ Update language across document Nyelvi frissítés az egész dokumentumban + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/id.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/id.xlf index 4c1af4db..501da551 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/id.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/id.xlf @@ -834,17 +834,13 @@ Menangkap - Select - ... - + Select ... Pilih ... - Or drop - here - + Or drop here Atau jatuhkan di sini @@ -910,10 +906,7 @@ Kata kunci ini diperlukan untuk widget - Generate a - LICENSE - file - + Generate a LICENSE file Hasilkan LISENSI file @@ -1498,18 +1491,14 @@ Kesalahan menghubungkan - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? akan dihapus secara permanen. Apakah Anda yakin? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? akan ditimpa. Apa kau yakin? @@ -1548,9 +1537,7 @@ Jenis properti yang tidak didukung '${desc.type}' (diproses sebagai JSON) - - is not supported - + is not supported tidak didukung @@ -4419,6 +4406,87 @@ Update language across document Perbarui bahasa di seluruh dokumen + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/it.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/it.xlf index e17fb05a..3f83561a 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/it.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/it.xlf @@ -835,17 +835,13 @@ Cattura - Select - ... - + Select ... Selezionare ... - Or drop - here - + Or drop here Oppure lasciate un messaggio qui @@ -911,10 +907,7 @@ Questa parola chiave è necessaria per i widget - Generate a - LICENSE - file - + Generate a LICENSE file Generare un LICENZA file @@ -1499,18 +1492,14 @@ Errore di connessione - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? sarà eliminato in modo permanente. Ne è sicuro? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? sarà sovrascritto. Ne è sicuro? @@ -1549,9 +1538,7 @@ Tipo di proprietà non supportato '${desc.type}' (elaborazione come JSON) - - is not supported - + is not supported non è supportato @@ -4420,6 +4407,87 @@ Update language across document Aggiornare la lingua del documento + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/ja.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/ja.xlf index 7307dd14..86a44ef4 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/ja.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/ja.xlf @@ -834,17 +834,13 @@ キャプチャ - Select - ... - + Select ... 選択する ... - Or drop - here - + Or drop here または ここに @@ -910,10 +906,7 @@ このキーワードはウィジェットに必要です。 - Generate a - LICENSE - file - + Generate a LICENSE file ライセンス ライセンス ファイル @@ -1493,18 +1486,14 @@ 接続エラー - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? は永久に削除されます。確かですか? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? は上書きされます。本当ですか? @@ -1543,9 +1532,7 @@ サポートされていないプロパティ型 '${desc.type}' (JSON として処理) - - is not supported - + is not supported がサポートされていない @@ -4414,6 +4401,87 @@ Update language across document 文書全体の言語を更新 + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/ko.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/ko.xlf index 30bdb9f7..af651aa2 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/ko.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/ko.xlf @@ -834,17 +834,13 @@ 캡처 - Select - ... - + Select ... 선택 ... - Or drop - here - + Or drop here 또는 여기 @@ -910,10 +906,7 @@ 이 키워드는 위젯에 필요합니다. - Generate a - LICENSE - file - + Generate a LICENSE file 생성 라이선스 @@ -1494,18 +1487,14 @@ 연결 오류 - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? 은 영구적으로 삭제됩니다. 확실하신가요? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? 를 덮어씁니다. 확실하신가요? @@ -1544,9 +1533,7 @@ 지원되지 않는 속성 유형 '${desc.type}'(JSON으로 처리) - - is not supported - + is not supported 는 지원되지 않습니다. @@ -4415,6 +4402,87 @@ Update language across document 문서 전체에서 언어 업데이트 + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/lt.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/lt.xlf index 8e4734de..0f36dd29 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/lt.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/lt.xlf @@ -834,17 +834,13 @@ Užfiksuoti - Select - ... - + Select ... Pasirinkite ... - Or drop - here - + Or drop here Arba atsisakykite čia @@ -910,10 +906,7 @@ Šis raktažodis reikalingas valdikliams - Generate a - LICENSE - file - + Generate a LICENSE file Sukurti LICENCIJA failą @@ -1498,18 +1491,14 @@ Klaida jungiantis - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? bus ištrintas visam laikui. Ar tikrai? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? bus perrašytas. Ar esate tikri? @@ -1548,9 +1537,7 @@ Nepalaikomas savybės tipas '${desc.type}' (apdorojama kaip JSON) - - is not supported - + is not supported nepalaikomas @@ -4419,6 +4406,87 @@ Update language across document Atnaujinti viso dokumento kalbą + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/lv.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/lv.xlf index da446af8..4bb90d2b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/lv.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/lv.xlf @@ -834,17 +834,13 @@ Capture - Select - ... - + Select ... Atlasiet ... - Or drop - here - + Or drop here Vai nomest šeit @@ -910,10 +906,7 @@ Šis atslēgas vārds ir nepieciešams logrīkiem. - Generate a - LICENSE - file - + Generate a LICENSE file Izveidot LICENCIJA failu @@ -1498,18 +1491,14 @@ Kļūda, savienojot - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? tiks dzēsts uz visiem laikiem. Vai esat pārliecināts? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? tiks pārrakstīts. Vai esat pārliecināts? @@ -1548,9 +1537,7 @@ Neatbalstīts īpašības tips '${desc.type}' (apstrāde kā JSON) - - is not supported - + is not supported nav atbalstīta @@ -4419,6 +4406,87 @@ Update language across document Atjaunināt valodu visā dokumentā + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/nb.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/nb.xlf index 1aa97ba4..e942f335 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/nb.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/nb.xlf @@ -834,17 +834,13 @@ Fangst - Select - ... - + Select ... Velg ... - Or drop - here - + Or drop here Eller slipp her @@ -910,10 +906,7 @@ Dette nøkkelordet er påkrevd for widgets - Generate a - LICENSE - file - + Generate a LICENSE file Generer en LICENSE fil @@ -1498,18 +1491,14 @@ Feil ved tilkobling - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? vil bli slettet permanent. Er du sikker? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? vil bli overskrevet. Er du sikker? @@ -1548,9 +1537,7 @@ Egenskapstypen '${desc.type}' støttes ikke (behandles som JSON) - - is not supported - + is not supported støttes ikke @@ -4419,6 +4406,87 @@ Update language across document Oppdater språket i hele dokumentet + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/nl.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/nl.xlf index 20359312..15003768 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/nl.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/nl.xlf @@ -835,17 +835,13 @@ Vang - Select - ... - + Select ... Selecteer ... - Or drop - here - + Or drop here Of laat hier @@ -911,10 +907,7 @@ Dit sleutelwoord is vereist voor widgets - Generate a - LICENSE - file - + Generate a LICENSE file Een LICENTIE bestand @@ -1499,18 +1492,14 @@ Fout bij het aansluiten - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? zal permanent worden verwijderd. Weet u het zeker? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? wordt overschreven. Weet u het zeker? @@ -1549,9 +1538,7 @@ Niet-ondersteund type eigenschap '${desc.type}' (verwerkt als JSON) - - is not supported - + is not supported wordt niet ondersteund @@ -4420,6 +4407,87 @@ Update language across document Taal in document bijwerken + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/pl.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/pl.xlf index 298f50bc..9838d918 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/pl.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/pl.xlf @@ -834,17 +834,13 @@ Przechwytywanie - Select - ... - + Select ... Wybór ... - Or drop - here - + Or drop here Lub upuść tutaj @@ -910,10 +906,7 @@ To słowo kluczowe jest wymagane dla widżetów - Generate a - LICENSE - file - + Generate a LICENSE file Wygenerować LICENCJA plik @@ -1498,18 +1491,14 @@ Błąd połączenia - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? zostaną trwale usunięte. Czy na pewno? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? zostanie nadpisana. Czy na pewno? @@ -1548,9 +1537,7 @@ Nieobsługiwany typ właściwości "${desc.type}" (przetwarzanie jako JSON) - - is not supported - + is not supported nie jest obsługiwany @@ -4419,6 +4406,87 @@ Update language across document Aktualizacja języka w całym dokumencie + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/pt-BR.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/pt-BR.xlf index 9ff59567..dd2bdf20 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/pt-BR.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/pt-BR.xlf @@ -834,17 +834,13 @@ Captura - Select - ... - + Select ... Selecione ... - Or drop - here - + Or drop here Ou deixe aqui @@ -910,10 +906,7 @@ Essa palavra-chave é necessária para widgets - Generate a - LICENSE - file - + Generate a LICENSE file Gerar uma LICENSE arquivo @@ -1492,17 +1485,13 @@ Erro de conexão - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? será excluído permanentemente. Tem certeza? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? será sobrescrito. Tem certeza? @@ -1540,9 +1529,7 @@ Tipo de propriedade não suportado '${desc.type}' (processamento como JSON) - - is not supported - + is not supported não é suportado @@ -4411,6 +4398,87 @@ Update language across document Atualizar o idioma em todo o documento + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/pt-PT.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/pt-PT.xlf index d25ea714..23f9149d 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/pt-PT.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/pt-PT.xlf @@ -834,17 +834,13 @@ Captura - Select - ... - + Select ... Selecionar ... - Or drop - here - + Or drop here Ou deixe aqui @@ -910,10 +906,7 @@ Esta palavra-chave é necessária para widgets - Generate a - LICENSE - file - + Generate a LICENSE file Gerar uma LICENSE ficheiro @@ -1492,17 +1485,13 @@ Erro na ligação - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? será eliminado permanentemente. Tem a certeza? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? será substituído. Tem a certeza? @@ -1540,9 +1529,7 @@ Tipo de propriedade não suportado '${desc.type}' (processamento como JSON) - - is not supported - + is not supported não é suportado @@ -4411,6 +4398,87 @@ Update language across document Atualizar a língua em todo o documento + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/ro.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/ro.xlf index 951a8689..9b097ec8 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/ro.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/ro.xlf @@ -835,17 +835,13 @@ Captură - Select - ... - + Select ... Selectați ... - Or drop - here - + Or drop here Sau lăsați aici @@ -911,10 +907,7 @@ Acest cuvânt cheie este necesar pentru widget-uri - Generate a - LICENSE - file - + Generate a LICENSE file Generați o LICENȚĂ fișier @@ -1499,18 +1492,14 @@ Eroare de conectare - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? vor fi șterse definitiv. Sunteți sigur? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? va fi suprascrisă. Sunteți sigur? @@ -1549,9 +1538,7 @@ Tip de proprietate nesuportat "${desc.type}" (procesare ca JSON) - - is not supported - + is not supported nu este acceptat @@ -4420,6 +4407,87 @@ Update language across document Actualizarea limbii în întregul document + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/ru.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/ru.xlf index 8433d8c9..c1ba2875 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/ru.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/ru.xlf @@ -835,17 +835,13 @@ Захват - Select - ... - + Select ... Выберите ... - Or drop - here - + Or drop here Или опустите сюда @@ -911,10 +907,7 @@ Это ключевое слово необходимо для виджетов - Generate a - LICENSE - file - + Generate a LICENSE file Создать LICENSE файл @@ -1499,18 +1492,14 @@ Ошибка при подключении - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? будут удалены навсегда. Вы уверены? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? будет перезаписана. Вы уверены? @@ -1549,9 +1538,7 @@ Неподдерживаемый тип свойства '${desc.type}' (обработка как JSON) - - is not supported - + is not supported не поддерживается @@ -4420,6 +4407,87 @@ Update language across document Обновление языка во всем документе + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/sk.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/sk.xlf index ddfe71a0..2267cdc7 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/sk.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/sk.xlf @@ -834,17 +834,13 @@ Zachytenie - Select - ... - + Select ... Vyberte ... - Or drop - here - + Or drop here Alebo upustite od tu @@ -910,10 +906,7 @@ Toto kľúčové slovo je potrebné pre widgety - Generate a - LICENSE - file - + Generate a LICENSE file Generovať LICENCIA súbor @@ -1498,18 +1491,14 @@ Chyba pripojenia - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? budú natrvalo vymazané. Ste si istí? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? sa prepíšu. Ste si istí? @@ -1548,9 +1537,7 @@ Nepodporovaný typ vlastnosti '${desc.type}' (spracovanie ako JSON) - - is not supported - + is not supported nie je podporovaná @@ -4419,6 +4406,87 @@ Update language across document Aktualizácia jazyka v celom dokumente + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/sl.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/sl.xlf index f680729d..3823588b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/sl.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/sl.xlf @@ -834,17 +834,13 @@ Zajem - Select - ... - + Select ... Izberite ... - Or drop - here - + Or drop here Ali pa spustite tukaj @@ -910,10 +906,7 @@ Ta ključna beseda je potrebna za gradnike - Generate a - LICENSE - file - + Generate a LICENSE file Ustvari LICENCA datoteko @@ -1498,18 +1491,14 @@ Napaka pri povezovanju - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? bodo trajno izbrisani. Ste prepričani? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? se prepiše. Ste prepričani? @@ -1548,9 +1537,7 @@ Nepodprta vrsta lastnosti '${desc.type}' (obdelava kot JSON) - - is not supported - + is not supported ni podprta. @@ -4419,6 +4406,87 @@ Update language across document Posodobitev jezika v celotnem dokumentu + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/sv.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/sv.xlf index a235165e..4b60101b 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/sv.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/sv.xlf @@ -834,17 +834,13 @@ Fångst - Select - ... - + Select ... Välj ... - Or drop - here - + Or drop here Eller släpp här @@ -910,10 +906,7 @@ Detta nyckelord är obligatoriskt för widgets - Generate a - LICENSE - file - + Generate a LICENSE file Generera en LICENSE fil @@ -1498,18 +1491,14 @@ Fel vid anslutning - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? kommer att raderas permanent. Är du säker på det? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? kommer att skrivas över. Är du säker på det? @@ -1548,9 +1537,7 @@ Egenskapstyp som inte stöds '${desc.type}' (bearbetning som JSON) - - is not supported - + is not supported stöds inte @@ -4419,6 +4406,87 @@ Update language across document Uppdatera språket i hela dokumentet + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/tr.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/tr.xlf index 0d7502cf..29d7022c 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/tr.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/tr.xlf @@ -834,17 +834,13 @@ Yakalama - Select - ... - + Select ... Seçiniz ... - Or drop - here - + Or drop here Ya da bırak Burada @@ -910,10 +906,7 @@ Bu anahtar sözcük widget'lar için gereklidir - Generate a - LICENSE - file - + Generate a LICENSE file Oluşturmak LİSANS dosya @@ -1497,18 +1490,14 @@ Bağlantı hatası - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? kalıcı olarak silinecektir. Emin misiniz? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? üzerine yazılacaktır. Emin misiniz? @@ -1547,9 +1536,7 @@ Desteklenmeyen özellik türü '${desc.type}' (JSON olarak işleniyor) - - is not supported - + is not supported desteklenmiyor @@ -4418,6 +4405,87 @@ Update language across document Belge genelinde dili güncelleyin + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/uk.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/uk.xlf index 6f5696a5..a51b5986 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/uk.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/uk.xlf @@ -835,17 +835,13 @@ Захоплення - Select - ... - + Select ... Виберіть ... - Or drop - here - + Or drop here Або кинути тут. @@ -911,10 +907,7 @@ Це ключове слово є обов'язковим для віджетів - Generate a - LICENSE - file - + Generate a LICENSE file Згенеруйте ліцензію ЛІЦЕНЗІЯ файл @@ -1498,18 +1491,14 @@ Помилка підключення - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? буде видалено назавжди. Ви впевнені? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? будуть перезаписані. Ти впевнений? @@ -1548,9 +1537,7 @@ Непідтримуваний тип властивості '${desc.type}' (обробка як JSON) - - is not supported - + is not supported не підтримується @@ -4419,6 +4406,87 @@ Update language across document Оновлення мови в усьому документі + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hans.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hans.xlf index fb615873..71f65406 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hans.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hans.xlf @@ -4130,17 +4130,13 @@ 无特定款式 - Select - ... - + Select ... 选择 ... - Or drop - here - + Or drop here 或点击 这里 @@ -4266,10 +4262,7 @@ 小部件需要使用该关键字 - Generate a - LICENSE - file - + Generate a LICENSE file 生成 许可证 文件 @@ -4328,17 +4321,13 @@ 连接错误 - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? 将被永久删除。你确定吗? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? 将被覆盖。你确定吗? @@ -4368,9 +4357,7 @@ 不支持属性类型"${desc.type}"(以 JSON 格式处理) - - is not supported - + is not supported 不支持 @@ -4411,6 +4398,87 @@ Update language across document 更新整个文件的语言 + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hant.xlf b/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hant.xlf index 06b0558e..71721c77 100644 --- a/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hant.xlf +++ b/@webwriter/core/viewmodel/localizationcontroller/localization/zh-hant.xlf @@ -4130,17 +4130,13 @@ 無特定款式 - Select - ... - + Select ... 選擇 ... - Or drop - here - + Or drop here 或按這裡 這裡 @@ -4266,10 +4262,7 @@ 這個關鍵字是 widget 必須的 - Generate a - LICENSE - file - + Generate a LICENSE file 產生 LICENSE 檔案 @@ -4328,17 +4321,13 @@ 連接錯誤 - - will be deleted permanently. Are you sure? - + will be deleted permanently. Are you sure? 將被永久刪除。您確定嗎? - - will be overwritten. Are you sure? - + will be overwritten. Are you sure? 將被覆寫。您確定嗎? @@ -4368,9 +4357,7 @@ 不支援的屬性類型 '${desc.type}' (以 JSON 格式處理) - - is not supported - + is not supported 不支援 @@ -4411,6 +4398,87 @@ Update language across document 更新整個文件的語言 + + WebWriter AI Compatible + + + Are you sure you want to clear the chat history? This action cannot be undone. + + + WebWriter AI + + + To use WebWriter AI, please login in the settings under Accounts with your account first. Please refresh the page after login. + + + Create an exercise sheet about ... + + + What task would complement this well? + + + Is my text simple and easy to understand? + + + Which widgets suit my content best? + + + Clear chat history + + + You + + + AI is thinking... + + + Ask AI... + + + Ask AI + + + Stop + + + Retry + + + Send message + + + WebWriter AI can help improve your explorable. It may not work perfectly with all widgets and may produce errors. Click to learn more. + + + WebWriter AI can help improve your explorable by suggesting enhancements to text content. You may ask the AI for new content ideas, improvements, or simplifications. + + + It may not work perfectly with all widgets and could produce errors. Please review AI-generated content for accuracy and appropriateness before publishing. + + + Any changes from the AI are not automatically applied to your explorable. You must manually accept the suggestions you want to keep; otherwise you can quickly discard them. + + + Insert content... + + + Read widget documentation... + + + Replace content... + + + Insert into element... + + + Get list of installable widgets... + + + ✨ (improved version) + + + Please select a text passage first. + - \ No newline at end of file + diff --git a/@webwriter/website/pb_hooks/ai/ai-config.js b/@webwriter/website/pb_hooks/ai/ai-config.js new file mode 100644 index 00000000..e26dddb1 --- /dev/null +++ b/@webwriter/website/pb_hooks/ai/ai-config.js @@ -0,0 +1,69 @@ +// Azure OpenAI Konfiguration +const endpoint = "webwriterai.openai.azure.com"; +const apiKey = "*******************************************************************"; +const apiVersion = "2024-05-01-preview"; +const deployment = "gpt-4.1"; + + +// Funktion zum Aufrufen der Azure OpenAI API mit PocketBase $http +function callAzureOpenAI(requestData) { + + const url = `https://${endpoint}/openai/deployments/${deployment}/chat/completions?api-version=${apiVersion}`; + + try { + const res = $http.send({ + url: url, + method: "POST", + body: JSON.stringify(requestData), + headers: { + "Content-Type": "application/json", + "api-key": apiKey + }, + timeout: 120 // 120 Sekunden Timeout + }); + + // Prüfen des Statuscodes der Antwort + if (res.statusCode !== 200) { + throw new Error(`HTTP Error: ${res.statusCode} - ${res.body}`); + } + + // Prüfen ob res.body existiert und nicht leer ist + if (!res.body) { + throw new Error('Leere Antwort von der API erhalten'); + } + + // Versuchen JSON zu parsen falls res.json undefined ist + let result; + if (res.json) { + result = res.json; + } else { + try { + result = JSON.parse(res.body); + } catch (parseError) { + throw new Error(`Fehler beim Parsen der JSON-Antwort: ${parseError.message}. Body: ${res.body}`); + } + } + + // Validierung der Antwortstruktur + if (!result) { + throw new Error('Ungültige JSON-Antwort erhalten'); + } + + if (!result.choices || !Array.isArray(result.choices) || result.choices.length === 0) { + throw new Error(`Keine choices in der API-Antwort gefunden. Antwort: ${JSON.stringify(result)}`); + } + + if (!result.choices[0].message) { + throw new Error(`Keine message im ersten choice gefunden. Choice: ${JSON.stringify(result.choices[0])}`); + } + + return result.choices[0].message; + } catch (error) { + console.error("Fehler beim Azure OpenAI API Aufruf:", error); + throw error; + } +} + +module.exports = { + callAzureOpenAI +} \ No newline at end of file diff --git a/@webwriter/website/pb_hooks/ai/main.pb.js b/@webwriter/website/pb_hooks/ai/main.pb.js new file mode 100644 index 00000000..4ac9d45f --- /dev/null +++ b/@webwriter/website/pb_hooks/ai/main.pb.js @@ -0,0 +1,60 @@ +// PocketBase API Route für Chat +routerAdd("POST", "/api/chat", (e) => { + const record = e.auth; + + if (!record) { + return e.json(401, { "error": "Für diese Aktion ist eine Authentifizierung erforderlich." }); + } + + const { callAzureOpenAI } = require(`${__hooks}/ai-config.js`); + + try { + // Request Body lesen + const requestBody = JSON.parse(toString(e.request.body)); + + + const requestData = { + model: "gpt-4.1", + max_tokens: 1000, + ...requestBody // Zusätzliche Parameter aus dem Request Body übernehmen + } + + // Validierung der eingehenden Daten + if (!requestBody.messages || !Array.isArray(requestBody.messages)) { + return e.json(400, { + "error": "Ungültiger Request: 'messages' Array erforderlich" + }); + } + + // Chat-Historie kopieren + let chatHistory = [...requestBody.messages]; + + + // AI-Antwort abrufen + const aiResponse = callAzureOpenAI(requestData); + + + // AI-Antwort zur Chat-Historie hinzufügen + chatHistory.push(aiResponse); + + // Erweiterte Chat-Historie zurückgeben + return e.json(200, { + "success": true, + "messages": chatHistory, + "lastMessage": aiResponse + }); + + } catch (error) { + console.error("Fehler beim Verarbeiten der Chat-Anfrage:", error, typeof error, error.message); + return e.json(500, { + "error": "Interner Serverfehler beim Verarbeiten der Chat-Anfrage", + "details": error.message + }); + } +}); + +// Test-Route für einfache Nachrichten +routerAdd("GET", "/hello/{name}", (e) => { + let name = e.request.pathValue("name"); + return e.json(200, { "message": "Hallo " + name }); +}); diff --git a/@webwriter/website/src/lib/pocketbase.ts b/@webwriter/website/src/lib/pocketbase.ts index 58f60d4e..cf77789e 100644 --- a/@webwriter/website/src/lib/pocketbase.ts +++ b/@webwriter/website/src/lib/pocketbase.ts @@ -1,3 +1,3 @@ import PocketBase from "pocketbase"; -export const pocketbase = new PocketBase("https://api.webwriter.app") \ No newline at end of file +export const pocketbase = new PocketBase("https://node1.webwriter.elearn.rwth-aachen.de") \ No newline at end of file