Dialog](#new_Dialog_new)
+## showModalDialogUsingTemplate(template, [autoDismiss], [closeToElement]) ⇒ [Dialog](#new_Dialog_new)
Creates a new modal dialog from a given template.
The template can either be a string or a jQuery object representing a DOM node that is *not* in the current DOM.
@@ -69,6 +69,7 @@ The template can either be a string or a jQuery object representing a DOM node t
| --- | --- | --- |
| template | string | A string template or jQuery object to use as the dialog HTML. |
| [autoDismiss] | boolean | Whether to automatically dismiss the dialog when one of the buttons is clicked. Default true. If false, you'll need to manually handle button clicks and the Esc key, and dismiss the dialog yourself when ready by calling `close()` on the returned dialog. |
+| [closeToElement] | string | A CSS selector for a target element. If specified, the dialog will animate open from and close toward the target element (a "woosh" effect). If the target is not found or not visible, the dialog opens/closes normally. |
diff --git a/gulpfile.js/index.js b/gulpfile.js/index.js
index e134fb1d7f..9a8ee23d3a 100644
--- a/gulpfile.js/index.js
+++ b/gulpfile.js/index.js
@@ -145,7 +145,8 @@ function makeJSDist() {
"!src/thirdparty/no-minify/**/*", "!src/thirdparty/xterm/**/*",
"!src/LiveDevelopment/BrowserScripts/RemoteFunctions.js",
"!src/extensionsIntegrated/phoenix-pro/onboarding/**/*",
- "!src/extensionsIntegrated/phoenix-pro/unit-tests/**/*"])
+ "!src/extensionsIntegrated/phoenix-pro/unit-tests/**/*",
+ "!src/mdViewer/**/*"])
.pipe(minify({
ext:{
min:'.js'
@@ -180,7 +181,8 @@ function makeNonMinifyDist() {
"src/thirdparty/xterm/**/*",
"src/LiveDevelopment/BrowserScripts/RemoteFunctions.js",
"src/extensionsIntegrated/phoenix-pro/onboarding/**/*",
- "src/extensionsIntegrated/phoenix-pro/unit-tests/**/*"], {base: 'src'})
+ "src/extensionsIntegrated/phoenix-pro/unit-tests/**/*",
+ "src/mdViewer/**/*"], {base: 'src'})
.pipe(dest('dist'));
}
@@ -428,6 +430,7 @@ function releaseProd() {
function translateStrings() {
return new Promise(async (resolve)=>{ // eslint-disable-line
await Translate.translate();
+ await Translate.translateMdviewer();
resolve();
});
}
@@ -706,7 +709,7 @@ function _makeBracketsConcatJSInternal(isDevBuild = true) {
`${srcDir}preferences/PreferencesImpl.js` // tests does require magic on prefs, so exclude
];
const pathsToMerge = [];
- const PathsToIgnore = ["assets", "thirdparty", "extensions"];
+ const PathsToIgnore = ["assets", "thirdparty", "extensions", "mdViewer"];
for(let dir of fs.readdirSync(srcDir, {withFileTypes: true})){
if(dir.isDirectory() && !PathsToIgnore.includes(dir.name)){
pathsToMerge.push(dir.name);
diff --git a/gulpfile.js/translateStrings.js b/gulpfile.js/translateStrings.js
index 722e47d36c..9acd1f07af 100644
--- a/gulpfile.js/translateStrings.js
+++ b/gulpfile.js/translateStrings.js
@@ -20,6 +20,7 @@
/* eslint-env node */
const fs = require('fs');
+const path = require('path');
const CORE_AI_TRANSLATE_API_KEY = process.env.CORE_AI_TRANSLATE_API_KEY;
// A global accumulator object initialized to zero
@@ -83,7 +84,7 @@ function aggregateUtilizationMetrics(obj) {
const translationContext =
`This is a bunch of strings extracted from a JavaScript file used to develop our product with is a text editor.
Some strings may have HTML or templates(mustache library used).
-The brand name “Phoenix Pro” must remain in English and should never be translated.
+The brand name "Phoenix Pro" must remain in English and should never be translated.
Please translate these strings accurately.
`;
@@ -131,11 +132,11 @@ async function getTranslation(apiInput) {
}
}
-function _getAllNLSFolders() {
- let names = fs.readdirSync('src/nls');
+function _getAllNLSFolders(nlsDir) {
+ let names = fs.readdirSync(nlsDir);
let nlsFolders =[];
for(let name of names){
- let stat = fs.statSync(`src/nls/${name}`);
+ let stat = fs.statSync(path.join(nlsDir, name));
if(stat.isDirectory()){
nlsFolders.push(name);
}
@@ -180,18 +181,18 @@ const FILE_HEADER = `/*
*/
define(`,
-FILE_FOOTER = ');';
+ FILE_FOOTER = ');';
-function _isTranslatableKey(key) {
+function _isTranslatableKey(key, sourceStrings) {
const doNotTranslateDirective = '_DO_NOT_TRANSLATE';
const translationDisabledForKey = `${key}${doNotTranslateDirective}`;
- if(key.endsWith(doNotTranslateDirective) || rootStrings[translationDisabledForKey] === 'true'){
+ if(key.endsWith(doNotTranslateDirective) || sourceStrings[translationDisabledForKey] === 'true'){
return false;
}
return true;
}
-async function coreAiTranslate(stringsToTranslate, lang) {
+async function coreAiTranslate(stringsToTranslate, lang, errorsFile) {
if(!Object.keys(stringsToTranslate).length){
return {};
}
@@ -203,7 +204,7 @@ async function coreAiTranslate(stringsToTranslate, lang) {
if(translations.failedLanguages.length){
const errorStr = `Error translating ${lang}. it has failures `;
console.error(errorStr);
- fs.writeFileSync(`src/nls/errors.txt`, errorStr);
+ fs.writeFileSync(errorsFile, errorStr);
// this is oke to continue in case of partial translations.
}
let translationForLanguage = translations.translations[lang];
@@ -214,7 +215,7 @@ async function coreAiTranslate(stringsToTranslate, lang) {
if(!translationForLanguage){
const errorStr = `Error translating. AI response doesnt have the language ${lang} translated!`;
console.error(errorStr);
- fs.writeFileSync(`src/nls/errors.txt`, errorStr);
+ fs.writeFileSync(errorsFile, errorStr);
return {};
}
return translationForLanguage;
@@ -272,24 +273,35 @@ function getSortedObject(obj) {
*
* Finally, we update all the autogenerated translations to disk.
*
- * @param lang
+ * @param {string} lang - locale code
+ * @param {object} config - { nlsDir, sourceStrings, format, errorsFile }
* @return {Promise
+ let next = wrapper.nextElementSibling;
+ if (!next || next.classList?.contains("table-wrapper")) {
+ next = document.createElement("p");
+ next.innerHTML = "
";
+ wrapper.parentNode.insertBefore(next, wrapper.nextSibling);
+ }
+ const range = document.createRange();
+ range.selectNodeContents(next);
+ range.collapse(true);
+ const sel = window.getSelection();
+ sel.removeAllRanges();
+ sel.addRange(range);
+ if (contentEl) {
+ contentEl.dispatchEvent(new Event("input", { bubbles: true }));
+ }
+}
+
+function isInsideTableOrWrapper() {
+ const sel = window.getSelection();
+ if (!sel || !sel.rangeCount) return false;
+ let node = sel.anchorNode;
+ while (node) {
+ if (node.nodeType === 1) {
+ if (node.tagName === "TABLE") return true;
+ if (node.classList && node.classList.contains("table-wrapper")) return true;
+ }
+ node = node.parentNode;
+ }
+ return false;
+}
+
+/**
+ * Returns "UL", "OL", or null — the nearest list parent of the cursor.
+ */
+function _nearestListType() {
+ const sel = window.getSelection();
+ if (!sel || !sel.rangeCount) return null;
+ let node = sel.anchorNode;
+ while (node) {
+ if (node.nodeType === 1 && (node.tagName === "UL" || node.tagName === "OL")) {
+ return node.tagName;
+ }
+ node = node.parentNode;
+ }
+ return null;
+}
+
+function isInsideTag(tag) {
+ const sel = window.getSelection();
+ if (!sel || !sel.rangeCount) return false;
+ let node = sel.anchorNode;
+ while (node) {
+ if (node.nodeType === 1 && node.tagName === tag) return true;
+ node = node.parentNode;
+ }
+ return false;
+}
+
+// ——— Selection state broadcasting ———
+
+let rafId = null;
+
+function broadcastSelectionState() {
+ if (rafId) cancelAnimationFrame(rafId);
+ rafId = requestAnimationFrame(() => {
+ rafId = null;
+ const state = {
+ bold: document.queryCommandState("bold"),
+ italic: document.queryCommandState("italic"),
+ strikethrough: document.queryCommandState("strikethrough"),
+ underline: document.queryCommandState("underline"),
+ unorderedList: _nearestListType() === "UL",
+ orderedList: _nearestListType() === "OL",
+ blockType: getBlockType(),
+ isLink: isInsideTag("A"),
+ isCode: isInsideTag("CODE"),
+ inTable: isInsideTableOrWrapper(),
+ inList: isInsideTag("LI"),
+ inHeading: isInsideTag("H1") || isInsideTag("H2") || isInsideTag("H3") ||
+ isInsideTag("H4") || isInsideTag("H5") || isInsideTag("H6")
+ };
+ emit("editor:selection-state", state);
+
+ const ctxMenu = document.getElementById("table-context-menu");
+ if (ctxMenu && ctxMenu.classList.contains("open")) return;
+
+ const contentEl = document.getElementById("viewer-content");
+ if (contentEl) {
+ const inTable = isInsideTableOrWrapper();
+ contentEl.querySelectorAll(".table-wrapper.table-active").forEach((w) => {
+ w.classList.remove("table-active");
+ });
+ if (inTable) {
+ const sel2 = window.getSelection();
+ if (sel2 && sel2.anchorNode) {
+ let tableEl = sel2.anchorNode;
+ while (tableEl && tableEl !== contentEl && tableEl.tagName !== "TABLE") tableEl = tableEl.parentNode;
+ if (tableEl && tableEl.tagName === "TABLE") {
+ let wp = tableEl.parentElement;
+ if (!wp || !wp.classList.contains("table-wrapper")) {
+ wp = document.createElement("div");
+ wp.className = "table-wrapper";
+ tableEl.parentNode.insertBefore(wp, tableEl);
+ wp.appendChild(tableEl);
+ }
+ wp.classList.add("table-active");
+ attachTableHandles(wp);
+ }
+ }
+ }
+ }
+
+ // Show "Type / to insert" hint on the empty paragraph at cursor
+ updateEmptyLineHint(contentEl);
+ });
+}
+
+function updateEmptyLineHint(contentEl) {
+ const prev = contentEl.querySelector(".cursor-empty-hint");
+ if (prev) prev.classList.remove("cursor-empty-hint");
+
+ const sel = window.getSelection();
+ if (!sel || !sel.isCollapsed || !sel.anchorNode) return;
+
+ let block = sel.anchorNode;
+ if (block.nodeType === Node.TEXT_NODE) block = block.parentElement;
+ while (block && block !== contentEl && !["P", "H1", "H2", "H3", "H4", "H5", "H6"].includes(block.tagName)) {
+ block = block.parentElement;
+ }
+ if (!block || block === contentEl || block.tagName !== "P") return;
+
+ const text = block.textContent.replace(/\u200B/g, "").trim();
+ if (text === "") {
+ block.classList.add("cursor-empty-hint");
+ }
+}
+
+// ——— Formatting engine ———
+
+export function executeFormat(contentEl, command, value) {
+ contentEl.focus({ preventScroll: true });
+
+ // Block bold in headings (headings are inherently bold)
+ if (command === "bold") {
+ const sel = window.getSelection();
+ let node = sel?.anchorNode;
+ if (node?.nodeType === Node.TEXT_NODE) { node = node.parentElement; }
+ if (node?.closest("h1, h2, h3, h4, h5, h6")) {
+ return;
+ }
+ }
+
+ switch (command) {
+ case "bold":
+ case "italic":
+ case "strikethrough":
+ case "underline":
+ document.execCommand(command, false, null);
+ break;
+ case "formatBlock":
+ document.execCommand("formatBlock", false, value);
+ break;
+ case "createLink": {
+ if (value) {
+ document.execCommand("createLink", false, value);
+ } else {
+ emit("action:show-link-input");
+ }
+ break;
+ }
+ case "insertUnorderedList":
+ case "insertOrderedList": {
+ const targetTag = command === "insertUnorderedList" ? "UL" : "OL";
+ const nearestList = _nearestListType();
+ if (nearestList) {
+ if (nearestList !== targetTag) {
+ // Switch list type by replacing the nearest list element tag
+ const sel = window.getSelection();
+ let listEl = sel?.anchorNode;
+ while (listEl && listEl.tagName !== nearestList) listEl = listEl.parentElement;
+ if (listEl) {
+ const newList = document.createElement(targetTag);
+ while (listEl.firstChild) newList.appendChild(listEl.firstChild);
+ listEl.parentNode.replaceChild(newList, listEl);
+ }
+ }
+ // Already the right type — do nothing
+ break;
+ }
+ // Not in a list — use execCommand to create one
+ document.execCommand(command, false, null);
+ break;
+ }
+ case "insertHorizontalRule":
+ document.execCommand(command, false, null);
+ break;
+ case "code":
+ toggleInlineCode();
+ break;
+ case "taskList":
+ insertTaskList(contentEl);
+ break;
+ case "codeBlock":
+ insertCodeBlock(contentEl);
+ break;
+ case "table":
+ insertTable(contentEl);
+ break;
+ case "mermaidBlock":
+ insertMermaidBlock(contentEl);
+ break;
+ case "imageFromUrl":
+ showImageUrlDialog(contentEl);
+ break;
+ case "imageUpload":
+ openImageFilePicker(contentEl);
+ break;
+ }
+
+ broadcastSelectionState();
+}
+
+function toggleInlineCode() {
+ const sel = window.getSelection();
+ if (!sel || !sel.rangeCount) return;
+ const range = sel.getRangeAt(0);
+
+ let codeNode = null;
+ let node = sel.anchorNode;
+ while (node) {
+ if (node.nodeType === 1 && node.tagName === "CODE" && !node.closest("pre")) {
+ codeNode = node;
+ break;
+ }
+ node = node.parentNode;
+ }
+
+ if (codeNode) {
+ const text = document.createTextNode(codeNode.textContent);
+ codeNode.parentNode.replaceChild(text, codeNode);
+ const r = document.createRange();
+ r.selectNodeContents(text);
+ sel.removeAllRanges();
+ sel.addRange(r);
+ } else if (!range.collapsed) {
+ const code = document.createElement("code");
+ try {
+ range.surroundContents(code);
+ } catch {
+ const fragment = range.extractContents();
+ code.appendChild(fragment);
+ range.insertNode(code);
+ }
+ sel.removeAllRanges();
+ const r = document.createRange();
+ r.selectNodeContents(code);
+ sel.addRange(r);
+ }
+}
+
+function insertTaskList(contentEl) {
+ const html =
+ '
\n| ${hdr} | ${hdr} | ${hdr} |
|---|---|---|
" }, + { regex: /^\[\s?\]$/, command: "taskList" } + ]; + + for (const pat of patterns) { + if (pat.regex.test(text.trim())) { + e.preventDefault(); + deleteTextBeforeCaret(contentEl, text.length); + flushSnapshot(contentEl); + executeFormat(contentEl, pat.command, pat.value); + contentEl.dispatchEvent(new Event("input", { bubbles: true })); + return true; + } + } + return false; +} + +function handleMarkdownShortcutOnEnter(e, contentEl) { + const { text, block } = getTextInBlockBeforeCaret(contentEl); + if (!text) return false; + const trimmed = text.trim(); + + if (trimmed === "---" || trimmed === "***" || trimmed === "___") { + e.preventDefault(); + deleteTextBeforeCaret(contentEl, text.length); + flushSnapshot(contentEl); + executeFormat(contentEl, "insertHorizontalRule"); + contentEl.dispatchEvent(new Event("input", { bubbles: true })); + return true; + } + + if (trimmed === "```") { + e.preventDefault(); + deleteTextBeforeCaret(contentEl, text.length); + flushSnapshot(contentEl); + executeFormat(contentEl, "codeBlock"); + contentEl.dispatchEvent(new Event("input", { bubbles: true })); + return true; + } + + return false; +} + +// ——— Turndown ——— + +function createTurndown() { + const td = new TurndownService({ + headingStyle: "atx", + codeBlockStyle: "fenced", + emDelimiter: "*", + bulletListMarker: "-", + hr: "---" + }); + + td.use(gfm); + + td.addRule("tableWrapper", { + filter(node) { + return node.nodeName === "DIV" && node.classList.contains("table-wrapper"); + }, + replacement(content) { + return content; + } + }); + + td.addRule("tableHandles", { + filter(node) { + if (node.nodeName === "DIV" && (node.classList.contains("table-row-handles") || node.classList.contains("table-col-handles"))) return true; + if (node.nodeName === "BUTTON" && (node.classList.contains("table-add-row-btn") || node.classList.contains("table-col-add-btn"))) return true; + return false; + }, + replacement() { return ""; } + }); + + td.addRule("copyButtons", { + filter(node) { + return node.nodeName === "BUTTON" && node.classList.contains("code-copy-btn"); + }, + replacement() { return ""; } + }); + + td.addRule("mermaidDiagram", { + filter(node) { + return node.nodeName === "DIV" && node.classList.contains("mermaid-diagram") + && node.hasAttribute("data-mermaid-source"); + }, + replacement(content, node) { + const source = node.getAttribute("data-mermaid-source"); + return "\n\n```mermaid\n" + source + "\n```\n\n"; + } + }); + + td.addRule("mermaidInternals", { + filter(node) { + return (node.classList && ( + node.classList.contains("mermaid-skeleton") || + node.classList.contains("mermaid-error-message") || + node.classList.contains("mermaid-error-source") + )); + }, + replacement() { return ""; } + }); + + td.addRule("mermaidEditorUI", { + filter(node) { + return (node.classList && ( + node.classList.contains("mermaid-editor-toolbar") || + node.classList.contains("mermaid-source-editor") || + node.classList.contains("mermaid-error-bar") || + node.classList.contains("mermaid-preview") || + node.classList.contains("mermaid-edit-overlay") + )); + }, + replacement() { return ""; } + }); + + td.addRule("fencedCodeWithLanguage", { + filter(node) { + return node.nodeName === "PRE" && node.querySelector("code") !== null; + }, + replacement(content, node) { + const code = node.querySelector("code"); + const lang = node.getAttribute("data-language") || ""; + const text = code.textContent || ""; + const normalizedText = text.endsWith("\n") ? text : text + "\n"; + return "\n\n```" + lang + "\n" + normalizedText + "```\n\n"; + } + }); + + td.addRule("githubAlerts", { + filter(node) { + return node.nodeName === "DIV" && node.classList.contains("markdown-alert"); + }, + replacement(content, node) { + const classes = Array.from(node.classList); + const typeClass = classes.find(c => c.startsWith("markdown-alert-") && c !== "markdown-alert"); + const type = typeClass ? typeClass.replace("markdown-alert-", "").toUpperCase() : "NOTE"; + + const titleEl = node.querySelector(".markdown-alert-title"); + const bodyParts = []; + let sibling = titleEl ? titleEl.nextElementSibling : node.firstElementChild; + while (sibling) { + bodyParts.push(td.turndown(sibling.innerHTML)); + sibling = sibling.nextElementSibling; + } + + const body = bodyParts.join("\n>\n> "); + const lines = body ? `> [!${type}]\n> ${body}` : `> [!${type}]`; + return "\n\n" + lines + "\n\n"; + } + }); + + // Preserve as HTML in markdown (no native markdown equivalent) + td.addRule("underline", { + filter: ["u"], + replacement(content) { + return "" + content + ""; + } + }); + + // Preserve//as ~~ strikethrough + td.addRule("strikethrough", { + filter: ["s", "strike", "del"], + replacement(content) { + return "~~" + content + "~~"; + } + }); + + td.addRule("taskListCheckbox", { + filter(node) { + return node.nodeName === "INPUT" && + node.getAttribute("type") === "checkbox" && + node.closest("li") !== null; + }, + replacement(content, node) { + return node.checked ? "[x] " : "[ ] "; + } + }); + + return td; +} + +/** + * Convert the viewer content element to markdown using Turndown. + * Works on a clone to avoid mutating the live DOM. + */ +export function convertToMarkdown(contentEl) { + // Sync checkbox checked property → attribute before cloning, + // because cloneNode copies attributes but not DOM properties. + contentEl.querySelectorAll('input[type="checkbox"]').forEach(cb => { + if (cb.checked) { + cb.setAttribute("checked", ""); + } else { + cb.removeAttribute("checked"); + } + }); + const clone = contentEl.cloneNode(true); + clone.querySelectorAll(".code-copy-btn").forEach((btn) => btn.remove()); + clone.querySelectorAll(".table-row-handles, .table-col-handles, .table-add-row-btn, .table-col-add-btn").forEach((el) => el.remove()); + // Unwrapinside
— marked renders "loose" lists with wrapping, + // but Turndown converts that to blank lines between items. Unwrapping makes tight lists. + clone.querySelectorAll("li > p").forEach((p) => { + const li = p.parentElement; + while (p.firstChild) { + li.insertBefore(p.firstChild, p); + } + p.remove(); + }); + // Remove
from table cells — browsers insert
in empty contenteditable cells, + // which Turndown converts to \n, breaking the markdown table row across lines + clone.querySelectorAll("td > br:only-child, th > br:only-child").forEach((br) => { + br.remove(); + }); + clone.querySelectorAll(".mermaid-editor-toolbar, .mermaid-source-editor, .mermaid-error-bar, .mermaid-edit-overlay").forEach((el) => el.remove()); + clone.querySelectorAll("mark[data-markjs]").forEach((mark) => { + const parent = mark.parentNode; + parent.replaceChild(document.createTextNode(mark.textContent), mark); + parent.normalize(); + }); + return turndown.turndown(clone.innerHTML); +} + +// Debounced content change emitter for bridge +let contentChangeTimer = null; +const CONTENT_CHANGE_DEBOUNCE = 300; + +function emitContentChange(contentEl) { + clearTimeout(contentChangeTimer); + contentChangeTimer = setTimeout(() => { + const markdown = convertToMarkdown(contentEl); + emit("bridge:contentChanged", { markdown }); + }, CONTENT_CHANGE_DEBOUNCE); +} + +function getContentEl() { + return document.getElementById("viewer-content"); +} + +export function initEditor() { + turndown = createTurndown(); + + on("state:editMode", (editing) => { + const content = getContentEl(); + if (!content) return; + if (editing) { + enterEditMode(content); + } else { + cleanupEditMode(content); + } + }); + + // Handle format actions from toolbar/format-bar/slash-menu + on("action:format", ({ command, value }) => { + if (!getState().editMode) return; + const content = getContentEl(); + if (!content) return; + scrollSelectionIntoView(content); + flushSnapshot(content); + executeFormat(content, command, value); + content.dispatchEvent(new Event("input", { bubbles: true })); + content.focus({ preventScroll: true }); + }); + + on("action:undo", () => { + if (!getState().editMode) return; + const content = getContentEl(); + if (!content) return; + performUndo(content); + setState({ isDirty: undoStack.length > 0 }); + }); + + on("action:redo", () => { + if (!getState().editMode) return; + const content = getContentEl(); + if (!content) return; + performRedo(content); + setState({ isDirty: true }); + }); +} + +function enterEditMode(content) { + content.setAttribute("contenteditable", "true"); + content.classList.add("editing"); + + document.execCommand("defaultParagraphSeparator", false, "p"); + document.execCommand("styleWithCSS", false, "false"); + + // Remove copy buttons + content.querySelectorAll(".code-copy-btn").forEach((btn) => btn.remove()); + + resetUndoHistory(content); + + beforeInputHandler = (e) => { + if (e.inputType === "historyUndo" || e.inputType === "historyRedo") { + e.preventDefault(); + return; + } + // Block line breaks and text insertion outside cells in tables + if (isInsideTableOrWrapper()) { + if (e.inputType === "insertParagraph" || e.inputType === "insertLineBreak") { + e.preventDefault(); + return; + } + // Block all input when cursor is in table but outside any cell + const sel = window.getSelection(); + let inCell = false; + if (sel && sel.anchorNode) { + let n = sel.anchorNode; + while (n) { + if (n.nodeType === 1 && (n.tagName === "TD" || n.tagName === "TH")) { inCell = true; break; } + if (n.nodeType === 1 && n.tagName === "TABLE") break; + n = n.parentNode; + } + } + if (!inCell) { + e.preventDefault(); + return; + } + } + beforeInputCursor = getCursorOffset(content); + currentInputType = e.inputType || ""; + }; + content.addEventListener("beforeinput", beforeInputHandler); + + inputHandler = (e) => { + if (isPerformingUndoRedo || content.innerHTML === lastHTML) return; + pushUndoEntry(content); + setState({ isDirty: true }); + + const isDelete = e.inputType && e.inputType.startsWith("delete"); + if (isDelete) { + const stripped = content.textContent.replace(/\u200B/g, "").trim(); + if (!stripped && content.children.length <= 1) { + const child = content.firstElementChild; + if (child && child.tagName !== "P") { + content.innerHTML = ""; + const p = content.firstElementChild; + const sel = window.getSelection(); + const r = document.createRange(); + r.setStart(p, 0); + r.collapse(true); + sel.removeAllRanges(); + sel.addRange(r); + lastHTML = content.innerHTML; + } + } + } + + // Debounced re-highlighting for code blocks + const sel = window.getSelection(); + if (sel && sel.anchorNode) { + const pre = sel.anchorNode.nodeType === 1 + ? sel.anchorNode.closest("pre") + : sel.anchorNode.parentElement?.closest("pre"); + if (pre && content.contains(pre)) { + clearTimeout(codeHighlightTimer); + codeHighlightTimer = setTimeout(() => { + const code = pre.querySelector("code"); + if (!code) return; + const lang = pre.getAttribute("data-language"); + if (lang && !code.className.includes(`language-${lang}`)) { + code.className = `language-${lang}`; + } + if (code.className.includes("language-")) { + const off = getCursorOffset(content); + Prism.highlightElement(code); + restoreCursor(content, off); + } + }, 500); + } + } + + // Emit content change to bridge (debounced) + emitContentChange(content); + }; + content.addEventListener("input", inputHandler); + + pasteHandler = (e) => handlePaste(e, content); + content.addEventListener("paste", pasteHandler); + + // Enable task list checkboxes (marked renders them disabled by default) + content.querySelectorAll('input[type="checkbox"][disabled]').forEach(cb => { + cb.removeAttribute("disabled"); + }); + + // Checkbox clicks don't fire 'input' on the contenteditable, so handle them explicitly + checkboxHandler = (e) => { + if (e.target.matches('input[type="checkbox"]')) { + pushUndoEntry(content); + setState({ isDirty: true }); + emitContentChange(content); + } + }; + content.addEventListener("click", checkboxHandler); + + keydownHandler = (e) => { + const mod = isModKey(e); + + if (isSlashMenuVisible() || isLangPickerDropdownOpen()) { + // Let regular character input through for slash menu filtering + // Only block modifier shortcuts that could interfere + if (isModKey(e)) { + e.preventDefault(); + } + return; + } + + if (mod && e.key === "z" && !e.shiftKey) { + e.preventDefault(); + performUndo(content); + setState({ isDirty: undoStack.length > 0 }); + return; + } + if (mod && (((e.key === "z" || e.key === "Z") && e.shiftKey) || e.key === "y")) { + e.preventDefault(); + performRedo(content); + setState({ isDirty: true }); + return; + } + + if (mod && !e.shiftKey) { + if (e.key === "b") { + e.preventDefault(); + scrollSelectionIntoView(content); + flushSnapshot(content); + executeFormat(content, "bold"); + content.dispatchEvent(new Event("input", { bubbles: true })); + return; + } + if (e.key === "i") { + e.preventDefault(); + scrollSelectionIntoView(content); + flushSnapshot(content); + executeFormat(content, "italic"); + content.dispatchEvent(new Event("input", { bubbles: true })); + return; + } + if (e.key === "k") { + e.preventDefault(); + emit("action:show-link-input"); + return; + } + } + + if (mod && e.shiftKey) { + if (e.key === "x" || e.key === "X") { + e.preventDefault(); + scrollSelectionIntoView(content); + flushSnapshot(content); + executeFormat(content, "strikethrough"); + content.dispatchEvent(new Event("input", { bubbles: true })); + return; + } + } + + if (e.altKey && e.key === "F10") { + e.preventDefault(); + focusFormatBar(); + return; + } + + // Tab navigation in tables + if (e.key === "Tab") { + // Table: navigate cells + if (!mod) { + const ctx = getTableContext(); + if (ctx) { + e.preventDefault(); + const { table, tr, td, colIdx } = ctx; + const isLastCol = colIdx === tr.children.length - 1; + const tbody = table.querySelector("tbody"); + const isLastRow = tr === (tbody || table).lastElementChild; + + if (e.shiftKey) { + const prevCell = td.previousElementSibling + || tr.previousElementSibling?.lastElementChild; + if (prevCell) focusCell(prevCell); + } else if (isLastCol && isLastRow) { + flushSnapshot(content); + addTableRow(table, null); + dispatchInputEvent(content); + const wrapper = table.closest(".table-wrapper"); + if (wrapper) { + const rh = wrapper.querySelector(".table-row-handles"); + const ch = wrapper.querySelector(".table-col-handles"); + const acb = wrapper.querySelector(".table-col-add-btn"); + if (rh && ch && acb) rebuildHandles(wrapper, table, rh, ch, acb); + } + } else { + const nextCell = td.nextElementSibling + || tr.nextElementSibling?.firstElementChild; + if (nextCell) focusCell(nextCell); + } + return; + } + } + + // Lists: indent/outdent by nesting/unnesting + if (isInsideTag("LI")) { + e.preventDefault(); + const sel3 = window.getSelection(); + const li = sel3?.anchorNode?.nodeType === Node.TEXT_NODE + ? sel3.anchorNode.parentElement?.closest("li") + : sel3?.anchorNode?.closest("li"); + if (li) { + // Save cursor as text offset within the li + const savedOffset = getCursorOffset(li); + + flushSnapshot(content); + if (e.shiftKey) { + const parentList = li.parentElement; // the nested ul/ol + const grandLi = parentList?.parentElement?.closest("li"); + if (grandLi) { + // Collect siblings after the current li (they stay nested) + const afterSiblings = []; + let next = li.nextElementSibling; + while (next) { + afterSiblings.push(next); + next = next.nextElementSibling; + } + + // Move li to parent level (after grandLi) + grandLi.parentElement.insertBefore(li, grandLi.nextSibling); + + // If there are remaining siblings, create a new nested list under the moved li + if (afterSiblings.length > 0) { + const newSubList = document.createElement(parentList.tagName); + for (const sib of afterSiblings) { + newSubList.appendChild(sib); + } + li.appendChild(newSubList); + } + + if (parentList.children.length === 0) parentList.remove(); + } + } else { + const prevLi = li.previousElementSibling; + if (prevLi) { + let subList = prevLi.querySelector("ul, ol"); + if (!subList) { + subList = document.createElement(li.parentElement.tagName); + prevLi.appendChild(subList); + } + subList.appendChild(li); + } + } + // Restore cursor within the moved li + restoreCursor(li, savedOffset); + content.dispatchEvent(new Event("input", { bubbles: true })); + } + return; + } + + // Regular text: insert 4 spaces + e.preventDefault(); + if (!e.shiftKey) { + document.execCommand("insertText", false, " "); + } + return; + } + + // Right/Down arrow at end of last table cell → move below table + if ((e.key === "ArrowRight" || e.key === "ArrowDown") && isInsideTableOrWrapper()) { + const ctx = getTableContext(); + if (ctx) { + const tbody = ctx.table.querySelector("tbody") || ctx.table; + const lastRow = tbody.lastElementChild; + const isLastCell = ctx.tr === lastRow && ctx.td === ctx.tr.lastElementChild; + if (isLastCell) { + // Check if cursor is at end of cell + const sel = window.getSelection(); + const range = sel.getRangeAt(0); + let atEnd = false; + if (range.collapsed) { + if (range.startContainer.nodeType === Node.TEXT_NODE) { + atEnd = range.startOffset >= range.startContainer.textContent.length; + } else { + atEnd = range.startOffset >= range.startContainer.childNodes.length; + } + } + if (atEnd || e.key === "ArrowDown") { + e.preventDefault(); + _exitTableBelow(ctx.table, content); + return; + } + } + } else { + // Cursor in wrapper but not in cell — exit + e.preventDefault(); + const wrapper = (() => { + let n = window.getSelection()?.anchorNode; + if (n?.nodeType === Node.TEXT_NODE) n = n.parentElement; + while (n) { + if (n.classList?.contains("table-wrapper")) return n; + if (n.tagName === "TABLE") return n.closest(".table-wrapper") || n; + n = n.parentElement; + } + return null; + })(); + if (wrapper) { + const tbl = wrapper.querySelector("table") || wrapper; + _exitTableBelow(tbl, content); + } + return; + } + } + + // Fix End/Home key near images — contenteditable jumps to end/start of + // container instead of end/start of current block when cursor is near
. + // On Mac, Cmd+Right/Left is the equivalent of End/Home. + const isEndKey = e.key === "End" || (isMac && e.metaKey && e.key === "ArrowRight"); + const isHomeKey = e.key === "Home" || (isMac && e.metaKey && e.key === "ArrowLeft"); + if ((isEndKey || isHomeKey) && !(e.key === "End" && mod) && !(e.key === "Home" && mod)) { + const sel = window.getSelection(); + if (sel && sel.rangeCount) { + let node = sel.anchorNode; + if (node?.nodeType === Node.TEXT_NODE) node = node.parentElement; + const block = node?.closest("p, h1, h2, h3, h4, h5, h6, li, blockquote, td, th"); + if (block && block.querySelector("img")) { + e.preventDefault(); + const range = document.createRange(); + if (isEndKey) { + range.selectNodeContents(block); + range.collapse(false); + } else { + range.selectNodeContents(block); + range.collapse(true); + } + sel.removeAllRanges(); + sel.addRange(range); + return; + } + } + } + + // ArrowDown at end of code block → exit to paragraph below + if (e.key === "ArrowDown" && !mod) { + const sel = window.getSelection(); + if (sel && sel.rangeCount) { + let node = sel.anchorNode; + if (node?.nodeType === Node.TEXT_NODE) node = node.parentElement; + const pre = node?.closest("pre"); + if (pre && pre.closest("#viewer-content")) { + const range = sel.getRangeAt(0); + if (range.collapsed) { + const code = pre.querySelector("code") || pre; + // Check if cursor is on the last line + const textContent = code.textContent || ""; + const lastNewline = textContent.lastIndexOf("\n"); + // Get cursor offset within code + let cursorOffset = 0; + const tw = document.createTreeWalker(code, NodeFilter.SHOW_TEXT); + let n; + while ((n = tw.nextNode())) { + if (n === range.startContainer) { + cursorOffset += range.startOffset; + break; + } + cursorOffset += n.textContent.length; + } + if (cursorOffset >= lastNewline) { + e.preventDefault(); + _exitBlockBelow(pre, content); + return; + } + } + } + } + } + + if (e.key === " ") { + handleMarkdownShortcutOnSpace(e, content); + return; + } + + // Backspace at start of heading → convert to paragraph + if (e.key === "Backspace" && !mod) { + const sel2 = window.getSelection(); + if (sel2 && sel2.rangeCount) { + const range2 = sel2.getRangeAt(0); + const block2 = range2.startContainer.nodeType === Node.TEXT_NODE + ? range2.startContainer.parentElement : range2.startContainer; + const heading = block2?.closest("h1, h2, h3, h4, h5, h6"); + if (heading && heading.closest("#viewer-content")) { + const atStart = range2.collapsed && + range2.startOffset === 0 && + (range2.startContainer === heading || + range2.startContainer === heading.firstChild || + (range2.startContainer.nodeType === Node.TEXT_NODE && + !range2.startContainer.previousSibling)); + if (atStart) { + e.preventDefault(); + // Convert heading to
, preserving content + const p = document.createElement("p"); + while (heading.firstChild) { + p.appendChild(heading.firstChild); + } + heading.parentNode.replaceChild(p, heading); + // Restore cursor at start of new
+ const r = document.createRange(); + r.setStart(p, 0); + r.collapse(true); + sel2.removeAllRanges(); + sel2.addRange(r); + content.dispatchEvent(new Event("input", { bubbles: true })); + return; + } + } + } + } + + if (e.key === "Enter") { + // Shift+Enter on last line of code block → exit to paragraph below + if (e.shiftKey) { + const sel = window.getSelection(); + if (sel && sel.rangeCount) { + let node = sel.anchorNode; + if (node?.nodeType === Node.TEXT_NODE) node = node.parentElement; + const pre = node?.closest("pre"); + if (pre && pre.closest("#viewer-content")) { + const code = pre.querySelector("code") || pre; + const range = sel.getRangeAt(0); + if (range.collapsed) { + const textContent = code.textContent || ""; + const lastNewline = textContent.lastIndexOf("\n"); + let cursorOffset = 0; + const tw = document.createTreeWalker(code, NodeFilter.SHOW_TEXT); + let n; + while ((n = tw.nextNode())) { + if (n === range.startContainer) { + cursorOffset += range.startOffset; + break; + } + cursorOffset += n.textContent.length; + } + if (cursorOffset >= lastNewline) { + e.preventDefault(); + _exitBlockBelow(pre, content); + return; + } + } + } + } + } + + // Inside table: block Enter except on last cell or outside cells where it exits + if (isInsideTableOrWrapper()) { + e.preventDefault(); + const ctx = getTableContext(); + const shouldExit = !ctx || // cursor outside any cell (in table wrapper) + (ctx.tr === (ctx.table.querySelector("tbody") || ctx.table).lastElementChild && + ctx.td === ctx.tr.lastElementChild); // last cell + + if (shouldExit) { + const tableEl = ctx ? ctx.table : (() => { + let n = window.getSelection()?.anchorNode; + if (n?.nodeType === Node.TEXT_NODE) n = n.parentElement; + while (n) { + if (n.tagName === "TABLE") return n; + if (n.classList?.contains("table-wrapper")) return n.querySelector("table"); + n = n.parentElement; + } + return null; + })(); + if (tableEl) { + _exitTableBelow(tableEl, content); + } + } + return; + } + if (!mod) { + // Context-aware Enter: + const blockType = getBlockType(); + const sel2 = window.getSelection(); + const block2 = sel2?.anchorNode?.nodeType === Node.TEXT_NODE + ? sel2.anchorNode.parentElement : sel2?.anchorNode; + const blockEl = block2?.closest("p, h1, h2, h3, h4, h5, h6, li, blockquote"); + const listItem = block2?.closest("li"); + const isEmpty = (listItem || blockEl) && (listItem || blockEl).textContent.replace(/\u200B/g, "").trim() === ""; + const isHeading = ["H1", "H2", "H3", "H4", "H5", "H6"].includes(blockType); + const isList = !!listItem; + + if (isHeading && e.shiftKey) { + // Shift+Enter in heading: create new empty
below, move cursor there + e.preventDefault(); + const newP = document.createElement("p"); + newP.innerHTML = "
"; + blockEl.parentNode.insertBefore(newP, blockEl.nextSibling); + const r = document.createRange(); + r.setStart(newP, 0); + r.collapse(true); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(r); + content.dispatchEvent(new Event("input", { bubbles: true })); + } else if (isHeading && !e.shiftKey) { + e.preventDefault(); + const range2 = sel2.getRangeAt(0); + // Check if cursor is at the very start of the heading + const atStart = range2.startOffset === 0 && + (range2.startContainer === blockEl || + (range2.startContainer === blockEl.firstChild && range2.startOffset === 0) || + (range2.startContainer.nodeType === Node.TEXT_NODE && + range2.startOffset === 0 && + !range2.startContainer.previousSibling)); + + if (atStart) { + // Insert empty line ABOVE heading, keep cursor on heading + const newP = document.createElement("p"); + newP.innerHTML = "
"; + blockEl.parentNode.insertBefore(newP, blockEl); + const r = document.createRange(); + r.setStart(blockEl, 0); + r.collapse(true); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(r); + } else { + // Check if cursor is at the end of the heading + const atEnd = (range2.startContainer.nodeType === Node.TEXT_NODE && + range2.startOffset >= range2.startContainer.textContent.length && + !range2.startContainer.nextSibling) || + (range2.startContainer === blockEl && + range2.startOffset >= blockEl.childNodes.length); + + const newP = document.createElement("p"); + + if (atEnd) { + // At end: just create emptybelow + newP.innerHTML = "
"; + } else { + // In middle: split — move trailing content into+ const splitRange = document.createRange(); + splitRange.setStart(range2.startContainer, range2.startOffset); + splitRange.setEndAfter(blockEl.lastChild); + const fragment = splitRange.extractContents(); + if (fragment.textContent.trim() || fragment.childNodes.length > 0) { + newP.appendChild(fragment); + } + if (!newP.firstChild) { + newP.innerHTML = "
"; + } + // If heading is now empty, add
placeholder + if (!blockEl.textContent.trim() && !blockEl.querySelector("br")) { + blockEl.innerHTML = "
"; + } + } + blockEl.parentNode.insertBefore(newP, blockEl.nextSibling); + const r = document.createRange(); + r.setStart(newP, 0); + r.collapse(true); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(r); + } + content.dispatchEvent(new Event("input", { bubbles: true })); + } else if (isList) { + e.preventDefault(); + if (e.shiftKey) { + // Shift+Enter in list: new line within same bullet + document.execCommand("insertLineBreak"); + } else if (isEmpty) { + // Enter on empty bullet: exit list, create paragraph after + const list = listItem.closest("ul, ol"); + if (list) { + const newP = document.createElement("p"); + newP.innerHTML = "
"; + list.parentNode.insertBefore(newP, list.nextSibling); + listItem.remove(); + if (list.children.length === 0) list.remove(); + const r = document.createRange(); + r.setStart(newP, 0); + r.collapse(true); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(r); + } + } else { + // Enter in list: split at cursor, move trailing content to new bullet + const range2 = sel2.getRangeAt(0); + // Select from cursor to end of list item content + const endRange = document.createRange(); + endRange.setStart(range2.startContainer, range2.startOffset); + endRange.setEndAfter(listItem.lastChild); + // Extract trailing content + const fragment = endRange.extractContents(); + // Create new li with the extracted content + const newLi = document.createElement("li"); + if (fragment.textContent.trim() === "") { + newLi.innerHTML = "
"; + } else { + newLi.appendChild(fragment); + } + listItem.parentNode.insertBefore(newLi, listItem.nextSibling); + // If original li is now empty, add
+ if (listItem.textContent.trim() === "") { + listItem.innerHTML = "
"; + } + const r = document.createRange(); + r.setStart(newLi, 0); + r.collapse(true); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(r); + } + content.dispatchEvent(new Event("input", { bubbles: true })); + return; + } else if (isEmpty && !e.shiftKey) { + // Empty paragraph — let browser create new+ handleMarkdownShortcutOnEnter(e, content); + } else if (!e.shiftKey) { + // Single line break within paragraph + e.preventDefault(); + document.execCommand("insertLineBreak"); + } + return; + } + } + }; + content.addEventListener("keydown", keydownHandler); + + selectionHandler = () => broadcastSelectionState(); + document.addEventListener("selectionchange", selectionHandler); + selectionFallbackMouseUp = () => broadcastSelectionState(); + selectionFallbackKeyUp = () => broadcastSelectionState(); + content.addEventListener("mouseup", selectionFallbackMouseUp); + content.addEventListener("keyup", selectionFallbackKeyUp); + + initFormatBar(content); + initLinkPopover(content); + initLangPicker(content); + initSlashMenu(content); + + content.querySelectorAll(".table-wrapper").forEach(attachTableHandles); + setupTableContextMenu(content); + initMermaidEditor(content); + highlightCode(); +} + +function cleanupEditMode(content) { + clearTimeout(codeHighlightTimer); + codeHighlightTimer = null; + clearTimeout(contentChangeTimer); + contentChangeTimer = null; + + destroyFormatBar(); + destroyLinkPopover(); + destroyLangPicker(); + destroySlashMenu(); + destroyMermaidEditor(); + + if (tableContextMenuCleanup) tableContextMenuCleanup(); + content.querySelectorAll(".table-wrapper.table-active").forEach((w) => { + w.classList.remove("table-active"); + }); + + // Disable checkboxes in read mode + content.querySelectorAll('input[type="checkbox"]').forEach(cb => { + cb.setAttribute("disabled", ""); + }); + + content.removeAttribute("contenteditable"); + content.classList.remove("editing"); + if (beforeInputHandler) { + content.removeEventListener("beforeinput", beforeInputHandler); + beforeInputHandler = null; + } + if (inputHandler) { + content.removeEventListener("input", inputHandler); + inputHandler = null; + } + if (keydownHandler) { + content.removeEventListener("keydown", keydownHandler); + keydownHandler = null; + } + if (pasteHandler) { + content.removeEventListener("paste", pasteHandler); + pasteHandler = null; + } + if (checkboxHandler) { + content.removeEventListener("click", checkboxHandler); + checkboxHandler = null; + } + if (selectionHandler) { + document.removeEventListener("selectionchange", selectionHandler); + selectionHandler = null; + } + if (selectionFallbackMouseUp) { + content.removeEventListener("mouseup", selectionFallbackMouseUp); + selectionFallbackMouseUp = null; + } + if (selectionFallbackKeyUp) { + content.removeEventListener("keyup", selectionFallbackKeyUp); + selectionFallbackKeyUp = null; + } + + resetUndoHistory(content); + setState({ isDirty: false }); +} diff --git a/src-mdviewer/src/components/embedded-toolbar.js b/src-mdviewer/src/components/embedded-toolbar.js new file mode 100644 index 0000000000..9e229fce76 --- /dev/null +++ b/src-mdviewer/src/components/embedded-toolbar.js @@ -0,0 +1,417 @@ +/** + * Minimal embedded toolbar for Phoenix live preview. + * Read mode: "Edit" button + * Edit mode: Format row + "Done" button + * Responsive: progressively collapses groups into dropdowns as width shrinks. + * Level 0: all expanded + * Level 1: block elements collapse + * Level 2: block elements + lists collapse + * Level 3: all groups collapse + */ +import { + createIcons, + Pencil, + Bold, + Italic, + Strikethrough, + Underline, + Code, + Link, + List, + ListOrdered, + ListChecks, + Quote, + Minus, + Table, + FileCode, + ChevronDown, + Type, + MoreHorizontal, + BookOpen, + Link2, + Link2Off, + Printer, + Image as ImageIcon, + Upload +} from "lucide"; +import { on, emit } from "../core/events.js"; +import { getState, setState } from "../core/state.js"; +import { t, tp } from "../core/i18n.js"; + +let toolbar = null; +let resizeObserver = null; +let cursorSyncEnabled = true; +let collapseLevel = 0; // 0=expanded, 1=blocks, 2=blocks+lists, 3=all + +// Width thresholds for progressive collapse +const THRESHOLD_BLOCKS = 640; // collapse block elements + image first +const THRESHOLD_LISTS = 520; // then lists +const THRESHOLD_TEXT = 500; // finally text formatting (all dropdowns collapsed) + +const allIcons = { Bold, Italic, Strikethrough, Underline, Code, Link, List, ListOrdered, + ListChecks, Quote, Minus, Table, FileCode, ChevronDown, Type, MoreHorizontal, Pencil, BookOpen, Link2, Link2Off, Printer, Image: ImageIcon, Upload }; + +export function initEmbeddedToolbar() { + toolbar = document.getElementById("toolbar"); + if (!toolbar) return; + + render(); + + on("state:editMode", () => render()); + on("editor:selection-state", updateFormatState); + on("state:locale", () => render()); +} + +function render() { + if (!toolbar) return; + const state = getState(); + + if (resizeObserver) { + resizeObserver.disconnect(); + resizeObserver = null; + } + + if (state.editMode) { + renderEditMode(collapseLevel); + setupResponsiveToggle(); + } else { + renderReadMode(); + } +} + +function renderReadMode() { + toolbar.innerHTML = `
`; + + createIcons({ icons: allIcons, attrs: { class: "" } }); + // Remove data-lucide from replaced SVGs to prevent warnings on subsequent createIcons calls + toolbar.querySelectorAll("svg[data-lucide]").forEach(svg => svg.removeAttribute("data-lucide")); + + wireCursorSyncButton(); + wirePrintButton(); + + const editBtn = document.getElementById("emb-edit-btn"); + if (editBtn) { + editBtn.addEventListener("click", () => { + emit("request:editMode"); + }); + } +} + +function btn(id, icon, tooltip) { + return ``; +} + +function dropdown(group, triggerIcon, tooltip, content) { + return ``; +} + +function renderEditMode(level) { + const isMac = /Mac|iPhone|iPad/.test(navigator.platform); + const mod = isMac ? "\u2318" : "Ctrl"; + + const blockTypeSelect = ` + `; + + const textBtns = [ + btn("emb-bold", "bold", tp("format.bold", { mod }) || "Bold"), + btn("emb-italic", "italic", tp("format.italic", { mod }) || "Italic"), + btn("emb-strike", "strikethrough", tp("format.strikethrough", { mod }) || "Strikethrough"), + btn("emb-underline", "underline", tp("format.underline", { mod }) || "Underline"), + btn("emb-code", "code", t("format.code") || "Code"), + btn("emb-link", "link", tp("format.link", { mod }) || "Link") + ].join(""); + + const listBtns = [ + btn("emb-ul", "list", t("format.bullet_list") || "Bullet list"), + btn("emb-ol", "list-ordered", t("format.numbered_list") || "Numbered list"), + btn("emb-task", "list-checks", t("format.task_list") || "Task list") + ].join(""); + + const blockBtns = [ + btn("emb-quote", "quote", t("format.blockquote") || "Quote"), + btn("emb-hr", "minus", t("format.divider") || "Divider"), + btn("emb-table", "table", t("format.table") || "Table"), + btn("emb-codeblock", "file-code", t("format.code_block") || "Code block") + ].join(""); + + const imageBtns = ` + + `; + + // Build the text section (inline or dropdown) + const textSection = level >= 3 + ? dropdown("text", "type", t("format.text_formatting") || "Text formatting", textBtns) + : textBtns; + + // Build the list section (inline or dropdown) + const listSection = level >= 2 + ? dropdown("lists", "list", t("format.lists") || "Lists", listBtns) + : listBtns; + + // Build the block section (inline or dropdown) + const blockSection = level >= 1 + ? dropdown("blocks", "more-horizontal", t("format.more_elements") || "More", blockBtns) + : blockBtns; + + // Image section is always a dropdown (two options inside) + const imageSection = dropdown("image", "image", t("format.image") || "Image", imageBtns); + + const formatRow = ` ++ ${blockTypeSelect} + + ${textSection} + + ${listSection} + + ${blockSection} + + ${imageSection} +`; + + toolbar.innerHTML = ``; + + createIcons({ icons: allIcons, attrs: { class: "" } }); + // Remove data-lucide from replaced SVGs to prevent warnings on subsequent createIcons calls + toolbar.querySelectorAll("svg[data-lucide]").forEach(svg => svg.removeAttribute("data-lucide")); + + wireFormatButtons(); + wireBlockTypeSelect(); + wireDropdowns(); + wireCursorSyncButton(); + wirePrintButton(); + wireDoneButton(); +} + +const formatBindings = [ + { id: "emb-bold", command: "bold" }, + { id: "emb-italic", command: "italic" }, + { id: "emb-strike", command: "strikethrough" }, + { id: "emb-underline", command: "underline" }, + { id: "emb-code", command: "code" }, + { id: "emb-link", command: "createLink" }, + { id: "emb-ul", command: "insertUnorderedList" }, + { id: "emb-ol", command: "insertOrderedList" }, + { id: "emb-task", command: "taskList" }, + { id: "emb-quote", command: "formatBlock", value: "" }, + { id: "emb-hr", command: "insertHorizontalRule" }, + { id: "emb-table", command: "table" }, + { id: "emb-codeblock", command: "codeBlock" }, + { id: "emb-image-url", command: "imageFromUrl" }, + { id: "emb-image-upload", command: "imageUpload" } +]; + +function wireFormatButtons() { + for (const binding of formatBindings) { + const el = document.getElementById(binding.id); + if (el) { + el.addEventListener("mousedown", (e) => { + e.preventDefault(); + emit("action:format", { command: binding.command, value: binding.value }); + }); + } + } +} + +function wireBlockTypeSelect() { + const blockTypeSelect = document.getElementById("emb-block-type"); + if (blockTypeSelect) { + blockTypeSelect.addEventListener("change", (e) => { + emit("action:format", { command: "formatBlock", value: e.target.value }); + e.target.blur(); + }); + } +} + +function wireDropdowns() { + const dropdowns = toolbar.querySelectorAll(".toolbar-dropdown"); + for (const dropdown of dropdowns) { + const trigger = dropdown.querySelector(".toolbar-dropdown-trigger"); + if (!trigger) continue; + + trigger.addEventListener("mousedown", (e) => { + e.preventDefault(); + e.stopPropagation(); + const wasOpen = dropdown.classList.contains("open"); + closeAllDropdowns(); + if (!wasOpen) { + dropdown.classList.add("open"); + } + }); + } + + document.addEventListener("mousedown", (e) => { + if (!e.target.closest(".toolbar-dropdown")) { + closeAllDropdowns(); + } + }); +} + +function closeAllDropdowns() { + const openDropdowns = toolbar.querySelectorAll(".toolbar-dropdown.open"); + for (const d of openDropdowns) { + d.classList.remove("open"); + } +} + +function wireCursorSyncButton() { + const syncBtn = document.getElementById("emb-cursor-sync"); + if (syncBtn) { + syncBtn.addEventListener("click", () => { + cursorSyncEnabled = !cursorSyncEnabled; + syncBtn.classList.toggle("active", cursorSyncEnabled); + syncBtn.setAttribute("aria-pressed", String(cursorSyncEnabled)); + const onIcon = syncBtn.querySelector(".sync-on-icon"); + const offIcon = syncBtn.querySelector(".sync-off-icon"); + if (onIcon) onIcon.style.display = cursorSyncEnabled ? "" : "none"; + if (offIcon) offIcon.style.display = cursorSyncEnabled ? "none" : ""; + emit("toggle:cursorSync", { enabled: cursorSyncEnabled }); + }); + } +} + +function wirePrintButton() { + const printBtn = document.getElementById("emb-print-btn"); + if (printBtn) { + printBtn.addEventListener("click", () => { + window.print(); + }); + } +} + +function wireDoneButton() { + const doneBtn = document.getElementById("emb-done-btn"); + if (doneBtn) { + doneBtn.addEventListener("click", () => { + setState({ editMode: false }); + }); + } +} + +function widthToCollapseLevel(width) { + if (width < THRESHOLD_TEXT) return 3; + if (width < THRESHOLD_LISTS) return 2; + if (width < THRESHOLD_BLOCKS) return 1; + return 0; +} + +function setupResponsiveToggle() { + function checkWidth() { + const width = toolbar.offsetWidth; + const newLevel = widthToCollapseLevel(width); + if (newLevel !== collapseLevel) { + collapseLevel = newLevel; + renderEditMode(collapseLevel); + resizeObserver.observe(toolbar); + } + } + + resizeObserver = new ResizeObserver(() => checkWidth()); + resizeObserver.observe(toolbar); +} + +function updateFormatState(state) { + if (!toolbar || !getState().editMode) return; + + const mappings = [ + { id: "emb-bold", key: "bold" }, + { id: "emb-italic", key: "italic" }, + { id: "emb-strike", key: "strikethrough" }, + { id: "emb-underline", key: "underline" }, + { id: "emb-code", key: "isCode" }, + { id: "emb-link", key: "isLink" }, + { id: "emb-ul", key: "unorderedList" }, + { id: "emb-ol", key: "orderedList" } + ]; + + for (const m of mappings) { + const el = document.getElementById(m.id); + if (el) { + const active = !!state[m.key]; + el.classList.toggle("active", active); + el.setAttribute("aria-pressed", String(active)); + } + } + + // Hide block-level controls when inside a table or list + const hideBlocks = !!state.inTable || !!state.inList; + const blockLevelIds = ["emb-quote", "emb-hr", "emb-table", "emb-codeblock"]; + const blockDropdowns = toolbar.querySelectorAll('.toolbar-dropdown[data-group="blocks"]'); + for (const id of blockLevelIds) { + const el = document.getElementById(id); + if (el) el.style.display = hideBlocks ? "none" : ""; + } + for (const dd of blockDropdowns) { + dd.style.display = hideBlocks ? "none" : ""; + } + // Hide list buttons only in tables (they're useful in lists for switching UL/OL) + const listIds = ["emb-ul", "emb-ol", "emb-task"]; + const listDropdowns = toolbar.querySelectorAll('.toolbar-dropdown[data-group="lists"]'); + for (const id of listIds) { + const el = document.getElementById(id); + if (el) el.style.display = state.inTable ? "none" : ""; + } + for (const dd of listDropdowns) { + dd.style.display = state.inTable ? "none" : ""; + } + // Disable bold button in headings (headings are already bold) + const boldBtn = document.getElementById("emb-bold"); + if (boldBtn) { + boldBtn.style.opacity = state.inHeading ? "0.3" : ""; + boldBtn.style.pointerEvents = state.inHeading ? "none" : ""; + } + + // Hide block type selector in tables and lists + const blockTypeSelect = document.getElementById("emb-block-type"); + if (blockTypeSelect) { + blockTypeSelect.style.display = (state.inTable || state.inList) ? "none" : ""; + } + + if (blockTypeSelect && state.blockType) { + const tagToValue = { + "H1": "", "H2": "
", "H3": "
", "H4": "
", "H5": "
", + "P": "
", "DIV": "
" + }; + const val = tagToValue[state.blockType] || "
"; + if (blockTypeSelect.value !== val) { + blockTypeSelect.value = val; + } + } +} diff --git a/src-mdviewer/src/components/format-bar.js b/src-mdviewer/src/components/format-bar.js new file mode 100644 index 0000000000..af44496980 --- /dev/null +++ b/src-mdviewer/src/components/format-bar.js @@ -0,0 +1,299 @@ +import { + createIcons, + Bold, + Italic, + Strikethrough, + Underline, + Code, + Link, +} from "lucide"; +import { on, emit } from "../core/events.js"; +import { getSelectionRect } from "./editor.js"; +import { t, tp } from "../core/i18n.js"; + +const isMac = /Mac|iPhone|iPad/.test(navigator.platform); +const mod = isMac ? "\u2318" : "Ctrl"; + +let bar = null; +let contentEl = null; +let rafId = null; +let linkMode = false; +let savedRange = null; + +const buttons = [ + { id: "fb-bold", icon: "bold", command: "bold", tooltipKey: "format.bold", stateKey: "bold" }, + { id: "fb-italic", icon: "italic", command: "italic", tooltipKey: "format.italic", stateKey: "italic" }, + { id: "fb-strike", icon: "strikethrough", command: "strikethrough", tooltipKey: "format.strikethrough", stateKey: "strikethrough" }, + { id: "fb-underline", icon: "underline", command: "underline", tooltipKey: "format.underline", stateKey: "underline" }, + null, // divider + { id: "fb-code", icon: "code", command: "code", tooltipKey: "format.code", stateKey: "isCode" }, + { id: "fb-link", icon: "link", command: "createLink", tooltipKey: "format.link", stateKey: "isLink" }, +]; + +function buildBar() { + bar = document.getElementById("format-bar"); + if (!bar) return; + + let html = '
"; + + // Link input (hidden by default) + html += ``; + + bar.innerHTML = html; + + createIcons({ + icons: { Bold, Italic, Strikethrough, Underline, Code, Link }, + attrs: { class: "" }, + }); + bar.querySelectorAll("svg[data-lucide]").forEach(svg => svg.removeAttribute("data-lucide")); + + // Button click handlers + for (const btn of buttons) { + if (btn === null) continue; + const el = document.getElementById(btn.id); + if (!el) continue; + el.addEventListener("mousedown", (e) => { + e.preventDefault(); // keep selection + if (btn.command === "createLink") { + enterLinkMode(); + } else { + emit("action:format", { command: btn.command }); + } + }); + } + + // Link input handlers + const linkInput = document.getElementById("fb-link-url"); + if (linkInput) { + linkInput.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.preventDefault(); + const url = linkInput.value.trim(); + if (url) { + restoreSelection(); + emit("action:format", { command: "createLink", value: url }); + } + exitLinkMode(); + } else if (e.key === "Escape") { + e.preventDefault(); + exitLinkMode(); + contentEl?.focus({ preventScroll: true }); + } + }); + } + + // Cancel button in link input + const cancelBtn = document.getElementById("fb-link-cancel"); + if (cancelBtn) { + cancelBtn.addEventListener("mousedown", (e) => e.preventDefault()); + cancelBtn.addEventListener("click", () => { + exitLinkMode(); + contentEl?.focus({ preventScroll: true }); + }); + } + + // Roving tabindex - arrow key navigation + bar.addEventListener("keydown", (e) => { + if (e.key === "Escape") { + hide(); + contentEl?.focus({ preventScroll: true }); + return; + } + if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return; + const focusable = Array.from(bar.querySelectorAll("button:not([style*='display:none'])")); + const idx = focusable.indexOf(document.activeElement); + if (idx === -1) return; + e.preventDefault(); + const next = e.key === "ArrowRight" + ? focusable[(idx + 1) % focusable.length] + : focusable[(idx - 1 + focusable.length) % focusable.length]; + next.focus(); + }); +} + +function enterLinkMode() { + linkMode = true; + saveSelection(); + const btns = bar.querySelector(".format-bar-buttons"); + const linkInputWrap = document.getElementById("fb-link-input"); + const linkInput = document.getElementById("fb-link-url"); + if (btns) btns.style.display = "none"; + if (linkInputWrap) linkInputWrap.style.display = "flex"; + if (linkInput) { + linkInput.value = ""; + linkInput.focus(); + } +} + +function exitLinkMode() { + linkMode = false; + const btns = bar.querySelector(".format-bar-buttons"); + const linkInputWrap = document.getElementById("fb-link-input"); + if (btns) btns.style.display = ""; + if (linkInputWrap) linkInputWrap.style.display = "none"; +} + +function saveSelection() { + const sel = window.getSelection(); + if (sel.rangeCount > 0) { + savedRange = sel.getRangeAt(0).cloneRange(); + } +} + +function restoreSelection() { + if (!savedRange) return; + const sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(savedRange); + savedRange = null; +} + +function onDocumentMousedown(e) { + if (!bar || !linkMode) return; + if (bar.contains(e.target)) return; + exitLinkMode(); + contentEl?.focus({ preventScroll: true }); +} + +function show(rect) { + if (!bar) return; + const barW = bar.offsetWidth || 200; + const barH = bar.offsetHeight || 36; + let left = rect.left + rect.width / 2 - barW / 2; + let top = rect.top - barH - 8; + + // Flip below if too close to top + if (top < 4) { + top = rect.bottom + 8; + } + // Clamp horizontal + left = Math.max(4, Math.min(left, window.innerWidth - barW - 4)); + + bar.style.left = left + "px"; + bar.style.top = top + "px"; + bar.classList.add("visible"); +} + +function hide() { + if (!bar) return; + bar.classList.remove("visible"); + if (linkMode) exitLinkMode(); +} + +function isVisible() { + return bar && bar.classList.contains("visible"); +} + +function updatePosition() { + if (rafId) cancelAnimationFrame(rafId); + rafId = requestAnimationFrame(() => { + rafId = null; + if (linkMode) return; // don't reposition while editing link + const sel = window.getSelection(); + if (!sel || sel.isCollapsed || !sel.rangeCount) { + hide(); + return; + } + // Check selection is inside contentEl + if (!contentEl || !contentEl.contains(sel.anchorNode)) { + hide(); + return; + } + // Skip if slash menu is open + const slashMenu = document.getElementById("slash-menu"); + if (slashMenu && slashMenu.classList.contains("visible")) { + hide(); + return; + } + // Skip if lang picker is visible + const langPicker = document.getElementById("lang-picker"); + if (langPicker && langPicker.classList.contains("visible")) { + hide(); + return; + } + // Require some meaningful selection length + const text = sel.toString(); + if (text.length < 2) { + hide(); + return; + } + const rect = getSelectionRect(); + if (!rect) { + hide(); + return; + } + show(rect); + }); +} + +function onSelectionState(state) { + if (!bar) return; + for (const btn of buttons) { + if (btn === null) continue; + const el = document.getElementById(btn.id); + if (!el) continue; + const active = !!state[btn.stateKey]; + el.classList.toggle("active", active); + el.setAttribute("aria-pressed", String(active)); + } + // Disable bold in headings (headings are already bold) + const boldBtn = document.getElementById("fb-bold"); + if (boldBtn) { + boldBtn.style.opacity = state.inHeading ? "0.3" : ""; + boldBtn.style.pointerEvents = state.inHeading ? "none" : ""; + } +} + +export function initFormatBar(editorEl) { + contentEl = editorEl; + buildBar(); + + document.addEventListener("selectionchange", updatePosition); + document.addEventListener("mousedown", onDocumentMousedown); + // Fallback for WebKitGTK + contentEl.addEventListener("mouseup", updatePosition); + contentEl.addEventListener("keyup", updatePosition); + // Dismiss on scroll + const appViewer = document.getElementById("app-viewer"); + if (appViewer) { + appViewer.addEventListener("scroll", hide); + } + on("editor:selection-state", onSelectionState); + + on("state:locale", () => { + buildBar(); + }); +} + +export function destroyFormatBar() { + hide(); + document.removeEventListener("selectionchange", updatePosition); + document.removeEventListener("mousedown", onDocumentMousedown); + if (contentEl) { + contentEl.removeEventListener("mouseup", updatePosition); + contentEl.removeEventListener("keyup", updatePosition); + } + if (bar) bar.innerHTML = ""; + contentEl = null; + linkMode = false; + savedRange = null; +} + +export function focusFormatBar() { + if (!bar || !isVisible()) return false; + const first = bar.querySelector("button"); + if (first) { first.focus(); return true; } + return false; +} diff --git a/src-mdviewer/src/components/lang-picker.js b/src-mdviewer/src/components/lang-picker.js new file mode 100644 index 0000000000..aa06b524dd --- /dev/null +++ b/src-mdviewer/src/components/lang-picker.js @@ -0,0 +1,351 @@ +import Prism from "prismjs"; +import { t } from "../core/i18n.js"; + +let picker = null; +let contentEl = null; +let rafId = null; +let currentPre = null; +let dropdownOpen = false; +let selectedIndex = -1; +let filteredLangs = []; +let keydownListener = null; +let filterQuery = ""; + +const LANGUAGES = [ + { id: "", label: "Plain text" }, + { id: "javascript", label: "JavaScript" }, + { id: "typescript", label: "TypeScript" }, + { id: "css", label: "CSS" }, + { id: "json", label: "JSON" }, + { id: "bash", label: "Bash" }, + { id: "python", label: "Python" }, + { id: "rust", label: "Rust" }, + { id: "go", label: "Go" }, + { id: "java", label: "Java" }, + { id: "c", label: "C" }, + { id: "cpp", label: "C++" }, + { id: "yaml", label: "YAML" }, + { id: "toml", label: "TOML" }, + { id: "markdown", label: "Markdown" }, + { id: "sql", label: "SQL" }, + { id: "jsx", label: "JSX" }, + { id: "tsx", label: "TSX" }, +]; + +function langLabel(lang) { + return lang.id === "" ? t("lang_picker.plain_text") : lang.label; +} + +function findPreAtSelection() { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return null; + let node = sel.anchorNode; + while (node) { + if (node.nodeType === 1 && node.tagName === "PRE" && contentEl && contentEl.contains(node)) { + return node; + } + node = node.parentNode; + } + return null; +} + +function buildPicker() { + picker = document.getElementById("lang-picker"); + if (!picker) return; + picker.innerHTML = ""; + + // Trigger button + const trigger = document.createElement("button"); + trigger.className = "lang-picker-trigger"; + trigger.type = "button"; + trigger.textContent = t("lang_picker.plain_text"); + trigger.addEventListener("mousedown", (e) => e.preventDefault()); + trigger.addEventListener("click", () => { + if (dropdownOpen) { + closeDropdown(); + } else { + openDropdown(); + } + }); + picker.appendChild(trigger); + + // Dropdown container + const dropdown = document.createElement("div"); + dropdown.className = "lang-picker-dropdown"; + + // Search input (display-only, reflects filterQuery typed via captured keydown) + const search = document.createElement("input"); + search.type = "text"; + search.className = "lang-picker-search"; + search.placeholder = t("lang_picker.filter_placeholder"); + search.setAttribute("aria-label", t("lang_picker.filter_label")); + search.setAttribute("readonly", ""); + search.addEventListener("mousedown", (e) => e.preventDefault()); + dropdown.appendChild(search); + + // Scrollable list + const list = document.createElement("div"); + list.className = "lang-picker-list"; + list.setAttribute("role", "listbox"); + dropdown.appendChild(list); + + picker.appendChild(dropdown); + populateList(""); +} + +function populateList(filter) { + const list = picker.querySelector(".lang-picker-list"); + if (!list) return; + list.innerHTML = ""; + + const lowerFilter = filter.toLowerCase(); + filteredLangs = LANGUAGES.filter( + (lang) => langLabel(lang).toLowerCase().includes(lowerFilter) || lang.id.toLowerCase().includes(lowerFilter), + ); + + const currentLang = currentPre ? (currentPre.getAttribute("data-language") || "") : ""; + + filteredLangs.forEach((lang, i) => { + const item = document.createElement("div"); + item.className = "lang-picker-item"; + item.setAttribute("role", "option"); + item.textContent = langLabel(lang); + if (lang.id === currentLang) { + item.classList.add("active"); + } + item.addEventListener("mousedown", (e) => e.preventDefault()); + item.addEventListener("click", () => selectLanguage(lang.id)); + item.addEventListener("mouseenter", () => { + setSelectedIndex(i); + }); + list.appendChild(item); + }); + + selectedIndex = filteredLangs.length > 0 ? 0 : -1; + highlightSelected(); +} + +function highlightSelected() { + const items = picker.querySelectorAll(".lang-picker-item"); + items.forEach((el, i) => { + el.classList.toggle("selected", i === selectedIndex); + }); + if (selectedIndex >= 0 && selectedIndex < items.length) { + items[selectedIndex].scrollIntoView({ block: "nearest" }); + } +} + +function setSelectedIndex(idx) { + selectedIndex = idx; + highlightSelected(); +} + +// Keyboard handler — attached on contentEl in capture phase (same as slash-menu) +function handleKeydown(e) { + if (!dropdownOpen) return; + + if (e.key === "ArrowDown") { + e.preventDefault(); + e.stopImmediatePropagation(); + const next = selectedIndex < filteredLangs.length - 1 ? selectedIndex + 1 : 0; + setSelectedIndex(next); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + e.stopImmediatePropagation(); + const prev = selectedIndex > 0 ? selectedIndex - 1 : filteredLangs.length - 1; + setSelectedIndex(prev); + } else if (e.key === "Enter") { + e.preventDefault(); + e.stopImmediatePropagation(); + if (selectedIndex >= 0 && selectedIndex < filteredLangs.length) { + selectLanguage(filteredLangs[selectedIndex].id); + } + } else if (e.key === "Escape") { + e.preventDefault(); + e.stopImmediatePropagation(); + closeDropdown(); + } else if (e.key === "Backspace") { + e.preventDefault(); + e.stopImmediatePropagation(); + if (filterQuery.length > 0) { + filterQuery = filterQuery.slice(0, -1); + updateSearchDisplay(); + populateList(filterQuery); + } + } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) { + // Printable character — append to filter query + e.preventDefault(); + e.stopImmediatePropagation(); + filterQuery += e.key; + updateSearchDisplay(); + populateList(filterQuery); + } +} + +function updateSearchDisplay() { + const search = picker.querySelector(".lang-picker-search"); + if (search) search.value = filterQuery; +} + +function selectLanguage(langId) { + if (!currentPre) return; + currentPre.setAttribute("data-language", langId); + // Sync class onand trigger Prism highlighting + const code = currentPre.querySelector("code"); + if (code) { + if (langId) { + code.className = `language-${langId}`; + Prism.highlightElement(code); + } else { + code.className = ""; + } + } + // Update trigger text + const lang = LANGUAGES.find((l) => l.id === langId); + const trigger = picker.querySelector(".lang-picker-trigger"); + if (trigger) trigger.textContent = lang ? langLabel(lang) : langId || t("lang_picker.plain_text"); + // Dispatch input event to mark editor dirty + if (contentEl) { + contentEl.dispatchEvent(new Event("input", { bubbles: true })); + } + closeDropdown(); +} + +function openDropdown() { + dropdownOpen = true; + filterQuery = ""; + const dropdown = picker.querySelector(".lang-picker-dropdown"); + if (dropdown) dropdown.classList.add("open"); + updateSearchDisplay(); + populateList(""); +} + +function closeDropdown() { + dropdownOpen = false; + filterQuery = ""; + const dropdown = picker.querySelector(".lang-picker-dropdown"); + if (dropdown) dropdown.classList.remove("open"); + selectedIndex = -1; +} + +function show(preEl) { + if (!picker) return; + currentPre = preEl; + // Set trigger text from current language + const lang = preEl.getAttribute("data-language") || ""; + const entry = LANGUAGES.find((l) => l.id === lang); + const trigger = picker.querySelector(".lang-picker-trigger"); + if (trigger) trigger.textContent = entry ? langLabel(entry) : lang || t("lang_picker.plain_text"); + + // Position near top-left of+ const rect = preEl.getBoundingClientRect(); + const pickerW = picker.offsetWidth || 180; + let left = rect.left; + let top = rect.top - (picker.offsetHeight || 32) - 6; + + // If too close to top, show below the pre's top edge + if (top < 4) { + top = rect.top + 4; + } + // Clamp horizontal + left = Math.max(4, Math.min(left, window.innerWidth - pickerW - 4)); + + picker.style.left = left + "px"; + picker.style.top = top + "px"; + picker.classList.add("visible"); +} + +function hide() { + if (!picker) return; + picker.classList.remove("visible"); + closeDropdown(); + currentPre = null; +} + +function updatePosition() { + if (rafId) cancelAnimationFrame(rafId); + rafId = requestAnimationFrame(() => { + rafId = null; + if (dropdownOpen) return; // don't reposition while dropdown is open + + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) { + hide(); + return; + } + + // Check selection is inside contentEl + if (!contentEl || !contentEl.contains(sel.anchorNode)) { + hide(); + return; + } + + // If text is selected (non-collapsed), let format bar handle it + if (!sel.isCollapsed) { + hide(); + return; + } + + // Hide if format-bar or slash-menu is visible + const formatBar = document.getElementById("format-bar"); + if (formatBar && formatBar.classList.contains("visible")) { + hide(); + return; + } + const slashMenu = document.getElementById("slash-menu"); + if (slashMenu && slashMenu.classList.contains("visible")) { + hide(); + return; + } + + const pre = findPreAtSelection(); + if (pre) { + show(pre); + } else { + hide(); + } + }); +} + +function onDocumentMousedown(e) { + if (!picker) return; + if (!dropdownOpen) return; + if (picker.contains(e.target)) return; + closeDropdown(); +} + +export function isLangPickerDropdownOpen() { + return dropdownOpen; +} + +export function initLangPicker(editorEl) { + contentEl = editorEl; + buildPicker(); + + keydownListener = handleKeydown; + contentEl.addEventListener("keydown", keydownListener, true); // capture phase + + document.addEventListener("selectionchange", updatePosition); + contentEl.addEventListener("mouseup", updatePosition); + contentEl.addEventListener("keyup", updatePosition); + document.addEventListener("mousedown", onDocumentMousedown); +} + +export function destroyLangPicker() { + hide(); + if (contentEl) { + contentEl.removeEventListener("keydown", keydownListener, true); + contentEl.removeEventListener("mouseup", updatePosition); + contentEl.removeEventListener("keyup", updatePosition); + } + document.removeEventListener("selectionchange", updatePosition); + document.removeEventListener("mousedown", onDocumentMousedown); + if (picker) picker.innerHTML = ""; + contentEl = null; + currentPre = null; + dropdownOpen = false; + selectedIndex = -1; + filteredLangs = []; + keydownListener = null; + filterQuery = ""; +} diff --git a/src-mdviewer/src/components/link-popover.js b/src-mdviewer/src/components/link-popover.js new file mode 100644 index 0000000000..48678e22ca --- /dev/null +++ b/src-mdviewer/src/components/link-popover.js @@ -0,0 +1,453 @@ +import { on, off, emit } from "../core/events.js"; +import { getSelectionRect } from "./editor.js"; +import { t } from "../core/i18n.js"; + +let popover = null; +let contentEl = null; +let rafId = null; +let savedRange = null; +let editMode = false; +let currentAnchor = null; // the element the popover is attached to +let createMode = false; // true when creating a new link (no existing ) +let showLinkInputHandler = null; + +function findAnchorAtSelection() { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return null; + let node = sel.anchorNode; + while (node) { + if (node.nodeType === 1 && node.tagName === "A") return node; + node = node.parentNode; + } + return null; +} + +function saveSelection() { + const sel = window.getSelection(); + if (sel && sel.rangeCount > 0) { + savedRange = sel.getRangeAt(0).cloneRange(); + } +} + +function restoreSelection() { + if (!savedRange) return; + const sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(savedRange); + savedRange = null; +} + +function buildPopover() { + popover = document.getElementById("link-popover"); + if (!popover) return; + popover.innerHTML = ""; + // View mode + const viewDiv = document.createElement("div"); + viewDiv.className = "link-popover-view"; + + const urlText = document.createElement("a"); + urlText.className = "link-popover-url"; + urlText.target = "_blank"; + urlText.rel = "noopener noreferrer"; + urlText.addEventListener("click", (e) => { + e.preventDefault(); + const href = urlText.getAttribute("href"); + if (href) { + window.parent.postMessage({ + type: "MDVIEWR_EVENT", + eventName: "embeddedIframeHrefClick", + href: href + }, "*"); + } + }); + viewDiv.appendChild(urlText); + + const editBtn = document.createElement("button"); + editBtn.className = "toolbar-btn link-popover-edit-btn"; + editBtn.setAttribute("aria-label", t("link.edit_link")); + editBtn.textContent = t("link.edit"); + editBtn.addEventListener("mousedown", (e) => e.preventDefault()); + editBtn.addEventListener("click", () => enterEditMode()); + viewDiv.appendChild(editBtn); + + const unlinkBtn = document.createElement("button"); + unlinkBtn.className = "toolbar-btn link-popover-unlink-btn"; + unlinkBtn.setAttribute("aria-label", t("link.remove_link")); + unlinkBtn.innerHTML = ''; + unlinkBtn.addEventListener("mousedown", (e) => e.preventDefault()); + unlinkBtn.addEventListener("click", () => { + if (currentAnchor && currentAnchor.parentNode) { + const text = document.createTextNode(currentAnchor.textContent); + currentAnchor.parentNode.replaceChild(text, currentAnchor); + } + hide(); + contentEl?.focus({ preventScroll: true }); + contentEl?.dispatchEvent(new Event("input", { bubbles: true })); + }); + viewDiv.appendChild(unlinkBtn); + + popover.appendChild(viewDiv); + + // Edit mode + const editDiv = document.createElement("div"); + editDiv.className = "link-popover-edit"; + editDiv.style.display = "none"; + + // Top bar with close button + const topBar = document.createElement("div"); + topBar.className = "link-popover-top-bar"; + const cancelBtn = document.createElement("button"); + cancelBtn.className = "toolbar-btn link-popover-cancel-btn"; + cancelBtn.setAttribute("aria-label", t("link.cancel")); + cancelBtn.innerHTML = "×"; + cancelBtn.addEventListener("mousedown", (e) => e.preventDefault()); + cancelBtn.addEventListener("click", () => cancelEdit()); + topBar.appendChild(cancelBtn); + editDiv.appendChild(topBar); + + // Text row + const textRow = document.createElement("div"); + textRow.className = "link-popover-edit-row"; + const textLabel = document.createElement("span"); + textLabel.className = "link-popover-label"; + textLabel.textContent = t("link.text"); + textRow.appendChild(textLabel); + const textInput = document.createElement("input"); + textInput.type = "text"; + textInput.className = "link-popover-text-input"; + textInput.placeholder = t("link.text_placeholder"); + textInput.setAttribute("aria-label", t("link.display_text")); + textRow.appendChild(textInput); + editDiv.appendChild(textRow); + + // URL row + const urlRow = document.createElement("div"); + urlRow.className = "link-popover-edit-row"; + const urlLabel = document.createElement("span"); + urlLabel.className = "link-popover-label"; + urlLabel.textContent = t("link.url"); + urlRow.appendChild(urlLabel); + const input = document.createElement("input"); + input.type = "text"; + input.className = "link-popover-input"; + input.placeholder = t("link.url_placeholder"); + input.setAttribute("aria-label", t("link.url")); + urlRow.appendChild(input); + + const confirmBtn = document.createElement("button"); + confirmBtn.className = "toolbar-btn link-popover-confirm-btn"; + confirmBtn.setAttribute("aria-label", t("link.apply")); + confirmBtn.innerHTML = "✓"; + confirmBtn.addEventListener("mousedown", (e) => e.preventDefault()); + confirmBtn.addEventListener("click", () => applyLink()); + urlRow.appendChild(confirmBtn); + + editDiv.appendChild(urlRow); + + // Remove link button + const removeRow = document.createElement("div"); + removeRow.className = "link-popover-remove-row"; + const removeBtn = document.createElement("button"); + removeBtn.className = "toolbar-btn link-popover-remove-btn"; + removeBtn.innerHTML = ` ${t("link.remove_link")}`; + removeBtn.addEventListener("mousedown", (e) => e.preventDefault()); + removeBtn.addEventListener("click", () => { + // Remove the link by unwrapping the — replace it with its text content + if (currentAnchor && currentAnchor.parentNode) { + const text = document.createTextNode(currentAnchor.textContent); + currentAnchor.parentNode.replaceChild(text, currentAnchor); + } + hide(); + contentEl?.focus({ preventScroll: true }); + contentEl?.dispatchEvent(new Event("input", { bubbles: true })); + }); + removeRow.appendChild(removeBtn); + editDiv.appendChild(removeRow); + + const handleKeydown = (e) => { + if (e.key === "Enter") { + e.preventDefault(); + applyLink(); + } else if (e.key === "Escape") { + e.preventDefault(); + cancelEdit(); + } + }; + textInput.addEventListener("keydown", handleKeydown); + input.addEventListener("keydown", handleKeydown); + + popover.appendChild(editDiv); +} + +function escapeHTML(str) { + return str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +function autoPrefix(url) { + if (!url) return url; + if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(url)) { + return "https://" + url; + } + return url; +} + +function applyLink() { + const input = popover.querySelector(".link-popover-input"); + const textInput = popover.querySelector(".link-popover-text-input"); + const rawUrl = input ? input.value.trim() : ""; + const text = textInput ? textInput.value.trim() : ""; + if (!rawUrl) { + cancelEdit(); + return; + } + const url = autoPrefix(rawUrl); + restoreSelection(); + + if (currentAnchor) { + // Editing existing link — update DOM directly + currentAnchor.href = url; + if (text) currentAnchor.textContent = text; + contentEl?.dispatchEvent(new Event("input", { bubbles: true })); + } else if (text) { + // Creating new link with custom display text + const safeUrl = escapeHTML(url); + const safeText = escapeHTML(text); + document.execCommand("insertHTML", false, `${safeText}`); + } else { + // Creating new link — default behavior (URL as text or wraps selection) + emit("action:format", { command: "createLink", value: url }); + } + + hide(); + contentEl?.focus({ preventScroll: true }); +} + +function cancelEdit() { + if (createMode) { + hide(); + restoreSelection(); + contentEl?.focus({ preventScroll: true }); + } else { + exitEditMode(); + } +} + +function enterEditMode() { + editMode = true; + saveSelection(); + const viewDiv = popover.querySelector(".link-popover-view"); + const editDiv = popover.querySelector(".link-popover-edit"); + const textInput = popover.querySelector(".link-popover-text-input"); + const input = popover.querySelector(".link-popover-input"); + if (viewDiv) viewDiv.style.display = "none"; + if (editDiv) editDiv.style.display = "flex"; + if (textInput) { + textInput.value = currentAnchor ? currentAnchor.textContent || "" : ""; + } + if (input) { + input.value = currentAnchor ? currentAnchor.getAttribute("href") || "" : ""; + input.focus(); + input.select(); + } +} + +function exitEditMode() { + editMode = false; + createMode = false; + const viewDiv = popover.querySelector(".link-popover-view"); + const editDiv = popover.querySelector(".link-popover-edit"); + if (viewDiv) viewDiv.style.display = ""; + if (editDiv) editDiv.style.display = "none"; +} + +function show(anchorEl) { + if (!popover) return; + currentAnchor = anchorEl; + const href = anchorEl.getAttribute("href") || ""; + const urlText = popover.querySelector(".link-popover-url"); + if (urlText) { + urlText.textContent = href; + urlText.href = href; + } + exitEditMode(); + positionPopover(anchorEl); + popover.classList.add("visible"); +} + +function showCreateMode() { + if (!popover) return; + createMode = true; + currentAnchor = null; + + // Grab selected text before saving the selection + const sel = window.getSelection(); + const selectedText = sel && !sel.isCollapsed ? sel.toString() : ""; + saveSelection(); + + const viewDiv = popover.querySelector(".link-popover-view"); + const editDiv = popover.querySelector(".link-popover-edit"); + const textInput = popover.querySelector(".link-popover-text-input"); + const input = popover.querySelector(".link-popover-input"); + if (viewDiv) viewDiv.style.display = "none"; + if (editDiv) editDiv.style.display = "flex"; + if (textInput) { + textInput.value = selectedText; + } + if (input) { + input.value = ""; + } + + // Position near selection + const rect = getSelectionRect(); + if (rect) { + positionPopoverAtRect(rect); + } else { + popover.style.left = "100px"; + popover.style.top = "100px"; + } + popover.classList.add("visible"); + + // Focus after it becomes visible + requestAnimationFrame(() => { + if (input) { + input.focus(); + } + }); +} + +function positionPopover(anchorEl) { + const rect = anchorEl.getBoundingClientRect(); + positionPopoverAtRect(rect); +} + +function positionPopoverAtRect(rect) { + const popW = popover.offsetWidth || 300; + const popH = popover.offsetHeight || 36; + let left = rect.left + rect.width / 2 - popW / 2; + let top = rect.bottom + 6; + + // Flip above if too close to bottom + if (top + popH > window.innerHeight - 4) { + top = rect.top - popH - 6; + } + // Clamp horizontal + left = Math.max(4, Math.min(left, window.innerWidth - popW - 4)); + + popover.style.left = left + "px"; + popover.style.top = top + "px"; +} + +function hide() { + if (!popover) return; + popover.classList.remove("visible"); + editMode = false; + createMode = false; + currentAnchor = null; +} + +function updatePosition() { + if (rafId) cancelAnimationFrame(rafId); + rafId = requestAnimationFrame(() => { + rafId = null; + if (editMode || createMode) return; // don't reposition while editing + + // If format bar is visible, hide link popover + const formatBar = document.getElementById("format-bar"); + if (formatBar && formatBar.classList.contains("visible")) { + hide(); + return; + } + + // If lang picker dropdown is open, hide link popover + const langPicker = document.getElementById("lang-picker"); + if (langPicker && langPicker.classList.contains("visible") && langPicker.querySelector(".lang-picker-dropdown.open")) { + hide(); + return; + } + + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) { + hide(); + return; + } + + // Check selection is inside contentEl + if (!contentEl || !contentEl.contains(sel.anchorNode)) { + hide(); + return; + } + + // If text is selected (non-collapsed), let format bar handle it + if (!sel.isCollapsed) { + hide(); + return; + } + + const anchor = findAnchorAtSelection(); + if (anchor) { + show(anchor); + } else { + hide(); + } + }); +} + +export function initLinkPopover(editorEl) { + contentEl = editorEl; + buildPopover(); + + document.addEventListener("selectionchange", updatePosition); + contentEl.addEventListener("mouseup", updatePosition); + contentEl.addEventListener("keyup", updatePosition); + // Dismiss on click outside the popover + document.addEventListener("mousedown", (e) => { + if (popover && popover.classList.contains("visible") && !popover.contains(e.target)) { + hide(); + } + }); + // Dismiss on scroll + const appViewer = document.getElementById("app-viewer"); + if (appViewer) { + appViewer.addEventListener("scroll", hide); + } + + showLinkInputHandler = () => { + // If cursor is inside a link, show popover in edit mode + const anchor = findAnchorAtSelection(); + if (anchor) { + show(anchor); + enterEditMode(); + } else { + // Create mode: show input for new link + showCreateMode(); + } + }; + on("action:show-link-input", showLinkInputHandler); + + on("state:locale", () => { + buildPopover(); + }); +} + +export function destroyLinkPopover() { + hide(); + document.removeEventListener("selectionchange", updatePosition); + if (contentEl) { + contentEl.removeEventListener("mouseup", updatePosition); + contentEl.removeEventListener("keyup", updatePosition); + } + if (popover) popover.innerHTML = ""; + if (showLinkInputHandler) { + off("action:show-link-input", showLinkInputHandler); + showLinkInputHandler = null; + } + contentEl = null; + savedRange = null; + editMode = false; + createMode = false; + currentAnchor = null; +} diff --git a/src-mdviewer/src/components/mermaid-editor.js b/src-mdviewer/src/components/mermaid-editor.js new file mode 100644 index 0000000000..24be384d35 --- /dev/null +++ b/src-mdviewer/src/components/mermaid-editor.js @@ -0,0 +1,390 @@ +// Adapted mermaid-editor — no cursor-sync dependency +import { + ensureMermaid, + detectTheme, + cleanupMermaidOrphans, + applyAccessibility, + parseAccessibility, + renderMermaidBlocks +} from "../core/mermaid-render.js"; +import { on, off } from "../core/events.js"; +import { t } from "../core/i18n.js"; +import { flushSnapshot } from "./editor.js"; + +const devLog = import.meta.env.DEV ? console.log.bind(console, "[mermaid-editor]") : () => {}; + +let contentEl = null; +let activeEditor = null; +let idCounter = 0; +let themeHandler = null; + +// ——— Hover overlay ——— + +function createOverlay(diagram) { + const overlay = document.createElement("div"); + overlay.className = "mermaid-edit-overlay"; + overlay.contentEditable = "false"; + overlay.innerHTML = ``; + + const btn = overlay.querySelector(".mermaid-edit-overlay-btn"); + btn.addEventListener("mousedown", (e) => { + e.preventDefault(); + e.stopPropagation(); + openEditor(diagram); + }); + + return overlay; +} + +function attachOverlayToBlock(diagram) { + if (diagram.querySelector(".mermaid-edit-overlay")) return; + diagram.appendChild(createOverlay(diagram)); +} + +export function attachOverlays() { + if (!contentEl) return; + const diagrams = contentEl.querySelectorAll(".mermaid-diagram"); + diagrams.forEach(attachOverlayToBlock); +} + +function removeOverlayFrom(diagram) { + const overlay = diagram.querySelector(".mermaid-edit-overlay"); + if (overlay) overlay.remove(); +} + +// ——— Editor ——— + +function openEditor(diagram) { + if (activeEditor) { + closeEditor(false); + } + + if (!contentEl) return; + + flushSnapshot(contentEl); + + const source = diagram.getAttribute("data-mermaid-source") || ""; + devLog("opening editor, source length:", source.length); + + removeOverlayFrom(diagram); + diagram.classList.add("mermaid-editing"); + + const existingSvg = diagram.querySelector("svg"); + + const toolbar = document.createElement("div"); + toolbar.className = "mermaid-editor-toolbar"; + toolbar.contentEditable = "false"; + toolbar.innerHTML = `Mermaid + `; + + const editorWrap = document.createElement("div"); + editorWrap.className = "mermaid-source-editor"; + editorWrap.contentEditable = "false"; + + const textarea = document.createElement("textarea"); + textarea.className = "mermaid-source-textarea"; + textarea.value = source; + textarea.spellcheck = false; + textarea.setAttribute("autocorrect", "off"); + textarea.setAttribute("autocapitalize", "off"); + editorWrap.appendChild(textarea); + + const errorBar = document.createElement("div"); + errorBar.className = "mermaid-error-bar"; + errorBar.contentEditable = "false"; + errorBar.style.display = "none"; + + const preview = document.createElement("div"); + preview.className = "mermaid-preview"; + preview.contentEditable = "false"; + + if (existingSvg) { + preview.appendChild(existingSvg); + } + + diagram.innerHTML = ""; + diagram.appendChild(toolbar); + diagram.appendChild(editorWrap); + diagram.appendChild(errorBar); + diagram.appendChild(preview); + + autoResizeTextarea(textarea); + + let debounceTimer = null; + let lastValidSvg = existingSvg ? existingSvg.outerHTML : ""; + + activeEditor = { + diagram, + textarea, + preview, + errorBar, + originalSource: source, + debounceTimer: null, + lastValidSvg, + cleanup: null + }; + + const onInput = () => { + autoResizeTextarea(textarea); + clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => { + renderPreview(textarea.value, preview, errorBar); + }, 300); + activeEditor.debounceTimer = debounceTimer; + }; + + const onKeydown = (e) => { + if (e.key === "Escape") { + e.preventDefault(); + e.stopPropagation(); + closeEditor(true); + } + if (e.key === "Tab") { + e.preventDefault(); + const start = textarea.selectionStart; + const end = textarea.selectionEnd; + textarea.value = textarea.value.substring(0, start) + " " + textarea.value.substring(end); + textarea.selectionStart = textarea.selectionEnd = start + 2; + onInput(); + } + }; + + const onClickOutside = (e) => { + if (!activeEditor) return; + if (diagram.contains(e.target)) return; + closeEditor(true); + }; + + textarea.addEventListener("input", onInput); + textarea.addEventListener("keydown", onKeydown); + + const doneBtn = toolbar.querySelector(".mermaid-editor-done-btn"); + const closeBtn = toolbar.querySelector(".mermaid-editor-close-btn"); + doneBtn.addEventListener("mousedown", (e) => { + e.preventDefault(); + closeEditor(true); + }); + closeBtn.addEventListener("mousedown", (e) => { + e.preventDefault(); + closeEditor(true); + }); + + requestAnimationFrame(() => { + document.addEventListener("mousedown", onClickOutside); + }); + + activeEditor.cleanup = () => { + clearTimeout(debounceTimer); + textarea.removeEventListener("input", onInput); + textarea.removeEventListener("keydown", onKeydown); + document.removeEventListener("mousedown", onClickOutside); + }; + + requestAnimationFrame(() => { + textarea.focus(); + textarea.setSelectionRange(source.length, source.length); + }); + + renderPreview(source, preview, errorBar); +} + +async function renderPreview(source, previewEl, errorBar) { + if (!activeEditor) return; + + const trimmed = source.trim(); + if (!trimmed) { + errorBar.textContent = `\u26A0 ${t("mermaid.error_prefix")}: Empty diagram`; + errorBar.style.display = ""; + previewEl.classList.add("stale"); + return; + } + + const theme = detectTheme(); + let mermaid; + try { + mermaid = await ensureMermaid(theme); + } catch (err) { + devLog("failed to load mermaid:", err); + return; + } + + const id = `mermaid-editor-${Date.now()}-${idCounter++}`; + + try { + await mermaid.parse(trimmed); + const { svg } = await mermaid.render(id, trimmed); + + const temp = document.createElement("div"); + temp.innerHTML = svg; + const svgEl = temp.querySelector("svg"); + + if (svgEl) { + const acc = parseAccessibility(trimmed); + applyAccessibility(svgEl, acc); + + previewEl.innerHTML = ""; + previewEl.appendChild(svgEl); + previewEl.classList.remove("stale"); + if (activeEditor) activeEditor.lastValidSvg = svgEl.outerHTML; + } + + errorBar.style.display = "none"; + errorBar.textContent = ""; + } catch (err) { + const msg = err.message || String(err); + const shortMsg = msg.split("\n")[0].replace(/^.*?(?:Syntax error|Parse error|Error)/i, (m) => m.trim()); + errorBar.textContent = `\u26A0 ${t("mermaid.error_prefix")}: ${shortMsg}`; + errorBar.style.display = ""; + previewEl.classList.add("stale"); + devLog("render error:", msg); + } finally { + cleanupMermaidOrphans(id); + } +} + +function closeEditor(commit) { + if (!activeEditor) return; + + const { diagram, textarea, preview, cleanup, lastValidSvg, originalSource } = activeEditor; + const newSource = textarea.value.trim(); + devLog("closing editor, commit:", commit, "source changed:", newSource !== originalSource); + + if (cleanup) cleanup(); + + diagram.classList.remove("mermaid-editing"); + diagram.innerHTML = ""; + + if (commit && newSource) { + diagram.setAttribute("data-mermaid-source", newSource); + } + + if (lastValidSvg) { + const temp = document.createElement("div"); + temp.innerHTML = lastValidSvg; + const svgEl = temp.querySelector("svg"); + if (svgEl) { + diagram.appendChild(svgEl); + } + } + + if (commit && newSource && newSource !== originalSource) { + reRenderDiagram(diagram, newSource); + } + + activeEditor = null; + + attachOverlayToBlock(diagram); + + if (commit && contentEl && newSource !== originalSource) { + contentEl.dispatchEvent(new Event("input", { bubbles: true })); + } +} + +async function reRenderDiagram(diagram, source) { + const theme = detectTheme(); + try { + const mermaid = await ensureMermaid(theme); + const id = `mermaid-rerender-${Date.now()}-${idCounter++}`; + const { svg } = await mermaid.render(id, source); + + const temp = document.createElement("div"); + temp.innerHTML = svg; + const svgEl = temp.querySelector("svg"); + + if (svgEl) { + const acc = parseAccessibility(source); + applyAccessibility(svgEl, acc); + diagram.innerHTML = ""; + diagram.appendChild(svgEl); + attachOverlayToBlock(diagram); + } + cleanupMermaidOrphans(id); + } catch { + // Keep existing SVG on error + } +} + +function autoResizeTextarea(textarea) { + textarea.style.height = "auto"; + textarea.style.height = Math.min(textarea.scrollHeight, 300) + "px"; +} + +// ——— Insert new mermaid block ——— + +export async function insertMermaidBlock(contentElRef) { + const template = "graph TD\n A[Start] --> B[End]"; + + const html = `${template}`; + document.execCommand("insertHTML", false, html); + + await new Promise((r) => requestAnimationFrame(r)); + + const el = contentElRef || contentEl; + if (!el) return; + + await renderMermaidBlocks(el); + + await new Promise((r) => requestAnimationFrame(r)); + const diagrams = el.querySelectorAll(".mermaid-diagram"); + const newDiagram = diagrams[diagrams.length - 1]; + if (newDiagram) { + openEditor(newDiagram); + } +} + +// ——— Lifecycle ——— + +function handleDblClick(e) { + const diagram = e.target.closest(".mermaid-diagram"); + if (diagram && !diagram.classList.contains("mermaid-editing")) { + e.preventDefault(); + e.stopPropagation(); + openEditor(diagram); + } +} + +export function initMermaidEditor(editorEl) { + contentEl = editorEl; + devLog("init"); + + contentEl.addEventListener("dblclick", handleDblClick, true); + attachOverlays(); + + themeHandler = () => { + if (activeEditor) { + renderPreview(activeEditor.textarea.value, activeEditor.preview, activeEditor.errorBar); + } + }; + on("state:theme", themeHandler); +} + +export function destroyMermaidEditor() { + devLog("destroy"); + + if (activeEditor) { + closeEditor(false); + } + + if (contentEl) { + contentEl.querySelectorAll(".mermaid-edit-overlay").forEach((el) => el.remove()); + contentEl.removeEventListener("dblclick", handleDblClick, true); + } + + if (themeHandler) { + off("state:theme", themeHandler); + themeHandler = null; + } + + contentEl = null; + activeEditor = null; +} + +export function isEditorOpen() { + return activeEditor !== null; +} diff --git a/src-mdviewer/src/components/search.js b/src-mdviewer/src/components/search.js new file mode 100644 index 0000000000..5230ffa47f --- /dev/null +++ b/src-mdviewer/src/components/search.js @@ -0,0 +1,225 @@ +/** + * In-document search for the mdviewer. + * Uses mark.js for highlighting matches. + * Opened via Ctrl/Cmd+F, closed via Escape. + */ +import Mark from "mark.js"; +import { on } from "../core/events.js"; +import { t } from "../core/i18n.js"; + +let markInstance = null; +let matches = []; +let currentIndex = -1; +let debounceTimer = null; +let savedRange = null; + +export function initSearch() { + const searchBar = document.getElementById("search-bar"); + const searchInput = document.getElementById("search-input"); + const searchCount = document.getElementById("search-count"); + const searchPrev = document.getElementById("search-prev"); + const searchNext = document.getElementById("search-next"); + const searchClose = document.getElementById("search-close"); + + if (!searchBar || !searchInput) return; + + // Save/restore search index per document + const _searchIndexPerDoc = new Map(); + + on("doc:beforeSwitch", (data) => { + if (data.fromPath && searchBar.classList.contains("open") && currentIndex >= 0) { + _searchIndexPerDoc.set(data.fromPath, currentIndex); + } + }); + + // Re-run search on file switch if search bar is open + on("file:switched", (data) => { + if (searchBar.classList.contains("open") && searchInput.value) { + const savedIdx = data.filePath ? _searchIndexPerDoc.get(data.filePath) : undefined; + performSearch(searchInput.value, savedIdx); + } + }); + + on("file:rendered", () => { + if (searchBar.classList.contains("open") && searchInput.value) { + performSearch(searchInput.value); + } + }); + + on("action:toggle-search", () => { + if (searchBar.classList.contains("open")) { + closeSearch(); + } else { + // Pre-fill with current selection if any + const sel = window.getSelection(); + const selectedText = sel && !sel.isCollapsed ? sel.toString().trim() : ""; + openSearch(selectedText); + } + }); + + searchInput.addEventListener("input", () => { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => { + performSearch(searchInput.value); + }, 300); + }); + + searchInput.addEventListener("keydown", (e) => { + if (e.key === "Enter" || e.key === "ArrowDown") { + e.preventDefault(); + if (e.shiftKey) { + navigatePrev(); + } else { + navigateNext(); + } + } + if (e.key === "ArrowUp") { + e.preventDefault(); + navigatePrev(); + } + if (e.key === "Escape") { + e.preventDefault(); + closeSearch(); + } + }); + + if (searchPrev) searchPrev.addEventListener("click", navigatePrev); + if (searchNext) searchNext.addEventListener("click", navigateNext); + if (searchClose) searchClose.addEventListener("click", closeSearch); + + let _selectionRect = null; + + function openSearch(prefill) { + // Save cursor/selection before opening search + const sel = window.getSelection(); + if (sel && sel.rangeCount) { + savedRange = sel.getRangeAt(0).cloneRange(); + if (prefill) { + _selectionRect = sel.getRangeAt(0).getBoundingClientRect(); + } + } + + searchBar.classList.add("open"); + if (prefill) { + searchInput.value = prefill; + performSearch(prefill); + } + searchInput.focus(); + searchInput.select(); + } + + function closeSearch() { + searchBar.classList.remove("open"); + clearHighlights(); + searchInput.value = ""; + searchCount.textContent = ""; + // Restore cursor/selection and focus + const content = document.getElementById("viewer-content"); + if (content) { + content.focus({ preventScroll: true }); + if (savedRange) { + const sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(savedRange); + savedRange = null; + } + } + } + + function performSearch(query, restoreIndex) { + clearHighlights(); + + if (!query) { + searchCount.textContent = ""; + return; + } + + const content = document.getElementById("viewer-content"); + if (!content) return; + + markInstance = new Mark(content); + markInstance.mark(query, { + separateWordSearch: false, + done: (count) => { + matches = Array.from(content.querySelectorAll("mark[data-markjs]")); + currentIndex = -1; + + if (count > 0) { + // If opened with a selection, find the match closest to it + if (_selectionRect) { + let bestIdx = 0; + let bestDist = Infinity; + for (let i = 0; i < matches.length; i++) { + const rect = matches[i].getBoundingClientRect(); + const dist = Math.abs(rect.top - _selectionRect.top) + + Math.abs(rect.left - _selectionRect.left); + if (dist < bestDist) { + bestDist = dist; + bestIdx = i; + } + } + _selectionRect = null; + currentIndex = bestIdx; + matches[currentIndex].classList.add("active"); + updateCount(); + } else if (restoreIndex !== undefined && restoreIndex < matches.length) { + currentIndex = restoreIndex; + matches[currentIndex].classList.add("active"); + matches[currentIndex].scrollIntoView({ behavior: "instant", block: "center" }); + updateCount(); + } else { + navigateNext(); + } + } else { + searchCount.textContent = t("search.no_results"); + } + } + }); + } + + function navigateNext() { + if (matches.length === 0) return; + + if (currentIndex >= 0 && currentIndex < matches.length) { + matches[currentIndex].classList.remove("active"); + } + + currentIndex = (currentIndex + 1) % matches.length; + matches[currentIndex].classList.add("active"); + matches[currentIndex].scrollIntoView({ + behavior: "instant", + block: "center" + }); + updateCount(); + } + + function navigatePrev() { + if (matches.length === 0) return; + + if (currentIndex >= 0 && currentIndex < matches.length) { + matches[currentIndex].classList.remove("active"); + } + + currentIndex = currentIndex <= 0 ? matches.length - 1 : currentIndex - 1; + matches[currentIndex].classList.add("active"); + matches[currentIndex].scrollIntoView({ + behavior: "instant", + block: "center" + }); + updateCount(); + } + + function updateCount() { + if (matches.length > 0) { + searchCount.textContent = `${currentIndex + 1}/${matches.length}`; + } + } + + function clearHighlights() { + if (markInstance) { + markInstance.unmark(); + } + matches = []; + currentIndex = -1; + } +} diff --git a/src-mdviewer/src/components/slash-menu.js b/src-mdviewer/src/components/slash-menu.js new file mode 100644 index 0000000000..c18faba7e5 --- /dev/null +++ b/src-mdviewer/src/components/slash-menu.js @@ -0,0 +1,535 @@ +import { + createIcons, + Heading1, + Heading2, + Heading3, + Heading4, + Heading5, + List, + ListOrdered, + ListChecks, + Quote, + FileCode, + Table, + Minus, + Pilcrow, + Workflow, + Image as ImageIcon, + Upload, +} from "lucide"; +import { emit } from "../core/events.js"; +import { getSelectionRect } from "./editor.js"; +import { t } from "../core/i18n.js"; + +let menu = null; +let contentEl = null; +let visible = false; +let selectedIndex = 0; +let query = ""; +let slashRange = null; +let _savedSlashRect = null; +let filteredItems = []; +let overflowCount = 0; +let inputListener = null; +let keydownListener = null; +let beforeInputListener = null; +let clickOutsideListener = null; +let pendingEnterIndex = -1; + +const menuItems = [ + { labelKey: "slash.paragraph", descKey: "slash.paragraph_desc", icon: "pilcrow", command: "formatBlock", value: "
" }, + { labelKey: "slash.heading1", descKey: "slash.heading1_desc", icon: "heading-1", command: "formatBlock", value: "
" }, + { labelKey: "slash.heading2", descKey: "slash.heading2_desc", icon: "heading-2", command: "formatBlock", value: "
" }, + { labelKey: "slash.heading3", descKey: "slash.heading3_desc", icon: "heading-3", command: "formatBlock", value: "
" }, + { labelKey: "slash.heading4", descKey: "slash.heading4_desc", icon: "heading-4", command: "formatBlock", value: "
" }, + { labelKey: "slash.heading5", descKey: "slash.heading5_desc", icon: "heading-5", command: "formatBlock", value: "
" }, + { labelKey: "slash.bullet_list", descKey: "slash.bullet_list_desc", icon: "list", command: "insertUnorderedList" }, + { labelKey: "slash.numbered_list", descKey: "slash.numbered_list_desc", icon: "list-ordered", command: "insertOrderedList" }, + { labelKey: "slash.task_list", descKey: "slash.task_list_desc", icon: "list-checks", command: "taskList" }, + { labelKey: "slash.blockquote", descKey: "slash.blockquote_desc", icon: "quote", command: "formatBlock", value: "
" }, + { labelKey: "slash.code_block", descKey: "slash.code_block_desc", icon: "file-code", command: "codeBlock" }, + { labelKey: "slash.table", descKey: "slash.table_desc", icon: "table", command: "table" }, + { labelKey: "slash.divider", descKey: "slash.divider_desc", icon: "minus", command: "insertHorizontalRule" }, + { labelKey: "slash.image_url", descKey: "slash.image_url_desc", icon: "image", command: "imageFromUrl" }, + { labelKey: "slash.image_upload", descKey: "slash.image_upload_desc", icon: "image", command: "imageUpload" }, + { labelKey: "slash.mermaid", descKey: "slash.mermaid_desc", icon: "workflow", command: "mermaidBlock" }, +]; + +function fuzzyScore(query, text) { + if (!query) return { score: 0, indices: [] }; + const q = query.toLowerCase(), t = text.toLowerCase(); + + // Fast path: exact substring + const subIdx = t.indexOf(q); + if (subIdx !== -1) { + const indices = Array.from({ length: q.length }, (_, i) => subIdx + i); + let score = 100; + if (subIdx === 0 || /[\s\-_]/.test(text[subIdx - 1])) score += 10; + return { score, indices }; + } + + // Character-by-character fuzzy + let qi = 0, score = 0, lastIdx = -2; + const indices = []; + for (let ti = 0; ti < t.length && qi < q.length; ti++) { + if (t[ti] === q[qi]) { + indices.push(ti); + score += 1; + if (ti === 0 || /[\s\-_]/.test(text[ti - 1])) score += 10; + if (ti === lastIdx + 1) score += 5; + lastIdx = ti; + qi++; + } + } + return qi < q.length ? null : { score, indices }; +} + +const FRECENCY_KEY = "mdviewr-slash-frecency"; +const DECAY_DAYS = 7; + +// In-memory frecency store (localStorage unavailable in sandboxed iframe without allow-same-origin) +let _frecencyData = {}; + +function loadFrecency() { + return _frecencyData; +} +function saveFrecency(data) { + _frecencyData = data; +} +function recordUsage(id) { + const d = loadFrecency(); + const e = d[id] || { count: 0, lastUsed: 0 }; + e.count++; e.lastUsed = Date.now(); + d[id] = e; saveFrecency(d); +} +function getFrecencyScore(id) { + const e = loadFrecency()[id]; + if (!e) return 0; + return e.count * Math.pow(0.5, (Date.now() - e.lastUsed) / (864e5 * DECAY_DAYS)); +} + +const shortcutHints = { + "slash.heading1": "# ", "slash.heading2": "## ", "slash.heading3": "### ", "slash.heading4": "#### ", "slash.heading5": "##### ", + "slash.bullet_list": "- ", "slash.numbered_list": "1. ", + "slash.task_list": "- [ ] ", "slash.blockquote": "> ", + "slash.code_block": "```", "slash.divider": "---", + "slash.mermaid": "```mermaid", +}; + +function escapeHTML(s) { + return s.replace(/&/g, "&").replace(//g, ">"); +} +function highlightMatches(text, indices) { + if (!indices?.length) return escapeHTML(text); + const set = new Set(indices); + let result = "", inMark = false; + for (let i = 0; i < text.length; i++) { + if (set.has(i) && !inMark) { result += ""; inMark = true; } + else if (!set.has(i) && inMark) { result += ""; inMark = false; } + result += escapeHTML(text[i]); + } + return inMark ? result + "" : result; +} + +function renderItems() { + let scored; + + if (query) { + scored = menuItems.map(item => { + const label = t(item.labelKey); + const desc = t(item.descKey); + const labelResult = fuzzyScore(query, label); + const descResult = fuzzyScore(query, desc); + const fuzzy = Math.max(labelResult?.score || 0, (descResult?.score || 0) * 0.5); + if (fuzzy === 0) return null; + const frecency = getFrecencyScore(item.labelKey); + return { item, score: fuzzy * 0.7 + frecency * 0.3, labelIndices: labelResult?.indices || [] }; + }).filter(Boolean); + scored.sort((a, b) => b.score - a.score); + } else { + const hasUsage = menuItems.some(item => getFrecencyScore(item.labelKey) > 0); + scored = menuItems.map((item, i) => ({ + item, + score: hasUsage ? getFrecencyScore(item.labelKey) : -i, + labelIndices: [], + })); + if (hasUsage) scored.sort((a, b) => b.score - a.score); + } + + const cap = query ? 6 : scored.length; + overflowCount = Math.max(0, scored.length - cap); + const visible = scored.slice(0, cap); + filteredItems = visible.map(s => s.item); + + if (filteredItems.length === 0) { + menu.innerHTML = ``; + selectedIndex = -1; + return; + } + + selectedIndex = Math.min(selectedIndex, filteredItems.length - 1); + if (selectedIndex < 0) selectedIndex = 0; + + let html = visible + .map((entry, i) => { + const item = entry.item; + const cls = i === selectedIndex ? "slash-menu-item selected" : "slash-menu-item"; + const id = `slash-item-${i}`; + const label = t(item.labelKey); + const desc = t(item.descKey); + const hint = shortcutHints[item.labelKey]; + const hintHTML = hint ? `` : ""; + return `+ + + ${hintHTML} +`; + }) + .join(""); + + if (overflowCount > 0) { + html += ``; + } + + menu.innerHTML = html; + + createIcons({ + icons: { Pilcrow, Heading1, Heading2, Heading3, Heading4, Heading5, List, ListOrdered, ListChecks, Quote, FileCode, Table, Minus, Workflow, Image: ImageIcon, Upload }, + attrs: { class: "" }, + }); + + // Click/touch handlers + menu.querySelectorAll(".slash-menu-item[data-index]").forEach((el) => { + const handler = (e) => { + e.preventDefault(); + const idx = parseInt(el.dataset.index, 10); + selectItem(idx); + }; + el.addEventListener("mousedown", handler); + el.addEventListener("touchend", handler); + }); + + // Update aria-activedescendant + menu.setAttribute("aria-activedescendant", `slash-item-${selectedIndex}`); +} + +function show() { + if (!_savedSlashRect) return; + const rect = _savedSlashRect; + const anchor = document.getElementById("slash-menu-anchor"); + if (!anchor) return; + + // Position anchor below the cursor line with gap + const lineHeight = rect.bottom - rect.top; + anchor.style.left = rect.left + "px"; + anchor.style.top = rect.bottom + 4 + "px"; + + anchor.classList.add("visible"); + menu.scrollTop = 0; + visible = true; + + // Position menu below or above based on available space + requestAnimationFrame(() => { + const spaceBelow = window.innerHeight - rect.bottom - 4; + const menuHeight = Math.min(300, menu.scrollHeight); + + if (spaceBelow >= menuHeight || spaceBelow >= rect.top) { + // Below cursor + menu.style.top = "0"; + menu.style.bottom = ""; + } else { + // Above cursor — move anchor above the line + anchor.style.top = (rect.top - 4) + "px"; + menu.style.top = ""; + menu.style.bottom = "0"; + } + + // Clamp horizontal + const menuRect = menu.getBoundingClientRect(); + if (menuRect.right > window.innerWidth - 8) { + menu.style.left = Math.max(8, window.innerWidth - menuRect.width - 8) + "px"; + } + }); +} + +function hide() { + const anchor = document.getElementById("slash-menu-anchor"); + if (anchor) { + anchor.classList.remove("visible"); + } + visible = false; + query = ""; + selectedIndex = 0; + slashRange = null; + _savedSlashRect = null; + pendingEnterIndex = -1; + overflowCount = 0; +} + +function selectItem(index) { + if (index < 0 || index >= filteredItems.length) return; + const item = filteredItems[index]; + recordUsage(item.labelKey); + + // Capture slashRange before hide() clears it + const savedRange = slashRange; + + // Always hide first to prevent stuck visible state + hide(); + + // Delete /query from DOM using execCommand to keep the browser's editing + // model in sync — direct DOM manipulation (deleteContents) breaks + // subsequent execCommand calls like formatBlock. + try { + if (savedRange) { + const sel = window.getSelection(); + if (sel.rangeCount) { + const currentRange = sel.getRangeAt(0); + const deleteRange = document.createRange(); + deleteRange.setStart(savedRange.startContainer, savedRange.startOffset); + deleteRange.setEnd(currentRange.endContainer, currentRange.endOffset); + sel.removeAllRanges(); + sel.addRange(deleteRange); + document.execCommand("delete", false, null); + } + } + } catch (_) { + // On iOS the stored range may be invalid — tolerate failure + } + + // Emit format command + emit("action:format", { command: item.command, value: item.value }); + + contentEl?.focus({ preventScroll: true }); +} + +function isAtBlockStart() { + const sel = window.getSelection(); + if (!sel.rangeCount) return false; + const range = sel.getRangeAt(0); + const node = range.startContainer; + + // Walk up to find the block-level parent + let block = node; + const blockTags = new Set(["P", "DIV", "H1", "H2", "H3", "H4", "H5", "H6", "LI", "BLOCKQUOTE", "TD", "TH"]); + while (block && block !== contentEl) { + if (block.nodeType === 1 && blockTags.has(block.tagName)) break; + block = block.parentNode; + } + if (!block || block === contentEl) block = node; + + // Check if the text before the caret (within the block) is empty or whitespace + const textBefore = getTextBeforeCaret(block); + return textBefore.trim() === "" || textBefore.trim() === "/"; +} + +function getTextBeforeCaret(container) { + const sel = window.getSelection(); + if (!sel.rangeCount) return ""; + const range = sel.getRangeAt(0); + const preRange = document.createRange(); + preRange.setStart(container, 0); + preRange.setEnd(range.startContainer, range.startOffset); + return preRange.toString(); +} + +function handleInput() { + if (!contentEl) return; + + if (visible) { + // Update query: get text between slash position and current caret + const sel = window.getSelection(); + if (!sel.rangeCount || !slashRange) { + hide(); + return; + } + const range = sel.getRangeAt(0); + const queryRange = document.createRange(); + try { + queryRange.setStart(slashRange.endContainer, slashRange.endOffset); + queryRange.setEnd(range.startContainer, range.startOffset); + query = queryRange.toString(); + } catch { + hide(); + return; + } + + // If query has spaces or is too long, close + if (query.length > 20 || query.includes("\n")) { + hide(); + return; + } + + renderItems(); + return; + } + + // Check if / was just typed + const sel = window.getSelection(); + if (!sel.rangeCount) return; + const range = sel.getRangeAt(0); + if (!range.collapsed) return; + + let node = range.startContainer; + let offset = range.startOffset; + + // If cursor is at an element node, resolve to the child text node + if (node.nodeType !== 3) { + const child = node.childNodes[offset - 1]; + if (child && child.nodeType === 3) { + node = child; + offset = node.textContent.length; + } else { + return; + } + } + if (offset < 1) return; + + const char = node.textContent[offset - 1]; + if (char !== "/") return; + + // Check that it's preceded by start of block, whitespace, or
+ if (offset > 1) { + const prev = node.textContent[offset - 2]; + if (prev && prev !== " " && prev !== "\n" && prev !== "\t") return; + } else { + // offset === 1: check if preceded by
(line start after Enter) or at block start + const prevSibling = node.previousSibling; + const afterBr = prevSibling && prevSibling.nodeName === "BR"; + if (!afterBr && !isAtBlockStart()) return; + } + + // Save the caret rect at the / position for menu positioning. + // Insert a temp marker, measure, remove — do this before creating slashRange. + const marker = document.createElement("span"); + marker.textContent = "\u200b"; + range.insertNode(marker); + const markerRect = marker.getBoundingClientRect(); + _savedSlashRect = { top: markerRect.top, bottom: markerRect.bottom, left: markerRect.left }; + marker.parentNode.removeChild(marker); + // Restore selection after marker removal + sel.removeAllRanges(); + const restored = document.createRange(); + restored.setStart(node, offset); + restored.collapse(true); + sel.addRange(restored); + + // Save the slash range + slashRange = document.createRange(); + slashRange.setStart(node, offset - 1); + slashRange.setEnd(node, offset); + + query = ""; + selectedIndex = 0; + renderItems(); + show(); +} + +function handleKeydown(e) { + if (!visible) return; + + if (e.key === "ArrowDown") { + e.preventDefault(); + e.stopImmediatePropagation(); + selectedIndex = (selectedIndex + 1) % filteredItems.length; + renderItems(); + const sel = menu.querySelector(".slash-menu-item.selected"); + if (sel) sel.scrollIntoView({ block: "nearest" }); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + e.stopImmediatePropagation(); + selectedIndex = (selectedIndex - 1 + filteredItems.length) % filteredItems.length; + renderItems(); + const sel = menu.querySelector(".slash-menu-item.selected"); + if (sel) sel.scrollIntoView({ block: "nearest" }); + } else if (e.key === "Enter") { + e.preventDefault(); + e.stopImmediatePropagation(); + // Don't call selectItem here — on iOS, preventDefault on keydown + // doesn't stop the browser from inserting a paragraph break. + // Defer to beforeinput (which CAN reliably prevent it) or a fallback. + pendingEnterIndex = selectedIndex; + setTimeout(() => { + if (pendingEnterIndex >= 0) { + const idx = pendingEnterIndex; + pendingEnterIndex = -1; + selectItem(idx); + } + }, 0); + } else if (e.key === "Escape") { + e.preventDefault(); + e.stopImmediatePropagation(); + hide(); + } else if (e.key === "Backspace") { + // If query is empty and we backspace, close the menu + // (the / itself will be deleted naturally) + if (query === "") { + // Let the browser handle the backspace, then hide + requestAnimationFrame(() => hide()); + } + } +} + +function handleBeforeInput(e) { + if (e.inputType !== "insertParagraph") return; + // On iOS, keydown.preventDefault() doesn't stop the paragraph break. + // beforeinput.preventDefault() DOES work reliably on all platforms. + if (pendingEnterIndex >= 0) { + // keydown already fired — prevent the paragraph break and select now + e.preventDefault(); + const idx = pendingEnterIndex; + pendingEnterIndex = -1; + selectItem(idx); + return; + } + // iOS may skip keydown "Enter" entirely (e.g. virtual keyboard IME) + if (visible && filteredItems.length > 0 && selectedIndex >= 0) { + e.preventDefault(); + selectItem(selectedIndex); + } +} + +function handleClickOutside(e) { + if (!visible) return; + if (menu.contains(e.target)) return; + hide(); +} + +export function isSlashMenuVisible() { + return visible; +} + +export function initSlashMenu(editorEl) { + contentEl = editorEl; + menu = document.getElementById("slash-menu"); + if (!menu) return; + + inputListener = handleInput; + keydownListener = handleKeydown; + beforeInputListener = handleBeforeInput; + clickOutsideListener = handleClickOutside; + + contentEl.addEventListener("input", inputListener); + contentEl.addEventListener("keydown", keydownListener, true); + contentEl.addEventListener("beforeinput", beforeInputListener, true); + document.addEventListener("mousedown", clickOutsideListener); +} + +export function destroySlashMenu() { + hide(); + if (contentEl) { + contentEl.removeEventListener("input", inputListener); + contentEl.removeEventListener("keydown", keydownListener, true); + contentEl.removeEventListener("beforeinput", beforeInputListener, true); + } + document.removeEventListener("mousedown", clickOutsideListener); + if (menu) menu.innerHTML = ""; + contentEl = null; + inputListener = null; + keydownListener = null; + beforeInputListener = null; + clickOutsideListener = null; +} diff --git a/src-mdviewer/src/components/viewer.js b/src-mdviewer/src/components/viewer.js new file mode 100644 index 0000000000..73ef505872 --- /dev/null +++ b/src-mdviewer/src/components/viewer.js @@ -0,0 +1,218 @@ +// Adapted viewer — no Tauri deps, images resolve via+import Prism from "prismjs"; +Prism.manual = true; +import "../core/prism-languages.js"; +import "../styles/syntax/prism-light.css"; +import "../styles/syntax/prism-dark.css"; +import morphdom from "morphdom"; +import { on } from "../core/events.js"; +import { getState } from "../core/state.js"; +import { t } from "../core/i18n.js"; + +const devLog = import.meta.env.DEV ? console.log.bind(console, "[viewer]") : () => {}; + +function getContentEl() { + return document.getElementById("viewer-content"); +} + +export function normalizeCodeLanguages(container) { + let normalized = 0; + container.querySelectorAll('pre > code[class*="language-"]').forEach((code) => { + const pre = code.parentElement; + if (!pre.hasAttribute("data-language")) { + const match = code.className.match(/language-(\S+)/); + if (match) { + pre.setAttribute("data-language", match[1]); + normalized++; + } + } + }); + if (normalized > 0) { + devLog("normalized", normalized, "code blocks missing data-language"); + } +} + +export async function renderAfterHTML(container, parseResult) { + normalizeCodeLanguages(container); + + if (parseResult?.has_mermaid) { + const mermaidBlocks = container.querySelectorAll('pre[data-language="mermaid"]'); + devLog("has_mermaid, mermaid in DOM:", mermaidBlocks.length); + try { + const { renderMermaidBlocks } = await import("../core/mermaid-render.js"); + await renderMermaidBlocks(container); + } catch (err) { + console.error("[viewer] Failed to load mermaid renderer:", err); + } + } + highlightCode(); +} + +export function initViewer() { + // Use the #app-viewer for delegated click handling (works across cached DOMs) + const appViewer = document.getElementById("app-viewer"); + + on("file:rendered", async (parseResult) => { + devLog("file:rendered, has_mermaid:", parseResult?.has_mermaid); + const content = getContentEl(); + if (!content) return; + + // Save existing image nodes before DOM update. Replace eachwith + // a lightweight placeholder so morphdom doesn't destroy the node. + // After morphdom, swap saved images back in by matching src. + const savedImgs = new Map(); + const placeholders = new Map(); + content.querySelectorAll("img").forEach(img => { + if (img.src && !img.src.includes("uploading.svg")) { + const placeholder = document.createElement("span"); + placeholder.dataset.savedImgSrc = img.src; + img.replaceWith(placeholder); + savedImgs.set(img.src, img); + placeholders.set(img.src, placeholder); + } + }); + + const newContent = document.createElement("div"); + newContent.innerHTML = parseResult.html; + morphdom(content, newContent, { childrenOnly: true }); + + // Restore saved image nodes — find new
by src and swap + if (savedImgs.size > 0) { + content.querySelectorAll("img").forEach(newImg => { + const saved = savedImgs.get(newImg.src); + if (saved) { + if (saved.alt !== newImg.alt) { saved.alt = newImg.alt; } + if (saved.title !== newImg.title) { saved.title = newImg.title; } + newImg.replaceWith(saved); + savedImgs.delete(newImg.src); + } + }); + } + content.dir = "auto"; + + wrapTables(); + await renderAfterHTML(content, parseResult); + + if (getState().editMode) { + content.querySelectorAll('input[type="checkbox"][disabled]').forEach(cb => { + cb.removeAttribute("disabled"); + }); + } else { + addCopyButtons(); + } + }); + + // file:switched fires when a cached DOM is shown (no re-render needed) + on("file:switched", () => { + const content = getContentEl(); + if (!content) return; + + if (!getState().editMode) { + addCopyButtons(); + } + }); + + // Intercept link clicks via delegation on the viewer container + appViewer.addEventListener("click", (e) => { + if (getState().editMode) return; + + const anchor = e.target.closest("a[href]"); + const content = getContentEl(); + if (!anchor || !content || !content.contains(anchor)) return; + + const href = anchor.getAttribute("href"); + if (!href) return; + + e.preventDefault(); + + if (href.startsWith("#")) { + const target = document.getElementById(href.slice(1)); + if (target) target.scrollIntoView({ behavior: "smooth" }); + return; + } + + window.parent.postMessage({ + type: "MDVIEWR_EVENT", + eventName: "embeddedIframeHrefClick", + href: href + }, "*"); + }); + + on("file:closed", () => { + const content = getContentEl(); + if (content) { + content.style.display = "none"; + content.innerHTML = ""; + } + }); + + // Re-render mermaid diagrams on theme change + on("state:theme", async () => { + const content = getContentEl(); + if (!content) return; + const diagrams = content.querySelectorAll(".mermaid-diagram[data-mermaid-source]"); + if (diagrams.length === 0) return; + const { reRenderMermaidBlocks } = await import("../core/mermaid-render.js"); + await reRenderMermaidBlocks(content); + }); +} + +function wrapTables() { + document.querySelectorAll("#viewer-content > table").forEach((table) => { + const wrapper = document.createElement("div"); + wrapper.className = "table-wrapper"; + table.parentNode.insertBefore(wrapper, table); + wrapper.appendChild(table); + }); +} + +export function highlightCode() { + document.querySelectorAll('#viewer-content pre[data-language]:not([data-language="mermaid"])').forEach((pre) => { + const lang = pre.getAttribute("data-language"); + if (!lang) return; + const code = pre.querySelector("code"); + if (code && !code.className.includes(`language-${lang}`)) { + code.className = `language-${lang}`; + } + }); + + const blocks = document.querySelectorAll( + '#viewer-content pre:not([data-language="mermaid"]) code[class*="language-"]:not(.language-mermaid)' + ); + blocks.forEach((block) => { + Prism.highlightElement(block); + }); +} + +function addCopyButtons() { + const pres = document.querySelectorAll("#viewer-content pre"); + pres.forEach((pre) => { + if (pre.querySelector(".code-copy-btn")) return; + + const btn = document.createElement("button"); + btn.className = "code-copy-btn"; + btn.textContent = t("viewer.copy"); + btn.setAttribute("aria-label", t("viewer.copy")); + + btn.addEventListener("click", async () => { + const code = pre.querySelector("code"); + if (!code) return; + + try { + await navigator.clipboard.writeText(code.textContent); + btn.textContent = t("viewer.copied"); + btn.classList.add("copied"); + setTimeout(() => { + btn.textContent = t("viewer.copy"); + btn.classList.remove("copied"); + }, 2000); + } catch (e) { + console.warn("Failed to copy:", e); + } + }); + + pre.style.position = "relative"; + pre.appendChild(btn); + }); +} + diff --git a/src-mdviewer/src/core/doc-cache.js b/src-mdviewer/src/core/doc-cache.js new file mode 100644 index 0000000000..48503be9b7 --- /dev/null +++ b/src-mdviewer/src/core/doc-cache.js @@ -0,0 +1,241 @@ +/** + * Document cache for the mdviewer iframe. + * Maintains a pool of pre-rendered DOM elements so file switches are instant (hide/show). + * + * Two-tier caching: + * - Working set files: always cached (unlimited, mirrors Phoenix working set) + * - Non-working-set files: LRU cache (max LRU_MAX entries) + */ + +const LRU_MAX = 20; +const VIEWER_CONTENT_ID = "viewer-content"; + +/** @type {Map
} */ +const cache = new Map(); + +/** @type {Set } file paths that are in the Phoenix working set */ +const workingSetPaths = new Set(); + +/** @type {string|null} currently active file path */ +let activeFilePath = null; + +/** @type {HTMLElement|null} the #app-viewer container */ +let viewerContainer = null; + +/** + * @typedef {Object} CacheEntry + * @property {string} filePath + * @property {string} mdSrc - last known markdown source + * @property {HTMLDivElement} dom - rendered content element + * @property {number} scrollPos - saved scrollTop of #app-viewer + * @property {object} parseResult - { html, has_mermaid } + * @property {number} lastAccessed - timestamp for LRU eviction + */ + +export function initDocCache() { + viewerContainer = document.getElementById("app-viewer"); +} + +/** + * Get a cache entry by file path. + */ +export function getEntry(filePath) { + return cache.get(filePath) || null; +} + +/** + * Get the currently active file path. + */ +export function getActiveFilePath() { + return activeFilePath; +} + +/** + * Create a new cache entry with a fresh DOM element. + * The DOM element is appended to #app-viewer but hidden. + */ +export function createEntry(filePath, mdSrc, parseResult) { + // Remove existing entry if any + if (cache.has(filePath)) { + removeEntry(filePath); + } + + const dom = document.createElement("div"); + dom.className = "markdown-body"; + dom.style.display = "none"; + dom.dir = "auto"; + dom.innerHTML = parseResult.html; + + viewerContainer.appendChild(dom); + + const entry = { + filePath, + mdSrc, + dom, + scrollPos: 0, + parseResult, + lastAccessed: Date.now() + }; + + cache.set(filePath, entry); + evict(); + return entry; +} + +/** + * Update an existing cache entry's content. + */ +export function updateEntry(filePath, mdSrc, parseResult) { + const entry = cache.get(filePath); + if (!entry) { + return createEntry(filePath, mdSrc, parseResult); + } + + entry.mdSrc = mdSrc; + entry.parseResult = parseResult; + entry.dom.innerHTML = parseResult.html; + entry.dom.dir = "auto"; + entry.lastAccessed = Date.now(); + return entry; +} + +/** + * Remove a cache entry and detach its DOM from the document. + */ +export function removeEntry(filePath) { + const entry = cache.get(filePath); + if (!entry) return; + + if (entry.dom.parentNode) { + entry.dom.parentNode.removeChild(entry.dom); + } + cache.delete(filePath); + + if (activeFilePath === filePath) { + activeFilePath = null; + } +} + +/** + * Switch to a file. Hides the current DOM, shows the target DOM. + * Returns the cache entry (or null if not cached). + * + * The active DOM gets id="viewer-content" for backward compatibility. + */ +export function switchTo(filePath) { + const entry = cache.get(filePath); + if (!entry) return null; + + // Save scroll position of outgoing document + if (activeFilePath && activeFilePath !== filePath) { + const outgoing = cache.get(activeFilePath); + if (outgoing) { + outgoing.scrollPos = viewerContainer.scrollTop; + } + } + + // Hide current active DOM + const currentActive = viewerContainer.querySelector(`#${VIEWER_CONTENT_ID}`); + if (currentActive) { + currentActive.removeAttribute("id"); + currentActive.style.display = "none"; + } + + // Show target DOM + entry.dom.id = VIEWER_CONTENT_ID; + entry.dom.style.display = "block"; + entry.lastAccessed = Date.now(); + + activeFilePath = filePath; + + // Restore exact pixel scroll position — DOM is cached so no layout shift + requestAnimationFrame(() => { + viewerContainer.scrollTop = entry.scrollPos; + }); + + return entry; +} + +/** + * Save the current scroll position for the active document. + * Saves pixel position for exact restore on cached DOM switch, + * and source line for reload (where DOM is rebuilt). + */ +export function saveActiveScrollPos() { + if (!activeFilePath) return; + const entry = cache.get(activeFilePath); + if (!entry) return; + + entry.scrollPos = viewerContainer.scrollTop; + + // Also save source line for reload scenarios (DOM rebuilt, pixel pos unreliable) + const elements = entry.dom.querySelectorAll("[data-source-line]"); + const containerTop = viewerContainer.getBoundingClientRect().top; + let bestEl = null; + let bestDist = Infinity; + for (const el of elements) { + const dist = Math.abs(el.getBoundingClientRect().top - containerTop); + if (dist < bestDist) { + bestDist = dist; + bestEl = el; + } + } + if (bestEl) { + entry._scrollSourceLine = parseInt(bestEl.getAttribute("data-source-line"), 10); + } +} + +/** + * Update the set of working set file paths (always cached). + */ +export function setWorkingSet(paths) { + workingSetPaths.clear(); + for (const p of paths) { + workingSetPaths.add(p); + } + evict(); +} + +/** + * Evict non-working-set entries beyond LRU_MAX. + */ +export function evict() { + // Collect non-working-set entries + const lruEntries = []; + for (const [path, entry] of cache) { + if (!workingSetPaths.has(path) && path !== activeFilePath) { + lruEntries.push(entry); + } + } + + if (lruEntries.length <= LRU_MAX) return; + + // Sort by lastAccessed ascending (oldest first) + lruEntries.sort((a, b) => a.lastAccessed - b.lastAccessed); + + const toRemove = lruEntries.length - LRU_MAX; + for (let i = 0; i < toRemove; i++) { + removeEntry(lruEntries[i].filePath); + } +} + +/** + * Clear all cached entries. Used on project switch. + */ +export function clearAll() { + for (const [, entry] of cache) { + if (entry.dom.parentNode) { + entry.dom.parentNode.removeChild(entry.dom); + } + } + cache.clear(); + workingSetPaths.clear(); + activeFilePath = null; +} + +/** + * Get the number of cached entries (for debugging). + */ +export function size() { + return cache.size; +} diff --git a/src-mdviewer/src/core/events.js b/src-mdviewer/src/core/events.js new file mode 100644 index 0000000000..efef5e949b --- /dev/null +++ b/src-mdviewer/src/core/events.js @@ -0,0 +1,18 @@ +import mitt from "mitt"; + +/** @type {import('mitt').Emitter} */ +const bus = mitt(); + +export function emit(event, data) { + bus.emit(event, data); +} + +export function on(event, handler) { + bus.on(event, handler); +} + +export function off(event, handler) { + bus.off(event, handler); +} + +export default bus; diff --git a/src-mdviewer/src/core/i18n.js b/src-mdviewer/src/core/i18n.js new file mode 100644 index 0000000000..a3977f164c --- /dev/null +++ b/src-mdviewer/src/core/i18n.js @@ -0,0 +1,116 @@ +// Adapted i18n — receives locale from Phoenix via postMessage instead of Tauri +import { getState, setState } from "./state.js"; + +const RTL_LOCALES = new Set(["ar", "he", "ur"]); + +let translations = {}; +let fallback = {}; + +export async function initI18n() { + // Load fallback (English) first + fallback = await loadLocale("en"); + + // Use navigator locale as default + let detectedLocale = "en"; + try { + const navLocale = navigator.language; + if (navLocale) { + detectedLocale = navLocale.split("-")[0].split("_")[0]; + } + } catch (e) { + // ignore + } + + const state = getState(); + const targetLocale = state.locale || detectedLocale; + await setLocale(targetLocale); +} + +async function loadLocale(locale) { + // Normalize: lowercase and use hyphens (e.g. "en_US" → "en-us", "zh-CN" → "zh-cn") + const normalized = locale.toLowerCase().replace(/_/g, "-"); + // Try full locale first (e.g. "zh-cn"), then base language (e.g. "zh") + try { + const module = await import(`../locales/${normalized}.json`); + return module.default || module; + } catch { + const base = normalized.split("-")[0]; + if (base !== normalized) { + try { + const module = await import(`../locales/${base}.json`); + return module.default || module; + } catch { /* fall through */ } + } + console.warn(`Failed to load locale '${locale}', falling back to English`); + return {}; + } +} + +export async function setLocale(locale) { + const normalized = locale.toLowerCase().replace(/_/g, "-"); + translations = await loadLocale(normalized); + setState({ locale: normalized }); + applyTranslations(); + document.documentElement.lang = normalized; + const base = normalized.split("-")[0]; + document.documentElement.dir = RTL_LOCALES.has(base) ? "rtl" : "ltr"; +} + +export function t(key) { + const keys = key.split("."); + let value = translations; + let fb = fallback; + + for (const k of keys) { + value = value?.[k]; + fb = fb?.[k]; + } + + return value || fb || key; +} + +export function tp(key, params = {}) { + let str = t(key); + for (const [k, v] of Object.entries(params)) { + str = str.replaceAll(`{${k}}`, v); + } + return str; +} + +export function applyTranslations() { + const elements = document.querySelectorAll("[data-i18n]"); + for (const el of elements) { + const key = el.getAttribute("data-i18n"); + const translated = t(key); + if (translated !== key) { + el.textContent = translated; + } + } + + const placeholders = document.querySelectorAll("[data-i18n-placeholder]"); + for (const el of placeholders) { + const key = el.getAttribute("data-i18n-placeholder"); + const translated = t(key); + if (translated !== key) { + el.placeholder = translated; + } + } + + const ariaLabels = document.querySelectorAll("[data-i18n-aria]"); + for (const el of ariaLabels) { + const key = el.getAttribute("data-i18n-aria"); + const translated = t(key); + if (translated !== key) { + el.setAttribute("aria-label", translated); + } + } + + const tooltips = document.querySelectorAll("[data-i18n-tooltip]"); + for (const el of tooltips) { + const key = el.getAttribute("data-i18n-tooltip"); + const translated = t(key); + if (translated !== key) { + el.setAttribute("data-tooltip", translated); + } + } +} diff --git a/src-mdviewer/src/core/mermaid-render.js b/src-mdviewer/src/core/mermaid-render.js new file mode 100644 index 0000000000..ed977186d7 --- /dev/null +++ b/src-mdviewer/src/core/mermaid-render.js @@ -0,0 +1,261 @@ +/** + * Lazy-loaded mermaid rendering module. + * Finds `pre[data-language="mermaid"]` blocks and renders them as SVG diagrams. + */ + +const devLog = import.meta.env.DEV ? console.log.bind(console, "[mermaid]") : () => {}; + +let mermaidModule = null; +let currentTheme = null; +let idCounter = 0; + +export function detectTheme() { + const attr = document.documentElement.getAttribute("data-theme"); + return attr === "dark" ? "dark" : "default"; +} + +export async function ensureMermaid(theme) { + if (!mermaidModule) { + devLog("importing mermaid module"); + mermaidModule = (await import("mermaid")).default; + devLog("mermaid module loaded"); + } + if (theme !== currentTheme) { + currentTheme = theme; + devLog("initializing with theme:", theme); + mermaidModule.initialize({ + startOnLoad: false, + theme, + securityLevel: "strict", + fontFamily: "inherit", + }); + } + return mermaidModule; +} + +export function parseAccessibility(source) { + const titleMatch = source.match(/accTitle\s*:\s*(.+)/); + const descrMatch = source.match(/accDescr\s*:\s*(.+)/); + return { + title: titleMatch ? titleMatch[1].trim() : null, + description: descrMatch ? descrMatch[1].trim() : null, + }; +} + +function createSkeleton() { + const skeleton = document.createElement("div"); + skeleton.className = "mermaid-skeleton"; + skeleton.setAttribute("aria-busy", "true"); + skeleton.setAttribute("aria-label", "Loading diagram"); + return skeleton; +} + +function createErrorContainer(message, source) { + const container = document.createElement("div"); + container.className = "mermaid-diagram mermaid-error"; + container.setAttribute("data-mermaid-source", source); + container.setAttribute("contenteditable", "false"); + + const msgEl = document.createElement("div"); + msgEl.className = "mermaid-error-message"; + msgEl.textContent = "Diagram error: " + message; + container.appendChild(msgEl); + + const details = document.createElement("details"); + details.className = "mermaid-error-source"; + const summary = document.createElement("summary"); + summary.textContent = "Source"; + details.appendChild(summary); + const pre = document.createElement("pre"); + const code = document.createElement("code"); + code.textContent = source; + pre.appendChild(code); + details.appendChild(pre); + container.appendChild(details); + + return container; +} + +export function cleanupMermaidOrphans(id) { + // Mermaid creates temporary elements with the render id (and prefixed variants) + // Only remove direct children of document.body — not elements we deliberately + // placed inside #viewer-content (the rendered SVGs share the same id). + for (const selector of [`:scope > #${id}`, `:scope > #d${id}`, `:scope > #i${id}`]) { + try { + const orphan = document.body.querySelector(selector); + if (orphan) orphan.remove(); + } catch { /* invalid selector — skip */ } + } +} + +export function applyAccessibility(svgEl, acc) { + svgEl.setAttribute("role", "img"); + + let titleId = null; + let descrId = null; + + if (acc.title) { + titleId = "mermaid-title-" + idCounter; + let titleEl = svgEl.querySelector("title"); + if (!titleEl) { + titleEl = document.createElementNS("http://www.w3.org/2000/svg", "title"); + svgEl.prepend(titleEl); + } + titleEl.textContent = acc.title; + titleEl.id = titleId; + } + + if (acc.description) { + descrId = "mermaid-desc-" + idCounter; + let descEl = svgEl.querySelector("desc"); + if (!descEl) { + descEl = document.createElementNS("http://www.w3.org/2000/svg", "desc"); + const titleEl = svgEl.querySelector("title"); + if (titleEl) { + titleEl.after(descEl); + } else { + svgEl.prepend(descEl); + } + } + descEl.textContent = acc.description; + descEl.id = descrId; + } + + const labelParts = [titleId, descrId].filter(Boolean); + if (titleId) svgEl.setAttribute("aria-labelledby", titleId); + if (descrId) svgEl.setAttribute("aria-describedby", descrId); + if (labelParts.length === 0) { + svgEl.setAttribute("aria-label", "Mermaid diagram"); + } +} + +/** + * Render all `pre[data-language="mermaid"]` blocks in the given container. + */ +export async function renderMermaidBlocks(container) { + const blocks = container.querySelectorAll('pre[data-language="mermaid"]'); + devLog("found", blocks.length, "mermaid blocks"); + if (blocks.length === 0) return; + + const theme = detectTheme(); + let mermaid; + try { + mermaid = await ensureMermaid(theme); + } catch (err) { + console.error("[mermaid] Failed to load mermaid module:", err); + for (const pre of blocks) { + const source = (pre.querySelector("code") || pre).textContent.trim(); + pre.replaceWith(createErrorContainer(err.message || String(err), source)); + } + return; + } + + const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + + for (const pre of blocks) { + const codeEl = pre.querySelector("code"); + const source = codeEl ? codeEl.textContent.trim() : pre.textContent.trim(); + if (!source) { + const errorEl = createErrorContainer("Empty diagram", source); + pre.replaceWith(errorEl); + continue; + } + + // Create wrapper + const wrapper = document.createElement("div"); + wrapper.className = "mermaid-diagram"; + wrapper.setAttribute("data-mermaid-source", source); + wrapper.setAttribute("contenteditable", "false"); + wrapper.setAttribute("tabindex", "0"); + + // Show skeleton + const skeleton = createSkeleton(); + wrapper.appendChild(skeleton); + pre.replaceWith(wrapper); + + const id = `mermaid-${Date.now()}-${idCounter++}`; + try { + devLog("rendering block:", id, source.slice(0, 60)); + const { svg } = await mermaid.render(id, source); + devLog("render success:", id); + + // Parse SVG and apply accessibility + const temp = document.createElement("div"); + temp.innerHTML = svg; + const svgEl = temp.querySelector("svg"); + + if (svgEl) { + const acc = parseAccessibility(source); + applyAccessibility(svgEl, acc); + + if (reducedMotion) { + skeleton.replaceWith(svgEl); + } else { + svgEl.style.opacity = "0"; + skeleton.replaceWith(svgEl); + requestAnimationFrame(() => { + svgEl.style.transition = "opacity 200ms ease-in-out"; + svgEl.style.opacity = "1"; + }); + } + } else { + skeleton.replaceWith(createErrorContainer("Failed to generate SVG", source).firstChild); + } + } catch (err) { + const message = err.message || String(err); + console.warn("[mermaid] render error:", id, message); + + const errorEl = createErrorContainer(message, source); + wrapper.replaceWith(errorEl); + } finally { + // Clean up orphan elements mermaid may leave in document.body + cleanupMermaidOrphans(id); + } + } +} + +/** + * Re-render existing mermaid diagrams after a theme change. + */ +export async function reRenderMermaidBlocks(container) { + const diagrams = container.querySelectorAll(".mermaid-diagram[data-mermaid-source]"); + if (diagrams.length === 0) return; + + const theme = detectTheme(); + if (theme === currentTheme && mermaidModule) { + // Theme didn't actually change — skip + // But force re-render anyway since this is called on theme change + } + const mermaid = await ensureMermaid(theme); + // Force re-initialize with new theme + currentTheme = null; + await ensureMermaid(theme); + + for (const wrapper of diagrams) { + const source = wrapper.getAttribute("data-mermaid-source"); + if (!source) continue; + + const id = `mermaid-${Date.now()}-${idCounter++}`; + try { + const { svg } = await mermaid.render(id, source); + + const temp = document.createElement("div"); + temp.innerHTML = svg; + const svgEl = temp.querySelector("svg"); + + if (svgEl) { + const acc = parseAccessibility(source); + applyAccessibility(svgEl, acc); + + // Replace content but keep wrapper + wrapper.classList.remove("mermaid-error"); + wrapper.innerHTML = ""; + wrapper.appendChild(svgEl); + } + } catch (err) { + // Keep existing error/diagram — don't replace with a worse state + } finally { + cleanupMermaidOrphans(id); + } + } +} diff --git a/src-mdviewer/src/core/prism-languages.js b/src-mdviewer/src/core/prism-languages.js new file mode 100644 index 0000000000..cbf244e373 --- /dev/null +++ b/src-mdviewer/src/core/prism-languages.js @@ -0,0 +1,298 @@ +// Auto-generated by scripts/gen-prism-imports.mjs — do not edit manually +import "prismjs/components/prism-abap"; +import "prismjs/components/prism-abnf"; +import "prismjs/components/prism-ada"; +import "prismjs/components/prism-agda"; +import "prismjs/components/prism-al"; +import "prismjs/components/prism-antlr4"; +import "prismjs/components/prism-apacheconf"; +import "prismjs/components/prism-apl"; +import "prismjs/components/prism-applescript"; +import "prismjs/components/prism-aql"; +import "prismjs/components/prism-arff"; +import "prismjs/components/prism-armasm"; +import "prismjs/components/prism-arturo"; +import "prismjs/components/prism-asciidoc"; +import "prismjs/components/prism-asm6502"; +import "prismjs/components/prism-asmatmel"; +import "prismjs/components/prism-autohotkey"; +import "prismjs/components/prism-autoit"; +import "prismjs/components/prism-avisynth"; +import "prismjs/components/prism-avro-idl"; +import "prismjs/components/prism-awk"; +import "prismjs/components/prism-bash"; +import "prismjs/components/prism-basic"; +import "prismjs/components/prism-batch"; +import "prismjs/components/prism-bbcode"; +import "prismjs/components/prism-bbj"; +import "prismjs/components/prism-bicep"; +import "prismjs/components/prism-bnf"; +import "prismjs/components/prism-bqn"; +import "prismjs/components/prism-brainfuck"; +import "prismjs/components/prism-brightscript"; +import "prismjs/components/prism-bro"; +import "prismjs/components/prism-bsl"; +import "prismjs/components/prism-cil"; +import "prismjs/components/prism-clike"; +import "prismjs/components/prism-birb"; +import "prismjs/components/prism-c"; +import "prismjs/components/prism-bison"; +import "prismjs/components/prism-cfscript"; +import "prismjs/components/prism-cilkc"; +import "prismjs/components/prism-clojure"; +import "prismjs/components/prism-cmake"; +import "prismjs/components/prism-cobol"; +import "prismjs/components/prism-concurnas"; +import "prismjs/components/prism-cooklang"; +import "prismjs/components/prism-coq"; +import "prismjs/components/prism-cpp"; +import "prismjs/components/prism-arduino"; +import "prismjs/components/prism-chaiscript"; +import "prismjs/components/prism-cilkcpp"; +import "prismjs/components/prism-csharp"; +import "prismjs/components/prism-csp"; +import "prismjs/components/prism-css"; +import "prismjs/components/prism-css-extras"; +import "prismjs/components/prism-csv"; +import "prismjs/components/prism-cue"; +import "prismjs/components/prism-cypher"; +import "prismjs/components/prism-d"; +import "prismjs/components/prism-dart"; +import "prismjs/components/prism-dataweave"; +import "prismjs/components/prism-dax"; +import "prismjs/components/prism-dhall"; +import "prismjs/components/prism-diff"; +import "prismjs/components/prism-dns-zone-file"; +import "prismjs/components/prism-docker"; +import "prismjs/components/prism-dot"; +import "prismjs/components/prism-ebnf"; +import "prismjs/components/prism-editorconfig"; +import "prismjs/components/prism-eiffel"; +import "prismjs/components/prism-elixir"; +import "prismjs/components/prism-elm"; +import "prismjs/components/prism-erlang"; +import "prismjs/components/prism-excel-formula"; +import "prismjs/components/prism-factor"; +import "prismjs/components/prism-false"; +import "prismjs/components/prism-firestore-security-rules"; +import "prismjs/components/prism-fortran"; +import "prismjs/components/prism-fsharp"; +import "prismjs/components/prism-gap"; +import "prismjs/components/prism-gcode"; +import "prismjs/components/prism-gdscript"; +import "prismjs/components/prism-gedcom"; +import "prismjs/components/prism-gettext"; +import "prismjs/components/prism-gherkin"; +import "prismjs/components/prism-git"; +import "prismjs/components/prism-glsl"; +import "prismjs/components/prism-gml"; +import "prismjs/components/prism-gn"; +import "prismjs/components/prism-go"; +import "prismjs/components/prism-go-module"; +import "prismjs/components/prism-gradle"; +import "prismjs/components/prism-graphql"; +import "prismjs/components/prism-groovy"; +import "prismjs/components/prism-haskell"; +import "prismjs/components/prism-haxe"; +import "prismjs/components/prism-hcl"; +import "prismjs/components/prism-hlsl"; +import "prismjs/components/prism-hoon"; +import "prismjs/components/prism-hpkp"; +import "prismjs/components/prism-hsts"; +import "prismjs/components/prism-http"; +import "prismjs/components/prism-ichigojam"; +import "prismjs/components/prism-icon"; +import "prismjs/components/prism-icu-message-format"; +import "prismjs/components/prism-idris"; +import "prismjs/components/prism-iecst"; +import "prismjs/components/prism-ignore"; +import "prismjs/components/prism-inform7"; +import "prismjs/components/prism-ini"; +import "prismjs/components/prism-io"; +import "prismjs/components/prism-j"; +import "prismjs/components/prism-java"; +import "prismjs/components/prism-javadoclike"; +import "prismjs/components/prism-javascript"; +import "prismjs/components/prism-actionscript"; +import "prismjs/components/prism-coffeescript"; +import "prismjs/components/prism-flow"; +import "prismjs/components/prism-javastacktrace"; +import "prismjs/components/prism-jexl"; +import "prismjs/components/prism-jolie"; +import "prismjs/components/prism-jq"; +import "prismjs/components/prism-js-extras"; +import "prismjs/components/prism-js-templates"; +import "prismjs/components/prism-json"; +import "prismjs/components/prism-json5"; +import "prismjs/components/prism-jsonp"; +import "prismjs/components/prism-jsstacktrace"; +import "prismjs/components/prism-julia"; +import "prismjs/components/prism-keepalived"; +import "prismjs/components/prism-keyman"; +import "prismjs/components/prism-kotlin"; +import "prismjs/components/prism-kumir"; +import "prismjs/components/prism-kusto"; +import "prismjs/components/prism-latex"; +import "prismjs/components/prism-less"; +import "prismjs/components/prism-linker-script"; +import "prismjs/components/prism-lisp"; +import "prismjs/components/prism-livescript"; +import "prismjs/components/prism-llvm"; +import "prismjs/components/prism-log"; +import "prismjs/components/prism-lolcode"; +import "prismjs/components/prism-lua"; +import "prismjs/components/prism-magma"; +import "prismjs/components/prism-makefile"; +import "prismjs/components/prism-markup"; +import "prismjs/components/prism-aspnet"; +import "prismjs/components/prism-cshtml"; +import "prismjs/components/prism-javadoc"; +import "prismjs/components/prism-jsx"; +import "prismjs/components/prism-markdown"; +import "prismjs/components/prism-markup-templating"; +import "prismjs/components/prism-django"; +import "prismjs/components/prism-ejs"; +import "prismjs/components/prism-etlua"; +import "prismjs/components/prism-ftl"; +import "prismjs/components/prism-handlebars"; +import "prismjs/components/prism-liquid"; +import "prismjs/components/prism-mata"; +import "prismjs/components/prism-matlab"; +import "prismjs/components/prism-maxscript"; +import "prismjs/components/prism-mel"; +import "prismjs/components/prism-mermaid"; +import "prismjs/components/prism-metafont"; +import "prismjs/components/prism-mizar"; +import "prismjs/components/prism-mongodb"; +import "prismjs/components/prism-monkey"; +import "prismjs/components/prism-moonscript"; +import "prismjs/components/prism-n1ql"; +import "prismjs/components/prism-n4js"; +import "prismjs/components/prism-nand2tetris-hdl"; +import "prismjs/components/prism-naniscript"; +import "prismjs/components/prism-nasm"; +import "prismjs/components/prism-neon"; +import "prismjs/components/prism-nevod"; +import "prismjs/components/prism-nginx"; +import "prismjs/components/prism-nim"; +import "prismjs/components/prism-nix"; +import "prismjs/components/prism-nsis"; +import "prismjs/components/prism-objectivec"; +import "prismjs/components/prism-ocaml"; +import "prismjs/components/prism-odin"; +import "prismjs/components/prism-opencl"; +import "prismjs/components/prism-openqasm"; +import "prismjs/components/prism-oz"; +import "prismjs/components/prism-parigp"; +import "prismjs/components/prism-parser"; +import "prismjs/components/prism-pascal"; +import "prismjs/components/prism-pascaligo"; +import "prismjs/components/prism-pcaxis"; +import "prismjs/components/prism-peoplecode"; +import "prismjs/components/prism-perl"; +import "prismjs/components/prism-php"; +import "prismjs/components/prism-latte"; +import "prismjs/components/prism-php-extras"; +import "prismjs/components/prism-phpdoc"; +import "prismjs/components/prism-plant-uml"; +import "prismjs/components/prism-powerquery"; +import "prismjs/components/prism-powershell"; +import "prismjs/components/prism-processing"; +import "prismjs/components/prism-prolog"; +import "prismjs/components/prism-promql"; +import "prismjs/components/prism-properties"; +import "prismjs/components/prism-protobuf"; +import "prismjs/components/prism-psl"; +import "prismjs/components/prism-pug"; +import "prismjs/components/prism-puppet"; +import "prismjs/components/prism-pure"; +import "prismjs/components/prism-purebasic"; +import "prismjs/components/prism-purescript"; +import "prismjs/components/prism-python"; +import "prismjs/components/prism-q"; +import "prismjs/components/prism-qml"; +import "prismjs/components/prism-qore"; +import "prismjs/components/prism-qsharp"; +import "prismjs/components/prism-r"; +import "prismjs/components/prism-reason"; +import "prismjs/components/prism-regex"; +import "prismjs/components/prism-rego"; +import "prismjs/components/prism-renpy"; +import "prismjs/components/prism-rescript"; +import "prismjs/components/prism-rest"; +import "prismjs/components/prism-rip"; +import "prismjs/components/prism-roboconf"; +import "prismjs/components/prism-robotframework"; +import "prismjs/components/prism-ruby"; +import "prismjs/components/prism-crystal"; +import "prismjs/components/prism-erb"; +import "prismjs/components/prism-haml"; +import "prismjs/components/prism-rust"; +import "prismjs/components/prism-sas"; +import "prismjs/components/prism-sass"; +import "prismjs/components/prism-scala"; +import "prismjs/components/prism-scheme"; +import "prismjs/components/prism-lilypond"; +import "prismjs/components/prism-racket"; +import "prismjs/components/prism-scss"; +import "prismjs/components/prism-shell-session"; +import "prismjs/components/prism-smali"; +import "prismjs/components/prism-smalltalk"; +import "prismjs/components/prism-smarty"; +import "prismjs/components/prism-sml"; +import "prismjs/components/prism-solidity"; +import "prismjs/components/prism-solution-file"; +import "prismjs/components/prism-soy"; +import "prismjs/components/prism-splunk-spl"; +import "prismjs/components/prism-sqf"; +import "prismjs/components/prism-sql"; +import "prismjs/components/prism-apex"; +import "prismjs/components/prism-plsql"; +import "prismjs/components/prism-squirrel"; +import "prismjs/components/prism-stan"; +import "prismjs/components/prism-stata"; +import "prismjs/components/prism-stylus"; +import "prismjs/components/prism-supercollider"; +import "prismjs/components/prism-swift"; +import "prismjs/components/prism-systemd"; +import "prismjs/components/prism-t4-templating"; +import "prismjs/components/prism-t4-cs"; +import "prismjs/components/prism-tcl"; +import "prismjs/components/prism-textile"; +import "prismjs/components/prism-toml"; +import "prismjs/components/prism-tremor"; +import "prismjs/components/prism-tt2"; +import "prismjs/components/prism-turtle"; +import "prismjs/components/prism-sparql"; +import "prismjs/components/prism-twig"; +import "prismjs/components/prism-typescript"; +import "prismjs/components/prism-jsdoc"; +import "prismjs/components/prism-tsx"; +import "prismjs/components/prism-typoscript"; +import "prismjs/components/prism-unrealscript"; +import "prismjs/components/prism-uorazor"; +import "prismjs/components/prism-uri"; +import "prismjs/components/prism-v"; +import "prismjs/components/prism-vala"; +import "prismjs/components/prism-vbnet"; +import "prismjs/components/prism-t4-vb"; +import "prismjs/components/prism-velocity"; +import "prismjs/components/prism-verilog"; +import "prismjs/components/prism-vhdl"; +import "prismjs/components/prism-vim"; +import "prismjs/components/prism-visual-basic"; +import "prismjs/components/prism-warpscript"; +import "prismjs/components/prism-wasm"; +import "prismjs/components/prism-web-idl"; +import "prismjs/components/prism-wgsl"; +import "prismjs/components/prism-wiki"; +import "prismjs/components/prism-wolfram"; +import "prismjs/components/prism-wren"; +import "prismjs/components/prism-xeora"; +import "prismjs/components/prism-xml-doc"; +import "prismjs/components/prism-xojo"; +import "prismjs/components/prism-xquery"; +import "prismjs/components/prism-yaml"; +import "prismjs/components/prism-tap"; +import "prismjs/components/prism-yang"; +import "prismjs/components/prism-zig"; diff --git a/src-mdviewer/src/core/state.js b/src-mdviewer/src/core/state.js new file mode 100644 index 0000000000..bb7cbd892d --- /dev/null +++ b/src-mdviewer/src/core/state.js @@ -0,0 +1,35 @@ +// Adapted state management — no Tauri persistence, externally controlled +import { emit } from "./events.js"; + +const defaultState = { + currentContent: null, + parseResult: null, + theme: "light", + locale: "en", + editMode: false, + isDirty: false +}; + +let state = { ...defaultState }; + +export function getState() { + return state; +} + +export function setState(updates) { + const prev = { ...state }; + Object.assign(state, updates); + + // Emit change events for each changed key + for (const key of Object.keys(updates)) { + if (prev[key] !== state[key]) { + emit("state:" + key, state[key]); + } + } + + emit("state:changed", state); +} + +export function resetState() { + state = { ...defaultState }; +} diff --git a/src-mdviewer/src/embedded-main.js b/src-mdviewer/src/embedded-main.js new file mode 100644 index 0000000000..14638b4b18 --- /dev/null +++ b/src-mdviewer/src/embedded-main.js @@ -0,0 +1,31 @@ +/** + * Entry point for Phoenix-embedded mdviewr. + * Initializes components and bridge, waits for content from Phoenix. + */ +import "./styles/app.css"; +import { initI18n } from "./core/i18n.js"; +import { initViewer } from "./components/viewer.js"; +import { initEditor } from "./components/editor.js"; +import { initEmbeddedToolbar } from "./components/embedded-toolbar.js"; +import { initContextMenu } from "./components/context-menu.js"; +import { initSearch } from "./components/search.js"; +import { initBridge } from "./bridge.js"; + +async function init() { + // Initialize i18n first (loads English fallback) + await initI18n(); + + // Initialize components + initViewer(); + initEditor(); + initEmbeddedToolbar(); + initContextMenu(); + initSearch(); + + // Initialize bridge (sends ready signal to Phoenix) + initBridge(); +} + +init().catch((err) => { + console.error("[mdviewr] Failed to initialize:", err); +}); diff --git a/src-mdviewer/src/locales/ar.json b/src-mdviewer/src/locales/ar.json new file mode 100644 index 0000000000..1bdda3bf8a --- /dev/null +++ b/src-mdviewer/src/locales/ar.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "إغلاق البحث", + "edit_link": "تحرير الرابط", + "format_text": "تنسيق النص", + "insert_block": "إدراج كتلة", + "main_toolbar": "شريط الأدوات الرئيسي", + "next_match": "النتيجة التالية", + "previous_match": "النتيجة السابقة", + "search_in_document": "البحث في المستند", + "search_text": "نص البحث", + "select_language": "اختيار اللغة", + "sidebar": "الشريط الجانبي", + "skip_to_content": "تخطّي إلى المحتوى" + }, + "common": { + "close": "إغلاق", + "file": "ملف", + "open": "فتح" + }, + "context": { + "copy": "نسخ", + "copy_image_address": "نسخ عنوان الصورة", + "copy_link": "نسخ الرابط", + "cut": "قص", + "open_link": "فتح الرابط", + "paste": "لصق", + "paste_plain": "لصق كنص عادي", + "select_all": "تحديد الكل" + }, + "dialog": { + "cancel": "إلغاء", + "discard": "تجاهل", + "dont_save": "عدم الحفظ", + "save": "حفظ", + "unsaved_close": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل الإغلاق؟", + "unsaved_exit_edit": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل الخروج من وضع التحرير؟", + "unsaved_new_file": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل إنشاء ملف جديد؟", + "unsaved_open_file": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل فتح ملف جديد؟", + "unsaved_title": "تغييرات غير محفوظة" + }, + "drop_zone": { + "text": "أفلت ملف ماركداون هنا" + }, + "export": { + "open": "فتح", + "success": "تم تصدير PDF بنجاح" + }, + "format": { + "blockquote": "اقتباس", + "bold": "غامق ({mod}+B)", + "bullet_list": "قائمة نقطية", + "code": "رمز سطري ({mod}+E)", + "code_block": "كتلة رمز", + "divider": "فاصل", + "heading1": "عنوان 1", + "heading2": "عنوان 2", + "heading3": "عنوان 3", + "italic": "مائل ({mod}+I)", + "link": "رابط ({mod}+K)", + "numbered_list": "قائمة مرقّمة", + "paragraph": "فقرة", + "strikethrough": "يتوسطه خط ({mod}+Shift+X)", + "table": "جدول", + "task_list": "قائمة مهام", + "block_type": "نوع الكتلة", + "lists": "قوائم", + "more_elements": "المزيد", + "text_formatting": "تنسيق النص", + "underline": "تسطير" + }, + "help": { + "editing": "التحرير", + "fallback_notice": "هذه الصفحة غير متوفرة بلغتك بعد. يتم عرض النسخة الإنجليزية.", + "features": "الميزات", + "getting_started": "البدء", + "shortcuts": "اختصارات لوحة المفاتيح" + }, + "lang_picker": { + "filter_label": "تصفية اللغات", + "filter_placeholder": "تصفية اللغات...", + "plain_text": "نص عادي" + }, + "link": { + "apply": "تطبيق الرابط", + "cancel": "إلغاء", + "display_text": "نص العرض", + "edit": "تحرير", + "edit_link": "تحرير الرابط", + "remove_link": "إزالة الرابط", + "text": "النص", + "text_placeholder": "نص العرض (اختياري)", + "url": "الرابط", + "url_placeholder": "الصق أو اكتب رابطًا..." + }, + "recovery": { + "discard": "تجاهل", + "message": "عثر Kern على تغييرات غير محفوظة من جلسة سابقة. هل تريد استعادتها؟", + "restore": "استعادة", + "title": "استعادة التغييرات غير المحفوظة؟" + }, + "search": { + "count": "نتيجة", + "no_results": "لا توجد نتائج", + "placeholder": "البحث في المستند..." + }, + "settings": { + "language": "اللغة", + "theme": "السمة", + "theme_dark": "داكن", + "theme_light": "فاتح", + "theme_system": "النظام" + }, + "sidebar": { + "no_headings": "لم يتم العثور على عناوين", + "recent": "الملفات الأخيرة", + "toc": "جدول المحتويات" + }, + "slash": { + "blockquote": "اقتباس", + "blockquote_desc": "كتلة اقتباس", + "bullet_list": "قائمة نقطية", + "bullet_list_desc": "قائمة غير مرتّبة", + "code_block": "كتلة رمز", + "code_block_desc": "رمز محاط بسياج", + "divider": "فاصل", + "divider_desc": "خط أفقي", + "heading1": "عنوان 1", + "heading1_desc": "عنوان كبير", + "heading2": "عنوان 2", + "heading2_desc": "عنوان متوسط", + "heading3": "عنوان 3", + "heading3_desc": "عنوان صغير", + "no_results": "لا توجد نتائج", + "numbered_list": "قائمة مرقّمة", + "numbered_list_desc": "قائمة مرتّبة", + "paragraph": "فقرة", + "paragraph_desc": "نص عادي", + "table": "جدول", + "table_desc": "جدول 3×3", + "task_list": "قائمة مهام", + "task_list_desc": "قائمة تحقّق", + "mermaid": "مخطط Mermaid", + "mermaid_desc": "إدراج مخطط" + }, + "table": { + "add_col_left": "إضافة عمود يسارًا", + "add_col_right": "إضافة عمود يمينًا", + "add_row_above": "إضافة صف أعلى", + "add_row_below": "إضافة صف أسفل", + "col_options": "خيارات العمود {n}", + "delete_col": "حذف العمود", + "delete_row": "حذف الصف", + "header": "ترويسة", + "insert_col_left": "إدراج عمود يسارًا", + "insert_col_right": "إدراج عمود يمينًا", + "insert_row_above": "إدراج صف أعلى", + "insert_row_below": "إدراج صف أسفل", + "new_row": "+ صف جديد", + "row_options": "خيارات الصف {n}" + }, + "toolbar": { + "edit": "تحرير", + "export_pdf": "تصدير PDF", + "focus": "وضع التركيز", + "more": "المزيد", + "new_file": "ملف جديد", + "open": "فتح ملف", + "save": "حفظ", + "search": "بحث", + "settings": "الإعدادات", + "split_view": "عرض مقسّم", + "theme": "تبديل السمة", + "toc": "جدول المحتويات", + "zoom_in": "تكبير", + "zoom_out": "تصغير", + "zoom_reset": "إعادة تعيين التكبير", + "done": "تم" + }, + "trial": { + "days_remaining": "باقي {days} يوم في الفترة التجريبية", + "expired_message": "انتهت الفترة التجريبية. قم بشراء Kern لمتابعة التحرير.", + "feature_edit": "تحرير Markdown بواجهة WYSIWYG والعرض المقسّم", + "feature_export": "تصدير إلى PDF", + "feature_save": "حفظ وإنشاء ملفات جديدة", + "one_time_purchase": "شراء لمرة واحدة. بدون اشتراك.", + "purchase_button": "شراء Kern", + "purchase_desc": "احصل على وصول كامل لجميع ميزات التحرير والتصدير بعملية شراء واحدة.", + "purchase_title": "فتح Kern", + "purchasing": "جارٍ الشراء...", + "restore_purchases": "استعادة المشتريات", + "restoring": "جارٍ الاستعادة..." + }, + "viewer": { + "copied": "تم النسخ!", + "copy": "نسخ" + }, + "welcome": { + "drop_hint": "أو اسحب وأفلت ملف .md", + "new_button": "ملف جديد", + "open_button": "فتح ملف", + "subtitle": "عارض ماركداون أنيق", + "title": "Kern" + }, + "mermaid": { + "done": "تم", + "edit": "تحرير", + "error_prefix": "خطأ في الصياغة", + "stale": "المعاينة غير محدّثة" + } +} diff --git a/src-mdviewer/src/locales/bg.json b/src-mdviewer/src/locales/bg.json new file mode 100644 index 0000000000..2140bad750 --- /dev/null +++ b/src-mdviewer/src/locales/bg.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Затвори търсенето", + "edit_link": "Редактиране на връзка", + "format_text": "Форматиране на текст", + "insert_block": "Вмъкване на блок", + "main_toolbar": "Главна лента с инструменти", + "next_match": "Следващо съвпадение", + "previous_match": "Предишно съвпадение", + "search_in_document": "Търсене в документа", + "search_text": "Текст за търсене", + "select_language": "Избор на език", + "sidebar": "Странична лента", + "skip_to_content": "Премини към съдържанието" + }, + "common": { + "close": "Затвори", + "file": "Файл", + "open": "Отвори" + }, + "context": { + "copy": "Копирай", + "copy_image_address": "Копирай адреса на изображението", + "copy_link": "Копирай връзката", + "cut": "Изрежи", + "open_link": "Отвори връзката", + "paste": "Поставяне", + "paste_plain": "Поставяне като чист текст", + "select_all": "Избиране на всичко" + }, + "dialog": { + "cancel": "Отказ", + "discard": "Отхвърляне", + "dont_save": "Не запазвай", + "save": "Запазване", + "unsaved_close": "Имате незапазени промени. Искате ли да ги запазите преди затваряне?", + "unsaved_exit_edit": "Имате незапазени промени. Искате ли да ги запазите преди излизане от режим на редакция?", + "unsaved_new_file": "Имате незапазени промени. Искате ли да ги запазите преди създаване на нов файл?", + "unsaved_open_file": "Имате незапазени промени. Искате ли да ги запазите преди да отворите нов файл?", + "unsaved_title": "Незапазени промени" + }, + "drop_zone": { + "text": "Пуснете своя Markdown файл тук" + }, + "export": { + "open": "Отвори", + "success": "PDF е експортиран успешно" + }, + "format": { + "block_type": "Тип на блока", + "blockquote": "Цитатен блок", + "bold": "Получер ({mod}+B)", + "bullet_list": "Списък с водещи символи", + "code": "Вграден код ({mod}+E)", + "code_block": "Кодов блок", + "divider": "Разделител", + "heading1": "Заглавие 1", + "heading2": "Заглавие 2", + "heading3": "Заглавие 3", + "italic": "Курсив ({mod}+I)", + "link": "Връзка ({mod}+K)", + "lists": "Списъци", + "more_elements": "Още", + "numbered_list": "Номериран списък", + "paragraph": "Параграф", + "strikethrough": "Зачертан текст ({mod}+Shift+X)", + "table": "Таблица", + "task_list": "Списък със задачи", + "text_formatting": "Форматиране на текст", + "underline": "Подчертан текст" + }, + "help": { + "editing": "Редактиране", + "fallback_notice": "Тази страница все още не е налична на вашия език. Показваме английската версия.", + "features": "Възможности", + "getting_started": "Първи стъпки", + "shortcuts": "Клавишни комбинации" + }, + "lang_picker": { + "filter_label": "Филтриране на езици", + "filter_placeholder": "Филтриране на езици...", + "plain_text": "Обикновен текст" + }, + "link": { + "apply": "Приложи", + "cancel": "Отказ", + "display_text": "Текст за показване", + "edit": "Редактиране", + "edit_link": "Редактиране на връзка", + "remove_link": "Премахни връзката", + "text": "Текст", + "text_placeholder": "Показван текст (по избор)", + "url": "URL", + "url_placeholder": "Поставете или въведете URL..." + }, + "mermaid": { + "done": "Готово", + "edit": "Редактиране", + "error_prefix": "Синтактична грешка", + "stale": "Неактуален преглед" + }, + "recovery": { + "discard": "Отхвърляне", + "message": "Kern откри незапазени промени от предишна сесия. Искате ли да ги възстановите?", + "restore": "Възстанови", + "title": "Да се възстановят ли незапазените промени?" + }, + "search": { + "count": "съвпадения", + "no_results": "Няма резултати", + "placeholder": "Търсене в документа..." + }, + "settings": { + "language": "Език", + "theme": "Тема", + "theme_dark": "Тъмна", + "theme_light": "Светла", + "theme_system": "Системна" + }, + "sidebar": { + "no_headings": "Не са намерени заглавия", + "recent": "Последни файлове", + "toc": "Съдържание" + }, + "slash": { + "blockquote": "Цитат", + "blockquote_desc": "Блок с цитат", + "bullet_list": "Списък с водещи символи", + "bullet_list_desc": "Неномериран списък", + "code_block": "Кодов блок", + "code_block_desc": "Ограден код", + "divider": "Разделител", + "divider_desc": "Хоризонтална линия", + "heading1": "Заглавие 1", + "heading1_desc": "Голямо заглавие", + "heading2": "Заглавие 2", + "heading2_desc": "Средно заглавие", + "heading3": "Заглавие 3", + "heading3_desc": "Малко заглавие", + "mermaid": "Mermaid диаграма", + "mermaid_desc": "Вмъкване на диаграма", + "no_results": "Няма резултати", + "numbered_list": "Номериран списък", + "numbered_list_desc": "Подреден списък", + "paragraph": "Параграф", + "paragraph_desc": "Обикновен текст", + "table": "Таблица", + "table_desc": "Таблица 3×3", + "task_list": "Списък със задачи", + "task_list_desc": "Списък за проверка" + }, + "table": { + "add_col_left": "Добави колона вляво", + "add_col_right": "Добави колона вдясно", + "add_row_above": "Добави ред отгоре", + "add_row_below": "Добави ред отдолу", + "col_options": "Опции на колона {n}", + "delete_col": "Изтрий колона", + "delete_row": "Изтрий ред", + "header": "Заглавка", + "insert_col_left": "Вмъкни колона вляво", + "insert_col_right": "Вмъкни колона вдясно", + "insert_row_above": "Вмъкни ред отгоре", + "insert_row_below": "Вмъкни ред отдолу", + "new_row": "+ Нов ред", + "row_options": "Опции за ред {n}" + }, + "toolbar": { + "done": "Готово", + "edit": "Редактиране", + "export_pdf": "Експорт в PDF", + "focus": "Режим на фокус", + "more": "Още", + "new_file": "Нов файл", + "open": "Отваряне на файл", + "save": "Запазване", + "search": "Търсене", + "settings": "Настройки", + "split_view": "Разделен изглед", + "theme": "Превключване на темата", + "toc": "Съдържание", + "zoom_in": "Увеличаване", + "zoom_out": "Намаляване", + "zoom_reset": "Нулиране на мащаба" + }, + "trial": { + "days_remaining": "Остават {days} дни от пробния период", + "expired_message": "Пробният Ви период изтече. Закупете Kern, за да продължите да редактирате.", + "feature_edit": "Редактиране на Markdown с WYSIWYG и разделен изглед", + "feature_export": "Експорт към PDF", + "feature_save": "Запазване и създаване на нови файлове", + "one_time_purchase": "Еднократно плащане. Без абонамент.", + "purchase_button": "Закупете Kern", + "purchase_desc": "Получете пълен достъп до всички функции за редактиране и експорт с еднократно плащане.", + "purchase_title": "Отключете Kern", + "purchasing": "Закупуване...", + "restore_purchases": "Възстановяване на покупки", + "restoring": "Възстановяване..." + }, + "viewer": { + "copied": "Копирано!", + "copy": "Копирай" + }, + "welcome": { + "drop_hint": "или плъзнете и пуснете .md файл", + "new_button": "Нов файл", + "open_button": "Отвори файл", + "subtitle": "Красив преглед на Markdown", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/bn.json b/src-mdviewer/src/locales/bn.json new file mode 100644 index 0000000000..c88d8f392c --- /dev/null +++ b/src-mdviewer/src/locales/bn.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "ফাইল খুলুন", + "theme": "থিম পরিবর্তন", + "toc": "সূচিপত্র", + "search": "অনুসন্ধান", + "focus": "ফোকাস মোড", + "zoom_in": "জুম ইন", + "zoom_out": "জুম আউট", + "zoom_reset": "জুম রিসেট", + "save": "সংরক্ষণ", + "edit": "সম্পাদনা", + "new_file": "নতুন ফাইল", + "split_view": "বিভক্ত দৃশ্য", + "export_pdf": "PDF রপ্তানি করুন", + "settings": "সেটিংস", + "more": "আরও" + }, + "sidebar": { + "toc": "সূচিপত্র", + "recent": "সাম্প্রতিক ফাইল", + "no_headings": "কোনো শিরোনাম পাওয়া যায়নি" + }, + "search": { + "placeholder": "নথিতে অনুসন্ধান...", + "count": "মিল", + "no_results": "কোনো ফলাফল নেই" + }, + "welcome": { + "title": "Kern", + "subtitle": "একটি সুন্দর মার্কডাউন ভিউয়ার", + "new_button": "নতুন ফাইল", + "open_button": "ফাইল খুলুন", + "drop_hint": "অথবা একটি .md ফাইল টেনে আনুন" + }, + "viewer": { + "copy": "কপি", + "copied": "কপি হয়েছে!" + }, + "settings": { + "theme": "থিম", + "theme_light": "হালকা", + "theme_dark": "গাঢ়", + "theme_system": "সিস্টেম", + "language": "ভাষা" + }, + "common": { + "close": "বন্ধ", + "open": "খুলুন", + "file": "ফাইল" + }, + "format": { + "paragraph": "অনুচ্ছেদ", + "heading1": "শিরোনাম ১", + "heading2": "শিরোনাম ২", + "heading3": "শিরোনাম ৩", + "bold": "বোল্ড ({mod}+B)", + "italic": "ইটালিক ({mod}+I)", + "strikethrough": "স্ট্রাইকথ্রু ({mod}+Shift+X)", + "code": "ইনলাইন কোড ({mod}+E)", + "link": "লিংক ({mod}+K)", + "bullet_list": "বুলেট তালিকা", + "numbered_list": "সংখ্যা তালিকা", + "task_list": "কাজের তালিকা", + "blockquote": "ব্লককোট", + "divider": "বিভাজক", + "table": "টেবিল", + "code_block": "কোড ব্লক" + }, + "slash": { + "paragraph": "অনুচ্ছেদ", + "paragraph_desc": "সাধারণ পাঠ্য", + "heading1": "শিরোনাম ১", + "heading1_desc": "বড় শিরোনাম", + "heading2": "শিরোনাম ২", + "heading2_desc": "মাঝারি শিরোনাম", + "heading3": "শিরোনাম ৩", + "heading3_desc": "ছোট শিরোনাম", + "bullet_list": "বুলেট তালিকা", + "bullet_list_desc": "অক্রমিক তালিকা", + "numbered_list": "সংখ্যা তালিকা", + "numbered_list_desc": "ক্রমিক তালিকা", + "task_list": "কাজের তালিকা", + "task_list_desc": "চেকলিস্ট", + "blockquote": "ব্লককোট", + "blockquote_desc": "উদ্ধৃতি ব্লক", + "code_block": "কোড ব্লক", + "code_block_desc": "ফেন্সড কোড", + "table": "টেবিল", + "table_desc": "৩×৩ টেবিল", + "divider": "বিভাজক", + "divider_desc": "অনুভূমিক রেখা", + "no_results": "কোনো ফলাফল নেই" + }, + "link": { + "edit": "সম্পাদনা", + "edit_link": "লিংক সম্পাদনা", + "remove_link": "লিংক সরান", + "text": "টেক্সট", + "text_placeholder": "প্রদর্শন টেক্সট (ঐচ্ছিক)", + "display_text": "প্রদর্শন টেক্সট", + "url": "URL", + "url_placeholder": "URL পেস্ট বা টাইপ করুন...", + "apply": "লিংক প্রয়োগ", + "cancel": "বাতিল" + }, + "table": { + "header": "হেডার", + "new_row": "+ নতুন সারি", + "row_options": "সারি {n} বিকল্প", + "col_options": "কলাম {n} বিকল্প", + "insert_row_above": "উপরে সারি যোগ", + "insert_row_below": "নিচে সারি যোগ", + "delete_row": "সারি মুছুন", + "insert_col_left": "বামে কলাম যোগ", + "insert_col_right": "ডানে কলাম যোগ", + "delete_col": "কলাম মুছুন", + "add_row_above": "উপরে সারি যোগ", + "add_row_below": "নিচে সারি যোগ", + "add_col_left": "বামে কলাম যোগ", + "add_col_right": "ডানে কলাম যোগ" + }, + "dialog": { + "unsaved_title": "অসংরক্ষিত পরিবর্তন", + "unsaved_exit_edit": "আপনার অসংরক্ষিত পরিবর্তন আছে। সম্পাদনা মোড থেকে বের হওয়ার আগে সংরক্ষণ করতে চান?", + "unsaved_new_file": "আপনার অসংরক্ষিত পরিবর্তন আছে। নতুন ফাইল তৈরি করার আগে সংরক্ষণ করতে চান?", + "unsaved_open_file": "আপনার অসংরক্ষিত পরিবর্তন আছে। নতুন ফাইল খোলার আগে সংরক্ষণ করতে চান?", + "save": "সংরক্ষণ", + "discard": "বাতিল করুন", + "dont_save": "সংরক্ষণ করবেন না", + "cancel": "বাতিল", + "unsaved_close": "আপনার অসংরক্ষিত পরিবর্তন আছে। বন্ধ করার আগে সংরক্ষণ করতে চান?" + }, + "lang_picker": { + "filter_placeholder": "ভাষা ফিল্টার...", + "filter_label": "ভাষা ফিল্টার", + "plain_text": "সাধারণ টেক্সট" + }, + "a11y": { + "skip_to_content": "বিষয়বস্তুতে যান", + "main_toolbar": "প্রধান টুলবার", + "sidebar": "সাইডবার", + "search_text": "টেক্সট অনুসন্ধান", + "previous_match": "পূর্ববর্তী মিল", + "next_match": "পরবর্তী মিল", + "close_search": "অনুসন্ধান বন্ধ", + "format_text": "টেক্সট ফরম্যাট", + "edit_link": "লিংক সম্পাদনা", + "insert_block": "ব্লক সন্নিবেশ", + "select_language": "ভাষা নির্বাচন", + "search_in_document": "নথিতে অনুসন্ধান" + }, + "drop_zone": { + "text": "আপনার মার্কডাউন ফাইল এখানে ড্রপ করুন" + }, + "help": { + "getting_started": "শুরু করুন", + "editing": "সম্পাদনা", + "shortcuts": "কীবোর্ড শর্টকাট", + "features": "বৈশিষ্ট্য", + "fallback_notice": "এই পৃষ্ঠাটি এখনও আপনার ভাষায় উপলব্ধ নয়। ইংরেজি সংস্করণ দেখানো হচ্ছে।" + }, + "recovery": { + "title": "অসংরক্ষিত পরিবর্তন পুনরুদ্ধার করবেন?", + "message": "Kern পূর্ববর্তী সেশন থেকে অসংরক্ষিত পরিবর্তন খুঁজে পেয়েছে। আপনি কি সেগুলো পুনরুদ্ধার করতে চান?", + "restore": "পুনরুদ্ধার", + "discard": "বাতিল" + }, + "export": { + "success": "PDF সফলভাবে রপ্তানি হয়েছে", + "open": "খুলুন" + }, + "context": { + "cut": "কাটুন", + "copy": "কপি করুন", + "paste": "পেস্ট করুন", + "paste_plain": "সাধারণ পাঠ্য হিসাবে পেস্ট করুন", + "select_all": "সবগুলি নির্বাচন করুন", + "copy_link": "লিঙ্ক কপি করুন", + "open_link": "লিঙ্ক খুলুন", + "copy_image_address": "ছবির ঠিকানা কপি করুন" + }, + "trial": { + "days_remaining": "ট্রায়ালে {days} দিন বাকি", + "expired_message": "আপনার ট্রায়াল মেয়াদ শেষ হয়েছে। সম্পাদনা চালিয়ে যেতে Kern কিনুন।", + "purchase_button": "Kern কিনুন", + "purchase_title": "Kern আনলক করুন", + "purchase_desc": "একবারের কেনাকাটায় সমস্ত সম্পাদনা এবং রপ্তানি বৈশিষ্ট্যে সম্পূর্ণ অ্যাক্সেস পান।", + "feature_edit": "WYSIWYG এবং বিভক্ত দৃশ্যে Markdown সম্পাদনা করুন", + "feature_save": "ফাইল সংরক্ষণ এবং নতুন ফাইল তৈরি করুন", + "feature_export": "PDF-এ রপ্তানি করুন", + "restore_purchases": "কেনাকাটা পুনরুদ্ধার করুন", + "one_time_purchase": "একবারের কেনাকাটা। কোনো সাবস্ক্রিপশন নেই।", + "purchasing": "কেনা হচ্ছে...", + "restoring": "পুনরুদ্ধার হচ্ছে..." + } +} diff --git a/src-mdviewer/src/locales/cs.json b/src-mdviewer/src/locales/cs.json new file mode 100644 index 0000000000..123a8afc0b --- /dev/null +++ b/src-mdviewer/src/locales/cs.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Zavřít vyhledávání", + "edit_link": "Upravit odkaz", + "format_text": "Formátovat text", + "insert_block": "Vložit blok", + "main_toolbar": "Hlavní panel nástrojů", + "next_match": "Další shoda", + "previous_match": "Předchozí shoda", + "search_in_document": "Hledat v dokumentu", + "search_text": "Hledat text", + "select_language": "Vybrat jazyk", + "sidebar": "Postranní panel", + "skip_to_content": "Přeskočit na obsah" + }, + "common": { + "close": "Zavřít", + "file": "Soubor", + "open": "Otevřít" + }, + "context": { + "copy": "Kopírovat", + "copy_image_address": "Kopírovat adresu obrázku", + "copy_link": "Kopírovat odkaz", + "cut": "Vyjmout", + "open_link": "Otevřít odkaz", + "paste": "Vložit", + "paste_plain": "Vložit jako prostý text", + "select_all": "Vybrat vše" + }, + "dialog": { + "cancel": "Zrušit", + "discard": "Zahodit", + "dont_save": "Neukládat", + "save": "Uložit", + "unsaved_close": "Máte neuložené změny. Chcete je před zavřením uložit?", + "unsaved_exit_edit": "Máte neuložené změny. Chcete je uložit před opuštěním režimu úprav?", + "unsaved_new_file": "Máte neuložené změny. Chcete je uložit před vytvořením nového souboru?", + "unsaved_open_file": "Máte neuložené změny. Chcete je uložit před otevřením nového souboru?", + "unsaved_title": "Neuložené změny" + }, + "drop_zone": { + "text": "Přetáhněte sem svůj Markdown soubor" + }, + "export": { + "open": "Otevřít", + "success": "PDF bylo úspěšně exportováno" + }, + "format": { + "block_type": "Typ bloku", + "blockquote": "Bloková citace", + "bold": "Tučné ({mod}+B)", + "bullet_list": "Odrážkový seznam", + "code": "Vložený kód ({mod}+E)", + "code_block": "Blok kódu", + "divider": "Oddělovač", + "heading1": "Nadpis 1", + "heading2": "Nadpis 2", + "heading3": "Nadpis 3", + "italic": "Kurzíva ({mod}+I)", + "link": "Odkaz ({mod}+K)", + "lists": "Seznamy", + "more_elements": "Další", + "numbered_list": "Číslovaný seznam", + "paragraph": "Odstavec", + "strikethrough": "Přeškrtnutí ({mod}+Shift+X)", + "table": "Tabulka", + "task_list": "Seznam úkolů", + "text_formatting": "Formátování textu", + "underline": "Podtržení" + }, + "help": { + "editing": "Úpravy", + "fallback_notice": "Tato stránka zatím není dostupná ve vašem jazyce. Zobrazuje se anglická verze.", + "features": "Funkce", + "getting_started": "Začínáme", + "shortcuts": "Klávesové zkratky" + }, + "lang_picker": { + "filter_label": "Filtrovat jazyky", + "filter_placeholder": "Filtrovat jazyky...", + "plain_text": "Prostý text" + }, + "link": { + "apply": "Použít odkaz", + "cancel": "Zrušit", + "display_text": "Zobrazený text", + "edit": "Upravit", + "edit_link": "Upravit odkaz", + "remove_link": "Odebrat odkaz", + "text": "Text", + "text_placeholder": "Zobrazovaný text (nepovinné)", + "url": "URL", + "url_placeholder": "Vložte nebo zadejte adresu URL..." + }, + "mermaid": { + "done": "Hotovo", + "edit": "Upravit", + "error_prefix": "Syntaktická chyba", + "stale": "Náhled je neaktuální" + }, + "recovery": { + "discard": "Zahodit", + "message": "Kern nalezl neuložené změny z předchozí relace. Chcete je obnovit?", + "restore": "Obnovit", + "title": "Obnovit neuložené změny?" + }, + "search": { + "count": "shod", + "no_results": "Žádné výsledky", + "placeholder": "Hledat v dokumentu..." + }, + "settings": { + "language": "Jazyk", + "theme": "Motiv", + "theme_dark": "Tmavý", + "theme_light": "Světlý", + "theme_system": "Systémový" + }, + "sidebar": { + "no_headings": "Nenalezeny žádné nadpisy", + "recent": "Poslední soubory", + "toc": "Obsah" + }, + "slash": { + "blockquote": "Bloková citace", + "blockquote_desc": "Blok citace", + "bullet_list": "Seznam s odrážkami", + "bullet_list_desc": "Nečíslovaný seznam", + "code_block": "Blok kódu", + "code_block_desc": "Ohraničený kód", + "divider": "Oddělovač", + "divider_desc": "Vodorovná čára", + "heading1": "Nadpis 1", + "heading1_desc": "Velký nadpis", + "heading2": "Nadpis 2", + "heading2_desc": "Střední nadpis", + "heading3": "Nadpis 3", + "heading3_desc": "Malý nadpis", + "mermaid": "Diagram Mermaid", + "mermaid_desc": "Vložit diagram", + "no_results": "Žádné výsledky", + "numbered_list": "Číslovaný seznam", + "numbered_list_desc": "Seřazený seznam", + "paragraph": "Odstavec", + "paragraph_desc": "Prostý text", + "table": "Tabulka", + "table_desc": "Tabulka 3×3", + "task_list": "Seznam úkolů", + "task_list_desc": "Kontrolní seznam" + }, + "table": { + "add_col_left": "Přidat sloupec vlevo", + "add_col_right": "Přidat sloupec vpravo", + "add_row_above": "Přidat řádek nad", + "add_row_below": "Přidat řádek pod", + "col_options": "Možnosti sloupce {n}", + "delete_col": "Odstranit sloupec", + "delete_row": "Odstranit řádek", + "header": "Záhlaví", + "insert_col_left": "Vložit sloupec vlevo", + "insert_col_right": "Vložit sloupec vpravo", + "insert_row_above": "Vložit řádek nad", + "insert_row_below": "Vložit řádek pod", + "new_row": "+ Nový řádek", + "row_options": "Možnosti řádku {n}" + }, + "toolbar": { + "done": "Hotovo", + "edit": "Upravit", + "export_pdf": "Exportovat do PDF", + "focus": "Režim soustředění", + "more": "Více", + "new_file": "Nový soubor", + "open": "Otevřít soubor", + "save": "Uložit", + "search": "Hledat", + "settings": "Nastavení", + "split_view": "Rozdělené zobrazení", + "theme": "Přepnout motiv", + "toc": "Obsah", + "zoom_in": "Přiblížit", + "zoom_out": "Oddálit", + "zoom_reset": "Resetovat přiblížení" + }, + "trial": { + "days_remaining": "Zbývá {days} dní zkušební verze", + "expired_message": "Vaše zkušební verze vypršela. Pro pokračování v úpravách si zakupte Kern.", + "feature_edit": "Upravujte Markdown s WYSIWYG a rozděleným zobrazením", + "feature_export": "Export do PDF", + "feature_save": "Ukládejte a vytvářejte nové soubory", + "one_time_purchase": "Jednorázový nákup. Žádné předplatné.", + "purchase_button": "Zakoupit Kern", + "purchase_desc": "Získejte plný přístup ke všem funkcím pro úpravy a export jednorázovým nákupem.", + "purchase_title": "Odemkněte Kern", + "purchasing": "Probíhá nákup...", + "restore_purchases": "Obnovit nákupy", + "restoring": "Probíhá obnova..." + }, + "viewer": { + "copied": "Zkopírováno!", + "copy": "Kopírovat" + }, + "welcome": { + "drop_hint": "nebo přetáhněte soubor .md", + "new_button": "Nový soubor", + "open_button": "Otevřít soubor", + "subtitle": "Krásný prohlížeč Markdownu", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/da.json b/src-mdviewer/src/locales/da.json new file mode 100644 index 0000000000..7f8f577786 --- /dev/null +++ b/src-mdviewer/src/locales/da.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Luk søgning", + "edit_link": "Rediger link", + "format_text": "Formater tekst", + "insert_block": "Indsæt blok", + "main_toolbar": "Hovedværktøjslinje", + "next_match": "Næste match", + "previous_match": "Forrige match", + "search_in_document": "Søg i dokumentet", + "search_text": "Søgetekst", + "select_language": "Vælg sprog", + "sidebar": "Sidepanel", + "skip_to_content": "Spring til indhold" + }, + "common": { + "close": "Luk", + "file": "Fil", + "open": "Åbn" + }, + "context": { + "copy": "Kopiér", + "copy_image_address": "Kopiér billedadresse", + "copy_link": "Kopiér link", + "cut": "Klip", + "open_link": "Åbn link", + "paste": "Sæt ind", + "paste_plain": "Sæt ind som ren tekst", + "select_all": "Markér alt" + }, + "dialog": { + "cancel": "Annuller", + "discard": "Kassér", + "dont_save": "Gem ikke", + "save": "Gem", + "unsaved_close": "Du har ikke-gemte ændringer. Vil du gemme, før du lukker?", + "unsaved_exit_edit": "Du har ikke-gemte ændringer. Vil du gemme, før du forlader redigeringstilstand?", + "unsaved_new_file": "Du har ikke-gemte ændringer. Vil du gemme, før du opretter en ny fil?", + "unsaved_open_file": "Du har ugemte ændringer. Vil du gemme, før du åbner en ny fil?", + "unsaved_title": "Ugemte ændringer" + }, + "drop_zone": { + "text": "Træk din Markdown-fil hertil" + }, + "export": { + "open": "Åbn", + "success": "PDF-filen blev eksporteret med succes" + }, + "format": { + "block_type": "Bloktype", + "blockquote": "Blokcitat", + "bold": "Fed ({mod}+B)", + "bullet_list": "Punktopstilling", + "code": "Indlejret kode ({mod}+E)", + "code_block": "Kodeblok", + "divider": "Skillelinje", + "heading1": "Overskrift 1", + "heading2": "Overskrift 2", + "heading3": "Overskrift 3", + "italic": "Kursiv ({mod}+I)", + "link": "Link ({mod}+K)", + "lists": "Lister", + "more_elements": "Mere", + "numbered_list": "Nummereret liste", + "paragraph": "Afsnit", + "strikethrough": "Gennemstreget ({mod}+Shift+X)", + "table": "Tabel", + "task_list": "Opgaveliste", + "text_formatting": "Tekstformatering", + "underline": "Understregning" + }, + "help": { + "editing": "Redigering", + "fallback_notice": "Denne side er endnu ikke tilgængelig på dit sprog. Viser den engelske version.", + "features": "Funktioner", + "getting_started": "Kom i gang", + "shortcuts": "Tastaturgenveje" + }, + "lang_picker": { + "filter_label": "Filtrer sprog", + "filter_placeholder": "Filtrer sprog...", + "plain_text": "Almindelig tekst" + }, + "link": { + "apply": "Anvend link", + "cancel": "Annuller", + "display_text": "Vist tekst", + "edit": "Rediger", + "edit_link": "Rediger link", + "remove_link": "Fjern link", + "text": "Tekst", + "text_placeholder": "Vist tekst (valgfri)", + "url": "URL", + "url_placeholder": "Indsæt eller skriv URL..." + }, + "mermaid": { + "done": "Færdig", + "edit": "Rediger", + "error_prefix": "Syntaksfejl", + "stale": "Forhåndsvisning forældet" + }, + "recovery": { + "discard": "Kassér", + "message": "Kern fandt ikke-gemte ændringer fra en tidligere session. Vil du gendanne dem?", + "restore": "Gendan", + "title": "Gendan ugemte ændringer?" + }, + "search": { + "count": "resultater", + "no_results": "Ingen resultater", + "placeholder": "Søg i dokument..." + }, + "settings": { + "language": "Sprog", + "theme": "Tema", + "theme_dark": "Mørk", + "theme_light": "Lys", + "theme_system": "System" + }, + "sidebar": { + "no_headings": "Ingen overskrifter fundet", + "recent": "Seneste filer", + "toc": "Indholdsfortegnelse" + }, + "slash": { + "blockquote": "Citatblok", + "blockquote_desc": "Citatblok", + "bullet_list": "Punktopstilling", + "bullet_list_desc": "Uordnet liste", + "code_block": "Kodeblok", + "code_block_desc": "Kodeblok", + "divider": "Skillelinje", + "divider_desc": "Vandret streg", + "heading1": "Overskrift 1", + "heading1_desc": "Stor overskrift", + "heading2": "Overskrift 2", + "heading2_desc": "Mellemstor overskrift", + "heading3": "Overskrift 3", + "heading3_desc": "Lille overskrift", + "mermaid": "Mermaid-diagram", + "mermaid_desc": "Indsæt et diagram", + "no_results": "Ingen resultater", + "numbered_list": "Nummereret liste", + "numbered_list_desc": "Ordnet liste", + "paragraph": "Afsnit", + "paragraph_desc": "Almindelig tekst", + "table": "Tabel", + "table_desc": "3×3 tabel", + "task_list": "Opgaveliste", + "task_list_desc": "Tjekliste" + }, + "table": { + "add_col_left": "Tilføj kolonne til venstre", + "add_col_right": "Tilføj kolonne til højre", + "add_row_above": "Tilføj række ovenfor", + "add_row_below": "Tilføj række nedenfor", + "col_options": "Kolonne {n} indstillinger", + "delete_col": "Slet kolonne", + "delete_row": "Slet række", + "header": "Overskrift", + "insert_col_left": "Indsæt kolonne til venstre", + "insert_col_right": "Indsæt kolonne til højre", + "insert_row_above": "Indsæt række ovenfor", + "insert_row_below": "Indsæt række nedenfor", + "new_row": "+ Ny række", + "row_options": "Indstillinger for række {n}" + }, + "toolbar": { + "done": "Færdig", + "edit": "Rediger", + "export_pdf": "Eksporter PDF", + "focus": "Fokustilstand", + "more": "Mere", + "new_file": "Ny fil", + "open": "Åbn fil", + "save": "Gem", + "search": "Søg", + "settings": "Indstillinger", + "split_view": "Opdelt visning", + "theme": "Skift tema", + "toc": "Indholdsfortegnelse", + "zoom_in": "Zoom ind", + "zoom_out": "Zoom ud", + "zoom_reset": "Nulstil zoom" + }, + "trial": { + "days_remaining": "{days} dage tilbage af prøveperioden", + "expired_message": "Din prøveperiode er udløbet. Køb Kern for at fortsætte med at redigere.", + "feature_edit": "Rediger Markdown med WYSIWYG og delt visning", + "feature_export": "Eksporter til PDF", + "feature_save": "Gem og opret nye filer", + "one_time_purchase": "Engangskøb. Intet abonnement.", + "purchase_button": "Køb Kern", + "purchase_desc": "Få fuld adgang til alle redigerings- og eksportfunktioner med et engangskøb.", + "purchase_title": "Lås Kern op", + "purchasing": "Køber...", + "restore_purchases": "Gendan køb", + "restoring": "Gendanner..." + }, + "viewer": { + "copied": "Kopieret!", + "copy": "Kopiér" + }, + "welcome": { + "drop_hint": "eller træk og slip en .md-fil", + "new_button": "Ny fil", + "open_button": "Åbn fil", + "subtitle": "En smuk Markdown-fremviser", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/de.json b/src-mdviewer/src/locales/de.json new file mode 100644 index 0000000000..cf06a1e86e --- /dev/null +++ b/src-mdviewer/src/locales/de.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Suche schließen", + "edit_link": "Link bearbeiten", + "format_text": "Text formatieren", + "insert_block": "Block einfügen", + "main_toolbar": "Hauptsymbolleiste", + "next_match": "Nächster Treffer", + "previous_match": "Vorheriger Treffer", + "search_in_document": "Im Dokument suchen", + "search_text": "Text suchen", + "select_language": "Sprache auswählen", + "sidebar": "Seitenleiste", + "skip_to_content": "Zum Inhalt springen" + }, + "common": { + "close": "Schließen", + "file": "Datei", + "open": "Öffnen" + }, + "context": { + "copy": "Kopieren", + "copy_image_address": "Bildadresse kopieren", + "copy_link": "Link kopieren", + "cut": "Ausschneiden", + "open_link": "Link öffnen", + "paste": "Einfügen", + "paste_plain": "Als reinen Text einfügen", + "select_all": "Alles auswählen" + }, + "dialog": { + "cancel": "Abbrechen", + "discard": "Verwerfen", + "dont_save": "Nicht speichern", + "save": "Speichern", + "unsaved_close": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Schließen speichern?", + "unsaved_exit_edit": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Verlassen des Bearbeitungsmodus speichern?", + "unsaved_new_file": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Erstellen einer neuen Datei speichern?", + "unsaved_open_file": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Öffnen einer neuen Datei speichern?", + "unsaved_title": "Ungespeicherte Änderungen" + }, + "drop_zone": { + "text": "Markdown-Datei hier ablegen" + }, + "export": { + "open": "Öffnen", + "success": "PDF erfolgreich exportiert" + }, + "format": { + "blockquote": "Zitat", + "bold": "Fett ({mod}+B)", + "bullet_list": "Aufzählungsliste", + "code": "Inline-Code ({mod}+E)", + "code_block": "Codeblock", + "divider": "Trennlinie", + "heading1": "Überschrift 1", + "heading2": "Überschrift 2", + "heading3": "Überschrift 3", + "italic": "Kursiv ({mod}+I)", + "link": "Link ({mod}+K)", + "numbered_list": "Nummerierte Liste", + "paragraph": "Absatz", + "strikethrough": "Durchgestrichen ({mod}+Umschalt+X)", + "table": "Tabelle", + "task_list": "Aufgabenliste", + "block_type": "Blocktyp", + "lists": "Listen", + "more_elements": "Mehr", + "text_formatting": "Textformatierung", + "underline": "Unterstrichen" + }, + "help": { + "editing": "Bearbeitung", + "fallback_notice": "Diese Seite ist noch nicht in Ihrer Sprache verfügbar. Die englische Version wird angezeigt.", + "features": "Funktionen", + "getting_started": "Erste Schritte", + "shortcuts": "Tastenkürzel" + }, + "lang_picker": { + "filter_label": "Sprachen filtern", + "filter_placeholder": "Sprachen filtern...", + "plain_text": "Klartext" + }, + "link": { + "apply": "Link anwenden", + "cancel": "Abbrechen", + "display_text": "Anzeigetext", + "edit": "Bearbeiten", + "edit_link": "Link bearbeiten", + "remove_link": "Link entfernen", + "text": "Text", + "text_placeholder": "Anzeigetext (optional)", + "url": "URL", + "url_placeholder": "URL einfügen oder eingeben..." + }, + "recovery": { + "discard": "Verwerfen", + "message": "Kern hat ungespeicherte Änderungen aus einer vorherigen Sitzung gefunden. Möchten Sie diese wiederherstellen?", + "restore": "Wiederherstellen", + "title": "Ungespeicherte Änderungen wiederherstellen?" + }, + "search": { + "count": "Treffer", + "no_results": "Keine Ergebnisse", + "placeholder": "Im Dokument suchen..." + }, + "settings": { + "language": "Sprache", + "theme": "Thema", + "theme_dark": "Dunkel", + "theme_light": "Hell", + "theme_system": "System" + }, + "sidebar": { + "no_headings": "Keine Überschriften gefunden", + "recent": "Letzte Dateien", + "toc": "Inhaltsverzeichnis" + }, + "slash": { + "blockquote": "Zitat", + "blockquote_desc": "Zitatblock", + "bullet_list": "Aufzählungsliste", + "bullet_list_desc": "Unsortierte Liste", + "code_block": "Codeblock", + "code_block_desc": "Codebereich", + "divider": "Trennlinie", + "divider_desc": "Horizontale Linie", + "heading1": "Überschrift 1", + "heading1_desc": "Große Überschrift", + "heading2": "Überschrift 2", + "heading2_desc": "Mittlere Überschrift", + "heading3": "Überschrift 3", + "heading3_desc": "Kleine Überschrift", + "no_results": "Keine Ergebnisse", + "numbered_list": "Nummerierte Liste", + "numbered_list_desc": "Sortierte Liste", + "paragraph": "Absatz", + "paragraph_desc": "Normaler Text", + "table": "Tabelle", + "table_desc": "3×3-Tabelle", + "task_list": "Aufgabenliste", + "task_list_desc": "Checkliste", + "mermaid": "Mermaid-Diagramm", + "mermaid_desc": "Ein Diagramm einfügen" + }, + "table": { + "add_col_left": "Spalte links hinzufügen", + "add_col_right": "Spalte rechts hinzufügen", + "add_row_above": "Zeile darüber hinzufügen", + "add_row_below": "Zeile darunter hinzufügen", + "col_options": "Optionen für Spalte {n}", + "delete_col": "Spalte löschen", + "delete_row": "Zeile löschen", + "header": "Kopfzeile", + "insert_col_left": "Spalte links einfügen", + "insert_col_right": "Spalte rechts einfügen", + "insert_row_above": "Zeile darüber einfügen", + "insert_row_below": "Zeile darunter einfügen", + "new_row": "+ Neue Zeile", + "row_options": "Optionen für Zeile {n}" + }, + "toolbar": { + "edit": "Bearbeiten", + "export_pdf": "Als PDF exportieren", + "focus": "Fokusmodus", + "more": "Mehr", + "new_file": "Neue Datei", + "open": "Datei öffnen", + "save": "Speichern", + "search": "Suchen", + "settings": "Einstellungen", + "split_view": "Geteilte Ansicht", + "theme": "Thema wechseln", + "toc": "Inhaltsverzeichnis", + "zoom_in": "Vergrößern", + "zoom_out": "Verkleinern", + "zoom_reset": "Zoom zurücksetzen", + "done": "Fertig" + }, + "trial": { + "days_remaining": "Noch {days} Tage in der Testversion", + "expired_message": "Ihre Testversion ist abgelaufen. Kaufen Sie Kern, um weiter zu bearbeiten.", + "feature_edit": "Markdown mit WYSIWYG und geteilter Ansicht bearbeiten", + "feature_export": "Als PDF exportieren", + "feature_save": "Dateien speichern und neu erstellen", + "one_time_purchase": "Einmaliger Kauf. Kein Abonnement.", + "purchase_button": "Kern kaufen", + "purchase_desc": "Erhalten Sie vollen Zugriff auf alle Bearbeitungs- und Exportfunktionen mit einem einmaligen Kauf.", + "purchase_title": "Kern freischalten", + "purchasing": "Kauf wird durchgeführt...", + "restore_purchases": "Käufe wiederherstellen", + "restoring": "Wiederherstellung..." + }, + "viewer": { + "copied": "Kopiert!", + "copy": "Kopieren" + }, + "welcome": { + "drop_hint": "oder eine .md-Datei hierher ziehen", + "new_button": "Neue Datei", + "open_button": "Datei öffnen", + "subtitle": "Ein schöner Markdown-Betrachter", + "title": "Kern" + }, + "mermaid": { + "done": "Fertig", + "edit": "Bearbeiten", + "error_prefix": "Syntaxfehler", + "stale": "Vorschau veraltet" + } +} diff --git a/src-mdviewer/src/locales/el.json b/src-mdviewer/src/locales/el.json new file mode 100644 index 0000000000..cc1ecf9c6b --- /dev/null +++ b/src-mdviewer/src/locales/el.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Κλείσιμο αναζήτησης", + "edit_link": "Επεξεργασία συνδέσμου", + "format_text": "Μορφοποίηση κειμένου", + "insert_block": "Εισαγωγή μπλοκ", + "main_toolbar": "Κύρια γραμμή εργαλείων", + "next_match": "Επόμενη αντιστοιχία", + "previous_match": "Προηγούμενη αντιστοιχία", + "search_in_document": "Αναζήτηση στο έγγραφο", + "search_text": "Αναζήτηση κειμένου", + "select_language": "Επιλογή γλώσσας", + "sidebar": "Πλευρική στήλη", + "skip_to_content": "Μετάβαση στο περιεχόμενο" + }, + "common": { + "close": "Κλείσιμο", + "file": "Αρχείο", + "open": "Άνοιγμα" + }, + "context": { + "copy": "Αντιγραφή", + "copy_image_address": "Αντιγραφή διεύθυνσης εικόνας", + "copy_link": "Αντιγραφή συνδέσμου", + "cut": "Αποκοπή", + "open_link": "Άνοιγμα συνδέσμου", + "paste": "Επικόλληση", + "paste_plain": "Επικόλληση ως απλό κείμενο", + "select_all": "Επιλογή όλων" + }, + "dialog": { + "cancel": "Ακύρωση", + "discard": "Απόρριψη", + "dont_save": "Μη αποθήκευση", + "save": "Αποθήκευση", + "unsaved_close": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν το κλείσιμο;", + "unsaved_exit_edit": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν την έξοδο από τη λειτουργία επεξεργασίας;", + "unsaved_new_file": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν τη δημιουργία νέου αρχείου;", + "unsaved_open_file": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν ανοίξετε ένα νέο αρχείο;", + "unsaved_title": "Μη αποθηκευμένες αλλαγές" + }, + "drop_zone": { + "text": "Αποθέστε το αρχείο Markdown εδώ" + }, + "export": { + "open": "Άνοιγμα", + "success": "Το PDF εξήχθη με επιτυχία" + }, + "format": { + "block_type": "Τύπος μπλοκ", + "blockquote": "Εσοχή παράθεσης", + "bold": "Έντονα ({mod}+B)", + "bullet_list": "Λίστα με κουκκίδες", + "code": "Ενσωματωμένος κώδικας ({mod}+E)", + "code_block": "Μπλοκ κώδικα", + "divider": "Διαχωριστικό", + "heading1": "Επικεφαλίδα 1", + "heading2": "Επικεφαλίδα 2", + "heading3": "Επικεφαλίδα 3", + "italic": "Πλάγια ({mod}+I)", + "link": "Σύνδεσμος ({mod}+K)", + "lists": "Λίστες", + "more_elements": "Περισσότερα", + "numbered_list": "Αριθμημένη λίστα", + "paragraph": "Παράγραφος", + "strikethrough": "Διαγράμμιση ({mod}+Shift+X)", + "table": "Πίνακας", + "task_list": "Λίστα εργασιών", + "text_formatting": "Μορφοποίηση κειμένου", + "underline": "Υπογράμμιση" + }, + "help": { + "editing": "Επεξεργασία", + "fallback_notice": "Αυτή η σελίδα δεν είναι ακόμη διαθέσιμη στη γλώσσα σας. Εμφανίζεται η αγγλική έκδοση.", + "features": "Δυνατότητες", + "getting_started": "Ξεκινώντας", + "shortcuts": "Συντομεύσεις πληκτρολογίου" + }, + "lang_picker": { + "filter_label": "Φιλτράρισμα γλωσσών", + "filter_placeholder": "Φιλτράρισμα γλωσσών...", + "plain_text": "Απλό κείμενο" + }, + "link": { + "apply": "Εφαρμογή συνδέσμου", + "cancel": "Ακύρωση", + "display_text": "Κείμενο εμφάνισης", + "edit": "Επεξεργασία", + "edit_link": "Επεξεργασία συνδέσμου", + "remove_link": "Αφαίρεση συνδέσμου", + "text": "Κείμενο", + "text_placeholder": "Εμφανιζόμενο κείμενο (προαιρετικό)", + "url": "URL", + "url_placeholder": "Επικολλήστε ή πληκτρολογήστε URL..." + }, + "mermaid": { + "done": "Τέλος", + "edit": "Επεξεργασία", + "error_prefix": "Συντακτικό σφάλμα", + "stale": "Μη ενημερωμένη προεπισκόπηση" + }, + "recovery": { + "discard": "Απόρριψη", + "message": "Το Kern εντόπισε μη αποθηκευμένες αλλαγές από μια προηγούμενη συνεδρία. Θέλετε να τις επαναφέρετε;", + "restore": "Επαναφορά", + "title": "Ανάκτηση μη αποθηκευμένων αλλαγών;" + }, + "search": { + "count": "αντιστοιχίες", + "no_results": "Κανένα αποτέλεσμα", + "placeholder": "Αναζήτηση στο έγγραφο..." + }, + "settings": { + "language": "Γλώσσα", + "theme": "Θέμα", + "theme_dark": "Σκούρο", + "theme_light": "Φωτεινό", + "theme_system": "Σύστημα" + }, + "sidebar": { + "no_headings": "Δεν βρέθηκαν επικεφαλίδες", + "recent": "Πρόσφατα αρχεία", + "toc": "Πίνακας περιεχομένων" + }, + "slash": { + "blockquote": "Μπλοκ παράθεσης", + "blockquote_desc": "Μπλοκ παραθέματος", + "bullet_list": "Λίστα με κουκκίδες", + "bullet_list_desc": "Μη ταξινομημένη λίστα", + "code_block": "Μπλοκ κώδικα", + "code_block_desc": "Περιφραγμένος κώδικας", + "divider": "Διαχωριστικό", + "divider_desc": "Οριζόντια γραμμή", + "heading1": "Επικεφαλίδα 1", + "heading1_desc": "Μεγάλη επικεφαλίδα", + "heading2": "Επικεφαλίδα 2", + "heading2_desc": "Μεσαία επικεφαλίδα", + "heading3": "Επικεφαλίδα 3", + "heading3_desc": "Μικρή επικεφαλίδα", + "mermaid": "Διάγραμμα Mermaid", + "mermaid_desc": "Εισαγωγή διαγράμματος", + "no_results": "Κανένα αποτέλεσμα", + "numbered_list": "Αριθμημένη λίστα", + "numbered_list_desc": "Ταξινομημένη λίστα", + "paragraph": "Παράγραφος", + "paragraph_desc": "Απλό κείμενο", + "table": "Πίνακας", + "table_desc": "Πίνακας 3×3", + "task_list": "Λίστα εργασιών", + "task_list_desc": "Λίστα ελέγχου" + }, + "table": { + "add_col_left": "Προσθήκη στήλης αριστερά", + "add_col_right": "Προσθήκη στήλης δεξιά", + "add_row_above": "Προσθήκη γραμμής επάνω", + "add_row_below": "Προσθήκη γραμμής κάτω", + "col_options": "Επιλογές στήλης {n}", + "delete_col": "Διαγραφή στήλης", + "delete_row": "Διαγραφή γραμμής", + "header": "Κεφαλίδα", + "insert_col_left": "Εισαγωγή στήλης αριστερά", + "insert_col_right": "Εισαγωγή στήλης δεξιά", + "insert_row_above": "Εισαγωγή γραμμής επάνω", + "insert_row_below": "Εισαγωγή γραμμής κάτω", + "new_row": "+ Νέα γραμμή", + "row_options": "Επιλογές γραμμής {n}" + }, + "toolbar": { + "done": "Τέλος", + "edit": "Επεξεργασία", + "export_pdf": "Εξαγωγή PDF", + "focus": "Λειτουργία Συγκέντρωσης", + "more": "Περισσότερα", + "new_file": "Νέο Αρχείο", + "open": "Άνοιγμα Αρχείου", + "save": "Αποθήκευση", + "search": "Αναζήτηση", + "settings": "Ρυθμίσεις", + "split_view": "Διαχωρισμός προβολής", + "theme": "Εναλλαγή θέματος", + "toc": "Πίνακας περιεχομένων", + "zoom_in": "Μεγέθυνση", + "zoom_out": "Σμίκρυνση", + "zoom_reset": "Επαναφορά εστίασης" + }, + "trial": { + "days_remaining": "Απομένουν {days} ημέρες στη δοκιμαστική περίοδο", + "expired_message": "Η δοκιμαστική σας περίοδος έχει λήξει. Αγοράστε το Kern για να συνεχίσετε την επεξεργασία.", + "feature_edit": "Επεξεργασία Markdown με WYSIWYG και διαχωρισμένη προβολή", + "feature_export": "Εξαγωγή σε PDF", + "feature_save": "Αποθήκευση και δημιουργία νέων αρχείων", + "one_time_purchase": "Εφάπαξ αγορά. Χωρίς συνδρομή.", + "purchase_button": "Αγορά Kern", + "purchase_desc": "Αποκτήστε πλήρη πρόσβαση σε όλες τις λειτουργίες επεξεργασίας και εξαγωγής με μια εφάπαξ αγορά.", + "purchase_title": "Ξεκλειδώστε το Kern", + "purchasing": "Γίνεται αγορά...", + "restore_purchases": "Επαναφορά Αγορών", + "restoring": "Γίνεται επαναφορά..." + }, + "viewer": { + "copied": "Αντιγράφηκε!", + "copy": "Αντιγραφή" + }, + "welcome": { + "drop_hint": "ή σύρετε & αποθέστε ένα αρχείο .md", + "new_button": "Νέο Αρχείο", + "open_button": "Άνοιγμα Αρχείου", + "subtitle": "Ένα όμορφο πρόγραμμα προβολής Markdown", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/en-gb.json b/src-mdviewer/src/locales/en-gb.json new file mode 100644 index 0000000000..910f3f7fe1 --- /dev/null +++ b/src-mdviewer/src/locales/en-gb.json @@ -0,0 +1,211 @@ +{ + "toolbar": { + "open": "Open File", + "theme": "Toggle Theme", + "toc": "Table of Contents", + "search": "Search", + "focus": "Focus Mode", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "zoom_reset": "Reset Zoom", + "save": "Save", + "edit": "Edit", + "new_file": "New File", + "split_view": "Split View", + "export_pdf": "Export PDF", + "settings": "Settings", + "more": "More", + "done": "Done" + }, + "sidebar": { + "toc": "Table of Contents", + "recent": "Recent Files", + "no_headings": "No headings found" + }, + "search": { + "placeholder": "Search in document...", + "count": "matches", + "no_results": "No results" + }, + "welcome": { + "title": "Kern", + "subtitle": "A beautiful Markdown viewer", + "new_button": "New File", + "open_button": "Open File", + "drop_hint": "or drag & drop a .md file" + }, + "viewer": { + "copy": "Copy", + "copied": "Copied!" + }, + "settings": { + "theme": "Theme", + "theme_light": "Light", + "theme_dark": "Dark", + "theme_system": "System", + "language": "Language" + }, + "common": { + "close": "Close", + "open": "Open", + "file": "File" + }, + "format": { + "paragraph": "Paragraph", + "heading1": "Heading 1", + "heading2": "Heading 2", + "heading3": "Heading 3", + "bold": "Bold ({mod}+B)", + "italic": "Italic ({mod}+I)", + "strikethrough": "Strikethrough ({mod}+Shift+X)", + "underline": "Underline ({mod}+U)", + "code": "Inline code ({mod}+E)", + "link": "Link ({mod}+K)", + "bullet_list": "Bullet list", + "numbered_list": "Numbered list", + "task_list": "Task list", + "blockquote": "Blockquote", + "divider": "Divider", + "table": "Table", + "code_block": "Code block", + "block_type": "Block type", + "text_formatting": "Text formatting", + "lists": "Lists", + "more_elements": "More" + }, + "slash": { + "paragraph": "Paragraph", + "paragraph_desc": "Plain text", + "heading1": "Heading 1", + "heading1_desc": "Large heading", + "heading2": "Heading 2", + "heading2_desc": "Medium heading", + "heading3": "Heading 3", + "heading3_desc": "Small heading", + "bullet_list": "Bullet list", + "bullet_list_desc": "Unordered list", + "numbered_list": "Numbered list", + "numbered_list_desc": "Ordered list", + "task_list": "Task list", + "task_list_desc": "Checklist", + "blockquote": "Blockquote", + "blockquote_desc": "Quote block", + "code_block": "Code block", + "code_block_desc": "Fenced code", + "table": "Table", + "table_desc": "3×3 table", + "divider": "Divider", + "divider_desc": "Horizontal rule", + "mermaid": "Mermaid diagram", + "mermaid_desc": "Insert a diagram", + "no_results": "No results" + }, + "mermaid": { + "edit": "Edit", + "done": "Done", + "error_prefix": "Syntax error", + "stale": "Preview outdated" + }, + "link": { + "edit": "Edit", + "edit_link": "Edit link", + "remove_link": "Remove link", + "text": "Text", + "text_placeholder": "Display text (optional)", + "display_text": "Display text", + "url": "URL", + "url_placeholder": "Paste or type URL...", + "apply": "Apply link", + "cancel": "Cancel" + }, + "table": { + "header": "Header", + "new_row": "+ New row", + "row_options": "Row {n} options", + "col_options": "Column {n} options", + "insert_row_above": "Insert row above", + "insert_row_below": "Insert row below", + "delete_row": "Delete row", + "insert_col_left": "Insert column left", + "insert_col_right": "Insert column right", + "delete_col": "Delete column", + "add_row_above": "Add row above", + "add_row_below": "Add row below", + "add_col_left": "Add column left", + "add_col_right": "Add column right" + }, + "dialog": { + "unsaved_title": "Unsaved Changes", + "unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "save": "Save", + "discard": "Discard", + "dont_save": "Don't Save", + "cancel": "Cancel", + "unsaved_close": "You have unsaved changes. Do you want to save before closing?" + }, + "lang_picker": { + "filter_placeholder": "Filter languages...", + "filter_label": "Filter languages", + "plain_text": "Plain text" + }, + "a11y": { + "skip_to_content": "Skip to content", + "main_toolbar": "Main toolbar", + "sidebar": "Sidebar", + "search_text": "Search text", + "previous_match": "Previous match", + "next_match": "Next match", + "close_search": "Close search", + "format_text": "Format text", + "edit_link": "Edit link", + "insert_block": "Insert block", + "select_language": "Select language", + "search_in_document": "Search in document" + }, + "drop_zone": { + "text": "Drop your Markdown file here" + }, + "help": { + "getting_started": "Getting Started", + "editing": "Editing", + "shortcuts": "Keyboard Shortcuts", + "features": "Features", + "fallback_notice": "This page is not yet available in your language. Showing the English version." + }, + "recovery": { + "title": "Recover unsaved changes?", + "message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "restore": "Restore", + "discard": "Discard" + }, + "export": { + "success": "PDF exported successfully", + "open": "Open" + }, + "context": { + "cut": "Cut", + "copy": "Copy", + "paste": "Paste", + "paste_plain": "Paste as Plain Text", + "select_all": "Select All", + "copy_link": "Copy Link", + "open_link": "Open Link", + "copy_image_address": "Copy Image Address" + }, + "trial": { + "days_remaining": "{days} days left in trial", + "expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "purchase_button": "Purchase Kern", + "purchase_title": "Unlock Kern", + "purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "feature_edit": "Edit Markdown with WYSIWYG and split view", + "feature_save": "Save and create new files", + "feature_export": "Export to PDF", + "restore_purchases": "Restore Purchases", + "one_time_purchase": "One-time purchase. No subscription.", + "purchasing": "Purchasing...", + "restoring": "Restoring..." + } +} diff --git a/src-mdviewer/src/locales/en.json b/src-mdviewer/src/locales/en.json new file mode 100644 index 0000000000..2bdd31600e --- /dev/null +++ b/src-mdviewer/src/locales/en.json @@ -0,0 +1,236 @@ +{ + "toolbar": { + "open": "Open File", + "theme": "Toggle Theme", + "toc": "Table of Contents", + "search": "Search", + "focus": "Focus Mode", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "zoom_reset": "Reset Zoom", + "save": "Save", + "edit": "Edit", + "new_file": "New File", + "split_view": "Split View", + "export_pdf": "Export PDF", + "settings": "Settings", + "more": "More", + "reader": "Reader", + "switch_to_reader": "Switch to reader mode", + "switch_to_edit": "Switch to edit mode", + "cursor_sync": "Toggle cursor sync", + "print": "Print", + "empty_line_hint": "Type / to insert" + }, + "sidebar": { + "toc": "Table of Contents", + "recent": "Recent Files", + "no_headings": "No headings found" + }, + "search": { + "placeholder": "Search in document...", + "count": "matches", + "no_results": "No results" + }, + "welcome": { + "title": "Kern", + "subtitle": "A beautiful Markdown viewer", + "new_button": "New File", + "open_button": "Open File", + "drop_hint": "or drag & drop a .md file" + }, + "viewer": { + "copy": "Copy", + "copied": "Copied!" + }, + "settings": { + "theme": "Theme", + "theme_light": "Light", + "theme_dark": "Dark", + "theme_system": "System", + "language": "Language" + }, + "common": { + "close": "Close", + "open": "Open", + "file": "File" + }, + "format": { + "paragraph": "Paragraph", + "heading1": "Heading 1", + "heading2": "Heading 2", + "heading3": "Heading 3", + "heading4": "Heading 4", + "heading5": "Heading 5", + "bold": "Bold ({mod}+B)", + "italic": "Italic ({mod}+I)", + "strikethrough": "Strikethrough ({mod}+Shift+X)", + "underline": "Underline ({mod}+U)", + "code": "Inline code ({mod}+E)", + "link": "Link ({mod}+K)", + "bullet_list": "Bullet list", + "numbered_list": "Numbered list", + "task_list": "Task list", + "blockquote": "Blockquote", + "divider": "Divider", + "table": "Table", + "code_block": "Code block", + "block_type": "Block type", + "text_formatting": "Text formatting", + "lists": "Lists", + "more_elements": "More", + "image": "Image", + "image_url": "Image URL", + "image_upload": "Upload from Computer" + }, + "slash": { + "paragraph": "Paragraph", + "paragraph_desc": "Plain text", + "heading1": "Heading 1", + "heading1_desc": "Large heading", + "heading2": "Heading 2", + "heading2_desc": "Medium heading", + "heading3": "Heading 3", + "heading3_desc": "Small heading", + "heading4": "Heading 4", + "heading4_desc": "Smaller heading", + "heading5": "Heading 5", + "heading5_desc": "Smallest heading", + "bullet_list": "Bullet list", + "bullet_list_desc": "Unordered list", + "numbered_list": "Numbered list", + "numbered_list_desc": "Ordered list", + "task_list": "Task list", + "task_list_desc": "Checklist", + "blockquote": "Blockquote", + "blockquote_desc": "Quote block", + "code_block": "Code block", + "code_block_desc": "Fenced code", + "table": "Table", + "table_desc": "3×3 table", + "divider": "Divider", + "divider_desc": "Horizontal rule", + "mermaid": "Mermaid diagram", + "mermaid_desc": "Insert a diagram", + "image_url": "Image URL", + "image_url_desc": "Embed from URL", + "image_upload": "Upload Image", + "image_upload_desc": "Upload from computer", + "no_results": "No results" + }, + "image_dialog": { + "title": "Insert Image URL", + "url_placeholder": "https://example.com/image.png", + "alt_placeholder": "Image description", + "insert": "Insert" + }, + "mermaid": { + "edit": "Edit", + "done": "Done", + "error_prefix": "Syntax error", + "stale": "Preview outdated" + }, + "link": { + "edit": "Edit", + "edit_link": "Edit link", + "remove_link": "Remove link", + "text": "Text", + "text_placeholder": "Display text (optional)", + "display_text": "Display text", + "url": "URL", + "url_placeholder": "Paste or type URL...", + "apply": "Apply link", + "cancel": "Cancel" + }, + "table": { + "header": "Header", + "new_row": "+ New row", + "row_options": "Row {n} options", + "col_options": "Column {n} options", + "insert_row_above": "Insert row above", + "insert_row_below": "Insert row below", + "delete_row": "Delete row", + "insert_col_left": "Insert column left", + "insert_col_right": "Insert column right", + "delete_col": "Delete column", + "add_row_above": "Add row above", + "add_row_below": "Add row below", + "add_col_left": "Add column left", + "add_col_right": "Add column right", + "delete_table": "Delete table" + }, + "dialog": { + "unsaved_title": "Unsaved Changes", + "unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "save": "Save", + "discard": "Discard", + "dont_save": "Don't Save", + "cancel": "Cancel", + "unsaved_close": "You have unsaved changes. Do you want to save before closing?" + }, + "lang_picker": { + "filter_placeholder": "Filter languages...", + "filter_label": "Filter languages", + "plain_text": "Plain text" + }, + "a11y": { + "skip_to_content": "Skip to content", + "main_toolbar": "Main toolbar", + "sidebar": "Sidebar", + "search_text": "Search text", + "previous_match": "Previous match", + "next_match": "Next match", + "close_search": "Close search", + "format_text": "Format text", + "edit_link": "Edit link", + "insert_block": "Insert block", + "select_language": "Select language", + "search_in_document": "Search in document" + }, + "drop_zone": { + "text": "Drop your Markdown file here" + }, + "help": { + "getting_started": "Getting Started", + "editing": "Editing", + "shortcuts": "Keyboard Shortcuts", + "features": "Features", + "fallback_notice": "This page is not yet available in your language. Showing the English version." + }, + "recovery": { + "title": "Recover unsaved changes?", + "message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "restore": "Restore", + "discard": "Discard" + }, + "export": { + "success": "PDF exported successfully", + "open": "Open" + }, + "context": { + "cut": "Cut", + "copy": "Copy", + "paste": "Paste", + "paste_plain": "Paste as Plain Text", + "select_all": "Select All", + "copy_link": "Copy Link", + "open_link": "Open Link", + "copy_image_address": "Copy Image Address" + }, + "trial": { + "days_remaining": "{days} days left in trial", + "expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "purchase_button": "Purchase Kern", + "purchase_title": "Unlock Kern", + "purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "feature_edit": "Edit Markdown with WYSIWYG and split view", + "feature_save": "Save and create new files", + "feature_export": "Export to PDF", + "restore_purchases": "Restore Purchases", + "one_time_purchase": "One-time purchase. No subscription.", + "purchasing": "Purchasing...", + "restoring": "Restoring..." + } +} diff --git a/src-mdviewer/src/locales/es.json b/src-mdviewer/src/locales/es.json new file mode 100644 index 0000000000..d2bee65c38 --- /dev/null +++ b/src-mdviewer/src/locales/es.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Cerrar búsqueda", + "edit_link": "Editar enlace", + "format_text": "Formato de texto", + "insert_block": "Insertar bloque", + "main_toolbar": "Barra de herramientas principal", + "next_match": "Coincidencia siguiente", + "previous_match": "Coincidencia anterior", + "search_in_document": "Buscar en el documento", + "search_text": "Buscar texto", + "select_language": "Seleccionar idioma", + "sidebar": "Barra lateral", + "skip_to_content": "Ir al contenido" + }, + "common": { + "close": "Cerrar", + "file": "Archivo", + "open": "Abrir" + }, + "context": { + "copy": "Copiar", + "copy_image_address": "Copiar dirección de imagen", + "copy_link": "Copiar enlace", + "cut": "Cortar", + "open_link": "Abrir enlace", + "paste": "Pegar", + "paste_plain": "Pegar como texto sin formato", + "select_all": "Seleccionar todo" + }, + "dialog": { + "cancel": "Cancelar", + "discard": "Descartar", + "dont_save": "No guardar", + "save": "Guardar", + "unsaved_close": "Tienes cambios sin guardar. ¿Deseas guardar antes de cerrar?", + "unsaved_exit_edit": "Tienes cambios sin guardar. ¿Deseas guardar antes de salir del modo edición?", + "unsaved_new_file": "Tienes cambios sin guardar. ¿Deseas guardar antes de crear un nuevo archivo?", + "unsaved_open_file": "Tienes cambios sin guardar. ¿Deseas guardar antes de abrir un nuevo archivo?", + "unsaved_title": "Cambios sin guardar" + }, + "drop_zone": { + "text": "Suelta tu archivo Markdown aquí" + }, + "export": { + "open": "Abrir", + "success": "PDF exportado con éxito" + }, + "format": { + "blockquote": "Cita", + "bold": "Negrita ({mod}+B)", + "bullet_list": "Lista con viñetas", + "code": "Código en línea ({mod}+E)", + "code_block": "Bloque de código", + "divider": "Separador", + "heading1": "Encabezado 1", + "heading2": "Encabezado 2", + "heading3": "Encabezado 3", + "italic": "Cursiva ({mod}+I)", + "link": "Enlace ({mod}+K)", + "numbered_list": "Lista numerada", + "paragraph": "Párrafo", + "strikethrough": "Tachado ({mod}+Shift+X)", + "table": "Tabla", + "task_list": "Lista de tareas", + "block_type": "Tipo de bloque", + "lists": "Listas", + "more_elements": "Más", + "text_formatting": "Formato de texto", + "underline": "Subrayado" + }, + "help": { + "editing": "Edición", + "fallback_notice": "Esta página aún no está disponible en tu idioma. Se muestra la versión en inglés.", + "features": "Funcionalidades", + "getting_started": "Primeros pasos", + "shortcuts": "Atajos de teclado" + }, + "lang_picker": { + "filter_label": "Filtrar idiomas", + "filter_placeholder": "Filtrar idiomas...", + "plain_text": "Texto plano" + }, + "link": { + "apply": "Aplicar enlace", + "cancel": "Cancelar", + "display_text": "Texto a mostrar", + "edit": "Editar", + "edit_link": "Editar enlace", + "remove_link": "Eliminar enlace", + "text": "Texto", + "text_placeholder": "Texto a mostrar (opcional)", + "url": "URL", + "url_placeholder": "Pega o escribe una URL..." + }, + "recovery": { + "discard": "Descartar", + "message": "Kern encontró cambios no guardados de una sesión anterior. ¿Deseas restaurarlos?", + "restore": "Restaurar", + "title": "¿Recuperar cambios no guardados?" + }, + "search": { + "count": "coincidencias", + "no_results": "Sin resultados", + "placeholder": "Buscar en el documento..." + }, + "settings": { + "language": "Idioma", + "theme": "Tema", + "theme_dark": "Oscuro", + "theme_light": "Claro", + "theme_system": "Sistema" + }, + "sidebar": { + "no_headings": "No se encontraron encabezados", + "recent": "Archivos recientes", + "toc": "Tabla de contenidos" + }, + "slash": { + "blockquote": "Cita", + "blockquote_desc": "Bloque de cita", + "bullet_list": "Lista con viñetas", + "bullet_list_desc": "Lista desordenada", + "code_block": "Bloque de código", + "code_block_desc": "Código delimitado", + "divider": "Separador", + "divider_desc": "Línea horizontal", + "heading1": "Encabezado 1", + "heading1_desc": "Encabezado grande", + "heading2": "Encabezado 2", + "heading2_desc": "Encabezado mediano", + "heading3": "Encabezado 3", + "heading3_desc": "Encabezado pequeño", + "no_results": "Sin resultados", + "numbered_list": "Lista numerada", + "numbered_list_desc": "Lista ordenada", + "paragraph": "Párrafo", + "paragraph_desc": "Texto normal", + "table": "Tabla", + "table_desc": "Tabla 3×3", + "task_list": "Lista de tareas", + "task_list_desc": "Lista de verificación", + "mermaid": "Diagrama de Mermaid", + "mermaid_desc": "Insertar un diagrama" + }, + "table": { + "add_col_left": "Añadir columna a la izquierda", + "add_col_right": "Añadir columna a la derecha", + "add_row_above": "Añadir fila arriba", + "add_row_below": "Añadir fila abajo", + "col_options": "Opciones de columna {n}", + "delete_col": "Eliminar columna", + "delete_row": "Eliminar fila", + "header": "Encabezado", + "insert_col_left": "Insertar columna a la izquierda", + "insert_col_right": "Insertar columna a la derecha", + "insert_row_above": "Insertar fila arriba", + "insert_row_below": "Insertar fila abajo", + "new_row": "+ Nueva fila", + "row_options": "Opciones de fila {n}" + }, + "toolbar": { + "edit": "Editar", + "export_pdf": "Exportar PDF", + "focus": "Modo enfoque", + "more": "Más", + "new_file": "Nuevo archivo", + "open": "Abrir archivo", + "save": "Guardar", + "search": "Buscar", + "settings": "Ajustes", + "split_view": "Vista dividida", + "theme": "Cambiar tema", + "toc": "Tabla de contenidos", + "zoom_in": "Acercar", + "zoom_out": "Alejar", + "zoom_reset": "Restablecer zoom", + "done": "Hecho" + }, + "trial": { + "days_remaining": "{days} días restantes de prueba", + "expired_message": "Tu período de prueba ha expirado. Compra Kern para seguir editando.", + "feature_edit": "Edita Markdown con WYSIWYG y vista dividida", + "feature_export": "Exportar a PDF", + "feature_save": "Guarda y crea archivos nuevos", + "one_time_purchase": "Compra única. Sin suscripción.", + "purchase_button": "Comprar Kern", + "purchase_desc": "Obtén acceso completo a todas las funciones de edición y exportación con una compra única.", + "purchase_title": "Desbloquear Kern", + "purchasing": "Comprando...", + "restore_purchases": "Restaurar compras", + "restoring": "Restaurando..." + }, + "viewer": { + "copied": "Copiado!", + "copy": "Copiar" + }, + "welcome": { + "drop_hint": "o arrastra y suelta un archivo .md", + "new_button": "Nuevo archivo", + "open_button": "Abrir archivo", + "subtitle": "Un hermoso visor de Markdown", + "title": "Kern" + }, + "mermaid": { + "done": "Hecho", + "edit": "Editar", + "error_prefix": "Error de sintaxis", + "stale": "Vista previa desactualizada" + } +} diff --git a/src-mdviewer/src/locales/fa-ir.json b/src-mdviewer/src/locales/fa-ir.json new file mode 100644 index 0000000000..efadb0c7d5 --- /dev/null +++ b/src-mdviewer/src/locales/fa-ir.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "بستن جستجو", + "edit_link": "ویرایش پیوند", + "format_text": "قالببندی متن", + "insert_block": "درج بلوک", + "main_toolbar": "نوار ابزار اصلی", + "next_match": "مورد بعدی", + "previous_match": "مورد قبلی", + "search_in_document": "جستجو در سند", + "search_text": "جستجوی متن", + "select_language": "انتخاب زبان", + "sidebar": "نوار کناری", + "skip_to_content": "پرش به محتوا" + }, + "common": { + "close": "بستن", + "file": "فایل", + "open": "باز کردن" + }, + "context": { + "copy": "کپی", + "copy_image_address": "کپی آدرس تصویر", + "copy_link": "کپی پیوند", + "cut": "برش", + "open_link": "باز کردن پیوند", + "paste": "چسباندن", + "paste_plain": "چسباندن به صورت متن ساده", + "select_all": "انتخاب همه" + }, + "dialog": { + "cancel": "انصراف", + "discard": "نادیده گرفتن", + "dont_save": "ذخیره نکردن", + "save": "ذخیره", + "unsaved_close": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از بستن، ذخیره کنید؟", + "unsaved_exit_edit": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از خروج از حالت ویرایش، ذخیره کنید؟", + "unsaved_new_file": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از ایجاد فایل جدید، ذخیره کنید؟", + "unsaved_open_file": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از باز کردن فایل جدید، آن را ذخیره کنید؟", + "unsaved_title": "تغییرات ذخیرهنشده" + }, + "drop_zone": { + "text": "فایل مارکداون خود را اینجا رها کنید" + }, + "export": { + "open": "باز کردن", + "success": "فایل PDF با موفقیت صادر شد" + }, + "format": { + "block_type": "نوع بلوک", + "blockquote": "نقلقول", + "bold": "ضخیم ({mod}+B)", + "bullet_list": "فهرست موردی", + "code": "کد درونخطی ({mod}+E)", + "code_block": "بلوک کد", + "divider": "جداکننده", + "heading1": "سرتیتر ۱", + "heading2": "سرتیتر ۲", + "heading3": "سرتیتر ۳", + "italic": "ایتالیک ({mod}+I)", + "link": "پیوند ({mod}+K)", + "lists": "فهرستها", + "more_elements": "بیشتر", + "numbered_list": "فهرست شمارهدار", + "paragraph": "پاراگراف", + "strikethrough": "خط خورده ({mod}+Shift+X)", + "table": "جدول", + "task_list": "فهرست کارها", + "text_formatting": "قالببندی متن", + "underline": "زیرخط" + }, + "help": { + "editing": "ویرایش", + "fallback_notice": "این صفحه هنوز به زبان شما در دسترس نیست. نسخهٔ انگلیسی نمایش داده میشود.", + "features": "ویژگیها", + "getting_started": "شروع به کار", + "shortcuts": "میانبرهای صفحهکلید" + }, + "lang_picker": { + "filter_label": "فیلتر زبانها", + "filter_placeholder": "فیلتر زبانها...", + "plain_text": "متن ساده" + }, + "link": { + "apply": "اعمال لینک", + "cancel": "انصراف", + "display_text": "متن نمایشی", + "edit": "ویرایش", + "edit_link": "ویرایش لینک", + "remove_link": "حذف لینک", + "text": "متن", + "text_placeholder": "متن نمایشی (اختیاری)", + "url": "URL", + "url_placeholder": "URL را جایگذاری یا تایپ کنید..." + }, + "mermaid": { + "done": "تایید", + "edit": "ویرایش", + "error_prefix": "خطای نحوی", + "stale": "پیشنمایش بهروز نیست" + }, + "recovery": { + "discard": "صرفنظر", + "message": "Kern تغییرات ذخیرهنشدهای از جلسهٔ قبل پیدا کرده است. آیا مایل به بازیابی آنها هستید؟", + "restore": "بازیابی", + "title": "تغییرات ذخیرهنشده بازیابی شوند؟" + }, + "search": { + "count": "مورد", + "no_results": "نتیجهای یافت نشد", + "placeholder": "جستجو در سند..." + }, + "settings": { + "language": "زبان", + "theme": "پوسته", + "theme_dark": "تیره", + "theme_light": "روشن", + "theme_system": "سیستم" + }, + "sidebar": { + "no_headings": "هیچ سرتیتری یافت نشد", + "recent": "فایلهای اخیر", + "toc": "فهرست مطالب" + }, + "slash": { + "blockquote": "نقل قول", + "blockquote_desc": "بلوک نقل قول", + "bullet_list": "لیست گلولهای", + "bullet_list_desc": "لیست نامرتب", + "code_block": "بلوک کد", + "code_block_desc": "کد محصور", + "divider": "جداکننده", + "divider_desc": "خط افقی", + "heading1": "سرتیتر ۱", + "heading1_desc": "سرتیتر بزرگ", + "heading2": "سرتیتر ۲", + "heading2_desc": "سرتیتر متوسط", + "heading3": "سرتیتر ۳", + "heading3_desc": "سرتیتر کوچک", + "mermaid": "نمودار Mermaid", + "mermaid_desc": "درج نمودار", + "no_results": "نتیجهای یافت نشد", + "numbered_list": "فهرست شمارهدار", + "numbered_list_desc": "فهرست مرتب", + "paragraph": "پاراگراف", + "paragraph_desc": "متن ساده", + "table": "جدول", + "table_desc": "جدول ۳×۳", + "task_list": "فهرست وظایف", + "task_list_desc": "چکلیست" + }, + "table": { + "add_col_left": "افزودن ستون به چپ", + "add_col_right": "افزودن ستون به راست", + "add_row_above": "افزودن ردیف در بالا", + "add_row_below": "افزودن ردیف در پایین", + "col_options": "گزینههای ستون {n}", + "delete_col": "حذف ستون", + "delete_row": "حذف ردیف", + "header": "سربرگ", + "insert_col_left": "درج ستون در سمت چپ", + "insert_col_right": "درج ستون در سمت راست", + "insert_row_above": "درج ردیف در بالا", + "insert_row_below": "درج ردیف در پایین", + "new_row": "+ سطر جدید", + "row_options": "گزینههای سطر {n}" + }, + "toolbar": { + "done": "انجام شد", + "edit": "ویرایش", + "export_pdf": "خروجی PDF", + "focus": "حالت تمرکز", + "more": "بیشتر", + "new_file": "فایل جدید", + "open": "باز کردن فایل", + "save": "ذخیره", + "search": "جستجو", + "settings": "تنظیمات", + "split_view": "نمای تقسیمشده", + "theme": "تغییر پوسته", + "toc": "فهرست مطالب", + "zoom_in": "بزرگنمایی", + "zoom_out": "کوچکنمایی", + "zoom_reset": "بازنشانی بزرگنمایی" + }, + "trial": { + "days_remaining": "{days} روز از دوره آزمایشی باقیمانده", + "expired_message": "دوره آزمایشی شما به پایان رسیده است. برای ادامه ویرایش، Kern را خریداری کنید.", + "feature_edit": "ویرایش مارکداون با WYSIWYG و نمای تقسیمشده", + "feature_export": "خروجی PDF", + "feature_save": "ذخیره و ایجاد فایلهای جدید", + "one_time_purchase": "خرید یکباره. بدون اشتراک.", + "purchase_button": "خرید Kern", + "purchase_desc": "با یکبار خرید، به تمام قابلیتهای ویرایش و خروجی دسترسی کامل پیدا کنید.", + "purchase_title": "باز کردن قفل Kern", + "purchasing": "در حال خرید...", + "restore_purchases": "بازیابی خریدها", + "restoring": "در حال بازیابی..." + }, + "viewer": { + "copied": "کپی شد!", + "copy": "کپی" + }, + "welcome": { + "drop_hint": "یا یک فایل .md را بکشید و رها کنید", + "new_button": "فایل جدید", + "open_button": "باز کردن فایل", + "subtitle": "یک نمایشگر زیبای مارکداون", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/fi.json b/src-mdviewer/src/locales/fi.json new file mode 100644 index 0000000000..e79f0cab62 --- /dev/null +++ b/src-mdviewer/src/locales/fi.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Sulje haku", + "edit_link": "Muokkaa linkkiä", + "format_text": "Muotoile tekstiä", + "insert_block": "Lisää lohko", + "main_toolbar": "Päätyökalupalkki", + "next_match": "Seuraava osuma", + "previous_match": "Edellinen osuma", + "search_in_document": "Hae asiakirjasta", + "search_text": "Hae tekstiä", + "select_language": "Valitse kieli", + "sidebar": "Sivupalkki", + "skip_to_content": "Siirry sisältöön" + }, + "common": { + "close": "Sulje", + "file": "Tiedosto", + "open": "Avaa" + }, + "context": { + "copy": "Kopioi", + "copy_image_address": "Kopioi kuvan osoite", + "copy_link": "Kopioi linkki", + "cut": "Leikkaa", + "open_link": "Avaa linkki", + "paste": "Liitä", + "paste_plain": "Liitä tavallisena tekstinä", + "select_all": "Valitse kaikki" + }, + "dialog": { + "cancel": "Peruuta", + "discard": "Hylkää", + "dont_save": "Älä tallenna", + "save": "Tallenna", + "unsaved_close": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen sulkemista?", + "unsaved_exit_edit": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen muokkaustilasta poistumista?", + "unsaved_new_file": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen uuden tiedoston luomista?", + "unsaved_open_file": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen uuden tiedoston avaamista?", + "unsaved_title": "Tallentamattomat muutokset" + }, + "drop_zone": { + "text": "Pudota Markdown-tiedostosi tähän" + }, + "export": { + "open": "Avaa", + "success": "PDF vietiin onnistuneesti" + }, + "format": { + "block_type": "Lohkotyyppi", + "blockquote": "Lainauslohko", + "bold": "Lihavointi ({mod}+B)", + "bullet_list": "Pisteluettelo", + "code": "Tekstinsisäinen koodi ({mod}+E)", + "code_block": "Koodilohko", + "divider": "Erotin", + "heading1": "Otsikko 1", + "heading2": "Otsikko 2", + "heading3": "Otsikko 3", + "italic": "Kursiivi ({mod}+I)", + "link": "Linkki ({mod}+K)", + "lists": "Listat", + "more_elements": "Lisää", + "numbered_list": "Numeroitu luettelo", + "paragraph": "Kappale", + "strikethrough": "Yliviivaus ({mod}+Shift+X)", + "table": "Taulukko", + "task_list": "Tehtäväluettelo", + "text_formatting": "Tekstin muotoilu", + "underline": "Alleviivaus" + }, + "help": { + "editing": "Muokkaus", + "fallback_notice": "Tämä sivu ei ole vielä saatavilla kielelläsi. Näytetään englanninkielinen versio.", + "features": "Ominaisuudet", + "getting_started": "Käytön aloitus", + "shortcuts": "Pikanäppäimet" + }, + "lang_picker": { + "filter_label": "Suodata kieliä", + "filter_placeholder": "Suodata kieliä...", + "plain_text": "Pelkkä teksti" + }, + "link": { + "apply": "Käytä linkkiä", + "cancel": "Peruuta", + "display_text": "Näytettävä teksti", + "edit": "Muokkaa", + "edit_link": "Muokkaa linkkiä", + "remove_link": "Poista linkki", + "text": "Teksti", + "text_placeholder": "Näytettävä teksti (valinnainen)", + "url": "URL", + "url_placeholder": "Liitä tai kirjoita URL..." + }, + "mermaid": { + "done": "Valmis", + "edit": "Muokkaa", + "error_prefix": "Syntaksivirhe", + "stale": "Esikatselu vanhentunut" + }, + "recovery": { + "discard": "Hylkää", + "message": "Kern löysi tallentamattomia muutoksia edellisestä istunnosta. Haluatko palauttaa ne?", + "restore": "Palauta", + "title": "Palautetaanko tallentamattomat muutokset?" + }, + "search": { + "count": "osumaa", + "no_results": "Ei tuloksia", + "placeholder": "Hae dokumentista..." + }, + "settings": { + "language": "Kieli", + "theme": "Teema", + "theme_dark": "Tumma", + "theme_light": "Vaalea", + "theme_system": "Järjestelmä" + }, + "sidebar": { + "no_headings": "Otsikoita ei löytynyt", + "recent": "Viimeisimmät tiedostot", + "toc": "Sisällysluettelo" + }, + "slash": { + "blockquote": "Lainaus", + "blockquote_desc": "Lainauslohko", + "bullet_list": "Luettelomerkit", + "bullet_list_desc": "Järjestämätön lista", + "code_block": "Koodilohko", + "code_block_desc": "Aidattu koodilohko", + "divider": "Erotin", + "divider_desc": "Vaakaviiva", + "heading1": "Otsikko 1", + "heading1_desc": "Suuri otsikko", + "heading2": "Otsikko 2", + "heading2_desc": "Keskikokoinen otsikko", + "heading3": "Otsikko 3", + "heading3_desc": "Pieni otsikko", + "mermaid": "Mermaid-kaavio", + "mermaid_desc": "Lisää kaavio", + "no_results": "Ei tuloksia", + "numbered_list": "Numeroitu luettelo", + "numbered_list_desc": "Järjestetty luettelo", + "paragraph": "Kappale", + "paragraph_desc": "Normaali teksti", + "table": "Taulukko", + "table_desc": "3×3-taulukko", + "task_list": "Tehtäväluettelo", + "task_list_desc": "Tarkistuslista" + }, + "table": { + "add_col_left": "Lisää sarake vasemmalle", + "add_col_right": "Lisää sarake oikealle", + "add_row_above": "Lisää rivi yläpuolelle", + "add_row_below": "Lisää rivi alapuolelle", + "col_options": "Sarakkeen {n} valinnat", + "delete_col": "Poista sarake", + "delete_row": "Poista rivi", + "header": "Otsikko", + "insert_col_left": "Lisää sarake vasemmalle", + "insert_col_right": "Lisää sarake oikealle", + "insert_row_above": "Lisää rivi yläpuolelle", + "insert_row_below": "Lisää rivi alapuolelle", + "new_row": "+ Uusi rivi", + "row_options": "Rivin {n} asetukset" + }, + "toolbar": { + "done": "Valmis", + "edit": "Muokkaa", + "export_pdf": "Vie PDF", + "focus": "Keskittymistila", + "more": "Lisää", + "new_file": "Uusi tiedosto", + "open": "Avaa tiedosto", + "save": "Tallenna", + "search": "Haku", + "settings": "Asetukset", + "split_view": "Jaettu näkymä", + "theme": "Vaihda teema", + "toc": "Sisällysluettelo", + "zoom_in": "Lähennä", + "zoom_out": "Loitonna", + "zoom_reset": "Nollaa zoomaus" + }, + "trial": { + "days_remaining": "{days} päivää kokeiluaikaa jäljellä", + "expired_message": "Kokeiluaikasi on päättynyt. Osta Kern jatkaaksesi muokkaamista.", + "feature_edit": "Muokkaa Markdownia WYSIWYG- ja jaetulla näkymällä", + "feature_export": "Vie PDF-muotoon", + "feature_save": "Tallenna ja luo uusia tiedostoja", + "one_time_purchase": "Kertamaksu. Ei tilausta.", + "purchase_button": "Osta Kern", + "purchase_desc": "Hanki täydet käyttöoikeudet kaikkiin muokkaus- ja vientiominaisuuksiin kertamaksulla.", + "purchase_title": "Avaa Kern", + "purchasing": "Ostetaan...", + "restore_purchases": "Palauta ostot", + "restoring": "Palautetaan..." + }, + "viewer": { + "copied": "Kopioitu!", + "copy": "Kopioi" + }, + "welcome": { + "drop_hint": "tai vedä ja pudota .md-tiedosto", + "new_button": "Uusi tiedosto", + "open_button": "Avaa tiedosto", + "subtitle": "Kaunis Markdown-katselin", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/fr.json b/src-mdviewer/src/locales/fr.json new file mode 100644 index 0000000000..674e9fa801 --- /dev/null +++ b/src-mdviewer/src/locales/fr.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Fermer la recherche", + "edit_link": "Modifier le lien", + "format_text": "Mettre en forme le texte", + "insert_block": "Insérer un bloc", + "main_toolbar": "Barre d'outils principale", + "next_match": "Correspondance suivante", + "previous_match": "Correspondance précédente", + "search_in_document": "Rechercher dans le document", + "search_text": "Rechercher du texte", + "select_language": "Sélectionner un langage", + "sidebar": "Barre latérale", + "skip_to_content": "Aller au contenu" + }, + "common": { + "close": "Fermer", + "file": "Fichier", + "open": "Ouvrir" + }, + "context": { + "copy": "Copier", + "copy_image_address": "Copier l'adresse de l'image", + "copy_link": "Copier le lien", + "cut": "Couper", + "open_link": "Ouvrir le lien", + "paste": "Coller", + "paste_plain": "Coller en texte brut", + "select_all": "Tout sélectionner" + }, + "dialog": { + "cancel": "Annuler", + "discard": "Abandonner", + "dont_save": "Ne pas enregistrer", + "save": "Enregistrer", + "unsaved_close": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de fermer ?", + "unsaved_exit_edit": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de quitter le mode édition ?", + "unsaved_new_file": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de créer un nouveau fichier ?", + "unsaved_open_file": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant d'ouvrir un nouveau fichier ?", + "unsaved_title": "Modifications non enregistrées" + }, + "drop_zone": { + "text": "Déposez votre fichier Markdown ici" + }, + "export": { + "open": "Ouvrir", + "success": "PDF exporté avec succès" + }, + "format": { + "blockquote": "Citation", + "bold": "Gras ({mod}+B)", + "bullet_list": "Liste à puces", + "code": "Code en ligne ({mod}+E)", + "code_block": "Bloc de code", + "divider": "Séparateur", + "heading1": "Titre 1", + "heading2": "Titre 2", + "heading3": "Titre 3", + "italic": "Italique ({mod}+I)", + "link": "Lien ({mod}+K)", + "numbered_list": "Liste numérotée", + "paragraph": "Paragraphe", + "strikethrough": "Barré ({mod}+Maj+X)", + "table": "Tableau", + "task_list": "Liste de tâches", + "block_type": "Type de bloc", + "lists": "Listes", + "more_elements": "Plus", + "text_formatting": "Mise en forme du texte", + "underline": "Souligné" + }, + "help": { + "editing": "Édition", + "fallback_notice": "Cette page n'est pas encore disponible dans votre langue. La version anglaise est affichée.", + "features": "Fonctionnalités", + "getting_started": "Premiers pas", + "shortcuts": "Raccourcis clavier" + }, + "lang_picker": { + "filter_label": "Filtrer les langages", + "filter_placeholder": "Filtrer les langages...", + "plain_text": "Texte brut" + }, + "link": { + "apply": "Appliquer le lien", + "cancel": "Annuler", + "display_text": "Texte à afficher", + "edit": "Modifier", + "edit_link": "Modifier le lien", + "remove_link": "Supprimer le lien", + "text": "Texte", + "text_placeholder": "Texte à afficher (facultatif)", + "url": "URL", + "url_placeholder": "Collez ou saisissez une URL..." + }, + "recovery": { + "discard": "Abandonner", + "message": "Kern a trouvé des modifications non enregistrées d'une session précédente. Voulez-vous les restaurer ?", + "restore": "Restaurer", + "title": "Récupérer les modifications non enregistrées ?" + }, + "search": { + "count": "correspondances", + "no_results": "Aucun résultat", + "placeholder": "Rechercher dans le document..." + }, + "settings": { + "language": "Langue", + "theme": "Thème", + "theme_dark": "Sombre", + "theme_light": "Clair", + "theme_system": "Système" + }, + "sidebar": { + "no_headings": "Aucun titre trouvé", + "recent": "Fichiers récents", + "toc": "Table des matières" + }, + "slash": { + "blockquote": "Citation", + "blockquote_desc": "Bloc de citation", + "bullet_list": "Liste à puces", + "bullet_list_desc": "Liste non ordonnée", + "code_block": "Bloc de code", + "code_block_desc": "Code délimité", + "divider": "Séparateur", + "divider_desc": "Ligne horizontale", + "heading1": "Titre 1", + "heading1_desc": "Grand titre", + "heading2": "Titre 2", + "heading2_desc": "Titre moyen", + "heading3": "Titre 3", + "heading3_desc": "Petit titre", + "no_results": "Aucun résultat", + "numbered_list": "Liste numérotée", + "numbered_list_desc": "Liste ordonnée", + "paragraph": "Paragraphe", + "paragraph_desc": "Texte brut", + "table": "Tableau", + "table_desc": "Tableau 3×3", + "task_list": "Liste de tâches", + "task_list_desc": "Liste à cocher", + "mermaid": "Diagramme Mermaid", + "mermaid_desc": "Insérer un diagramme" + }, + "table": { + "add_col_left": "Ajouter une colonne à gauche", + "add_col_right": "Ajouter une colonne à droite", + "add_row_above": "Ajouter une ligne au-dessus", + "add_row_below": "Ajouter une ligne en dessous", + "col_options": "Options de la colonne {n}", + "delete_col": "Supprimer la colonne", + "delete_row": "Supprimer la ligne", + "header": "En-tête", + "insert_col_left": "Insérer une colonne à gauche", + "insert_col_right": "Insérer une colonne à droite", + "insert_row_above": "Insérer une ligne au-dessus", + "insert_row_below": "Insérer une ligne en dessous", + "new_row": "+ Nouvelle ligne", + "row_options": "Options de la ligne {n}" + }, + "toolbar": { + "edit": "Modifier", + "export_pdf": "Exporter en PDF", + "focus": "Mode concentration", + "more": "Plus", + "new_file": "Nouveau fichier", + "open": "Ouvrir un fichier", + "save": "Enregistrer", + "search": "Rechercher", + "settings": "Paramètres", + "split_view": "Vue fractionnée", + "theme": "Changer le thème", + "toc": "Table des matières", + "zoom_in": "Zoom avant", + "zoom_out": "Zoom arrière", + "zoom_reset": "Réinitialiser le zoom", + "done": "Terminé" + }, + "trial": { + "days_remaining": "{days} jours restants d'essai", + "expired_message": "Votre période d'essai a expiré. Achetez Kern pour continuer à éditer.", + "feature_edit": "Éditez du Markdown avec WYSIWYG et vue fractionnée", + "feature_export": "Exporter en PDF", + "feature_save": "Enregistrez et créez de nouveaux fichiers", + "one_time_purchase": "Achat unique. Sans abonnement.", + "purchase_button": "Acheter Kern", + "purchase_desc": "Obtenez un accès complet à toutes les fonctionnalités d'édition et d'exportation avec un achat unique.", + "purchase_title": "Débloquer Kern", + "purchasing": "Achat en cours...", + "restore_purchases": "Restaurer les achats", + "restoring": "Restauration..." + }, + "viewer": { + "copied": "Copié !", + "copy": "Copier" + }, + "welcome": { + "drop_hint": "ou glissez-déposez un fichier .md", + "new_button": "Nouveau fichier", + "open_button": "Ouvrir un fichier", + "subtitle": "Un beau visualiseur Markdown", + "title": "Kern" + }, + "mermaid": { + "done": "Terminé", + "edit": "Modifier", + "error_prefix": "Erreur de syntaxe", + "stale": "Aperçu non à jour" + } +} diff --git a/src-mdviewer/src/locales/gl.json b/src-mdviewer/src/locales/gl.json new file mode 100644 index 0000000000..18ee937cfd --- /dev/null +++ b/src-mdviewer/src/locales/gl.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Pechar busca", + "edit_link": "Editar ligazón", + "format_text": "Formatar texto", + "insert_block": "Inserir bloque", + "main_toolbar": "Barra de ferramentas principal", + "next_match": "Seguinte coincidencia", + "previous_match": "Coincidencia anterior", + "search_in_document": "Buscar no documento", + "search_text": "Buscar texto", + "select_language": "Seleccionar idioma", + "sidebar": "Barra lateral", + "skip_to_content": "Saltar ao contido" + }, + "common": { + "close": "Pechar", + "file": "Ficheiro", + "open": "Abrir" + }, + "context": { + "copy": "Copiar", + "copy_image_address": "Copiar o enderezo da imaxe", + "copy_link": "Copiar a ligazón", + "cut": "Cortar", + "open_link": "Abrir a ligazón", + "paste": "Pegar", + "paste_plain": "Pegar como texto simple", + "select_all": "Seleccionar todo" + }, + "dialog": { + "cancel": "Cancelar", + "discard": "Descartar", + "dont_save": "Non gardar", + "save": "Gardar", + "unsaved_close": "Ten cambios sen gardar. Desexa gardar antes de pechar?", + "unsaved_exit_edit": "Ten cambios sen gardar. Desexa gardar antes de saír do modo de edición?", + "unsaved_new_file": "Ten cambios sen gardar. Desexa gardar antes de crear un novo ficheiro?", + "unsaved_open_file": "Ten cambios sen gardar. Quere gardar antes de abrir un novo ficheiro?", + "unsaved_title": "Cambios sen gardar" + }, + "drop_zone": { + "text": "Solte aquí o seu ficheiro Markdown" + }, + "export": { + "open": "Abrir", + "success": "PDF exportado con éxito" + }, + "format": { + "block_type": "Tipo de bloque", + "blockquote": "Cita en bloque", + "bold": "Negra ({mod}+B)", + "bullet_list": "Lista de viñetas", + "code": "Código en liña ({mod}+E)", + "code_block": "Bloque de código", + "divider": "Divisor", + "heading1": "Encabezado 1", + "heading2": "Encabezado 2", + "heading3": "Encabezado 3", + "italic": "Cursiva ({mod}+I)", + "link": "Ligazón ({mod}+K)", + "lists": "Listas", + "more_elements": "Máis", + "numbered_list": "Lista numerada", + "paragraph": "Parágrafo", + "strikethrough": "Riscado ({mod}+Maiús+X)", + "table": "Táboa", + "task_list": "Lista de tarefas", + "text_formatting": "Formato do texto", + "underline": "Subliñado" + }, + "help": { + "editing": "Edición", + "fallback_notice": "Esta páxina aínda non está dispoñible no seu idioma. Amosando a versión en inglés.", + "features": "Funcionalidades", + "getting_started": "Primeiros pasos", + "shortcuts": "Atallos de teclado" + }, + "lang_picker": { + "filter_label": "Filtrar linguas", + "filter_placeholder": "Filtrar linguas...", + "plain_text": "Texto plano" + }, + "link": { + "apply": "Aplicar", + "cancel": "Cancelar", + "display_text": "Texto a amosar", + "edit": "Editar", + "edit_link": "Editar ligazón", + "remove_link": "Eliminar ligazón", + "text": "Texto", + "text_placeholder": "Texto para mostrar (opcional)", + "url": "URL", + "url_placeholder": "Pegue ou escriba un URL..." + }, + "mermaid": { + "done": "Feito", + "edit": "Editar", + "error_prefix": "Erro de sintaxe", + "stale": "Previsualización desactualizada" + }, + "recovery": { + "discard": "Descartar", + "message": "Kern atopou cambios sen gardar dunha sesión anterior. Quere restauralos?", + "restore": "Restaurar", + "title": "Recuperar os cambios non gardados?" + }, + "search": { + "count": "coincidencias", + "no_results": "Sen resultados", + "placeholder": "Buscar no documento..." + }, + "settings": { + "language": "Idioma", + "theme": "Tema", + "theme_dark": "Escuro", + "theme_light": "Claro", + "theme_system": "Sistema" + }, + "sidebar": { + "no_headings": "Non se atoparon cabeceiras", + "recent": "Ficheiros recentes", + "toc": "Índice de contidos" + }, + "slash": { + "blockquote": "Cita en bloque", + "blockquote_desc": "Bloque de cita", + "bullet_list": "Lista de viñetas", + "bullet_list_desc": "Lista non ordenada", + "code_block": "Bloque de código", + "code_block_desc": "Código delimitado", + "divider": "Divisor", + "divider_desc": "Regra horizontal", + "heading1": "Título 1", + "heading1_desc": "Título grande", + "heading2": "Título 2", + "heading2_desc": "Título mediano", + "heading3": "Título 3", + "heading3_desc": "Título pequeno", + "mermaid": "Diagrama Mermaid", + "mermaid_desc": "Inserir un diagrama", + "no_results": "Sen resultados", + "numbered_list": "Lista numerada", + "numbered_list_desc": "Lista ordenada", + "paragraph": "Parágrafo", + "paragraph_desc": "Texto simple", + "table": "Táboa", + "table_desc": "Táboa de 3×3", + "task_list": "Lista de tarefas", + "task_list_desc": "Lista de verificación" + }, + "table": { + "add_col_left": "Engadir columna á esquerda", + "add_col_right": "Engadir columna á dereita", + "add_row_above": "Engadir fila enriba", + "add_row_below": "Engadir fila debaixo", + "col_options": "Opcións da columna {n}", + "delete_col": "Eliminar columna", + "delete_row": "Eliminar fila", + "header": "Cabeceira", + "insert_col_left": "Inserir columna á esquerda", + "insert_col_right": "Inserir columna á dereita", + "insert_row_above": "Inserir fila enriba", + "insert_row_below": "Inserir fila debaixo", + "new_row": "+ Nova fila", + "row_options": "Opcións da fila {n}" + }, + "toolbar": { + "done": "Feito", + "edit": "Editar", + "export_pdf": "Exportar a PDF", + "focus": "Modo de concentración", + "more": "Máis", + "new_file": "Novo ficheiro", + "open": "Abrir ficheiro", + "save": "Gardar", + "search": "Buscar", + "settings": "Configuración", + "split_view": "Vista dividida", + "theme": "Alternar tema", + "toc": "Índice de contidos", + "zoom_in": "Achegar", + "zoom_out": "Afastar", + "zoom_reset": "Restablecer o zoom" + }, + "trial": { + "days_remaining": "Quedan {days} días de proba", + "expired_message": "O seu período de proba caducou. Compre Kern para continuar editando.", + "feature_edit": "Editar Markdown con WYSIWYG e vista dividida", + "feature_export": "Exportar a PDF", + "feature_save": "Gardar e crear ficheiros novos", + "one_time_purchase": "Compra única. Sen subscrición.", + "purchase_button": "Comprar Kern", + "purchase_desc": "Obtén acceso completo a todas as funcións de edición e exportación cunha compra única.", + "purchase_title": "Desbloquear Kern", + "purchasing": "Comprando...", + "restore_purchases": "Restaurar compras", + "restoring": "Restaurando..." + }, + "viewer": { + "copied": "Copiado!", + "copy": "Copiar" + }, + "welcome": { + "drop_hint": "ou arrastra e solta un ficheiro .md", + "new_button": "Novo ficheiro", + "open_button": "Abrir ficheiro", + "subtitle": "Un fermoso visor de Markdown", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/gu.json b/src-mdviewer/src/locales/gu.json new file mode 100644 index 0000000000..1d2c3189d3 --- /dev/null +++ b/src-mdviewer/src/locales/gu.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "ફાઇલ ખોલો", + "theme": "થીમ બદલો", + "toc": "વિષયસૂચિ", + "search": "શોધો", + "focus": "ફોકસ મોડ", + "zoom_in": "ઝૂમ ઇન", + "zoom_out": "ઝૂમ આઉટ", + "zoom_reset": "ઝૂમ રીસેટ", + "save": "સેવ", + "edit": "સંપાદન", + "new_file": "નવી ફાઇલ", + "split_view": "વિભાજિત દૃશ્ય", + "export_pdf": "PDF નિકાસ કરો", + "settings": "સેટિંગ્સ", + "more": "વધુ" + }, + "sidebar": { + "toc": "વિષયસૂચિ", + "recent": "તાજેતરની ફાઇલો", + "no_headings": "કોઈ શીર્ષકો મળ્યા નથી" + }, + "search": { + "placeholder": "દસ્તાવેજમાં શોધો...", + "count": "મેળ", + "no_results": "કોઈ પરિણામો નથી" + }, + "welcome": { + "title": "Kern", + "subtitle": "એક સુંદર માર્કડાઉન વ્યૂઅર", + "new_button": "નવી ફાઇલ", + "open_button": "ફાઇલ ખોલો", + "drop_hint": "અથવા .md ફાઇલ ખેંચીને છોડો" + }, + "viewer": { + "copy": "કૉપિ", + "copied": "કૉપિ થયું!" + }, + "settings": { + "theme": "થીમ", + "theme_light": "લાઇટ", + "theme_dark": "ડાર્ક", + "theme_system": "સિસ્ટમ", + "language": "ભાષા" + }, + "common": { + "close": "બંધ", + "open": "ખોલો", + "file": "ફાઇલ" + }, + "format": { + "paragraph": "ફકરો", + "heading1": "શીર્ષક ૧", + "heading2": "શીર્ષક ૨", + "heading3": "શીર્ષક ૩", + "bold": "બોલ્ડ ({mod}+B)", + "italic": "ઇટાલિક ({mod}+I)", + "strikethrough": "સ્ટ્રાઇકથ્રૂ ({mod}+Shift+X)", + "code": "ઇનલાઇન કોડ ({mod}+E)", + "link": "લિંક ({mod}+K)", + "bullet_list": "બુલેટ યાદી", + "numbered_list": "ક્રમાંકિત યાદી", + "task_list": "કાર્ય યાદી", + "blockquote": "બ્લૉકકોટ", + "divider": "વિભાજક", + "table": "કોષ્ટક", + "code_block": "કોડ બ્લૉક" + }, + "slash": { + "paragraph": "ફકરો", + "paragraph_desc": "સાદો ટેક્સ્ટ", + "heading1": "શીર્ષક ૧", + "heading1_desc": "મોટું શીર્ષક", + "heading2": "શીર્ષક ૨", + "heading2_desc": "મધ્યમ શીર્ષક", + "heading3": "શીર્ષક ૩", + "heading3_desc": "નાનું શીર્ષક", + "bullet_list": "બુલેટ યાદી", + "bullet_list_desc": "અક્રમિત યાદી", + "numbered_list": "ક્રમાંકિત યાદી", + "numbered_list_desc": "ક્રમિત યાદી", + "task_list": "કાર્ય યાદી", + "task_list_desc": "ચેકલિસ્ટ", + "blockquote": "બ્લૉકકોટ", + "blockquote_desc": "ઉદ્ધરણ બ્લૉક", + "code_block": "કોડ બ્લૉક", + "code_block_desc": "ફેન્સ્ડ કોડ", + "table": "કોષ્ટક", + "table_desc": "૩×૩ કોષ્ટક", + "divider": "વિભાજક", + "divider_desc": "આડી રેખા", + "no_results": "કોઈ પરિણામો નથી" + }, + "link": { + "edit": "સંપાદન", + "edit_link": "લિંક સંપાદિત કરો", + "remove_link": "લિંક દૂર કરો", + "text": "ટેક્સ્ટ", + "text_placeholder": "પ્રદર્શન ટેક્સ્ટ (વૈકલ્પિક)", + "display_text": "પ્રદર્શન ટેક્સ્ટ", + "url": "URL", + "url_placeholder": "URL પેસ્ટ કરો અથવા ટાઇપ કરો...", + "apply": "લિંક લાગુ કરો", + "cancel": "રદ કરો" + }, + "table": { + "header": "હેડર", + "new_row": "+ નવી પંક્તિ", + "row_options": "પંક્તિ {n} વિકલ્પો", + "col_options": "સ્તંભ {n} વિકલ્પો", + "insert_row_above": "ઉપર પંક્તિ ઉમેરો", + "insert_row_below": "નીચે પંક્તિ ઉમેરો", + "delete_row": "પંક્તિ કાઢો", + "insert_col_left": "ડાબે સ્તંભ ઉમેરો", + "insert_col_right": "જમણે સ્તંભ ઉમેરો", + "delete_col": "સ્તંભ કાઢો", + "add_row_above": "ઉપર પંક્તિ ઉમેરો", + "add_row_below": "નીચે પંક્તિ ઉમેરો", + "add_col_left": "ડાબે સ્તંભ ઉમેરો", + "add_col_right": "જમણે સ્તંભ ઉમેરો" + }, + "dialog": { + "unsaved_title": "ન સેવ થયેલા ફેરફારો", + "unsaved_exit_edit": "ન સેવ થયેલા ફેરફારો છે. સંપાદન મોડ છોડતા પહેલા સેવ કરવા માંગો છો?", + "unsaved_new_file": "ન સેવ થયેલા ફેરફારો છે. નવી ફાઇલ બનાવતા પહેલા સેવ કરવા માંગો છો?", + "unsaved_open_file": "ન સેવ થયેલા ફેરફારો છે. નવી ફાઇલ ખોલતા પહેલા સેવ કરવા માંગો છો?", + "save": "સેવ", + "discard": "કાઢી નાખો", + "dont_save": "સાચવશો નહીં", + "cancel": "રદ કરો", + "unsaved_close": "તમારી પાસે સાચવ્યા વગરના ફેરફારો છે. બંધ કરતા પહેલાં સાચવવા માગો છો?" + }, + "lang_picker": { + "filter_placeholder": "ભાષાઓ ફિલ્ટર કરો...", + "filter_label": "ભાષાઓ ફિલ્ટર કરો", + "plain_text": "સાદું ટેક્સ્ટ" + }, + "a11y": { + "skip_to_content": "સામગ્રી પર જાઓ", + "main_toolbar": "મુખ્ય ટૂલબાર", + "sidebar": "સાઇડબાર", + "search_text": "ટેક્સ્ટ શોધો", + "previous_match": "પાછલો મેળ", + "next_match": "આગલો મેળ", + "close_search": "શોધ બંધ કરો", + "format_text": "ટેક્સ્ટ ફોર્મેટ", + "edit_link": "લિંક સંપાદિત કરો", + "insert_block": "બ્લૉક ઉમેરો", + "select_language": "ભાષા પસંદ કરો", + "search_in_document": "દસ્તાવેજમાં શોધો" + }, + "drop_zone": { + "text": "તમારી માર્કડાઉન ફાઇલ અહીં છોડો" + }, + "help": { + "getting_started": "શરૂઆત કરો", + "editing": "સંપાદન", + "shortcuts": "કીબોર્ડ શૉર્ટકટ", + "features": "વિશેષતાઓ", + "fallback_notice": "આ પૃષ્ઠ હજુ તમારી ભાષામાં ઉપલબ્ધ નથી. અંગ્રેજી સંસ્કરણ બતાવવામાં આવી રહ્યું છે." + }, + "recovery": { + "title": "સાચવ્યા વગરના ફેરફારો પુનઃપ્રાપ્ત કરવા?", + "message": "Kern ને અગાઉના સત્રમાંથી સાચવ્યા વગરના ફેરફારો મળ્યા. તેમને પુનઃસ્થાપિત કરવા માગો છો?", + "restore": "પુનઃસ્થાપિત કરો", + "discard": "કાઢી નાખો" + }, + "export": { + "success": "PDF સફળતાપૂર્વક નિકાસ થયું", + "open": "ખોલો" + }, + "context": { + "cut": "કાપો", + "copy": "કૉપિ કરો", + "paste": "પેસ્ટ કરો", + "paste_plain": "સાદા ટેક્સ્ટ તરીકે પેસ્ટ કરો", + "select_all": "બધું પસંદ કરો", + "copy_link": "લિંક કૉપિ કરો", + "open_link": "લિંક ખોલો", + "copy_image_address": "છબીનું સરનામું કૉપિ કરો" + }, + "trial": { + "days_remaining": "ટ્રાયલમાં {days} દિવસ બાકી", + "expired_message": "તમારી ટ્રાયલ સમાપ્ત થઈ ગઈ છે. સંપાદન ચાલુ રાખવા Kern ખરીદો.", + "purchase_button": "Kern ખરીદો", + "purchase_title": "Kern અનલૉક કરો", + "purchase_desc": "એક વખતની ખરીદી સાથે તમામ સંપાદન અને નિકાસ સુવિધાઓની સંપૂર્ણ ઍક્સેસ મેળવો.", + "feature_edit": "WYSIWYG અને વિભાજિત દૃશ્ય સાથે Markdown સંપાદિત કરો", + "feature_save": "ફાઇલો સેવ કરો અને નવી બનાવો", + "feature_export": "PDF માં નિકાસ કરો", + "restore_purchases": "ખરીદીઓ પુનઃસ્થાપિત કરો", + "one_time_purchase": "એક વખતની ખરીદી. કોઈ સબસ્ક્રિપ્શન નહીં.", + "purchasing": "ખરીદી ચાલુ છે...", + "restoring": "પુનઃસ્થાપિત થઈ રહ્યું છે..." + } +} diff --git a/src-mdviewer/src/locales/he.json b/src-mdviewer/src/locales/he.json new file mode 100644 index 0000000000..95929f7812 --- /dev/null +++ b/src-mdviewer/src/locales/he.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "פתח קובץ", + "theme": "החלף ערכת נושא", + "toc": "תוכן עניינים", + "search": "חיפוש", + "focus": "מצב מיקוד", + "zoom_in": "הגדל", + "zoom_out": "הקטן", + "zoom_reset": "אפס תקריב", + "save": "שמור", + "edit": "ערוך", + "new_file": "קובץ חדש", + "split_view": "תצוגה מפוצלת", + "export_pdf": "ייצוא PDF", + "settings": "הגדרות", + "more": "עוד" + }, + "sidebar": { + "toc": "תוכן עניינים", + "recent": "קבצים אחרונים", + "no_headings": "לא נמצאו כותרות" + }, + "search": { + "placeholder": "חיפוש במסמך...", + "count": "התאמות", + "no_results": "אין תוצאות" + }, + "welcome": { + "title": "Kern", + "subtitle": "מציג Markdown יפהפה", + "new_button": "קובץ חדש", + "open_button": "פתח קובץ", + "drop_hint": "או גרור ושחרר קובץ .md" + }, + "viewer": { + "copy": "העתק", + "copied": "הועתק!" + }, + "settings": { + "theme": "ערכת נושא", + "theme_light": "בהיר", + "theme_dark": "כהה", + "theme_system": "מערכת", + "language": "שפה" + }, + "common": { + "close": "סגור", + "open": "פתח", + "file": "קובץ" + }, + "format": { + "paragraph": "פסקה", + "heading1": "כותרת 1", + "heading2": "כותרת 2", + "heading3": "כותרת 3", + "bold": "מודגש ({mod}+B)", + "italic": "נטוי ({mod}+I)", + "strikethrough": "קו חוצה ({mod}+Shift+X)", + "code": "קוד מוטבע ({mod}+E)", + "link": "קישור ({mod}+K)", + "bullet_list": "רשימת תבליטים", + "numbered_list": "רשימה ממוספרת", + "task_list": "רשימת משימות", + "blockquote": "ציטוט", + "divider": "קו מפריד", + "table": "טבלה", + "code_block": "בלוק קוד" + }, + "slash": { + "paragraph": "פסקה", + "paragraph_desc": "טקסט רגיל", + "heading1": "כותרת 1", + "heading1_desc": "כותרת גדולה", + "heading2": "כותרת 2", + "heading2_desc": "כותרת בינונית", + "heading3": "כותרת 3", + "heading3_desc": "כותרת קטנה", + "bullet_list": "רשימת תבליטים", + "bullet_list_desc": "רשימה לא ממוינת", + "numbered_list": "רשימה ממוספרת", + "numbered_list_desc": "רשימה ממוינת", + "task_list": "רשימת משימות", + "task_list_desc": "רשימת סימון", + "blockquote": "ציטוט", + "blockquote_desc": "בלוק ציטוט", + "code_block": "בלוק קוד", + "code_block_desc": "קוד מגודר", + "table": "טבלה", + "table_desc": "טבלה 3×3", + "divider": "קו מפריד", + "divider_desc": "קו אופקי", + "no_results": "אין תוצאות" + }, + "link": { + "edit": "ערוך", + "edit_link": "ערוך קישור", + "remove_link": "הסר קישור", + "text": "טקסט", + "text_placeholder": "טקסט תצוגה (אופציונלי)", + "display_text": "טקסט תצוגה", + "url": "URL", + "url_placeholder": "הדבק או הקלד URL...", + "apply": "החל קישור", + "cancel": "ביטול" + }, + "table": { + "header": "כותרת", + "new_row": "+ שורה חדשה", + "row_options": "אפשרויות שורה {n}", + "col_options": "אפשרויות עמודה {n}", + "insert_row_above": "הוסף שורה מעל", + "insert_row_below": "הוסף שורה מתחת", + "delete_row": "מחק שורה", + "insert_col_left": "הוסף עמודה משמאל", + "insert_col_right": "הוסף עמודה מימין", + "delete_col": "מחק עמודה", + "add_row_above": "הוסף שורה מעל", + "add_row_below": "הוסף שורה מתחת", + "add_col_left": "הוסף עמודה משמאל", + "add_col_right": "הוסף עמודה מימין" + }, + "dialog": { + "unsaved_title": "שינויים שלא נשמרו", + "unsaved_exit_edit": "יש שינויים שלא נשמרו. האם ברצונך לשמור לפני יציאה ממצב עריכה?", + "unsaved_new_file": "יש שינויים שלא נשמרו. האם ברצונך לשמור לפני יצירת קובץ חדש?", + "unsaved_open_file": "יש שינויים שלא נשמרו. האם ברצונך לשמור לפני פתיחת קובץ חדש?", + "save": "שמור", + "discard": "מחק", + "dont_save": "לא לשמור", + "cancel": "ביטול", + "unsaved_close": "יש שינויים שלא נשמרו. האם ברצונך לשמור לפני הסגירה?" + }, + "lang_picker": { + "filter_placeholder": "סנן שפות...", + "filter_label": "סנן שפות", + "plain_text": "טקסט רגיל" + }, + "a11y": { + "skip_to_content": "דלג לתוכן", + "main_toolbar": "סרגל כלים ראשי", + "sidebar": "סרגל צד", + "search_text": "חפש טקסט", + "previous_match": "התאמה קודמת", + "next_match": "התאמה הבאה", + "close_search": "סגור חיפוש", + "format_text": "עיצוב טקסט", + "edit_link": "ערוך קישור", + "insert_block": "הוסף בלוק", + "select_language": "בחר שפה", + "search_in_document": "חפש במסמך" + }, + "drop_zone": { + "text": "שחרר את קובץ ה-Markdown שלך כאן" + }, + "help": { + "getting_started": "תחילת העבודה", + "editing": "עריכה", + "shortcuts": "קיצורי מקלדת", + "features": "תכונות", + "fallback_notice": "דף זה עדיין אינו זמין בשפה שלך. מוצגת הגרסה באנגלית." + }, + "recovery": { + "title": "לשחזר שינויים שלא נשמרו?", + "message": "Kern מצא שינויים שלא נשמרו מהפעלה קודמת. האם ברצונך לשחזר אותם?", + "restore": "שחזור", + "discard": "מחק" + }, + "export": { + "success": "ה-PDF יוצא בהצלחה", + "open": "פתח" + }, + "context": { + "cut": "גזור", + "copy": "העתק", + "paste": "הדבק", + "paste_plain": "הדבק כטקסט רגיל", + "select_all": "בחר הכל", + "copy_link": "העתק קישור", + "open_link": "פתח קישור", + "copy_image_address": "העתק כתובת תמונה" + }, + "trial": { + "days_remaining": "נותרו {days} ימים בתקופת הניסיון", + "expired_message": "תקופת הניסיון שלך הסתיימה. רכוש את Kern כדי להמשיך לערוך.", + "purchase_button": "רכוש את Kern", + "purchase_title": "פתח את Kern", + "purchase_desc": "קבל גישה מלאה לכל תכונות העריכה והייצוא ברכישה חד-פעמית.", + "feature_edit": "ערוך Markdown עם WYSIWYG ותצוגה מפוצלת", + "feature_save": "שמור וצור קבצים חדשים", + "feature_export": "ייצוא ל-PDF", + "restore_purchases": "שחזר רכישות", + "one_time_purchase": "רכישה חד-פעמית. ללא מנוי.", + "purchasing": "רוכש...", + "restoring": "משחזר..." + } +} diff --git a/src-mdviewer/src/locales/hi.json b/src-mdviewer/src/locales/hi.json new file mode 100644 index 0000000000..491ce825ff --- /dev/null +++ b/src-mdviewer/src/locales/hi.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "खोज बंद करें", + "edit_link": "लिंक संपादित करें", + "format_text": "टेक्स्ट फ़ॉर्मेट करें", + "insert_block": "ब्लॉक डालें", + "main_toolbar": "मुख्य टूलबार", + "next_match": "अगला परिणाम", + "previous_match": "पिछला परिणाम", + "search_in_document": "दस्तावेज़ में खोजें", + "search_text": "टेक्स्ट खोजें", + "select_language": "भाषा चुनें", + "sidebar": "साइडबार", + "skip_to_content": "सामग्री पर जाएँ" + }, + "common": { + "close": "बंद करें", + "file": "फ़ाइल", + "open": "खोलें" + }, + "context": { + "copy": "कॉपी करें", + "copy_image_address": "छवि पता कॉपी करें", + "copy_link": "लिंक कॉपी करें", + "cut": "काटें", + "open_link": "लिंक खोलें", + "paste": "चिपकाएँ", + "paste_plain": "सादे पाठ के रूप में चिपकाएँ", + "select_all": "सभी चुनें" + }, + "dialog": { + "cancel": "रद्द करें", + "discard": "छोड़ें", + "dont_save": "सहेजें नहीं", + "save": "सहेजें", + "unsaved_close": "आपके पास सहेजे नहीं गए परिवर्तन हैं। बंद करने से पहले सहेजना चाहते हैं?", + "unsaved_exit_edit": "आपके असहेजे परिवर्तन हैं। क्या आप संपादन मोड से बाहर निकलने से पहले सहेजना चाहते हैं?", + "unsaved_new_file": "आपके असहेजे परिवर्तन हैं। क्या आप नई फ़ाइल बनाने से पहले सहेजना चाहते हैं?", + "unsaved_open_file": "आपके असहेजे परिवर्तन हैं। क्या आप नई फ़ाइल खोलने से पहले सहेजना चाहते हैं?", + "unsaved_title": "असहेजे परिवर्तन" + }, + "drop_zone": { + "text": "अपनी मार्कडाउन फ़ाइल यहाँ छोड़ें" + }, + "export": { + "open": "खोलें", + "success": "PDF सफलतापूर्वक निर्यात किया गया" + }, + "format": { + "blockquote": "उद्धरण", + "bold": "बोल्ड ({mod}+B)", + "bullet_list": "बुलेट सूची", + "code": "इनलाइन कोड ({mod}+E)", + "code_block": "कोड ब्लॉक", + "divider": "विभाजक", + "heading1": "शीर्षक 1", + "heading2": "शीर्षक 2", + "heading3": "शीर्षक 3", + "italic": "इटैलिक ({mod}+I)", + "link": "लिंक ({mod}+K)", + "numbered_list": "क्रमांकित सूची", + "paragraph": "अनुच्छेद", + "strikethrough": "स्ट्राइकथ्रू ({mod}+Shift+X)", + "table": "तालिका", + "task_list": "कार्य सूची", + "block_type": "ब्लॉक प्रकार", + "lists": "सूचियाँ", + "more_elements": "अधिक", + "text_formatting": "टेक्स्ट फ़ॉर्मेटिंग", + "underline": "रेखांकित" + }, + "help": { + "editing": "संपादन", + "fallback_notice": "यह पृष्ठ अभी आपकी भाषा में उपलब्ध नहीं है। अंग्रेज़ी संस्करण दिखाया जा रहा है।", + "features": "विशेषताएँ", + "getting_started": "शुरू करें", + "shortcuts": "कीबोर्ड शॉर्टकट" + }, + "lang_picker": { + "filter_label": "भाषाएँ फ़िल्टर करें", + "filter_placeholder": "भाषाएँ फ़िल्टर करें...", + "plain_text": "सादा टेक्स्ट" + }, + "link": { + "apply": "लिंक लागू करें", + "cancel": "रद्द करें", + "display_text": "प्रदर्शन टेक्स्ट", + "edit": "संपादित करें", + "edit_link": "लिंक संपादित करें", + "remove_link": "लिंक हटाएँ", + "text": "टेक्स्ट", + "text_placeholder": "प्रदर्शन टेक्स्ट (वैकल्पिक)", + "url": "URL", + "url_placeholder": "URL चिपकाएँ या टाइप करें..." + }, + "recovery": { + "discard": "छोड़ें", + "message": "Kern को पिछले सत्र से सहेजे नहीं गए परिवर्तन मिले। क्या आप उन्हें पुनर्स्थापित करना चाहते हैं?", + "restore": "पुनर्स्थापित करें", + "title": "सहेजे नहीं गए परिवर्तन पुनर्प्राप्त करें?" + }, + "search": { + "count": "परिणाम", + "no_results": "कोई परिणाम नहीं", + "placeholder": "दस्तावेज़ में खोजें..." + }, + "settings": { + "language": "भाषा", + "theme": "थीम", + "theme_dark": "डार्क", + "theme_light": "लाइट", + "theme_system": "सिस्टम" + }, + "sidebar": { + "no_headings": "कोई शीर्षक नहीं मिला", + "recent": "हाल की फ़ाइलें", + "toc": "विषय सूची" + }, + "slash": { + "blockquote": "उद्धरण", + "blockquote_desc": "उद्धरण ब्लॉक", + "bullet_list": "बुलेट सूची", + "bullet_list_desc": "अक्रमित सूची", + "code_block": "कोड ब्लॉक", + "code_block_desc": "फ़ेंस्ड कोड", + "divider": "विभाजक", + "divider_desc": "क्षैतिज रेखा", + "heading1": "शीर्षक 1", + "heading1_desc": "बड़ा शीर्षक", + "heading2": "शीर्षक 2", + "heading2_desc": "मध्यम शीर्षक", + "heading3": "शीर्षक 3", + "heading3_desc": "छोटा शीर्षक", + "no_results": "कोई परिणाम नहीं", + "numbered_list": "क्रमांकित सूची", + "numbered_list_desc": "क्रमित सूची", + "paragraph": "अनुच्छेद", + "paragraph_desc": "सामान्य पाठ", + "table": "तालिका", + "table_desc": "3×3 तालिका", + "task_list": "कार्य सूची", + "task_list_desc": "चेकलिस्ट", + "mermaid": "Mermaid आरेख", + "mermaid_desc": "एक आरेख डालें" + }, + "table": { + "add_col_left": "बाईं ओर स्तंभ जोड़ें", + "add_col_right": "दाईं ओर स्तंभ जोड़ें", + "add_row_above": "ऊपर पंक्ति जोड़ें", + "add_row_below": "नीचे पंक्ति जोड़ें", + "col_options": "स्तंभ {n} विकल्प", + "delete_col": "स्तंभ हटाएँ", + "delete_row": "पंक्ति हटाएँ", + "header": "शीर्षलेख", + "insert_col_left": "बाईं ओर स्तंभ जोड़ें", + "insert_col_right": "दाईं ओर स्तंभ जोड़ें", + "insert_row_above": "ऊपर पंक्ति जोड़ें", + "insert_row_below": "नीचे पंक्ति जोड़ें", + "new_row": "+ नई पंक्ति", + "row_options": "पंक्ति {n} विकल्प" + }, + "toolbar": { + "edit": "संपादित करें", + "export_pdf": "PDF निर्यात करें", + "focus": "फ़ोकस मोड", + "more": "अधिक", + "new_file": "नई फ़ाइल", + "open": "फ़ाइल खोलें", + "save": "सहेजें", + "search": "खोजें", + "settings": "सेटिंग्स", + "split_view": "विभाजित दृश्य", + "theme": "थीम बदलें", + "toc": "विषय सूची", + "zoom_in": "ज़ूम इन", + "zoom_out": "ज़ूम आउट", + "zoom_reset": "ज़ूम रीसेट", + "done": "हो गया" + }, + "trial": { + "days_remaining": "ट्रायल में {days} दिन शेष", + "expired_message": "आपका ट्रायल समाप्त हो गया है। संपादन जारी रखने के लिए Kern खरीदें।", + "feature_edit": "WYSIWYG और विभाजित दृश्य के साथ Markdown संपादित करें", + "feature_export": "PDF में निर्यात करें", + "feature_save": "फ़ाइलें सहेजें और नई बनाएँ", + "one_time_purchase": "एक बार की खरीदारी। कोई सदस्यता नहीं।", + "purchase_button": "Kern खरीदें", + "purchase_desc": "एक बार की खरीदारी के साथ सभी संपादन और निर्यात सुविधाओं तक पूर्ण पहुँच प्राप्त करें।", + "purchase_title": "Kern अनलॉक करें", + "purchasing": "खरीदारी हो रही है...", + "restore_purchases": "खरीदारी पुनर्स्थापित करें", + "restoring": "पुनर्स्थापित हो रहा है..." + }, + "viewer": { + "copied": "कॉपी हो गया!", + "copy": "कॉपी करें" + }, + "welcome": { + "drop_hint": "या .md फ़ाइल खींचकर छोड़ें", + "new_button": "नई फ़ाइल", + "open_button": "फ़ाइल खोलें", + "subtitle": "एक सुंदर मार्कडाउन व्यूअर", + "title": "Kern" + }, + "mermaid": { + "done": "हो गया", + "edit": "संपादित करें", + "error_prefix": "सिंटैक्स त्रुटि", + "stale": "प्रीव्यू पुराना है" + } +} diff --git a/src-mdviewer/src/locales/hr.json b/src-mdviewer/src/locales/hr.json new file mode 100644 index 0000000000..41f700e4d0 --- /dev/null +++ b/src-mdviewer/src/locales/hr.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Zatvori pretraživanje", + "edit_link": "Uredi poveznicu", + "format_text": "Oblikuj tekst", + "insert_block": "Umetni blok", + "main_toolbar": "Glavna alatna traka", + "next_match": "Sljedeće podudaranje", + "previous_match": "Prethodno podudaranje", + "search_in_document": "Pretraži u dokumentu", + "search_text": "Pretraži tekst", + "select_language": "Odaberi jezik", + "sidebar": "Bočna traka", + "skip_to_content": "Preskoči na sadržaj" + }, + "common": { + "close": "Zatvori", + "file": "Datoteka", + "open": "Otvori" + }, + "context": { + "copy": "Kopiraj", + "copy_image_address": "Kopiraj adresu slike", + "copy_link": "Kopiraj poveznicu", + "cut": "Izreži", + "open_link": "Otvori poveznicu", + "paste": "Zalijepi", + "paste_plain": "Zalijepi kao običan tekst", + "select_all": "Odaberi sve" + }, + "dialog": { + "cancel": "Odustani", + "discard": "Odbaci", + "dont_save": "Ne spremaj", + "save": "Spremi", + "unsaved_close": "Imate nespremljene promjene. Želite li spremiti prije zatvaranja?", + "unsaved_exit_edit": "Imate nespremljene promjene. Želite li spremiti prije izlaska iz načina uređivanja?", + "unsaved_new_file": "Imate nespremljene promjene. Želite li spremiti prije stvaranja nove datoteke?", + "unsaved_open_file": "Imate nespremljene promjene. Želite li spremiti prije otvaranja nove datoteke?", + "unsaved_title": "Nespremljene promjene" + }, + "drop_zone": { + "text": "Ovdje ispustite svoju Markdown datoteku" + }, + "export": { + "open": "Otvori", + "success": "PDF je uspješno izvezen" + }, + "format": { + "block_type": "Vrsta bloka", + "blockquote": "Blok citat", + "bold": "Podebljano ({mod}+B)", + "bullet_list": "Popis s točkama", + "code": "Umetnuti kôd ({mod}+E)", + "code_block": "Blok koda", + "divider": "Razdjelnik", + "heading1": "Naslov 1", + "heading2": "Naslov 2", + "heading3": "Naslov 3", + "italic": "Kurziv ({mod}+I)", + "link": "Poveznica ({mod}+K)", + "lists": "Popisi", + "more_elements": "Više", + "numbered_list": "Numerirani popis", + "paragraph": "Odlomak", + "strikethrough": "Precrtano ({mod}+Shift+X)", + "table": "Tablica", + "task_list": "Popis zadataka", + "text_formatting": "Oblikovanje teksta", + "underline": "Podcrtano" + }, + "help": { + "editing": "Uređivanje", + "fallback_notice": "Ova stranica još nije dostupna na vašem jeziku. Prikazuje se engleska verzija.", + "features": "Značajke", + "getting_started": "Početak rada", + "shortcuts": "Tipkovnički prečaci" + }, + "lang_picker": { + "filter_label": "Filtriraj jezike", + "filter_placeholder": "Filtriraj jezike...", + "plain_text": "Običan tekst" + }, + "link": { + "apply": "Primijeni poveznicu", + "cancel": "Odustani", + "display_text": "Tekst za prikaz", + "edit": "Uredi", + "edit_link": "Uredi poveznicu", + "remove_link": "Ukloni poveznicu", + "text": "Tekst", + "text_placeholder": "Tekst za prikaz (neobavezno)", + "url": "URL", + "url_placeholder": "Zalijepite ili upišite URL..." + }, + "mermaid": { + "done": "Gotovo", + "edit": "Uredi", + "error_prefix": "Sintaktička pogreška", + "stale": "Pregled je zastario" + }, + "recovery": { + "discard": "Odbaci", + "message": "Kern je pronašao nespremljene promjene iz prethodne sesije. Želite li ih vratiti?", + "restore": "Obnovi", + "title": "Oporaviti nespremljene promjene?" + }, + "search": { + "count": "podudaranja", + "no_results": "Nema rezultata", + "placeholder": "Pretraži dokument..." + }, + "settings": { + "language": "Jezik", + "theme": "Tema", + "theme_dark": "Tamna", + "theme_light": "Svijetla", + "theme_system": "Sistemska" + }, + "sidebar": { + "no_headings": "Nema naslova", + "recent": "Nedavne datoteke", + "toc": "Sadržaj" + }, + "slash": { + "blockquote": "Blok citat", + "blockquote_desc": "Citatni blok", + "bullet_list": "Popis s grafičkim oznakama", + "bullet_list_desc": "Nerazvrstani popis", + "code_block": "Blok koda", + "code_block_desc": "Ograđeni kod", + "divider": "Razdjelnik", + "divider_desc": "Vodoravna crta", + "heading1": "Naslov 1", + "heading1_desc": "Veliki naslov", + "heading2": "Naslov 2", + "heading2_desc": "Srednji naslov", + "heading3": "Naslov 3", + "heading3_desc": "Mali naslov", + "mermaid": "Mermaid dijagram", + "mermaid_desc": "Umetni dijagram", + "no_results": "Nema rezultata", + "numbered_list": "Numerirani popis", + "numbered_list_desc": "Uređeni popis", + "paragraph": "Odlomak", + "paragraph_desc": "Običan tekst", + "table": "Tablica", + "table_desc": "Tablica 3×3", + "task_list": "Popis zadataka", + "task_list_desc": "Kontrolna lista" + }, + "table": { + "add_col_left": "Dodaj stupac lijevo", + "add_col_right": "Dodaj stupac desno", + "add_row_above": "Dodaj redak iznad", + "add_row_below": "Dodaj redak ispod", + "col_options": "Opcije stupca {n}", + "delete_col": "Izbriši stupac", + "delete_row": "Izbriši redak", + "header": "Zaglavlje", + "insert_col_left": "Umetni stupac lijevo", + "insert_col_right": "Umetni stupac desno", + "insert_row_above": "Umetni redak iznad", + "insert_row_below": "Umetni redak ispod", + "new_row": "+ Novi redak", + "row_options": "Opcije retka {n}" + }, + "toolbar": { + "done": "Gotovo", + "edit": "Uredi", + "export_pdf": "Izvezi PDF", + "focus": "Fokusirani način rada", + "more": "Više", + "new_file": "Nova datoteka", + "open": "Otvori datoteku", + "save": "Spremi", + "search": "Pretraži", + "settings": "Postavke", + "split_view": "Podijeljeni prikaz", + "theme": "Promijeni temu", + "toc": "Sadržaj", + "zoom_in": "Povećaj", + "zoom_out": "Smanji", + "zoom_reset": "Poništi zumiranje" + }, + "trial": { + "days_remaining": "Preostalo {days} dana u probnom razdoblju", + "expired_message": "Vaše probno razdoblje je isteklo. Kupite Kern kako biste nastavili s uređivanjem.", + "feature_edit": "Uređivanje Markdowna s WYSIWYG-om i podijeljenim prikazom", + "feature_export": "Izvoz u PDF", + "feature_save": "Spremanje i stvaranje novih datoteka", + "one_time_purchase": "Jednokratna kupnja. Bez pretplate.", + "purchase_button": "Kupite Kern", + "purchase_desc": "Ostvarite puni pristup svim značajkama za uređivanje i izvoz jednokratnom kupnjom.", + "purchase_title": "Otključajte Kern", + "purchasing": "Kupnja u tijeku...", + "restore_purchases": "Vratite kupnje", + "restoring": "Vraćanje u tijeku..." + }, + "viewer": { + "copied": "Kopirano!", + "copy": "Kopiraj" + }, + "welcome": { + "drop_hint": "ili povucite i ispustite .md datoteku", + "new_button": "Nova datoteka", + "open_button": "Otvori datoteku", + "subtitle": "Prekrasan Markdown preglednik", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/hu.json b/src-mdviewer/src/locales/hu.json new file mode 100644 index 0000000000..f663c504d5 --- /dev/null +++ b/src-mdviewer/src/locales/hu.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Keresés bezárása", + "edit_link": "Link szerkesztése", + "format_text": "Szöveg formázása", + "insert_block": "Blokk beillesztése", + "main_toolbar": "Fő eszköztár", + "next_match": "Következő találat", + "previous_match": "Előző találat", + "search_in_document": "Keresés a dokumentumban", + "search_text": "Szöveg keresése", + "select_language": "Nyelv kiválasztása", + "sidebar": "Oldalsáv", + "skip_to_content": "Ugrás a tartalomra" + }, + "common": { + "close": "Bezárás", + "file": "Fájl", + "open": "Megnyitás" + }, + "context": { + "copy": "Másolás", + "copy_image_address": "Kép címének másolása", + "copy_link": "Hivatkozás másolása", + "cut": "Kivágás", + "open_link": "Hivatkozás megnyitása", + "paste": "Beillesztés", + "paste_plain": "Beillesztés egyszerű szövegként", + "select_all": "Összes kijelölése" + }, + "dialog": { + "cancel": "Mégse", + "discard": "Elvetés", + "dont_save": "Ne mentse", + "save": "Mentés", + "unsaved_close": "Nem mentett módosításai vannak. Szeretné menteni a bezárás előtt?", + "unsaved_exit_edit": "Nem mentett módosításai vannak. Szeretné menteni a szerkesztőmódból való kilépés előtt?", + "unsaved_new_file": "Nem mentett módosításai vannak. Szeretné menteni egy új fájl létrehozása előtt?", + "unsaved_open_file": "Mentetlen változtatásai vannak. Szeretné menteni a módosításokat, mielőtt új fájlt nyitna meg?", + "unsaved_title": "Mentetlen változtatások" + }, + "drop_zone": { + "text": "Húzza ide a Markdown fájlt" + }, + "export": { + "open": "Megnyitás", + "success": "A PDF exportálása sikeres." + }, + "format": { + "block_type": "Blokk típusa", + "blockquote": "Idézetblokk", + "bold": "Félkövér ({mod}+B)", + "bullet_list": "Felsorolás", + "code": "Soron belüli kód ({mod}+E)", + "code_block": "Kódblokk", + "divider": "Elválasztó", + "heading1": "Címsor 1", + "heading2": "Címsor 2", + "heading3": "Címsor 3", + "italic": "Dőlt ({mod}+I)", + "link": "Hivatkozás ({mod}+K)", + "lists": "Listák", + "more_elements": "Továbbiak", + "numbered_list": "Számozott lista", + "paragraph": "Bekezdés", + "strikethrough": "Áthúzott ({mod}+Shift+X)", + "table": "Táblázat", + "task_list": "Feladatlista", + "text_formatting": "Szövegformázás", + "underline": "Aláhúzott" + }, + "help": { + "editing": "Szerkesztés", + "fallback_notice": "Ez az oldal még nem érhető el az Ön nyelvén. Az angol nyelvű változatot jelenítjük meg.", + "features": "Funkciók", + "getting_started": "Első lépések", + "shortcuts": "Billentyűparancsok" + }, + "lang_picker": { + "filter_label": "Nyelvek szűrése", + "filter_placeholder": "Nyelvek szűrése...", + "plain_text": "Egyszerű szöveg" + }, + "link": { + "apply": "Alkalmaz", + "cancel": "Mégse", + "display_text": "Megjelenítendő szöveg", + "edit": "Szerkesztés", + "edit_link": "Hivatkozás szerkesztése", + "remove_link": "Hivatkozás eltávolítása", + "text": "Szöveg", + "text_placeholder": "Megjelenítendő szöveg (opcionális)", + "url": "URL", + "url_placeholder": "URL beillesztése vagy beírása..." + }, + "mermaid": { + "done": "Kész", + "edit": "Szerkesztés", + "error_prefix": "Szintaktikai hiba", + "stale": "Az előnézet elavult" + }, + "recovery": { + "discard": "Elvetés", + "message": "A Kern nem mentett változtatásokat talált egy korábbi munkamenetből. Szeretné visszaállítani őket?", + "restore": "Visszaállítás", + "title": "Nem mentett változások helyreállítása?" + }, + "search": { + "count": "találat", + "no_results": "Nincs találat", + "placeholder": "Keresés a dokumentumban..." + }, + "settings": { + "language": "Nyelv", + "theme": "Téma", + "theme_dark": "Sötét", + "theme_light": "Világos", + "theme_system": "Rendszer" + }, + "sidebar": { + "no_headings": "Nincsenek címsorok", + "recent": "Legutóbbi fájlok", + "toc": "Tartalomjegyzék" + }, + "slash": { + "blockquote": "Idézetblokk", + "blockquote_desc": "Idézetblokk", + "bullet_list": "Felsorolás", + "bullet_list_desc": "Rendezetlen lista", + "code_block": "Kódblokk", + "code_block_desc": "Elkerített kódblokk", + "divider": "Elválasztó", + "divider_desc": "Vízszintes elválasztó", + "heading1": "Címsor 1", + "heading1_desc": "Nagy címsor", + "heading2": "Címsor 2", + "heading2_desc": "Közepes címsor", + "heading3": "Címsor 3", + "heading3_desc": "Kis címsor", + "mermaid": "Mermaid diagram", + "mermaid_desc": "Diagram beillesztése", + "no_results": "Nincs találat", + "numbered_list": "Számozott lista", + "numbered_list_desc": "Rendezett lista", + "paragraph": "Bekezdés", + "paragraph_desc": "Egyszerű szöveg", + "table": "Táblázat", + "table_desc": "3×3-as táblázat", + "task_list": "Feladatlista", + "task_list_desc": "Ellenőrzőlista" + }, + "table": { + "add_col_left": "Oszlop beszúrása balra", + "add_col_right": "Oszlop beszúrása jobbra", + "add_row_above": "Sor hozzáadása fölé", + "add_row_below": "Sor hozzáadása alá", + "col_options": "{n}. oszlop beállításai", + "delete_col": "Oszlop törlése", + "delete_row": "Sor törlése", + "header": "Fejléc", + "insert_col_left": "Oszlop beszúrása balra", + "insert_col_right": "Oszlop beszúrása jobbra", + "insert_row_above": "Sor beszúrása fölé", + "insert_row_below": "Sor beszúrása alá", + "new_row": "+ Új sor", + "row_options": "{n}. sor beállításai" + }, + "toolbar": { + "done": "Kész", + "edit": "Szerkesztés", + "export_pdf": "Exportálás PDF-ként", + "focus": "Fókusz mód", + "more": "Továbbiak", + "new_file": "Új fájl", + "open": "Fájl megnyitása", + "save": "Mentés", + "search": "Keresés", + "settings": "Beállítások", + "split_view": "Osztott nézet", + "theme": "Téma váltása", + "toc": "Tartalomjegyzék", + "zoom_in": "Nagyítás", + "zoom_out": "Kicsinyítés", + "zoom_reset": "Nagyítás visszaállítása" + }, + "trial": { + "days_remaining": "{days} nap van hátra a próbaidőszakból", + "expired_message": "A próbaidőszak lejárt. A szerkesztés folytatásához vásárolja meg a Kern-t.", + "feature_edit": "Markdown szerkesztése WYSIWYG és osztott nézetben", + "feature_export": "Exportálás PDF-be", + "feature_save": "Mentés és új fájlok létrehozása", + "one_time_purchase": "Egyszeri vásárlás. Nincs előfizetés.", + "purchase_button": "A Kern megvásárlása", + "purchase_desc": "Szerezzen teljes hozzáférést az összes szerkesztési és exportálási funkcióhoz egy egyszeri vásárlással.", + "purchase_title": "A Kern feloldása", + "purchasing": "Vásárlás...", + "restore_purchases": "Vásárlások visszaállítása", + "restoring": "Visszaállítás..." + }, + "viewer": { + "copied": "Másolva!", + "copy": "Másolás" + }, + "welcome": { + "drop_hint": "vagy húzzon ide egy .md fájlt", + "new_button": "Új fájl", + "open_button": "Fájl megnyitása", + "subtitle": "Egy gyönyörű Markdown megjelenítő", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/id.json b/src-mdviewer/src/locales/id.json new file mode 100644 index 0000000000..b5c3baf575 --- /dev/null +++ b/src-mdviewer/src/locales/id.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Tutup pencarian", + "edit_link": "Edit tautan", + "format_text": "Format teks", + "insert_block": "Sisipkan blok", + "main_toolbar": "Bilah alat utama", + "next_match": "Kecocokan berikutnya", + "previous_match": "Kecocokan sebelumnya", + "search_in_document": "Cari di dokumen", + "search_text": "Cari teks", + "select_language": "Pilih bahasa", + "sidebar": "Bilah samping", + "skip_to_content": "Langsung ke konten" + }, + "common": { + "close": "Tutup", + "file": "File", + "open": "Buka" + }, + "context": { + "copy": "Salin", + "copy_image_address": "Salin alamat gambar", + "copy_link": "Salin tautan", + "cut": "Potong", + "open_link": "Buka tautan", + "paste": "Tempel", + "paste_plain": "Tempel sebagai teks biasa", + "select_all": "Pilih semua" + }, + "dialog": { + "cancel": "Batal", + "discard": "Buang", + "dont_save": "Jangan Simpan", + "save": "Simpan", + "unsaved_close": "Anda memiliki perubahan yang belum disimpan. Apakah ingin menyimpan sebelum menutup?", + "unsaved_exit_edit": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum keluar dari mode edit?", + "unsaved_new_file": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum membuat file baru?", + "unsaved_open_file": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum membuka file baru?", + "unsaved_title": "Perubahan Belum Disimpan" + }, + "drop_zone": { + "text": "Lepaskan file Markdown Anda di sini" + }, + "export": { + "open": "Buka", + "success": "PDF berhasil diekspor" + }, + "format": { + "blockquote": "Kutipan", + "bold": "Tebal ({mod}+B)", + "bullet_list": "Daftar poin", + "code": "Kode inline ({mod}+E)", + "code_block": "Blok kode", + "divider": "Pemisah", + "heading1": "Judul 1", + "heading2": "Judul 2", + "heading3": "Judul 3", + "italic": "Miring ({mod}+I)", + "link": "Tautan ({mod}+K)", + "numbered_list": "Daftar bernomor", + "paragraph": "Paragraf", + "strikethrough": "Coret ({mod}+Shift+X)", + "table": "Tabel", + "task_list": "Daftar tugas", + "block_type": "Tipe blok", + "lists": "Daftar", + "more_elements": "Lainnya", + "text_formatting": "Pemformatan teks", + "underline": "Garis bawah" + }, + "help": { + "editing": "Pengeditan", + "fallback_notice": "Halaman ini belum tersedia dalam bahasa Anda. Menampilkan versi bahasa Inggris.", + "features": "Fitur", + "getting_started": "Memulai", + "shortcuts": "Pintasan Keyboard" + }, + "lang_picker": { + "filter_label": "Filter bahasa", + "filter_placeholder": "Filter bahasa...", + "plain_text": "Teks biasa" + }, + "link": { + "apply": "Terapkan tautan", + "cancel": "Batal", + "display_text": "Teks tampilan", + "edit": "Edit", + "edit_link": "Edit tautan", + "remove_link": "Hapus tautan", + "text": "Teks", + "text_placeholder": "Teks tampilan (opsional)", + "url": "URL", + "url_placeholder": "Tempel atau ketik URL..." + }, + "recovery": { + "discard": "Buang", + "message": "Kern menemukan perubahan yang belum disimpan dari sesi sebelumnya. Apakah Anda ingin memulihkannya?", + "restore": "Pulihkan", + "title": "Pulihkan perubahan yang belum disimpan?" + }, + "search": { + "count": "kecocokan", + "no_results": "Tidak ada hasil", + "placeholder": "Cari di dokumen..." + }, + "settings": { + "language": "Bahasa", + "theme": "Tema", + "theme_dark": "Gelap", + "theme_light": "Terang", + "theme_system": "Sistem" + }, + "sidebar": { + "no_headings": "Tidak ada judul ditemukan", + "recent": "File Terbaru", + "toc": "Daftar Isi" + }, + "slash": { + "blockquote": "Kutipan", + "blockquote_desc": "Blok kutipan", + "bullet_list": "Daftar poin", + "bullet_list_desc": "Daftar tak berurut", + "code_block": "Blok kode", + "code_block_desc": "Kode berpagar", + "divider": "Pemisah", + "divider_desc": "Garis horizontal", + "heading1": "Judul 1", + "heading1_desc": "Judul besar", + "heading2": "Judul 2", + "heading2_desc": "Judul sedang", + "heading3": "Judul 3", + "heading3_desc": "Judul kecil", + "no_results": "Tidak ada hasil", + "numbered_list": "Daftar bernomor", + "numbered_list_desc": "Daftar berurut", + "paragraph": "Paragraf", + "paragraph_desc": "Teks biasa", + "table": "Tabel", + "table_desc": "Tabel 3×3", + "task_list": "Daftar tugas", + "task_list_desc": "Daftar centang", + "mermaid": "Diagram Mermaid", + "mermaid_desc": "Sisipkan diagram" + }, + "table": { + "add_col_left": "Tambah kolom di kiri", + "add_col_right": "Tambah kolom di kanan", + "add_row_above": "Tambah baris di atas", + "add_row_below": "Tambah baris di bawah", + "col_options": "Opsi kolom {n}", + "delete_col": "Hapus kolom", + "delete_row": "Hapus baris", + "header": "Header", + "insert_col_left": "Sisipkan kolom di kiri", + "insert_col_right": "Sisipkan kolom di kanan", + "insert_row_above": "Sisipkan baris di atas", + "insert_row_below": "Sisipkan baris di bawah", + "new_row": "+ Baris baru", + "row_options": "Opsi baris {n}" + }, + "toolbar": { + "edit": "Edit", + "export_pdf": "Ekspor PDF", + "focus": "Mode Fokus", + "more": "Lainnya", + "new_file": "File Baru", + "open": "Buka File", + "save": "Simpan", + "search": "Cari", + "settings": "Pengaturan", + "split_view": "Tampilan Terpisah", + "theme": "Ganti Tema", + "toc": "Daftar Isi", + "zoom_in": "Perbesar", + "zoom_out": "Perkecil", + "zoom_reset": "Atur Ulang Zoom", + "done": "Selesai" + }, + "trial": { + "days_remaining": "{days} hari tersisa dalam uji coba", + "expired_message": "Masa uji coba Anda telah berakhir. Beli Kern untuk melanjutkan pengeditan.", + "feature_edit": "Edit Markdown dengan WYSIWYG dan tampilan terpisah", + "feature_export": "Ekspor ke PDF", + "feature_save": "Simpan dan buat file baru", + "one_time_purchase": "Pembelian sekali bayar. Tanpa langganan.", + "purchase_button": "Beli Kern", + "purchase_desc": "Dapatkan akses penuh ke semua fitur pengeditan dan ekspor dengan pembelian sekali bayar.", + "purchase_title": "Buka Kern", + "purchasing": "Membeli...", + "restore_purchases": "Pulihkan Pembelian", + "restoring": "Memulihkan..." + }, + "viewer": { + "copied": "Tersalin!", + "copy": "Salin" + }, + "welcome": { + "drop_hint": "atau seret dan lepas file .md", + "new_button": "File Baru", + "open_button": "Buka File", + "subtitle": "Penampil Markdown yang indah", + "title": "Kern" + }, + "mermaid": { + "done": "Selesai", + "edit": "Edit", + "error_prefix": "Kesalahan sintaks", + "stale": "Pratinjau kedaluwarsa" + } +} diff --git a/src-mdviewer/src/locales/it.json b/src-mdviewer/src/locales/it.json new file mode 100644 index 0000000000..b4aaa8c219 --- /dev/null +++ b/src-mdviewer/src/locales/it.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Chiudi ricerca", + "edit_link": "Modifica link", + "format_text": "Formatta testo", + "insert_block": "Inserisci blocco", + "main_toolbar": "Barra degli strumenti principale", + "next_match": "Corrispondenza successiva", + "previous_match": "Corrispondenza precedente", + "search_in_document": "Cerca nel documento", + "search_text": "Cerca testo", + "select_language": "Seleziona lingua", + "sidebar": "Barra laterale", + "skip_to_content": "Salta al contenuto" + }, + "common": { + "close": "Chiudi", + "file": "File", + "open": "Apri" + }, + "context": { + "copy": "Copia", + "copy_image_address": "Copia indirizzo immagine", + "copy_link": "Copia link", + "cut": "Taglia", + "open_link": "Apri link", + "paste": "Incolla", + "paste_plain": "Incolla come testo semplice", + "select_all": "Seleziona tutto" + }, + "dialog": { + "cancel": "Annulla", + "discard": "Scarta", + "dont_save": "Non salvare", + "save": "Salva", + "unsaved_close": "Sono presenti modifiche non salvate. Vuoi salvare prima di chiudere?", + "unsaved_exit_edit": "Sono presenti modifiche non salvate. Vuoi salvare prima di uscire dalla modalità di modifica?", + "unsaved_new_file": "Sono presenti modifiche non salvate. Vuoi salvare prima di creare un nuovo file?", + "unsaved_open_file": "Sono presenti modifiche non salvate. Vuoi salvarle prima di aprire un nuovo file?", + "unsaved_title": "Modifiche non salvate" + }, + "drop_zone": { + "text": "Trascina qui il tuo file Markdown" + }, + "export": { + "open": "Apri", + "success": "PDF esportato con successo" + }, + "format": { + "block_type": "Tipo di blocco", + "blockquote": "Citazione", + "bold": "Grassetto ({mod}+B)", + "bullet_list": "Elenco puntato", + "code": "Codice in linea ({mod}+E)", + "code_block": "Blocco di codice", + "divider": "Divisore", + "heading1": "Intestazione 1", + "heading2": "Intestazione 2", + "heading3": "Intestazione 3", + "italic": "Corsivo ({mod}+I)", + "link": "Collegamento ({mod}+K)", + "lists": "Elenchi", + "more_elements": "Altro", + "numbered_list": "Elenco numerato", + "paragraph": "Paragrafo", + "strikethrough": "Barrato ({mod}+Shift+X)", + "table": "Tabella", + "task_list": "Elenco attività", + "text_formatting": "Formattazione testo", + "underline": "Sottolineato" + }, + "help": { + "editing": "Modifica", + "fallback_notice": "Questa pagina non è ancora disponibile nella tua lingua. Viene mostrata la versione in inglese.", + "features": "Funzionalità", + "getting_started": "Per iniziare", + "shortcuts": "Scorciatoie da tastiera" + }, + "lang_picker": { + "filter_label": "Filtra lingue", + "filter_placeholder": "Filtra lingue...", + "plain_text": "Testo semplice" + }, + "link": { + "apply": "Applica", + "cancel": "Annulla", + "display_text": "Testo da visualizzare", + "edit": "Modifica", + "edit_link": "Modifica link", + "remove_link": "Rimuovi link", + "text": "Testo", + "text_placeholder": "Testo da visualizzare (opzionale)", + "url": "URL", + "url_placeholder": "Incolla o digita un URL..." + }, + "mermaid": { + "done": "Fatto", + "edit": "Modifica", + "error_prefix": "Errore di sintassi", + "stale": "Anteprima non aggiornata" + }, + "recovery": { + "discard": "Ignora", + "message": "Kern ha trovato delle modifiche non salvate da una sessione precedente. Vuoi ripristinarle?", + "restore": "Ripristina", + "title": "Recuperare le modifiche non salvate?" + }, + "search": { + "count": "corrispondenze", + "no_results": "Nessun risultato", + "placeholder": "Cerca nel documento..." + }, + "settings": { + "language": "Lingua", + "theme": "Tema", + "theme_dark": "Scuro", + "theme_light": "Chiaro", + "theme_system": "Sistema" + }, + "sidebar": { + "no_headings": "Nessuna intestazione trovata", + "recent": "File recenti", + "toc": "Indice" + }, + "slash": { + "blockquote": "Citazione", + "blockquote_desc": "Blocco di citazione", + "bullet_list": "Elenco puntato", + "bullet_list_desc": "Elenco non ordinato", + "code_block": "Blocco di codice", + "code_block_desc": "Codice delimitato", + "divider": "Divisore", + "divider_desc": "Linea orizzontale", + "heading1": "Intestazione 1", + "heading1_desc": "Intestazione grande", + "heading2": "Intestazione 2", + "heading2_desc": "Intestazione media", + "heading3": "Intestazione 3", + "heading3_desc": "Intestazione piccola", + "mermaid": "Diagramma Mermaid", + "mermaid_desc": "Inserisci un diagramma", + "no_results": "Nessun risultato", + "numbered_list": "Elenco numerato", + "numbered_list_desc": "Elenco ordinato", + "paragraph": "Paragrafo", + "paragraph_desc": "Testo semplice", + "table": "Tabella", + "table_desc": "Tabella 3×3", + "task_list": "Elenco attività", + "task_list_desc": "Lista di controllo" + }, + "table": { + "add_col_left": "Aggiungi colonna a sinistra", + "add_col_right": "Aggiungi colonna a destra", + "add_row_above": "Aggiungi riga sopra", + "add_row_below": "Aggiungi riga sotto", + "col_options": "Opzioni colonna {n}", + "delete_col": "Elimina colonna", + "delete_row": "Elimina riga", + "header": "Intestazione", + "insert_col_left": "Inserisci colonna a sinistra", + "insert_col_right": "Inserisci colonna a destra", + "insert_row_above": "Inserisci riga sopra", + "insert_row_below": "Inserisci riga sotto", + "new_row": "+ Nuova riga", + "row_options": "Opzioni riga {n}" + }, + "toolbar": { + "done": "Fatto", + "edit": "Modifica", + "export_pdf": "Esporta PDF", + "focus": "Modalità focus", + "more": "Altro", + "new_file": "Nuovo file", + "open": "Apri file", + "save": "Salva", + "search": "Cerca", + "settings": "Impostazioni", + "split_view": "Vista divisa", + "theme": "Cambia tema", + "toc": "Indice", + "zoom_in": "Ingrandisci", + "zoom_out": "Riduci", + "zoom_reset": "Ripristina zoom" + }, + "trial": { + "days_remaining": "{days} giorni rimanenti di prova", + "expired_message": "Il tuo periodo di prova è scaduto. Acquista Kern per continuare a modificare.", + "feature_edit": "Modifica Markdown con WYSIWYG e visualizzazione divisa", + "feature_export": "Esporta in PDF", + "feature_save": "Salva e crea nuovi file", + "one_time_purchase": "Acquisto unico. Nessun abbonamento.", + "purchase_button": "Acquista Kern", + "purchase_desc": "Ottieni l'accesso completo a tutte le funzionalità di modifica ed esportazione con un acquisto unico.", + "purchase_title": "Sblocca Kern", + "purchasing": "Acquisto in corso...", + "restore_purchases": "Ripristina acquisti", + "restoring": "Ripristino in corso..." + }, + "viewer": { + "copied": "Copiato!", + "copy": "Copia" + }, + "welcome": { + "drop_hint": "o trascina e rilascia un file .md", + "new_button": "Nuovo file", + "open_button": "Apri file", + "subtitle": "Un bellissimo visualizzatore Markdown", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/ja.json b/src-mdviewer/src/locales/ja.json new file mode 100644 index 0000000000..b489674448 --- /dev/null +++ b/src-mdviewer/src/locales/ja.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "検索を閉じる", + "edit_link": "リンクを編集", + "format_text": "テキストの書式設定", + "insert_block": "ブロックを挿入", + "main_toolbar": "メインツールバー", + "next_match": "次の一致", + "previous_match": "前の一致", + "search_in_document": "ドキュメント内を検索", + "search_text": "テキスト検索", + "select_language": "言語を選択", + "sidebar": "サイドバー", + "skip_to_content": "コンテンツへスキップ" + }, + "common": { + "close": "閉じる", + "file": "ファイル", + "open": "開く" + }, + "context": { + "copy": "コピー", + "copy_image_address": "画像アドレスをコピー", + "copy_link": "リンクをコピー", + "cut": "切り取り", + "open_link": "リンクを開く", + "paste": "貼り付け", + "paste_plain": "プレーンテキストとして貼り付け", + "select_all": "すべて選択" + }, + "dialog": { + "cancel": "キャンセル", + "discard": "破棄", + "dont_save": "保存しない", + "save": "保存", + "unsaved_close": "未保存の変更があります。閉じる前に保存しますか?", + "unsaved_exit_edit": "未保存の変更があります。編集モードを終了する前に保存しますか?", + "unsaved_new_file": "未保存の変更があります。新規ファイルを作成する前に保存しますか?", + "unsaved_open_file": "未保存の変更があります。新しいファイルを開く前に保存しますか?", + "unsaved_title": "未保存の変更" + }, + "drop_zone": { + "text": "Markdownファイルをここにドロップ" + }, + "export": { + "open": "開く", + "success": "PDFのエクスポートが完了しました" + }, + "format": { + "blockquote": "引用", + "bold": "太字 ({mod}+B)", + "bullet_list": "箇条書き", + "code": "インラインコード ({mod}+E)", + "code_block": "コードブロック", + "divider": "区切り線", + "heading1": "見出し1", + "heading2": "見出し2", + "heading3": "見出し3", + "italic": "斜体 ({mod}+I)", + "link": "リンク ({mod}+K)", + "numbered_list": "番号付きリスト", + "paragraph": "段落", + "strikethrough": "取り消し線 ({mod}+Shift+X)", + "table": "テーブル", + "task_list": "タスクリスト", + "block_type": "ブロックタイプ", + "lists": "リスト", + "more_elements": "その他", + "text_formatting": "テキスト書式設定", + "underline": "下線" + }, + "help": { + "editing": "編集", + "fallback_notice": "このページはまだお使いの言語では利用できません。英語版を表示しています。", + "features": "機能", + "getting_started": "はじめに", + "shortcuts": "キーボードショートカット" + }, + "lang_picker": { + "filter_label": "言語を絞り込み", + "filter_placeholder": "言語を絞り込み...", + "plain_text": "プレーンテキスト" + }, + "link": { + "apply": "リンクを適用", + "cancel": "キャンセル", + "display_text": "表示テキスト", + "edit": "編集", + "edit_link": "リンクを編集", + "remove_link": "リンクを削除", + "text": "テキスト", + "text_placeholder": "表示テキスト(任意)", + "url": "URL", + "url_placeholder": "URLを貼り付けまたは入力..." + }, + "recovery": { + "discard": "破棄", + "message": "Kern は前回のセッションの未保存の変更を見つけました。復元しますか?", + "restore": "復元", + "title": "未保存の変更を復元しますか?" + }, + "search": { + "count": "件一致", + "no_results": "結果なし", + "placeholder": "ドキュメント内を検索..." + }, + "settings": { + "language": "言語", + "theme": "テーマ", + "theme_dark": "ダーク", + "theme_light": "ライト", + "theme_system": "システム" + }, + "sidebar": { + "no_headings": "見出しが見つかりません", + "recent": "最近のファイル", + "toc": "目次" + }, + "slash": { + "blockquote": "引用", + "blockquote_desc": "引用ブロック", + "bullet_list": "箇条書き", + "bullet_list_desc": "順序なしリスト", + "code_block": "コードブロック", + "code_block_desc": "フェンス付きコード", + "divider": "区切り線", + "divider_desc": "水平線", + "heading1": "見出し1", + "heading1_desc": "大見出し", + "heading2": "見出し2", + "heading2_desc": "中見出し", + "heading3": "見出し3", + "heading3_desc": "小見出し", + "no_results": "結果なし", + "numbered_list": "番号付きリスト", + "numbered_list_desc": "順序付きリスト", + "paragraph": "段落", + "paragraph_desc": "本文テキスト", + "table": "テーブル", + "table_desc": "3×3テーブル", + "task_list": "タスクリスト", + "task_list_desc": "チェックリスト", + "mermaid": "マーメイドダイアグラム", + "mermaid_desc": "ダイアグラムを挿入" + }, + "table": { + "add_col_left": "左に列を追加", + "add_col_right": "右に列を追加", + "add_row_above": "上に行を追加", + "add_row_below": "下に行を追加", + "col_options": "列 {n} のオプション", + "delete_col": "列を削除", + "delete_row": "行を削除", + "header": "ヘッダー", + "insert_col_left": "左に列を挿入", + "insert_col_right": "右に列を挿入", + "insert_row_above": "上に行を挿入", + "insert_row_below": "下に行を挿入", + "new_row": "+ 新しい行", + "row_options": "行 {n} のオプション" + }, + "toolbar": { + "edit": "編集", + "export_pdf": "PDF にエクスポート", + "focus": "集中モード", + "more": "その他", + "new_file": "新規ファイル", + "open": "ファイルを開く", + "save": "保存", + "search": "検索", + "settings": "設定", + "split_view": "分割表示", + "theme": "テーマ切替", + "toc": "目次", + "zoom_in": "拡大", + "zoom_out": "縮小", + "zoom_reset": "ズームをリセット", + "done": "完了" + }, + "trial": { + "days_remaining": "試用期間の残り {days} 日", + "expired_message": "試用期間が終了しました。編集を続けるには Kern を購入してください。", + "feature_edit": "WYSIWYG と分割表示で Markdown を編集", + "feature_export": "PDF にエクスポート", + "feature_save": "ファイルの保存と新規作成", + "one_time_purchase": "買い切り。サブスクリプション不要。", + "purchase_button": "Kern を購入", + "purchase_desc": "買い切りですべての編集・エクスポート機能にフルアクセスできます。", + "purchase_title": "Kern のロックを解除", + "purchasing": "購入処理中...", + "restore_purchases": "購入を復元", + "restoring": "復元中..." + }, + "viewer": { + "copied": "コピーしました!", + "copy": "コピー" + }, + "welcome": { + "drop_hint": "または .md ファイルをドラッグ&ドロップ", + "new_button": "新規ファイル", + "open_button": "ファイルを開く", + "subtitle": "美しいMarkdownビューア", + "title": "Kern" + }, + "mermaid": { + "done": "完了", + "edit": "編集", + "error_prefix": "構文エラー", + "stale": "プレビューが古くなっています" + } +} diff --git a/src-mdviewer/src/locales/kn.json b/src-mdviewer/src/locales/kn.json new file mode 100644 index 0000000000..ccbf0774ca --- /dev/null +++ b/src-mdviewer/src/locales/kn.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "ಫೈಲ್ ತೆರೆಯಿರಿ", + "theme": "ಥೀಮ್ ಬದಲಿಸಿ", + "toc": "ವಿಷಯ ಸೂಚಿ", + "search": "ಹುಡುಕಿ", + "focus": "ಫೋಕಸ್ ಮೋಡ್", + "zoom_in": "ಜೂಮ್ ಇನ್", + "zoom_out": "ಜೂಮ್ ಔಟ್", + "zoom_reset": "ಜೂಮ್ ರೀಸೆಟ್", + "save": "ಉಳಿಸಿ", + "edit": "ಸಂಪಾದಿಸಿ", + "new_file": "ಹೊಸ ಫೈಲ್", + "split_view": "ವಿಭಜಿತ ನೋಟ", + "export_pdf": "PDF ರಫ್ತು ಮಾಡಿ", + "settings": "ಸೆಟ್ಟಿಂಗ್ಗಳು", + "more": "ಇನ್ನಷ್ಟು" + }, + "sidebar": { + "toc": "ವಿಷಯ ಸೂಚಿ", + "recent": "ಇತ್ತೀಚಿನ ಫೈಲ್ಗಳು", + "no_headings": "ಯಾವುದೇ ಶೀರ್ಷಿಕೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ" + }, + "search": { + "placeholder": "ಡಾಕ್ಯುಮೆಂಟ್ನಲ್ಲಿ ಹುಡುಕಿ...", + "count": "ಹೊಂದಾಣಿಕೆಗಳು", + "no_results": "ಯಾವುದೇ ಫಲಿತಾಂಶಗಳಿಲ್ಲ" + }, + "welcome": { + "title": "Kern", + "subtitle": "ಒಂದು ಸುಂದರ ಮಾರ್ಕ್ಡೌನ್ ವೀಕ್ಷಕ", + "new_button": "ಹೊಸ ಫೈಲ್", + "open_button": "ಫೈಲ್ ತೆರೆಯಿರಿ", + "drop_hint": "ಅಥವಾ .md ಫೈಲ್ ಅನ್ನು ಎಳೆದು ಬಿಡಿ" + }, + "viewer": { + "copy": "ನಕಲಿಸಿ", + "copied": "ನಕಲಿಸಲಾಗಿದೆ!" + }, + "settings": { + "theme": "ಥೀಮ್", + "theme_light": "ಲೈಟ್", + "theme_dark": "ಡಾರ್ಕ್", + "theme_system": "ಸಿಸ್ಟಮ್", + "language": "ಭಾಷೆ" + }, + "common": { + "close": "ಮುಚ್ಚಿ", + "open": "ತೆರೆಯಿರಿ", + "file": "ಫೈಲ್" + }, + "format": { + "paragraph": "ಪ್ಯಾರಾಗ್ರಾಫ್", + "heading1": "ಶೀರ್ಷಿಕೆ ೧", + "heading2": "ಶೀರ್ಷಿಕೆ ೨", + "heading3": "ಶೀರ್ಷಿಕೆ ೩", + "bold": "ಬೋಲ್ಡ್ ({mod}+B)", + "italic": "ಇಟಾಲಿಕ್ ({mod}+I)", + "strikethrough": "ಸ್ಟ್ರೈಕ್ಥ್ರೂ ({mod}+Shift+X)", + "code": "ಇನ್ಲೈನ್ ಕೋಡ್ ({mod}+E)", + "link": "ಲಿಂಕ್ ({mod}+K)", + "bullet_list": "ಬುಲೆಟ್ ಪಟ್ಟಿ", + "numbered_list": "ಸಂಖ್ಯಾ ಪಟ್ಟಿ", + "task_list": "ಕಾರ್ಯ ಪಟ್ಟಿ", + "blockquote": "ಬ್ಲಾಕ್ಕೋಟ್", + "divider": "ವಿಭಜಕ", + "table": "ಕೋಷ್ಟಕ", + "code_block": "ಕೋಡ್ ಬ್ಲಾಕ್" + }, + "slash": { + "paragraph": "ಪ್ಯಾರಾಗ್ರಾಫ್", + "paragraph_desc": "ಸಾಮಾನ್ಯ ಪಠ್ಯ", + "heading1": "ಶೀರ್ಷಿಕೆ ೧", + "heading1_desc": "ದೊಡ್ಡ ಶೀರ್ಷಿಕೆ", + "heading2": "ಶೀರ್ಷಿಕೆ ೨", + "heading2_desc": "ಮಧ್ಯಮ ಶೀರ್ಷಿಕೆ", + "heading3": "ಶೀರ್ಷಿಕೆ ೩", + "heading3_desc": "ಸಣ್ಣ ಶೀರ್ಷಿಕೆ", + "bullet_list": "ಬುಲೆಟ್ ಪಟ್ಟಿ", + "bullet_list_desc": "ಅಕ್ರಮ ಪಟ್ಟಿ", + "numbered_list": "ಸಂಖ್ಯಾ ಪಟ್ಟಿ", + "numbered_list_desc": "ಕ್ರಮ ಪಟ್ಟಿ", + "task_list": "ಕಾರ್ಯ ಪಟ್ಟಿ", + "task_list_desc": "ಚೆಕ್ಲಿಸ್ಟ್", + "blockquote": "ಬ್ಲಾಕ್ಕೋಟ್", + "blockquote_desc": "ಉಲ್ಲೇಖ ಬ್ಲಾಕ್", + "code_block": "ಕೋಡ್ ಬ್ಲಾಕ್", + "code_block_desc": "ಫೆನ್ಸ್ಡ್ ಕೋಡ್", + "table": "ಕೋಷ್ಟಕ", + "table_desc": "೩×೩ ಕೋಷ್ಟಕ", + "divider": "ವಿಭಜಕ", + "divider_desc": "ಅಡ್ಡ ಗೆರೆ", + "no_results": "ಯಾವುದೇ ಫಲಿತಾಂಶಗಳಿಲ್ಲ" + }, + "link": { + "edit": "ಸಂಪಾದಿಸಿ", + "edit_link": "ಲಿಂಕ್ ಸಂಪಾದಿಸಿ", + "remove_link": "ಲಿಂಕ್ ತೆಗೆಯಿರಿ", + "text": "ಪಠ್ಯ", + "text_placeholder": "ಪ್ರದರ್ಶನ ಪಠ್ಯ (ಐಚ್ಛಿಕ)", + "display_text": "ಪ್ರದರ್ಶನ ಪಠ್ಯ", + "url": "URL", + "url_placeholder": "URL ಅಂಟಿಸಿ ಅಥವಾ ಟೈಪ್ ಮಾಡಿ...", + "apply": "ಲಿಂಕ್ ಅನ್ವಯಿಸಿ", + "cancel": "ರದ್ದುಮಾಡಿ" + }, + "table": { + "header": "ಹೆಡರ್", + "new_row": "+ ಹೊಸ ಸಾಲು", + "row_options": "ಸಾಲು {n} ಆಯ್ಕೆಗಳು", + "col_options": "ಕಾಲಮ್ {n} ಆಯ್ಕೆಗಳು", + "insert_row_above": "ಮೇಲೆ ಸಾಲು ಸೇರಿಸಿ", + "insert_row_below": "ಕೆಳಗೆ ಸಾಲು ಸೇರಿಸಿ", + "delete_row": "ಸಾಲು ಅಳಿಸಿ", + "insert_col_left": "ಎಡಕ್ಕೆ ಕಾಲಮ್ ಸೇರಿಸಿ", + "insert_col_right": "ಬಲಕ್ಕೆ ಕಾಲಮ್ ಸೇರಿಸಿ", + "delete_col": "ಕಾಲಮ್ ಅಳಿಸಿ", + "add_row_above": "ಮೇಲೆ ಸಾಲು ಸೇರಿಸಿ", + "add_row_below": "ಕೆಳಗೆ ಸಾಲು ಸೇರಿಸಿ", + "add_col_left": "ಎಡಕ್ಕೆ ಕಾಲಮ್ ಸೇರಿಸಿ", + "add_col_right": "ಬಲಕ್ಕೆ ಕಾಲಮ್ ಸೇರಿಸಿ" + }, + "dialog": { + "unsaved_title": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳು", + "unsaved_exit_edit": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳಿವೆ. ಸಂಪಾದನೆ ಮೋಡ್ ನಿಂದ ನಿರ್ಗಮಿಸುವ ಮೊದಲು ಉಳಿಸಲು ಬಯಸುತ್ತೀರಾ?", + "unsaved_new_file": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳಿವೆ. ಹೊಸ ಫೈಲ್ ರಚಿಸುವ ಮೊದಲು ಉಳಿಸಲು ಬಯಸುತ್ತೀರಾ?", + "unsaved_open_file": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳಿವೆ. ಹೊಸ ಫೈಲ್ ತೆರೆಯುವ ಮೊದಲು ಉಳಿಸಲು ಬಯಸುತ್ತೀರಾ?", + "save": "ಉಳಿಸಿ", + "discard": "ತ್ಯಜಿಸಿ", + "dont_save": "ಉಳಿಸಬೇಡಿ", + "cancel": "ರದ್ದುಮಾಡಿ", + "unsaved_close": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳಿವೆ. ಮುಚ್ಚುವ ಮೊದಲು ಉಳಿಸಲು ಬಯಸುವಿರಾ?" + }, + "lang_picker": { + "filter_placeholder": "ಭಾಷೆಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ...", + "filter_label": "ಭಾಷೆಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ", + "plain_text": "ಸಾದಾ ಪಠ್ಯ" + }, + "a11y": { + "skip_to_content": "ವಿಷಯಕ್ಕೆ ಹೋಗಿ", + "main_toolbar": "ಮುಖ್ಯ ಟೂಲ್ಬಾರ್", + "sidebar": "ಸೈಡ್ಬಾರ್", + "search_text": "ಪಠ್ಯ ಹುಡುಕಿ", + "previous_match": "ಹಿಂದಿನ ಹೊಂದಾಣಿಕೆ", + "next_match": "ಮುಂದಿನ ಹೊಂದಾಣಿಕೆ", + "close_search": "ಹುಡುಕಾಟ ಮುಚ್ಚಿ", + "format_text": "ಪಠ್ಯ ಸ್ವರೂಪ", + "edit_link": "ಲಿಂಕ್ ಸಂಪಾದಿಸಿ", + "insert_block": "ಬ್ಲಾಕ್ ಸೇರಿಸಿ", + "select_language": "ಭಾಷೆ ಆಯ್ಕೆಮಾಡಿ", + "search_in_document": "ಡಾಕ್ಯುಮೆಂಟ್ನಲ್ಲಿ ಹುಡುಕಿ" + }, + "drop_zone": { + "text": "ನಿಮ್ಮ ಮಾರ್ಕ್ಡೌನ್ ಫೈಲ್ ಅನ್ನು ಇಲ್ಲಿ ಬಿಡಿ" + }, + "help": { + "getting_started": "ಪ್ರಾರಂಭಿಸಿ", + "editing": "ಸಂಪಾದನೆ", + "shortcuts": "ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು", + "features": "ವೈಶಿಷ್ಟ್ಯಗಳು", + "fallback_notice": "ಈ ಪುಟವು ಇನ್ನೂ ನಿಮ್ಮ ಭಾಷೆಯಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ. ಇಂಗ್ಲಿಷ್ ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ." + }, + "recovery": { + "title": "ಉಳಿಸದ ಬದಲಾವಣೆಗಳನ್ನು ಮರುಪಡೆಯುವುದೇ?", + "message": "Kern ಹಿಂದಿನ ಅಧಿವೇಶನದಿಂದ ಉಳಿಸದ ಬದಲಾವಣೆಗಳನ್ನು ಕಂಡುಕೊಂಡಿದೆ. ಅವುಗಳನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಬಯಸುವಿರಾ?", + "restore": "ಪುನಃಸ್ಥಾಪಿಸಿ", + "discard": "ತ್ಯಜಿಸಿ" + }, + "export": { + "success": "PDF ಯಶಸ್ವಿಯಾಗಿ ರಫ್ತಾಗಿದೆ", + "open": "ತೆರೆಯಿರಿ" + }, + "context": { + "cut": "ಕತ್ತರಿಸಿ", + "copy": "ನಕಲಿಸಿ", + "paste": "ಅಂಟಿಸಿ", + "paste_plain": "ಸರಳ ಪಠ್ಯವಾಗಿ ಅಂಟಿಸಿ", + "select_all": "ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ", + "copy_link": "ಲಿಂಕ್ ನಕಲಿಸಿ", + "open_link": "ಲಿಂಕ್ ತೆರೆಯಿರಿ", + "copy_image_address": "ಚಿತ್ರದ ವಿಳಾಸ ನಕಲಿಸಿ" + }, + "trial": { + "days_remaining": "ಪ್ರಯೋಗದಲ್ಲಿ {days} ದಿನಗಳು ಉಳಿದಿವೆ", + "expired_message": "ನಿಮ್ಮ ಪ್ರಯೋಗ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂಪಾದನೆ ಮುಂದುವರಿಸಲು Kern ಖರೀದಿಸಿ.", + "purchase_button": "Kern ಖರೀದಿಸಿ", + "purchase_title": "Kern ಅನ್ಲಾಕ್ ಮಾಡಿ", + "purchase_desc": "ಒಂದು ಬಾರಿಯ ಖರೀದಿಯೊಂದಿಗೆ ಎಲ್ಲಾ ಸಂಪಾದನೆ ಮತ್ತು ರಫ್ತು ವೈಶಿಷ್ಟ್ಯಗಳಿಗೆ ಸಂಪೂರ್ಣ ಪ್ರವೇಶ ಪಡೆಯಿರಿ.", + "feature_edit": "WYSIWYG ಮತ್ತು ವಿಭಜಿತ ನೋಟದೊಂದಿಗೆ Markdown ಸಂಪಾದಿಸಿ", + "feature_save": "ಫೈಲ್ಗಳನ್ನು ಉಳಿಸಿ ಮತ್ತು ಹೊಸದನ್ನು ರಚಿಸಿ", + "feature_export": "PDF ಗೆ ರಫ್ತು ಮಾಡಿ", + "restore_purchases": "ಖರೀದಿಗಳನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ", + "one_time_purchase": "ಒಂದು ಬಾರಿಯ ಖರೀದಿ. ಚಂದಾದಾರಿಕೆ ಇಲ್ಲ.", + "purchasing": "ಖರೀದಿಸಲಾಗುತ್ತಿದೆ...", + "restoring": "ಪುನಃಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ..." + } +} diff --git a/src-mdviewer/src/locales/ko.json b/src-mdviewer/src/locales/ko.json new file mode 100644 index 0000000000..4ee56db15e --- /dev/null +++ b/src-mdviewer/src/locales/ko.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "검색 닫기", + "edit_link": "링크 편집", + "format_text": "텍스트 서식", + "insert_block": "블록 삽입", + "main_toolbar": "메인 도구 모음", + "next_match": "다음 일치", + "previous_match": "이전 일치", + "search_in_document": "문서에서 검색", + "search_text": "텍스트 검색", + "select_language": "언어 선택", + "sidebar": "사이드바", + "skip_to_content": "콘텐츠로 건너뛰기" + }, + "common": { + "close": "닫기", + "file": "파일", + "open": "열기" + }, + "context": { + "copy": "복사", + "copy_image_address": "이미지 주소 복사", + "copy_link": "링크 복사", + "cut": "잘라내기", + "open_link": "링크 열기", + "paste": "붙여넣기", + "paste_plain": "일반 텍스트로 붙여넣기", + "select_all": "모두 선택" + }, + "dialog": { + "cancel": "취소", + "discard": "버리기", + "dont_save": "저장 안 함", + "save": "저장", + "unsaved_close": "저장되지 않은 변경사항이 있습니다. 닫기 전에 저장하시겠습니까?", + "unsaved_exit_edit": "저장되지 않은 변경사항이 있습니다. 편집 모드를 종료하기 전에 저장하시겠습니까?", + "unsaved_new_file": "저장되지 않은 변경사항이 있습니다. 새 파일을 만들기 전에 저장하시겠습니까?", + "unsaved_open_file": "저장되지 않은 변경사항이 있습니다. 새 파일을 열기 전에 저장하시겠습니까?", + "unsaved_title": "저장되지 않은 변경사항" + }, + "drop_zone": { + "text": "마크다운 파일을 여기에 놓으세요" + }, + "export": { + "open": "열기", + "success": "PDF 내보내기 완료" + }, + "format": { + "blockquote": "인용", + "bold": "굵게 ({mod}+B)", + "bullet_list": "글머리 기호 목록", + "code": "인라인 코드 ({mod}+E)", + "code_block": "코드 블록", + "divider": "구분선", + "heading1": "제목 1", + "heading2": "제목 2", + "heading3": "제목 3", + "italic": "기울임 ({mod}+I)", + "link": "링크 ({mod}+K)", + "numbered_list": "번호 목록", + "paragraph": "본문", + "strikethrough": "취소선 ({mod}+Shift+X)", + "table": "표", + "task_list": "작업 목록", + "block_type": "블록 유형", + "lists": "목록", + "more_elements": "더 보기", + "text_formatting": "텍스트 서식", + "underline": "밑줄" + }, + "help": { + "editing": "편집", + "fallback_notice": "이 페이지는 아직 사용자의 언어로 제공되지 않습니다. 영어 버전을 표시합니다.", + "features": "기능", + "getting_started": "시작하기", + "shortcuts": "키보드 단축키" + }, + "lang_picker": { + "filter_label": "언어 필터", + "filter_placeholder": "언어 필터...", + "plain_text": "일반 텍스트" + }, + "link": { + "apply": "링크 적용", + "cancel": "취소", + "display_text": "표시 텍스트", + "edit": "편집", + "edit_link": "링크 편집", + "remove_link": "링크 제거", + "text": "텍스트", + "text_placeholder": "표시 텍스트 (선택사항)", + "url": "URL", + "url_placeholder": "URL을 붙여넣거나 입력하세요..." + }, + "recovery": { + "discard": "버리기", + "message": "Kern이 이전 세션에서 저장되지 않은 변경사항을 발견했습니다. 복구하시겠습니까?", + "restore": "복구", + "title": "저장되지 않은 변경사항을 복구하시겠습니까?" + }, + "search": { + "count": "일치", + "no_results": "결과 없음", + "placeholder": "문서에서 검색..." + }, + "settings": { + "language": "언어", + "theme": "테마", + "theme_dark": "다크", + "theme_light": "라이트", + "theme_system": "시스템" + }, + "sidebar": { + "no_headings": "제목을 찾을 수 없습니다", + "recent": "최근 파일", + "toc": "목차" + }, + "slash": { + "blockquote": "인용", + "blockquote_desc": "인용 블록", + "bullet_list": "글머리 기호 목록", + "bullet_list_desc": "순서 없는 목록", + "code_block": "코드 블록", + "code_block_desc": "펜스드 코드", + "divider": "구분선", + "divider_desc": "수평선", + "heading1": "제목 1", + "heading1_desc": "큰 제목", + "heading2": "제목 2", + "heading2_desc": "중간 제목", + "heading3": "제목 3", + "heading3_desc": "작은 제목", + "no_results": "결과 없음", + "numbered_list": "번호 목록", + "numbered_list_desc": "순서 있는 목록", + "paragraph": "본문", + "paragraph_desc": "일반 텍스트", + "table": "표", + "table_desc": "3×3 표", + "task_list": "작업 목록", + "task_list_desc": "체크리스트", + "mermaid": "Mermaid 다이어그램", + "mermaid_desc": "다이어그램 삽입" + }, + "table": { + "add_col_left": "왼쪽에 열 추가", + "add_col_right": "오른쪽에 열 추가", + "add_row_above": "위에 행 추가", + "add_row_below": "아래에 행 추가", + "col_options": "열 {n} 옵션", + "delete_col": "열 삭제", + "delete_row": "행 삭제", + "header": "헤더", + "insert_col_left": "왼쪽에 열 삽입", + "insert_col_right": "오른쪽에 열 삽입", + "insert_row_above": "위에 행 삽입", + "insert_row_below": "아래에 행 삽입", + "new_row": "+ 새 행", + "row_options": "행 {n} 옵션" + }, + "toolbar": { + "edit": "편집", + "export_pdf": "PDF 내보내기", + "focus": "집중 모드", + "more": "더보기", + "new_file": "새 파일", + "open": "파일 열기", + "save": "저장", + "search": "검색", + "settings": "설정", + "split_view": "분할 보기", + "theme": "테마 전환", + "toc": "목차", + "zoom_in": "확대", + "zoom_out": "축소", + "zoom_reset": "배율 초기화", + "done": "완료" + }, + "trial": { + "days_remaining": "체험판 {days}일 남음", + "expired_message": "체험 기간이 만료되었습니다. 편집을 계속하려면 Kern을 구매하세요.", + "feature_edit": "WYSIWYG 및 분할 보기로 Markdown 편집", + "feature_export": "PDF로 내보내기", + "feature_save": "파일 저장 및 새 파일 만들기", + "one_time_purchase": "일회성 구매. 구독 없음.", + "purchase_button": "Kern 구매", + "purchase_desc": "일회성 구매로 모든 편집 및 내보내기 기능을 이용할 수 있습니다.", + "purchase_title": "Kern 잠금 해제", + "purchasing": "구매 중...", + "restore_purchases": "구매 복원", + "restoring": "복원 중..." + }, + "viewer": { + "copied": "복사됨!", + "copy": "복사" + }, + "welcome": { + "drop_hint": "또는 .md 파일을 끌어다 놓으세요", + "new_button": "새 파일", + "open_button": "파일 열기", + "subtitle": "아름다운 마크다운 뷰어", + "title": "Kern" + }, + "mermaid": { + "done": "완료", + "edit": "편집", + "error_prefix": "구문 오류", + "stale": "미리보기가 오래됨" + } +} diff --git a/src-mdviewer/src/locales/lv.json b/src-mdviewer/src/locales/lv.json new file mode 100644 index 0000000000..67c99a7db7 --- /dev/null +++ b/src-mdviewer/src/locales/lv.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Aizvērt meklēšanu", + "edit_link": "Rediģēt saiti", + "format_text": "Formatēt tekstu", + "insert_block": "Ievietot bloku", + "main_toolbar": "Galvenā rīkjosla", + "next_match": "Nākamā atbilstība", + "previous_match": "Iepriekšējā atbilstība", + "search_in_document": "Meklēt dokumentā", + "search_text": "Meklēt tekstu", + "select_language": "Izvēlēties valodu", + "sidebar": "Sānjosla", + "skip_to_content": "Pāriet uz saturu" + }, + "common": { + "close": "Aizvērt", + "file": "Fails", + "open": "Atvērt" + }, + "context": { + "copy": "Kopēt", + "copy_image_address": "Kopēt attēla adresi", + "copy_link": "Kopēt saiti", + "cut": "Izgriezt", + "open_link": "Atvērt saiti", + "paste": "Ielīmēt", + "paste_plain": "Ielīmēt kā vienkāršu tekstu", + "select_all": "Atlasīt visu" + }, + "dialog": { + "cancel": "Atcelt", + "discard": "Atmest", + "dont_save": "Nesaglabāt", + "save": "Saglabāt", + "unsaved_close": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms aizvēršanas?", + "unsaved_exit_edit": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms iziešanas no rediģēšanas režīma?", + "unsaved_new_file": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms jauna faila izveides?", + "unsaved_open_file": "Jums ir nesaglabātas izmaiņas. Vai vēlaties tās saglabāt pirms jauna faila atvēršanas?", + "unsaved_title": "Nesaglabātas izmaiņas" + }, + "drop_zone": { + "text": "Ievelciet savu Markdown failu šeit" + }, + "export": { + "open": "Atvērt", + "success": "PDF veiksmīgi eksportēts" + }, + "format": { + "block_type": "Bloka tips", + "blockquote": "Citāta bloks", + "bold": "Treknraksts ({mod}+B)", + "bullet_list": "Aizzīmēts saraksts", + "code": "Iekļautais kods ({mod}+E)", + "code_block": "Koda bloks", + "divider": "Atdalītājs", + "heading1": "Virsraksts 1", + "heading2": "Virsraksts 2", + "heading3": "Virsraksts 3", + "italic": "Slīpraksts ({mod}+I)", + "link": "Saite ({mod}+K)", + "lists": "Saraksti", + "more_elements": "Vairāk", + "numbered_list": "Numurēts saraksts", + "paragraph": "Rindkopa", + "strikethrough": "Pārsvītrojums ({mod}+Shift+X)", + "table": "Tabula", + "task_list": "Uzdevumu saraksts", + "text_formatting": "Teksta formatēšana", + "underline": "Pasvītrojums" + }, + "help": { + "editing": "Rediģēšana", + "fallback_notice": "Šī lapa vēl nav pieejama jūsu valodā. Tiek rādīta versija angļu valodā.", + "features": "Funkcijas", + "getting_started": "Darba sākšana", + "shortcuts": "Tastatūras saīsnes" + }, + "lang_picker": { + "filter_label": "Filtrēt valodas", + "filter_placeholder": "Filtrēt valodas...", + "plain_text": "Vienkāršs teksts" + }, + "link": { + "apply": "Lietot saiti", + "cancel": "Atcelt", + "display_text": "Attēlotais teksts", + "edit": "Rediģēt", + "edit_link": "Rediģēt saiti", + "remove_link": "Noņemt saiti", + "text": "Teksts", + "text_placeholder": "Rādāmais teksts (neobligāts)", + "url": "URL", + "url_placeholder": "Ielīmējiet vai ierakstiet URL..." + }, + "mermaid": { + "done": "Gatavs", + "edit": "Rediģēt", + "error_prefix": "Sintakses kļūda", + "stale": "Priekšskatījums novecojis" + }, + "recovery": { + "discard": "Atmest", + "message": "Kern atrada nesaglabātas izmaiņas no iepriekšējās sesijas. Vai vēlaties tās atjaunot?", + "restore": "Atjaunot", + "title": "Atgūt nesaglabātās izmaiņas?" + }, + "search": { + "count": "atbilstības", + "no_results": "Nav rezultātu", + "placeholder": "Meklēt dokumentā..." + }, + "settings": { + "language": "Valoda", + "theme": "Tēma", + "theme_dark": "Tumšā", + "theme_light": "Gaišā", + "theme_system": "Sistēmas" + }, + "sidebar": { + "no_headings": "Virsraksti nav atrasti", + "recent": "Pēdējie faili", + "toc": "Satura rādītājs" + }, + "slash": { + "blockquote": "Citāts", + "blockquote_desc": "Citāta bloks", + "bullet_list": "Aizzīmēts saraksts", + "bullet_list_desc": "Nenumurēts saraksts", + "code_block": "Koda bloks", + "code_block_desc": "Ierobežots kods", + "divider": "Atdalītājs", + "divider_desc": "Horizontālā līnija", + "heading1": "Virsraksts 1", + "heading1_desc": "Liels virsraksts", + "heading2": "Virsraksts 2", + "heading2_desc": "Vidējs virsraksts", + "heading3": "Virsraksts 3", + "heading3_desc": "Mazs virsraksts", + "mermaid": "Mermaid diagramma", + "mermaid_desc": "Ievietot diagrammu", + "no_results": "Nav rezultātu", + "numbered_list": "Numurēts saraksts", + "numbered_list_desc": "Sakārtots saraksts", + "paragraph": "Rindkopa", + "paragraph_desc": "Vienkāršs teksts", + "table": "Tabula", + "table_desc": "3×3 tabula", + "task_list": "Uzdevumu saraksts", + "task_list_desc": "Kontrolsaraksts" + }, + "table": { + "add_col_left": "Pievienot kolonnu pa kreisi", + "add_col_right": "Pievienot kolonnu pa labi", + "add_row_above": "Pievienot rindu virs", + "add_row_below": "Pievienot rindu zem", + "col_options": "{n}. kolonnas opcijas", + "delete_col": "Dzēst kolonnu", + "delete_row": "Dzēst rindu", + "header": "Galvene", + "insert_col_left": "Ievietot kolonnu pa kreisi", + "insert_col_right": "Ievietot kolonnu pa labi", + "insert_row_above": "Ievietot rindu virs", + "insert_row_below": "Ievietot rindu zem", + "new_row": "+ Jauna rinda", + "row_options": "Rindas {n} opcijas" + }, + "toolbar": { + "done": "Gatavs", + "edit": "Rediģēt", + "export_pdf": "Eksportēt PDF", + "focus": "Fokusa režīms", + "more": "Vairāk", + "new_file": "Jauns fails", + "open": "Atvērt failu", + "save": "Saglabāt", + "search": "Meklēt", + "settings": "Iestatījumi", + "split_view": "Dalīts skats", + "theme": "Pārslēgt tēmu", + "toc": "Satura rādītājs", + "zoom_in": "Tuvināt", + "zoom_out": "Tālināt", + "zoom_reset": "Atiestatīt tālummaiņu" + }, + "trial": { + "days_remaining": "Atlikušas {days} dienas izmēģinājuma periodā", + "expired_message": "Jūsu izmēģinājuma periods ir beidzies. Iegādājieties Kern, lai turpinātu rediģēšanu.", + "feature_edit": "Rediģējiet Markdown ar WYSIWYG un dalīto skatu", + "feature_export": "Eksportēt uz PDF", + "feature_save": "Saglabāt un izveidot jaunus failus", + "one_time_purchase": "Vienreizējs pirkums. Bez abonementa.", + "purchase_button": "Iegādāties Kern", + "purchase_desc": "Iegūstiet pilnu piekļuvi visām rediģēšanas un eksportēšanas funkcijām ar vienreizēju pirkumu.", + "purchase_title": "Atslēgt Kern", + "purchasing": "Notiek pirkšana...", + "restore_purchases": "Atjaunot pirkumus", + "restoring": "Notiek atjaunošana..." + }, + "viewer": { + "copied": "Nokopēts!", + "copy": "Kopēt" + }, + "welcome": { + "drop_hint": "vai ievelciet .md failu", + "new_button": "Jauns fails", + "open_button": "Atvērt failu", + "subtitle": "Skaists Markdown skatītājs", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/ml.json b/src-mdviewer/src/locales/ml.json new file mode 100644 index 0000000000..9b9a7382bb --- /dev/null +++ b/src-mdviewer/src/locales/ml.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "തിരയൽ അടയ്ക്കുക", + "edit_link": "ലിങ്ക് എഡിറ്റ് ചെയ്യുക", + "format_text": "ടെക്സ്റ്റ് ഫോർമാറ്റ്", + "insert_block": "ബ്ലോക്ക് ചേർക്കുക", + "main_toolbar": "പ്രധാന ടൂൾബാർ", + "next_match": "അടുത്ത പൊരുത്തം", + "previous_match": "മുമ്പത്തെ പൊരുത്തം", + "search_in_document": "ഡോക്യുമെന്റിൽ തിരയുക", + "search_text": "ടെക്സ്റ്റ് തിരയുക", + "select_language": "ഭാഷ തിരഞ്ഞെടുക്കുക", + "sidebar": "സൈഡ്ബാർ", + "skip_to_content": "ഉള്ളടക്കത്തിലേക്ക് പോകുക" + }, + "common": { + "close": "അടയ്ക്കുക", + "file": "ഫയൽ", + "open": "തുറക്കുക" + }, + "context": { + "copy": "പകർത്തുക", + "copy_image_address": "ചിത്രത്തിന്റെ വിലാസം പകർത്തുക", + "copy_link": "ലിങ്ക് പകർത്തുക", + "cut": "മുറിക്കുക", + "open_link": "ലിങ്ക് തുറക്കുക", + "paste": "ഒട്ടിക്കുക", + "paste_plain": "സാധാരണ ടെക്സ്റ്റായി ഒട്ടിക്കുക", + "select_all": "എല്ലാം തിരഞ്ഞെടുക്കുക" + }, + "dialog": { + "cancel": "റദ്ദാക്കുക", + "discard": "ഉപേക്ഷിക്കുക", + "dont_save": "സേവ് ചെയ്യരുത്", + "save": "സേവ്", + "unsaved_close": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. അടയ്ക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "unsaved_exit_edit": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. എഡിറ്റ് മോഡിൽ നിന്ന് പുറത്തുകടക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "unsaved_new_file": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. പുതിയ ഫയൽ സൃഷ്ടിക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "unsaved_open_file": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. പുതിയ ഫയൽ തുറക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "unsaved_title": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ" + }, + "drop_zone": { + "text": "നിങ്ങളുടെ മാർക്ക്ഡൗൺ ഫയൽ ഇവിടെ ഇടുക" + }, + "export": { + "open": "തുറക്കുക", + "success": "PDF വിജയകരമായി എക്സ്പോർട്ട് ചെയ്തു" + }, + "format": { + "blockquote": "ബ്ലോക്ക്ക്വോട്ട്", + "bold": "ബോൾഡ് ({mod}+B)", + "bullet_list": "ബുള്ളറ്റ് ലിസ്റ്റ്", + "code": "ഇൻലൈൻ കോഡ് ({mod}+E)", + "code_block": "കോഡ് ബ്ലോക്ക്", + "divider": "ഡിവൈഡർ", + "heading1": "ശീർഷകം 1", + "heading2": "ശീർഷകം 2", + "heading3": "ശീർഷകം 3", + "italic": "ഇറ്റാലിക് ({mod}+I)", + "link": "ലിങ്ക് ({mod}+K)", + "numbered_list": "നമ്പർ ലിസ്റ്റ്", + "paragraph": "ഖണ്ഡിക", + "strikethrough": "സ്ട്രൈക്ക്ത്രൂ ({mod}+Shift+X)", + "table": "ടേബിൾ", + "task_list": "ടാസ്ക് ലിസ്റ്റ്", + "block_type": "ബ്ലോക്ക് തരം", + "lists": "ലിസ്റ്റുകൾ", + "more_elements": "കൂടുതൽ", + "text_formatting": "ടെക്സ്റ്റ് ഫോർമാറ്റിംഗ്", + "underline": "അടിവര" + }, + "help": { + "editing": "എഡിറ്റിംഗ്", + "fallback_notice": "ഈ പേജ് ഇതുവരെ നിങ്ങളുടെ ഭാഷയിൽ ലഭ്യമല്ല. ഇംഗ്ലീഷ് പതിപ്പ് കാണിക്കുന്നു.", + "features": "സവിശേഷതകൾ", + "getting_started": "ആരംഭിക്കാം", + "shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ" + }, + "lang_picker": { + "filter_label": "ഭാഷകൾ ഫിൽട്ടർ ചെയ്യുക", + "filter_placeholder": "ഭാഷകൾ ഫിൽട്ടർ ചെയ്യുക...", + "plain_text": "സാധാരണ ടെക്സ്റ്റ്" + }, + "link": { + "apply": "ലിങ്ക് ബാധകമാക്കുക", + "cancel": "റദ്ദാക്കുക", + "display_text": "ഡിസ്പ്ലേ ടെക്സ്റ്റ്", + "edit": "എഡിറ്റ്", + "edit_link": "ലിങ്ക് എഡിറ്റ് ചെയ്യുക", + "remove_link": "ലിങ്ക് നീക്കം ചെയ്യുക", + "text": "ടെക്സ്റ്റ്", + "text_placeholder": "ഡിസ്പ്ലേ ടെക്സ്റ്റ് (ഐച്ഛികം)", + "url": "URL", + "url_placeholder": "URL പേസ്റ്റ് ചെയ്യുക അല്ലെങ്കിൽ ടൈപ്പ് ചെയ്യുക..." + }, + "recovery": { + "discard": "ഉപേക്ഷിക്കുക", + "message": "മുൻ സെഷനിൽ നിന്ന് സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ Kern കണ്ടെത്തി. അവ പുനഃസ്ഥാപിക്കണോ?", + "restore": "പുനഃസ്ഥാപിക്കുക", + "title": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ വീണ്ടെടുക്കണോ?" + }, + "search": { + "count": "പൊരുത്തങ്ങൾ", + "no_results": "ഫലങ്ങളില്ല", + "placeholder": "ഡോക്യുമെന്റിൽ തിരയുക..." + }, + "settings": { + "language": "ഭാഷ", + "theme": "തീം", + "theme_dark": "ഡാർക്ക്", + "theme_light": "ലൈറ്റ്", + "theme_system": "സിസ്റ്റം" + }, + "sidebar": { + "no_headings": "ശീർഷകങ്ങൾ കണ്ടെത്തിയില്ല", + "recent": "സമീപകാല ഫയലുകൾ", + "toc": "ഉള്ളടക്കം" + }, + "slash": { + "blockquote": "ബ്ലോക്ക്ക്വോട്ട്", + "blockquote_desc": "ഉദ്ധരണി ബ്ലോക്ക്", + "bullet_list": "ബുള്ളറ്റ് ലിസ്റ്റ്", + "bullet_list_desc": "ക്രമരഹിത ലിസ്റ്റ്", + "code_block": "കോഡ് ബ്ലോക്ക്", + "code_block_desc": "ഫെൻസ്ഡ് കോഡ്", + "divider": "ഡിവൈഡർ", + "divider_desc": "തിരശ്ചീന രേഖ", + "heading1": "ശീർഷകം 1", + "heading1_desc": "വലിയ ശീർഷകം", + "heading2": "ശീർഷകം 2", + "heading2_desc": "ഇടത്തരം ശീർഷകം", + "heading3": "ശീർഷകം 3", + "heading3_desc": "ചെറിയ ശീർഷകം", + "no_results": "ഫലങ്ങളില്ല", + "numbered_list": "നമ്പർ ലിസ്റ്റ്", + "numbered_list_desc": "ക്രമ ലിസ്റ്റ്", + "paragraph": "ഖണ്ഡിക", + "paragraph_desc": "സാധാരണ വാചകം", + "table": "ടേബിൾ", + "table_desc": "3×3 ടേബിൾ", + "task_list": "ടാസ്ക് ലിസ്റ്റ്", + "task_list_desc": "ചെക്ക്ലിസ്റ്റ്", + "mermaid": "Mermaid ഡയഗ്രം", + "mermaid_desc": "ഡയഗ്രം ചേർക്കുക" + }, + "table": { + "add_col_left": "ഇടത്ത് കോളം ചേർക്കുക", + "add_col_right": "വലത്ത് കോളം ചേർക്കുക", + "add_row_above": "മുകളിൽ വരി ചേർക്കുക", + "add_row_below": "താഴെ വരി ചേർക്കുക", + "col_options": "കോളം {n} ഓപ്ഷനുകൾ", + "delete_col": "കോളം ഇല്ലാതാക്കുക", + "delete_row": "വരി ഇല്ലാതാക്കുക", + "header": "ഹെഡർ", + "insert_col_left": "ഇടത്ത് കോളം ചേർക്കുക", + "insert_col_right": "വലത്ത് കോളം ചേർക്കുക", + "insert_row_above": "മുകളിൽ വരി ചേർക്കുക", + "insert_row_below": "താഴെ വരി ചേർക്കുക", + "new_row": "+ പുതിയ വരി", + "row_options": "വരി {n} ഓപ്ഷനുകൾ" + }, + "toolbar": { + "edit": "എഡിറ്റ്", + "export_pdf": "PDF എക്സ്പോർട്ട്", + "focus": "ഫോക്കസ് മോഡ്", + "more": "കൂടുതൽ", + "new_file": "പുതിയ ഫയൽ", + "open": "ഫയൽ തുറക്കുക", + "save": "സേവ്", + "search": "തിരയുക", + "settings": "ക്രമീകരണങ്ങൾ", + "split_view": "വിഭജിത കാഴ്ച", + "theme": "തീം മാറ്റുക", + "toc": "ഉള്ളടക്കം", + "zoom_in": "സൂം ഇൻ", + "zoom_out": "സൂം ഔട്ട്", + "zoom_reset": "സൂം റീസെറ്റ്", + "done": "പൂർത്തിയായി" + }, + "trial": { + "days_remaining": "ട്രയലിൽ {days} ദിവസം ശേഷിക്കുന്നു", + "expired_message": "നിങ്ങളുടെ ട്രയൽ കാലാവധി അവസാനിച്ചു. എഡിറ്റിംഗ് തുടരാൻ Kern വാങ്ങുക.", + "feature_edit": "WYSIWYG, വിഭജിത കാഴ്ചയിൽ Markdown എഡിറ്റ് ചെയ്യുക", + "feature_export": "PDF-ലേക്ക് എക്സ്പോർട്ട് ചെയ്യുക", + "feature_save": "ഫയലുകൾ സേവ് ചെയ്യുകയും പുതിയവ സൃഷ്ടിക്കുകയും ചെയ്യുക", + "one_time_purchase": "ഒറ്റത്തവണ വാങ്ങൽ. സബ്സ്ക്രിപ്ഷൻ ഇല്ല.", + "purchase_button": "Kern വാങ്ങുക", + "purchase_desc": "ഒറ്റത്തവണ വാങ്ങലിലൂടെ എല്ലാ എഡിറ്റിംഗ്, എക്സ്പോർട്ട് സവിശേഷതകളിലേക്കും പൂർണ്ണ ആക്സസ് നേടുക.", + "purchase_title": "Kern അൺലോക്ക് ചെയ്യുക", + "purchasing": "വാങ്ങുന്നു...", + "restore_purchases": "വാങ്ങലുകൾ പുനഃസ്ഥാപിക്കുക", + "restoring": "പുനഃസ്ഥാപിക്കുന്നു..." + }, + "viewer": { + "copied": "കോപ്പി ചെയ്തു!", + "copy": "കോപ്പി" + }, + "welcome": { + "drop_hint": "അല്ലെങ്കിൽ .md ഫയൽ വലിച്ചിടുക", + "new_button": "പുതിയ ഫയൽ", + "open_button": "ഫയൽ തുറക്കുക", + "subtitle": "ഒരു മനോഹരമായ മാർക്ക്ഡൗൺ വ്യൂവർ", + "title": "Kern" + }, + "mermaid": { + "done": "പൂർത്തിയായി", + "edit": "എഡിറ്റ് ചെയ്യുക", + "error_prefix": "സിന്റാക്സ് പിശക്", + "stale": "പ്രിവ്യൂ കാലഹരണപ്പെട്ടു" + } +} diff --git a/src-mdviewer/src/locales/mr.json b/src-mdviewer/src/locales/mr.json new file mode 100644 index 0000000000..b1710fcb58 --- /dev/null +++ b/src-mdviewer/src/locales/mr.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "फाइल उघडा", + "theme": "थीम बदला", + "toc": "अनुक्रमणिका", + "search": "शोधा", + "focus": "फोकस मोड", + "zoom_in": "झूम इन", + "zoom_out": "झूम आउट", + "zoom_reset": "झूम रीसेट", + "save": "जतन करा", + "edit": "संपादन", + "new_file": "नवीन फाइल", + "split_view": "विभाजित दृश्य", + "export_pdf": "PDF निर्यात करा", + "settings": "सेटिंग्ज", + "more": "अधिक" + }, + "sidebar": { + "toc": "अनुक्रमणिका", + "recent": "अलीकडील फाइल्स", + "no_headings": "शीर्षके सापडली नाहीत" + }, + "search": { + "placeholder": "दस्तऐवजात शोधा...", + "count": "जुळणी", + "no_results": "कोणतेही परिणाम नाहीत" + }, + "welcome": { + "title": "Kern", + "subtitle": "एक सुंदर मार्कडाउन व्ह्यूअर", + "new_button": "नवीन फाइल", + "open_button": "फाइल उघडा", + "drop_hint": "किंवा .md फाइल ड्रॅग आणि ड्रॉप करा" + }, + "viewer": { + "copy": "कॉपी", + "copied": "कॉपी झाले!" + }, + "settings": { + "theme": "थीम", + "theme_light": "लाइट", + "theme_dark": "डार्क", + "theme_system": "सिस्टम", + "language": "भाषा" + }, + "common": { + "close": "बंद करा", + "open": "उघडा", + "file": "फाइल" + }, + "format": { + "paragraph": "परिच्छेद", + "heading1": "शीर्षक १", + "heading2": "शीर्षक २", + "heading3": "शीर्षक ३", + "bold": "ठळक ({mod}+B)", + "italic": "तिरपे ({mod}+I)", + "strikethrough": "स्ट्राइकथ्रू ({mod}+Shift+X)", + "code": "इनलाइन कोड ({mod}+E)", + "link": "दुवा ({mod}+K)", + "bullet_list": "बुलेट यादी", + "numbered_list": "क्रमांकित यादी", + "task_list": "कार्य यादी", + "blockquote": "ब्लॉककोट", + "divider": "विभाजक", + "table": "तक्ता", + "code_block": "कोड ब्लॉक" + }, + "slash": { + "paragraph": "परिच्छेद", + "paragraph_desc": "साधा मजकूर", + "heading1": "शीर्षक १", + "heading1_desc": "मोठे शीर्षक", + "heading2": "शीर्षक २", + "heading2_desc": "मध्यम शीर्षक", + "heading3": "शीर्षक ३", + "heading3_desc": "लहान शीर्षक", + "bullet_list": "बुलेट यादी", + "bullet_list_desc": "अक्रमित यादी", + "numbered_list": "क्रमांकित यादी", + "numbered_list_desc": "क्रमित यादी", + "task_list": "कार्य यादी", + "task_list_desc": "चेकलिस्ट", + "blockquote": "ब्लॉककोट", + "blockquote_desc": "उद्धरण ब्लॉक", + "code_block": "कोड ब्लॉक", + "code_block_desc": "फेन्स्ड कोड", + "table": "तक्ता", + "table_desc": "३×३ तक्ता", + "divider": "विभाजक", + "divider_desc": "आडवी रेषा", + "no_results": "कोणतेही परिणाम नाहीत" + }, + "link": { + "edit": "संपादन", + "edit_link": "दुवा संपादित करा", + "remove_link": "दुवा काढा", + "text": "मजकूर", + "text_placeholder": "प्रदर्शन मजकूर (पर्यायी)", + "display_text": "प्रदर्शन मजकूर", + "url": "URL", + "url_placeholder": "URL पेस्ट करा किंवा टाइप करा...", + "apply": "दुवा लागू करा", + "cancel": "रद्द करा" + }, + "table": { + "header": "हेडर", + "new_row": "+ नवीन ओळ", + "row_options": "ओळ {n} पर्याय", + "col_options": "स्तंभ {n} पर्याय", + "insert_row_above": "वर ओळ घाला", + "insert_row_below": "खाली ओळ घाला", + "delete_row": "ओळ हटवा", + "insert_col_left": "डावीकडे स्तंभ घाला", + "insert_col_right": "उजवीकडे स्तंभ घाला", + "delete_col": "स्तंभ हटवा", + "add_row_above": "वर ओळ जोडा", + "add_row_below": "खाली ओळ जोडा", + "add_col_left": "डावीकडे स्तंभ जोडा", + "add_col_right": "उजवीकडे स्तंभ जोडा" + }, + "dialog": { + "unsaved_title": "न जतन केलेले बदल", + "unsaved_exit_edit": "न जतन केलेले बदल आहेत. संपादन मोड सोडण्यापूर्वी जतन करायचे का?", + "unsaved_new_file": "न जतन केलेले बदल आहेत. नवीन फाइल तयार करण्यापूर्वी जतन करायचे का?", + "unsaved_open_file": "न जतन केलेले बदल आहेत. नवीन फाइल उघडण्यापूर्वी जतन करायचे का?", + "save": "जतन करा", + "discard": "टाकून द्या", + "dont_save": "जतन करू नका", + "cancel": "रद्द करा", + "unsaved_close": "जतन न केलेले बदल आहेत. बंद करण्यापूर्वी जतन करायचे आहे का?" + }, + "lang_picker": { + "filter_placeholder": "भाषा फिल्टर करा...", + "filter_label": "भाषा फिल्टर करा", + "plain_text": "साधा मजकूर" + }, + "a11y": { + "skip_to_content": "मजकुराकडे जा", + "main_toolbar": "मुख्य टूलबार", + "sidebar": "साइडबार", + "search_text": "मजकूर शोधा", + "previous_match": "मागील जुळणी", + "next_match": "पुढील जुळणी", + "close_search": "शोध बंद करा", + "format_text": "मजकूर स्वरूपित करा", + "edit_link": "दुवा संपादित करा", + "insert_block": "ब्लॉक घाला", + "select_language": "भाषा निवडा", + "search_in_document": "दस्तऐवजात शोधा" + }, + "drop_zone": { + "text": "तुमची मार्कडाउन फाइल इथे ड्रॉप करा" + }, + "help": { + "getting_started": "सुरुवात करा", + "editing": "संपादन", + "shortcuts": "कीबोर्ड शॉर्टकट", + "features": "वैशिष्ट्ये", + "fallback_notice": "हे पृष्ठ अद्याप तुमच्या भाषेत उपलब्ध नाही. इंग्रजी आवृत्ती दाखवली जात आहे." + }, + "recovery": { + "title": "जतन न केलेले बदल पुनर्प्राप्त करायचे?", + "message": "Kern ला मागील सत्रातील जतन न केलेले बदल सापडले. ते पुनर्स्थापित करायचे आहेत का?", + "restore": "पुनर्स्थापित करा", + "discard": "टाकून द्या" + }, + "export": { + "success": "PDF यशस्वीरित्या निर्यात झाले", + "open": "उघडा" + }, + "context": { + "cut": "कापा", + "copy": "कॉपी करा", + "paste": "पेस्ट करा", + "paste_plain": "साधा मजकूर म्हणून पेस्ट करा", + "select_all": "सर्व निवडा", + "copy_link": "दुवा कॉपी करा", + "open_link": "दुवा उघडा", + "copy_image_address": "प्रतिमा पत्ता कॉपी करा" + }, + "trial": { + "days_remaining": "चाचणीत {days} दिवस शिल्लक", + "expired_message": "तुमची चाचणी संपली आहे. संपादन सुरू ठेवण्यासाठी Kern खरेदी करा.", + "purchase_button": "Kern खरेदी करा", + "purchase_title": "Kern अनलॉक करा", + "purchase_desc": "एकदाच खरेदी करून सर्व संपादन आणि निर्यात वैशिष्ट्यांना पूर्ण प्रवेश मिळवा.", + "feature_edit": "WYSIWYG आणि विभाजित दृश्यासह Markdown संपादित करा", + "feature_save": "फाइल्स जतन करा आणि नवीन तयार करा", + "feature_export": "PDF मध्ये निर्यात करा", + "restore_purchases": "खरेदी पुनर्स्थापित करा", + "one_time_purchase": "एकदाच खरेदी. सदस्यता नाही.", + "purchasing": "खरेदी होत आहे...", + "restoring": "पुनर्स्थापित होत आहे..." + } +} diff --git a/src-mdviewer/src/locales/nb.json b/src-mdviewer/src/locales/nb.json new file mode 100644 index 0000000000..8aec96ac1d --- /dev/null +++ b/src-mdviewer/src/locales/nb.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Lukk søk", + "edit_link": "Rediger lenke", + "format_text": "Formater tekst", + "insert_block": "Sett inn blokk", + "main_toolbar": "Hovedverktøylinje", + "next_match": "Neste treff", + "previous_match": "Forrige treff", + "search_in_document": "Søk i dokument", + "search_text": "Søketekst", + "select_language": "Velg språk", + "sidebar": "Sidelinje", + "skip_to_content": "Hopp til innhold" + }, + "common": { + "close": "Lukk", + "file": "Fil", + "open": "Åpne" + }, + "context": { + "copy": "Kopier", + "copy_image_address": "Kopier bildeadresse", + "copy_link": "Kopier lenke", + "cut": "Klipp ut", + "open_link": "Åpne lenke", + "paste": "Lim inn", + "paste_plain": "Lim inn som ren tekst", + "select_all": "Merk alt" + }, + "dialog": { + "cancel": "Avbryt", + "discard": "Forkast", + "dont_save": "Ikke lagre", + "save": "Lagre", + "unsaved_close": "Du har ulagrede endringer. Vil du lagre før du lukker?", + "unsaved_exit_edit": "Du har ulagrede endringer. Vil du lagre før du avslutter redigeringsmodus?", + "unsaved_new_file": "Du har ulagrede endringer. Vil du lagre før du oppretter en ny fil?", + "unsaved_open_file": "Du har ulagrede endringer. Vil du lagre før du åpner en ny fil?", + "unsaved_title": "Ulagrede endringer" + }, + "drop_zone": { + "text": "Slipp Markdown-filen din her" + }, + "export": { + "open": "Åpne", + "success": "PDF eksportert" + }, + "format": { + "block_type": "Blokktype", + "blockquote": "Sitatblokk", + "bold": "Fet ({mod}+B)", + "bullet_list": "Punktliste", + "code": "Innebygd kode ({mod}+E)", + "code_block": "Kodeblokk", + "divider": "Skillelinje", + "heading1": "Overskrift 1", + "heading2": "Overskrift 2", + "heading3": "Overskrift 3", + "italic": "Kursiv ({mod}+I)", + "link": "Lenke ({mod}+K)", + "lists": "Lister", + "more_elements": "Mer", + "numbered_list": "Nummerert liste", + "paragraph": "Avsnitt", + "strikethrough": "Gjennomstreking ({mod}+Shift+X)", + "table": "Tabell", + "task_list": "Oppgaveliste", + "text_formatting": "Tekstformatering", + "underline": "Understreking" + }, + "help": { + "editing": "Redigering", + "fallback_notice": "Denne siden er ennå ikke tilgjengelig på ditt språk. Viser den engelske versjonen.", + "features": "Funksjoner", + "getting_started": "Kom i gang", + "shortcuts": "Tastatursnarveier" + }, + "lang_picker": { + "filter_label": "Filtrer språk", + "filter_placeholder": "Filtrer språk...", + "plain_text": "Ren tekst" + }, + "link": { + "apply": "Bruk lenke", + "cancel": "Avbryt", + "display_text": "Visningstekst", + "edit": "Rediger", + "edit_link": "Rediger lenke", + "remove_link": "Fjern lenke", + "text": "Tekst", + "text_placeholder": "Visningstekst (valgfritt)", + "url": "URL", + "url_placeholder": "Lim inn eller skriv URL ..." + }, + "mermaid": { + "done": "Ferdig", + "edit": "Rediger", + "error_prefix": "Syntaksfeil", + "stale": "Forhåndsvisning utdatert" + }, + "recovery": { + "discard": "Forkast", + "message": "Kern fant ulagrede endringer fra en tidligere økt. Vil du gjenopprette dem?", + "restore": "Gjenopprett", + "title": "Gjenopprette ulagrede endringer?" + }, + "search": { + "count": "treff", + "no_results": "Ingen resultater", + "placeholder": "Søk i dokumentet …" + }, + "settings": { + "language": "Språk", + "theme": "Tema", + "theme_dark": "Mørk", + "theme_light": "Lys", + "theme_system": "System" + }, + "sidebar": { + "no_headings": "Ingen overskrifter funnet", + "recent": "Siste filer", + "toc": "Innholdsfortegnelse" + }, + "slash": { + "blockquote": "Sitatblokk", + "blockquote_desc": "Sitatblokk", + "bullet_list": "Punktliste", + "bullet_list_desc": "Uordnet liste", + "code_block": "Kodeblokk", + "code_block_desc": "Inngjerdet kode", + "divider": "Skillelinje", + "divider_desc": "Horisontal linje", + "heading1": "Overskrift 1", + "heading1_desc": "Stor overskrift", + "heading2": "Overskrift 2", + "heading2_desc": "Middels stor overskrift", + "heading3": "Overskrift 3", + "heading3_desc": "Liten overskrift", + "mermaid": "Mermaid-diagram", + "mermaid_desc": "Sett inn et diagram", + "no_results": "Ingen resultater", + "numbered_list": "Nummerert liste", + "numbered_list_desc": "Ordnet liste", + "paragraph": "Avsnitt", + "paragraph_desc": "Vanlig tekst", + "table": "Tabell", + "table_desc": "3×3-tabell", + "task_list": "Oppgaveliste", + "task_list_desc": "Sjekkliste" + }, + "table": { + "add_col_left": "Legg til kolonne til venstre", + "add_col_right": "Legg til kolonne til høyre", + "add_row_above": "Legg til rad over", + "add_row_below": "Legg til rad under", + "col_options": "Alternativer for kolonne {n}", + "delete_col": "Slett kolonne", + "delete_row": "Slett rad", + "header": "Overskrift", + "insert_col_left": "Sett inn kolonne til venstre", + "insert_col_right": "Sett inn kolonne til høyre", + "insert_row_above": "Sett inn rad over", + "insert_row_below": "Sett inn rad under", + "new_row": "+ Ny rad", + "row_options": "Alternativer for rad {n}" + }, + "toolbar": { + "done": "Ferdig", + "edit": "Rediger", + "export_pdf": "Eksporter PDF", + "focus": "Fokusmodus", + "more": "Mer", + "new_file": "Ny fil", + "open": "Åpne fil", + "save": "Lagre", + "search": "Søk", + "settings": "Innstillinger", + "split_view": "Delt visning", + "theme": "Bytt tema", + "toc": "Innholdsfortegnelse", + "zoom_in": "Zoom inn", + "zoom_out": "Zoom ut", + "zoom_reset": "Tilbakestill zoom" + }, + "trial": { + "days_remaining": "{days} dager igjen av prøveperioden", + "expired_message": "Prøveperioden din har utløpt. Kjøp Kern for å fortsette å redigere.", + "feature_edit": "Rediger Markdown med WYSIWYG og delt visning", + "feature_export": "Eksporter til PDF", + "feature_save": "Lagre og opprett nye filer", + "one_time_purchase": "Engangskjøp. Ikke noe abonnement.", + "purchase_button": "Kjøp Kern", + "purchase_desc": "Få full tilgang til alle redigerings- og eksportfunksjoner med et engangskjøp.", + "purchase_title": "Lås opp Kern", + "purchasing": "Kjøper ...", + "restore_purchases": "Gjenopprett kjøp", + "restoring": "Gjenoppretter ..." + }, + "viewer": { + "copied": "Kopiert!", + "copy": "Kopier" + }, + "welcome": { + "drop_hint": "eller dra og slipp en .md-fil", + "new_button": "Ny fil", + "open_button": "Åpne fil", + "subtitle": "En vakker Markdown-fremviser", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/nl.json b/src-mdviewer/src/locales/nl.json new file mode 100644 index 0000000000..ffaafaee09 --- /dev/null +++ b/src-mdviewer/src/locales/nl.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Zoeken sluiten", + "edit_link": "Link bewerken", + "format_text": "Tekst opmaken", + "insert_block": "Blok invoegen", + "main_toolbar": "Hoofdwerkbalk", + "next_match": "Volgende overeenkomst", + "previous_match": "Vorige overeenkomst", + "search_in_document": "Zoeken in document", + "search_text": "Tekst zoeken", + "select_language": "Taal selecteren", + "sidebar": "Zijbalk", + "skip_to_content": "Ga direct naar de inhoud" + }, + "common": { + "close": "Sluiten", + "file": "Bestand", + "open": "Openen" + }, + "context": { + "copy": "Kopiëren", + "copy_image_address": "Afbeeldingsadres kopiëren", + "copy_link": "Link kopiëren", + "cut": "Knippen", + "open_link": "Link openen", + "paste": "Plakken", + "paste_plain": "Plakken als platte tekst", + "select_all": "Alles selecteren" + }, + "dialog": { + "cancel": "Annuleren", + "discard": "Verwerpen", + "dont_save": "Niet opslaan", + "save": "Opslaan", + "unsaved_close": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u sluit?", + "unsaved_exit_edit": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u de bewerkingsmodus verlaat?", + "unsaved_new_file": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u een nieuw bestand aanmaakt?", + "unsaved_open_file": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u een nieuw bestand opent?", + "unsaved_title": "Niet-opgeslagen wijzigingen" + }, + "drop_zone": { + "text": "Sleep uw Markdown-bestand hierheen" + }, + "export": { + "open": "Openen", + "success": "PDF succesvol geëxporteerd" + }, + "format": { + "block_type": "Bloktype", + "blockquote": "Blokcitaat", + "bold": "Vet ({mod}+B)", + "bullet_list": "Opsommingslijst", + "code": "Inline code ({mod}+E)", + "code_block": "Codeblok", + "divider": "Scheidingslijn", + "heading1": "Kop 1", + "heading2": "Kop 2", + "heading3": "Kop 3", + "italic": "Cursief ({mod}+I)", + "link": "Link ({mod}+K)", + "lists": "Lijsten", + "more_elements": "Meer", + "numbered_list": "Genummerde lijst", + "paragraph": "Paragraaf", + "strikethrough": "Doorhalen ({mod}+Shift+X)", + "table": "Tabel", + "task_list": "Takenlijst", + "text_formatting": "Tekstopmaak", + "underline": "Onderstrepen" + }, + "help": { + "editing": "Bewerken", + "fallback_notice": "Deze pagina is nog niet beschikbaar in uw taal. De Engelse versie wordt getoond.", + "features": "Functies", + "getting_started": "Aan de slag", + "shortcuts": "Sneltoetsen" + }, + "lang_picker": { + "filter_label": "Talen filteren", + "filter_placeholder": "Talen filteren...", + "plain_text": "Platte tekst" + }, + "link": { + "apply": "Link toepassen", + "cancel": "Annuleren", + "display_text": "Weergavetekst", + "edit": "Bewerken", + "edit_link": "Link bewerken", + "remove_link": "Link verwijderen", + "text": "Tekst", + "text_placeholder": "Weergavetekst (optioneel)", + "url": "URL", + "url_placeholder": "Plak of typ een URL..." + }, + "mermaid": { + "done": "Klaar", + "edit": "Bewerken", + "error_prefix": "Syntaxfout", + "stale": "Voorbeeld verouderd" + }, + "recovery": { + "discard": "Verwerpen", + "message": "Kern heeft niet-opgeslagen wijzigingen van een vorige sessie gevonden. Wilt u deze herstellen?", + "restore": "Herstellen", + "title": "Niet-opgeslagen wijzigingen herstellen?" + }, + "search": { + "count": "resultaten", + "no_results": "Geen resultaten", + "placeholder": "Zoeken in document..." + }, + "settings": { + "language": "Taal", + "theme": "Thema", + "theme_dark": "Donker", + "theme_light": "Licht", + "theme_system": "Systeem" + }, + "sidebar": { + "no_headings": "Geen koppen gevonden", + "recent": "Recente bestanden", + "toc": "Inhoudsopgave" + }, + "slash": { + "blockquote": "Citaatblok", + "blockquote_desc": "Citaatblok", + "bullet_list": "Opsommingslijst", + "bullet_list_desc": "Ongesorteerde lijst", + "code_block": "Codeblok", + "code_block_desc": "Afgebakende code", + "divider": "Scheidingslijn", + "divider_desc": "Horizontale lijn", + "heading1": "Kop 1", + "heading1_desc": "Grote kop", + "heading2": "Kop 2", + "heading2_desc": "Middelgrote kop", + "heading3": "Kop 3", + "heading3_desc": "Kleine kop", + "mermaid": "Mermaid-diagram", + "mermaid_desc": "Voeg een diagram in", + "no_results": "Geen resultaten", + "numbered_list": "Genummerde lijst", + "numbered_list_desc": "Geordende lijst", + "paragraph": "Paragraaf", + "paragraph_desc": "Platte tekst", + "table": "Tabel", + "table_desc": "3×3 tabel", + "task_list": "Takenlijst", + "task_list_desc": "Checklist" + }, + "table": { + "add_col_left": "Kolom links toevoegen", + "add_col_right": "Kolom rechts toevoegen", + "add_row_above": "Rij boven toevoegen", + "add_row_below": "Rij onder toevoegen", + "col_options": "Kolom {n} opties", + "delete_col": "Kolom verwijderen", + "delete_row": "Rij verwijderen", + "header": "Koptekst", + "insert_col_left": "Kolom links invoegen", + "insert_col_right": "Kolom rechts invoegen", + "insert_row_above": "Rij boven invoegen", + "insert_row_below": "Rij onder invoegen", + "new_row": "+ Nieuwe rij", + "row_options": "Opties voor rij {n}" + }, + "toolbar": { + "done": "Klaar", + "edit": "Bewerken", + "export_pdf": "Exporteer PDF", + "focus": "Focusmodus", + "more": "Meer", + "new_file": "Nieuw bestand", + "open": "Bestand openen", + "save": "Opslaan", + "search": "Zoeken", + "settings": "Instellingen", + "split_view": "Gesplitste weergave", + "theme": "Thema wisselen", + "toc": "Inhoudsopgave", + "zoom_in": "Inzoomen", + "zoom_out": "Uitzoomen", + "zoom_reset": "Zoom herstellen" + }, + "trial": { + "days_remaining": "Nog {days} dagen in proefperiode", + "expired_message": "Uw proefperiode is verlopen. Koop Kern om door te gaan met bewerken.", + "feature_edit": "Markdown bewerken met WYSIWYG en gesplitste weergave", + "feature_export": "Exporteren naar PDF", + "feature_save": "Bestanden opslaan en aanmaken", + "one_time_purchase": "Eenmalige aankoop. Geen abonnement.", + "purchase_button": "Koop Kern", + "purchase_desc": "Krijg volledige toegang tot alle bewerkings- en exportfuncties met een eenmalige aankoop.", + "purchase_title": "Ontgrendel Kern", + "purchasing": "Aankopen...", + "restore_purchases": "Aankopen herstellen", + "restoring": "Herstellen..." + }, + "viewer": { + "copied": "Gekopieerd!", + "copy": "Kopiëren" + }, + "welcome": { + "drop_hint": "of sleep een .md-bestand hierheen", + "new_button": "Nieuw bestand", + "open_button": "Bestand openen", + "subtitle": "Een prachtige Markdown-viewer", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/pa.json b/src-mdviewer/src/locales/pa.json new file mode 100644 index 0000000000..ed2df3f308 --- /dev/null +++ b/src-mdviewer/src/locales/pa.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "ਫਾਈਲ ਖੋਲ੍ਹੋ", + "theme": "ਥੀਮ ਬਦਲੋ", + "toc": "ਵਿਸ਼ਾ ਸੂਚੀ", + "search": "ਖੋਜੋ", + "focus": "ਫੋਕਸ ਮੋਡ", + "zoom_in": "ਜ਼ੂਮ ਇਨ", + "zoom_out": "ਜ਼ੂਮ ਆਊਟ", + "zoom_reset": "ਜ਼ੂਮ ਰੀਸੈੱਟ", + "save": "ਸੇਵ", + "edit": "ਸੰਪਾਦਨ", + "new_file": "ਨਵੀਂ ਫਾਈਲ", + "split_view": "ਵੰਡਿਆ ਦ੍ਰਿਸ਼", + "export_pdf": "PDF ਨਿਰਯਾਤ ਕਰੋ", + "settings": "ਸੈਟਿੰਗਾਂ", + "more": "ਹੋਰ" + }, + "sidebar": { + "toc": "ਵਿਸ਼ਾ ਸੂਚੀ", + "recent": "ਹਾਲ ਦੀਆਂ ਫਾਈਲਾਂ", + "no_headings": "ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ ਮਿਲੇ" + }, + "search": { + "placeholder": "ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਖੋਜੋ...", + "count": "ਮੇਲ", + "no_results": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ" + }, + "welcome": { + "title": "Kern", + "subtitle": "ਇੱਕ ਸੁੰਦਰ ਮਾਰਕਡਾਊਨ ਵਿਊਅਰ", + "new_button": "ਨਵੀਂ ਫਾਈਲ", + "open_button": "ਫਾਈਲ ਖੋਲ੍ਹੋ", + "drop_hint": "ਜਾਂ .md ਫਾਈਲ ਖਿੱਚ ਕੇ ਛੱਡੋ" + }, + "viewer": { + "copy": "ਕਾਪੀ", + "copied": "ਕਾਪੀ ਹੋ ਗਿਆ!" + }, + "settings": { + "theme": "ਥੀਮ", + "theme_light": "ਹਲਕਾ", + "theme_dark": "ਗੂੜ੍ਹਾ", + "theme_system": "ਸਿਸਟਮ", + "language": "ਭਾਸ਼ਾ" + }, + "common": { + "close": "ਬੰਦ", + "open": "ਖੋਲ੍ਹੋ", + "file": "ਫਾਈਲ" + }, + "format": { + "paragraph": "ਪੈਰਾ", + "heading1": "ਸਿਰਲੇਖ 1", + "heading2": "ਸਿਰਲੇਖ 2", + "heading3": "ਸਿਰਲੇਖ 3", + "bold": "ਬੋਲਡ ({mod}+B)", + "italic": "ਇਟੈਲਿਕ ({mod}+I)", + "strikethrough": "ਸਟ੍ਰਾਈਕਥਰੂ ({mod}+Shift+X)", + "code": "ਇਨਲਾਈਨ ਕੋਡ ({mod}+E)", + "link": "ਲਿੰਕ ({mod}+K)", + "bullet_list": "ਬੁਲੇਟ ਸੂਚੀ", + "numbered_list": "ਨੰਬਰ ਸੂਚੀ", + "task_list": "ਕੰਮ ਸੂਚੀ", + "blockquote": "ਬਲਾਕਕੋਟ", + "divider": "ਵੰਡਣ ਵਾਲਾ", + "table": "ਟੇਬਲ", + "code_block": "ਕੋਡ ਬਲਾਕ" + }, + "slash": { + "paragraph": "ਪੈਰਾ", + "paragraph_desc": "ਸਾਦਾ ਟੈਕਸਟ", + "heading1": "ਸਿਰਲੇਖ 1", + "heading1_desc": "ਵੱਡਾ ਸਿਰਲੇਖ", + "heading2": "ਸਿਰਲੇਖ 2", + "heading2_desc": "ਮੱਧਮ ਸਿਰਲੇਖ", + "heading3": "ਸਿਰਲੇਖ 3", + "heading3_desc": "ਛੋਟਾ ਸਿਰਲੇਖ", + "bullet_list": "ਬੁਲੇਟ ਸੂਚੀ", + "bullet_list_desc": "ਬੇਤਰਤੀਬ ਸੂਚੀ", + "numbered_list": "ਨੰਬਰ ਸੂਚੀ", + "numbered_list_desc": "ਤਰਤੀਬ ਸੂਚੀ", + "task_list": "ਕੰਮ ਸੂਚੀ", + "task_list_desc": "ਚੈੱਕਲਿਸਟ", + "blockquote": "ਬਲਾਕਕੋਟ", + "blockquote_desc": "ਹਵਾਲਾ ਬਲਾਕ", + "code_block": "ਕੋਡ ਬਲਾਕ", + "code_block_desc": "ਫੈਂਸਡ ਕੋਡ", + "table": "ਟੇਬਲ", + "table_desc": "3×3 ਟੇਬਲ", + "divider": "ਵੰਡਣ ਵਾਲਾ", + "divider_desc": "ਲੇਟਵੀਂ ਲਾਈਨ", + "no_results": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ" + }, + "link": { + "edit": "ਸੰਪਾਦਨ", + "edit_link": "ਲਿੰਕ ਸੰਪਾਦਿਤ ਕਰੋ", + "remove_link": "ਲਿੰਕ ਹਟਾਓ", + "text": "ਟੈਕਸਟ", + "text_placeholder": "ਡਿਸਪਲੇ ਟੈਕਸਟ (ਵਿਕਲਪਿਕ)", + "display_text": "ਡਿਸਪਲੇ ਟੈਕਸਟ", + "url": "URL", + "url_placeholder": "URL ਪੇਸਟ ਕਰੋ ਜਾਂ ਟਾਈਪ ਕਰੋ...", + "apply": "ਲਿੰਕ ਲਾਗੂ ਕਰੋ", + "cancel": "ਰੱਦ ਕਰੋ" + }, + "table": { + "header": "ਹੈੱਡਰ", + "new_row": "+ ਨਵੀਂ ਕਤਾਰ", + "row_options": "ਕਤਾਰ {n} ਵਿਕਲਪ", + "col_options": "ਕਾਲਮ {n} ਵਿਕਲਪ", + "insert_row_above": "ਉੱਪਰ ਕਤਾਰ ਪਾਓ", + "insert_row_below": "ਹੇਠਾਂ ਕਤਾਰ ਪਾਓ", + "delete_row": "ਕਤਾਰ ਮਿਟਾਓ", + "insert_col_left": "ਖੱਬੇ ਕਾਲਮ ਪਾਓ", + "insert_col_right": "ਸੱਜੇ ਕਾਲਮ ਪਾਓ", + "delete_col": "ਕਾਲਮ ਮਿਟਾਓ", + "add_row_above": "ਉੱਪਰ ਕਤਾਰ ਜੋੜੋ", + "add_row_below": "ਹੇਠਾਂ ਕਤਾਰ ਜੋੜੋ", + "add_col_left": "ਖੱਬੇ ਕਾਲਮ ਜੋੜੋ", + "add_col_right": "ਸੱਜੇ ਕਾਲਮ ਜੋੜੋ" + }, + "dialog": { + "unsaved_title": "ਸੇਵ ਨਾ ਕੀਤੇ ਬਦਲਾਅ", + "unsaved_exit_edit": "ਸੇਵ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਹਨ। ਸੰਪਾਦਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਆਉਣ ਤੋਂ ਪਹਿਲਾਂ ਸੇਵ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "unsaved_new_file": "ਸੇਵ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਹਨ। ਨਵੀਂ ਫਾਈਲ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਸੇਵ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "unsaved_open_file": "ਸੇਵ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਹਨ। ਨਵੀਂ ਫਾਈਲ ਖੋਲ੍ਹਣ ਤੋਂ ਪਹਿਲਾਂ ਸੇਵ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "save": "ਸੇਵ", + "discard": "ਰੱਦ ਕਰੋ", + "dont_save": "ਸੇਵ ਨਾ ਕਰੋ", + "cancel": "ਰੱਦ ਕਰੋ", + "unsaved_close": "ਤੁਹਾਡੇ ਕੋਲ ਸੁਰੱਖਿਅਤ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਹਨ। ਬੰਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸੁਰੱਖਿਅਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?" + }, + "lang_picker": { + "filter_placeholder": "ਭਾਸ਼ਾਵਾਂ ਫਿਲਟਰ ਕਰੋ...", + "filter_label": "ਭਾਸ਼ਾਵਾਂ ਫਿਲਟਰ ਕਰੋ", + "plain_text": "ਸਾਦਾ ਟੈਕਸਟ" + }, + "a11y": { + "skip_to_content": "ਸਮੱਗਰੀ ਤੇ ਜਾਓ", + "main_toolbar": "ਮੁੱਖ ਟੂਲਬਾਰ", + "sidebar": "ਸਾਈਡਬਾਰ", + "search_text": "ਟੈਕਸਟ ਖੋਜੋ", + "previous_match": "ਪਿਛਲਾ ਮੇਲ", + "next_match": "ਅਗਲਾ ਮੇਲ", + "close_search": "ਖੋਜ ਬੰਦ ਕਰੋ", + "format_text": "ਟੈਕਸਟ ਫਾਰਮੈਟ", + "edit_link": "ਲਿੰਕ ਸੰਪਾਦਿਤ ਕਰੋ", + "insert_block": "ਬਲਾਕ ਪਾਓ", + "select_language": "ਭਾਸ਼ਾ ਚੁਣੋ", + "search_in_document": "ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਖੋਜੋ" + }, + "drop_zone": { + "text": "ਆਪਣੀ ਮਾਰਕਡਾਊਨ ਫਾਈਲ ਇੱਥੇ ਛੱਡੋ" + }, + "help": { + "getting_started": "ਸ਼ੁਰੂ ਕਰੋ", + "editing": "ਸੰਪਾਦਨ", + "shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", + "features": "ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ", + "fallback_notice": "ਇਹ ਪੰਨਾ ਅਜੇ ਤੁਹਾਡੀ ਭਾਸ਼ਾ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਅੰਗਰੇਜ਼ੀ ਸੰਸਕਰਨ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ।" + }, + "recovery": { + "title": "ਸੁਰੱਖਿਅਤ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰੋ?", + "message": "Kern ਨੇ ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਸੁਰੱਖਿਅਤ ਨਾ ਕੀਤੇ ਬਦਲਾਅ ਲੱਭੇ। ਕੀ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "restore": "ਬਹਾਲ ਕਰੋ", + "discard": "ਰੱਦ ਕਰੋ" + }, + "export": { + "success": "PDF ਸਫਲਤਾਪੂਰਵਕ ਨਿਰਯਾਤ ਹੋਈ", + "open": "ਖੋਲੋ" + }, + "context": { + "cut": "ਕੱਟੋ", + "copy": "ਕਾਪੀ ਕਰੋ", + "paste": "ਪੇਸਟ ਕਰੋ", + "paste_plain": "ਸਾਦੇ ਟੈਕਸਟ ਵਜੋਂ ਪੇਸਟ ਕਰੋ", + "select_all": "ਸਭ ਚੁਣੋ", + "copy_link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ", + "open_link": "ਲਿੰਕ ਖੋਲੋ", + "copy_image_address": "ਚਿੱਤਰ ਦਾ ਪਤਾ ਕਾਪੀ ਕਰੋ" + }, + "trial": { + "days_remaining": "ਟ੍ਰਾਇਲ ਵਿੱਚ {days} ਦਿਨ ਬਾਕੀ", + "expired_message": "ਤੁਹਾਡਾ ਟ੍ਰਾਇਲ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ। ਸੰਪਾਦਨ ਜਾਰੀ ਰੱਖਣ ਲਈ Kern ਖਰੀਦੋ।", + "purchase_button": "Kern ਖਰੀਦੋ", + "purchase_title": "Kern ਅਨਲੌਕ ਕਰੋ", + "purchase_desc": "ਇੱਕ ਵਾਰ ਦੀ ਖਰੀਦ ਨਾਲ ਸਾਰੀਆਂ ਸੰਪਾਦਨ ਅਤੇ ਨਿਰਯਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪੂਰੀ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ।", + "feature_edit": "WYSIWYG ਅਤੇ ਵੰਡੇ ਦ੍ਰਿਸ਼ ਨਾਲ Markdown ਸੰਪਾਦਿਤ ਕਰੋ", + "feature_save": "ਫਾਈਲਾਂ ਸੇਵ ਕਰੋ ਅਤੇ ਨਵੀਆਂ ਬਣਾਓ", + "feature_export": "PDF ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ", + "restore_purchases": "ਖਰੀਦਾਂ ਬਹਾਲ ਕਰੋ", + "one_time_purchase": "ਇੱਕ ਵਾਰ ਦੀ ਖਰੀਦ। ਕੋਈ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨਹੀਂ।", + "purchasing": "ਖਰੀਦ ਹੋ ਰਹੀ ਹੈ...", + "restoring": "ਬਹਾਲ ਹੋ ਰਿਹਾ ਹੈ..." + } +} diff --git a/src-mdviewer/src/locales/pl.json b/src-mdviewer/src/locales/pl.json new file mode 100644 index 0000000000..343c5d91cd --- /dev/null +++ b/src-mdviewer/src/locales/pl.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Zamknij wyszukiwanie", + "edit_link": "Edytuj link", + "format_text": "Formatuj tekst", + "insert_block": "Wstaw blok", + "main_toolbar": "Główny pasek narzędzi", + "next_match": "Następny wynik", + "previous_match": "Poprzedni wynik", + "search_in_document": "Szukaj w dokumencie", + "search_text": "Wyszukaj tekst", + "select_language": "Wybierz język", + "sidebar": "Pasek boczny", + "skip_to_content": "Przejdź do treści" + }, + "common": { + "close": "Zamknij", + "file": "Plik", + "open": "Otwórz" + }, + "context": { + "copy": "Kopiuj", + "copy_image_address": "Kopiuj adres obrazka", + "copy_link": "Kopiuj link", + "cut": "Wytnij", + "open_link": "Otwórz link", + "paste": "Wklej", + "paste_plain": "Wklej jako zwykły tekst", + "select_all": "Zaznacz wszystko" + }, + "dialog": { + "cancel": "Anuluj", + "discard": "Odrzuć", + "dont_save": "Nie zapisuj", + "save": "Zapisz", + "unsaved_close": "Masz niezapisane zmiany. Czy chcesz je zapisać przed zamknięciem?", + "unsaved_exit_edit": "Masz niezapisane zmiany. Czy chcesz je zapisać przed wyjściem z trybu edycji?", + "unsaved_new_file": "Masz niezapisane zmiany. Czy chcesz je zapisać przed utworzeniem nowego pliku?", + "unsaved_open_file": "Masz niezapisane zmiany. Czy chcesz je zapisać przed otwarciem nowego pliku?", + "unsaved_title": "Niezapisane zmiany" + }, + "drop_zone": { + "text": "Upuść tutaj swój plik Markdown" + }, + "export": { + "open": "Otwórz", + "success": "Plik PDF został pomyślnie wyeksportowany" + }, + "format": { + "block_type": "Typ bloku", + "blockquote": "Cytat blokowy", + "bold": "Pogrubienie ({mod}+B)", + "bullet_list": "Lista wypunktowana", + "code": "Kod w tekście ({mod}+E)", + "code_block": "Blok kodu", + "divider": "Separator", + "heading1": "Nagłówek 1", + "heading2": "Nagłówek 2", + "heading3": "Nagłówek 3", + "italic": "Kursywa ({mod}+I)", + "link": "Link ({mod}+K)", + "lists": "Listy", + "more_elements": "Więcej", + "numbered_list": "Lista numerowana", + "paragraph": "Akapit", + "strikethrough": "Przekreślenie ({mod}+Shift+X)", + "table": "Tabela", + "task_list": "Lista zadań", + "text_formatting": "Formatowanie tekstu", + "underline": "Podkreślenie" + }, + "help": { + "editing": "Edycja", + "fallback_notice": "Ta strona nie jest jeszcze dostępna w Twoim języku. Wyświetlana jest wersja angielska.", + "features": "Funkcje", + "getting_started": "Pierwsze kroki", + "shortcuts": "Skróty klawiszowe" + }, + "lang_picker": { + "filter_label": "Filtruj języki", + "filter_placeholder": "Filtruj języki...", + "plain_text": "Zwykły tekst" + }, + "link": { + "apply": "Zastosuj", + "cancel": "Anuluj", + "display_text": "Wyświetlany tekst", + "edit": "Edytuj", + "edit_link": "Edytuj link", + "remove_link": "Usuń link", + "text": "Tekst", + "text_placeholder": "Wyświetlany tekst (opcjonalnie)", + "url": "URL", + "url_placeholder": "Wklej lub wpisz adres URL..." + }, + "mermaid": { + "done": "Gotowe", + "edit": "Edytuj", + "error_prefix": "Błąd składni", + "stale": "Podgląd nieaktualny" + }, + "recovery": { + "discard": "Odrzuć", + "message": "Aplikacja Kern znalazła niezapisane zmiany z poprzedniej sesji. Czy chcesz je przywrócić?", + "restore": "Przywróć", + "title": "Przywrócić niezapisane zmiany?" + }, + "search": { + "count": "wyników", + "no_results": "Brak wyników", + "placeholder": "Szukaj w dokumencie..." + }, + "settings": { + "language": "Język", + "theme": "Motyw", + "theme_dark": "Ciemny", + "theme_light": "Jasny", + "theme_system": "Systemowy" + }, + "sidebar": { + "no_headings": "Nie znaleziono nagłówków", + "recent": "Ostatnie pliki", + "toc": "Spis treści" + }, + "slash": { + "blockquote": "Cytat blokowy", + "blockquote_desc": "Blok cytatu", + "bullet_list": "Lista wypunktowana", + "bullet_list_desc": "Lista nieuporządkowana", + "code_block": "Blok kodu", + "code_block_desc": "Kod sformatowany", + "divider": "Linia pozioma", + "divider_desc": "Linia pozioma", + "heading1": "Nagłówek 1", + "heading1_desc": "Duży nagłówek", + "heading2": "Nagłówek 2", + "heading2_desc": "Średni nagłówek", + "heading3": "Nagłówek 3", + "heading3_desc": "Mały nagłówek", + "mermaid": "Diagram Mermaid", + "mermaid_desc": "Wstaw diagram", + "no_results": "Brak wyników", + "numbered_list": "Lista numerowana", + "numbered_list_desc": "Lista uporządkowana", + "paragraph": "Akapit", + "paragraph_desc": "Zwykły tekst", + "table": "Tabela", + "table_desc": "Tabela 3×3", + "task_list": "Lista zadań", + "task_list_desc": "Lista kontrolna" + }, + "table": { + "add_col_left": "Dodaj kolumnę po lewej", + "add_col_right": "Dodaj kolumnę po prawej", + "add_row_above": "Dodaj wiersz powyżej", + "add_row_below": "Dodaj wiersz poniżej", + "col_options": "Opcje kolumny {n}", + "delete_col": "Usuń kolumnę", + "delete_row": "Usuń wiersz", + "header": "Nagłówek", + "insert_col_left": "Wstaw kolumnę po lewej", + "insert_col_right": "Wstaw kolumnę po prawej", + "insert_row_above": "Wstaw wiersz powyżej", + "insert_row_below": "Wstaw wiersz poniżej", + "new_row": "+ Nowy wiersz", + "row_options": "Opcje wiersza {n}" + }, + "toolbar": { + "done": "Gotowe", + "edit": "Edytuj", + "export_pdf": "Eksportuj PDF", + "focus": "Tryb skupienia", + "more": "Więcej", + "new_file": "Nowy plik", + "open": "Otwórz plik", + "save": "Zapisz", + "search": "Szukaj", + "settings": "Ustawienia", + "split_view": "Widok podzielony", + "theme": "Przełącz motyw", + "toc": "Spis treści", + "zoom_in": "Powiększ", + "zoom_out": "Pomniejsz", + "zoom_reset": "Resetuj powiększenie" + }, + "trial": { + "days_remaining": "Pozostało {days} dni okresu próbnego", + "expired_message": "Twój okres próbny wygasł. Kup Kern, aby kontynuować edycję.", + "feature_edit": "Edytuj Markdown w trybie WYSIWYG i widoku podzielonym", + "feature_export": "Eksport do PDF", + "feature_save": "Zapisuj i twórz nowe pliki", + "one_time_purchase": "Jednorazowy zakup. Bez subskrypcji.", + "purchase_button": "Kup Kern", + "purchase_desc": "Uzyskaj pełny dostęp do wszystkich funkcji edycji i eksportu dzięki jednorazowemu zakupowi.", + "purchase_title": "Odblokuj Kern", + "purchasing": "Kupowanie...", + "restore_purchases": "Przywróć zakupy", + "restoring": "Przywracanie..." + }, + "viewer": { + "copied": "Skopiowano!", + "copy": "Kopiuj" + }, + "welcome": { + "drop_hint": "lub przeciągnij i upuść plik .md", + "new_button": "Nowy plik", + "open_button": "Otwórz plik", + "subtitle": "Piękna przeglądarka Markdown", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/pt-br.json b/src-mdviewer/src/locales/pt-br.json new file mode 100644 index 0000000000..31194a7d76 --- /dev/null +++ b/src-mdviewer/src/locales/pt-br.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Fechar pesquisa", + "edit_link": "Editar link", + "format_text": "Formatar texto", + "insert_block": "Inserir bloco", + "main_toolbar": "Barra de ferramentas principal", + "next_match": "Próximo resultado", + "previous_match": "Resultado anterior", + "search_in_document": "Pesquisar no documento", + "search_text": "Pesquisar texto", + "select_language": "Selecionar linguagem", + "sidebar": "Barra lateral", + "skip_to_content": "Pular para o conteúdo" + }, + "common": { + "close": "Fechar", + "file": "Arquivo", + "open": "Abrir" + }, + "context": { + "copy": "Copiar", + "copy_image_address": "Copiar endereço da imagem", + "copy_link": "Copiar link", + "cut": "Recortar", + "open_link": "Abrir link", + "paste": "Colar", + "paste_plain": "Colar como texto simples", + "select_all": "Selecionar tudo" + }, + "dialog": { + "cancel": "Cancelar", + "discard": "Descartar", + "dont_save": "Não salvar", + "save": "Salvar", + "unsaved_close": "Você tem alterações não salvas. Deseja salvar antes de fechar?", + "unsaved_exit_edit": "Você tem alterações não salvas. Deseja salvar antes de sair do modo de edição?", + "unsaved_new_file": "Você tem alterações não salvas. Deseja salvar antes de criar um novo arquivo?", + "unsaved_open_file": "Você tem alterações não salvas. Deseja salvar antes de abrir um novo arquivo?", + "unsaved_title": "Alterações não salvas" + }, + "drop_zone": { + "text": "Solte seu arquivo Markdown aqui" + }, + "export": { + "open": "Abrir", + "success": "PDF exportado com sucesso" + }, + "format": { + "blockquote": "Citação", + "bold": "Negrito ({mod}+B)", + "bullet_list": "Lista com marcadores", + "code": "Código inline ({mod}+E)", + "code_block": "Bloco de código", + "divider": "Divisor", + "heading1": "Título 1", + "heading2": "Título 2", + "heading3": "Título 3", + "italic": "Itálico ({mod}+I)", + "link": "Link ({mod}+K)", + "numbered_list": "Lista numerada", + "paragraph": "Parágrafo", + "strikethrough": "Tachado ({mod}+Shift+X)", + "table": "Tabela", + "task_list": "Lista de tarefas", + "block_type": "Tipo de bloco", + "lists": "Listas", + "more_elements": "Mais", + "text_formatting": "Formatação de texto", + "underline": "Sublinhado" + }, + "help": { + "editing": "Edição", + "fallback_notice": "Esta página ainda não está disponível no seu idioma. Exibindo a versão em inglês.", + "features": "Funcionalidades", + "getting_started": "Primeiros passos", + "shortcuts": "Atalhos de teclado" + }, + "lang_picker": { + "filter_label": "Filtrar linguagens", + "filter_placeholder": "Filtrar linguagens...", + "plain_text": "Texto simples" + }, + "link": { + "apply": "Aplicar link", + "cancel": "Cancelar", + "display_text": "Texto de exibição", + "edit": "Editar", + "edit_link": "Editar link", + "remove_link": "Remover link", + "text": "Texto", + "text_placeholder": "Texto de exibição (opcional)", + "url": "URL", + "url_placeholder": "Cole ou digite a URL..." + }, + "recovery": { + "discard": "Descartar", + "message": "O Kern encontrou alterações não salvas de uma sessão anterior. Deseja restaurá-las?", + "restore": "Restaurar", + "title": "Recuperar alterações não salvas?" + }, + "search": { + "count": "resultados", + "no_results": "Sem resultados", + "placeholder": "Pesquisar no documento..." + }, + "settings": { + "language": "Idioma", + "theme": "Tema", + "theme_dark": "Escuro", + "theme_light": "Claro", + "theme_system": "Sistema" + }, + "sidebar": { + "no_headings": "Nenhum título encontrado", + "recent": "Arquivos recentes", + "toc": "Sumário" + }, + "slash": { + "blockquote": "Citação", + "blockquote_desc": "Bloco de citação", + "bullet_list": "Lista com marcadores", + "bullet_list_desc": "Lista não ordenada", + "code_block": "Bloco de código", + "code_block_desc": "Código delimitado", + "divider": "Divisor", + "divider_desc": "Linha horizontal", + "heading1": "Título 1", + "heading1_desc": "Título grande", + "heading2": "Título 2", + "heading2_desc": "Título médio", + "heading3": "Título 3", + "heading3_desc": "Título pequeno", + "no_results": "Sem resultados", + "numbered_list": "Lista numerada", + "numbered_list_desc": "Lista ordenada", + "paragraph": "Parágrafo", + "paragraph_desc": "Texto simples", + "table": "Tabela", + "table_desc": "Tabela 3×3", + "task_list": "Lista de tarefas", + "task_list_desc": "Checklist", + "mermaid": "Diagrama Mermaid", + "mermaid_desc": "Inserir um diagrama" + }, + "table": { + "add_col_left": "Adicionar coluna à esquerda", + "add_col_right": "Adicionar coluna à direita", + "add_row_above": "Adicionar linha acima", + "add_row_below": "Adicionar linha abaixo", + "col_options": "Opções da coluna {n}", + "delete_col": "Excluir coluna", + "delete_row": "Excluir linha", + "header": "Cabeçalho", + "insert_col_left": "Inserir coluna à esquerda", + "insert_col_right": "Inserir coluna à direita", + "insert_row_above": "Inserir linha acima", + "insert_row_below": "Inserir linha abaixo", + "new_row": "+ Nova linha", + "row_options": "Opções da linha {n}" + }, + "toolbar": { + "edit": "Editar", + "export_pdf": "Exportar PDF", + "focus": "Modo foco", + "more": "Mais", + "new_file": "Novo arquivo", + "open": "Abrir arquivo", + "save": "Salvar", + "search": "Pesquisar", + "settings": "Configurações", + "split_view": "Vista dividida", + "theme": "Alternar tema", + "toc": "Sumário", + "zoom_in": "Aumentar zoom", + "zoom_out": "Diminuir zoom", + "zoom_reset": "Redefinir zoom", + "done": "Concluído" + }, + "trial": { + "days_remaining": "{days} dias restantes no período de teste", + "expired_message": "Seu período de teste expirou. Compre o Kern para continuar editando.", + "feature_edit": "Edite Markdown com WYSIWYG e vista dividida", + "feature_export": "Exportar para PDF", + "feature_save": "Salve e crie novos arquivos", + "one_time_purchase": "Compra única. Sem assinatura.", + "purchase_button": "Comprar Kern", + "purchase_desc": "Tenha acesso completo a todos os recursos de edição e exportação com uma compra única.", + "purchase_title": "Desbloquear Kern", + "purchasing": "Comprando...", + "restore_purchases": "Restaurar compras", + "restoring": "Restaurando..." + }, + "viewer": { + "copied": "Copiado!", + "copy": "Copiar" + }, + "welcome": { + "drop_hint": "ou arraste e solte um arquivo .md", + "new_button": "Novo arquivo", + "open_button": "Abrir arquivo", + "subtitle": "Um belo visualizador Markdown", + "title": "Kern" + }, + "mermaid": { + "done": "Concluído", + "edit": "Editar", + "error_prefix": "Erro de sintaxe", + "stale": "Pré-visualização desatualizada" + } +} diff --git a/src-mdviewer/src/locales/pt-pt.json b/src-mdviewer/src/locales/pt-pt.json new file mode 100644 index 0000000000..31194a7d76 --- /dev/null +++ b/src-mdviewer/src/locales/pt-pt.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Fechar pesquisa", + "edit_link": "Editar link", + "format_text": "Formatar texto", + "insert_block": "Inserir bloco", + "main_toolbar": "Barra de ferramentas principal", + "next_match": "Próximo resultado", + "previous_match": "Resultado anterior", + "search_in_document": "Pesquisar no documento", + "search_text": "Pesquisar texto", + "select_language": "Selecionar linguagem", + "sidebar": "Barra lateral", + "skip_to_content": "Pular para o conteúdo" + }, + "common": { + "close": "Fechar", + "file": "Arquivo", + "open": "Abrir" + }, + "context": { + "copy": "Copiar", + "copy_image_address": "Copiar endereço da imagem", + "copy_link": "Copiar link", + "cut": "Recortar", + "open_link": "Abrir link", + "paste": "Colar", + "paste_plain": "Colar como texto simples", + "select_all": "Selecionar tudo" + }, + "dialog": { + "cancel": "Cancelar", + "discard": "Descartar", + "dont_save": "Não salvar", + "save": "Salvar", + "unsaved_close": "Você tem alterações não salvas. Deseja salvar antes de fechar?", + "unsaved_exit_edit": "Você tem alterações não salvas. Deseja salvar antes de sair do modo de edição?", + "unsaved_new_file": "Você tem alterações não salvas. Deseja salvar antes de criar um novo arquivo?", + "unsaved_open_file": "Você tem alterações não salvas. Deseja salvar antes de abrir um novo arquivo?", + "unsaved_title": "Alterações não salvas" + }, + "drop_zone": { + "text": "Solte seu arquivo Markdown aqui" + }, + "export": { + "open": "Abrir", + "success": "PDF exportado com sucesso" + }, + "format": { + "blockquote": "Citação", + "bold": "Negrito ({mod}+B)", + "bullet_list": "Lista com marcadores", + "code": "Código inline ({mod}+E)", + "code_block": "Bloco de código", + "divider": "Divisor", + "heading1": "Título 1", + "heading2": "Título 2", + "heading3": "Título 3", + "italic": "Itálico ({mod}+I)", + "link": "Link ({mod}+K)", + "numbered_list": "Lista numerada", + "paragraph": "Parágrafo", + "strikethrough": "Tachado ({mod}+Shift+X)", + "table": "Tabela", + "task_list": "Lista de tarefas", + "block_type": "Tipo de bloco", + "lists": "Listas", + "more_elements": "Mais", + "text_formatting": "Formatação de texto", + "underline": "Sublinhado" + }, + "help": { + "editing": "Edição", + "fallback_notice": "Esta página ainda não está disponível no seu idioma. Exibindo a versão em inglês.", + "features": "Funcionalidades", + "getting_started": "Primeiros passos", + "shortcuts": "Atalhos de teclado" + }, + "lang_picker": { + "filter_label": "Filtrar linguagens", + "filter_placeholder": "Filtrar linguagens...", + "plain_text": "Texto simples" + }, + "link": { + "apply": "Aplicar link", + "cancel": "Cancelar", + "display_text": "Texto de exibição", + "edit": "Editar", + "edit_link": "Editar link", + "remove_link": "Remover link", + "text": "Texto", + "text_placeholder": "Texto de exibição (opcional)", + "url": "URL", + "url_placeholder": "Cole ou digite a URL..." + }, + "recovery": { + "discard": "Descartar", + "message": "O Kern encontrou alterações não salvas de uma sessão anterior. Deseja restaurá-las?", + "restore": "Restaurar", + "title": "Recuperar alterações não salvas?" + }, + "search": { + "count": "resultados", + "no_results": "Sem resultados", + "placeholder": "Pesquisar no documento..." + }, + "settings": { + "language": "Idioma", + "theme": "Tema", + "theme_dark": "Escuro", + "theme_light": "Claro", + "theme_system": "Sistema" + }, + "sidebar": { + "no_headings": "Nenhum título encontrado", + "recent": "Arquivos recentes", + "toc": "Sumário" + }, + "slash": { + "blockquote": "Citação", + "blockquote_desc": "Bloco de citação", + "bullet_list": "Lista com marcadores", + "bullet_list_desc": "Lista não ordenada", + "code_block": "Bloco de código", + "code_block_desc": "Código delimitado", + "divider": "Divisor", + "divider_desc": "Linha horizontal", + "heading1": "Título 1", + "heading1_desc": "Título grande", + "heading2": "Título 2", + "heading2_desc": "Título médio", + "heading3": "Título 3", + "heading3_desc": "Título pequeno", + "no_results": "Sem resultados", + "numbered_list": "Lista numerada", + "numbered_list_desc": "Lista ordenada", + "paragraph": "Parágrafo", + "paragraph_desc": "Texto simples", + "table": "Tabela", + "table_desc": "Tabela 3×3", + "task_list": "Lista de tarefas", + "task_list_desc": "Checklist", + "mermaid": "Diagrama Mermaid", + "mermaid_desc": "Inserir um diagrama" + }, + "table": { + "add_col_left": "Adicionar coluna à esquerda", + "add_col_right": "Adicionar coluna à direita", + "add_row_above": "Adicionar linha acima", + "add_row_below": "Adicionar linha abaixo", + "col_options": "Opções da coluna {n}", + "delete_col": "Excluir coluna", + "delete_row": "Excluir linha", + "header": "Cabeçalho", + "insert_col_left": "Inserir coluna à esquerda", + "insert_col_right": "Inserir coluna à direita", + "insert_row_above": "Inserir linha acima", + "insert_row_below": "Inserir linha abaixo", + "new_row": "+ Nova linha", + "row_options": "Opções da linha {n}" + }, + "toolbar": { + "edit": "Editar", + "export_pdf": "Exportar PDF", + "focus": "Modo foco", + "more": "Mais", + "new_file": "Novo arquivo", + "open": "Abrir arquivo", + "save": "Salvar", + "search": "Pesquisar", + "settings": "Configurações", + "split_view": "Vista dividida", + "theme": "Alternar tema", + "toc": "Sumário", + "zoom_in": "Aumentar zoom", + "zoom_out": "Diminuir zoom", + "zoom_reset": "Redefinir zoom", + "done": "Concluído" + }, + "trial": { + "days_remaining": "{days} dias restantes no período de teste", + "expired_message": "Seu período de teste expirou. Compre o Kern para continuar editando.", + "feature_edit": "Edite Markdown com WYSIWYG e vista dividida", + "feature_export": "Exportar para PDF", + "feature_save": "Salve e crie novos arquivos", + "one_time_purchase": "Compra única. Sem assinatura.", + "purchase_button": "Comprar Kern", + "purchase_desc": "Tenha acesso completo a todos os recursos de edição e exportação com uma compra única.", + "purchase_title": "Desbloquear Kern", + "purchasing": "Comprando...", + "restore_purchases": "Restaurar compras", + "restoring": "Restaurando..." + }, + "viewer": { + "copied": "Copiado!", + "copy": "Copiar" + }, + "welcome": { + "drop_hint": "ou arraste e solte um arquivo .md", + "new_button": "Novo arquivo", + "open_button": "Abrir arquivo", + "subtitle": "Um belo visualizador Markdown", + "title": "Kern" + }, + "mermaid": { + "done": "Concluído", + "edit": "Editar", + "error_prefix": "Erro de sintaxe", + "stale": "Pré-visualização desatualizada" + } +} diff --git a/src-mdviewer/src/locales/pt.json b/src-mdviewer/src/locales/pt.json new file mode 100644 index 0000000000..22512b1157 --- /dev/null +++ b/src-mdviewer/src/locales/pt.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "Abrir arquivo", + "theme": "Alternar tema", + "toc": "Sumário", + "search": "Pesquisar", + "focus": "Modo foco", + "zoom_in": "Aumentar zoom", + "zoom_out": "Diminuir zoom", + "zoom_reset": "Redefinir zoom", + "save": "Salvar", + "edit": "Editar", + "new_file": "Novo arquivo", + "split_view": "Vista dividida", + "export_pdf": "Exportar PDF", + "settings": "Configurações", + "more": "Mais" + }, + "sidebar": { + "toc": "Sumário", + "recent": "Arquivos recentes", + "no_headings": "Nenhum título encontrado" + }, + "search": { + "placeholder": "Pesquisar no documento...", + "count": "resultados", + "no_results": "Sem resultados" + }, + "welcome": { + "title": "Kern", + "subtitle": "Um belo visualizador Markdown", + "new_button": "Novo arquivo", + "open_button": "Abrir arquivo", + "drop_hint": "ou arraste e solte um arquivo .md" + }, + "viewer": { + "copy": "Copiar", + "copied": "Copiado!" + }, + "settings": { + "theme": "Tema", + "theme_light": "Claro", + "theme_dark": "Escuro", + "theme_system": "Sistema", + "language": "Idioma" + }, + "common": { + "close": "Fechar", + "open": "Abrir", + "file": "Arquivo" + }, + "format": { + "paragraph": "Parágrafo", + "heading1": "Título 1", + "heading2": "Título 2", + "heading3": "Título 3", + "bold": "Negrito ({mod}+B)", + "italic": "Itálico ({mod}+I)", + "strikethrough": "Tachado ({mod}+Shift+X)", + "code": "Código inline ({mod}+E)", + "link": "Link ({mod}+K)", + "bullet_list": "Lista com marcadores", + "numbered_list": "Lista numerada", + "task_list": "Lista de tarefas", + "blockquote": "Citação", + "divider": "Divisor", + "table": "Tabela", + "code_block": "Bloco de código" + }, + "slash": { + "paragraph": "Parágrafo", + "paragraph_desc": "Texto simples", + "heading1": "Título 1", + "heading1_desc": "Título grande", + "heading2": "Título 2", + "heading2_desc": "Título médio", + "heading3": "Título 3", + "heading3_desc": "Título pequeno", + "bullet_list": "Lista com marcadores", + "bullet_list_desc": "Lista não ordenada", + "numbered_list": "Lista numerada", + "numbered_list_desc": "Lista ordenada", + "task_list": "Lista de tarefas", + "task_list_desc": "Checklist", + "blockquote": "Citação", + "blockquote_desc": "Bloco de citação", + "code_block": "Bloco de código", + "code_block_desc": "Código delimitado", + "table": "Tabela", + "table_desc": "Tabela 3×3", + "divider": "Divisor", + "divider_desc": "Linha horizontal", + "no_results": "Sem resultados" + }, + "link": { + "edit": "Editar", + "edit_link": "Editar link", + "remove_link": "Remover link", + "text": "Texto", + "text_placeholder": "Texto de exibição (opcional)", + "display_text": "Texto de exibição", + "url": "URL", + "url_placeholder": "Cole ou digite a URL...", + "apply": "Aplicar link", + "cancel": "Cancelar" + }, + "table": { + "header": "Cabeçalho", + "new_row": "+ Nova linha", + "row_options": "Opções da linha {n}", + "col_options": "Opções da coluna {n}", + "insert_row_above": "Inserir linha acima", + "insert_row_below": "Inserir linha abaixo", + "delete_row": "Excluir linha", + "insert_col_left": "Inserir coluna à esquerda", + "insert_col_right": "Inserir coluna à direita", + "delete_col": "Excluir coluna", + "add_row_above": "Adicionar linha acima", + "add_row_below": "Adicionar linha abaixo", + "add_col_left": "Adicionar coluna à esquerda", + "add_col_right": "Adicionar coluna à direita" + }, + "dialog": { + "unsaved_title": "Alterações não salvas", + "unsaved_exit_edit": "Você tem alterações não salvas. Deseja salvar antes de sair do modo de edição?", + "unsaved_new_file": "Você tem alterações não salvas. Deseja salvar antes de criar um novo arquivo?", + "unsaved_open_file": "Você tem alterações não salvas. Deseja salvar antes de abrir um novo arquivo?", + "save": "Salvar", + "discard": "Descartar", + "dont_save": "Não salvar", + "cancel": "Cancelar", + "unsaved_close": "Você tem alterações não salvas. Deseja salvar antes de fechar?" + }, + "lang_picker": { + "filter_placeholder": "Filtrar linguagens...", + "filter_label": "Filtrar linguagens", + "plain_text": "Texto simples" + }, + "a11y": { + "skip_to_content": "Pular para o conteúdo", + "main_toolbar": "Barra de ferramentas principal", + "sidebar": "Barra lateral", + "search_text": "Pesquisar texto", + "previous_match": "Resultado anterior", + "next_match": "Próximo resultado", + "close_search": "Fechar pesquisa", + "format_text": "Formatar texto", + "edit_link": "Editar link", + "insert_block": "Inserir bloco", + "select_language": "Selecionar linguagem", + "search_in_document": "Pesquisar no documento" + }, + "drop_zone": { + "text": "Solte seu arquivo Markdown aqui" + }, + "help": { + "getting_started": "Primeiros passos", + "editing": "Edição", + "shortcuts": "Atalhos de teclado", + "features": "Funcionalidades", + "fallback_notice": "Esta página ainda não está disponível no seu idioma. Exibindo a versão em inglês." + }, + "recovery": { + "title": "Recuperar alterações não salvas?", + "message": "O Kern encontrou alterações não salvas de uma sessão anterior. Deseja restaurá-las?", + "restore": "Restaurar", + "discard": "Descartar" + }, + "export": { + "success": "PDF exportado com sucesso", + "open": "Abrir" + }, + "context": { + "cut": "Recortar", + "copy": "Copiar", + "paste": "Colar", + "paste_plain": "Colar como texto simples", + "select_all": "Selecionar tudo", + "copy_link": "Copiar link", + "open_link": "Abrir link", + "copy_image_address": "Copiar endereço da imagem" + }, + "trial": { + "days_remaining": "{days} dias restantes no período de teste", + "expired_message": "Seu período de teste expirou. Compre o Kern para continuar editando.", + "purchase_button": "Comprar Kern", + "purchase_title": "Desbloquear Kern", + "purchase_desc": "Tenha acesso completo a todos os recursos de edição e exportação com uma compra única.", + "feature_edit": "Edite Markdown com WYSIWYG e vista dividida", + "feature_save": "Salve e crie novos arquivos", + "feature_export": "Exportar para PDF", + "restore_purchases": "Restaurar compras", + "one_time_purchase": "Compra única. Sem assinatura.", + "purchasing": "Comprando...", + "restoring": "Restaurando..." + } +} diff --git a/src-mdviewer/src/locales/ro.json b/src-mdviewer/src/locales/ro.json new file mode 100644 index 0000000000..2fd63e5012 --- /dev/null +++ b/src-mdviewer/src/locales/ro.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Închide căutarea", + "edit_link": "Editează linkul", + "format_text": "Formatează textul", + "insert_block": "Inserează bloc", + "main_toolbar": "Bară de unelte principală", + "next_match": "Rezultatul următor", + "previous_match": "Rezultatul anterior", + "search_in_document": "Caută în document", + "search_text": "Caută text", + "select_language": "Selectează limba", + "sidebar": "Bară laterală", + "skip_to_content": "Sari la conținut" + }, + "common": { + "close": "Închide", + "file": "Fișier", + "open": "Deschide" + }, + "context": { + "copy": "Copiază", + "copy_image_address": "Copiază adresa imaginii", + "copy_link": "Copiază linkul", + "cut": "Taie", + "open_link": "Deschide linkul", + "paste": "Lipire", + "paste_plain": "Lipire ca text simplu", + "select_all": "Selectare totală" + }, + "dialog": { + "cancel": "Anulare", + "discard": "Renunță", + "dont_save": "Nu salva", + "save": "Salvare", + "unsaved_close": "Aveți modificări nesalvate. Doriți să salvați înainte de a închide?", + "unsaved_exit_edit": "Aveți modificări nesalvate. Doriți să salvați înainte de a ieși din modul de editare?", + "unsaved_new_file": "Aveți modificări nesalvate. Doriți să salvați înainte de a crea un fișier nou?", + "unsaved_open_file": "Aveți modificări nesalvate. Doriți să salvați înainte de a deschide un fișier nou?", + "unsaved_title": "Modificări nesalvate" + }, + "drop_zone": { + "text": "Trageți fișierul Markdown aici" + }, + "export": { + "open": "Deschide", + "success": "PDF exportat cu succes" + }, + "format": { + "block_type": "Tip de bloc", + "blockquote": "Citat bloc", + "bold": "Aldin ({mod}+B)", + "bullet_list": "Listă cu puncte", + "code": "Cod inline ({mod}+E)", + "code_block": "Bloc de cod", + "divider": "Separator", + "heading1": "Titlu 1", + "heading2": "Titlu 2", + "heading3": "Titlu 3", + "italic": "Cursiv ({mod}+I)", + "link": "Legătură ({mod}+K)", + "lists": "Liste", + "more_elements": "Mai multe", + "numbered_list": "Listă numerotată", + "paragraph": "Paragraf", + "strikethrough": "Tăiat ({mod}+Shift+X)", + "table": "Tabel", + "task_list": "Listă de sarcini", + "text_formatting": "Formatare text", + "underline": "Subliniat" + }, + "help": { + "editing": "Editare", + "fallback_notice": "Această pagină nu este încă disponibilă în limba dumneavoastră. Se afișează versiunea în limba engleză.", + "features": "Funcționalități", + "getting_started": "Noțiuni introductive", + "shortcuts": "Scurtături de la tastatură" + }, + "lang_picker": { + "filter_label": "Filtrează limbile", + "filter_placeholder": "Filtrează limbile...", + "plain_text": "Text simplu" + }, + "link": { + "apply": "Aplică linkul", + "cancel": "Anulează", + "display_text": "Text afișat", + "edit": "Editează", + "edit_link": "Editează linkul", + "remove_link": "Elimină linkul", + "text": "Text", + "text_placeholder": "Text de afișat (opțional)", + "url": "URL", + "url_placeholder": "Lipiți sau tastați URL-ul..." + }, + "mermaid": { + "done": "Gata", + "edit": "Editați", + "error_prefix": "Eroare de sintaxă", + "stale": "Previzualizare învechită" + }, + "recovery": { + "discard": "Renunțați", + "message": "Kern a găsit modificări nesalvate dintr-o sesiune anterioară. Doriți să le restaurați?", + "restore": "Restaurează", + "title": "Recuperați modificările nesalvate?" + }, + "search": { + "count": "potriviri", + "no_results": "Niciun rezultat", + "placeholder": "Căutați în document..." + }, + "settings": { + "language": "Limbă", + "theme": "Temă", + "theme_dark": "Întunecat", + "theme_light": "Luminos", + "theme_system": "Sistem" + }, + "sidebar": { + "no_headings": "Nu s-au găsit titluri", + "recent": "Fișiere recente", + "toc": "Cuprins" + }, + "slash": { + "blockquote": "Citat", + "blockquote_desc": "Bloc de citat", + "bullet_list": "Listă cu puncte", + "bullet_list_desc": "Listă neordonată", + "code_block": "Bloc de cod", + "code_block_desc": "Cod delimitat", + "divider": "Separator", + "divider_desc": "Linie orizontală", + "heading1": "Titlu 1", + "heading1_desc": "Titlu mare", + "heading2": "Titlu 2", + "heading2_desc": "Titlu mediu", + "heading3": "Titlu 3", + "heading3_desc": "Titlu mic", + "mermaid": "Diagramă Mermaid", + "mermaid_desc": "Inserează o diagramă", + "no_results": "Niciun rezultat", + "numbered_list": "Listă numerotată", + "numbered_list_desc": "Listă ordonată", + "paragraph": "Paragraf", + "paragraph_desc": "Text simplu", + "table": "Tabel", + "table_desc": "Tabel 3×3", + "task_list": "Listă de sarcini", + "task_list_desc": "Listă de verificare" + }, + "table": { + "add_col_left": "Adaugă coloană la stânga", + "add_col_right": "Adaugă coloană la dreapta", + "add_row_above": "Adaugă rând deasupra", + "add_row_below": "Adaugă rând dedesubt", + "col_options": "Opțiuni coloană {n}", + "delete_col": "Șterge coloana", + "delete_row": "Șterge rândul", + "header": "Antet", + "insert_col_left": "Inserează coloană la stânga", + "insert_col_right": "Inserează coloană la dreapta", + "insert_row_above": "Inserează rând deasupra", + "insert_row_below": "Inserează rând dedesubt", + "new_row": "+ Rând nou", + "row_options": "Opțiuni rând {n}" + }, + "toolbar": { + "done": "Gata", + "edit": "Editare", + "export_pdf": "Exportare PDF", + "focus": "Mod Concentrare", + "more": "Mai multe", + "new_file": "Fișier nou", + "open": "Deschide fișier", + "save": "Salvare", + "search": "Căutare", + "settings": "Setări", + "split_view": "Vizualizare divizată", + "theme": "Comutare temă", + "toc": "Cuprins", + "zoom_in": "Mărire", + "zoom_out": "Micșorare", + "zoom_reset": "Resetare zoom" + }, + "trial": { + "days_remaining": "{days} zile rămase din perioada de probă", + "expired_message": "Perioada de probă a expirat. Cumpărați Kern pentru a continua editarea.", + "feature_edit": "Editează Markdown cu WYSIWYG și vizualizare divizată", + "feature_export": "Exportă în PDF", + "feature_save": "Salvează și creează fișiere noi", + "one_time_purchase": "Achiziție unică. Fără abonament.", + "purchase_button": "Cumpără Kern", + "purchase_desc": "Obține acces complet la toate funcționalitățile de editare și export cu o achiziție unică.", + "purchase_title": "Deblochează Kern", + "purchasing": "Se achiziționează...", + "restore_purchases": "Restaurează achizițiile", + "restoring": "Se restaurează..." + }, + "viewer": { + "copied": "Copiat!", + "copy": "Copiază" + }, + "welcome": { + "drop_hint": "sau trageți și plasați un fișier .md", + "new_button": "Fișier nou", + "open_button": "Deschide fișier", + "subtitle": "Un vizualizator Markdown frumos", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/ru.json b/src-mdviewer/src/locales/ru.json new file mode 100644 index 0000000000..d188403702 --- /dev/null +++ b/src-mdviewer/src/locales/ru.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Закрыть поиск", + "edit_link": "Редактировать ссылку", + "format_text": "Форматировать текст", + "insert_block": "Вставить блок", + "main_toolbar": "Главная панель инструментов", + "next_match": "Следующее совпадение", + "previous_match": "Предыдущее совпадение", + "search_in_document": "Поиск по документу", + "search_text": "Поиск текста", + "select_language": "Выбрать язык", + "sidebar": "Боковая панель", + "skip_to_content": "Перейти к содержимому" + }, + "common": { + "close": "Закрыть", + "file": "Файл", + "open": "Открыть" + }, + "context": { + "copy": "Копировать", + "copy_image_address": "Копировать адрес изображения", + "copy_link": "Копировать ссылку", + "cut": "Вырезать", + "open_link": "Открыть ссылку", + "paste": "Вставить", + "paste_plain": "Вставить как обычный текст", + "select_all": "Выделить всё" + }, + "dialog": { + "cancel": "Отмена", + "discard": "Сбросить", + "dont_save": "Не сохранять", + "save": "Сохранить", + "unsaved_close": "У вас есть несохранённые изменения. Хотите сохранить их перед закрытием?", + "unsaved_exit_edit": "У вас есть несохранённые изменения. Хотите сохранить их перед выходом из режима редактирования?", + "unsaved_new_file": "У вас есть несохранённые изменения. Хотите сохранить их перед созданием нового файла?", + "unsaved_open_file": "У вас есть несохранённые изменения. Хотите сохранить их перед открытием нового файла?", + "unsaved_title": "Несохранённые изменения" + }, + "drop_zone": { + "text": "Перетащите сюда ваш Markdown-файл" + }, + "export": { + "open": "Открыть", + "success": "PDF успешно экспортирован" + }, + "format": { + "block_type": "Тип блока", + "blockquote": "Цитата", + "bold": "Полужирный ({mod}+B)", + "bullet_list": "Маркированный список", + "code": "Встроенный код ({mod}+E)", + "code_block": "Блок кода", + "divider": "Разделитель", + "heading1": "Заголовок 1", + "heading2": "Заголовок 2", + "heading3": "Заголовок 3", + "italic": "Курсив ({mod}+I)", + "link": "Ссылка ({mod}+K)", + "lists": "Списки", + "more_elements": "Ещё", + "numbered_list": "Нумерованный список", + "paragraph": "Параграф", + "strikethrough": "Зачёркнутый ({mod}+Shift+X)", + "table": "Таблица", + "task_list": "Список задач", + "text_formatting": "Форматирование текста", + "underline": "Подчёркнутый" + }, + "help": { + "editing": "Редактирование", + "fallback_notice": "Эта страница ещё не доступна на вашем языке. Показана английская версия.", + "features": "Возможности", + "getting_started": "Начало работы", + "shortcuts": "Сочетания клавиш" + }, + "lang_picker": { + "filter_label": "Фильтр языков", + "filter_placeholder": "Фильтр языков...", + "plain_text": "Простой текст" + }, + "link": { + "apply": "Применить", + "cancel": "Отмена", + "display_text": "Отображаемый текст", + "edit": "Редактировать", + "edit_link": "Редактировать ссылку", + "remove_link": "Удалить ссылку", + "text": "Текст", + "text_placeholder": "Отображаемый текст (необязательно)", + "url": "URL", + "url_placeholder": "Вставьте или введите URL..." + }, + "mermaid": { + "done": "Готово", + "edit": "Редактировать", + "error_prefix": "Синтаксическая ошибка", + "stale": "Предпросмотр устарел" + }, + "recovery": { + "discard": "Отклонить", + "message": "Kern обнаружил несохранённые изменения из предыдущего сеанса. Хотите восстановить их?", + "restore": "Восстановить", + "title": "Восстановить несохранённые изменения?" + }, + "search": { + "count": "совпадений", + "no_results": "Нет результатов", + "placeholder": "Поиск по документу..." + }, + "settings": { + "language": "Язык", + "theme": "Тема", + "theme_dark": "Тёмная", + "theme_light": "Светлая", + "theme_system": "Системная" + }, + "sidebar": { + "no_headings": "Заголовки не найдены", + "recent": "Недавние файлы", + "toc": "Оглавление" + }, + "slash": { + "blockquote": "Цитата", + "blockquote_desc": "Блок с цитатой", + "bullet_list": "Маркированный список", + "bullet_list_desc": "Ненумерованный список", + "code_block": "Блок кода", + "code_block_desc": "Выделенный код", + "divider": "Разделитель", + "divider_desc": "Горизонтальная линия", + "heading1": "Заголовок 1", + "heading1_desc": "Крупный заголовок", + "heading2": "Заголовок 2", + "heading2_desc": "Средний заголовок", + "heading3": "Заголовок 3", + "heading3_desc": "Небольшой заголовок", + "mermaid": "Диаграмма Mermaid", + "mermaid_desc": "Вставить диаграмму", + "no_results": "Нет результатов", + "numbered_list": "Нумерованный список", + "numbered_list_desc": "Упорядоченный список", + "paragraph": "Абзац", + "paragraph_desc": "Обычный текст", + "table": "Таблица", + "table_desc": "Таблица 3×3", + "task_list": "Список задач", + "task_list_desc": "Чек-лист" + }, + "table": { + "add_col_left": "Добавить столбец слева", + "add_col_right": "Добавить столбец справа", + "add_row_above": "Добавить строку выше", + "add_row_below": "Добавить строку ниже", + "col_options": "Настройки столбца {n}", + "delete_col": "Удалить столбец", + "delete_row": "Удалить строку", + "header": "Заголовок", + "insert_col_left": "Вставить столбец слева", + "insert_col_right": "Вставить столбец справа", + "insert_row_above": "Вставить строку выше", + "insert_row_below": "Вставить строку ниже", + "new_row": "+ Новая строка", + "row_options": "Параметры строки {n}" + }, + "toolbar": { + "done": "Готово", + "edit": "Редактировать", + "export_pdf": "Экспорт в PDF", + "focus": "Режим фокусировки", + "more": "Ещё", + "new_file": "Новый файл", + "open": "Открыть файл", + "save": "Сохранить", + "search": "Поиск", + "settings": "Настройки", + "split_view": "Разделенный режим", + "theme": "Сменить тему", + "toc": "Оглавление", + "zoom_in": "Увеличить", + "zoom_out": "Уменьшить", + "zoom_reset": "Сбросить масштаб" + }, + "trial": { + "days_remaining": "Осталось {days} дней в пробной версии", + "expired_message": "Ваша пробная версия истекла. Приобретите Kern, чтобы продолжить редактирование.", + "feature_edit": "Редактирование Markdown в режиме WYSIWYG и с разделением экрана", + "feature_export": "Экспорт в PDF", + "feature_save": "Сохранение и создание новых файлов", + "one_time_purchase": "Единоразовая покупка. Без подписки.", + "purchase_button": "Купить Kern", + "purchase_desc": "Получите полный доступ ко всем функциям редактирования и экспорта с помощью единоразовой покупки.", + "purchase_title": "Разблокировать Kern", + "purchasing": "Покупка...", + "restore_purchases": "Восстановить покупки", + "restoring": "Восстановление..." + }, + "viewer": { + "copied": "Скопировано!", + "copy": "Копировать" + }, + "welcome": { + "drop_hint": "или перетащите файл .md", + "new_button": "Новый файл", + "open_button": "Открыть файл", + "subtitle": "Красивый просмотрщик Markdown", + "title": "Керн" + } +} diff --git a/src-mdviewer/src/locales/sk.json b/src-mdviewer/src/locales/sk.json new file mode 100644 index 0000000000..52fa781b25 --- /dev/null +++ b/src-mdviewer/src/locales/sk.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Zavrieť vyhľadávanie", + "edit_link": "Upraviť odkaz", + "format_text": "Formátovať text", + "insert_block": "Vložiť blok", + "main_toolbar": "Hlavný panel s nástrojmi", + "next_match": "Ďalšia zhoda", + "previous_match": "Predchádzajúca zhoda", + "search_in_document": "Hľadať v dokumente", + "search_text": "Hľadať text", + "select_language": "Vybrať jazyk", + "sidebar": "Bočný panel", + "skip_to_content": "Preskočiť na obsah" + }, + "common": { + "close": "Zavrieť", + "file": "Súbor", + "open": "Otvoriť" + }, + "context": { + "copy": "Kopírovať", + "copy_image_address": "Kopírovať adresu obrázka", + "copy_link": "Kopírovať odkaz", + "cut": "Vystrihnúť", + "open_link": "Otvoriť odkaz", + "paste": "Prilepiť", + "paste_plain": "Prilepiť ako čistý text", + "select_all": "Vybrať všetko" + }, + "dialog": { + "cancel": "Zrušiť", + "discard": "Zahodiť", + "dont_save": "Neuložiť", + "save": "Uložiť", + "unsaved_close": "Máte neuložené zmeny. Chcete ich uložiť pred zatvorením?", + "unsaved_exit_edit": "Máte neuložené zmeny. Chcete ich uložiť pred opustením režimu úprav?", + "unsaved_new_file": "Máte neuložené zmeny. Chcete ich uložiť pred vytvorením nového súboru?", + "unsaved_open_file": "Máte neuložené zmeny. Chcete ich uložiť pred otvorením nového súboru?", + "unsaved_title": "Neuložené zmeny" + }, + "drop_zone": { + "text": "Sem presuňte svoj Markdown súbor" + }, + "export": { + "open": "Otvoriť", + "success": "PDF bolo úspešne exportované" + }, + "format": { + "block_type": "Typ bloku", + "blockquote": "Citácia", + "bold": "Tučné ({mod}+B)", + "bullet_list": "Zoznam s odrážkami", + "code": "Vložený kód ({mod}+E)", + "code_block": "Blok kódu", + "divider": "Oddeľovač", + "heading1": "Nadpis 1", + "heading2": "Nadpis 2", + "heading3": "Nadpis 3", + "italic": "Kurzíva ({mod}+I)", + "link": "Odkaz ({mod}+K)", + "lists": "Zoznamy", + "more_elements": "Viac", + "numbered_list": "Číslovaný zoznam", + "paragraph": "Odsek", + "strikethrough": "Prečiarknuté ({mod}+Shift+X)", + "table": "Tabuľka", + "task_list": "Zoznam úloh", + "text_formatting": "Formátovanie textu", + "underline": "Podčiarknuté" + }, + "help": { + "editing": "Úpravy", + "fallback_notice": "Táto stránka zatiaľ nie je dostupná vo vašom jazyku. Zobrazuje sa anglická verzia.", + "features": "Funkcie", + "getting_started": "Ako začať", + "shortcuts": "Klávesové skratky" + }, + "lang_picker": { + "filter_label": "Filtrovať jazyky", + "filter_placeholder": "Filtrovať jazyky...", + "plain_text": "Obyčajný text" + }, + "link": { + "apply": "Použiť odkaz", + "cancel": "Zrušiť", + "display_text": "Zobrazený text", + "edit": "Upraviť", + "edit_link": "Upraviť odkaz", + "remove_link": "Odstrániť odkaz", + "text": "Text", + "text_placeholder": "Zobrazený text (voliteľné)", + "url": "URL", + "url_placeholder": "Vložte alebo napíšte URL..." + }, + "mermaid": { + "done": "Hotovo", + "edit": "Upraviť", + "error_prefix": "Syntaktická chyba", + "stale": "Neaktuálny náhľad" + }, + "recovery": { + "discard": "Zahodiť", + "message": "Kern našiel neuložené zmeny z predchádzajúcej relácie. Chcete ich obnoviť?", + "restore": "Obnoviť", + "title": "Obnoviť neuložené zmeny?" + }, + "search": { + "count": "zhody", + "no_results": "Žiadne výsledky", + "placeholder": "Hľadať v dokumente..." + }, + "settings": { + "language": "Jazyk", + "theme": "Téma", + "theme_dark": "Tmavá", + "theme_light": "Svetlá", + "theme_system": "Systém" + }, + "sidebar": { + "no_headings": "Nenašli sa žiadne nadpisy", + "recent": "Nedávne súbory", + "toc": "Obsah" + }, + "slash": { + "blockquote": "Citácia", + "blockquote_desc": "Blok s citáciou", + "bullet_list": "Zoznam s odrážkami", + "bullet_list_desc": "Neusporiadaný zoznam", + "code_block": "Blok kódu", + "code_block_desc": "Ohraničený kód", + "divider": "Oddeľovač", + "divider_desc": "Vodorovná čiara", + "heading1": "Nadpis 1", + "heading1_desc": "Veľký nadpis", + "heading2": "Nadpis 2", + "heading2_desc": "Stredný nadpis", + "heading3": "Nadpis 3", + "heading3_desc": "Malý nadpis", + "mermaid": "Mermaid diagram", + "mermaid_desc": "Vložiť diagram", + "no_results": "Žiadne výsledky", + "numbered_list": "Číslovaný zoznam", + "numbered_list_desc": "Usporiadaný zoznam", + "paragraph": "Odsek", + "paragraph_desc": "Obyčajný text", + "table": "Tabuľka", + "table_desc": "Tabuľka 3×3", + "task_list": "Zoznam úloh", + "task_list_desc": "Kontrolný zoznam" + }, + "table": { + "add_col_left": "Pridať stĺpec vľavo", + "add_col_right": "Pridať stĺpec vpravo", + "add_row_above": "Pridať riadok nad", + "add_row_below": "Pridať riadok pod", + "col_options": "Možnosti stĺpca {n}", + "delete_col": "Odstrániť stĺpec", + "delete_row": "Odstrániť riadok", + "header": "Hlavička", + "insert_col_left": "Vložiť stĺpec vľavo", + "insert_col_right": "Vložiť stĺpec vpravo", + "insert_row_above": "Vložiť riadok nad", + "insert_row_below": "Vložiť riadok pod", + "new_row": "+ Nový riadok", + "row_options": "Možnosti riadka {n}" + }, + "toolbar": { + "done": "Hotovo", + "edit": "Upraviť", + "export_pdf": "Exportovať PDF", + "focus": "Režim sústredenia", + "more": "Viac", + "new_file": "Nový súbor", + "open": "Otvoriť súbor", + "save": "Uložiť", + "search": "Hľadať", + "settings": "Nastavenia", + "split_view": "Rozdelené zobrazenie", + "theme": "Prepnúť tému", + "toc": "Obsah", + "zoom_in": "Priblížiť", + "zoom_out": "Oddialiť", + "zoom_reset": "Obnoviť priblíženie" + }, + "trial": { + "days_remaining": "Zostáva {days} dní v skúšobnej verzii", + "expired_message": "Vaša skúšobná verzia vypršala. Ak chcete pokračovať v úpravách, zakúpte si Kern.", + "feature_edit": "Úprava Markdownu s WYSIWYG a rozdeleným zobrazením", + "feature_export": "Export do PDF", + "feature_save": "Ukladanie a vytváranie nových súborov", + "one_time_purchase": "Jednorazový nákup. Žiadne predplatné.", + "purchase_button": "Zakúpiť Kern", + "purchase_desc": "Získajte plný prístup ku všetkým funkciám úprav a exportu jednorazovým nákupom.", + "purchase_title": "Odomknite Kern", + "purchasing": "Prebieha nákup...", + "restore_purchases": "Obnoviť nákupy", + "restoring": "Obnovuje sa..." + }, + "viewer": { + "copied": "Skopírované!", + "copy": "Kopírovať" + }, + "welcome": { + "drop_hint": "alebo presuňte súbor .md", + "new_button": "Nový súbor", + "open_button": "Otvoriť súbor", + "subtitle": "Krásny prehliadač Markdownu", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/sr.json b/src-mdviewer/src/locales/sr.json new file mode 100644 index 0000000000..6c3da29b66 --- /dev/null +++ b/src-mdviewer/src/locales/sr.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Затвори претрагу", + "edit_link": "Уреди везу", + "format_text": "Форматирај текст", + "insert_block": "Уметни блок", + "main_toolbar": "Главна трака са алаткама", + "next_match": "Следеће подударање", + "previous_match": "Претходно подударање", + "search_in_document": "Претражи у документу", + "search_text": "Текст за претрагу", + "select_language": "Изабери језик", + "sidebar": "Бочна трака", + "skip_to_content": "Прескочи на садржај" + }, + "common": { + "close": "Затвори", + "file": "Датотека", + "open": "Отвори" + }, + "context": { + "copy": "Копирај", + "copy_image_address": "Копирај адресу слике", + "copy_link": "Копирај везу", + "cut": "Исеци", + "open_link": "Отвори везу", + "paste": "Налепи", + "paste_plain": "Налепи као обичан текст", + "select_all": "Изабери све" + }, + "dialog": { + "cancel": "Откажи", + "discard": "Одбаци", + "dont_save": "Немој сачувати", + "save": "Сачувај", + "unsaved_close": "Имате несачуване промене. Да ли желите да их сачувате пре затварања?", + "unsaved_exit_edit": "Имате несачуване промене. Да ли желите да их сачувате пре изласка из режима уређивања?", + "unsaved_new_file": "Имате несачуване промене. Да ли желите да их сачувате пре креирања нове датотеке?", + "unsaved_open_file": "Имате несачуване измене. Да ли желите да их сачувате пре отварања нове датотеке?", + "unsaved_title": "Несачуване измене" + }, + "drop_zone": { + "text": "Превуците своју Markdown датотеку овде" + }, + "export": { + "open": "Отвори", + "success": "PDF је успешно извезен" + }, + "format": { + "block_type": "Тип блока", + "blockquote": "Блок цитат", + "bold": "Подебљано ({mod}+B)", + "bullet_list": "Листа са ставкама", + "code": "Уметнути кôд ({mod}+E)", + "code_block": "Блок кода", + "divider": "Раздвајач", + "heading1": "Наслов 1", + "heading2": "Наслов 2", + "heading3": "Наслов 3", + "italic": "Курзив ({mod}+I)", + "link": "Веза ({mod}+K)", + "lists": "Листе", + "more_elements": "Више", + "numbered_list": "Нумерисана листа", + "paragraph": "Пасус", + "strikethrough": "Прецртано ({mod}+Shift+X)", + "table": "Табела", + "task_list": "Листа задатака", + "text_formatting": "Форматирање текста", + "underline": "Подвучено" + }, + "help": { + "editing": "Уређивање", + "fallback_notice": "Ова страница још увек није доступна на вашем језику. Приказује се енглеска верзија.", + "features": "Функције", + "getting_started": "Први кораци", + "shortcuts": "Тастатурне пречице" + }, + "lang_picker": { + "filter_label": "Филтрирај језике", + "filter_placeholder": "Филтрирај језике...", + "plain_text": "Обичан текст" + }, + "link": { + "apply": "Примени линк", + "cancel": "Одустани", + "display_text": "Текст за приказ", + "edit": "Уреди", + "edit_link": "Уреди линк", + "remove_link": "Уклони линк", + "text": "Текст", + "text_placeholder": "Текст за приказ (опционо)", + "url": "URL", + "url_placeholder": "Налепите или унесите URL..." + }, + "mermaid": { + "done": "Готово", + "edit": "Измени", + "error_prefix": "Синтаксна грешка", + "stale": "Преглед је застарео" + }, + "recovery": { + "discard": "Одбаци", + "message": "Kern је пронашао несачуване промене из претходне сесије. Да ли желите да их вратите?", + "restore": "Врати", + "title": "Вратити несачуване промене?" + }, + "search": { + "count": "погодака", + "no_results": "Нема резултата", + "placeholder": "Претрага у документу..." + }, + "settings": { + "language": "Језик", + "theme": "Тема", + "theme_dark": "Тамна", + "theme_light": "Светла", + "theme_system": "Системска" + }, + "sidebar": { + "no_headings": "Нема наслова", + "recent": "Недавне датотеке", + "toc": "Садржај" + }, + "slash": { + "blockquote": "Блок цитат", + "blockquote_desc": "Блок за цитирање", + "bullet_list": "Листа са ставкама", + "bullet_list_desc": "Неуређена листа", + "code_block": "Блок кода", + "code_block_desc": "Ограђени код", + "divider": "Разделник", + "divider_desc": "Хоризонтална линија", + "heading1": "Наслов 1", + "heading1_desc": "Велики наслов", + "heading2": "Наслов 2", + "heading2_desc": "Средњи наслов", + "heading3": "Наслов 3", + "heading3_desc": "Мали наслов", + "mermaid": "Mermaid дијаграм", + "mermaid_desc": "Уметни дијаграм", + "no_results": "Нема резултата", + "numbered_list": "Нумерисана листа", + "numbered_list_desc": "Уређена листа", + "paragraph": "Пасус", + "paragraph_desc": "Обичан текст", + "table": "Табела", + "table_desc": "Табела 3×3", + "task_list": "Листа задатака", + "task_list_desc": "Контролна листа" + }, + "table": { + "add_col_left": "Додај колону лево", + "add_col_right": "Додај колону десно", + "add_row_above": "Додај ред изнад", + "add_row_below": "Додај ред испод", + "col_options": "Опције колоне {n}", + "delete_col": "Обриши колону", + "delete_row": "Обриши ред", + "header": "Заглавље", + "insert_col_left": "Уметни колону лево", + "insert_col_right": "Уметни колону десно", + "insert_row_above": "Уметни ред изнад", + "insert_row_below": "Уметни ред испод", + "new_row": "+ Нови ред", + "row_options": "Опције реда {n}" + }, + "toolbar": { + "done": "Готово", + "edit": "Уреди", + "export_pdf": "Извези PDF", + "focus": "Режим фокуса", + "more": "Више", + "new_file": "Нови фајл", + "open": "Отвори фајл", + "save": "Сачувај", + "search": "Претрага", + "settings": "Подешавања", + "split_view": "Подељени приказ", + "theme": "Промени тему", + "toc": "Садржај", + "zoom_in": "Увећај", + "zoom_out": "Умањи", + "zoom_reset": "Ресетуј зум" + }, + "trial": { + "days_remaining": "{days} дана преостало у пробном периоду", + "expired_message": "Ваш пробни период је истекао. Купите Kern да бисте наставили са уређивањем.", + "feature_edit": "Уређивање Markdown-а уз WYSIWYG и подељени приказ", + "feature_export": "Извоз у PDF", + "feature_save": "Чување и креирање нових датотека", + "one_time_purchase": "Једнократна куповина. Без претплате.", + "purchase_button": "Купите Kern", + "purchase_desc": "Остварите пун приступ свим функцијама за уређивање и извоз једнократном куповином.", + "purchase_title": "Откључајте Kern", + "purchasing": "Куповина у току...", + "restore_purchases": "Обновите куповине", + "restoring": "Обнављање у току..." + }, + "viewer": { + "copied": "Копирано!", + "copy": "Копирај" + }, + "welcome": { + "drop_hint": "или превуците и отпустите .md датотеку", + "new_button": "Нова датотека", + "open_button": "Отвори датотеку", + "subtitle": "Прелеп Markdown прегледач", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/sv.json b/src-mdviewer/src/locales/sv.json new file mode 100644 index 0000000000..b0c1d60049 --- /dev/null +++ b/src-mdviewer/src/locales/sv.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Stäng sökning", + "edit_link": "Redigera länk", + "format_text": "Formatera text", + "insert_block": "Infoga block", + "main_toolbar": "Huvudverktygsfält", + "next_match": "Nästa träff", + "previous_match": "Föregående träff", + "search_in_document": "Sök i dokument", + "search_text": "Söktext", + "select_language": "Välj språk", + "sidebar": "Sidofält", + "skip_to_content": "Hoppa till innehåll" + }, + "common": { + "close": "Stäng", + "file": "Fil", + "open": "Öppna" + }, + "context": { + "copy": "Kopiera", + "copy_image_address": "Kopiera bildadress", + "copy_link": "Kopiera länk", + "cut": "Klipp ut", + "open_link": "Öppna länk", + "paste": "Klistra in", + "paste_plain": "Klistra in som oformaterad text", + "select_all": "Markera allt" + }, + "dialog": { + "cancel": "Avbryt", + "discard": "Ignorera", + "dont_save": "Spara inte", + "save": "Spara", + "unsaved_close": "Du har osparade ändringar. Vill du spara innan du stänger?", + "unsaved_exit_edit": "Du har osparade ändringar. Vill du spara innan du lämnar redigeringsläget?", + "unsaved_new_file": "Du har osparade ändringar. Vill du spara innan du skapar en ny fil?", + "unsaved_open_file": "Du har osparade ändringar. Vill du spara innan du öppnar en ny fil?", + "unsaved_title": "Osparade ändringar" + }, + "drop_zone": { + "text": "Släpp din Markdown-fil här" + }, + "export": { + "open": "Öppna", + "success": "PDF-filen har exporterats" + }, + "format": { + "block_type": "Blocktyp", + "blockquote": "Citatblock", + "bold": "Fet ({mod}+B)", + "bullet_list": "Punktlista", + "code": "Infogad kod ({mod}+E)", + "code_block": "Kodblock", + "divider": "Avdelare", + "heading1": "Rubrik 1", + "heading2": "Rubrik 2", + "heading3": "Rubrik 3", + "italic": "Kursiv ({mod}+I)", + "link": "Länk ({mod}+K)", + "lists": "Listor", + "more_elements": "Mer", + "numbered_list": "Numrerad lista", + "paragraph": "Stycke", + "strikethrough": "Genomstruken ({mod}+Shift+X)", + "table": "Tabell", + "task_list": "Att göra-lista", + "text_formatting": "Textformatering", + "underline": "Understruken" + }, + "help": { + "editing": "Redigering", + "fallback_notice": "Den här sidan är inte tillgänglig på ditt språk än. Den engelska versionen visas.", + "features": "Funktioner", + "getting_started": "Komma igång", + "shortcuts": "Kortkommandon" + }, + "lang_picker": { + "filter_label": "Filtrera språk", + "filter_placeholder": "Filtrera språk...", + "plain_text": "Oformaterad text" + }, + "link": { + "apply": "Verkställ länk", + "cancel": "Avbryt", + "display_text": "Visningstext", + "edit": "Redigera", + "edit_link": "Redigera länk", + "remove_link": "Ta bort länk", + "text": "Text", + "text_placeholder": "Visningstext (valfritt)", + "url": "URL", + "url_placeholder": "Klistra in eller skriv URL..." + }, + "mermaid": { + "done": "Klar", + "edit": "Redigera", + "error_prefix": "Syntaxfel", + "stale": "Förhandsgranskning inaktuell" + }, + "recovery": { + "discard": "Förkasta", + "message": "Kern hittade osparade ändringar från en tidigare session. Vill du återställa dem?", + "restore": "Återställ", + "title": "Återställa osparade ändringar?" + }, + "search": { + "count": "träffar", + "no_results": "Inga resultat", + "placeholder": "Sök i dokumentet..." + }, + "settings": { + "language": "Språk", + "theme": "Tema", + "theme_dark": "Mörkt", + "theme_light": "Ljust", + "theme_system": "System" + }, + "sidebar": { + "no_headings": "Inga rubriker hittades", + "recent": "Senaste filer", + "toc": "Innehållsförteckning" + }, + "slash": { + "blockquote": "Citatblock", + "blockquote_desc": "Citatblock", + "bullet_list": "Punktlista", + "bullet_list_desc": "Osorterad lista", + "code_block": "Kodblock", + "code_block_desc": "Inhägnad kod", + "divider": "Avdelare", + "divider_desc": "Horisontell linje", + "heading1": "Rubrik 1", + "heading1_desc": "Stor rubrik", + "heading2": "Rubrik 2", + "heading2_desc": "Mellanstor rubrik", + "heading3": "Rubrik 3", + "heading3_desc": "Liten rubrik", + "mermaid": "Mermaid-diagram", + "mermaid_desc": "Infoga ett diagram", + "no_results": "Inga resultat", + "numbered_list": "Numrerad lista", + "numbered_list_desc": "Ordnad lista", + "paragraph": "Stycke", + "paragraph_desc": "Vanlig text", + "table": "Tabell", + "table_desc": "3×3-tabell", + "task_list": "Uppgiftslista", + "task_list_desc": "Checklista" + }, + "table": { + "add_col_left": "Lägg till kolumn till vänster", + "add_col_right": "Lägg till kolumn till höger", + "add_row_above": "Lägg till rad ovanför", + "add_row_below": "Lägg till rad nedanför", + "col_options": "Alternativ för kolumn {n}", + "delete_col": "Ta bort kolumn", + "delete_row": "Ta bort rad", + "header": "Rubrik", + "insert_col_left": "Infoga kolumn till vänster", + "insert_col_right": "Infoga kolumn till höger", + "insert_row_above": "Infoga rad ovanför", + "insert_row_below": "Infoga rad nedanför", + "new_row": "+ Ny rad", + "row_options": "Alternativ för rad {n}" + }, + "toolbar": { + "done": "Klar", + "edit": "Redigera", + "export_pdf": "Exportera PDF", + "focus": "Fokusläge", + "more": "Mer", + "new_file": "Ny fil", + "open": "Öppna fil", + "save": "Spara", + "search": "Sök", + "settings": "Inställningar", + "split_view": "Delad vy", + "theme": "Växla tema", + "toc": "Innehållsförteckning", + "zoom_in": "Zooma in", + "zoom_out": "Zooma ut", + "zoom_reset": "Återställ zoom" + }, + "trial": { + "days_remaining": "{days} dagar kvar av provperioden", + "expired_message": "Din provperiod har gått ut. Köp Kern för att fortsätta redigera.", + "feature_edit": "Redigera Markdown med WYSIWYG och delad vy", + "feature_export": "Exportera till PDF", + "feature_save": "Spara och skapa nya filer", + "one_time_purchase": "Engångsköp. Ingen prenumeration.", + "purchase_button": "Köp Kern", + "purchase_desc": "Få fullständig åtkomst till alla redigerings- och exportfunktioner med ett engångsköp.", + "purchase_title": "Lås upp Kern", + "purchasing": "Köper...", + "restore_purchases": "Återställ köp", + "restoring": "Återställer..." + }, + "viewer": { + "copied": "Kopierat!", + "copy": "Kopiera" + }, + "welcome": { + "drop_hint": "eller dra och släpp en .md-fil", + "new_button": "Ny fil", + "open_button": "Öppna fil", + "subtitle": "En vacker Markdown-visare", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/ta.json b/src-mdviewer/src/locales/ta.json new file mode 100644 index 0000000000..519ebb48d5 --- /dev/null +++ b/src-mdviewer/src/locales/ta.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "கோப்பைத் திற", + "theme": "தீம் மாற்று", + "toc": "உள்ளடக்கம்", + "search": "தேடு", + "focus": "கவனம் பயன்முறை", + "zoom_in": "பெரிதாக்கு", + "zoom_out": "சிறிதாக்கு", + "zoom_reset": "அளவை மீட்டமை", + "save": "சேமி", + "edit": "திருத்து", + "new_file": "புதிய கோப்பு", + "split_view": "பிரிப்புக் காட்சி", + "export_pdf": "PDF ஏற்றுமதி", + "settings": "அமைப்புகள்", + "more": "மேலும்" + }, + "sidebar": { + "toc": "உள்ளடக்கம்", + "recent": "சமீபத்திய கோப்புகள்", + "no_headings": "தலைப்புகள் எதுவும் இல்லை" + }, + "search": { + "placeholder": "ஆவணத்தில் தேடு...", + "count": "பொருத்தங்கள்", + "no_results": "முடிவுகள் இல்லை" + }, + "welcome": { + "title": "Kern", + "subtitle": "ஒரு அழகான மார்க்டவுன் பார்வையாளர்", + "new_button": "புதிய கோப்பு", + "open_button": "கோப்பைத் திற", + "drop_hint": "அல்லது .md கோப்பை இழுத்து விடுங்கள்" + }, + "viewer": { + "copy": "நகலெடு", + "copied": "நகலெடுக்கப்பட்டது!" + }, + "settings": { + "theme": "தீம்", + "theme_light": "வெளிர்", + "theme_dark": "இருண்ட", + "theme_system": "சிஸ்டம்", + "language": "மொழி" + }, + "common": { + "close": "மூடு", + "open": "திற", + "file": "கோப்பு" + }, + "format": { + "paragraph": "பத்தி", + "heading1": "தலைப்பு 1", + "heading2": "தலைப்பு 2", + "heading3": "தலைப்பு 3", + "bold": "தடிமன் ({mod}+B)", + "italic": "சாய்வு ({mod}+I)", + "strikethrough": "கோடிடல் ({mod}+Shift+X)", + "code": "இன்லைன் குறியீடு ({mod}+E)", + "link": "இணைப்பு ({mod}+K)", + "bullet_list": "புல்லட் பட்டியல்", + "numbered_list": "எண் பட்டியல்", + "task_list": "பணி பட்டியல்", + "blockquote": "மேற்கோள்", + "divider": "பிரிப்பான்", + "table": "அட்டவணை", + "code_block": "குறியீடு தொகுதி" + }, + "slash": { + "paragraph": "பத்தி", + "paragraph_desc": "எளிய உரை", + "heading1": "தலைப்பு 1", + "heading1_desc": "பெரிய தலைப்பு", + "heading2": "தலைப்பு 2", + "heading2_desc": "நடுத்தர தலைப்பு", + "heading3": "தலைப்பு 3", + "heading3_desc": "சிறிய தலைப்பு", + "bullet_list": "புல்லட் பட்டியல்", + "bullet_list_desc": "வரிசையற்ற பட்டியல்", + "numbered_list": "எண் பட்டியல்", + "numbered_list_desc": "வரிசைப் பட்டியல்", + "task_list": "பணி பட்டியல்", + "task_list_desc": "சரிபார்ப்புப் பட்டியல்", + "blockquote": "மேற்கோள்", + "blockquote_desc": "மேற்கோள் தொகுதி", + "code_block": "குறியீடு தொகுதி", + "code_block_desc": "வேலி குறியீடு", + "table": "அட்டவணை", + "table_desc": "3×3 அட்டவணை", + "divider": "பிரிப்பான்", + "divider_desc": "கிடைமட்ட கோடு", + "no_results": "முடிவுகள் இல்லை" + }, + "link": { + "edit": "திருத்து", + "edit_link": "இணைப்பைத் திருத்து", + "remove_link": "இணைப்பை நீக்கு", + "text": "உரை", + "text_placeholder": "காட்சி உரை (விரும்பினால்)", + "display_text": "காட்சி உரை", + "url": "URL", + "url_placeholder": "URL ஒட்டவும் அல்லது தட்டச்சு செய்யவும்...", + "apply": "இணைப்பைப் பயன்படுத்து", + "cancel": "ரத்து" + }, + "table": { + "header": "தலைப்பு", + "new_row": "+ புதிய வரிசை", + "row_options": "வரிசை {n} விருப்பங்கள்", + "col_options": "நெடுவரிசை {n} விருப்பங்கள்", + "insert_row_above": "மேலே வரிசை செருகு", + "insert_row_below": "கீழே வரிசை செருகு", + "delete_row": "வரிசையை நீக்கு", + "insert_col_left": "இடதுபுறம் நெடுவரிசை செருகு", + "insert_col_right": "வலதுபுறம் நெடுவரிசை செருகு", + "delete_col": "நெடுவரிசையை நீக்கு", + "add_row_above": "மேலே வரிசை சேர்", + "add_row_below": "கீழே வரிசை சேர்", + "add_col_left": "இடதுபுறம் நெடுவரிசை சேர்", + "add_col_right": "வலதுபுறம் நெடுவரிசை சேர்" + }, + "dialog": { + "unsaved_title": "சேமிக்கப்படாத மாற்றங்கள்", + "unsaved_exit_edit": "சேமிக்கப்படாத மாற்றங்கள் உள்ளன. திருத்தம் முறையிலிருந்து வெளியேறும் முன் சேமிக்க விரும்புகிறீர்களா?", + "unsaved_new_file": "சேமிக்கப்படாத மாற்றங்கள் உள்ளன. புதிய கோப்பை உருவாக்கும் முன் சேமிக்க விரும்புகிறீர்களா?", + "unsaved_open_file": "சேமிக்கப்படாத மாற்றங்கள் உள்ளன. புதிய கோப்பைத் திறக்கும் முன் சேமிக்க விரும்புகிறீர்களா?", + "save": "சேமி", + "discard": "நிராகரி", + "dont_save": "சேமிக்க வேண்டாம்", + "cancel": "ரத்து செய்", + "unsaved_close": "சேமிக்கப்படாத மாற்றங்கள் உள்ளன. மூடுவதற்கு முன் சேமிக்க விரும்புகிறீர்களா?" + }, + "lang_picker": { + "filter_placeholder": "மொழிகளை வடிகட்டு...", + "filter_label": "மொழிகளை வடிகட்டு", + "plain_text": "எளிய உரை" + }, + "a11y": { + "skip_to_content": "உள்ளடக்கத்திற்குச் செல்", + "main_toolbar": "முதன்மை கருவிப்பட்டி", + "sidebar": "பக்கப்பட்டி", + "search_text": "உரையைத் தேடு", + "previous_match": "முந்தைய பொருத்தம்", + "next_match": "அடுத்த பொருத்தம்", + "close_search": "தேடலை மூடு", + "format_text": "உரையை வடிவமை", + "edit_link": "இணைப்பைத் திருத்து", + "insert_block": "தொகுதியைச் செருகு", + "select_language": "மொழியைத் தேர்வு செய்", + "search_in_document": "ஆவணத்தில் தேடு" + }, + "drop_zone": { + "text": "உங்கள் மார்க்டவுன் கோப்பை இங்கே விடுங்கள்" + }, + "help": { + "getting_started": "தொடங்குவோம்", + "editing": "திருத்தம்", + "shortcuts": "விசைப்பலகை குறுக்குவழிகள்", + "features": "அம்சங்கள்", + "fallback_notice": "இந்தப் பக்கம் இன்னும் உங்கள் மொழியில் கிடைக்கவில்லை. ஆங்கிலப் பதிப்பு காட்டப்படுகிறது." + }, + "recovery": { + "title": "சேமிக்கப்படாத மாற்றங்களை மீட்டெடுக்கவா?", + "message": "Kern முந்தைய அமர்விலிருந்து சேமிக்கப்படாத மாற்றங்களைக் கண்டறிந்தது. அவற்றை மீட்டெடுக்க விரும்புகிறீர்களா?", + "restore": "மீட்டெடு", + "discard": "நிராகரி" + }, + "export": { + "success": "PDF வெற்றிகரமாக ஏற்றுமதி செய்யப்பட்டது", + "open": "திறக்கவும்" + }, + "context": { + "cut": "வெட்டு", + "copy": "நகலெடு", + "paste": "ஒட்டு", + "paste_plain": "எளிய உரையாக ஒட்டு", + "select_all": "அனைத்தையும் தேர்ந்தெடு", + "copy_link": "இணைப்பை நகலெடு", + "open_link": "இணைப்பைத் திற", + "copy_image_address": "படத்தின் முகவரியை நகலெடு" + }, + "trial": { + "days_remaining": "சோதனையில் {days} நாட்கள் மீதமுள்ளன", + "expired_message": "உங்கள் சோதனை காலம் முடிந்தது. திருத்தத்தைத் தொடர Kern வாங்கவும்.", + "purchase_button": "Kern வாங்கவும்", + "purchase_title": "Kern திறக்கவும்", + "purchase_desc": "ஒரு முறை கொள்முதலில் அனைத்து திருத்தம் மற்றும் ஏற்றுமதி அம்சங்களுக்கும் முழு அணுகலைப் பெறுங்கள்.", + "feature_edit": "WYSIWYG மற்றும் பிரிப்புக் காட்சியில் Markdown திருத்தவும்", + "feature_save": "கோப்புகளைச் சேமிக்கவும் புதியவற்றை உருவாக்கவும்", + "feature_export": "PDF-க்கு ஏற்றுமதி செய்", + "restore_purchases": "கொள்முதல்களை மீட்டெடு", + "one_time_purchase": "ஒரு முறை கொள்முதல். சந்தா இல்லை.", + "purchasing": "வாங்குகிறது...", + "restoring": "மீட்டெடுக்கிறது..." + } +} diff --git a/src-mdviewer/src/locales/te.json b/src-mdviewer/src/locales/te.json new file mode 100644 index 0000000000..8879bbf144 --- /dev/null +++ b/src-mdviewer/src/locales/te.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "ఫైల్ తెరవండి", + "theme": "థీమ్ మార్చు", + "toc": "విషయ సూచిక", + "search": "శోధన", + "focus": "ఫోకస్ మోడ్", + "zoom_in": "జూమ్ ఇన్", + "zoom_out": "జూమ్ అవుట్", + "zoom_reset": "జూమ్ రీసెట్", + "save": "సేవ్", + "edit": "సవరించు", + "new_file": "కొత్త ఫైల్", + "split_view": "విభజన వీక్షణ", + "export_pdf": "PDF ఎగుమతి", + "settings": "సెట్టింగ్లు", + "more": "మరింత" + }, + "sidebar": { + "toc": "విషయ సూచిక", + "recent": "ఇటీవలి ఫైళ్లు", + "no_headings": "శీర్షికలు కనుగొనబడలేదు" + }, + "search": { + "placeholder": "పత్రంలో శోధించండి...", + "count": "సరిపోలికలు", + "no_results": "ఫలితాలు లేవు" + }, + "welcome": { + "title": "Kern", + "subtitle": "ఒక అందమైన మార్క్డౌన్ వ్యూయర్", + "new_button": "కొత్త ఫైల్", + "open_button": "ఫైల్ తెరవండి", + "drop_hint": "లేదా .md ఫైల్ను డ్రాగ్ & డ్రాప్ చేయండి" + }, + "viewer": { + "copy": "కాపీ", + "copied": "కాపీ చేయబడింది!" + }, + "settings": { + "theme": "థీమ్", + "theme_light": "లైట్", + "theme_dark": "డార్క్", + "theme_system": "సిస్టమ్", + "language": "భాష" + }, + "common": { + "close": "మూసివేయి", + "open": "తెరవండి", + "file": "ఫైల్" + }, + "format": { + "paragraph": "పేరా", + "heading1": "శీర్షిక 1", + "heading2": "శీర్షిక 2", + "heading3": "శీర్షిక 3", + "bold": "బోల్డ్ ({mod}+B)", + "italic": "ఇటాలిక్ ({mod}+I)", + "strikethrough": "స్ట్రైక్త్రూ ({mod}+Shift+X)", + "code": "ఇన్లైన్ కోడ్ ({mod}+E)", + "link": "లింక్ ({mod}+K)", + "bullet_list": "బుల్లెట్ జాబితా", + "numbered_list": "సంఖ్య జాబితా", + "task_list": "పని జాబితా", + "blockquote": "బ్లాక్కోట్", + "divider": "విభజకం", + "table": "టేబుల్", + "code_block": "కోడ్ బ్లాక్" + }, + "slash": { + "paragraph": "పేరా", + "paragraph_desc": "సాధారణ వచనం", + "heading1": "శీర్షిక 1", + "heading1_desc": "పెద్ద శీర్షిక", + "heading2": "శీర్షిక 2", + "heading2_desc": "మధ్యస్థ శీర్షిక", + "heading3": "శీర్షిక 3", + "heading3_desc": "చిన్న శీర్షిక", + "bullet_list": "బుల్లెట్ జాబితా", + "bullet_list_desc": "క్రమం లేని జాబితా", + "numbered_list": "సంఖ్య జాబితా", + "numbered_list_desc": "క్రమ జాబితా", + "task_list": "పని జాబితా", + "task_list_desc": "చెక్లిస్ట్", + "blockquote": "బ్లాక్కోట్", + "blockquote_desc": "కోట్ బ్లాక్", + "code_block": "కోడ్ బ్లాక్", + "code_block_desc": "ఫెన్స్డ్ కోడ్", + "table": "టేబుల్", + "table_desc": "3×3 టేబుల్", + "divider": "విభజకం", + "divider_desc": "అడ్డ గీత", + "no_results": "ఫలితాలు లేవు" + }, + "link": { + "edit": "సవరించు", + "edit_link": "లింక్ సవరించు", + "remove_link": "లింక్ తీసివేయి", + "text": "టెక్స్ట్", + "text_placeholder": "ప్రదర్శన టెక్స్ట్ (ఐచ్ఛికం)", + "display_text": "ప్రదర్శన టెక్స్ట్", + "url": "URL", + "url_placeholder": "URL పేస్ట్ చేయండి లేదా టైప్ చేయండి...", + "apply": "లింక్ వర్తింపజేయి", + "cancel": "రద్దు" + }, + "table": { + "header": "హెడర్", + "new_row": "+ కొత్త అడ్డు వరుస", + "row_options": "అడ్డు వరుస {n} ఎంపికలు", + "col_options": "నిలువు వరుస {n} ఎంపికలు", + "insert_row_above": "పైన అడ్డు వరుస చేర్చు", + "insert_row_below": "కింద అడ్డు వరుస చేర్చు", + "delete_row": "అడ్డు వరుస తొలగించు", + "insert_col_left": "ఎడమన నిలువు వరుస చేర్చు", + "insert_col_right": "కుడిన నిలువు వరుస చేర్చు", + "delete_col": "నిలువు వరుస తొలగించు", + "add_row_above": "పైన అడ్డు వరుస చేర్చు", + "add_row_below": "కింద అడ్డు వరుస చేర్చు", + "add_col_left": "ఎడమన నిలువు వరుస చేర్చు", + "add_col_right": "కుడిన నిలువు వరుస చేర్చు" + }, + "dialog": { + "unsaved_title": "సేవ్ చేయని మార్పులు", + "unsaved_exit_edit": "సేవ్ చేయని మార్పులు ఉన్నాయి. ఎడిట్ మోడ్ నుండి నిష్క్రమించే ముందు సేవ్ చేయాలనుకుంటున్నారా?", + "unsaved_new_file": "సేవ్ చేయని మార్పులు ఉన్నాయి. కొత్త ఫైల్ సృష్టించే ముందు సేవ్ చేయాలనుకుంటున్నారా?", + "unsaved_open_file": "సేవ్ చేయని మార్పులు ఉన్నాయి. కొత్త ఫైల్ తెరిచే ముందు సేవ్ చేయాలనుకుంటున్నారా?", + "save": "సేవ్", + "discard": "విస్మరించు", + "dont_save": "సేవ్ చేయవద్దు", + "cancel": "రద్దు చేయి", + "unsaved_close": "సేవ్ చేయని మార్పులు ఉన్నాయి. మూసివేయడానికి ముందు సేవ్ చేయాలనుకుంటున్నారా?" + }, + "lang_picker": { + "filter_placeholder": "భాషలను ఫిల్టర్ చేయండి...", + "filter_label": "భాషలను ఫిల్టర్ చేయండి", + "plain_text": "సాదా టెక్స్ట్" + }, + "a11y": { + "skip_to_content": "కంటెంట్కు వెళ్ళండి", + "main_toolbar": "ప్రధాన టూల్బార్", + "sidebar": "సైడ్బార్", + "search_text": "టెక్స్ట్ శోధన", + "previous_match": "మునుపటి సరిపోలిక", + "next_match": "తదుపరి సరిపోలిక", + "close_search": "శోధన మూసివేయి", + "format_text": "టెక్స్ట్ ఫార్మాట్", + "edit_link": "లింక్ సవరించు", + "insert_block": "బ్లాక్ చేర్చు", + "select_language": "భాష ఎంచుకోండి", + "search_in_document": "పత్రంలో శోధించండి" + }, + "drop_zone": { + "text": "మీ మార్క్డౌన్ ఫైల్ను ఇక్కడ వదలండి" + }, + "help": { + "getting_started": "ప్రారంభించండి", + "editing": "సవరణ", + "shortcuts": "కీబోర్డ్ షార్ట్కట్లు", + "features": "ఫీచర్లు", + "fallback_notice": "ఈ పేజీ ఇంకా మీ భాషలో అందుబాటులో లేదు. ఆంగ్ల సంస్కరణ చూపించబడుతోంది." + }, + "recovery": { + "title": "సేవ్ చేయని మార్పులను పునరుద్ధరించాలా?", + "message": "Kern మునుపటి సెషన్ నుండి సేవ్ చేయని మార్పులను కనుగొంది. వాటిని పునరుద్ధరించాలనుకుంటున్నారా?", + "restore": "పునరుద్ధరించు", + "discard": "విస్మరించు" + }, + "export": { + "success": "PDF విజయవంతంగా ఎగుమతి చేయబడింది", + "open": "తెరువు" + }, + "context": { + "cut": "కత్తిరించు", + "copy": "కాపీ చేయి", + "paste": "అతికించు", + "paste_plain": "సాదా వచనంగా అతికించు", + "select_all": "అన్నీ ఎంచుకో", + "copy_link": "లింక్ కాపీ చేయి", + "open_link": "లింక్ తెరువు", + "copy_image_address": "చిత్రం చిరునామా కాపీ చేయి" + }, + "trial": { + "days_remaining": "ట్రయల్లో {days} రోజులు మిగిలి ఉన్నాయి", + "expired_message": "మీ ట్రయల్ ముగిసింది. ఎడిటింగ్ కొనసాగించడానికి Kern కొనుగోలు చేయండి.", + "purchase_button": "Kern కొనుగోలు చేయండి", + "purchase_title": "Kern అన్లాక్ చేయండి", + "purchase_desc": "ఒకేసారి కొనుగోలు ద్వారా అన్ని ఎడిటింగ్ మరియు ఎగుమతి ఫీచర్లకు పూర్తి యాక్సెస్ పొందండి.", + "feature_edit": "WYSIWYG మరియు విభజన వీక్షణతో Markdown సవరించండి", + "feature_save": "ఫైల్లను సేవ్ చేయండి మరియు కొత్తవి సృష్టించండి", + "feature_export": "PDF కి ఎగుమతి చేయండి", + "restore_purchases": "కొనుగోళ్లను పునరుద్ధరించండి", + "one_time_purchase": "ఒకేసారి కొనుగోలు. సబ్స్క్రిప్షన్ లేదు.", + "purchasing": "కొనుగోలు చేస్తోంది...", + "restoring": "పునరుద్ధరిస్తోంది..." + } +} diff --git a/src-mdviewer/src/locales/th.json b/src-mdviewer/src/locales/th.json new file mode 100644 index 0000000000..ddbbfdf39b --- /dev/null +++ b/src-mdviewer/src/locales/th.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "เปิดไฟล์", + "theme": "สลับธีม", + "toc": "สารบัญ", + "search": "ค้นหา", + "focus": "โหมดโฟกัส", + "zoom_in": "ซูมเข้า", + "zoom_out": "ซูมออก", + "zoom_reset": "รีเซ็ตซูม", + "save": "บันทึก", + "edit": "แก้ไข", + "new_file": "ไฟล์ใหม่", + "split_view": "มุมมองแบ่ง", + "export_pdf": "ส่งออก PDF", + "settings": "ตั้งค่า", + "more": "เพิ่มเติม" + }, + "sidebar": { + "toc": "สารบัญ", + "recent": "ไฟล์ล่าสุด", + "no_headings": "ไม่พบหัวข้อ" + }, + "search": { + "placeholder": "ค้นหาในเอกสาร...", + "count": "รายการที่ตรงกัน", + "no_results": "ไม่พบผลลัพธ์" + }, + "welcome": { + "title": "Kern", + "subtitle": "โปรแกรมดู Markdown ที่สวยงาม", + "new_button": "ไฟล์ใหม่", + "open_button": "เปิดไฟล์", + "drop_hint": "หรือลากและวางไฟล์ .md" + }, + "viewer": { + "copy": "คัดลอก", + "copied": "คัดลอกแล้ว!" + }, + "settings": { + "theme": "ธีม", + "theme_light": "สว่าง", + "theme_dark": "มืด", + "theme_system": "ระบบ", + "language": "ภาษา" + }, + "common": { + "close": "ปิด", + "open": "เปิด", + "file": "ไฟล์" + }, + "format": { + "paragraph": "ย่อหน้า", + "heading1": "หัวข้อ 1", + "heading2": "หัวข้อ 2", + "heading3": "หัวข้อ 3", + "bold": "ตัวหนา ({mod}+B)", + "italic": "ตัวเอียง ({mod}+I)", + "strikethrough": "ขีดฆ่า ({mod}+Shift+X)", + "code": "โค้ดอินไลน์ ({mod}+E)", + "link": "ลิงก์ ({mod}+K)", + "bullet_list": "รายการสัญลักษณ์", + "numbered_list": "รายการตัวเลข", + "task_list": "รายการงาน", + "blockquote": "บล็อกอ้างอิง", + "divider": "เส้นแบ่ง", + "table": "ตาราง", + "code_block": "บล็อกโค้ด" + }, + "slash": { + "paragraph": "ย่อหน้า", + "paragraph_desc": "ข้อความปกติ", + "heading1": "หัวข้อ 1", + "heading1_desc": "หัวข้อใหญ่", + "heading2": "หัวข้อ 2", + "heading2_desc": "หัวข้อกลาง", + "heading3": "หัวข้อ 3", + "heading3_desc": "หัวข้อเล็ก", + "bullet_list": "รายการสัญลักษณ์", + "bullet_list_desc": "รายการไม่เรียงลำดับ", + "numbered_list": "รายการตัวเลข", + "numbered_list_desc": "รายการเรียงลำดับ", + "task_list": "รายการงาน", + "task_list_desc": "เช็คลิสต์", + "blockquote": "บล็อกอ้างอิง", + "blockquote_desc": "บล็อกคำพูด", + "code_block": "บล็อกโค้ด", + "code_block_desc": "โค้ดแบบล้อมรั้ว", + "table": "ตาราง", + "table_desc": "ตาราง 3×3", + "divider": "เส้นแบ่ง", + "divider_desc": "เส้นแนวนอน", + "no_results": "ไม่พบผลลัพธ์" + }, + "link": { + "edit": "แก้ไข", + "edit_link": "แก้ไขลิงก์", + "remove_link": "ลบลิงก์", + "text": "ข้อความ", + "text_placeholder": "ข้อความแสดง (ไม่บังคับ)", + "display_text": "ข้อความแสดง", + "url": "URL", + "url_placeholder": "วาง URL หรือพิมพ์...", + "apply": "ใช้ลิงก์", + "cancel": "ยกเลิก" + }, + "table": { + "header": "หัวตาราง", + "new_row": "+ แถวใหม่", + "row_options": "ตัวเลือกแถว {n}", + "col_options": "ตัวเลือกคอลัมน์ {n}", + "insert_row_above": "แทรกแถวด้านบน", + "insert_row_below": "แทรกแถวด้านล่าง", + "delete_row": "ลบแถว", + "insert_col_left": "แทรกคอลัมน์ด้านซ้าย", + "insert_col_right": "แทรกคอลัมน์ด้านขวา", + "delete_col": "ลบคอลัมน์", + "add_row_above": "เพิ่มแถวด้านบน", + "add_row_below": "เพิ่มแถวด้านล่าง", + "add_col_left": "เพิ่มคอลัมน์ด้านซ้าย", + "add_col_right": "เพิ่มคอลัมน์ด้านขวา" + }, + "dialog": { + "unsaved_title": "การเปลี่ยนแปลงที่ยังไม่บันทึก", + "unsaved_exit_edit": "มีการเปลี่ยนแปลงที่ยังไม่บันทึก คุณต้องการบันทึกก่อนออกจากโหมดแก้ไขหรือไม่?", + "unsaved_new_file": "มีการเปลี่ยนแปลงที่ยังไม่บันทึก คุณต้องการบันทึกก่อนสร้างไฟล์ใหม่หรือไม่?", + "unsaved_open_file": "มีการเปลี่ยนแปลงที่ยังไม่บันทึก คุณต้องการบันทึกก่อนเปิดไฟล์ใหม่หรือไม่?", + "save": "บันทึก", + "discard": "ทิ้ง", + "dont_save": "ไม่บันทึก", + "cancel": "ยกเลิก", + "unsaved_close": "คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก ต้องการบันทึกก่อนปิดหรือไม่?" + }, + "lang_picker": { + "filter_placeholder": "กรองภาษา...", + "filter_label": "กรองภาษา", + "plain_text": "ข้อความธรรมดา" + }, + "a11y": { + "skip_to_content": "ข้ามไปที่เนื้อหา", + "main_toolbar": "แถบเครื่องมือหลัก", + "sidebar": "แถบด้านข้าง", + "search_text": "ค้นหาข้อความ", + "previous_match": "รายการก่อนหน้า", + "next_match": "รายการถัดไป", + "close_search": "ปิดการค้นหา", + "format_text": "จัดรูปแบบข้อความ", + "edit_link": "แก้ไขลิงก์", + "insert_block": "แทรกบล็อก", + "select_language": "เลือกภาษา", + "search_in_document": "ค้นหาในเอกสาร" + }, + "drop_zone": { + "text": "วางไฟล์ Markdown ของคุณที่นี่" + }, + "help": { + "getting_started": "เริ่มต้นใช้งาน", + "editing": "การแก้ไข", + "shortcuts": "แป้นพิมพ์ลัด", + "features": "คุณสมบัติ", + "fallback_notice": "หน้านี้ยังไม่มีในภาษาของคุณ กำลังแสดงเวอร์ชันภาษาอังกฤษ" + }, + "recovery": { + "title": "กู้คืนการเปลี่ยนแปลงที่ไม่ได้บันทึก?", + "message": "Kern พบการเปลี่ยนแปลงที่ไม่ได้บันทึกจากเซสชันก่อนหน้า คุณต้องการกู้คืนหรือไม่?", + "restore": "กู้คืน", + "discard": "ละทิ้ง" + }, + "export": { + "success": "ส่งออก PDF สำเร็จ", + "open": "เปิด" + }, + "context": { + "cut": "ตัด", + "copy": "คัดลอก", + "paste": "วาง", + "paste_plain": "วางเป็นข้อความธรรมดา", + "select_all": "เลือกทั้งหมด", + "copy_link": "คัดลอกลิงก์", + "open_link": "เปิดลิงก์", + "copy_image_address": "คัดลอกที่อยู่รูปภาพ" + }, + "trial": { + "days_remaining": "เหลืออีก {days} วันในช่วงทดลองใช้", + "expired_message": "ช่วงทดลองใช้ของคุณหมดอายุแล้ว ซื้อ Kern เพื่อแก้ไขต่อ", + "purchase_button": "ซื้อ Kern", + "purchase_title": "ปลดล็อก Kern", + "purchase_desc": "เข้าถึงฟีเจอร์แก้ไขและส่งออกทั้งหมดด้วยการซื้อครั้งเดียว", + "feature_edit": "แก้ไข Markdown ด้วย WYSIWYG และมุมมองแบ่ง", + "feature_save": "บันทึกและสร้างไฟล์ใหม่", + "feature_export": "ส่งออกเป็น PDF", + "restore_purchases": "กู้คืนการซื้อ", + "one_time_purchase": "ซื้อครั้งเดียว ไม่มีการสมัครสมาชิก", + "purchasing": "กำลังซื้อ...", + "restoring": "กำลังกู้คืน..." + } +} diff --git a/src-mdviewer/src/locales/tr.json b/src-mdviewer/src/locales/tr.json new file mode 100644 index 0000000000..30ca261540 --- /dev/null +++ b/src-mdviewer/src/locales/tr.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Aramayı kapat", + "edit_link": "Bağlantıyı düzenle", + "format_text": "Metni biçimlendir", + "insert_block": "Blok ekle", + "main_toolbar": "Ana araç çubuğu", + "next_match": "Sonraki eşleşme", + "previous_match": "Önceki eşleşme", + "search_in_document": "Belgede ara", + "search_text": "Metin ara", + "select_language": "Dil seç", + "sidebar": "Kenar Çubuğu", + "skip_to_content": "İçeriğe atla" + }, + "common": { + "close": "Kapat", + "file": "Dosya", + "open": "Aç" + }, + "context": { + "copy": "Kopyala", + "copy_image_address": "Resim Adresini Kopyala", + "copy_link": "Bağlantıyı Kopyala", + "cut": "Kes", + "open_link": "Bağlantıyı Aç", + "paste": "Yapıştır", + "paste_plain": "Düz Metin Olarak Yapıştır", + "select_all": "Tümünü Seç" + }, + "dialog": { + "cancel": "İptal", + "discard": "Vazgeç", + "dont_save": "Kaydetme", + "save": "Kaydet", + "unsaved_close": "Kaydedilmemiş değişiklikleriniz var. Kapatmadan önce kaydetmek ister misiniz?", + "unsaved_exit_edit": "Kaydedilmemiş değişiklikleriniz var. Düzenleme modundan çıkmadan önce kaydetmek ister misiniz?", + "unsaved_new_file": "Kaydedilmemiş değişiklikleriniz var. Yeni bir dosya oluşturmadan önce kaydetmek ister misiniz?", + "unsaved_open_file": "Kaydedilmemiş değişiklikleriniz var. Yeni bir dosya açmadan önce kaydetmek ister misiniz?", + "unsaved_title": "Kaydedilmemiş Değişiklikler" + }, + "drop_zone": { + "text": "Markdown dosyanızı buraya bırakın" + }, + "export": { + "open": "Aç", + "success": "PDF başarıyla dışa aktarıldı" + }, + "format": { + "block_type": "Blok türü", + "blockquote": "Alıntı bloku", + "bold": "Kalın ({mod}+B)", + "bullet_list": "Madde işaretli liste", + "code": "Satır içi kod ({mod}+E)", + "code_block": "Kod bloğu", + "divider": "Ayırıcı", + "heading1": "Başlık 1", + "heading2": "Başlık 2", + "heading3": "Başlık 3", + "italic": "İtalik ({mod}+I)", + "link": "Bağlantı ({mod}+K)", + "lists": "Listeler", + "more_elements": "Daha fazla", + "numbered_list": "Numaralı liste", + "paragraph": "Paragraf", + "strikethrough": "Üstü çizili ({mod}+Shift+X)", + "table": "Tablo", + "task_list": "Görev listesi", + "text_formatting": "Metin biçimlendirme", + "underline": "Altı çizili" + }, + "help": { + "editing": "Düzenleme", + "fallback_notice": "Bu sayfa henüz dilinizde mevcut değil. İngilizce sürüm gösteriliyor.", + "features": "Özellikler", + "getting_started": "Başlarken", + "shortcuts": "Klavye Kısayolları" + }, + "lang_picker": { + "filter_label": "Dilleri filtrele", + "filter_placeholder": "Dilleri filtrele...", + "plain_text": "Düz metin" + }, + "link": { + "apply": "Bağlantıyı uygula", + "cancel": "İptal", + "display_text": "Görünen metin", + "edit": "Düzenle", + "edit_link": "Bağlantıyı düzenle", + "remove_link": "Bağlantıyı kaldır", + "text": "Metin", + "text_placeholder": "Görüntülenecek metin (isteğe bağlı)", + "url": "URL", + "url_placeholder": "URL'yi yapıştırın veya yazın..." + }, + "mermaid": { + "done": "Bitti", + "edit": "Düzenle", + "error_prefix": "Söz dizimi hatası", + "stale": "Önizleme güncel değil" + }, + "recovery": { + "discard": "Vazgeç", + "message": "Kern, önceki bir oturumdan kaydedilmemiş değişiklikler buldu. Bunları geri yüklemek ister misiniz?", + "restore": "Geri Yükle", + "title": "Kaydedilmemiş değişiklikler kurtarılsın mı?" + }, + "search": { + "count": "eşleşme", + "no_results": "Sonuç bulunamadı", + "placeholder": "Belgede ara..." + }, + "settings": { + "language": "Dil", + "theme": "Tema", + "theme_dark": "Koyu", + "theme_light": "Açık", + "theme_system": "Sistem" + }, + "sidebar": { + "no_headings": "Başlık bulunamadı", + "recent": "Son Dosyalar", + "toc": "İçindekiler" + }, + "slash": { + "blockquote": "Alıntı", + "blockquote_desc": "Alıntı bloku", + "bullet_list": "Maddeli liste", + "bullet_list_desc": "Sırasız liste", + "code_block": "Kod bloku", + "code_block_desc": "Çerçeveli kod", + "divider": "Ayırıcı", + "divider_desc": "Yatay çizgi", + "heading1": "Başlık 1", + "heading1_desc": "Büyük başlık", + "heading2": "Başlık 2", + "heading2_desc": "Orta boy başlık", + "heading3": "Başlık 3", + "heading3_desc": "Küçük başlık", + "mermaid": "Mermaid diyagramı", + "mermaid_desc": "Bir diyagram ekle", + "no_results": "Sonuç bulunamadı", + "numbered_list": "Numaralı liste", + "numbered_list_desc": "Sıralı liste", + "paragraph": "Paragraf", + "paragraph_desc": "Düz metin", + "table": "Tablo", + "table_desc": "3×3 tablo", + "task_list": "Görev listesi", + "task_list_desc": "Kontrol listesi" + }, + "table": { + "add_col_left": "Sola sütun ekle", + "add_col_right": "Sağa sütun ekle", + "add_row_above": "Yukarıya satır ekle", + "add_row_below": "Aşağıya satır ekle", + "col_options": "Sütun {n} seçenekleri", + "delete_col": "Sütunu sil", + "delete_row": "Satırı sil", + "header": "Başlık", + "insert_col_left": "Sola sütun ekle", + "insert_col_right": "Sağa sütun ekle", + "insert_row_above": "Yukarıya satır ekle", + "insert_row_below": "Aşağıya satır ekle", + "new_row": "+ Yeni satır", + "row_options": "{n}. satır seçenekleri" + }, + "toolbar": { + "done": "Bitti", + "edit": "Düzenle", + "export_pdf": "PDF Dışa Aktar", + "focus": "Odak Modu", + "more": "Daha Fazla", + "new_file": "Yeni Dosya", + "open": "Dosya Aç", + "save": "Kaydet", + "search": "Ara", + "settings": "Ayarlar", + "split_view": "Bölünmüş Görünüm", + "theme": "Temayı Değiştir", + "toc": "İçindekiler", + "zoom_in": "Yakınlaştır", + "zoom_out": "Uzaklaştır", + "zoom_reset": "Yakınlaştırmayı Sıfırla" + }, + "trial": { + "days_remaining": "Deneme süresinin bitmesine {days} gün kaldı", + "expired_message": "Deneme süreniz sona erdi. Düzenlemeye devam etmek için Kern'i satın alın.", + "feature_edit": "WYSIWYG ve bölünmüş görünüm ile Markdown düzenleyin", + "feature_export": "PDF'e Dışa Aktar", + "feature_save": "Kaydedin ve yeni dosyalar oluşturun", + "one_time_purchase": "Tek seferlik satın alım. Abonelik yok.", + "purchase_button": "Kern'i Satın Alın", + "purchase_desc": "Tek seferlik satın alımla tüm düzenleme ve dışa aktarma özelliklerine tam erişim elde edin.", + "purchase_title": "Kern'in Kilidini Açın", + "purchasing": "Satın alınıyor...", + "restore_purchases": "Satın Alımları Geri Yükle", + "restoring": "Geri yükleniyor..." + }, + "viewer": { + "copied": "Kopyalandı!", + "copy": "Kopyala" + }, + "welcome": { + "drop_hint": "veya bir .md dosyasını sürükleyip bırakın", + "new_button": "Yeni Dosya", + "open_button": "Dosya Aç", + "subtitle": "Harika bir Markdown görüntüleyici", + "title": "Kern" + } +} diff --git a/src-mdviewer/src/locales/uk.json b/src-mdviewer/src/locales/uk.json new file mode 100644 index 0000000000..afe227ddeb --- /dev/null +++ b/src-mdviewer/src/locales/uk.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "Закрити пошук", + "edit_link": "Редагувати посилання", + "format_text": "Форматувати текст", + "insert_block": "Вставити блок", + "main_toolbar": "Головна панель інструментів", + "next_match": "Наступний збіг", + "previous_match": "Попередній збіг", + "search_in_document": "Пошук у документі", + "search_text": "Пошук тексту", + "select_language": "Вибрати мову", + "sidebar": "Бічна панель", + "skip_to_content": "Перейти до вмісту" + }, + "common": { + "close": "Закрити", + "file": "Файл", + "open": "Відкрити" + }, + "context": { + "copy": "Копіювати", + "copy_image_address": "Копіювати адресу зображення", + "copy_link": "Копіювати посилання", + "cut": "Вирізати", + "open_link": "Відкрити посилання", + "paste": "Вставити", + "paste_plain": "Вставити як звичайний текст", + "select_all": "Виділити все" + }, + "dialog": { + "cancel": "Скасувати", + "discard": "Відхилити", + "dont_save": "Не зберігати", + "save": "Зберегти", + "unsaved_close": "У вас є незбережені зміни. Бажаєте зберегти їх перед закриттям?", + "unsaved_exit_edit": "У вас є незбережені зміни. Бажаєте зберегти їх перед виходом із режиму редагування?", + "unsaved_new_file": "У вас є незбережені зміни. Бажаєте зберегти їх перед створенням нового файлу?", + "unsaved_open_file": "У вас є незбережені зміни. Бажаєте зберегти їх перед відкриттям нового файлу?", + "unsaved_title": "Незбережені зміни" + }, + "drop_zone": { + "text": "Перетягніть сюди ваш Markdown-файл" + }, + "export": { + "open": "Відкрити", + "success": "PDF успішно експортовано" + }, + "format": { + "block_type": "Тип блоку", + "blockquote": "Цитата", + "bold": "Напівжирний ({mod}+B)", + "bullet_list": "Маркований список", + "code": "Вбудований код ({mod}+E)", + "code_block": "Блок коду", + "divider": "Розділювач", + "heading1": "Заголовок 1", + "heading2": "Заголовок 2", + "heading3": "Заголовок 3", + "italic": "Курсив ({mod}+I)", + "link": "Посилання ({mod}+K)", + "lists": "Списки", + "more_elements": "Більше", + "numbered_list": "Нумерований список", + "paragraph": "Абзац", + "strikethrough": "Закреслений ({mod}+Shift+X)", + "table": "Таблиця", + "task_list": "Список завдань", + "text_formatting": "Форматування тексту", + "underline": "Підкреслений" + }, + "help": { + "editing": "Редагування", + "fallback_notice": "Ця сторінка ще не доступна вашою мовою. Показуємо англійську версію.", + "features": "Можливості", + "getting_started": "Початок роботи", + "shortcuts": "Клавіатурні скорочення" + }, + "lang_picker": { + "filter_label": "Фільтрувати мови", + "filter_placeholder": "Фільтрувати мови...", + "plain_text": "Простий текст" + }, + "link": { + "apply": "Застосувати", + "cancel": "Скасувати", + "display_text": "Текст для відображення", + "edit": "Редагувати", + "edit_link": "Редагувати посилання", + "remove_link": "Видалити посилання", + "text": "Текст", + "text_placeholder": "Текст для відображення (необов'язково)", + "url": "URL", + "url_placeholder": "Вставте або введіть URL..." + }, + "mermaid": { + "done": "Готово", + "edit": "Редагувати", + "error_prefix": "Синтаксична помилка", + "stale": "Попередній перегляд застарів" + }, + "recovery": { + "discard": "Відхилити", + "message": "Kern виявив незбережені зміни з попереднього сеансу. Бажаєте відновити їх?", + "restore": "Відновити", + "title": "Відновити незбережені зміни?" + }, + "search": { + "count": "збігів", + "no_results": "Немає результатів", + "placeholder": "Пошук у документі..." + }, + "settings": { + "language": "Мова", + "theme": "Тема", + "theme_dark": "Темна", + "theme_light": "Світла", + "theme_system": "Системна" + }, + "sidebar": { + "no_headings": "Заголовків не знайдено", + "recent": "Нещодавні файли", + "toc": "Зміст" + }, + "slash": { + "blockquote": "Цитата", + "blockquote_desc": "Блок цитати", + "bullet_list": "Маркований список", + "bullet_list_desc": "Невпорядкований список", + "code_block": "Блок коду", + "code_block_desc": "Виділений код", + "divider": "Розділювач", + "divider_desc": "Горизонтальна лінія", + "heading1": "Заголовок 1", + "heading1_desc": "Великий заголовок", + "heading2": "Заголовок 2", + "heading2_desc": "Середній заголовок", + "heading3": "Заголовок 3", + "heading3_desc": "Малий заголовок", + "mermaid": "Діаграма Mermaid", + "mermaid_desc": "Вставити діаграму", + "no_results": "Немає результатів", + "numbered_list": "Нумерований список", + "numbered_list_desc": "Упорядкований список", + "paragraph": "Абзац", + "paragraph_desc": "Звичайний текст", + "table": "Таблиця", + "table_desc": "Таблиця 3×3", + "task_list": "Список завдань", + "task_list_desc": "Контрольний список" + }, + "table": { + "add_col_left": "Додати стовпець ліворуч", + "add_col_right": "Додати стовпець праворуч", + "add_row_above": "Додати рядок вище", + "add_row_below": "Додати рядок нижче", + "col_options": "Параметри стовпця {n}", + "delete_col": "Видалити стовпець", + "delete_row": "Видалити рядок", + "header": "Заголовок", + "insert_col_left": "Вставити стовпець ліворуч", + "insert_col_right": "Вставити стовпець праворуч", + "insert_row_above": "Вставити рядок вище", + "insert_row_below": "Вставити рядок нижче", + "new_row": "+ Новий рядок", + "row_options": "Параметри рядка {n}" + }, + "toolbar": { + "done": "Готово", + "edit": "Редагувати", + "export_pdf": "Експортувати в PDF", + "focus": "Режим фокусування", + "more": "Ще", + "new_file": "Новий файл", + "open": "Відкрити файл", + "save": "Зберегти", + "search": "Пошук", + "settings": "Налаштування", + "split_view": "Розділений вигляд", + "theme": "Перемкнути тему", + "toc": "Зміст", + "zoom_in": "Збільшити", + "zoom_out": "Зменшити", + "zoom_reset": "Скинути масштаб" + }, + "trial": { + "days_remaining": "{days} днів залишилося у пробній версії", + "expired_message": "Ваш пробний період завершився. Придбайте Kern, щоб продовжити редагування.", + "feature_edit": "Редагуйте Markdown у режимі WYSIWYG та розділеного перегляду", + "feature_export": "Експорт у PDF", + "feature_save": "Зберігайте та створюйте нові файли", + "one_time_purchase": "Одноразова покупка. Без підписок.", + "purchase_button": "Придбати Kern", + "purchase_desc": "Отримайте повний доступ до всіх функцій редагування та експорту за допомогою одноразової покупки.", + "purchase_title": "Розблокувати Kern", + "purchasing": "Здійснення покупки...", + "restore_purchases": "Відновити покупки", + "restoring": "Відновлення..." + }, + "viewer": { + "copied": "Скопійовано!", + "copy": "Копіювати" + }, + "welcome": { + "drop_hint": "або перетягніть файл .md", + "new_button": "Новий файл", + "open_button": "Відкрити файл", + "subtitle": "Гарний переглядач файлів Markdown", + "title": "Керн" + } +} diff --git a/src-mdviewer/src/locales/ur.json b/src-mdviewer/src/locales/ur.json new file mode 100644 index 0000000000..208a248ede --- /dev/null +++ b/src-mdviewer/src/locales/ur.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "تلاش بند کریں", + "edit_link": "لنک میں ترمیم کریں", + "format_text": "متن فارمیٹ", + "insert_block": "بلاک شامل کریں", + "main_toolbar": "اصل ٹول بار", + "next_match": "اگلا نتیجہ", + "previous_match": "پچھلا نتیجہ", + "search_in_document": "دستاویز میں تلاش کریں", + "search_text": "متن تلاش کریں", + "select_language": "زبان منتخب کریں", + "sidebar": "سائیڈ بار", + "skip_to_content": "مواد پر جائیں" + }, + "common": { + "close": "بند کریں", + "file": "فائل", + "open": "کھولیں" + }, + "context": { + "copy": "کاپی کریں", + "copy_image_address": "تصویر کا پتہ کاپی کریں", + "copy_link": "لنک کاپی کریں", + "cut": "کاٹیں", + "open_link": "لنک کھولیں", + "paste": "پیسٹ کریں", + "paste_plain": "سادہ متن کے طور پر پیسٹ کریں", + "select_all": "سب منتخب کریں" + }, + "dialog": { + "cancel": "منسوخ", + "discard": "رد کریں", + "dont_save": "محفوظ نہ کریں", + "save": "محفوظ کریں", + "unsaved_close": "آپ کے پاس غیر محفوظ تبدیلیاں ہیں۔ بند کرنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "unsaved_exit_edit": "غیر محفوظ تبدیلیاں ہیں۔ ترمیمی موڈ سے نکلنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "unsaved_new_file": "غیر محفوظ تبدیلیاں ہیں۔ نئی فائل بنانے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "unsaved_open_file": "غیر محفوظ تبدیلیاں ہیں۔ نئی فائل کھولنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "unsaved_title": "غیر محفوظ تبدیلیاں" + }, + "drop_zone": { + "text": "اپنی مارک ڈاؤن فائل یہاں چھوڑیں" + }, + "export": { + "open": "کھولیں", + "success": "PDF کامیابی سے برآمد ہوئی" + }, + "format": { + "blockquote": "بلاک کوٹ", + "bold": "بولڈ ({mod}+B)", + "bullet_list": "بلٹ فہرست", + "code": "ان لائن کوڈ ({mod}+E)", + "code_block": "کوڈ بلاک", + "divider": "تقسیم کار", + "heading1": "سرخی 1", + "heading2": "سرخی 2", + "heading3": "سرخی 3", + "italic": "اٹیلک ({mod}+I)", + "link": "لنک ({mod}+K)", + "numbered_list": "نمبر فہرست", + "paragraph": "پیراگراف", + "strikethrough": "سٹرائیک تھرو ({mod}+Shift+X)", + "table": "ٹیبل", + "task_list": "ٹاسک فہرست", + "block_type": "بلاک کی قسم", + "lists": "فہرستیں", + "more_elements": "مزید", + "text_formatting": "ٹیکسٹ فارمیٹنگ", + "underline": "انڈر لائن" + }, + "help": { + "editing": "ترمیم", + "fallback_notice": "یہ صفحہ ابھی آپ کی زبان میں دستیاب نہیں ہے۔ انگریزی ورژن دکھایا جا رہا ہے۔", + "features": "خصوصیات", + "getting_started": "شروع کریں", + "shortcuts": "کیبورڈ شارٹ کٹ" + }, + "lang_picker": { + "filter_label": "زبانیں فلٹر کریں", + "filter_placeholder": "زبانیں فلٹر کریں...", + "plain_text": "سادہ متن" + }, + "link": { + "apply": "لنک لاگو کریں", + "cancel": "منسوخ", + "display_text": "ڈسپلے متن", + "edit": "ترمیم", + "edit_link": "لنک میں ترمیم کریں", + "remove_link": "لنک ہٹائیں", + "text": "متن", + "text_placeholder": "ڈسپلے متن (اختیاری)", + "url": "URL", + "url_placeholder": "URL پیسٹ یا ٹائپ کریں..." + }, + "recovery": { + "discard": "چھوڑ دیں", + "message": "Kern نے پچھلے سیشن سے غیر محفوظ تبدیلیاں پائیں۔ کیا آپ انہیں بحال کرنا چاہتے ہیں؟", + "restore": "بحال کریں", + "title": "غیر محفوظ تبدیلیاں بحال کریں؟" + }, + "search": { + "count": "نتائج", + "no_results": "کوئی نتائج نہیں", + "placeholder": "دستاویز میں تلاش کریں..." + }, + "settings": { + "language": "زبان", + "theme": "تھیم", + "theme_dark": "گہرا", + "theme_light": "ہلکا", + "theme_system": "سسٹم" + }, + "sidebar": { + "no_headings": "کوئی سرخیاں نہیں ملیں", + "recent": "حالیہ فائلیں", + "toc": "فہرست مضامین" + }, + "slash": { + "blockquote": "بلاک کوٹ", + "blockquote_desc": "اقتباس بلاک", + "bullet_list": "بلٹ فہرست", + "bullet_list_desc": "غیر ترتیب فہرست", + "code_block": "کوڈ بلاک", + "code_block_desc": "فینسڈ کوڈ", + "divider": "تقسیم کار", + "divider_desc": "افقی لکیر", + "heading1": "سرخی 1", + "heading1_desc": "بڑی سرخی", + "heading2": "سرخی 2", + "heading2_desc": "درمیانی سرخی", + "heading3": "سرخی 3", + "heading3_desc": "چھوٹی سرخی", + "no_results": "کوئی نتائج نہیں", + "numbered_list": "نمبر فہرست", + "numbered_list_desc": "ترتیب فہرست", + "paragraph": "پیراگراف", + "paragraph_desc": "سادہ متن", + "table": "ٹیبل", + "table_desc": "3×3 ٹیبل", + "task_list": "ٹاسک فہرست", + "task_list_desc": "چیک لسٹ", + "mermaid": "Mermaid ڈایاگرام", + "mermaid_desc": "ڈایاگرام داخل کریں" + }, + "table": { + "add_col_left": "بائیں کالم شامل کریں", + "add_col_right": "دائیں کالم شامل کریں", + "add_row_above": "اوپر قطار شامل کریں", + "add_row_below": "نیچے قطار شامل کریں", + "col_options": "کالم {n} اختیارات", + "delete_col": "کالم حذف کریں", + "delete_row": "قطار حذف کریں", + "header": "ہیڈر", + "insert_col_left": "بائیں کالم شامل کریں", + "insert_col_right": "دائیں کالم شامل کریں", + "insert_row_above": "اوپر قطار شامل کریں", + "insert_row_below": "نیچے قطار شامل کریں", + "new_row": "+ نئی قطار", + "row_options": "قطار {n} اختیارات" + }, + "toolbar": { + "edit": "ترمیم", + "export_pdf": "PDF برآمد کریں", + "focus": "فوکس موڈ", + "more": "مزید", + "new_file": "نئی فائل", + "open": "فائل کھولیں", + "save": "محفوظ کریں", + "search": "تلاش", + "settings": "ترتیبات", + "split_view": "تقسیم نظارہ", + "theme": "تھیم تبدیل کریں", + "toc": "فہرست مضامین", + "zoom_in": "زوم ان", + "zoom_out": "زوم آؤٹ", + "zoom_reset": "زوم ری سیٹ", + "done": "مکمل" + }, + "trial": { + "days_remaining": "آزمائشی مدت میں {days} دن باقی", + "expired_message": "آپ کی آزمائشی مدت ختم ہو گئی ہے۔ ترمیم جاری رکھنے کے لیے Kern خریدیں۔", + "feature_edit": "WYSIWYG اور تقسیم نظارے سے Markdown میں ترمیم کریں", + "feature_export": "PDF میں برآمد کریں", + "feature_save": "فائلیں محفوظ کریں اور نئی بنائیں", + "one_time_purchase": "ایک بار کی خریداری۔ کوئی سبسکرپشن نہیں۔", + "purchase_button": "Kern خریدیں", + "purchase_desc": "ایک بار کی خریداری سے تمام ترمیمی اور برآمدی خصوصیات تک مکمل رسائی حاصل کریں۔", + "purchase_title": "Kern کھولیں", + "purchasing": "خریداری ہو رہی ہے...", + "restore_purchases": "خریداریاں بحال کریں", + "restoring": "بحالی ہو رہی ہے..." + }, + "viewer": { + "copied": "کاپی ہو گیا!", + "copy": "کاپی" + }, + "welcome": { + "drop_hint": "یا .md فائل کو ڈریگ اور ڈراپ کریں", + "new_button": "نئی فائل", + "open_button": "فائل کھولیں", + "subtitle": "ایک خوبصورت مارک ڈاؤن ویوئر", + "title": "Kern" + }, + "mermaid": { + "done": "مکمل", + "edit": "ترمیم کریں", + "error_prefix": "سنٹیکس کی خرابی", + "stale": "پریویو پرانا ہو گیا" + } +} diff --git a/src-mdviewer/src/locales/vi.json b/src-mdviewer/src/locales/vi.json new file mode 100644 index 0000000000..67896aa9ad --- /dev/null +++ b/src-mdviewer/src/locales/vi.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "Mở tệp", + "theme": "Chuyển giao diện", + "toc": "Mục lục", + "search": "Tìm kiếm", + "focus": "Chế độ tập trung", + "zoom_in": "Phóng to", + "zoom_out": "Thu nhỏ", + "zoom_reset": "Đặt lại thu phóng", + "save": "Lưu", + "edit": "Chỉnh sửa", + "new_file": "Tệp mới", + "split_view": "Chia đôi màn hình", + "export_pdf": "Xuất PDF", + "settings": "Cài đặt", + "more": "Thêm" + }, + "sidebar": { + "toc": "Mục lục", + "recent": "Tệp gần đây", + "no_headings": "Không tìm thấy tiêu đề" + }, + "search": { + "placeholder": "Tìm trong tài liệu...", + "count": "kết quả", + "no_results": "Không có kết quả" + }, + "welcome": { + "title": "Kern", + "subtitle": "Trình xem Markdown đẹp mắt", + "new_button": "Tệp mới", + "open_button": "Mở tệp", + "drop_hint": "hoặc kéo thả tệp .md vào đây" + }, + "viewer": { + "copy": "Sao chép", + "copied": "Đã sao chép!" + }, + "settings": { + "theme": "Giao diện", + "theme_light": "Sáng", + "theme_dark": "Tối", + "theme_system": "Hệ thống", + "language": "Ngôn ngữ" + }, + "common": { + "close": "Đóng", + "open": "Mở", + "file": "Tệp" + }, + "format": { + "paragraph": "Đoạn văn", + "heading1": "Tiêu đề 1", + "heading2": "Tiêu đề 2", + "heading3": "Tiêu đề 3", + "bold": "In đậm ({mod}+B)", + "italic": "In nghiêng ({mod}+I)", + "strikethrough": "Gạch ngang ({mod}+Shift+X)", + "code": "Mã nội tuyến ({mod}+E)", + "link": "Liên kết ({mod}+K)", + "bullet_list": "Danh sách dấu đầu dòng", + "numbered_list": "Danh sách đánh số", + "task_list": "Danh sách công việc", + "blockquote": "Trích dẫn", + "divider": "Đường phân cách", + "table": "Bảng", + "code_block": "Khối mã" + }, + "slash": { + "paragraph": "Đoạn văn", + "paragraph_desc": "Văn bản thuần", + "heading1": "Tiêu đề 1", + "heading1_desc": "Tiêu đề lớn", + "heading2": "Tiêu đề 2", + "heading2_desc": "Tiêu đề vừa", + "heading3": "Tiêu đề 3", + "heading3_desc": "Tiêu đề nhỏ", + "bullet_list": "Danh sách dấu đầu dòng", + "bullet_list_desc": "Danh sách không thứ tự", + "numbered_list": "Danh sách đánh số", + "numbered_list_desc": "Danh sách có thứ tự", + "task_list": "Danh sách công việc", + "task_list_desc": "Danh sách kiểm tra", + "blockquote": "Trích dẫn", + "blockquote_desc": "Khối trích dẫn", + "code_block": "Khối mã", + "code_block_desc": "Mã có hàng rào", + "table": "Bảng", + "table_desc": "Bảng 3×3", + "divider": "Đường phân cách", + "divider_desc": "Đường ngang", + "no_results": "Không có kết quả" + }, + "link": { + "edit": "Chỉnh sửa", + "edit_link": "Sửa liên kết", + "remove_link": "Xóa liên kết", + "text": "Văn bản", + "text_placeholder": "Văn bản hiển thị (tùy chọn)", + "display_text": "Văn bản hiển thị", + "url": "URL", + "url_placeholder": "Dán hoặc nhập URL...", + "apply": "Áp dụng liên kết", + "cancel": "Hủy" + }, + "table": { + "header": "Tiêu đề", + "new_row": "+ Hàng mới", + "row_options": "Tùy chọn hàng {n}", + "col_options": "Tùy chọn cột {n}", + "insert_row_above": "Chèn hàng phía trên", + "insert_row_below": "Chèn hàng phía dưới", + "delete_row": "Xóa hàng", + "insert_col_left": "Chèn cột bên trái", + "insert_col_right": "Chèn cột bên phải", + "delete_col": "Xóa cột", + "add_row_above": "Thêm hàng phía trên", + "add_row_below": "Thêm hàng phía dưới", + "add_col_left": "Thêm cột bên trái", + "add_col_right": "Thêm cột bên phải" + }, + "dialog": { + "unsaved_title": "Thay đổi chưa lưu", + "unsaved_exit_edit": "Có thay đổi chưa lưu. Bạn có muốn lưu trước khi thoát chế độ chỉnh sửa không?", + "unsaved_new_file": "Có thay đổi chưa lưu. Bạn có muốn lưu trước khi tạo tệp mới không?", + "unsaved_open_file": "Có thay đổi chưa lưu. Bạn có muốn lưu trước khi mở tệp mới không?", + "save": "Lưu", + "discard": "Bỏ qua", + "dont_save": "Không lưu", + "cancel": "Hủy", + "unsaved_close": "Bạn có thay đổi chưa lưu. Bạn có muốn lưu trước khi đóng không?" + }, + "lang_picker": { + "filter_placeholder": "Lọc ngôn ngữ...", + "filter_label": "Lọc ngôn ngữ", + "plain_text": "Văn bản thuần" + }, + "a11y": { + "skip_to_content": "Chuyển đến nội dung", + "main_toolbar": "Thanh công cụ chính", + "sidebar": "Thanh bên", + "search_text": "Tìm văn bản", + "previous_match": "Kết quả trước", + "next_match": "Kết quả tiếp", + "close_search": "Đóng tìm kiếm", + "format_text": "Định dạng văn bản", + "edit_link": "Sửa liên kết", + "insert_block": "Chèn khối", + "select_language": "Chọn ngôn ngữ", + "search_in_document": "Tìm trong tài liệu" + }, + "drop_zone": { + "text": "Thả tệp Markdown của bạn vào đây" + }, + "help": { + "getting_started": "Bắt đầu", + "editing": "Chỉnh sửa", + "shortcuts": "Phím tắt", + "features": "Tính năng", + "fallback_notice": "Trang này chưa có sẵn bằng ngôn ngữ của bạn. Đang hiển thị phiên bản tiếng Anh." + }, + "recovery": { + "title": "Khôi phục thay đổi chưa lưu?", + "message": "Kern đã tìm thấy các thay đổi chưa lưu từ phiên trước. Bạn có muốn khôi phục không?", + "restore": "Khôi phục", + "discard": "Bỏ qua" + }, + "export": { + "success": "Xuất PDF thành công", + "open": "Mở" + }, + "context": { + "cut": "Cắt", + "copy": "Sao chép", + "paste": "Dán", + "paste_plain": "Dán dưới dạng văn bản thuần", + "select_all": "Chọn tất cả", + "copy_link": "Sao chép liên kết", + "open_link": "Mở liên kết", + "copy_image_address": "Sao chép địa chỉ hình ảnh" + }, + "trial": { + "days_remaining": "Còn {days} ngày dùng thử", + "expired_message": "Thời gian dùng thử của bạn đã hết. Mua Kern để tiếp tục chỉnh sửa.", + "purchase_button": "Mua Kern", + "purchase_title": "Mở khóa Kern", + "purchase_desc": "Truy cập đầy đủ tất cả tính năng chỉnh sửa và xuất file với một lần mua duy nhất.", + "feature_edit": "Chỉnh sửa Markdown với WYSIWYG và chia đôi màn hình", + "feature_save": "Lưu và tạo tệp mới", + "feature_export": "Xuất sang PDF", + "restore_purchases": "Khôi phục giao dịch mua", + "one_time_purchase": "Mua một lần. Không cần đăng ký.", + "purchasing": "Đang mua...", + "restoring": "Đang khôi phục..." + } +} diff --git a/src-mdviewer/src/locales/zh-TW.json b/src-mdviewer/src/locales/zh-TW.json new file mode 100644 index 0000000000..12eaff6777 --- /dev/null +++ b/src-mdviewer/src/locales/zh-TW.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "開啟檔案", + "theme": "切換主題", + "toc": "目錄", + "search": "搜尋", + "focus": "專注模式", + "zoom_in": "放大", + "zoom_out": "縮小", + "zoom_reset": "重設縮放", + "save": "儲存", + "edit": "編輯", + "new_file": "新檔案", + "split_view": "分割檢視", + "export_pdf": "匯出 PDF", + "settings": "設定", + "more": "更多" + }, + "sidebar": { + "toc": "目錄", + "recent": "最近的檔案", + "no_headings": "找不到標題" + }, + "search": { + "placeholder": "在文件中搜尋...", + "count": "個符合", + "no_results": "沒有結果" + }, + "welcome": { + "title": "Kern", + "subtitle": "精美的 Markdown 檢視器", + "new_button": "新檔案", + "open_button": "開啟檔案", + "drop_hint": "或拖放 .md 檔案" + }, + "viewer": { + "copy": "複製", + "copied": "已複製!" + }, + "settings": { + "theme": "主題", + "theme_light": "淺色", + "theme_dark": "深色", + "theme_system": "系統", + "language": "語言" + }, + "common": { + "close": "關閉", + "open": "開啟", + "file": "檔案" + }, + "format": { + "paragraph": "段落", + "heading1": "標題 1", + "heading2": "標題 2", + "heading3": "標題 3", + "bold": "粗體 ({mod}+B)", + "italic": "斜體 ({mod}+I)", + "strikethrough": "刪除線 ({mod}+Shift+X)", + "code": "行內程式碼 ({mod}+E)", + "link": "連結 ({mod}+K)", + "bullet_list": "項目符號清單", + "numbered_list": "編號清單", + "task_list": "工作清單", + "blockquote": "引用", + "divider": "分隔線", + "table": "表格", + "code_block": "程式碼區塊" + }, + "slash": { + "paragraph": "段落", + "paragraph_desc": "純文字", + "heading1": "標題 1", + "heading1_desc": "大標題", + "heading2": "標題 2", + "heading2_desc": "中標題", + "heading3": "標題 3", + "heading3_desc": "小標題", + "bullet_list": "項目符號清單", + "bullet_list_desc": "無序清單", + "numbered_list": "編號清單", + "numbered_list_desc": "有序清單", + "task_list": "工作清單", + "task_list_desc": "核取清單", + "blockquote": "引用", + "blockquote_desc": "引用區塊", + "code_block": "程式碼區塊", + "code_block_desc": "圍欄程式碼", + "table": "表格", + "table_desc": "3×3 表格", + "divider": "分隔線", + "divider_desc": "水平線", + "no_results": "沒有結果" + }, + "link": { + "edit": "編輯", + "edit_link": "編輯連結", + "remove_link": "移除連結", + "text": "文字", + "text_placeholder": "顯示文字(選填)", + "display_text": "顯示文字", + "url": "URL", + "url_placeholder": "貼上或輸入 URL...", + "apply": "套用連結", + "cancel": "取消" + }, + "table": { + "header": "標頭", + "new_row": "+ 新增列", + "row_options": "第 {n} 列選項", + "col_options": "第 {n} 欄選項", + "insert_row_above": "在上方插入列", + "insert_row_below": "在下方插入列", + "delete_row": "刪除列", + "insert_col_left": "在左方插入欄", + "insert_col_right": "在右方插入欄", + "delete_col": "刪除欄", + "add_row_above": "在上方新增列", + "add_row_below": "在下方新增列", + "add_col_left": "在左方新增欄", + "add_col_right": "在右方新增欄" + }, + "dialog": { + "unsaved_title": "未儲存的變更", + "unsaved_exit_edit": "您有未儲存的變更。要在離開編輯模式前儲存嗎?", + "unsaved_new_file": "您有未儲存的變更。要在建立新檔案前儲存嗎?", + "unsaved_open_file": "您有未儲存的變更。要在開啟新檔案前儲存嗎?", + "save": "儲存", + "discard": "捨棄", + "dont_save": "不儲存", + "cancel": "取消", + "unsaved_close": "您有未儲存的變更。要在關閉前儲存嗎?" + }, + "lang_picker": { + "filter_placeholder": "篩選語言...", + "filter_label": "篩選語言", + "plain_text": "純文字" + }, + "a11y": { + "skip_to_content": "跳至內容", + "main_toolbar": "主工具列", + "sidebar": "側邊欄", + "search_text": "搜尋文字", + "previous_match": "上一個符合", + "next_match": "下一個符合", + "close_search": "關閉搜尋", + "format_text": "格式化文字", + "edit_link": "編輯連結", + "insert_block": "插入區塊", + "select_language": "選擇語言", + "search_in_document": "在文件中搜尋" + }, + "drop_zone": { + "text": "將您的 Markdown 檔案拖放至此" + }, + "help": { + "getting_started": "快速入門", + "editing": "編輯", + "shortcuts": "鍵盤快捷鍵", + "features": "功能", + "fallback_notice": "此頁面尚未提供您的語言版本。正在顯示英文版本。" + }, + "recovery": { + "title": "復原未儲存的變更?", + "message": "Kern 發現了上次工作階段中未儲存的變更。要復原嗎?", + "restore": "復原", + "discard": "捨棄" + }, + "export": { + "success": "PDF 匯出成功", + "open": "開啟" + }, + "context": { + "cut": "剪下", + "copy": "複製", + "paste": "貼上", + "paste_plain": "貼上為純文字", + "select_all": "全選", + "copy_link": "複製連結", + "open_link": "開啟連結", + "copy_image_address": "複製圖片位址" + }, + "trial": { + "days_remaining": "試用期剩餘 {days} 天", + "expired_message": "您的試用期已結束。購買 Kern 以繼續編輯。", + "purchase_button": "購買 Kern", + "purchase_title": "解鎖 Kern", + "purchase_desc": "一次購買即可完整使用所有編輯和匯出功能。", + "feature_edit": "使用 WYSIWYG 和分割檢視編輯 Markdown", + "feature_save": "儲存和建立新檔案", + "feature_export": "匯出為 PDF", + "restore_purchases": "恢復購買", + "one_time_purchase": "一次性購買,無需訂閱。", + "purchasing": "購買中...", + "restoring": "恢復中..." + } +} diff --git a/src-mdviewer/src/locales/zh-cn.json b/src-mdviewer/src/locales/zh-cn.json new file mode 100644 index 0000000000..b943b07969 --- /dev/null +++ b/src-mdviewer/src/locales/zh-cn.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "关闭搜索", + "edit_link": "编辑链接", + "format_text": "格式化文本", + "insert_block": "插入块", + "main_toolbar": "主工具栏", + "next_match": "下一个匹配", + "previous_match": "上一个匹配", + "search_in_document": "在文档中搜索", + "search_text": "搜索文本", + "select_language": "选择语言", + "sidebar": "侧边栏", + "skip_to_content": "跳转到内容" + }, + "common": { + "close": "关闭", + "file": "文件", + "open": "打开" + }, + "context": { + "copy": "复制", + "copy_image_address": "复制图片地址", + "copy_link": "复制链接", + "cut": "剪切", + "open_link": "打开链接", + "paste": "粘贴", + "paste_plain": "粘贴为纯文本", + "select_all": "全选" + }, + "dialog": { + "cancel": "取消", + "discard": "放弃", + "dont_save": "不保存", + "save": "保存", + "unsaved_close": "您有未保存的更改。是否在关闭前保存?", + "unsaved_exit_edit": "您有未保存的更改。是否在退出编辑模式前保存?", + "unsaved_new_file": "您有未保存的更改。是否在新建文件前保存?", + "unsaved_open_file": "您有未保存的更改。是否在打开新文件前保存?", + "unsaved_title": "未保存的更改" + }, + "drop_zone": { + "text": "将 Markdown 文件拖放到此处" + }, + "export": { + "open": "打开", + "success": "PDF 导出成功" + }, + "format": { + "blockquote": "引用", + "bold": "粗体 ({mod}+B)", + "bullet_list": "无序列表", + "code": "行内代码 ({mod}+E)", + "code_block": "代码块", + "divider": "分隔线", + "heading1": "一级标题", + "heading2": "二级标题", + "heading3": "三级标题", + "italic": "斜体 ({mod}+I)", + "link": "链接 ({mod}+K)", + "numbered_list": "有序列表", + "paragraph": "正文", + "strikethrough": "删除线 ({mod}+Shift+X)", + "table": "表格", + "task_list": "任务列表", + "block_type": "块类型", + "lists": "列表", + "more_elements": "更多", + "text_formatting": "文本格式", + "underline": "下划线" + }, + "help": { + "editing": "编辑", + "fallback_notice": "此页面尚未提供您的语言版本。正在显示英文版本。", + "features": "功能", + "getting_started": "快速入门", + "shortcuts": "键盘快捷键" + }, + "lang_picker": { + "filter_label": "筛选语言", + "filter_placeholder": "筛选语言...", + "plain_text": "纯文本" + }, + "link": { + "apply": "应用链接", + "cancel": "取消", + "display_text": "显示文本", + "edit": "编辑", + "edit_link": "编辑链接", + "remove_link": "移除链接", + "text": "文本", + "text_placeholder": "显示文本(可选)", + "url": "URL", + "url_placeholder": "粘贴或输入 URL..." + }, + "recovery": { + "discard": "放弃", + "message": "Kern 发现了上次会话中未保存的更改。是否恢复?", + "restore": "恢复", + "title": "恢复未保存的更改?" + }, + "search": { + "count": "个匹配", + "no_results": "无结果", + "placeholder": "在文档中搜索..." + }, + "settings": { + "language": "语言", + "theme": "主题", + "theme_dark": "深色", + "theme_light": "浅色", + "theme_system": "跟随系统" + }, + "sidebar": { + "no_headings": "未找到标题", + "recent": "最近文件", + "toc": "目录" + }, + "slash": { + "blockquote": "引用", + "blockquote_desc": "引用块", + "bullet_list": "无序列表", + "bullet_list_desc": "项目符号列表", + "code_block": "代码块", + "code_block_desc": "围栏代码", + "divider": "分隔线", + "divider_desc": "水平分隔线", + "heading1": "一级标题", + "heading1_desc": "大标题", + "heading2": "二级标题", + "heading2_desc": "中标题", + "heading3": "三级标题", + "heading3_desc": "小标题", + "no_results": "无结果", + "numbered_list": "有序列表", + "numbered_list_desc": "编号列表", + "paragraph": "正文", + "paragraph_desc": "纯文本", + "table": "表格", + "table_desc": "3×3 表格", + "task_list": "任务列表", + "task_list_desc": "清单", + "mermaid": "Mermaid 图表", + "mermaid_desc": "插入图表" + }, + "table": { + "add_col_left": "在左侧添加列", + "add_col_right": "在右侧添加列", + "add_row_above": "在上方添加行", + "add_row_below": "在下方添加行", + "col_options": "第 {n} 列选项", + "delete_col": "删除列", + "delete_row": "删除行", + "header": "表头", + "insert_col_left": "在左侧插入列", + "insert_col_right": "在右侧插入列", + "insert_row_above": "在上方插入行", + "insert_row_below": "在下方插入行", + "new_row": "+ 新增行", + "row_options": "第 {n} 行选项" + }, + "toolbar": { + "edit": "编辑", + "export_pdf": "导出 PDF", + "focus": "专注模式", + "more": "更多", + "new_file": "新建文件", + "open": "打开文件", + "save": "保存", + "search": "搜索", + "settings": "设置", + "split_view": "分屏视图", + "theme": "切换主题", + "toc": "目录", + "zoom_in": "放大", + "zoom_out": "缩小", + "zoom_reset": "重置缩放", + "done": "完成" + }, + "trial": { + "days_remaining": "试用期剩余 {days} 天", + "expired_message": "您的试用期已结束。购买 Kern 以继续编辑。", + "feature_edit": "使用 WYSIWYG 和分屏视图编辑 Markdown", + "feature_export": "导出为 PDF", + "feature_save": "保存和新建文件", + "one_time_purchase": "一次性购买,无需订阅。", + "purchase_button": "购买 Kern", + "purchase_desc": "一次购买即可完整使用所有编辑和导出功能。", + "purchase_title": "解锁 Kern", + "purchasing": "购买中...", + "restore_purchases": "恢复购买", + "restoring": "恢复中..." + }, + "viewer": { + "copied": "已复制!", + "copy": "复制" + }, + "welcome": { + "drop_hint": "或拖放 .md 文件到此处", + "new_button": "新建文件", + "open_button": "打开文件", + "subtitle": "优雅的 Markdown 阅读器", + "title": "Kern" + }, + "mermaid": { + "done": "完成", + "edit": "编辑", + "error_prefix": "语法错误", + "stale": "预览已过时" + } +} diff --git a/src-mdviewer/src/locales/zh-tw.json b/src-mdviewer/src/locales/zh-tw.json new file mode 100644 index 0000000000..6d2fc8d86b --- /dev/null +++ b/src-mdviewer/src/locales/zh-tw.json @@ -0,0 +1,211 @@ +{ + "a11y": { + "close_search": "關閉搜尋", + "edit_link": "編輯連結", + "format_text": "格式化文字", + "insert_block": "插入區塊", + "main_toolbar": "主工具列", + "next_match": "下一個符合", + "previous_match": "上一個符合", + "search_in_document": "在文件中搜尋", + "search_text": "搜尋文字", + "select_language": "選擇語言", + "sidebar": "側邊欄", + "skip_to_content": "跳至內容" + }, + "common": { + "close": "關閉", + "file": "檔案", + "open": "開啟" + }, + "context": { + "copy": "複製", + "copy_image_address": "複製圖片位址", + "copy_link": "複製連結", + "cut": "剪下", + "open_link": "開啟連結", + "paste": "貼上", + "paste_plain": "貼上為純文字", + "select_all": "全選" + }, + "dialog": { + "cancel": "取消", + "discard": "捨棄", + "dont_save": "不儲存", + "save": "儲存", + "unsaved_close": "您有未儲存的變更。要在關閉前儲存嗎?", + "unsaved_exit_edit": "您有未儲存的變更。要在離開編輯模式前儲存嗎?", + "unsaved_new_file": "您有未儲存的變更。要在建立新檔案前儲存嗎?", + "unsaved_open_file": "您有未儲存的變更。要在開啟新檔案前儲存嗎?", + "unsaved_title": "未儲存的變更" + }, + "drop_zone": { + "text": "將您的 Markdown 檔案拖放至此" + }, + "export": { + "open": "開啟", + "success": "PDF 匯出成功" + }, + "format": { + "blockquote": "引用", + "bold": "粗體 ({mod}+B)", + "bullet_list": "項目符號清單", + "code": "行內程式碼 ({mod}+E)", + "code_block": "程式碼區塊", + "divider": "分隔線", + "heading1": "標題 1", + "heading2": "標題 2", + "heading3": "標題 3", + "italic": "斜體 ({mod}+I)", + "link": "連結 ({mod}+K)", + "numbered_list": "編號清單", + "paragraph": "段落", + "strikethrough": "刪除線 ({mod}+Shift+X)", + "table": "表格", + "task_list": "工作清單", + "block_type": "區塊類型", + "lists": "清單", + "more_elements": "更多", + "text_formatting": "文字格式", + "underline": "底線" + }, + "help": { + "editing": "編輯", + "fallback_notice": "此頁面尚未提供您的語言版本。正在顯示英文版本。", + "features": "功能", + "getting_started": "快速入門", + "shortcuts": "鍵盤快捷鍵" + }, + "lang_picker": { + "filter_label": "篩選語言", + "filter_placeholder": "篩選語言...", + "plain_text": "純文字" + }, + "link": { + "apply": "套用連結", + "cancel": "取消", + "display_text": "顯示文字", + "edit": "編輯", + "edit_link": "編輯連結", + "remove_link": "移除連結", + "text": "文字", + "text_placeholder": "顯示文字(選填)", + "url": "URL", + "url_placeholder": "貼上或輸入 URL..." + }, + "recovery": { + "discard": "捨棄", + "message": "Kern 發現了上次工作階段中未儲存的變更。要復原嗎?", + "restore": "復原", + "title": "復原未儲存的變更?" + }, + "search": { + "count": "個符合", + "no_results": "沒有結果", + "placeholder": "在文件中搜尋..." + }, + "settings": { + "language": "語言", + "theme": "主題", + "theme_dark": "深色", + "theme_light": "淺色", + "theme_system": "系統" + }, + "sidebar": { + "no_headings": "找不到標題", + "recent": "最近的檔案", + "toc": "目錄" + }, + "slash": { + "blockquote": "引用", + "blockquote_desc": "引用區塊", + "bullet_list": "項目符號清單", + "bullet_list_desc": "無序清單", + "code_block": "程式碼區塊", + "code_block_desc": "圍欄程式碼", + "divider": "分隔線", + "divider_desc": "水平線", + "heading1": "標題 1", + "heading1_desc": "大標題", + "heading2": "標題 2", + "heading2_desc": "中標題", + "heading3": "標題 3", + "heading3_desc": "小標題", + "no_results": "沒有結果", + "numbered_list": "編號清單", + "numbered_list_desc": "有序清單", + "paragraph": "段落", + "paragraph_desc": "純文字", + "table": "表格", + "table_desc": "3×3 表格", + "task_list": "工作清單", + "task_list_desc": "核取清單", + "mermaid": "Mermaid 圖表", + "mermaid_desc": "插入圖表" + }, + "table": { + "add_col_left": "在左方新增欄", + "add_col_right": "在右方新增欄", + "add_row_above": "在上方新增列", + "add_row_below": "在下方新增列", + "col_options": "第 {n} 欄選項", + "delete_col": "刪除欄", + "delete_row": "刪除列", + "header": "標頭", + "insert_col_left": "在左方插入欄", + "insert_col_right": "在右方插入欄", + "insert_row_above": "在上方插入列", + "insert_row_below": "在下方插入列", + "new_row": "+ 新增列", + "row_options": "第 {n} 列選項" + }, + "toolbar": { + "edit": "編輯", + "export_pdf": "匯出 PDF", + "focus": "專注模式", + "more": "更多", + "new_file": "新檔案", + "open": "開啟檔案", + "save": "儲存", + "search": "搜尋", + "settings": "設定", + "split_view": "分割檢視", + "theme": "切換主題", + "toc": "目錄", + "zoom_in": "放大", + "zoom_out": "縮小", + "zoom_reset": "重設縮放", + "done": "完成" + }, + "trial": { + "days_remaining": "試用期剩餘 {days} 天", + "expired_message": "您的試用期已結束。購買 Kern 以繼續編輯。", + "feature_edit": "使用 WYSIWYG 和分割檢視編輯 Markdown", + "feature_export": "匯出為 PDF", + "feature_save": "儲存和建立新檔案", + "one_time_purchase": "一次性購買,無需訂閱。", + "purchase_button": "購買 Kern", + "purchase_desc": "一次購買即可完整使用所有編輯和匯出功能。", + "purchase_title": "解鎖 Kern", + "purchasing": "購買中...", + "restore_purchases": "恢復購買", + "restoring": "恢復中..." + }, + "viewer": { + "copied": "已複製!", + "copy": "複製" + }, + "welcome": { + "drop_hint": "或拖放 .md 檔案", + "new_button": "新檔案", + "open_button": "開啟檔案", + "subtitle": "精美的 Markdown 檢視器", + "title": "Kern" + }, + "mermaid": { + "done": "完成", + "edit": "編輯", + "error_prefix": "語法錯誤", + "stale": "預覽已過期" + } +} diff --git a/src-mdviewer/src/locales/zh.json b/src-mdviewer/src/locales/zh.json new file mode 100644 index 0000000000..fa1a0a739e --- /dev/null +++ b/src-mdviewer/src/locales/zh.json @@ -0,0 +1,197 @@ +{ + "toolbar": { + "open": "打开文件", + "theme": "切换主题", + "toc": "目录", + "search": "搜索", + "focus": "专注模式", + "zoom_in": "放大", + "zoom_out": "缩小", + "zoom_reset": "重置缩放", + "save": "保存", + "edit": "编辑", + "new_file": "新建文件", + "split_view": "分屏视图", + "export_pdf": "导出 PDF", + "settings": "设置", + "more": "更多" + }, + "sidebar": { + "toc": "目录", + "recent": "最近文件", + "no_headings": "未找到标题" + }, + "search": { + "placeholder": "在文档中搜索...", + "count": "个匹配", + "no_results": "无结果" + }, + "welcome": { + "title": "Kern", + "subtitle": "优雅的 Markdown 阅读器", + "new_button": "新建文件", + "open_button": "打开文件", + "drop_hint": "或拖放 .md 文件到此处" + }, + "viewer": { + "copy": "复制", + "copied": "已复制!" + }, + "settings": { + "theme": "主题", + "theme_light": "浅色", + "theme_dark": "深色", + "theme_system": "跟随系统", + "language": "语言" + }, + "common": { + "close": "关闭", + "open": "打开", + "file": "文件" + }, + "format": { + "paragraph": "正文", + "heading1": "一级标题", + "heading2": "二级标题", + "heading3": "三级标题", + "bold": "粗体 ({mod}+B)", + "italic": "斜体 ({mod}+I)", + "strikethrough": "删除线 ({mod}+Shift+X)", + "code": "行内代码 ({mod}+E)", + "link": "链接 ({mod}+K)", + "bullet_list": "无序列表", + "numbered_list": "有序列表", + "task_list": "任务列表", + "blockquote": "引用", + "divider": "分隔线", + "table": "表格", + "code_block": "代码块" + }, + "slash": { + "paragraph": "正文", + "paragraph_desc": "纯文本", + "heading1": "一级标题", + "heading1_desc": "大标题", + "heading2": "二级标题", + "heading2_desc": "中标题", + "heading3": "三级标题", + "heading3_desc": "小标题", + "bullet_list": "无序列表", + "bullet_list_desc": "项目符号列表", + "numbered_list": "有序列表", + "numbered_list_desc": "编号列表", + "task_list": "任务列表", + "task_list_desc": "清单", + "blockquote": "引用", + "blockquote_desc": "引用块", + "code_block": "代码块", + "code_block_desc": "围栏代码", + "table": "表格", + "table_desc": "3×3 表格", + "divider": "分隔线", + "divider_desc": "水平分隔线", + "no_results": "无结果" + }, + "link": { + "edit": "编辑", + "edit_link": "编辑链接", + "remove_link": "移除链接", + "text": "文本", + "text_placeholder": "显示文本(可选)", + "display_text": "显示文本", + "url": "URL", + "url_placeholder": "粘贴或输入 URL...", + "apply": "应用链接", + "cancel": "取消" + }, + "table": { + "header": "表头", + "new_row": "+ 新增行", + "row_options": "第 {n} 行选项", + "col_options": "第 {n} 列选项", + "insert_row_above": "在上方插入行", + "insert_row_below": "在下方插入行", + "delete_row": "删除行", + "insert_col_left": "在左侧插入列", + "insert_col_right": "在右侧插入列", + "delete_col": "删除列", + "add_row_above": "在上方添加行", + "add_row_below": "在下方添加行", + "add_col_left": "在左侧添加列", + "add_col_right": "在右侧添加列" + }, + "dialog": { + "unsaved_title": "未保存的更改", + "unsaved_exit_edit": "您有未保存的更改。是否在退出编辑模式前保存?", + "unsaved_new_file": "您有未保存的更改。是否在新建文件前保存?", + "unsaved_open_file": "您有未保存的更改。是否在打开新文件前保存?", + "save": "保存", + "discard": "放弃", + "dont_save": "不保存", + "cancel": "取消", + "unsaved_close": "您有未保存的更改。是否在关闭前保存?" + }, + "lang_picker": { + "filter_placeholder": "筛选语言...", + "filter_label": "筛选语言", + "plain_text": "纯文本" + }, + "a11y": { + "skip_to_content": "跳转到内容", + "main_toolbar": "主工具栏", + "sidebar": "侧边栏", + "search_text": "搜索文本", + "previous_match": "上一个匹配", + "next_match": "下一个匹配", + "close_search": "关闭搜索", + "format_text": "格式化文本", + "edit_link": "编辑链接", + "insert_block": "插入块", + "select_language": "选择语言", + "search_in_document": "在文档中搜索" + }, + "drop_zone": { + "text": "将 Markdown 文件拖放到此处" + }, + "help": { + "getting_started": "快速入门", + "editing": "编辑", + "shortcuts": "键盘快捷键", + "features": "功能", + "fallback_notice": "此页面尚未提供您的语言版本。正在显示英文版本。" + }, + "recovery": { + "title": "恢复未保存的更改?", + "message": "Kern 发现了上次会话中未保存的更改。是否恢复?", + "restore": "恢复", + "discard": "放弃" + }, + "export": { + "success": "PDF 导出成功", + "open": "打开" + }, + "context": { + "cut": "剪切", + "copy": "复制", + "paste": "粘贴", + "paste_plain": "粘贴为纯文本", + "select_all": "全选", + "copy_link": "复制链接", + "open_link": "打开链接", + "copy_image_address": "复制图片地址" + }, + "trial": { + "days_remaining": "试用期剩余 {days} 天", + "expired_message": "您的试用期已结束。购买 Kern 以继续编辑。", + "purchase_button": "购买 Kern", + "purchase_title": "解锁 Kern", + "purchase_desc": "一次购买即可完整使用所有编辑和导出功能。", + "feature_edit": "使用 WYSIWYG 和分屏视图编辑 Markdown", + "feature_save": "保存和新建文件", + "feature_export": "导出为 PDF", + "restore_purchases": "恢复购买", + "one_time_purchase": "一次性购买,无需订阅。", + "purchasing": "购买中...", + "restoring": "恢复中..." + } +} diff --git a/src-mdviewer/src/md-nls-autogenerated/ar/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ar/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ar/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ar/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ar/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ar/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ar/strings.json b/src-mdviewer/src/md-nls-autogenerated/ar/strings.json new file mode 100644 index 0000000000..c81808df93 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ar/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "إغلاق البحث", + "a11y.edit_link": "تحرير الرابط", + "a11y.format_text": "تنسيق النص", + "a11y.insert_block": "إدراج كتلة", + "a11y.main_toolbar": "شريط الأدوات الرئيسي", + "a11y.next_match": "النتيجة التالية", + "a11y.previous_match": "النتيجة السابقة", + "a11y.search_in_document": "البحث في المستند", + "a11y.search_text": "نص البحث", + "a11y.select_language": "اختيار اللغة", + "a11y.sidebar": "الشريط الجانبي", + "a11y.skip_to_content": "تخطّي إلى المحتوى", + "common.close": "إغلاق", + "common.file": "ملف", + "common.open": "فتح", + "context.copy": "نسخ", + "context.copy_image_address": "نسخ عنوان الصورة", + "context.copy_link": "نسخ الرابط", + "context.cut": "قص", + "context.open_link": "فتح الرابط", + "context.paste": "لصق", + "context.paste_plain": "لصق كنص عادي", + "context.select_all": "تحديد الكل", + "dialog.cancel": "إلغاء", + "dialog.discard": "تجاهل", + "dialog.dont_save": "عدم الحفظ", + "dialog.save": "حفظ", + "dialog.unsaved_close": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل الإغلاق؟", + "dialog.unsaved_exit_edit": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل الخروج من وضع التحرير؟", + "dialog.unsaved_new_file": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل إنشاء ملف جديد؟", + "dialog.unsaved_open_file": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل فتح ملف جديد؟", + "dialog.unsaved_title": "تغييرات غير محفوظة", + "drop_zone.text": "أفلت ملف ماركداون هنا", + "export.open": "فتح", + "export.success": "تم تصدير PDF بنجاح", + "format.blockquote": "اقتباس", + "format.bold": "غامق ({mod}+B)", + "format.bullet_list": "قائمة نقطية", + "format.code": "رمز سطري ({mod}+E)", + "format.code_block": "كتلة رمز", + "format.divider": "فاصل", + "format.heading1": "عنوان 1", + "format.heading2": "عنوان 2", + "format.heading3": "عنوان 3", + "format.italic": "مائل ({mod}+I)", + "format.link": "رابط ({mod}+K)", + "format.numbered_list": "قائمة مرقّمة", + "format.paragraph": "فقرة", + "format.strikethrough": "يتوسطه خط ({mod}+Shift+X)", + "format.table": "جدول", + "format.task_list": "قائمة مهام", + "help.editing": "التحرير", + "help.fallback_notice": "هذه الصفحة غير متوفرة بلغتك بعد. يتم عرض النسخة الإنجليزية.", + "help.features": "الميزات", + "help.getting_started": "البدء", + "help.shortcuts": "اختصارات لوحة المفاتيح", + "lang_picker.filter_label": "تصفية اللغات", + "lang_picker.filter_placeholder": "تصفية اللغات...", + "lang_picker.plain_text": "نص عادي", + "link.apply": "تطبيق الرابط", + "link.cancel": "إلغاء", + "link.display_text": "نص العرض", + "link.edit": "تحرير", + "link.edit_link": "تحرير الرابط", + "link.remove_link": "إزالة الرابط", + "link.text": "النص", + "link.text_placeholder": "نص العرض (اختياري)", + "link.url": "الرابط", + "link.url_placeholder": "الصق أو اكتب رابطًا...", + "recovery.discard": "تجاهل", + "recovery.message": "عثر Kern على تغييرات غير محفوظة من جلسة سابقة. هل تريد استعادتها؟", + "recovery.restore": "استعادة", + "recovery.title": "استعادة التغييرات غير المحفوظة؟", + "search.count": "نتيجة", + "search.no_results": "لا توجد نتائج", + "search.placeholder": "البحث في المستند...", + "settings.language": "اللغة", + "settings.theme": "السمة", + "settings.theme_dark": "داكن", + "settings.theme_light": "فاتح", + "settings.theme_system": "النظام", + "sidebar.no_headings": "لم يتم العثور على عناوين", + "sidebar.recent": "الملفات الأخيرة", + "sidebar.toc": "جدول المحتويات", + "slash.blockquote": "اقتباس", + "slash.blockquote_desc": "كتلة اقتباس", + "slash.bullet_list": "قائمة نقطية", + "slash.bullet_list_desc": "قائمة غير مرتّبة", + "slash.code_block": "كتلة رمز", + "slash.code_block_desc": "رمز محاط بسياج", + "slash.divider": "فاصل", + "slash.divider_desc": "خط أفقي", + "slash.heading1": "عنوان 1", + "slash.heading1_desc": "عنوان كبير", + "slash.heading2": "عنوان 2", + "slash.heading2_desc": "عنوان متوسط", + "slash.heading3": "عنوان 3", + "slash.heading3_desc": "عنوان صغير", + "slash.no_results": "لا توجد نتائج", + "slash.numbered_list": "قائمة مرقّمة", + "slash.numbered_list_desc": "قائمة مرتّبة", + "slash.paragraph": "فقرة", + "slash.paragraph_desc": "نص عادي", + "slash.table": "جدول", + "slash.table_desc": "جدول 3×3", + "slash.task_list": "قائمة مهام", + "slash.task_list_desc": "قائمة تحقّق", + "table.add_col_left": "إضافة عمود يسارًا", + "table.add_col_right": "إضافة عمود يمينًا", + "table.add_row_above": "إضافة صف أعلى", + "table.add_row_below": "إضافة صف أسفل", + "table.col_options": "خيارات العمود {n}", + "table.delete_col": "حذف العمود", + "table.delete_row": "حذف الصف", + "table.header": "ترويسة", + "table.insert_col_left": "إدراج عمود يسارًا", + "table.insert_col_right": "إدراج عمود يمينًا", + "table.insert_row_above": "إدراج صف أعلى", + "table.insert_row_below": "إدراج صف أسفل", + "table.new_row": "+ صف جديد", + "table.row_options": "خيارات الصف {n}", + "toolbar.edit": "تحرير", + "toolbar.export_pdf": "تصدير PDF", + "toolbar.focus": "وضع التركيز", + "toolbar.more": "المزيد", + "toolbar.new_file": "ملف جديد", + "toolbar.open": "فتح ملف", + "toolbar.save": "حفظ", + "toolbar.search": "بحث", + "toolbar.settings": "الإعدادات", + "toolbar.split_view": "عرض مقسّم", + "toolbar.theme": "تبديل السمة", + "toolbar.toc": "جدول المحتويات", + "toolbar.zoom_in": "تكبير", + "toolbar.zoom_out": "تصغير", + "toolbar.zoom_reset": "إعادة تعيين التكبير", + "trial.days_remaining": "باقي {days} يوم في الفترة التجريبية", + "trial.expired_message": "انتهت الفترة التجريبية. قم بشراء Kern لمتابعة التحرير.", + "trial.feature_edit": "تحرير Markdown بواجهة WYSIWYG والعرض المقسّم", + "trial.feature_export": "تصدير إلى PDF", + "trial.feature_save": "حفظ وإنشاء ملفات جديدة", + "trial.one_time_purchase": "شراء لمرة واحدة. بدون اشتراك.", + "trial.purchase_button": "شراء Kern", + "trial.purchase_desc": "احصل على وصول كامل لجميع ميزات التحرير والتصدير بعملية شراء واحدة.", + "trial.purchase_title": "فتح Kern", + "trial.purchasing": "جارٍ الشراء...", + "trial.restore_purchases": "استعادة المشتريات", + "trial.restoring": "جارٍ الاستعادة...", + "viewer.copied": "تم النسخ!", + "viewer.copy": "نسخ", + "welcome.drop_hint": "أو اسحب وأفلت ملف .md", + "welcome.new_button": "ملف جديد", + "welcome.open_button": "فتح ملف", + "welcome.subtitle": "عارض ماركداون أنيق", + "welcome.title": "Kern", + "format.block_type": "نوع الكتلة", + "format.lists": "قوائم", + "format.more_elements": "المزيد", + "format.text_formatting": "تنسيق النص", + "format.underline": "تسطير", + "mermaid.done": "تم", + "mermaid.edit": "تحرير", + "mermaid.error_prefix": "خطأ في الصياغة", + "mermaid.stale": "المعاينة غير محدّثة", + "slash.mermaid": "مخطط Mermaid", + "slash.mermaid_desc": "إدراج مخطط", + "toolbar.done": "تم" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/bg/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/bg/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/bg/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/bg/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/bg/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/bg/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/bg/strings.json b/src-mdviewer/src/md-nls-autogenerated/bg/strings.json new file mode 100644 index 0000000000..2fa7c43080 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/bg/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Затвори търсенето", + "a11y.edit_link": "Редактиране на връзка", + "a11y.format_text": "Форматиране на текст", + "a11y.insert_block": "Вмъкване на блок", + "a11y.main_toolbar": "Главна лента с инструменти", + "a11y.next_match": "Следващо съвпадение", + "a11y.previous_match": "Предишно съвпадение", + "a11y.search_in_document": "Търсене в документа", + "a11y.search_text": "Текст за търсене", + "a11y.select_language": "Избор на език", + "a11y.sidebar": "Странична лента", + "a11y.skip_to_content": "Премини към съдържанието", + "common.close": "Затвори", + "common.file": "Файл", + "common.open": "Отвори", + "context.copy": "Копирай", + "context.copy_image_address": "Копирай адреса на изображението", + "context.copy_link": "Копирай връзката", + "context.cut": "Изрежи", + "context.open_link": "Отвори връзката", + "context.paste": "Поставяне", + "context.paste_plain": "Поставяне като чист текст", + "context.select_all": "Избиране на всичко", + "dialog.cancel": "Отказ", + "dialog.discard": "Отхвърляне", + "dialog.dont_save": "Не запазвай", + "dialog.save": "Запазване", + "dialog.unsaved_close": "Имате незапазени промени. Искате ли да ги запазите преди затваряне?", + "dialog.unsaved_exit_edit": "Имате незапазени промени. Искате ли да ги запазите преди излизане от режим на редакция?", + "dialog.unsaved_new_file": "Имате незапазени промени. Искате ли да ги запазите преди създаване на нов файл?", + "dialog.unsaved_open_file": "Имате незапазени промени. Искате ли да ги запазите преди да отворите нов файл?", + "dialog.unsaved_title": "Незапазени промени", + "drop_zone.text": "Пуснете своя Markdown файл тук", + "export.open": "Отвори", + "export.success": "PDF е експортиран успешно", + "format.block_type": "Тип на блока", + "format.blockquote": "Цитатен блок", + "format.bold": "Получер ({mod}+B)", + "format.bullet_list": "Списък с водещи символи", + "format.code": "Вграден код ({mod}+E)", + "format.code_block": "Кодов блок", + "format.divider": "Разделител", + "format.heading1": "Заглавие 1", + "format.heading2": "Заглавие 2", + "format.heading3": "Заглавие 3", + "format.italic": "Курсив ({mod}+I)", + "format.link": "Връзка ({mod}+K)", + "format.lists": "Списъци", + "format.more_elements": "Още", + "format.numbered_list": "Номериран списък", + "format.paragraph": "Параграф", + "format.strikethrough": "Зачертан текст ({mod}+Shift+X)", + "format.table": "Таблица", + "format.task_list": "Списък със задачи", + "format.text_formatting": "Форматиране на текст", + "format.underline": "Подчертан текст", + "help.editing": "Редактиране", + "help.fallback_notice": "Тази страница все още не е налична на вашия език. Показваме английската версия.", + "help.features": "Възможности", + "help.getting_started": "Първи стъпки", + "help.shortcuts": "Клавишни комбинации", + "lang_picker.filter_label": "Филтриране на езици", + "lang_picker.filter_placeholder": "Филтриране на езици...", + "lang_picker.plain_text": "Обикновен текст", + "link.apply": "Приложи", + "link.cancel": "Отказ", + "link.display_text": "Текст за показване", + "link.edit": "Редактиране", + "link.edit_link": "Редактиране на връзка", + "link.remove_link": "Премахни връзката", + "link.text": "Текст", + "link.text_placeholder": "Показван текст (по избор)", + "link.url": "URL", + "link.url_placeholder": "Поставете или въведете URL...", + "mermaid.done": "Готово", + "mermaid.edit": "Редактиране", + "mermaid.error_prefix": "Синтактична грешка", + "mermaid.stale": "Неактуален преглед", + "recovery.discard": "Отхвърляне", + "recovery.message": "Kern откри незапазени промени от предишна сесия. Искате ли да ги възстановите?", + "recovery.restore": "Възстанови", + "recovery.title": "Да се възстановят ли незапазените промени?", + "search.count": "съвпадения", + "search.no_results": "Няма резултати", + "search.placeholder": "Търсене в документа...", + "settings.language": "Език", + "settings.theme": "Тема", + "settings.theme_dark": "Тъмна", + "settings.theme_light": "Светла", + "settings.theme_system": "Системна", + "sidebar.no_headings": "Не са намерени заглавия", + "sidebar.recent": "Последни файлове", + "sidebar.toc": "Съдържание", + "slash.blockquote": "Цитат", + "slash.blockquote_desc": "Блок с цитат", + "slash.bullet_list": "Списък с водещи символи", + "slash.bullet_list_desc": "Неномериран списък", + "slash.code_block": "Кодов блок", + "slash.code_block_desc": "Ограден код", + "slash.divider": "Разделител", + "slash.divider_desc": "Хоризонтална линия", + "slash.heading1": "Заглавие 1", + "slash.heading1_desc": "Голямо заглавие", + "slash.heading2": "Заглавие 2", + "slash.heading2_desc": "Средно заглавие", + "slash.heading3": "Заглавие 3", + "slash.heading3_desc": "Малко заглавие", + "slash.mermaid": "Mermaid диаграма", + "slash.mermaid_desc": "Вмъкване на диаграма", + "slash.no_results": "Няма резултати", + "slash.numbered_list": "Номериран списък", + "slash.numbered_list_desc": "Подреден списък", + "slash.paragraph": "Параграф", + "slash.paragraph_desc": "Обикновен текст", + "slash.table": "Таблица", + "slash.table_desc": "Таблица 3×3", + "slash.task_list": "Списък със задачи", + "slash.task_list_desc": "Списък за проверка", + "table.add_col_left": "Добави колона вляво", + "table.add_col_right": "Добави колона вдясно", + "table.add_row_above": "Добави ред отгоре", + "table.add_row_below": "Добави ред отдолу", + "table.col_options": "Опции на колона {n}", + "table.delete_col": "Изтрий колона", + "table.delete_row": "Изтрий ред", + "table.header": "Заглавка", + "table.insert_col_left": "Вмъкни колона вляво", + "table.insert_col_right": "Вмъкни колона вдясно", + "table.insert_row_above": "Вмъкни ред отгоре", + "table.insert_row_below": "Вмъкни ред отдолу", + "table.new_row": "+ Нов ред", + "table.row_options": "Опции за ред {n}", + "toolbar.done": "Готово", + "toolbar.edit": "Редактиране", + "toolbar.export_pdf": "Експорт в PDF", + "toolbar.focus": "Режим на фокус", + "toolbar.more": "Още", + "toolbar.new_file": "Нов файл", + "toolbar.open": "Отваряне на файл", + "toolbar.save": "Запазване", + "toolbar.search": "Търсене", + "toolbar.settings": "Настройки", + "toolbar.split_view": "Разделен изглед", + "toolbar.theme": "Превключване на темата", + "toolbar.toc": "Съдържание", + "toolbar.zoom_in": "Увеличаване", + "toolbar.zoom_out": "Намаляване", + "toolbar.zoom_reset": "Нулиране на мащаба", + "trial.days_remaining": "Остават {days} дни от пробния период", + "trial.expired_message": "Пробният Ви период изтече. Закупете Kern, за да продължите да редактирате.", + "trial.feature_edit": "Редактиране на Markdown с WYSIWYG и разделен изглед", + "trial.feature_export": "Експорт към PDF", + "trial.feature_save": "Запазване и създаване на нови файлове", + "trial.one_time_purchase": "Еднократно плащане. Без абонамент.", + "trial.purchase_button": "Закупете Kern", + "trial.purchase_desc": "Получете пълен достъп до всички функции за редактиране и експорт с еднократно плащане.", + "trial.purchase_title": "Отключете Kern", + "trial.purchasing": "Закупуване...", + "trial.restore_purchases": "Възстановяване на покупки", + "trial.restoring": "Възстановяване...", + "viewer.copied": "Копирано!", + "viewer.copy": "Копирай", + "welcome.drop_hint": "или плъзнете и пуснете .md файл", + "welcome.new_button": "Нов файл", + "welcome.open_button": "Отвори файл", + "welcome.subtitle": "Красив преглед на Markdown", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/cs/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/cs/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/cs/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/cs/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/cs/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/cs/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/cs/strings.json b/src-mdviewer/src/md-nls-autogenerated/cs/strings.json new file mode 100644 index 0000000000..f85c49ccf6 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/cs/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Zavřít vyhledávání", + "a11y.edit_link": "Upravit odkaz", + "a11y.format_text": "Formátovat text", + "a11y.insert_block": "Vložit blok", + "a11y.main_toolbar": "Hlavní panel nástrojů", + "a11y.next_match": "Další shoda", + "a11y.previous_match": "Předchozí shoda", + "a11y.search_in_document": "Hledat v dokumentu", + "a11y.search_text": "Hledat text", + "a11y.select_language": "Vybrat jazyk", + "a11y.sidebar": "Postranní panel", + "a11y.skip_to_content": "Přeskočit na obsah", + "common.close": "Zavřít", + "common.file": "Soubor", + "common.open": "Otevřít", + "context.copy": "Kopírovat", + "context.copy_image_address": "Kopírovat adresu obrázku", + "context.copy_link": "Kopírovat odkaz", + "context.cut": "Vyjmout", + "context.open_link": "Otevřít odkaz", + "context.paste": "Vložit", + "context.paste_plain": "Vložit jako prostý text", + "context.select_all": "Vybrat vše", + "dialog.cancel": "Zrušit", + "dialog.discard": "Zahodit", + "dialog.dont_save": "Neukládat", + "dialog.save": "Uložit", + "dialog.unsaved_close": "Máte neuložené změny. Chcete je před zavřením uložit?", + "dialog.unsaved_exit_edit": "Máte neuložené změny. Chcete je uložit před opuštěním režimu úprav?", + "dialog.unsaved_new_file": "Máte neuložené změny. Chcete je uložit před vytvořením nového souboru?", + "dialog.unsaved_open_file": "Máte neuložené změny. Chcete je uložit před otevřením nového souboru?", + "dialog.unsaved_title": "Neuložené změny", + "drop_zone.text": "Přetáhněte sem svůj Markdown soubor", + "export.open": "Otevřít", + "export.success": "PDF bylo úspěšně exportováno", + "format.block_type": "Typ bloku", + "format.blockquote": "Bloková citace", + "format.bold": "Tučné ({mod}+B)", + "format.bullet_list": "Odrážkový seznam", + "format.code": "Vložený kód ({mod}+E)", + "format.code_block": "Blok kódu", + "format.divider": "Oddělovač", + "format.heading1": "Nadpis 1", + "format.heading2": "Nadpis 2", + "format.heading3": "Nadpis 3", + "format.italic": "Kurzíva ({mod}+I)", + "format.link": "Odkaz ({mod}+K)", + "format.lists": "Seznamy", + "format.more_elements": "Další", + "format.numbered_list": "Číslovaný seznam", + "format.paragraph": "Odstavec", + "format.strikethrough": "Přeškrtnutí ({mod}+Shift+X)", + "format.table": "Tabulka", + "format.task_list": "Seznam úkolů", + "format.text_formatting": "Formátování textu", + "format.underline": "Podtržení", + "help.editing": "Úpravy", + "help.fallback_notice": "Tato stránka zatím není dostupná ve vašem jazyce. Zobrazuje se anglická verze.", + "help.features": "Funkce", + "help.getting_started": "Začínáme", + "help.shortcuts": "Klávesové zkratky", + "lang_picker.filter_label": "Filtrovat jazyky", + "lang_picker.filter_placeholder": "Filtrovat jazyky...", + "lang_picker.plain_text": "Prostý text", + "link.apply": "Použít odkaz", + "link.cancel": "Zrušit", + "link.display_text": "Zobrazený text", + "link.edit": "Upravit", + "link.edit_link": "Upravit odkaz", + "link.remove_link": "Odebrat odkaz", + "link.text": "Text", + "link.text_placeholder": "Zobrazovaný text (nepovinné)", + "link.url": "URL", + "link.url_placeholder": "Vložte nebo zadejte adresu URL...", + "mermaid.done": "Hotovo", + "mermaid.edit": "Upravit", + "mermaid.error_prefix": "Syntaktická chyba", + "mermaid.stale": "Náhled je neaktuální", + "recovery.discard": "Zahodit", + "recovery.message": "Kern nalezl neuložené změny z předchozí relace. Chcete je obnovit?", + "recovery.restore": "Obnovit", + "recovery.title": "Obnovit neuložené změny?", + "search.count": "shod", + "search.no_results": "Žádné výsledky", + "search.placeholder": "Hledat v dokumentu...", + "settings.language": "Jazyk", + "settings.theme": "Motiv", + "settings.theme_dark": "Tmavý", + "settings.theme_light": "Světlý", + "settings.theme_system": "Systémový", + "sidebar.no_headings": "Nenalezeny žádné nadpisy", + "sidebar.recent": "Poslední soubory", + "sidebar.toc": "Obsah", + "slash.blockquote": "Bloková citace", + "slash.blockquote_desc": "Blok citace", + "slash.bullet_list": "Seznam s odrážkami", + "slash.bullet_list_desc": "Nečíslovaný seznam", + "slash.code_block": "Blok kódu", + "slash.code_block_desc": "Ohraničený kód", + "slash.divider": "Oddělovač", + "slash.divider_desc": "Vodorovná čára", + "slash.heading1": "Nadpis 1", + "slash.heading1_desc": "Velký nadpis", + "slash.heading2": "Nadpis 2", + "slash.heading2_desc": "Střední nadpis", + "slash.heading3": "Nadpis 3", + "slash.heading3_desc": "Malý nadpis", + "slash.mermaid": "Diagram Mermaid", + "slash.mermaid_desc": "Vložit diagram", + "slash.no_results": "Žádné výsledky", + "slash.numbered_list": "Číslovaný seznam", + "slash.numbered_list_desc": "Seřazený seznam", + "slash.paragraph": "Odstavec", + "slash.paragraph_desc": "Prostý text", + "slash.table": "Tabulka", + "slash.table_desc": "Tabulka 3×3", + "slash.task_list": "Seznam úkolů", + "slash.task_list_desc": "Kontrolní seznam", + "table.add_col_left": "Přidat sloupec vlevo", + "table.add_col_right": "Přidat sloupec vpravo", + "table.add_row_above": "Přidat řádek nad", + "table.add_row_below": "Přidat řádek pod", + "table.col_options": "Možnosti sloupce {n}", + "table.delete_col": "Odstranit sloupec", + "table.delete_row": "Odstranit řádek", + "table.header": "Záhlaví", + "table.insert_col_left": "Vložit sloupec vlevo", + "table.insert_col_right": "Vložit sloupec vpravo", + "table.insert_row_above": "Vložit řádek nad", + "table.insert_row_below": "Vložit řádek pod", + "table.new_row": "+ Nový řádek", + "table.row_options": "Možnosti řádku {n}", + "toolbar.done": "Hotovo", + "toolbar.edit": "Upravit", + "toolbar.export_pdf": "Exportovat do PDF", + "toolbar.focus": "Režim soustředění", + "toolbar.more": "Více", + "toolbar.new_file": "Nový soubor", + "toolbar.open": "Otevřít soubor", + "toolbar.save": "Uložit", + "toolbar.search": "Hledat", + "toolbar.settings": "Nastavení", + "toolbar.split_view": "Rozdělené zobrazení", + "toolbar.theme": "Přepnout motiv", + "toolbar.toc": "Obsah", + "toolbar.zoom_in": "Přiblížit", + "toolbar.zoom_out": "Oddálit", + "toolbar.zoom_reset": "Resetovat přiblížení", + "trial.days_remaining": "Zbývá {days} dní zkušební verze", + "trial.expired_message": "Vaše zkušební verze vypršela. Pro pokračování v úpravách si zakupte Kern.", + "trial.feature_edit": "Upravujte Markdown s WYSIWYG a rozděleným zobrazením", + "trial.feature_export": "Export do PDF", + "trial.feature_save": "Ukládejte a vytvářejte nové soubory", + "trial.one_time_purchase": "Jednorázový nákup. Žádné předplatné.", + "trial.purchase_button": "Zakoupit Kern", + "trial.purchase_desc": "Získejte plný přístup ke všem funkcím pro úpravy a export jednorázovým nákupem.", + "trial.purchase_title": "Odemkněte Kern", + "trial.purchasing": "Probíhá nákup...", + "trial.restore_purchases": "Obnovit nákupy", + "trial.restoring": "Probíhá obnova...", + "viewer.copied": "Zkopírováno!", + "viewer.copy": "Kopírovat", + "welcome.drop_hint": "nebo přetáhněte soubor .md", + "welcome.new_button": "Nový soubor", + "welcome.open_button": "Otevřít soubor", + "welcome.subtitle": "Krásný prohlížeč Markdownu", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/da/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/da/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/da/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/da/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/da/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/da/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/da/strings.json b/src-mdviewer/src/md-nls-autogenerated/da/strings.json new file mode 100644 index 0000000000..1ac883af19 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/da/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Luk søgning", + "a11y.edit_link": "Rediger link", + "a11y.format_text": "Formater tekst", + "a11y.insert_block": "Indsæt blok", + "a11y.main_toolbar": "Hovedværktøjslinje", + "a11y.next_match": "Næste match", + "a11y.previous_match": "Forrige match", + "a11y.search_in_document": "Søg i dokumentet", + "a11y.search_text": "Søgetekst", + "a11y.select_language": "Vælg sprog", + "a11y.sidebar": "Sidepanel", + "a11y.skip_to_content": "Spring til indhold", + "common.close": "Luk", + "common.file": "Fil", + "common.open": "Åbn", + "context.copy": "Kopiér", + "context.copy_image_address": "Kopiér billedadresse", + "context.copy_link": "Kopiér link", + "context.cut": "Klip", + "context.open_link": "Åbn link", + "context.paste": "Sæt ind", + "context.paste_plain": "Sæt ind som ren tekst", + "context.select_all": "Markér alt", + "dialog.cancel": "Annuller", + "dialog.discard": "Kassér", + "dialog.dont_save": "Gem ikke", + "dialog.save": "Gem", + "dialog.unsaved_close": "Du har ikke-gemte ændringer. Vil du gemme, før du lukker?", + "dialog.unsaved_exit_edit": "Du har ikke-gemte ændringer. Vil du gemme, før du forlader redigeringstilstand?", + "dialog.unsaved_new_file": "Du har ikke-gemte ændringer. Vil du gemme, før du opretter en ny fil?", + "dialog.unsaved_open_file": "Du har ugemte ændringer. Vil du gemme, før du åbner en ny fil?", + "dialog.unsaved_title": "Ugemte ændringer", + "drop_zone.text": "Træk din Markdown-fil hertil", + "export.open": "Åbn", + "export.success": "PDF-filen blev eksporteret med succes", + "format.block_type": "Bloktype", + "format.blockquote": "Blokcitat", + "format.bold": "Fed ({mod}+B)", + "format.bullet_list": "Punktopstilling", + "format.code": "Indlejret kode ({mod}+E)", + "format.code_block": "Kodeblok", + "format.divider": "Skillelinje", + "format.heading1": "Overskrift 1", + "format.heading2": "Overskrift 2", + "format.heading3": "Overskrift 3", + "format.italic": "Kursiv ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lister", + "format.more_elements": "Mere", + "format.numbered_list": "Nummereret liste", + "format.paragraph": "Afsnit", + "format.strikethrough": "Gennemstreget ({mod}+Shift+X)", + "format.table": "Tabel", + "format.task_list": "Opgaveliste", + "format.text_formatting": "Tekstformatering", + "format.underline": "Understregning", + "help.editing": "Redigering", + "help.fallback_notice": "Denne side er endnu ikke tilgængelig på dit sprog. Viser den engelske version.", + "help.features": "Funktioner", + "help.getting_started": "Kom i gang", + "help.shortcuts": "Tastaturgenveje", + "lang_picker.filter_label": "Filtrer sprog", + "lang_picker.filter_placeholder": "Filtrer sprog...", + "lang_picker.plain_text": "Almindelig tekst", + "link.apply": "Anvend link", + "link.cancel": "Annuller", + "link.display_text": "Vist tekst", + "link.edit": "Rediger", + "link.edit_link": "Rediger link", + "link.remove_link": "Fjern link", + "link.text": "Tekst", + "link.text_placeholder": "Vist tekst (valgfri)", + "link.url": "URL", + "link.url_placeholder": "Indsæt eller skriv URL...", + "mermaid.done": "Færdig", + "mermaid.edit": "Rediger", + "mermaid.error_prefix": "Syntaksfejl", + "mermaid.stale": "Forhåndsvisning forældet", + "recovery.discard": "Kassér", + "recovery.message": "Kern fandt ikke-gemte ændringer fra en tidligere session. Vil du gendanne dem?", + "recovery.restore": "Gendan", + "recovery.title": "Gendan ugemte ændringer?", + "search.count": "resultater", + "search.no_results": "Ingen resultater", + "search.placeholder": "Søg i dokument...", + "settings.language": "Sprog", + "settings.theme": "Tema", + "settings.theme_dark": "Mørk", + "settings.theme_light": "Lys", + "settings.theme_system": "System", + "sidebar.no_headings": "Ingen overskrifter fundet", + "sidebar.recent": "Seneste filer", + "sidebar.toc": "Indholdsfortegnelse", + "slash.blockquote": "Citatblok", + "slash.blockquote_desc": "Citatblok", + "slash.bullet_list": "Punktopstilling", + "slash.bullet_list_desc": "Uordnet liste", + "slash.code_block": "Kodeblok", + "slash.code_block_desc": "Kodeblok", + "slash.divider": "Skillelinje", + "slash.divider_desc": "Vandret streg", + "slash.heading1": "Overskrift 1", + "slash.heading1_desc": "Stor overskrift", + "slash.heading2": "Overskrift 2", + "slash.heading2_desc": "Mellemstor overskrift", + "slash.heading3": "Overskrift 3", + "slash.heading3_desc": "Lille overskrift", + "slash.mermaid": "Mermaid-diagram", + "slash.mermaid_desc": "Indsæt et diagram", + "slash.no_results": "Ingen resultater", + "slash.numbered_list": "Nummereret liste", + "slash.numbered_list_desc": "Ordnet liste", + "slash.paragraph": "Afsnit", + "slash.paragraph_desc": "Almindelig tekst", + "slash.table": "Tabel", + "slash.table_desc": "3×3 tabel", + "slash.task_list": "Opgaveliste", + "slash.task_list_desc": "Tjekliste", + "table.add_col_left": "Tilføj kolonne til venstre", + "table.add_col_right": "Tilføj kolonne til højre", + "table.add_row_above": "Tilføj række ovenfor", + "table.add_row_below": "Tilføj række nedenfor", + "table.col_options": "Kolonne {n} indstillinger", + "table.delete_col": "Slet kolonne", + "table.delete_row": "Slet række", + "table.header": "Overskrift", + "table.insert_col_left": "Indsæt kolonne til venstre", + "table.insert_col_right": "Indsæt kolonne til højre", + "table.insert_row_above": "Indsæt række ovenfor", + "table.insert_row_below": "Indsæt række nedenfor", + "table.new_row": "+ Ny række", + "table.row_options": "Indstillinger for række {n}", + "toolbar.done": "Færdig", + "toolbar.edit": "Rediger", + "toolbar.export_pdf": "Eksporter PDF", + "toolbar.focus": "Fokustilstand", + "toolbar.more": "Mere", + "toolbar.new_file": "Ny fil", + "toolbar.open": "Åbn fil", + "toolbar.save": "Gem", + "toolbar.search": "Søg", + "toolbar.settings": "Indstillinger", + "toolbar.split_view": "Opdelt visning", + "toolbar.theme": "Skift tema", + "toolbar.toc": "Indholdsfortegnelse", + "toolbar.zoom_in": "Zoom ind", + "toolbar.zoom_out": "Zoom ud", + "toolbar.zoom_reset": "Nulstil zoom", + "trial.days_remaining": "{days} dage tilbage af prøveperioden", + "trial.expired_message": "Din prøveperiode er udløbet. Køb Kern for at fortsætte med at redigere.", + "trial.feature_edit": "Rediger Markdown med WYSIWYG og delt visning", + "trial.feature_export": "Eksporter til PDF", + "trial.feature_save": "Gem og opret nye filer", + "trial.one_time_purchase": "Engangskøb. Intet abonnement.", + "trial.purchase_button": "Køb Kern", + "trial.purchase_desc": "Få fuld adgang til alle redigerings- og eksportfunktioner med et engangskøb.", + "trial.purchase_title": "Lås Kern op", + "trial.purchasing": "Køber...", + "trial.restore_purchases": "Gendan køb", + "trial.restoring": "Gendanner...", + "viewer.copied": "Kopieret!", + "viewer.copy": "Kopiér", + "welcome.drop_hint": "eller træk og slip en .md-fil", + "welcome.new_button": "Ny fil", + "welcome.open_button": "Åbn fil", + "welcome.subtitle": "En smuk Markdown-fremviser", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/de/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/de/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/de/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/de/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/de/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/de/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/de/strings.json b/src-mdviewer/src/md-nls-autogenerated/de/strings.json new file mode 100644 index 0000000000..5f6d5cf341 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/de/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Suche schließen", + "a11y.edit_link": "Link bearbeiten", + "a11y.format_text": "Text formatieren", + "a11y.insert_block": "Block einfügen", + "a11y.main_toolbar": "Hauptsymbolleiste", + "a11y.next_match": "Nächster Treffer", + "a11y.previous_match": "Vorheriger Treffer", + "a11y.search_in_document": "Im Dokument suchen", + "a11y.search_text": "Text suchen", + "a11y.select_language": "Sprache auswählen", + "a11y.sidebar": "Seitenleiste", + "a11y.skip_to_content": "Zum Inhalt springen", + "common.close": "Schließen", + "common.file": "Datei", + "common.open": "Öffnen", + "context.copy": "Kopieren", + "context.copy_image_address": "Bildadresse kopieren", + "context.copy_link": "Link kopieren", + "context.cut": "Ausschneiden", + "context.open_link": "Link öffnen", + "context.paste": "Einfügen", + "context.paste_plain": "Als reinen Text einfügen", + "context.select_all": "Alles auswählen", + "dialog.cancel": "Abbrechen", + "dialog.discard": "Verwerfen", + "dialog.dont_save": "Nicht speichern", + "dialog.save": "Speichern", + "dialog.unsaved_close": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Schließen speichern?", + "dialog.unsaved_exit_edit": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Verlassen des Bearbeitungsmodus speichern?", + "dialog.unsaved_new_file": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Erstellen einer neuen Datei speichern?", + "dialog.unsaved_open_file": "Sie haben ungespeicherte Änderungen. Möchten Sie vor dem Öffnen einer neuen Datei speichern?", + "dialog.unsaved_title": "Ungespeicherte Änderungen", + "drop_zone.text": "Markdown-Datei hier ablegen", + "export.open": "Öffnen", + "export.success": "PDF erfolgreich exportiert", + "format.blockquote": "Zitat", + "format.bold": "Fett ({mod}+B)", + "format.bullet_list": "Aufzählungsliste", + "format.code": "Inline-Code ({mod}+E)", + "format.code_block": "Codeblock", + "format.divider": "Trennlinie", + "format.heading1": "Überschrift 1", + "format.heading2": "Überschrift 2", + "format.heading3": "Überschrift 3", + "format.italic": "Kursiv ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.numbered_list": "Nummerierte Liste", + "format.paragraph": "Absatz", + "format.strikethrough": "Durchgestrichen ({mod}+Umschalt+X)", + "format.table": "Tabelle", + "format.task_list": "Aufgabenliste", + "help.editing": "Bearbeitung", + "help.fallback_notice": "Diese Seite ist noch nicht in Ihrer Sprache verfügbar. Die englische Version wird angezeigt.", + "help.features": "Funktionen", + "help.getting_started": "Erste Schritte", + "help.shortcuts": "Tastenkürzel", + "lang_picker.filter_label": "Sprachen filtern", + "lang_picker.filter_placeholder": "Sprachen filtern...", + "lang_picker.plain_text": "Klartext", + "link.apply": "Link anwenden", + "link.cancel": "Abbrechen", + "link.display_text": "Anzeigetext", + "link.edit": "Bearbeiten", + "link.edit_link": "Link bearbeiten", + "link.remove_link": "Link entfernen", + "link.text": "Text", + "link.text_placeholder": "Anzeigetext (optional)", + "link.url": "URL", + "link.url_placeholder": "URL einfügen oder eingeben...", + "recovery.discard": "Verwerfen", + "recovery.message": "Kern hat ungespeicherte Änderungen aus einer vorherigen Sitzung gefunden. Möchten Sie diese wiederherstellen?", + "recovery.restore": "Wiederherstellen", + "recovery.title": "Ungespeicherte Änderungen wiederherstellen?", + "search.count": "Treffer", + "search.no_results": "Keine Ergebnisse", + "search.placeholder": "Im Dokument suchen...", + "settings.language": "Sprache", + "settings.theme": "Thema", + "settings.theme_dark": "Dunkel", + "settings.theme_light": "Hell", + "settings.theme_system": "System", + "sidebar.no_headings": "Keine Überschriften gefunden", + "sidebar.recent": "Letzte Dateien", + "sidebar.toc": "Inhaltsverzeichnis", + "slash.blockquote": "Zitat", + "slash.blockquote_desc": "Zitatblock", + "slash.bullet_list": "Aufzählungsliste", + "slash.bullet_list_desc": "Unsortierte Liste", + "slash.code_block": "Codeblock", + "slash.code_block_desc": "Codebereich", + "slash.divider": "Trennlinie", + "slash.divider_desc": "Horizontale Linie", + "slash.heading1": "Überschrift 1", + "slash.heading1_desc": "Große Überschrift", + "slash.heading2": "Überschrift 2", + "slash.heading2_desc": "Mittlere Überschrift", + "slash.heading3": "Überschrift 3", + "slash.heading3_desc": "Kleine Überschrift", + "slash.no_results": "Keine Ergebnisse", + "slash.numbered_list": "Nummerierte Liste", + "slash.numbered_list_desc": "Sortierte Liste", + "slash.paragraph": "Absatz", + "slash.paragraph_desc": "Normaler Text", + "slash.table": "Tabelle", + "slash.table_desc": "3×3-Tabelle", + "slash.task_list": "Aufgabenliste", + "slash.task_list_desc": "Checkliste", + "table.add_col_left": "Spalte links hinzufügen", + "table.add_col_right": "Spalte rechts hinzufügen", + "table.add_row_above": "Zeile darüber hinzufügen", + "table.add_row_below": "Zeile darunter hinzufügen", + "table.col_options": "Optionen für Spalte {n}", + "table.delete_col": "Spalte löschen", + "table.delete_row": "Zeile löschen", + "table.header": "Kopfzeile", + "table.insert_col_left": "Spalte links einfügen", + "table.insert_col_right": "Spalte rechts einfügen", + "table.insert_row_above": "Zeile darüber einfügen", + "table.insert_row_below": "Zeile darunter einfügen", + "table.new_row": "+ Neue Zeile", + "table.row_options": "Optionen für Zeile {n}", + "toolbar.edit": "Bearbeiten", + "toolbar.export_pdf": "Als PDF exportieren", + "toolbar.focus": "Fokusmodus", + "toolbar.more": "Mehr", + "toolbar.new_file": "Neue Datei", + "toolbar.open": "Datei öffnen", + "toolbar.save": "Speichern", + "toolbar.search": "Suchen", + "toolbar.settings": "Einstellungen", + "toolbar.split_view": "Geteilte Ansicht", + "toolbar.theme": "Thema wechseln", + "toolbar.toc": "Inhaltsverzeichnis", + "toolbar.zoom_in": "Vergrößern", + "toolbar.zoom_out": "Verkleinern", + "toolbar.zoom_reset": "Zoom zurücksetzen", + "trial.days_remaining": "Noch {days} Tage in der Testversion", + "trial.expired_message": "Ihre Testversion ist abgelaufen. Kaufen Sie Kern, um weiter zu bearbeiten.", + "trial.feature_edit": "Markdown mit WYSIWYG und geteilter Ansicht bearbeiten", + "trial.feature_export": "Als PDF exportieren", + "trial.feature_save": "Dateien speichern und neu erstellen", + "trial.one_time_purchase": "Einmaliger Kauf. Kein Abonnement.", + "trial.purchase_button": "Kern kaufen", + "trial.purchase_desc": "Erhalten Sie vollen Zugriff auf alle Bearbeitungs- und Exportfunktionen mit einem einmaligen Kauf.", + "trial.purchase_title": "Kern freischalten", + "trial.purchasing": "Kauf wird durchgeführt...", + "trial.restore_purchases": "Käufe wiederherstellen", + "trial.restoring": "Wiederherstellung...", + "viewer.copied": "Kopiert!", + "viewer.copy": "Kopieren", + "welcome.drop_hint": "oder eine .md-Datei hierher ziehen", + "welcome.new_button": "Neue Datei", + "welcome.open_button": "Datei öffnen", + "welcome.subtitle": "Ein schöner Markdown-Betrachter", + "welcome.title": "Kern", + "format.block_type": "Blocktyp", + "format.lists": "Listen", + "format.more_elements": "Mehr", + "format.text_formatting": "Textformatierung", + "format.underline": "Unterstrichen", + "mermaid.done": "Fertig", + "mermaid.edit": "Bearbeiten", + "mermaid.error_prefix": "Syntaxfehler", + "mermaid.stale": "Vorschau veraltet", + "slash.mermaid": "Mermaid-Diagramm", + "slash.mermaid_desc": "Ein Diagramm einfügen", + "toolbar.done": "Fertig" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/el/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/el/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/el/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/el/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/el/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/el/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/el/strings.json b/src-mdviewer/src/md-nls-autogenerated/el/strings.json new file mode 100644 index 0000000000..147b4f13c2 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/el/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Κλείσιμο αναζήτησης", + "a11y.edit_link": "Επεξεργασία συνδέσμου", + "a11y.format_text": "Μορφοποίηση κειμένου", + "a11y.insert_block": "Εισαγωγή μπλοκ", + "a11y.main_toolbar": "Κύρια γραμμή εργαλείων", + "a11y.next_match": "Επόμενη αντιστοιχία", + "a11y.previous_match": "Προηγούμενη αντιστοιχία", + "a11y.search_in_document": "Αναζήτηση στο έγγραφο", + "a11y.search_text": "Αναζήτηση κειμένου", + "a11y.select_language": "Επιλογή γλώσσας", + "a11y.sidebar": "Πλευρική στήλη", + "a11y.skip_to_content": "Μετάβαση στο περιεχόμενο", + "common.close": "Κλείσιμο", + "common.file": "Αρχείο", + "common.open": "Άνοιγμα", + "context.copy": "Αντιγραφή", + "context.copy_image_address": "Αντιγραφή διεύθυνσης εικόνας", + "context.copy_link": "Αντιγραφή συνδέσμου", + "context.cut": "Αποκοπή", + "context.open_link": "Άνοιγμα συνδέσμου", + "context.paste": "Επικόλληση", + "context.paste_plain": "Επικόλληση ως απλό κείμενο", + "context.select_all": "Επιλογή όλων", + "dialog.cancel": "Ακύρωση", + "dialog.discard": "Απόρριψη", + "dialog.dont_save": "Μη αποθήκευση", + "dialog.save": "Αποθήκευση", + "dialog.unsaved_close": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν το κλείσιμο;", + "dialog.unsaved_exit_edit": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν την έξοδο από τη λειτουργία επεξεργασίας;", + "dialog.unsaved_new_file": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν τη δημιουργία νέου αρχείου;", + "dialog.unsaved_open_file": "Έχετε μη αποθηκευμένες αλλαγές. Θέλετε να αποθηκεύσετε πριν ανοίξετε ένα νέο αρχείο;", + "dialog.unsaved_title": "Μη αποθηκευμένες αλλαγές", + "drop_zone.text": "Αποθέστε το αρχείο Markdown εδώ", + "export.open": "Άνοιγμα", + "export.success": "Το PDF εξήχθη με επιτυχία", + "format.block_type": "Τύπος μπλοκ", + "format.blockquote": "Εσοχή παράθεσης", + "format.bold": "Έντονα ({mod}+B)", + "format.bullet_list": "Λίστα με κουκκίδες", + "format.code": "Ενσωματωμένος κώδικας ({mod}+E)", + "format.code_block": "Μπλοκ κώδικα", + "format.divider": "Διαχωριστικό", + "format.heading1": "Επικεφαλίδα 1", + "format.heading2": "Επικεφαλίδα 2", + "format.heading3": "Επικεφαλίδα 3", + "format.italic": "Πλάγια ({mod}+I)", + "format.link": "Σύνδεσμος ({mod}+K)", + "format.lists": "Λίστες", + "format.more_elements": "Περισσότερα", + "format.numbered_list": "Αριθμημένη λίστα", + "format.paragraph": "Παράγραφος", + "format.strikethrough": "Διαγράμμιση ({mod}+Shift+X)", + "format.table": "Πίνακας", + "format.task_list": "Λίστα εργασιών", + "format.text_formatting": "Μορφοποίηση κειμένου", + "format.underline": "Υπογράμμιση", + "help.editing": "Επεξεργασία", + "help.fallback_notice": "Αυτή η σελίδα δεν είναι ακόμη διαθέσιμη στη γλώσσα σας. Εμφανίζεται η αγγλική έκδοση.", + "help.features": "Δυνατότητες", + "help.getting_started": "Ξεκινώντας", + "help.shortcuts": "Συντομεύσεις πληκτρολογίου", + "lang_picker.filter_label": "Φιλτράρισμα γλωσσών", + "lang_picker.filter_placeholder": "Φιλτράρισμα γλωσσών...", + "lang_picker.plain_text": "Απλό κείμενο", + "link.apply": "Εφαρμογή συνδέσμου", + "link.cancel": "Ακύρωση", + "link.display_text": "Κείμενο εμφάνισης", + "link.edit": "Επεξεργασία", + "link.edit_link": "Επεξεργασία συνδέσμου", + "link.remove_link": "Αφαίρεση συνδέσμου", + "link.text": "Κείμενο", + "link.text_placeholder": "Εμφανιζόμενο κείμενο (προαιρετικό)", + "link.url": "URL", + "link.url_placeholder": "Επικολλήστε ή πληκτρολογήστε URL...", + "mermaid.done": "Τέλος", + "mermaid.edit": "Επεξεργασία", + "mermaid.error_prefix": "Συντακτικό σφάλμα", + "mermaid.stale": "Μη ενημερωμένη προεπισκόπηση", + "recovery.discard": "Απόρριψη", + "recovery.message": "Το Kern εντόπισε μη αποθηκευμένες αλλαγές από μια προηγούμενη συνεδρία. Θέλετε να τις επαναφέρετε;", + "recovery.restore": "Επαναφορά", + "recovery.title": "Ανάκτηση μη αποθηκευμένων αλλαγών;", + "search.count": "αντιστοιχίες", + "search.no_results": "Κανένα αποτέλεσμα", + "search.placeholder": "Αναζήτηση στο έγγραφο...", + "settings.language": "Γλώσσα", + "settings.theme": "Θέμα", + "settings.theme_dark": "Σκούρο", + "settings.theme_light": "Φωτεινό", + "settings.theme_system": "Σύστημα", + "sidebar.no_headings": "Δεν βρέθηκαν επικεφαλίδες", + "sidebar.recent": "Πρόσφατα αρχεία", + "sidebar.toc": "Πίνακας περιεχομένων", + "slash.blockquote": "Μπλοκ παράθεσης", + "slash.blockquote_desc": "Μπλοκ παραθέματος", + "slash.bullet_list": "Λίστα με κουκκίδες", + "slash.bullet_list_desc": "Μη ταξινομημένη λίστα", + "slash.code_block": "Μπλοκ κώδικα", + "slash.code_block_desc": "Περιφραγμένος κώδικας", + "slash.divider": "Διαχωριστικό", + "slash.divider_desc": "Οριζόντια γραμμή", + "slash.heading1": "Επικεφαλίδα 1", + "slash.heading1_desc": "Μεγάλη επικεφαλίδα", + "slash.heading2": "Επικεφαλίδα 2", + "slash.heading2_desc": "Μεσαία επικεφαλίδα", + "slash.heading3": "Επικεφαλίδα 3", + "slash.heading3_desc": "Μικρή επικεφαλίδα", + "slash.mermaid": "Διάγραμμα Mermaid", + "slash.mermaid_desc": "Εισαγωγή διαγράμματος", + "slash.no_results": "Κανένα αποτέλεσμα", + "slash.numbered_list": "Αριθμημένη λίστα", + "slash.numbered_list_desc": "Ταξινομημένη λίστα", + "slash.paragraph": "Παράγραφος", + "slash.paragraph_desc": "Απλό κείμενο", + "slash.table": "Πίνακας", + "slash.table_desc": "Πίνακας 3×3", + "slash.task_list": "Λίστα εργασιών", + "slash.task_list_desc": "Λίστα ελέγχου", + "table.add_col_left": "Προσθήκη στήλης αριστερά", + "table.add_col_right": "Προσθήκη στήλης δεξιά", + "table.add_row_above": "Προσθήκη γραμμής επάνω", + "table.add_row_below": "Προσθήκη γραμμής κάτω", + "table.col_options": "Επιλογές στήλης {n}", + "table.delete_col": "Διαγραφή στήλης", + "table.delete_row": "Διαγραφή γραμμής", + "table.header": "Κεφαλίδα", + "table.insert_col_left": "Εισαγωγή στήλης αριστερά", + "table.insert_col_right": "Εισαγωγή στήλης δεξιά", + "table.insert_row_above": "Εισαγωγή γραμμής επάνω", + "table.insert_row_below": "Εισαγωγή γραμμής κάτω", + "table.new_row": "+ Νέα γραμμή", + "table.row_options": "Επιλογές γραμμής {n}", + "toolbar.done": "Τέλος", + "toolbar.edit": "Επεξεργασία", + "toolbar.export_pdf": "Εξαγωγή PDF", + "toolbar.focus": "Λειτουργία Συγκέντρωσης", + "toolbar.more": "Περισσότερα", + "toolbar.new_file": "Νέο Αρχείο", + "toolbar.open": "Άνοιγμα Αρχείου", + "toolbar.save": "Αποθήκευση", + "toolbar.search": "Αναζήτηση", + "toolbar.settings": "Ρυθμίσεις", + "toolbar.split_view": "Διαχωρισμός προβολής", + "toolbar.theme": "Εναλλαγή θέματος", + "toolbar.toc": "Πίνακας περιεχομένων", + "toolbar.zoom_in": "Μεγέθυνση", + "toolbar.zoom_out": "Σμίκρυνση", + "toolbar.zoom_reset": "Επαναφορά εστίασης", + "trial.days_remaining": "Απομένουν {days} ημέρες στη δοκιμαστική περίοδο", + "trial.expired_message": "Η δοκιμαστική σας περίοδος έχει λήξει. Αγοράστε το Kern για να συνεχίσετε την επεξεργασία.", + "trial.feature_edit": "Επεξεργασία Markdown με WYSIWYG και διαχωρισμένη προβολή", + "trial.feature_export": "Εξαγωγή σε PDF", + "trial.feature_save": "Αποθήκευση και δημιουργία νέων αρχείων", + "trial.one_time_purchase": "Εφάπαξ αγορά. Χωρίς συνδρομή.", + "trial.purchase_button": "Αγορά Kern", + "trial.purchase_desc": "Αποκτήστε πλήρη πρόσβαση σε όλες τις λειτουργίες επεξεργασίας και εξαγωγής με μια εφάπαξ αγορά.", + "trial.purchase_title": "Ξεκλειδώστε το Kern", + "trial.purchasing": "Γίνεται αγορά...", + "trial.restore_purchases": "Επαναφορά Αγορών", + "trial.restoring": "Γίνεται επαναφορά...", + "viewer.copied": "Αντιγράφηκε!", + "viewer.copy": "Αντιγραφή", + "welcome.drop_hint": "ή σύρετε & αποθέστε ένα αρχείο .md", + "welcome.new_button": "Νέο Αρχείο", + "welcome.open_button": "Άνοιγμα Αρχείου", + "welcome.subtitle": "Ένα όμορφο πρόγραμμα προβολής Markdown", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/en-gb/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/en-gb/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/en-gb/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/en-gb/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/en-gb/lastTranslated.json new file mode 100644 index 0000000000..92f154907b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/en-gb/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} diff --git a/src-mdviewer/src/md-nls-autogenerated/en-gb/strings.json b/src-mdviewer/src/md-nls-autogenerated/en-gb/strings.json new file mode 100644 index 0000000000..92f154907b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/en-gb/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} diff --git a/src-mdviewer/src/md-nls-autogenerated/es/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/es/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/es/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/es/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/es/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/es/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/es/strings.json b/src-mdviewer/src/md-nls-autogenerated/es/strings.json new file mode 100644 index 0000000000..fb38a92bed --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/es/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Cerrar búsqueda", + "a11y.edit_link": "Editar enlace", + "a11y.format_text": "Formato de texto", + "a11y.insert_block": "Insertar bloque", + "a11y.main_toolbar": "Barra de herramientas principal", + "a11y.next_match": "Coincidencia siguiente", + "a11y.previous_match": "Coincidencia anterior", + "a11y.search_in_document": "Buscar en el documento", + "a11y.search_text": "Buscar texto", + "a11y.select_language": "Seleccionar idioma", + "a11y.sidebar": "Barra lateral", + "a11y.skip_to_content": "Ir al contenido", + "common.close": "Cerrar", + "common.file": "Archivo", + "common.open": "Abrir", + "context.copy": "Copiar", + "context.copy_image_address": "Copiar dirección de imagen", + "context.copy_link": "Copiar enlace", + "context.cut": "Cortar", + "context.open_link": "Abrir enlace", + "context.paste": "Pegar", + "context.paste_plain": "Pegar como texto sin formato", + "context.select_all": "Seleccionar todo", + "dialog.cancel": "Cancelar", + "dialog.discard": "Descartar", + "dialog.dont_save": "No guardar", + "dialog.save": "Guardar", + "dialog.unsaved_close": "Tienes cambios sin guardar. ¿Deseas guardar antes de cerrar?", + "dialog.unsaved_exit_edit": "Tienes cambios sin guardar. ¿Deseas guardar antes de salir del modo edición?", + "dialog.unsaved_new_file": "Tienes cambios sin guardar. ¿Deseas guardar antes de crear un nuevo archivo?", + "dialog.unsaved_open_file": "Tienes cambios sin guardar. ¿Deseas guardar antes de abrir un nuevo archivo?", + "dialog.unsaved_title": "Cambios sin guardar", + "drop_zone.text": "Suelta tu archivo Markdown aquí", + "export.open": "Abrir", + "export.success": "PDF exportado con éxito", + "format.blockquote": "Cita", + "format.bold": "Negrita ({mod}+B)", + "format.bullet_list": "Lista con viñetas", + "format.code": "Código en línea ({mod}+E)", + "format.code_block": "Bloque de código", + "format.divider": "Separador", + "format.heading1": "Encabezado 1", + "format.heading2": "Encabezado 2", + "format.heading3": "Encabezado 3", + "format.italic": "Cursiva ({mod}+I)", + "format.link": "Enlace ({mod}+K)", + "format.numbered_list": "Lista numerada", + "format.paragraph": "Párrafo", + "format.strikethrough": "Tachado ({mod}+Shift+X)", + "format.table": "Tabla", + "format.task_list": "Lista de tareas", + "help.editing": "Edición", + "help.fallback_notice": "Esta página aún no está disponible en tu idioma. Se muestra la versión en inglés.", + "help.features": "Funcionalidades", + "help.getting_started": "Primeros pasos", + "help.shortcuts": "Atajos de teclado", + "lang_picker.filter_label": "Filtrar idiomas", + "lang_picker.filter_placeholder": "Filtrar idiomas...", + "lang_picker.plain_text": "Texto plano", + "link.apply": "Aplicar enlace", + "link.cancel": "Cancelar", + "link.display_text": "Texto a mostrar", + "link.edit": "Editar", + "link.edit_link": "Editar enlace", + "link.remove_link": "Eliminar enlace", + "link.text": "Texto", + "link.text_placeholder": "Texto a mostrar (opcional)", + "link.url": "URL", + "link.url_placeholder": "Pega o escribe una URL...", + "recovery.discard": "Descartar", + "recovery.message": "Kern encontró cambios no guardados de una sesión anterior. ¿Deseas restaurarlos?", + "recovery.restore": "Restaurar", + "recovery.title": "¿Recuperar cambios no guardados?", + "search.count": "coincidencias", + "search.no_results": "Sin resultados", + "search.placeholder": "Buscar en el documento...", + "settings.language": "Idioma", + "settings.theme": "Tema", + "settings.theme_dark": "Oscuro", + "settings.theme_light": "Claro", + "settings.theme_system": "Sistema", + "sidebar.no_headings": "No se encontraron encabezados", + "sidebar.recent": "Archivos recientes", + "sidebar.toc": "Tabla de contenidos", + "slash.blockquote": "Cita", + "slash.blockquote_desc": "Bloque de cita", + "slash.bullet_list": "Lista con viñetas", + "slash.bullet_list_desc": "Lista desordenada", + "slash.code_block": "Bloque de código", + "slash.code_block_desc": "Código delimitado", + "slash.divider": "Separador", + "slash.divider_desc": "Línea horizontal", + "slash.heading1": "Encabezado 1", + "slash.heading1_desc": "Encabezado grande", + "slash.heading2": "Encabezado 2", + "slash.heading2_desc": "Encabezado mediano", + "slash.heading3": "Encabezado 3", + "slash.heading3_desc": "Encabezado pequeño", + "slash.no_results": "Sin resultados", + "slash.numbered_list": "Lista numerada", + "slash.numbered_list_desc": "Lista ordenada", + "slash.paragraph": "Párrafo", + "slash.paragraph_desc": "Texto normal", + "slash.table": "Tabla", + "slash.table_desc": "Tabla 3×3", + "slash.task_list": "Lista de tareas", + "slash.task_list_desc": "Lista de verificación", + "table.add_col_left": "Añadir columna a la izquierda", + "table.add_col_right": "Añadir columna a la derecha", + "table.add_row_above": "Añadir fila arriba", + "table.add_row_below": "Añadir fila abajo", + "table.col_options": "Opciones de columna {n}", + "table.delete_col": "Eliminar columna", + "table.delete_row": "Eliminar fila", + "table.header": "Encabezado", + "table.insert_col_left": "Insertar columna a la izquierda", + "table.insert_col_right": "Insertar columna a la derecha", + "table.insert_row_above": "Insertar fila arriba", + "table.insert_row_below": "Insertar fila abajo", + "table.new_row": "+ Nueva fila", + "table.row_options": "Opciones de fila {n}", + "toolbar.edit": "Editar", + "toolbar.export_pdf": "Exportar PDF", + "toolbar.focus": "Modo enfoque", + "toolbar.more": "Más", + "toolbar.new_file": "Nuevo archivo", + "toolbar.open": "Abrir archivo", + "toolbar.save": "Guardar", + "toolbar.search": "Buscar", + "toolbar.settings": "Ajustes", + "toolbar.split_view": "Vista dividida", + "toolbar.theme": "Cambiar tema", + "toolbar.toc": "Tabla de contenidos", + "toolbar.zoom_in": "Acercar", + "toolbar.zoom_out": "Alejar", + "toolbar.zoom_reset": "Restablecer zoom", + "trial.days_remaining": "{days} días restantes de prueba", + "trial.expired_message": "Tu período de prueba ha expirado. Compra Kern para seguir editando.", + "trial.feature_edit": "Edita Markdown con WYSIWYG y vista dividida", + "trial.feature_export": "Exportar a PDF", + "trial.feature_save": "Guarda y crea archivos nuevos", + "trial.one_time_purchase": "Compra única. Sin suscripción.", + "trial.purchase_button": "Comprar Kern", + "trial.purchase_desc": "Obtén acceso completo a todas las funciones de edición y exportación con una compra única.", + "trial.purchase_title": "Desbloquear Kern", + "trial.purchasing": "Comprando...", + "trial.restore_purchases": "Restaurar compras", + "trial.restoring": "Restaurando...", + "viewer.copied": "Copiado!", + "viewer.copy": "Copiar", + "welcome.drop_hint": "o arrastra y suelta un archivo .md", + "welcome.new_button": "Nuevo archivo", + "welcome.open_button": "Abrir archivo", + "welcome.subtitle": "Un hermoso visor de Markdown", + "welcome.title": "Kern", + "format.block_type": "Tipo de bloque", + "format.lists": "Listas", + "format.more_elements": "Más", + "format.text_formatting": "Formato de texto", + "format.underline": "Subrayado", + "mermaid.done": "Hecho", + "mermaid.edit": "Editar", + "mermaid.error_prefix": "Error de sintaxis", + "mermaid.stale": "Vista previa desactualizada", + "slash.mermaid": "Diagrama de Mermaid", + "slash.mermaid_desc": "Insertar un diagrama", + "toolbar.done": "Hecho" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fa-ir/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/fa-ir/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fa-ir/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/fa-ir/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/fa-ir/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fa-ir/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fa-ir/strings.json b/src-mdviewer/src/md-nls-autogenerated/fa-ir/strings.json new file mode 100644 index 0000000000..113e706503 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fa-ir/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "بستن جستجو", + "a11y.edit_link": "ویرایش پیوند", + "a11y.format_text": "قالببندی متن", + "a11y.insert_block": "درج بلوک", + "a11y.main_toolbar": "نوار ابزار اصلی", + "a11y.next_match": "مورد بعدی", + "a11y.previous_match": "مورد قبلی", + "a11y.search_in_document": "جستجو در سند", + "a11y.search_text": "جستجوی متن", + "a11y.select_language": "انتخاب زبان", + "a11y.sidebar": "نوار کناری", + "a11y.skip_to_content": "پرش به محتوا", + "common.close": "بستن", + "common.file": "فایل", + "common.open": "باز کردن", + "context.copy": "کپی", + "context.copy_image_address": "کپی آدرس تصویر", + "context.copy_link": "کپی پیوند", + "context.cut": "برش", + "context.open_link": "باز کردن پیوند", + "context.paste": "چسباندن", + "context.paste_plain": "چسباندن به صورت متن ساده", + "context.select_all": "انتخاب همه", + "dialog.cancel": "انصراف", + "dialog.discard": "نادیده گرفتن", + "dialog.dont_save": "ذخیره نکردن", + "dialog.save": "ذخیره", + "dialog.unsaved_close": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از بستن، ذخیره کنید؟", + "dialog.unsaved_exit_edit": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از خروج از حالت ویرایش، ذخیره کنید؟", + "dialog.unsaved_new_file": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از ایجاد فایل جدید، ذخیره کنید؟", + "dialog.unsaved_open_file": "شما تغییرات ذخیرهنشده دارید. آیا میخواهید قبل از باز کردن فایل جدید، آن را ذخیره کنید؟", + "dialog.unsaved_title": "تغییرات ذخیرهنشده", + "drop_zone.text": "فایل مارکداون خود را اینجا رها کنید", + "export.open": "باز کردن", + "export.success": "فایل PDF با موفقیت صادر شد", + "format.block_type": "نوع بلوک", + "format.blockquote": "نقلقول", + "format.bold": "ضخیم ({mod}+B)", + "format.bullet_list": "فهرست موردی", + "format.code": "کد درونخطی ({mod}+E)", + "format.code_block": "بلوک کد", + "format.divider": "جداکننده", + "format.heading1": "سرتیتر ۱", + "format.heading2": "سرتیتر ۲", + "format.heading3": "سرتیتر ۳", + "format.italic": "ایتالیک ({mod}+I)", + "format.link": "پیوند ({mod}+K)", + "format.lists": "فهرستها", + "format.more_elements": "بیشتر", + "format.numbered_list": "فهرست شمارهدار", + "format.paragraph": "پاراگراف", + "format.strikethrough": "خط خورده ({mod}+Shift+X)", + "format.table": "جدول", + "format.task_list": "فهرست کارها", + "format.text_formatting": "قالببندی متن", + "format.underline": "زیرخط", + "help.editing": "ویرایش", + "help.fallback_notice": "این صفحه هنوز به زبان شما در دسترس نیست. نسخهٔ انگلیسی نمایش داده میشود.", + "help.features": "ویژگیها", + "help.getting_started": "شروع به کار", + "help.shortcuts": "میانبرهای صفحهکلید", + "lang_picker.filter_label": "فیلتر زبانها", + "lang_picker.filter_placeholder": "فیلتر زبانها...", + "lang_picker.plain_text": "متن ساده", + "link.apply": "اعمال لینک", + "link.cancel": "انصراف", + "link.display_text": "متن نمایشی", + "link.edit": "ویرایش", + "link.edit_link": "ویرایش لینک", + "link.remove_link": "حذف لینک", + "link.text": "متن", + "link.text_placeholder": "متن نمایشی (اختیاری)", + "link.url": "URL", + "link.url_placeholder": "URL را جایگذاری یا تایپ کنید...", + "mermaid.done": "تایید", + "mermaid.edit": "ویرایش", + "mermaid.error_prefix": "خطای نحوی", + "mermaid.stale": "پیشنمایش بهروز نیست", + "recovery.discard": "صرفنظر", + "recovery.message": "Kern تغییرات ذخیرهنشدهای از جلسهٔ قبل پیدا کرده است. آیا مایل به بازیابی آنها هستید؟", + "recovery.restore": "بازیابی", + "recovery.title": "تغییرات ذخیرهنشده بازیابی شوند؟", + "search.count": "مورد", + "search.no_results": "نتیجهای یافت نشد", + "search.placeholder": "جستجو در سند...", + "settings.language": "زبان", + "settings.theme": "پوسته", + "settings.theme_dark": "تیره", + "settings.theme_light": "روشن", + "settings.theme_system": "سیستم", + "sidebar.no_headings": "هیچ سرتیتری یافت نشد", + "sidebar.recent": "فایلهای اخیر", + "sidebar.toc": "فهرست مطالب", + "slash.blockquote": "نقل قول", + "slash.blockquote_desc": "بلوک نقل قول", + "slash.bullet_list": "لیست گلولهای", + "slash.bullet_list_desc": "لیست نامرتب", + "slash.code_block": "بلوک کد", + "slash.code_block_desc": "کد محصور", + "slash.divider": "جداکننده", + "slash.divider_desc": "خط افقی", + "slash.heading1": "سرتیتر ۱", + "slash.heading1_desc": "سرتیتر بزرگ", + "slash.heading2": "سرتیتر ۲", + "slash.heading2_desc": "سرتیتر متوسط", + "slash.heading3": "سرتیتر ۳", + "slash.heading3_desc": "سرتیتر کوچک", + "slash.mermaid": "نمودار Mermaid", + "slash.mermaid_desc": "درج نمودار", + "slash.no_results": "نتیجهای یافت نشد", + "slash.numbered_list": "فهرست شمارهدار", + "slash.numbered_list_desc": "فهرست مرتب", + "slash.paragraph": "پاراگراف", + "slash.paragraph_desc": "متن ساده", + "slash.table": "جدول", + "slash.table_desc": "جدول ۳×۳", + "slash.task_list": "فهرست وظایف", + "slash.task_list_desc": "چکلیست", + "table.add_col_left": "افزودن ستون به چپ", + "table.add_col_right": "افزودن ستون به راست", + "table.add_row_above": "افزودن ردیف در بالا", + "table.add_row_below": "افزودن ردیف در پایین", + "table.col_options": "گزینههای ستون {n}", + "table.delete_col": "حذف ستون", + "table.delete_row": "حذف ردیف", + "table.header": "سربرگ", + "table.insert_col_left": "درج ستون در سمت چپ", + "table.insert_col_right": "درج ستون در سمت راست", + "table.insert_row_above": "درج ردیف در بالا", + "table.insert_row_below": "درج ردیف در پایین", + "table.new_row": "+ سطر جدید", + "table.row_options": "گزینههای سطر {n}", + "toolbar.done": "انجام شد", + "toolbar.edit": "ویرایش", + "toolbar.export_pdf": "خروجی PDF", + "toolbar.focus": "حالت تمرکز", + "toolbar.more": "بیشتر", + "toolbar.new_file": "فایل جدید", + "toolbar.open": "باز کردن فایل", + "toolbar.save": "ذخیره", + "toolbar.search": "جستجو", + "toolbar.settings": "تنظیمات", + "toolbar.split_view": "نمای تقسیمشده", + "toolbar.theme": "تغییر پوسته", + "toolbar.toc": "فهرست مطالب", + "toolbar.zoom_in": "بزرگنمایی", + "toolbar.zoom_out": "کوچکنمایی", + "toolbar.zoom_reset": "بازنشانی بزرگنمایی", + "trial.days_remaining": "{days} روز از دوره آزمایشی باقیمانده", + "trial.expired_message": "دوره آزمایشی شما به پایان رسیده است. برای ادامه ویرایش، Kern را خریداری کنید.", + "trial.feature_edit": "ویرایش مارکداون با WYSIWYG و نمای تقسیمشده", + "trial.feature_export": "خروجی PDF", + "trial.feature_save": "ذخیره و ایجاد فایلهای جدید", + "trial.one_time_purchase": "خرید یکباره. بدون اشتراک.", + "trial.purchase_button": "خرید Kern", + "trial.purchase_desc": "با یکبار خرید، به تمام قابلیتهای ویرایش و خروجی دسترسی کامل پیدا کنید.", + "trial.purchase_title": "باز کردن قفل Kern", + "trial.purchasing": "در حال خرید...", + "trial.restore_purchases": "بازیابی خریدها", + "trial.restoring": "در حال بازیابی...", + "viewer.copied": "کپی شد!", + "viewer.copy": "کپی", + "welcome.drop_hint": "یا یک فایل .md را بکشید و رها کنید", + "welcome.new_button": "فایل جدید", + "welcome.open_button": "باز کردن فایل", + "welcome.subtitle": "یک نمایشگر زیبای مارکداون", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fi/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/fi/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fi/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/fi/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/fi/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fi/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fi/strings.json b/src-mdviewer/src/md-nls-autogenerated/fi/strings.json new file mode 100644 index 0000000000..e7d09d5c85 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fi/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Sulje haku", + "a11y.edit_link": "Muokkaa linkkiä", + "a11y.format_text": "Muotoile tekstiä", + "a11y.insert_block": "Lisää lohko", + "a11y.main_toolbar": "Päätyökalupalkki", + "a11y.next_match": "Seuraava osuma", + "a11y.previous_match": "Edellinen osuma", + "a11y.search_in_document": "Hae asiakirjasta", + "a11y.search_text": "Hae tekstiä", + "a11y.select_language": "Valitse kieli", + "a11y.sidebar": "Sivupalkki", + "a11y.skip_to_content": "Siirry sisältöön", + "common.close": "Sulje", + "common.file": "Tiedosto", + "common.open": "Avaa", + "context.copy": "Kopioi", + "context.copy_image_address": "Kopioi kuvan osoite", + "context.copy_link": "Kopioi linkki", + "context.cut": "Leikkaa", + "context.open_link": "Avaa linkki", + "context.paste": "Liitä", + "context.paste_plain": "Liitä tavallisena tekstinä", + "context.select_all": "Valitse kaikki", + "dialog.cancel": "Peruuta", + "dialog.discard": "Hylkää", + "dialog.dont_save": "Älä tallenna", + "dialog.save": "Tallenna", + "dialog.unsaved_close": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen sulkemista?", + "dialog.unsaved_exit_edit": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen muokkaustilasta poistumista?", + "dialog.unsaved_new_file": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen uuden tiedoston luomista?", + "dialog.unsaved_open_file": "Sinulla on tallentamattomia muutoksia. Haluatko tallentaa ennen uuden tiedoston avaamista?", + "dialog.unsaved_title": "Tallentamattomat muutokset", + "drop_zone.text": "Pudota Markdown-tiedostosi tähän", + "export.open": "Avaa", + "export.success": "PDF vietiin onnistuneesti", + "format.block_type": "Lohkotyyppi", + "format.blockquote": "Lainauslohko", + "format.bold": "Lihavointi ({mod}+B)", + "format.bullet_list": "Pisteluettelo", + "format.code": "Tekstinsisäinen koodi ({mod}+E)", + "format.code_block": "Koodilohko", + "format.divider": "Erotin", + "format.heading1": "Otsikko 1", + "format.heading2": "Otsikko 2", + "format.heading3": "Otsikko 3", + "format.italic": "Kursiivi ({mod}+I)", + "format.link": "Linkki ({mod}+K)", + "format.lists": "Listat", + "format.more_elements": "Lisää", + "format.numbered_list": "Numeroitu luettelo", + "format.paragraph": "Kappale", + "format.strikethrough": "Yliviivaus ({mod}+Shift+X)", + "format.table": "Taulukko", + "format.task_list": "Tehtäväluettelo", + "format.text_formatting": "Tekstin muotoilu", + "format.underline": "Alleviivaus", + "help.editing": "Muokkaus", + "help.fallback_notice": "Tämä sivu ei ole vielä saatavilla kielelläsi. Näytetään englanninkielinen versio.", + "help.features": "Ominaisuudet", + "help.getting_started": "Käytön aloitus", + "help.shortcuts": "Pikanäppäimet", + "lang_picker.filter_label": "Suodata kieliä", + "lang_picker.filter_placeholder": "Suodata kieliä...", + "lang_picker.plain_text": "Pelkkä teksti", + "link.apply": "Käytä linkkiä", + "link.cancel": "Peruuta", + "link.display_text": "Näytettävä teksti", + "link.edit": "Muokkaa", + "link.edit_link": "Muokkaa linkkiä", + "link.remove_link": "Poista linkki", + "link.text": "Teksti", + "link.text_placeholder": "Näytettävä teksti (valinnainen)", + "link.url": "URL", + "link.url_placeholder": "Liitä tai kirjoita URL...", + "mermaid.done": "Valmis", + "mermaid.edit": "Muokkaa", + "mermaid.error_prefix": "Syntaksivirhe", + "mermaid.stale": "Esikatselu vanhentunut", + "recovery.discard": "Hylkää", + "recovery.message": "Kern löysi tallentamattomia muutoksia edellisestä istunnosta. Haluatko palauttaa ne?", + "recovery.restore": "Palauta", + "recovery.title": "Palautetaanko tallentamattomat muutokset?", + "search.count": "osumaa", + "search.no_results": "Ei tuloksia", + "search.placeholder": "Hae dokumentista...", + "settings.language": "Kieli", + "settings.theme": "Teema", + "settings.theme_dark": "Tumma", + "settings.theme_light": "Vaalea", + "settings.theme_system": "Järjestelmä", + "sidebar.no_headings": "Otsikoita ei löytynyt", + "sidebar.recent": "Viimeisimmät tiedostot", + "sidebar.toc": "Sisällysluettelo", + "slash.blockquote": "Lainaus", + "slash.blockquote_desc": "Lainauslohko", + "slash.bullet_list": "Luettelomerkit", + "slash.bullet_list_desc": "Järjestämätön lista", + "slash.code_block": "Koodilohko", + "slash.code_block_desc": "Aidattu koodilohko", + "slash.divider": "Erotin", + "slash.divider_desc": "Vaakaviiva", + "slash.heading1": "Otsikko 1", + "slash.heading1_desc": "Suuri otsikko", + "slash.heading2": "Otsikko 2", + "slash.heading2_desc": "Keskikokoinen otsikko", + "slash.heading3": "Otsikko 3", + "slash.heading3_desc": "Pieni otsikko", + "slash.mermaid": "Mermaid-kaavio", + "slash.mermaid_desc": "Lisää kaavio", + "slash.no_results": "Ei tuloksia", + "slash.numbered_list": "Numeroitu luettelo", + "slash.numbered_list_desc": "Järjestetty luettelo", + "slash.paragraph": "Kappale", + "slash.paragraph_desc": "Normaali teksti", + "slash.table": "Taulukko", + "slash.table_desc": "3×3-taulukko", + "slash.task_list": "Tehtäväluettelo", + "slash.task_list_desc": "Tarkistuslista", + "table.add_col_left": "Lisää sarake vasemmalle", + "table.add_col_right": "Lisää sarake oikealle", + "table.add_row_above": "Lisää rivi yläpuolelle", + "table.add_row_below": "Lisää rivi alapuolelle", + "table.col_options": "Sarakkeen {n} valinnat", + "table.delete_col": "Poista sarake", + "table.delete_row": "Poista rivi", + "table.header": "Otsikko", + "table.insert_col_left": "Lisää sarake vasemmalle", + "table.insert_col_right": "Lisää sarake oikealle", + "table.insert_row_above": "Lisää rivi yläpuolelle", + "table.insert_row_below": "Lisää rivi alapuolelle", + "table.new_row": "+ Uusi rivi", + "table.row_options": "Rivin {n} asetukset", + "toolbar.done": "Valmis", + "toolbar.edit": "Muokkaa", + "toolbar.export_pdf": "Vie PDF", + "toolbar.focus": "Keskittymistila", + "toolbar.more": "Lisää", + "toolbar.new_file": "Uusi tiedosto", + "toolbar.open": "Avaa tiedosto", + "toolbar.save": "Tallenna", + "toolbar.search": "Haku", + "toolbar.settings": "Asetukset", + "toolbar.split_view": "Jaettu näkymä", + "toolbar.theme": "Vaihda teema", + "toolbar.toc": "Sisällysluettelo", + "toolbar.zoom_in": "Lähennä", + "toolbar.zoom_out": "Loitonna", + "toolbar.zoom_reset": "Nollaa zoomaus", + "trial.days_remaining": "{days} päivää kokeiluaikaa jäljellä", + "trial.expired_message": "Kokeiluaikasi on päättynyt. Osta Kern jatkaaksesi muokkaamista.", + "trial.feature_edit": "Muokkaa Markdownia WYSIWYG- ja jaetulla näkymällä", + "trial.feature_export": "Vie PDF-muotoon", + "trial.feature_save": "Tallenna ja luo uusia tiedostoja", + "trial.one_time_purchase": "Kertamaksu. Ei tilausta.", + "trial.purchase_button": "Osta Kern", + "trial.purchase_desc": "Hanki täydet käyttöoikeudet kaikkiin muokkaus- ja vientiominaisuuksiin kertamaksulla.", + "trial.purchase_title": "Avaa Kern", + "trial.purchasing": "Ostetaan...", + "trial.restore_purchases": "Palauta ostot", + "trial.restoring": "Palautetaan...", + "viewer.copied": "Kopioitu!", + "viewer.copy": "Kopioi", + "welcome.drop_hint": "tai vedä ja pudota .md-tiedosto", + "welcome.new_button": "Uusi tiedosto", + "welcome.open_button": "Avaa tiedosto", + "welcome.subtitle": "Kaunis Markdown-katselin", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fr/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/fr/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fr/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/fr/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/fr/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fr/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/fr/strings.json b/src-mdviewer/src/md-nls-autogenerated/fr/strings.json new file mode 100644 index 0000000000..0cd6d46d34 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/fr/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Fermer la recherche", + "a11y.edit_link": "Modifier le lien", + "a11y.format_text": "Mettre en forme le texte", + "a11y.insert_block": "Insérer un bloc", + "a11y.main_toolbar": "Barre d'outils principale", + "a11y.next_match": "Correspondance suivante", + "a11y.previous_match": "Correspondance précédente", + "a11y.search_in_document": "Rechercher dans le document", + "a11y.search_text": "Rechercher du texte", + "a11y.select_language": "Sélectionner un langage", + "a11y.sidebar": "Barre latérale", + "a11y.skip_to_content": "Aller au contenu", + "common.close": "Fermer", + "common.file": "Fichier", + "common.open": "Ouvrir", + "context.copy": "Copier", + "context.copy_image_address": "Copier l'adresse de l'image", + "context.copy_link": "Copier le lien", + "context.cut": "Couper", + "context.open_link": "Ouvrir le lien", + "context.paste": "Coller", + "context.paste_plain": "Coller en texte brut", + "context.select_all": "Tout sélectionner", + "dialog.cancel": "Annuler", + "dialog.discard": "Abandonner", + "dialog.dont_save": "Ne pas enregistrer", + "dialog.save": "Enregistrer", + "dialog.unsaved_close": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de fermer ?", + "dialog.unsaved_exit_edit": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de quitter le mode édition ?", + "dialog.unsaved_new_file": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de créer un nouveau fichier ?", + "dialog.unsaved_open_file": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant d'ouvrir un nouveau fichier ?", + "dialog.unsaved_title": "Modifications non enregistrées", + "drop_zone.text": "Déposez votre fichier Markdown ici", + "export.open": "Ouvrir", + "export.success": "PDF exporté avec succès", + "format.blockquote": "Citation", + "format.bold": "Gras ({mod}+B)", + "format.bullet_list": "Liste à puces", + "format.code": "Code en ligne ({mod}+E)", + "format.code_block": "Bloc de code", + "format.divider": "Séparateur", + "format.heading1": "Titre 1", + "format.heading2": "Titre 2", + "format.heading3": "Titre 3", + "format.italic": "Italique ({mod}+I)", + "format.link": "Lien ({mod}+K)", + "format.numbered_list": "Liste numérotée", + "format.paragraph": "Paragraphe", + "format.strikethrough": "Barré ({mod}+Maj+X)", + "format.table": "Tableau", + "format.task_list": "Liste de tâches", + "help.editing": "Édition", + "help.fallback_notice": "Cette page n'est pas encore disponible dans votre langue. La version anglaise est affichée.", + "help.features": "Fonctionnalités", + "help.getting_started": "Premiers pas", + "help.shortcuts": "Raccourcis clavier", + "lang_picker.filter_label": "Filtrer les langages", + "lang_picker.filter_placeholder": "Filtrer les langages...", + "lang_picker.plain_text": "Texte brut", + "link.apply": "Appliquer le lien", + "link.cancel": "Annuler", + "link.display_text": "Texte à afficher", + "link.edit": "Modifier", + "link.edit_link": "Modifier le lien", + "link.remove_link": "Supprimer le lien", + "link.text": "Texte", + "link.text_placeholder": "Texte à afficher (facultatif)", + "link.url": "URL", + "link.url_placeholder": "Collez ou saisissez une URL...", + "recovery.discard": "Abandonner", + "recovery.message": "Kern a trouvé des modifications non enregistrées d'une session précédente. Voulez-vous les restaurer ?", + "recovery.restore": "Restaurer", + "recovery.title": "Récupérer les modifications non enregistrées ?", + "search.count": "correspondances", + "search.no_results": "Aucun résultat", + "search.placeholder": "Rechercher dans le document...", + "settings.language": "Langue", + "settings.theme": "Thème", + "settings.theme_dark": "Sombre", + "settings.theme_light": "Clair", + "settings.theme_system": "Système", + "sidebar.no_headings": "Aucun titre trouvé", + "sidebar.recent": "Fichiers récents", + "sidebar.toc": "Table des matières", + "slash.blockquote": "Citation", + "slash.blockquote_desc": "Bloc de citation", + "slash.bullet_list": "Liste à puces", + "slash.bullet_list_desc": "Liste non ordonnée", + "slash.code_block": "Bloc de code", + "slash.code_block_desc": "Code délimité", + "slash.divider": "Séparateur", + "slash.divider_desc": "Ligne horizontale", + "slash.heading1": "Titre 1", + "slash.heading1_desc": "Grand titre", + "slash.heading2": "Titre 2", + "slash.heading2_desc": "Titre moyen", + "slash.heading3": "Titre 3", + "slash.heading3_desc": "Petit titre", + "slash.no_results": "Aucun résultat", + "slash.numbered_list": "Liste numérotée", + "slash.numbered_list_desc": "Liste ordonnée", + "slash.paragraph": "Paragraphe", + "slash.paragraph_desc": "Texte brut", + "slash.table": "Tableau", + "slash.table_desc": "Tableau 3×3", + "slash.task_list": "Liste de tâches", + "slash.task_list_desc": "Liste à cocher", + "table.add_col_left": "Ajouter une colonne à gauche", + "table.add_col_right": "Ajouter une colonne à droite", + "table.add_row_above": "Ajouter une ligne au-dessus", + "table.add_row_below": "Ajouter une ligne en dessous", + "table.col_options": "Options de la colonne {n}", + "table.delete_col": "Supprimer la colonne", + "table.delete_row": "Supprimer la ligne", + "table.header": "En-tête", + "table.insert_col_left": "Insérer une colonne à gauche", + "table.insert_col_right": "Insérer une colonne à droite", + "table.insert_row_above": "Insérer une ligne au-dessus", + "table.insert_row_below": "Insérer une ligne en dessous", + "table.new_row": "+ Nouvelle ligne", + "table.row_options": "Options de la ligne {n}", + "toolbar.edit": "Modifier", + "toolbar.export_pdf": "Exporter en PDF", + "toolbar.focus": "Mode concentration", + "toolbar.more": "Plus", + "toolbar.new_file": "Nouveau fichier", + "toolbar.open": "Ouvrir un fichier", + "toolbar.save": "Enregistrer", + "toolbar.search": "Rechercher", + "toolbar.settings": "Paramètres", + "toolbar.split_view": "Vue fractionnée", + "toolbar.theme": "Changer le thème", + "toolbar.toc": "Table des matières", + "toolbar.zoom_in": "Zoom avant", + "toolbar.zoom_out": "Zoom arrière", + "toolbar.zoom_reset": "Réinitialiser le zoom", + "trial.days_remaining": "{days} jours restants d'essai", + "trial.expired_message": "Votre période d'essai a expiré. Achetez Kern pour continuer à éditer.", + "trial.feature_edit": "Éditez du Markdown avec WYSIWYG et vue fractionnée", + "trial.feature_export": "Exporter en PDF", + "trial.feature_save": "Enregistrez et créez de nouveaux fichiers", + "trial.one_time_purchase": "Achat unique. Sans abonnement.", + "trial.purchase_button": "Acheter Kern", + "trial.purchase_desc": "Obtenez un accès complet à toutes les fonctionnalités d'édition et d'exportation avec un achat unique.", + "trial.purchase_title": "Débloquer Kern", + "trial.purchasing": "Achat en cours...", + "trial.restore_purchases": "Restaurer les achats", + "trial.restoring": "Restauration...", + "viewer.copied": "Copié !", + "viewer.copy": "Copier", + "welcome.drop_hint": "ou glissez-déposez un fichier .md", + "welcome.new_button": "Nouveau fichier", + "welcome.open_button": "Ouvrir un fichier", + "welcome.subtitle": "Un beau visualiseur Markdown", + "welcome.title": "Kern", + "format.block_type": "Type de bloc", + "format.lists": "Listes", + "format.more_elements": "Plus", + "format.text_formatting": "Mise en forme du texte", + "format.underline": "Souligné", + "mermaid.done": "Terminé", + "mermaid.edit": "Modifier", + "mermaid.error_prefix": "Erreur de syntaxe", + "mermaid.stale": "Aperçu non à jour", + "slash.mermaid": "Diagramme Mermaid", + "slash.mermaid_desc": "Insérer un diagramme", + "toolbar.done": "Terminé" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/gl/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/gl/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/gl/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/gl/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/gl/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/gl/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/gl/strings.json b/src-mdviewer/src/md-nls-autogenerated/gl/strings.json new file mode 100644 index 0000000000..41175fa836 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/gl/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Pechar busca", + "a11y.edit_link": "Editar ligazón", + "a11y.format_text": "Formatar texto", + "a11y.insert_block": "Inserir bloque", + "a11y.main_toolbar": "Barra de ferramentas principal", + "a11y.next_match": "Seguinte coincidencia", + "a11y.previous_match": "Coincidencia anterior", + "a11y.search_in_document": "Buscar no documento", + "a11y.search_text": "Buscar texto", + "a11y.select_language": "Seleccionar idioma", + "a11y.sidebar": "Barra lateral", + "a11y.skip_to_content": "Saltar ao contido", + "common.close": "Pechar", + "common.file": "Ficheiro", + "common.open": "Abrir", + "context.copy": "Copiar", + "context.copy_image_address": "Copiar o enderezo da imaxe", + "context.copy_link": "Copiar a ligazón", + "context.cut": "Cortar", + "context.open_link": "Abrir a ligazón", + "context.paste": "Pegar", + "context.paste_plain": "Pegar como texto simple", + "context.select_all": "Seleccionar todo", + "dialog.cancel": "Cancelar", + "dialog.discard": "Descartar", + "dialog.dont_save": "Non gardar", + "dialog.save": "Gardar", + "dialog.unsaved_close": "Ten cambios sen gardar. Desexa gardar antes de pechar?", + "dialog.unsaved_exit_edit": "Ten cambios sen gardar. Desexa gardar antes de saír do modo de edición?", + "dialog.unsaved_new_file": "Ten cambios sen gardar. Desexa gardar antes de crear un novo ficheiro?", + "dialog.unsaved_open_file": "Ten cambios sen gardar. Quere gardar antes de abrir un novo ficheiro?", + "dialog.unsaved_title": "Cambios sen gardar", + "drop_zone.text": "Solte aquí o seu ficheiro Markdown", + "export.open": "Abrir", + "export.success": "PDF exportado con éxito", + "format.block_type": "Tipo de bloque", + "format.blockquote": "Cita en bloque", + "format.bold": "Negra ({mod}+B)", + "format.bullet_list": "Lista de viñetas", + "format.code": "Código en liña ({mod}+E)", + "format.code_block": "Bloque de código", + "format.divider": "Divisor", + "format.heading1": "Encabezado 1", + "format.heading2": "Encabezado 2", + "format.heading3": "Encabezado 3", + "format.italic": "Cursiva ({mod}+I)", + "format.link": "Ligazón ({mod}+K)", + "format.lists": "Listas", + "format.more_elements": "Máis", + "format.numbered_list": "Lista numerada", + "format.paragraph": "Parágrafo", + "format.strikethrough": "Riscado ({mod}+Maiús+X)", + "format.table": "Táboa", + "format.task_list": "Lista de tarefas", + "format.text_formatting": "Formato do texto", + "format.underline": "Subliñado", + "help.editing": "Edición", + "help.fallback_notice": "Esta páxina aínda non está dispoñible no seu idioma. Amosando a versión en inglés.", + "help.features": "Funcionalidades", + "help.getting_started": "Primeiros pasos", + "help.shortcuts": "Atallos de teclado", + "lang_picker.filter_label": "Filtrar linguas", + "lang_picker.filter_placeholder": "Filtrar linguas...", + "lang_picker.plain_text": "Texto plano", + "link.apply": "Aplicar", + "link.cancel": "Cancelar", + "link.display_text": "Texto a amosar", + "link.edit": "Editar", + "link.edit_link": "Editar ligazón", + "link.remove_link": "Eliminar ligazón", + "link.text": "Texto", + "link.text_placeholder": "Texto para mostrar (opcional)", + "link.url": "URL", + "link.url_placeholder": "Pegue ou escriba un URL...", + "mermaid.done": "Feito", + "mermaid.edit": "Editar", + "mermaid.error_prefix": "Erro de sintaxe", + "mermaid.stale": "Previsualización desactualizada", + "recovery.discard": "Descartar", + "recovery.message": "Kern atopou cambios sen gardar dunha sesión anterior. Quere restauralos?", + "recovery.restore": "Restaurar", + "recovery.title": "Recuperar os cambios non gardados?", + "search.count": "coincidencias", + "search.no_results": "Sen resultados", + "search.placeholder": "Buscar no documento...", + "settings.language": "Idioma", + "settings.theme": "Tema", + "settings.theme_dark": "Escuro", + "settings.theme_light": "Claro", + "settings.theme_system": "Sistema", + "sidebar.no_headings": "Non se atoparon cabeceiras", + "sidebar.recent": "Ficheiros recentes", + "sidebar.toc": "Índice de contidos", + "slash.blockquote": "Cita en bloque", + "slash.blockquote_desc": "Bloque de cita", + "slash.bullet_list": "Lista de viñetas", + "slash.bullet_list_desc": "Lista non ordenada", + "slash.code_block": "Bloque de código", + "slash.code_block_desc": "Código delimitado", + "slash.divider": "Divisor", + "slash.divider_desc": "Regra horizontal", + "slash.heading1": "Título 1", + "slash.heading1_desc": "Título grande", + "slash.heading2": "Título 2", + "slash.heading2_desc": "Título mediano", + "slash.heading3": "Título 3", + "slash.heading3_desc": "Título pequeno", + "slash.mermaid": "Diagrama Mermaid", + "slash.mermaid_desc": "Inserir un diagrama", + "slash.no_results": "Sen resultados", + "slash.numbered_list": "Lista numerada", + "slash.numbered_list_desc": "Lista ordenada", + "slash.paragraph": "Parágrafo", + "slash.paragraph_desc": "Texto simple", + "slash.table": "Táboa", + "slash.table_desc": "Táboa de 3×3", + "slash.task_list": "Lista de tarefas", + "slash.task_list_desc": "Lista de verificación", + "table.add_col_left": "Engadir columna á esquerda", + "table.add_col_right": "Engadir columna á dereita", + "table.add_row_above": "Engadir fila enriba", + "table.add_row_below": "Engadir fila debaixo", + "table.col_options": "Opcións da columna {n}", + "table.delete_col": "Eliminar columna", + "table.delete_row": "Eliminar fila", + "table.header": "Cabeceira", + "table.insert_col_left": "Inserir columna á esquerda", + "table.insert_col_right": "Inserir columna á dereita", + "table.insert_row_above": "Inserir fila enriba", + "table.insert_row_below": "Inserir fila debaixo", + "table.new_row": "+ Nova fila", + "table.row_options": "Opcións da fila {n}", + "toolbar.done": "Feito", + "toolbar.edit": "Editar", + "toolbar.export_pdf": "Exportar a PDF", + "toolbar.focus": "Modo de concentración", + "toolbar.more": "Máis", + "toolbar.new_file": "Novo ficheiro", + "toolbar.open": "Abrir ficheiro", + "toolbar.save": "Gardar", + "toolbar.search": "Buscar", + "toolbar.settings": "Configuración", + "toolbar.split_view": "Vista dividida", + "toolbar.theme": "Alternar tema", + "toolbar.toc": "Índice de contidos", + "toolbar.zoom_in": "Achegar", + "toolbar.zoom_out": "Afastar", + "toolbar.zoom_reset": "Restablecer o zoom", + "trial.days_remaining": "Quedan {days} días de proba", + "trial.expired_message": "O seu período de proba caducou. Compre Kern para continuar editando.", + "trial.feature_edit": "Editar Markdown con WYSIWYG e vista dividida", + "trial.feature_export": "Exportar a PDF", + "trial.feature_save": "Gardar e crear ficheiros novos", + "trial.one_time_purchase": "Compra única. Sen subscrición.", + "trial.purchase_button": "Comprar Kern", + "trial.purchase_desc": "Obtén acceso completo a todas as funcións de edición e exportación cunha compra única.", + "trial.purchase_title": "Desbloquear Kern", + "trial.purchasing": "Comprando...", + "trial.restore_purchases": "Restaurar compras", + "trial.restoring": "Restaurando...", + "viewer.copied": "Copiado!", + "viewer.copy": "Copiar", + "welcome.drop_hint": "ou arrastra e solta un ficheiro .md", + "welcome.new_button": "Novo ficheiro", + "welcome.open_button": "Abrir ficheiro", + "welcome.subtitle": "Un fermoso visor de Markdown", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hi/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/hi/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hi/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/hi/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/hi/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hi/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hi/strings.json b/src-mdviewer/src/md-nls-autogenerated/hi/strings.json new file mode 100644 index 0000000000..a3d2c0be99 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hi/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "खोज बंद करें", + "a11y.edit_link": "लिंक संपादित करें", + "a11y.format_text": "टेक्स्ट फ़ॉर्मेट करें", + "a11y.insert_block": "ब्लॉक डालें", + "a11y.main_toolbar": "मुख्य टूलबार", + "a11y.next_match": "अगला परिणाम", + "a11y.previous_match": "पिछला परिणाम", + "a11y.search_in_document": "दस्तावेज़ में खोजें", + "a11y.search_text": "टेक्स्ट खोजें", + "a11y.select_language": "भाषा चुनें", + "a11y.sidebar": "साइडबार", + "a11y.skip_to_content": "सामग्री पर जाएँ", + "common.close": "बंद करें", + "common.file": "फ़ाइल", + "common.open": "खोलें", + "context.copy": "कॉपी करें", + "context.copy_image_address": "छवि पता कॉपी करें", + "context.copy_link": "लिंक कॉपी करें", + "context.cut": "काटें", + "context.open_link": "लिंक खोलें", + "context.paste": "चिपकाएँ", + "context.paste_plain": "सादे पाठ के रूप में चिपकाएँ", + "context.select_all": "सभी चुनें", + "dialog.cancel": "रद्द करें", + "dialog.discard": "छोड़ें", + "dialog.dont_save": "सहेजें नहीं", + "dialog.save": "सहेजें", + "dialog.unsaved_close": "आपके पास सहेजे नहीं गए परिवर्तन हैं। बंद करने से पहले सहेजना चाहते हैं?", + "dialog.unsaved_exit_edit": "आपके असहेजे परिवर्तन हैं। क्या आप संपादन मोड से बाहर निकलने से पहले सहेजना चाहते हैं?", + "dialog.unsaved_new_file": "आपके असहेजे परिवर्तन हैं। क्या आप नई फ़ाइल बनाने से पहले सहेजना चाहते हैं?", + "dialog.unsaved_open_file": "आपके असहेजे परिवर्तन हैं। क्या आप नई फ़ाइल खोलने से पहले सहेजना चाहते हैं?", + "dialog.unsaved_title": "असहेजे परिवर्तन", + "drop_zone.text": "अपनी मार्कडाउन फ़ाइल यहाँ छोड़ें", + "export.open": "खोलें", + "export.success": "PDF सफलतापूर्वक निर्यात किया गया", + "format.blockquote": "उद्धरण", + "format.bold": "बोल्ड ({mod}+B)", + "format.bullet_list": "बुलेट सूची", + "format.code": "इनलाइन कोड ({mod}+E)", + "format.code_block": "कोड ब्लॉक", + "format.divider": "विभाजक", + "format.heading1": "शीर्षक 1", + "format.heading2": "शीर्षक 2", + "format.heading3": "शीर्षक 3", + "format.italic": "इटैलिक ({mod}+I)", + "format.link": "लिंक ({mod}+K)", + "format.numbered_list": "क्रमांकित सूची", + "format.paragraph": "अनुच्छेद", + "format.strikethrough": "स्ट्राइकथ्रू ({mod}+Shift+X)", + "format.table": "तालिका", + "format.task_list": "कार्य सूची", + "help.editing": "संपादन", + "help.fallback_notice": "यह पृष्ठ अभी आपकी भाषा में उपलब्ध नहीं है। अंग्रेज़ी संस्करण दिखाया जा रहा है।", + "help.features": "विशेषताएँ", + "help.getting_started": "शुरू करें", + "help.shortcuts": "कीबोर्ड शॉर्टकट", + "lang_picker.filter_label": "भाषाएँ फ़िल्टर करें", + "lang_picker.filter_placeholder": "भाषाएँ फ़िल्टर करें...", + "lang_picker.plain_text": "सादा टेक्स्ट", + "link.apply": "लिंक लागू करें", + "link.cancel": "रद्द करें", + "link.display_text": "प्रदर्शन टेक्स्ट", + "link.edit": "संपादित करें", + "link.edit_link": "लिंक संपादित करें", + "link.remove_link": "लिंक हटाएँ", + "link.text": "टेक्स्ट", + "link.text_placeholder": "प्रदर्शन टेक्स्ट (वैकल्पिक)", + "link.url": "URL", + "link.url_placeholder": "URL चिपकाएँ या टाइप करें...", + "recovery.discard": "छोड़ें", + "recovery.message": "Kern को पिछले सत्र से सहेजे नहीं गए परिवर्तन मिले। क्या आप उन्हें पुनर्स्थापित करना चाहते हैं?", + "recovery.restore": "पुनर्स्थापित करें", + "recovery.title": "सहेजे नहीं गए परिवर्तन पुनर्प्राप्त करें?", + "search.count": "परिणाम", + "search.no_results": "कोई परिणाम नहीं", + "search.placeholder": "दस्तावेज़ में खोजें...", + "settings.language": "भाषा", + "settings.theme": "थीम", + "settings.theme_dark": "डार्क", + "settings.theme_light": "लाइट", + "settings.theme_system": "सिस्टम", + "sidebar.no_headings": "कोई शीर्षक नहीं मिला", + "sidebar.recent": "हाल की फ़ाइलें", + "sidebar.toc": "विषय सूची", + "slash.blockquote": "उद्धरण", + "slash.blockquote_desc": "उद्धरण ब्लॉक", + "slash.bullet_list": "बुलेट सूची", + "slash.bullet_list_desc": "अक्रमित सूची", + "slash.code_block": "कोड ब्लॉक", + "slash.code_block_desc": "फ़ेंस्ड कोड", + "slash.divider": "विभाजक", + "slash.divider_desc": "क्षैतिज रेखा", + "slash.heading1": "शीर्षक 1", + "slash.heading1_desc": "बड़ा शीर्षक", + "slash.heading2": "शीर्षक 2", + "slash.heading2_desc": "मध्यम शीर्षक", + "slash.heading3": "शीर्षक 3", + "slash.heading3_desc": "छोटा शीर्षक", + "slash.no_results": "कोई परिणाम नहीं", + "slash.numbered_list": "क्रमांकित सूची", + "slash.numbered_list_desc": "क्रमित सूची", + "slash.paragraph": "अनुच्छेद", + "slash.paragraph_desc": "सामान्य पाठ", + "slash.table": "तालिका", + "slash.table_desc": "3×3 तालिका", + "slash.task_list": "कार्य सूची", + "slash.task_list_desc": "चेकलिस्ट", + "table.add_col_left": "बाईं ओर स्तंभ जोड़ें", + "table.add_col_right": "दाईं ओर स्तंभ जोड़ें", + "table.add_row_above": "ऊपर पंक्ति जोड़ें", + "table.add_row_below": "नीचे पंक्ति जोड़ें", + "table.col_options": "स्तंभ {n} विकल्प", + "table.delete_col": "स्तंभ हटाएँ", + "table.delete_row": "पंक्ति हटाएँ", + "table.header": "शीर्षलेख", + "table.insert_col_left": "बाईं ओर स्तंभ जोड़ें", + "table.insert_col_right": "दाईं ओर स्तंभ जोड़ें", + "table.insert_row_above": "ऊपर पंक्ति जोड़ें", + "table.insert_row_below": "नीचे पंक्ति जोड़ें", + "table.new_row": "+ नई पंक्ति", + "table.row_options": "पंक्ति {n} विकल्प", + "toolbar.edit": "संपादित करें", + "toolbar.export_pdf": "PDF निर्यात करें", + "toolbar.focus": "फ़ोकस मोड", + "toolbar.more": "अधिक", + "toolbar.new_file": "नई फ़ाइल", + "toolbar.open": "फ़ाइल खोलें", + "toolbar.save": "सहेजें", + "toolbar.search": "खोजें", + "toolbar.settings": "सेटिंग्स", + "toolbar.split_view": "विभाजित दृश्य", + "toolbar.theme": "थीम बदलें", + "toolbar.toc": "विषय सूची", + "toolbar.zoom_in": "ज़ूम इन", + "toolbar.zoom_out": "ज़ूम आउट", + "toolbar.zoom_reset": "ज़ूम रीसेट", + "trial.days_remaining": "ट्रायल में {days} दिन शेष", + "trial.expired_message": "आपका ट्रायल समाप्त हो गया है। संपादन जारी रखने के लिए Kern खरीदें।", + "trial.feature_edit": "WYSIWYG और विभाजित दृश्य के साथ Markdown संपादित करें", + "trial.feature_export": "PDF में निर्यात करें", + "trial.feature_save": "फ़ाइलें सहेजें और नई बनाएँ", + "trial.one_time_purchase": "एक बार की खरीदारी। कोई सदस्यता नहीं।", + "trial.purchase_button": "Kern खरीदें", + "trial.purchase_desc": "एक बार की खरीदारी के साथ सभी संपादन और निर्यात सुविधाओं तक पूर्ण पहुँच प्राप्त करें।", + "trial.purchase_title": "Kern अनलॉक करें", + "trial.purchasing": "खरीदारी हो रही है...", + "trial.restore_purchases": "खरीदारी पुनर्स्थापित करें", + "trial.restoring": "पुनर्स्थापित हो रहा है...", + "viewer.copied": "कॉपी हो गया!", + "viewer.copy": "कॉपी करें", + "welcome.drop_hint": "या .md फ़ाइल खींचकर छोड़ें", + "welcome.new_button": "नई फ़ाइल", + "welcome.open_button": "फ़ाइल खोलें", + "welcome.subtitle": "एक सुंदर मार्कडाउन व्यूअर", + "welcome.title": "Kern", + "format.block_type": "ब्लॉक प्रकार", + "format.lists": "सूचियाँ", + "format.more_elements": "अधिक", + "format.text_formatting": "टेक्स्ट फ़ॉर्मेटिंग", + "format.underline": "रेखांकित", + "mermaid.done": "हो गया", + "mermaid.edit": "संपादित करें", + "mermaid.error_prefix": "सिंटैक्स त्रुटि", + "mermaid.stale": "प्रीव्यू पुराना है", + "slash.mermaid": "Mermaid आरेख", + "slash.mermaid_desc": "एक आरेख डालें", + "toolbar.done": "हो गया" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hr/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/hr/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hr/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/hr/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/hr/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hr/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hr/strings.json b/src-mdviewer/src/md-nls-autogenerated/hr/strings.json new file mode 100644 index 0000000000..fbce7d630a --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hr/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Zatvori pretraživanje", + "a11y.edit_link": "Uredi poveznicu", + "a11y.format_text": "Oblikuj tekst", + "a11y.insert_block": "Umetni blok", + "a11y.main_toolbar": "Glavna alatna traka", + "a11y.next_match": "Sljedeće podudaranje", + "a11y.previous_match": "Prethodno podudaranje", + "a11y.search_in_document": "Pretraži u dokumentu", + "a11y.search_text": "Pretraži tekst", + "a11y.select_language": "Odaberi jezik", + "a11y.sidebar": "Bočna traka", + "a11y.skip_to_content": "Preskoči na sadržaj", + "common.close": "Zatvori", + "common.file": "Datoteka", + "common.open": "Otvori", + "context.copy": "Kopiraj", + "context.copy_image_address": "Kopiraj adresu slike", + "context.copy_link": "Kopiraj poveznicu", + "context.cut": "Izreži", + "context.open_link": "Otvori poveznicu", + "context.paste": "Zalijepi", + "context.paste_plain": "Zalijepi kao običan tekst", + "context.select_all": "Odaberi sve", + "dialog.cancel": "Odustani", + "dialog.discard": "Odbaci", + "dialog.dont_save": "Ne spremaj", + "dialog.save": "Spremi", + "dialog.unsaved_close": "Imate nespremljene promjene. Želite li spremiti prije zatvaranja?", + "dialog.unsaved_exit_edit": "Imate nespremljene promjene. Želite li spremiti prije izlaska iz načina uređivanja?", + "dialog.unsaved_new_file": "Imate nespremljene promjene. Želite li spremiti prije stvaranja nove datoteke?", + "dialog.unsaved_open_file": "Imate nespremljene promjene. Želite li spremiti prije otvaranja nove datoteke?", + "dialog.unsaved_title": "Nespremljene promjene", + "drop_zone.text": "Ovdje ispustite svoju Markdown datoteku", + "export.open": "Otvori", + "export.success": "PDF je uspješno izvezen", + "format.block_type": "Vrsta bloka", + "format.blockquote": "Blok citat", + "format.bold": "Podebljano ({mod}+B)", + "format.bullet_list": "Popis s točkama", + "format.code": "Umetnuti kôd ({mod}+E)", + "format.code_block": "Blok koda", + "format.divider": "Razdjelnik", + "format.heading1": "Naslov 1", + "format.heading2": "Naslov 2", + "format.heading3": "Naslov 3", + "format.italic": "Kurziv ({mod}+I)", + "format.link": "Poveznica ({mod}+K)", + "format.lists": "Popisi", + "format.more_elements": "Više", + "format.numbered_list": "Numerirani popis", + "format.paragraph": "Odlomak", + "format.strikethrough": "Precrtano ({mod}+Shift+X)", + "format.table": "Tablica", + "format.task_list": "Popis zadataka", + "format.text_formatting": "Oblikovanje teksta", + "format.underline": "Podcrtano", + "help.editing": "Uređivanje", + "help.fallback_notice": "Ova stranica još nije dostupna na vašem jeziku. Prikazuje se engleska verzija.", + "help.features": "Značajke", + "help.getting_started": "Početak rada", + "help.shortcuts": "Tipkovnički prečaci", + "lang_picker.filter_label": "Filtriraj jezike", + "lang_picker.filter_placeholder": "Filtriraj jezike...", + "lang_picker.plain_text": "Običan tekst", + "link.apply": "Primijeni poveznicu", + "link.cancel": "Odustani", + "link.display_text": "Tekst za prikaz", + "link.edit": "Uredi", + "link.edit_link": "Uredi poveznicu", + "link.remove_link": "Ukloni poveznicu", + "link.text": "Tekst", + "link.text_placeholder": "Tekst za prikaz (neobavezno)", + "link.url": "URL", + "link.url_placeholder": "Zalijepite ili upišite URL...", + "mermaid.done": "Gotovo", + "mermaid.edit": "Uredi", + "mermaid.error_prefix": "Sintaktička pogreška", + "mermaid.stale": "Pregled je zastario", + "recovery.discard": "Odbaci", + "recovery.message": "Kern je pronašao nespremljene promjene iz prethodne sesije. Želite li ih vratiti?", + "recovery.restore": "Obnovi", + "recovery.title": "Oporaviti nespremljene promjene?", + "search.count": "podudaranja", + "search.no_results": "Nema rezultata", + "search.placeholder": "Pretraži dokument...", + "settings.language": "Jezik", + "settings.theme": "Tema", + "settings.theme_dark": "Tamna", + "settings.theme_light": "Svijetla", + "settings.theme_system": "Sistemska", + "sidebar.no_headings": "Nema naslova", + "sidebar.recent": "Nedavne datoteke", + "sidebar.toc": "Sadržaj", + "slash.blockquote": "Blok citat", + "slash.blockquote_desc": "Citatni blok", + "slash.bullet_list": "Popis s grafičkim oznakama", + "slash.bullet_list_desc": "Nerazvrstani popis", + "slash.code_block": "Blok koda", + "slash.code_block_desc": "Ograđeni kod", + "slash.divider": "Razdjelnik", + "slash.divider_desc": "Vodoravna crta", + "slash.heading1": "Naslov 1", + "slash.heading1_desc": "Veliki naslov", + "slash.heading2": "Naslov 2", + "slash.heading2_desc": "Srednji naslov", + "slash.heading3": "Naslov 3", + "slash.heading3_desc": "Mali naslov", + "slash.mermaid": "Mermaid dijagram", + "slash.mermaid_desc": "Umetni dijagram", + "slash.no_results": "Nema rezultata", + "slash.numbered_list": "Numerirani popis", + "slash.numbered_list_desc": "Uređeni popis", + "slash.paragraph": "Odlomak", + "slash.paragraph_desc": "Običan tekst", + "slash.table": "Tablica", + "slash.table_desc": "Tablica 3×3", + "slash.task_list": "Popis zadataka", + "slash.task_list_desc": "Kontrolna lista", + "table.add_col_left": "Dodaj stupac lijevo", + "table.add_col_right": "Dodaj stupac desno", + "table.add_row_above": "Dodaj redak iznad", + "table.add_row_below": "Dodaj redak ispod", + "table.col_options": "Opcije stupca {n}", + "table.delete_col": "Izbriši stupac", + "table.delete_row": "Izbriši redak", + "table.header": "Zaglavlje", + "table.insert_col_left": "Umetni stupac lijevo", + "table.insert_col_right": "Umetni stupac desno", + "table.insert_row_above": "Umetni redak iznad", + "table.insert_row_below": "Umetni redak ispod", + "table.new_row": "+ Novi redak", + "table.row_options": "Opcije retka {n}", + "toolbar.done": "Gotovo", + "toolbar.edit": "Uredi", + "toolbar.export_pdf": "Izvezi PDF", + "toolbar.focus": "Fokusirani način rada", + "toolbar.more": "Više", + "toolbar.new_file": "Nova datoteka", + "toolbar.open": "Otvori datoteku", + "toolbar.save": "Spremi", + "toolbar.search": "Pretraži", + "toolbar.settings": "Postavke", + "toolbar.split_view": "Podijeljeni prikaz", + "toolbar.theme": "Promijeni temu", + "toolbar.toc": "Sadržaj", + "toolbar.zoom_in": "Povećaj", + "toolbar.zoom_out": "Smanji", + "toolbar.zoom_reset": "Poništi zumiranje", + "trial.days_remaining": "Preostalo {days} dana u probnom razdoblju", + "trial.expired_message": "Vaše probno razdoblje je isteklo. Kupite Kern kako biste nastavili s uređivanjem.", + "trial.feature_edit": "Uređivanje Markdowna s WYSIWYG-om i podijeljenim prikazom", + "trial.feature_export": "Izvoz u PDF", + "trial.feature_save": "Spremanje i stvaranje novih datoteka", + "trial.one_time_purchase": "Jednokratna kupnja. Bez pretplate.", + "trial.purchase_button": "Kupite Kern", + "trial.purchase_desc": "Ostvarite puni pristup svim značajkama za uređivanje i izvoz jednokratnom kupnjom.", + "trial.purchase_title": "Otključajte Kern", + "trial.purchasing": "Kupnja u tijeku...", + "trial.restore_purchases": "Vratite kupnje", + "trial.restoring": "Vraćanje u tijeku...", + "viewer.copied": "Kopirano!", + "viewer.copy": "Kopiraj", + "welcome.drop_hint": "ili povucite i ispustite .md datoteku", + "welcome.new_button": "Nova datoteka", + "welcome.open_button": "Otvori datoteku", + "welcome.subtitle": "Prekrasan Markdown preglednik", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hu/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/hu/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hu/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/hu/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/hu/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hu/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/hu/strings.json b/src-mdviewer/src/md-nls-autogenerated/hu/strings.json new file mode 100644 index 0000000000..0875b616f6 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/hu/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Keresés bezárása", + "a11y.edit_link": "Link szerkesztése", + "a11y.format_text": "Szöveg formázása", + "a11y.insert_block": "Blokk beillesztése", + "a11y.main_toolbar": "Fő eszköztár", + "a11y.next_match": "Következő találat", + "a11y.previous_match": "Előző találat", + "a11y.search_in_document": "Keresés a dokumentumban", + "a11y.search_text": "Szöveg keresése", + "a11y.select_language": "Nyelv kiválasztása", + "a11y.sidebar": "Oldalsáv", + "a11y.skip_to_content": "Ugrás a tartalomra", + "common.close": "Bezárás", + "common.file": "Fájl", + "common.open": "Megnyitás", + "context.copy": "Másolás", + "context.copy_image_address": "Kép címének másolása", + "context.copy_link": "Hivatkozás másolása", + "context.cut": "Kivágás", + "context.open_link": "Hivatkozás megnyitása", + "context.paste": "Beillesztés", + "context.paste_plain": "Beillesztés egyszerű szövegként", + "context.select_all": "Összes kijelölése", + "dialog.cancel": "Mégse", + "dialog.discard": "Elvetés", + "dialog.dont_save": "Ne mentse", + "dialog.save": "Mentés", + "dialog.unsaved_close": "Nem mentett módosításai vannak. Szeretné menteni a bezárás előtt?", + "dialog.unsaved_exit_edit": "Nem mentett módosításai vannak. Szeretné menteni a szerkesztőmódból való kilépés előtt?", + "dialog.unsaved_new_file": "Nem mentett módosításai vannak. Szeretné menteni egy új fájl létrehozása előtt?", + "dialog.unsaved_open_file": "Mentetlen változtatásai vannak. Szeretné menteni a módosításokat, mielőtt új fájlt nyitna meg?", + "dialog.unsaved_title": "Mentetlen változtatások", + "drop_zone.text": "Húzza ide a Markdown fájlt", + "export.open": "Megnyitás", + "export.success": "A PDF exportálása sikeres.", + "format.block_type": "Blokk típusa", + "format.blockquote": "Idézetblokk", + "format.bold": "Félkövér ({mod}+B)", + "format.bullet_list": "Felsorolás", + "format.code": "Soron belüli kód ({mod}+E)", + "format.code_block": "Kódblokk", + "format.divider": "Elválasztó", + "format.heading1": "Címsor 1", + "format.heading2": "Címsor 2", + "format.heading3": "Címsor 3", + "format.italic": "Dőlt ({mod}+I)", + "format.link": "Hivatkozás ({mod}+K)", + "format.lists": "Listák", + "format.more_elements": "Továbbiak", + "format.numbered_list": "Számozott lista", + "format.paragraph": "Bekezdés", + "format.strikethrough": "Áthúzott ({mod}+Shift+X)", + "format.table": "Táblázat", + "format.task_list": "Feladatlista", + "format.text_formatting": "Szövegformázás", + "format.underline": "Aláhúzott", + "help.editing": "Szerkesztés", + "help.fallback_notice": "Ez az oldal még nem érhető el az Ön nyelvén. Az angol nyelvű változatot jelenítjük meg.", + "help.features": "Funkciók", + "help.getting_started": "Első lépések", + "help.shortcuts": "Billentyűparancsok", + "lang_picker.filter_label": "Nyelvek szűrése", + "lang_picker.filter_placeholder": "Nyelvek szűrése...", + "lang_picker.plain_text": "Egyszerű szöveg", + "link.apply": "Alkalmaz", + "link.cancel": "Mégse", + "link.display_text": "Megjelenítendő szöveg", + "link.edit": "Szerkesztés", + "link.edit_link": "Hivatkozás szerkesztése", + "link.remove_link": "Hivatkozás eltávolítása", + "link.text": "Szöveg", + "link.text_placeholder": "Megjelenítendő szöveg (opcionális)", + "link.url": "URL", + "link.url_placeholder": "URL beillesztése vagy beírása...", + "mermaid.done": "Kész", + "mermaid.edit": "Szerkesztés", + "mermaid.error_prefix": "Szintaktikai hiba", + "mermaid.stale": "Az előnézet elavult", + "recovery.discard": "Elvetés", + "recovery.message": "A Kern nem mentett változtatásokat talált egy korábbi munkamenetből. Szeretné visszaállítani őket?", + "recovery.restore": "Visszaállítás", + "recovery.title": "Nem mentett változások helyreállítása?", + "search.count": "találat", + "search.no_results": "Nincs találat", + "search.placeholder": "Keresés a dokumentumban...", + "settings.language": "Nyelv", + "settings.theme": "Téma", + "settings.theme_dark": "Sötét", + "settings.theme_light": "Világos", + "settings.theme_system": "Rendszer", + "sidebar.no_headings": "Nincsenek címsorok", + "sidebar.recent": "Legutóbbi fájlok", + "sidebar.toc": "Tartalomjegyzék", + "slash.blockquote": "Idézetblokk", + "slash.blockquote_desc": "Idézetblokk", + "slash.bullet_list": "Felsorolás", + "slash.bullet_list_desc": "Rendezetlen lista", + "slash.code_block": "Kódblokk", + "slash.code_block_desc": "Elkerített kódblokk", + "slash.divider": "Elválasztó", + "slash.divider_desc": "Vízszintes elválasztó", + "slash.heading1": "Címsor 1", + "slash.heading1_desc": "Nagy címsor", + "slash.heading2": "Címsor 2", + "slash.heading2_desc": "Közepes címsor", + "slash.heading3": "Címsor 3", + "slash.heading3_desc": "Kis címsor", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Diagram beillesztése", + "slash.no_results": "Nincs találat", + "slash.numbered_list": "Számozott lista", + "slash.numbered_list_desc": "Rendezett lista", + "slash.paragraph": "Bekezdés", + "slash.paragraph_desc": "Egyszerű szöveg", + "slash.table": "Táblázat", + "slash.table_desc": "3×3-as táblázat", + "slash.task_list": "Feladatlista", + "slash.task_list_desc": "Ellenőrzőlista", + "table.add_col_left": "Oszlop beszúrása balra", + "table.add_col_right": "Oszlop beszúrása jobbra", + "table.add_row_above": "Sor hozzáadása fölé", + "table.add_row_below": "Sor hozzáadása alá", + "table.col_options": "{n}. oszlop beállításai", + "table.delete_col": "Oszlop törlése", + "table.delete_row": "Sor törlése", + "table.header": "Fejléc", + "table.insert_col_left": "Oszlop beszúrása balra", + "table.insert_col_right": "Oszlop beszúrása jobbra", + "table.insert_row_above": "Sor beszúrása fölé", + "table.insert_row_below": "Sor beszúrása alá", + "table.new_row": "+ Új sor", + "table.row_options": "{n}. sor beállításai", + "toolbar.done": "Kész", + "toolbar.edit": "Szerkesztés", + "toolbar.export_pdf": "Exportálás PDF-ként", + "toolbar.focus": "Fókusz mód", + "toolbar.more": "Továbbiak", + "toolbar.new_file": "Új fájl", + "toolbar.open": "Fájl megnyitása", + "toolbar.save": "Mentés", + "toolbar.search": "Keresés", + "toolbar.settings": "Beállítások", + "toolbar.split_view": "Osztott nézet", + "toolbar.theme": "Téma váltása", + "toolbar.toc": "Tartalomjegyzék", + "toolbar.zoom_in": "Nagyítás", + "toolbar.zoom_out": "Kicsinyítés", + "toolbar.zoom_reset": "Nagyítás visszaállítása", + "trial.days_remaining": "{days} nap van hátra a próbaidőszakból", + "trial.expired_message": "A próbaidőszak lejárt. A szerkesztés folytatásához vásárolja meg a Kern-t.", + "trial.feature_edit": "Markdown szerkesztése WYSIWYG és osztott nézetben", + "trial.feature_export": "Exportálás PDF-be", + "trial.feature_save": "Mentés és új fájlok létrehozása", + "trial.one_time_purchase": "Egyszeri vásárlás. Nincs előfizetés.", + "trial.purchase_button": "A Kern megvásárlása", + "trial.purchase_desc": "Szerezzen teljes hozzáférést az összes szerkesztési és exportálási funkcióhoz egy egyszeri vásárlással.", + "trial.purchase_title": "A Kern feloldása", + "trial.purchasing": "Vásárlás...", + "trial.restore_purchases": "Vásárlások visszaállítása", + "trial.restoring": "Visszaállítás...", + "viewer.copied": "Másolva!", + "viewer.copy": "Másolás", + "welcome.drop_hint": "vagy húzzon ide egy .md fájlt", + "welcome.new_button": "Új fájl", + "welcome.open_button": "Fájl megnyitása", + "welcome.subtitle": "Egy gyönyörű Markdown megjelenítő", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/id/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/id/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/id/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/id/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/id/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/id/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/id/strings.json b/src-mdviewer/src/md-nls-autogenerated/id/strings.json new file mode 100644 index 0000000000..497f919286 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/id/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Tutup pencarian", + "a11y.edit_link": "Edit tautan", + "a11y.format_text": "Format teks", + "a11y.insert_block": "Sisipkan blok", + "a11y.main_toolbar": "Bilah alat utama", + "a11y.next_match": "Kecocokan berikutnya", + "a11y.previous_match": "Kecocokan sebelumnya", + "a11y.search_in_document": "Cari di dokumen", + "a11y.search_text": "Cari teks", + "a11y.select_language": "Pilih bahasa", + "a11y.sidebar": "Bilah samping", + "a11y.skip_to_content": "Langsung ke konten", + "common.close": "Tutup", + "common.file": "File", + "common.open": "Buka", + "context.copy": "Salin", + "context.copy_image_address": "Salin alamat gambar", + "context.copy_link": "Salin tautan", + "context.cut": "Potong", + "context.open_link": "Buka tautan", + "context.paste": "Tempel", + "context.paste_plain": "Tempel sebagai teks biasa", + "context.select_all": "Pilih semua", + "dialog.cancel": "Batal", + "dialog.discard": "Buang", + "dialog.dont_save": "Jangan Simpan", + "dialog.save": "Simpan", + "dialog.unsaved_close": "Anda memiliki perubahan yang belum disimpan. Apakah ingin menyimpan sebelum menutup?", + "dialog.unsaved_exit_edit": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum keluar dari mode edit?", + "dialog.unsaved_new_file": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum membuat file baru?", + "dialog.unsaved_open_file": "Ada perubahan yang belum disimpan. Apakah Anda ingin menyimpan sebelum membuka file baru?", + "dialog.unsaved_title": "Perubahan Belum Disimpan", + "drop_zone.text": "Lepaskan file Markdown Anda di sini", + "export.open": "Buka", + "export.success": "PDF berhasil diekspor", + "format.blockquote": "Kutipan", + "format.bold": "Tebal ({mod}+B)", + "format.bullet_list": "Daftar poin", + "format.code": "Kode inline ({mod}+E)", + "format.code_block": "Blok kode", + "format.divider": "Pemisah", + "format.heading1": "Judul 1", + "format.heading2": "Judul 2", + "format.heading3": "Judul 3", + "format.italic": "Miring ({mod}+I)", + "format.link": "Tautan ({mod}+K)", + "format.numbered_list": "Daftar bernomor", + "format.paragraph": "Paragraf", + "format.strikethrough": "Coret ({mod}+Shift+X)", + "format.table": "Tabel", + "format.task_list": "Daftar tugas", + "help.editing": "Pengeditan", + "help.fallback_notice": "Halaman ini belum tersedia dalam bahasa Anda. Menampilkan versi bahasa Inggris.", + "help.features": "Fitur", + "help.getting_started": "Memulai", + "help.shortcuts": "Pintasan Keyboard", + "lang_picker.filter_label": "Filter bahasa", + "lang_picker.filter_placeholder": "Filter bahasa...", + "lang_picker.plain_text": "Teks biasa", + "link.apply": "Terapkan tautan", + "link.cancel": "Batal", + "link.display_text": "Teks tampilan", + "link.edit": "Edit", + "link.edit_link": "Edit tautan", + "link.remove_link": "Hapus tautan", + "link.text": "Teks", + "link.text_placeholder": "Teks tampilan (opsional)", + "link.url": "URL", + "link.url_placeholder": "Tempel atau ketik URL...", + "recovery.discard": "Buang", + "recovery.message": "Kern menemukan perubahan yang belum disimpan dari sesi sebelumnya. Apakah Anda ingin memulihkannya?", + "recovery.restore": "Pulihkan", + "recovery.title": "Pulihkan perubahan yang belum disimpan?", + "search.count": "kecocokan", + "search.no_results": "Tidak ada hasil", + "search.placeholder": "Cari di dokumen...", + "settings.language": "Bahasa", + "settings.theme": "Tema", + "settings.theme_dark": "Gelap", + "settings.theme_light": "Terang", + "settings.theme_system": "Sistem", + "sidebar.no_headings": "Tidak ada judul ditemukan", + "sidebar.recent": "File Terbaru", + "sidebar.toc": "Daftar Isi", + "slash.blockquote": "Kutipan", + "slash.blockquote_desc": "Blok kutipan", + "slash.bullet_list": "Daftar poin", + "slash.bullet_list_desc": "Daftar tak berurut", + "slash.code_block": "Blok kode", + "slash.code_block_desc": "Kode berpagar", + "slash.divider": "Pemisah", + "slash.divider_desc": "Garis horizontal", + "slash.heading1": "Judul 1", + "slash.heading1_desc": "Judul besar", + "slash.heading2": "Judul 2", + "slash.heading2_desc": "Judul sedang", + "slash.heading3": "Judul 3", + "slash.heading3_desc": "Judul kecil", + "slash.no_results": "Tidak ada hasil", + "slash.numbered_list": "Daftar bernomor", + "slash.numbered_list_desc": "Daftar berurut", + "slash.paragraph": "Paragraf", + "slash.paragraph_desc": "Teks biasa", + "slash.table": "Tabel", + "slash.table_desc": "Tabel 3×3", + "slash.task_list": "Daftar tugas", + "slash.task_list_desc": "Daftar centang", + "table.add_col_left": "Tambah kolom di kiri", + "table.add_col_right": "Tambah kolom di kanan", + "table.add_row_above": "Tambah baris di atas", + "table.add_row_below": "Tambah baris di bawah", + "table.col_options": "Opsi kolom {n}", + "table.delete_col": "Hapus kolom", + "table.delete_row": "Hapus baris", + "table.header": "Header", + "table.insert_col_left": "Sisipkan kolom di kiri", + "table.insert_col_right": "Sisipkan kolom di kanan", + "table.insert_row_above": "Sisipkan baris di atas", + "table.insert_row_below": "Sisipkan baris di bawah", + "table.new_row": "+ Baris baru", + "table.row_options": "Opsi baris {n}", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Ekspor PDF", + "toolbar.focus": "Mode Fokus", + "toolbar.more": "Lainnya", + "toolbar.new_file": "File Baru", + "toolbar.open": "Buka File", + "toolbar.save": "Simpan", + "toolbar.search": "Cari", + "toolbar.settings": "Pengaturan", + "toolbar.split_view": "Tampilan Terpisah", + "toolbar.theme": "Ganti Tema", + "toolbar.toc": "Daftar Isi", + "toolbar.zoom_in": "Perbesar", + "toolbar.zoom_out": "Perkecil", + "toolbar.zoom_reset": "Atur Ulang Zoom", + "trial.days_remaining": "{days} hari tersisa dalam uji coba", + "trial.expired_message": "Masa uji coba Anda telah berakhir. Beli Kern untuk melanjutkan pengeditan.", + "trial.feature_edit": "Edit Markdown dengan WYSIWYG dan tampilan terpisah", + "trial.feature_export": "Ekspor ke PDF", + "trial.feature_save": "Simpan dan buat file baru", + "trial.one_time_purchase": "Pembelian sekali bayar. Tanpa langganan.", + "trial.purchase_button": "Beli Kern", + "trial.purchase_desc": "Dapatkan akses penuh ke semua fitur pengeditan dan ekspor dengan pembelian sekali bayar.", + "trial.purchase_title": "Buka Kern", + "trial.purchasing": "Membeli...", + "trial.restore_purchases": "Pulihkan Pembelian", + "trial.restoring": "Memulihkan...", + "viewer.copied": "Tersalin!", + "viewer.copy": "Salin", + "welcome.drop_hint": "atau seret dan lepas file .md", + "welcome.new_button": "File Baru", + "welcome.open_button": "Buka File", + "welcome.subtitle": "Penampil Markdown yang indah", + "welcome.title": "Kern", + "format.block_type": "Tipe blok", + "format.lists": "Daftar", + "format.more_elements": "Lainnya", + "format.text_formatting": "Pemformatan teks", + "format.underline": "Garis bawah", + "mermaid.done": "Selesai", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Kesalahan sintaks", + "mermaid.stale": "Pratinjau kedaluwarsa", + "slash.mermaid": "Diagram Mermaid", + "slash.mermaid_desc": "Sisipkan diagram", + "toolbar.done": "Selesai" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/it/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/it/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/it/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/it/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/it/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/it/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/it/strings.json b/src-mdviewer/src/md-nls-autogenerated/it/strings.json new file mode 100644 index 0000000000..50cf137748 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/it/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Chiudi ricerca", + "a11y.edit_link": "Modifica link", + "a11y.format_text": "Formatta testo", + "a11y.insert_block": "Inserisci blocco", + "a11y.main_toolbar": "Barra degli strumenti principale", + "a11y.next_match": "Corrispondenza successiva", + "a11y.previous_match": "Corrispondenza precedente", + "a11y.search_in_document": "Cerca nel documento", + "a11y.search_text": "Cerca testo", + "a11y.select_language": "Seleziona lingua", + "a11y.sidebar": "Barra laterale", + "a11y.skip_to_content": "Salta al contenuto", + "common.close": "Chiudi", + "common.file": "File", + "common.open": "Apri", + "context.copy": "Copia", + "context.copy_image_address": "Copia indirizzo immagine", + "context.copy_link": "Copia link", + "context.cut": "Taglia", + "context.open_link": "Apri link", + "context.paste": "Incolla", + "context.paste_plain": "Incolla come testo semplice", + "context.select_all": "Seleziona tutto", + "dialog.cancel": "Annulla", + "dialog.discard": "Scarta", + "dialog.dont_save": "Non salvare", + "dialog.save": "Salva", + "dialog.unsaved_close": "Sono presenti modifiche non salvate. Vuoi salvare prima di chiudere?", + "dialog.unsaved_exit_edit": "Sono presenti modifiche non salvate. Vuoi salvare prima di uscire dalla modalità di modifica?", + "dialog.unsaved_new_file": "Sono presenti modifiche non salvate. Vuoi salvare prima di creare un nuovo file?", + "dialog.unsaved_open_file": "Sono presenti modifiche non salvate. Vuoi salvarle prima di aprire un nuovo file?", + "dialog.unsaved_title": "Modifiche non salvate", + "drop_zone.text": "Trascina qui il tuo file Markdown", + "export.open": "Apri", + "export.success": "PDF esportato con successo", + "format.block_type": "Tipo di blocco", + "format.blockquote": "Citazione", + "format.bold": "Grassetto ({mod}+B)", + "format.bullet_list": "Elenco puntato", + "format.code": "Codice in linea ({mod}+E)", + "format.code_block": "Blocco di codice", + "format.divider": "Divisore", + "format.heading1": "Intestazione 1", + "format.heading2": "Intestazione 2", + "format.heading3": "Intestazione 3", + "format.italic": "Corsivo ({mod}+I)", + "format.link": "Collegamento ({mod}+K)", + "format.lists": "Elenchi", + "format.more_elements": "Altro", + "format.numbered_list": "Elenco numerato", + "format.paragraph": "Paragrafo", + "format.strikethrough": "Barrato ({mod}+Shift+X)", + "format.table": "Tabella", + "format.task_list": "Elenco attività", + "format.text_formatting": "Formattazione testo", + "format.underline": "Sottolineato", + "help.editing": "Modifica", + "help.fallback_notice": "Questa pagina non è ancora disponibile nella tua lingua. Viene mostrata la versione in inglese.", + "help.features": "Funzionalità", + "help.getting_started": "Per iniziare", + "help.shortcuts": "Scorciatoie da tastiera", + "lang_picker.filter_label": "Filtra lingue", + "lang_picker.filter_placeholder": "Filtra lingue...", + "lang_picker.plain_text": "Testo semplice", + "link.apply": "Applica", + "link.cancel": "Annulla", + "link.display_text": "Testo da visualizzare", + "link.edit": "Modifica", + "link.edit_link": "Modifica link", + "link.remove_link": "Rimuovi link", + "link.text": "Testo", + "link.text_placeholder": "Testo da visualizzare (opzionale)", + "link.url": "URL", + "link.url_placeholder": "Incolla o digita un URL...", + "mermaid.done": "Fatto", + "mermaid.edit": "Modifica", + "mermaid.error_prefix": "Errore di sintassi", + "mermaid.stale": "Anteprima non aggiornata", + "recovery.discard": "Ignora", + "recovery.message": "Kern ha trovato delle modifiche non salvate da una sessione precedente. Vuoi ripristinarle?", + "recovery.restore": "Ripristina", + "recovery.title": "Recuperare le modifiche non salvate?", + "search.count": "corrispondenze", + "search.no_results": "Nessun risultato", + "search.placeholder": "Cerca nel documento...", + "settings.language": "Lingua", + "settings.theme": "Tema", + "settings.theme_dark": "Scuro", + "settings.theme_light": "Chiaro", + "settings.theme_system": "Sistema", + "sidebar.no_headings": "Nessuna intestazione trovata", + "sidebar.recent": "File recenti", + "sidebar.toc": "Indice", + "slash.blockquote": "Citazione", + "slash.blockquote_desc": "Blocco di citazione", + "slash.bullet_list": "Elenco puntato", + "slash.bullet_list_desc": "Elenco non ordinato", + "slash.code_block": "Blocco di codice", + "slash.code_block_desc": "Codice delimitato", + "slash.divider": "Divisore", + "slash.divider_desc": "Linea orizzontale", + "slash.heading1": "Intestazione 1", + "slash.heading1_desc": "Intestazione grande", + "slash.heading2": "Intestazione 2", + "slash.heading2_desc": "Intestazione media", + "slash.heading3": "Intestazione 3", + "slash.heading3_desc": "Intestazione piccola", + "slash.mermaid": "Diagramma Mermaid", + "slash.mermaid_desc": "Inserisci un diagramma", + "slash.no_results": "Nessun risultato", + "slash.numbered_list": "Elenco numerato", + "slash.numbered_list_desc": "Elenco ordinato", + "slash.paragraph": "Paragrafo", + "slash.paragraph_desc": "Testo semplice", + "slash.table": "Tabella", + "slash.table_desc": "Tabella 3×3", + "slash.task_list": "Elenco attività", + "slash.task_list_desc": "Lista di controllo", + "table.add_col_left": "Aggiungi colonna a sinistra", + "table.add_col_right": "Aggiungi colonna a destra", + "table.add_row_above": "Aggiungi riga sopra", + "table.add_row_below": "Aggiungi riga sotto", + "table.col_options": "Opzioni colonna {n}", + "table.delete_col": "Elimina colonna", + "table.delete_row": "Elimina riga", + "table.header": "Intestazione", + "table.insert_col_left": "Inserisci colonna a sinistra", + "table.insert_col_right": "Inserisci colonna a destra", + "table.insert_row_above": "Inserisci riga sopra", + "table.insert_row_below": "Inserisci riga sotto", + "table.new_row": "+ Nuova riga", + "table.row_options": "Opzioni riga {n}", + "toolbar.done": "Fatto", + "toolbar.edit": "Modifica", + "toolbar.export_pdf": "Esporta PDF", + "toolbar.focus": "Modalità focus", + "toolbar.more": "Altro", + "toolbar.new_file": "Nuovo file", + "toolbar.open": "Apri file", + "toolbar.save": "Salva", + "toolbar.search": "Cerca", + "toolbar.settings": "Impostazioni", + "toolbar.split_view": "Vista divisa", + "toolbar.theme": "Cambia tema", + "toolbar.toc": "Indice", + "toolbar.zoom_in": "Ingrandisci", + "toolbar.zoom_out": "Riduci", + "toolbar.zoom_reset": "Ripristina zoom", + "trial.days_remaining": "{days} giorni rimanenti di prova", + "trial.expired_message": "Il tuo periodo di prova è scaduto. Acquista Kern per continuare a modificare.", + "trial.feature_edit": "Modifica Markdown con WYSIWYG e visualizzazione divisa", + "trial.feature_export": "Esporta in PDF", + "trial.feature_save": "Salva e crea nuovi file", + "trial.one_time_purchase": "Acquisto unico. Nessun abbonamento.", + "trial.purchase_button": "Acquista Kern", + "trial.purchase_desc": "Ottieni l'accesso completo a tutte le funzionalità di modifica ed esportazione con un acquisto unico.", + "trial.purchase_title": "Sblocca Kern", + "trial.purchasing": "Acquisto in corso...", + "trial.restore_purchases": "Ripristina acquisti", + "trial.restoring": "Ripristino in corso...", + "viewer.copied": "Copiato!", + "viewer.copy": "Copia", + "welcome.drop_hint": "o trascina e rilascia un file .md", + "welcome.new_button": "Nuovo file", + "welcome.open_button": "Apri file", + "welcome.subtitle": "Un bellissimo visualizzatore Markdown", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ja/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ja/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ja/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ja/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ja/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ja/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ja/strings.json b/src-mdviewer/src/md-nls-autogenerated/ja/strings.json new file mode 100644 index 0000000000..774a62a012 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ja/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "検索を閉じる", + "a11y.edit_link": "リンクを編集", + "a11y.format_text": "テキストの書式設定", + "a11y.insert_block": "ブロックを挿入", + "a11y.main_toolbar": "メインツールバー", + "a11y.next_match": "次の一致", + "a11y.previous_match": "前の一致", + "a11y.search_in_document": "ドキュメント内を検索", + "a11y.search_text": "テキスト検索", + "a11y.select_language": "言語を選択", + "a11y.sidebar": "サイドバー", + "a11y.skip_to_content": "コンテンツへスキップ", + "common.close": "閉じる", + "common.file": "ファイル", + "common.open": "開く", + "context.copy": "コピー", + "context.copy_image_address": "画像アドレスをコピー", + "context.copy_link": "リンクをコピー", + "context.cut": "切り取り", + "context.open_link": "リンクを開く", + "context.paste": "貼り付け", + "context.paste_plain": "プレーンテキストとして貼り付け", + "context.select_all": "すべて選択", + "dialog.cancel": "キャンセル", + "dialog.discard": "破棄", + "dialog.dont_save": "保存しない", + "dialog.save": "保存", + "dialog.unsaved_close": "未保存の変更があります。閉じる前に保存しますか?", + "dialog.unsaved_exit_edit": "未保存の変更があります。編集モードを終了する前に保存しますか?", + "dialog.unsaved_new_file": "未保存の変更があります。新規ファイルを作成する前に保存しますか?", + "dialog.unsaved_open_file": "未保存の変更があります。新しいファイルを開く前に保存しますか?", + "dialog.unsaved_title": "未保存の変更", + "drop_zone.text": "Markdownファイルをここにドロップ", + "export.open": "開く", + "export.success": "PDFのエクスポートが完了しました", + "format.blockquote": "引用", + "format.bold": "太字 ({mod}+B)", + "format.bullet_list": "箇条書き", + "format.code": "インラインコード ({mod}+E)", + "format.code_block": "コードブロック", + "format.divider": "区切り線", + "format.heading1": "見出し1", + "format.heading2": "見出し2", + "format.heading3": "見出し3", + "format.italic": "斜体 ({mod}+I)", + "format.link": "リンク ({mod}+K)", + "format.numbered_list": "番号付きリスト", + "format.paragraph": "段落", + "format.strikethrough": "取り消し線 ({mod}+Shift+X)", + "format.table": "テーブル", + "format.task_list": "タスクリスト", + "help.editing": "編集", + "help.fallback_notice": "このページはまだお使いの言語では利用できません。英語版を表示しています。", + "help.features": "機能", + "help.getting_started": "はじめに", + "help.shortcuts": "キーボードショートカット", + "lang_picker.filter_label": "言語を絞り込み", + "lang_picker.filter_placeholder": "言語を絞り込み...", + "lang_picker.plain_text": "プレーンテキスト", + "link.apply": "リンクを適用", + "link.cancel": "キャンセル", + "link.display_text": "表示テキスト", + "link.edit": "編集", + "link.edit_link": "リンクを編集", + "link.remove_link": "リンクを削除", + "link.text": "テキスト", + "link.text_placeholder": "表示テキスト(任意)", + "link.url": "URL", + "link.url_placeholder": "URLを貼り付けまたは入力...", + "recovery.discard": "破棄", + "recovery.message": "Kern は前回のセッションの未保存の変更を見つけました。復元しますか?", + "recovery.restore": "復元", + "recovery.title": "未保存の変更を復元しますか?", + "search.count": "件一致", + "search.no_results": "結果なし", + "search.placeholder": "ドキュメント内を検索...", + "settings.language": "言語", + "settings.theme": "テーマ", + "settings.theme_dark": "ダーク", + "settings.theme_light": "ライト", + "settings.theme_system": "システム", + "sidebar.no_headings": "見出しが見つかりません", + "sidebar.recent": "最近のファイル", + "sidebar.toc": "目次", + "slash.blockquote": "引用", + "slash.blockquote_desc": "引用ブロック", + "slash.bullet_list": "箇条書き", + "slash.bullet_list_desc": "順序なしリスト", + "slash.code_block": "コードブロック", + "slash.code_block_desc": "フェンス付きコード", + "slash.divider": "区切り線", + "slash.divider_desc": "水平線", + "slash.heading1": "見出し1", + "slash.heading1_desc": "大見出し", + "slash.heading2": "見出し2", + "slash.heading2_desc": "中見出し", + "slash.heading3": "見出し3", + "slash.heading3_desc": "小見出し", + "slash.no_results": "結果なし", + "slash.numbered_list": "番号付きリスト", + "slash.numbered_list_desc": "順序付きリスト", + "slash.paragraph": "段落", + "slash.paragraph_desc": "本文テキスト", + "slash.table": "テーブル", + "slash.table_desc": "3×3テーブル", + "slash.task_list": "タスクリスト", + "slash.task_list_desc": "チェックリスト", + "table.add_col_left": "左に列を追加", + "table.add_col_right": "右に列を追加", + "table.add_row_above": "上に行を追加", + "table.add_row_below": "下に行を追加", + "table.col_options": "列 {n} のオプション", + "table.delete_col": "列を削除", + "table.delete_row": "行を削除", + "table.header": "ヘッダー", + "table.insert_col_left": "左に列を挿入", + "table.insert_col_right": "右に列を挿入", + "table.insert_row_above": "上に行を挿入", + "table.insert_row_below": "下に行を挿入", + "table.new_row": "+ 新しい行", + "table.row_options": "行 {n} のオプション", + "toolbar.edit": "編集", + "toolbar.export_pdf": "PDF にエクスポート", + "toolbar.focus": "集中モード", + "toolbar.more": "その他", + "toolbar.new_file": "新規ファイル", + "toolbar.open": "ファイルを開く", + "toolbar.save": "保存", + "toolbar.search": "検索", + "toolbar.settings": "設定", + "toolbar.split_view": "分割表示", + "toolbar.theme": "テーマ切替", + "toolbar.toc": "目次", + "toolbar.zoom_in": "拡大", + "toolbar.zoom_out": "縮小", + "toolbar.zoom_reset": "ズームをリセット", + "trial.days_remaining": "試用期間の残り {days} 日", + "trial.expired_message": "試用期間が終了しました。編集を続けるには Kern を購入してください。", + "trial.feature_edit": "WYSIWYG と分割表示で Markdown を編集", + "trial.feature_export": "PDF にエクスポート", + "trial.feature_save": "ファイルの保存と新規作成", + "trial.one_time_purchase": "買い切り。サブスクリプション不要。", + "trial.purchase_button": "Kern を購入", + "trial.purchase_desc": "買い切りですべての編集・エクスポート機能にフルアクセスできます。", + "trial.purchase_title": "Kern のロックを解除", + "trial.purchasing": "購入処理中...", + "trial.restore_purchases": "購入を復元", + "trial.restoring": "復元中...", + "viewer.copied": "コピーしました!", + "viewer.copy": "コピー", + "welcome.drop_hint": "または .md ファイルをドラッグ&ドロップ", + "welcome.new_button": "新規ファイル", + "welcome.open_button": "ファイルを開く", + "welcome.subtitle": "美しいMarkdownビューア", + "welcome.title": "Kern", + "format.block_type": "ブロックタイプ", + "format.lists": "リスト", + "format.more_elements": "その他", + "format.text_formatting": "テキスト書式設定", + "format.underline": "下線", + "mermaid.done": "完了", + "mermaid.edit": "編集", + "mermaid.error_prefix": "構文エラー", + "mermaid.stale": "プレビューが古くなっています", + "slash.mermaid": "マーメイドダイアグラム", + "slash.mermaid_desc": "ダイアグラムを挿入", + "toolbar.done": "完了" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ko/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ko/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ko/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ko/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ko/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ko/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ko/strings.json b/src-mdviewer/src/md-nls-autogenerated/ko/strings.json new file mode 100644 index 0000000000..ed358b21b9 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ko/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "검색 닫기", + "a11y.edit_link": "링크 편집", + "a11y.format_text": "텍스트 서식", + "a11y.insert_block": "블록 삽입", + "a11y.main_toolbar": "메인 도구 모음", + "a11y.next_match": "다음 일치", + "a11y.previous_match": "이전 일치", + "a11y.search_in_document": "문서에서 검색", + "a11y.search_text": "텍스트 검색", + "a11y.select_language": "언어 선택", + "a11y.sidebar": "사이드바", + "a11y.skip_to_content": "콘텐츠로 건너뛰기", + "common.close": "닫기", + "common.file": "파일", + "common.open": "열기", + "context.copy": "복사", + "context.copy_image_address": "이미지 주소 복사", + "context.copy_link": "링크 복사", + "context.cut": "잘라내기", + "context.open_link": "링크 열기", + "context.paste": "붙여넣기", + "context.paste_plain": "일반 텍스트로 붙여넣기", + "context.select_all": "모두 선택", + "dialog.cancel": "취소", + "dialog.discard": "버리기", + "dialog.dont_save": "저장 안 함", + "dialog.save": "저장", + "dialog.unsaved_close": "저장되지 않은 변경사항이 있습니다. 닫기 전에 저장하시겠습니까?", + "dialog.unsaved_exit_edit": "저장되지 않은 변경사항이 있습니다. 편집 모드를 종료하기 전에 저장하시겠습니까?", + "dialog.unsaved_new_file": "저장되지 않은 변경사항이 있습니다. 새 파일을 만들기 전에 저장하시겠습니까?", + "dialog.unsaved_open_file": "저장되지 않은 변경사항이 있습니다. 새 파일을 열기 전에 저장하시겠습니까?", + "dialog.unsaved_title": "저장되지 않은 변경사항", + "drop_zone.text": "마크다운 파일을 여기에 놓으세요", + "export.open": "열기", + "export.success": "PDF 내보내기 완료", + "format.blockquote": "인용", + "format.bold": "굵게 ({mod}+B)", + "format.bullet_list": "글머리 기호 목록", + "format.code": "인라인 코드 ({mod}+E)", + "format.code_block": "코드 블록", + "format.divider": "구분선", + "format.heading1": "제목 1", + "format.heading2": "제목 2", + "format.heading3": "제목 3", + "format.italic": "기울임 ({mod}+I)", + "format.link": "링크 ({mod}+K)", + "format.numbered_list": "번호 목록", + "format.paragraph": "본문", + "format.strikethrough": "취소선 ({mod}+Shift+X)", + "format.table": "표", + "format.task_list": "작업 목록", + "help.editing": "편집", + "help.fallback_notice": "이 페이지는 아직 사용자의 언어로 제공되지 않습니다. 영어 버전을 표시합니다.", + "help.features": "기능", + "help.getting_started": "시작하기", + "help.shortcuts": "키보드 단축키", + "lang_picker.filter_label": "언어 필터", + "lang_picker.filter_placeholder": "언어 필터...", + "lang_picker.plain_text": "일반 텍스트", + "link.apply": "링크 적용", + "link.cancel": "취소", + "link.display_text": "표시 텍스트", + "link.edit": "편집", + "link.edit_link": "링크 편집", + "link.remove_link": "링크 제거", + "link.text": "텍스트", + "link.text_placeholder": "표시 텍스트 (선택사항)", + "link.url": "URL", + "link.url_placeholder": "URL을 붙여넣거나 입력하세요...", + "recovery.discard": "버리기", + "recovery.message": "Kern이 이전 세션에서 저장되지 않은 변경사항을 발견했습니다. 복구하시겠습니까?", + "recovery.restore": "복구", + "recovery.title": "저장되지 않은 변경사항을 복구하시겠습니까?", + "search.count": "일치", + "search.no_results": "결과 없음", + "search.placeholder": "문서에서 검색...", + "settings.language": "언어", + "settings.theme": "테마", + "settings.theme_dark": "다크", + "settings.theme_light": "라이트", + "settings.theme_system": "시스템", + "sidebar.no_headings": "제목을 찾을 수 없습니다", + "sidebar.recent": "최근 파일", + "sidebar.toc": "목차", + "slash.blockquote": "인용", + "slash.blockquote_desc": "인용 블록", + "slash.bullet_list": "글머리 기호 목록", + "slash.bullet_list_desc": "순서 없는 목록", + "slash.code_block": "코드 블록", + "slash.code_block_desc": "펜스드 코드", + "slash.divider": "구분선", + "slash.divider_desc": "수평선", + "slash.heading1": "제목 1", + "slash.heading1_desc": "큰 제목", + "slash.heading2": "제목 2", + "slash.heading2_desc": "중간 제목", + "slash.heading3": "제목 3", + "slash.heading3_desc": "작은 제목", + "slash.no_results": "결과 없음", + "slash.numbered_list": "번호 목록", + "slash.numbered_list_desc": "순서 있는 목록", + "slash.paragraph": "본문", + "slash.paragraph_desc": "일반 텍스트", + "slash.table": "표", + "slash.table_desc": "3×3 표", + "slash.task_list": "작업 목록", + "slash.task_list_desc": "체크리스트", + "table.add_col_left": "왼쪽에 열 추가", + "table.add_col_right": "오른쪽에 열 추가", + "table.add_row_above": "위에 행 추가", + "table.add_row_below": "아래에 행 추가", + "table.col_options": "열 {n} 옵션", + "table.delete_col": "열 삭제", + "table.delete_row": "행 삭제", + "table.header": "헤더", + "table.insert_col_left": "왼쪽에 열 삽입", + "table.insert_col_right": "오른쪽에 열 삽입", + "table.insert_row_above": "위에 행 삽입", + "table.insert_row_below": "아래에 행 삽입", + "table.new_row": "+ 새 행", + "table.row_options": "행 {n} 옵션", + "toolbar.edit": "편집", + "toolbar.export_pdf": "PDF 내보내기", + "toolbar.focus": "집중 모드", + "toolbar.more": "더보기", + "toolbar.new_file": "새 파일", + "toolbar.open": "파일 열기", + "toolbar.save": "저장", + "toolbar.search": "검색", + "toolbar.settings": "설정", + "toolbar.split_view": "분할 보기", + "toolbar.theme": "테마 전환", + "toolbar.toc": "목차", + "toolbar.zoom_in": "확대", + "toolbar.zoom_out": "축소", + "toolbar.zoom_reset": "배율 초기화", + "trial.days_remaining": "체험판 {days}일 남음", + "trial.expired_message": "체험 기간이 만료되었습니다. 편집을 계속하려면 Kern을 구매하세요.", + "trial.feature_edit": "WYSIWYG 및 분할 보기로 Markdown 편집", + "trial.feature_export": "PDF로 내보내기", + "trial.feature_save": "파일 저장 및 새 파일 만들기", + "trial.one_time_purchase": "일회성 구매. 구독 없음.", + "trial.purchase_button": "Kern 구매", + "trial.purchase_desc": "일회성 구매로 모든 편집 및 내보내기 기능을 이용할 수 있습니다.", + "trial.purchase_title": "Kern 잠금 해제", + "trial.purchasing": "구매 중...", + "trial.restore_purchases": "구매 복원", + "trial.restoring": "복원 중...", + "viewer.copied": "복사됨!", + "viewer.copy": "복사", + "welcome.drop_hint": "또는 .md 파일을 끌어다 놓으세요", + "welcome.new_button": "새 파일", + "welcome.open_button": "파일 열기", + "welcome.subtitle": "아름다운 마크다운 뷰어", + "welcome.title": "Kern", + "format.block_type": "블록 유형", + "format.lists": "목록", + "format.more_elements": "더 보기", + "format.text_formatting": "텍스트 서식", + "format.underline": "밑줄", + "mermaid.done": "완료", + "mermaid.edit": "편집", + "mermaid.error_prefix": "구문 오류", + "mermaid.stale": "미리보기가 오래됨", + "slash.mermaid": "Mermaid 다이어그램", + "slash.mermaid_desc": "다이어그램 삽입", + "toolbar.done": "완료" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/lv/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/lv/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/lv/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/lv/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/lv/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/lv/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/lv/strings.json b/src-mdviewer/src/md-nls-autogenerated/lv/strings.json new file mode 100644 index 0000000000..c67f0f8509 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/lv/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Aizvērt meklēšanu", + "a11y.edit_link": "Rediģēt saiti", + "a11y.format_text": "Formatēt tekstu", + "a11y.insert_block": "Ievietot bloku", + "a11y.main_toolbar": "Galvenā rīkjosla", + "a11y.next_match": "Nākamā atbilstība", + "a11y.previous_match": "Iepriekšējā atbilstība", + "a11y.search_in_document": "Meklēt dokumentā", + "a11y.search_text": "Meklēt tekstu", + "a11y.select_language": "Izvēlēties valodu", + "a11y.sidebar": "Sānjosla", + "a11y.skip_to_content": "Pāriet uz saturu", + "common.close": "Aizvērt", + "common.file": "Fails", + "common.open": "Atvērt", + "context.copy": "Kopēt", + "context.copy_image_address": "Kopēt attēla adresi", + "context.copy_link": "Kopēt saiti", + "context.cut": "Izgriezt", + "context.open_link": "Atvērt saiti", + "context.paste": "Ielīmēt", + "context.paste_plain": "Ielīmēt kā vienkāršu tekstu", + "context.select_all": "Atlasīt visu", + "dialog.cancel": "Atcelt", + "dialog.discard": "Atmest", + "dialog.dont_save": "Nesaglabāt", + "dialog.save": "Saglabāt", + "dialog.unsaved_close": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms aizvēršanas?", + "dialog.unsaved_exit_edit": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms iziešanas no rediģēšanas režīma?", + "dialog.unsaved_new_file": "Jums ir nesaglabātas izmaiņas. Vai vēlaties saglabāt pirms jauna faila izveides?", + "dialog.unsaved_open_file": "Jums ir nesaglabātas izmaiņas. Vai vēlaties tās saglabāt pirms jauna faila atvēršanas?", + "dialog.unsaved_title": "Nesaglabātas izmaiņas", + "drop_zone.text": "Ievelciet savu Markdown failu šeit", + "export.open": "Atvērt", + "export.success": "PDF veiksmīgi eksportēts", + "format.block_type": "Bloka tips", + "format.blockquote": "Citāta bloks", + "format.bold": "Treknraksts ({mod}+B)", + "format.bullet_list": "Aizzīmēts saraksts", + "format.code": "Iekļautais kods ({mod}+E)", + "format.code_block": "Koda bloks", + "format.divider": "Atdalītājs", + "format.heading1": "Virsraksts 1", + "format.heading2": "Virsraksts 2", + "format.heading3": "Virsraksts 3", + "format.italic": "Slīpraksts ({mod}+I)", + "format.link": "Saite ({mod}+K)", + "format.lists": "Saraksti", + "format.more_elements": "Vairāk", + "format.numbered_list": "Numurēts saraksts", + "format.paragraph": "Rindkopa", + "format.strikethrough": "Pārsvītrojums ({mod}+Shift+X)", + "format.table": "Tabula", + "format.task_list": "Uzdevumu saraksts", + "format.text_formatting": "Teksta formatēšana", + "format.underline": "Pasvītrojums", + "help.editing": "Rediģēšana", + "help.fallback_notice": "Šī lapa vēl nav pieejama jūsu valodā. Tiek rādīta versija angļu valodā.", + "help.features": "Funkcijas", + "help.getting_started": "Darba sākšana", + "help.shortcuts": "Tastatūras saīsnes", + "lang_picker.filter_label": "Filtrēt valodas", + "lang_picker.filter_placeholder": "Filtrēt valodas...", + "lang_picker.plain_text": "Vienkāršs teksts", + "link.apply": "Lietot saiti", + "link.cancel": "Atcelt", + "link.display_text": "Attēlotais teksts", + "link.edit": "Rediģēt", + "link.edit_link": "Rediģēt saiti", + "link.remove_link": "Noņemt saiti", + "link.text": "Teksts", + "link.text_placeholder": "Rādāmais teksts (neobligāts)", + "link.url": "URL", + "link.url_placeholder": "Ielīmējiet vai ierakstiet URL...", + "mermaid.done": "Gatavs", + "mermaid.edit": "Rediģēt", + "mermaid.error_prefix": "Sintakses kļūda", + "mermaid.stale": "Priekšskatījums novecojis", + "recovery.discard": "Atmest", + "recovery.message": "Kern atrada nesaglabātas izmaiņas no iepriekšējās sesijas. Vai vēlaties tās atjaunot?", + "recovery.restore": "Atjaunot", + "recovery.title": "Atgūt nesaglabātās izmaiņas?", + "search.count": "atbilstības", + "search.no_results": "Nav rezultātu", + "search.placeholder": "Meklēt dokumentā...", + "settings.language": "Valoda", + "settings.theme": "Tēma", + "settings.theme_dark": "Tumšā", + "settings.theme_light": "Gaišā", + "settings.theme_system": "Sistēmas", + "sidebar.no_headings": "Virsraksti nav atrasti", + "sidebar.recent": "Pēdējie faili", + "sidebar.toc": "Satura rādītājs", + "slash.blockquote": "Citāts", + "slash.blockquote_desc": "Citāta bloks", + "slash.bullet_list": "Aizzīmēts saraksts", + "slash.bullet_list_desc": "Nenumurēts saraksts", + "slash.code_block": "Koda bloks", + "slash.code_block_desc": "Ierobežots kods", + "slash.divider": "Atdalītājs", + "slash.divider_desc": "Horizontālā līnija", + "slash.heading1": "Virsraksts 1", + "slash.heading1_desc": "Liels virsraksts", + "slash.heading2": "Virsraksts 2", + "slash.heading2_desc": "Vidējs virsraksts", + "slash.heading3": "Virsraksts 3", + "slash.heading3_desc": "Mazs virsraksts", + "slash.mermaid": "Mermaid diagramma", + "slash.mermaid_desc": "Ievietot diagrammu", + "slash.no_results": "Nav rezultātu", + "slash.numbered_list": "Numurēts saraksts", + "slash.numbered_list_desc": "Sakārtots saraksts", + "slash.paragraph": "Rindkopa", + "slash.paragraph_desc": "Vienkāršs teksts", + "slash.table": "Tabula", + "slash.table_desc": "3×3 tabula", + "slash.task_list": "Uzdevumu saraksts", + "slash.task_list_desc": "Kontrolsaraksts", + "table.add_col_left": "Pievienot kolonnu pa kreisi", + "table.add_col_right": "Pievienot kolonnu pa labi", + "table.add_row_above": "Pievienot rindu virs", + "table.add_row_below": "Pievienot rindu zem", + "table.col_options": "{n}. kolonnas opcijas", + "table.delete_col": "Dzēst kolonnu", + "table.delete_row": "Dzēst rindu", + "table.header": "Galvene", + "table.insert_col_left": "Ievietot kolonnu pa kreisi", + "table.insert_col_right": "Ievietot kolonnu pa labi", + "table.insert_row_above": "Ievietot rindu virs", + "table.insert_row_below": "Ievietot rindu zem", + "table.new_row": "+ Jauna rinda", + "table.row_options": "Rindas {n} opcijas", + "toolbar.done": "Gatavs", + "toolbar.edit": "Rediģēt", + "toolbar.export_pdf": "Eksportēt PDF", + "toolbar.focus": "Fokusa režīms", + "toolbar.more": "Vairāk", + "toolbar.new_file": "Jauns fails", + "toolbar.open": "Atvērt failu", + "toolbar.save": "Saglabāt", + "toolbar.search": "Meklēt", + "toolbar.settings": "Iestatījumi", + "toolbar.split_view": "Dalīts skats", + "toolbar.theme": "Pārslēgt tēmu", + "toolbar.toc": "Satura rādītājs", + "toolbar.zoom_in": "Tuvināt", + "toolbar.zoom_out": "Tālināt", + "toolbar.zoom_reset": "Atiestatīt tālummaiņu", + "trial.days_remaining": "Atlikušas {days} dienas izmēģinājuma periodā", + "trial.expired_message": "Jūsu izmēģinājuma periods ir beidzies. Iegādājieties Kern, lai turpinātu rediģēšanu.", + "trial.feature_edit": "Rediģējiet Markdown ar WYSIWYG un dalīto skatu", + "trial.feature_export": "Eksportēt uz PDF", + "trial.feature_save": "Saglabāt un izveidot jaunus failus", + "trial.one_time_purchase": "Vienreizējs pirkums. Bez abonementa.", + "trial.purchase_button": "Iegādāties Kern", + "trial.purchase_desc": "Iegūstiet pilnu piekļuvi visām rediģēšanas un eksportēšanas funkcijām ar vienreizēju pirkumu.", + "trial.purchase_title": "Atslēgt Kern", + "trial.purchasing": "Notiek pirkšana...", + "trial.restore_purchases": "Atjaunot pirkumus", + "trial.restoring": "Notiek atjaunošana...", + "viewer.copied": "Nokopēts!", + "viewer.copy": "Kopēt", + "welcome.drop_hint": "vai ievelciet .md failu", + "welcome.new_button": "Jauns fails", + "welcome.open_button": "Atvērt failu", + "welcome.subtitle": "Skaists Markdown skatītājs", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ml/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ml/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ml/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ml/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ml/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ml/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ml/strings.json b/src-mdviewer/src/md-nls-autogenerated/ml/strings.json new file mode 100644 index 0000000000..9fb31b3b16 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ml/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "തിരയൽ അടയ്ക്കുക", + "a11y.edit_link": "ലിങ്ക് എഡിറ്റ് ചെയ്യുക", + "a11y.format_text": "ടെക്സ്റ്റ് ഫോർമാറ്റ്", + "a11y.insert_block": "ബ്ലോക്ക് ചേർക്കുക", + "a11y.main_toolbar": "പ്രധാന ടൂൾബാർ", + "a11y.next_match": "അടുത്ത പൊരുത്തം", + "a11y.previous_match": "മുമ്പത്തെ പൊരുത്തം", + "a11y.search_in_document": "ഡോക്യുമെന്റിൽ തിരയുക", + "a11y.search_text": "ടെക്സ്റ്റ് തിരയുക", + "a11y.select_language": "ഭാഷ തിരഞ്ഞെടുക്കുക", + "a11y.sidebar": "സൈഡ്ബാർ", + "a11y.skip_to_content": "ഉള്ളടക്കത്തിലേക്ക് പോകുക", + "common.close": "അടയ്ക്കുക", + "common.file": "ഫയൽ", + "common.open": "തുറക്കുക", + "context.copy": "പകർത്തുക", + "context.copy_image_address": "ചിത്രത്തിന്റെ വിലാസം പകർത്തുക", + "context.copy_link": "ലിങ്ക് പകർത്തുക", + "context.cut": "മുറിക്കുക", + "context.open_link": "ലിങ്ക് തുറക്കുക", + "context.paste": "ഒട്ടിക്കുക", + "context.paste_plain": "സാധാരണ ടെക്സ്റ്റായി ഒട്ടിക്കുക", + "context.select_all": "എല്ലാം തിരഞ്ഞെടുക്കുക", + "dialog.cancel": "റദ്ദാക്കുക", + "dialog.discard": "ഉപേക്ഷിക്കുക", + "dialog.dont_save": "സേവ് ചെയ്യരുത്", + "dialog.save": "സേവ്", + "dialog.unsaved_close": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. അടയ്ക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "dialog.unsaved_exit_edit": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. എഡിറ്റ് മോഡിൽ നിന്ന് പുറത്തുകടക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "dialog.unsaved_new_file": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. പുതിയ ഫയൽ സൃഷ്ടിക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "dialog.unsaved_open_file": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. പുതിയ ഫയൽ തുറക്കുന്നതിന് മുമ്പ് സേവ് ചെയ്യണോ?", + "dialog.unsaved_title": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ", + "drop_zone.text": "നിങ്ങളുടെ മാർക്ക്ഡൗൺ ഫയൽ ഇവിടെ ഇടുക", + "export.open": "തുറക്കുക", + "export.success": "PDF വിജയകരമായി എക്സ്പോർട്ട് ചെയ്തു", + "format.blockquote": "ബ്ലോക്ക്ക്വോട്ട്", + "format.bold": "ബോൾഡ് ({mod}+B)", + "format.bullet_list": "ബുള്ളറ്റ് ലിസ്റ്റ്", + "format.code": "ഇൻലൈൻ കോഡ് ({mod}+E)", + "format.code_block": "കോഡ് ബ്ലോക്ക്", + "format.divider": "ഡിവൈഡർ", + "format.heading1": "ശീർഷകം 1", + "format.heading2": "ശീർഷകം 2", + "format.heading3": "ശീർഷകം 3", + "format.italic": "ഇറ്റാലിക് ({mod}+I)", + "format.link": "ലിങ്ക് ({mod}+K)", + "format.numbered_list": "നമ്പർ ലിസ്റ്റ്", + "format.paragraph": "ഖണ്ഡിക", + "format.strikethrough": "സ്ട്രൈക്ക്ത്രൂ ({mod}+Shift+X)", + "format.table": "ടേബിൾ", + "format.task_list": "ടാസ്ക് ലിസ്റ്റ്", + "help.editing": "എഡിറ്റിംഗ്", + "help.fallback_notice": "ഈ പേജ് ഇതുവരെ നിങ്ങളുടെ ഭാഷയിൽ ലഭ്യമല്ല. ഇംഗ്ലീഷ് പതിപ്പ് കാണിക്കുന്നു.", + "help.features": "സവിശേഷതകൾ", + "help.getting_started": "ആരംഭിക്കാം", + "help.shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ", + "lang_picker.filter_label": "ഭാഷകൾ ഫിൽട്ടർ ചെയ്യുക", + "lang_picker.filter_placeholder": "ഭാഷകൾ ഫിൽട്ടർ ചെയ്യുക...", + "lang_picker.plain_text": "സാധാരണ ടെക്സ്റ്റ്", + "link.apply": "ലിങ്ക് ബാധകമാക്കുക", + "link.cancel": "റദ്ദാക്കുക", + "link.display_text": "ഡിസ്പ്ലേ ടെക്സ്റ്റ്", + "link.edit": "എഡിറ്റ്", + "link.edit_link": "ലിങ്ക് എഡിറ്റ് ചെയ്യുക", + "link.remove_link": "ലിങ്ക് നീക്കം ചെയ്യുക", + "link.text": "ടെക്സ്റ്റ്", + "link.text_placeholder": "ഡിസ്പ്ലേ ടെക്സ്റ്റ് (ഐച്ഛികം)", + "link.url": "URL", + "link.url_placeholder": "URL പേസ്റ്റ് ചെയ്യുക അല്ലെങ്കിൽ ടൈപ്പ് ചെയ്യുക...", + "recovery.discard": "ഉപേക്ഷിക്കുക", + "recovery.message": "മുൻ സെഷനിൽ നിന്ന് സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ Kern കണ്ടെത്തി. അവ പുനഃസ്ഥാപിക്കണോ?", + "recovery.restore": "പുനഃസ്ഥാപിക്കുക", + "recovery.title": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ വീണ്ടെടുക്കണോ?", + "search.count": "പൊരുത്തങ്ങൾ", + "search.no_results": "ഫലങ്ങളില്ല", + "search.placeholder": "ഡോക്യുമെന്റിൽ തിരയുക...", + "settings.language": "ഭാഷ", + "settings.theme": "തീം", + "settings.theme_dark": "ഡാർക്ക്", + "settings.theme_light": "ലൈറ്റ്", + "settings.theme_system": "സിസ്റ്റം", + "sidebar.no_headings": "ശീർഷകങ്ങൾ കണ്ടെത്തിയില്ല", + "sidebar.recent": "സമീപകാല ഫയലുകൾ", + "sidebar.toc": "ഉള്ളടക്കം", + "slash.blockquote": "ബ്ലോക്ക്ക്വോട്ട്", + "slash.blockquote_desc": "ഉദ്ധരണി ബ്ലോക്ക്", + "slash.bullet_list": "ബുള്ളറ്റ് ലിസ്റ്റ്", + "slash.bullet_list_desc": "ക്രമരഹിത ലിസ്റ്റ്", + "slash.code_block": "കോഡ് ബ്ലോക്ക്", + "slash.code_block_desc": "ഫെൻസ്ഡ് കോഡ്", + "slash.divider": "ഡിവൈഡർ", + "slash.divider_desc": "തിരശ്ചീന രേഖ", + "slash.heading1": "ശീർഷകം 1", + "slash.heading1_desc": "വലിയ ശീർഷകം", + "slash.heading2": "ശീർഷകം 2", + "slash.heading2_desc": "ഇടത്തരം ശീർഷകം", + "slash.heading3": "ശീർഷകം 3", + "slash.heading3_desc": "ചെറിയ ശീർഷകം", + "slash.no_results": "ഫലങ്ങളില്ല", + "slash.numbered_list": "നമ്പർ ലിസ്റ്റ്", + "slash.numbered_list_desc": "ക്രമ ലിസ്റ്റ്", + "slash.paragraph": "ഖണ്ഡിക", + "slash.paragraph_desc": "സാധാരണ വാചകം", + "slash.table": "ടേബിൾ", + "slash.table_desc": "3×3 ടേബിൾ", + "slash.task_list": "ടാസ്ക് ലിസ്റ്റ്", + "slash.task_list_desc": "ചെക്ക്ലിസ്റ്റ്", + "table.add_col_left": "ഇടത്ത് കോളം ചേർക്കുക", + "table.add_col_right": "വലത്ത് കോളം ചേർക്കുക", + "table.add_row_above": "മുകളിൽ വരി ചേർക്കുക", + "table.add_row_below": "താഴെ വരി ചേർക്കുക", + "table.col_options": "കോളം {n} ഓപ്ഷനുകൾ", + "table.delete_col": "കോളം ഇല്ലാതാക്കുക", + "table.delete_row": "വരി ഇല്ലാതാക്കുക", + "table.header": "ഹെഡർ", + "table.insert_col_left": "ഇടത്ത് കോളം ചേർക്കുക", + "table.insert_col_right": "വലത്ത് കോളം ചേർക്കുക", + "table.insert_row_above": "മുകളിൽ വരി ചേർക്കുക", + "table.insert_row_below": "താഴെ വരി ചേർക്കുക", + "table.new_row": "+ പുതിയ വരി", + "table.row_options": "വരി {n} ഓപ്ഷനുകൾ", + "toolbar.edit": "എഡിറ്റ്", + "toolbar.export_pdf": "PDF എക്സ്പോർട്ട്", + "toolbar.focus": "ഫോക്കസ് മോഡ്", + "toolbar.more": "കൂടുതൽ", + "toolbar.new_file": "പുതിയ ഫയൽ", + "toolbar.open": "ഫയൽ തുറക്കുക", + "toolbar.save": "സേവ്", + "toolbar.search": "തിരയുക", + "toolbar.settings": "ക്രമീകരണങ്ങൾ", + "toolbar.split_view": "വിഭജിത കാഴ്ച", + "toolbar.theme": "തീം മാറ്റുക", + "toolbar.toc": "ഉള്ളടക്കം", + "toolbar.zoom_in": "സൂം ഇൻ", + "toolbar.zoom_out": "സൂം ഔട്ട്", + "toolbar.zoom_reset": "സൂം റീസെറ്റ്", + "trial.days_remaining": "ട്രയലിൽ {days} ദിവസം ശേഷിക്കുന്നു", + "trial.expired_message": "നിങ്ങളുടെ ട്രയൽ കാലാവധി അവസാനിച്ചു. എഡിറ്റിംഗ് തുടരാൻ Kern വാങ്ങുക.", + "trial.feature_edit": "WYSIWYG, വിഭജിത കാഴ്ചയിൽ Markdown എഡിറ്റ് ചെയ്യുക", + "trial.feature_export": "PDF-ലേക്ക് എക്സ്പോർട്ട് ചെയ്യുക", + "trial.feature_save": "ഫയലുകൾ സേവ് ചെയ്യുകയും പുതിയവ സൃഷ്ടിക്കുകയും ചെയ്യുക", + "trial.one_time_purchase": "ഒറ്റത്തവണ വാങ്ങൽ. സബ്സ്ക്രിപ്ഷൻ ഇല്ല.", + "trial.purchase_button": "Kern വാങ്ങുക", + "trial.purchase_desc": "ഒറ്റത്തവണ വാങ്ങലിലൂടെ എല്ലാ എഡിറ്റിംഗ്, എക്സ്പോർട്ട് സവിശേഷതകളിലേക്കും പൂർണ്ണ ആക്സസ് നേടുക.", + "trial.purchase_title": "Kern അൺലോക്ക് ചെയ്യുക", + "trial.purchasing": "വാങ്ങുന്നു...", + "trial.restore_purchases": "വാങ്ങലുകൾ പുനഃസ്ഥാപിക്കുക", + "trial.restoring": "പുനഃസ്ഥാപിക്കുന്നു...", + "viewer.copied": "കോപ്പി ചെയ്തു!", + "viewer.copy": "കോപ്പി", + "welcome.drop_hint": "അല്ലെങ്കിൽ .md ഫയൽ വലിച്ചിടുക", + "welcome.new_button": "പുതിയ ഫയൽ", + "welcome.open_button": "ഫയൽ തുറക്കുക", + "welcome.subtitle": "ഒരു മനോഹരമായ മാർക്ക്ഡൗൺ വ്യൂവർ", + "welcome.title": "Kern", + "format.block_type": "ബ്ലോക്ക് തരം", + "format.lists": "ലിസ്റ്റുകൾ", + "format.more_elements": "കൂടുതൽ", + "format.text_formatting": "ടെക്സ്റ്റ് ഫോർമാറ്റിംഗ്", + "format.underline": "അടിവര", + "mermaid.done": "പൂർത്തിയായി", + "mermaid.edit": "എഡിറ്റ് ചെയ്യുക", + "mermaid.error_prefix": "സിന്റാക്സ് പിശക്", + "mermaid.stale": "പ്രിവ്യൂ കാലഹരണപ്പെട്ടു", + "slash.mermaid": "Mermaid ഡയഗ്രം", + "slash.mermaid_desc": "ഡയഗ്രം ചേർക്കുക", + "toolbar.done": "പൂർത്തിയായി" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/nb/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/nb/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nb/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/nb/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/nb/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nb/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/nb/strings.json b/src-mdviewer/src/md-nls-autogenerated/nb/strings.json new file mode 100644 index 0000000000..21d3ae5cb1 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nb/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Lukk søk", + "a11y.edit_link": "Rediger lenke", + "a11y.format_text": "Formater tekst", + "a11y.insert_block": "Sett inn blokk", + "a11y.main_toolbar": "Hovedverktøylinje", + "a11y.next_match": "Neste treff", + "a11y.previous_match": "Forrige treff", + "a11y.search_in_document": "Søk i dokument", + "a11y.search_text": "Søketekst", + "a11y.select_language": "Velg språk", + "a11y.sidebar": "Sidelinje", + "a11y.skip_to_content": "Hopp til innhold", + "common.close": "Lukk", + "common.file": "Fil", + "common.open": "Åpne", + "context.copy": "Kopier", + "context.copy_image_address": "Kopier bildeadresse", + "context.copy_link": "Kopier lenke", + "context.cut": "Klipp ut", + "context.open_link": "Åpne lenke", + "context.paste": "Lim inn", + "context.paste_plain": "Lim inn som ren tekst", + "context.select_all": "Merk alt", + "dialog.cancel": "Avbryt", + "dialog.discard": "Forkast", + "dialog.dont_save": "Ikke lagre", + "dialog.save": "Lagre", + "dialog.unsaved_close": "Du har ulagrede endringer. Vil du lagre før du lukker?", + "dialog.unsaved_exit_edit": "Du har ulagrede endringer. Vil du lagre før du avslutter redigeringsmodus?", + "dialog.unsaved_new_file": "Du har ulagrede endringer. Vil du lagre før du oppretter en ny fil?", + "dialog.unsaved_open_file": "Du har ulagrede endringer. Vil du lagre før du åpner en ny fil?", + "dialog.unsaved_title": "Ulagrede endringer", + "drop_zone.text": "Slipp Markdown-filen din her", + "export.open": "Åpne", + "export.success": "PDF eksportert", + "format.block_type": "Blokktype", + "format.blockquote": "Sitatblokk", + "format.bold": "Fet ({mod}+B)", + "format.bullet_list": "Punktliste", + "format.code": "Innebygd kode ({mod}+E)", + "format.code_block": "Kodeblokk", + "format.divider": "Skillelinje", + "format.heading1": "Overskrift 1", + "format.heading2": "Overskrift 2", + "format.heading3": "Overskrift 3", + "format.italic": "Kursiv ({mod}+I)", + "format.link": "Lenke ({mod}+K)", + "format.lists": "Lister", + "format.more_elements": "Mer", + "format.numbered_list": "Nummerert liste", + "format.paragraph": "Avsnitt", + "format.strikethrough": "Gjennomstreking ({mod}+Shift+X)", + "format.table": "Tabell", + "format.task_list": "Oppgaveliste", + "format.text_formatting": "Tekstformatering", + "format.underline": "Understreking", + "help.editing": "Redigering", + "help.fallback_notice": "Denne siden er ennå ikke tilgjengelig på ditt språk. Viser den engelske versjonen.", + "help.features": "Funksjoner", + "help.getting_started": "Kom i gang", + "help.shortcuts": "Tastatursnarveier", + "lang_picker.filter_label": "Filtrer språk", + "lang_picker.filter_placeholder": "Filtrer språk...", + "lang_picker.plain_text": "Ren tekst", + "link.apply": "Bruk lenke", + "link.cancel": "Avbryt", + "link.display_text": "Visningstekst", + "link.edit": "Rediger", + "link.edit_link": "Rediger lenke", + "link.remove_link": "Fjern lenke", + "link.text": "Tekst", + "link.text_placeholder": "Visningstekst (valgfritt)", + "link.url": "URL", + "link.url_placeholder": "Lim inn eller skriv URL ...", + "mermaid.done": "Ferdig", + "mermaid.edit": "Rediger", + "mermaid.error_prefix": "Syntaksfeil", + "mermaid.stale": "Forhåndsvisning utdatert", + "recovery.discard": "Forkast", + "recovery.message": "Kern fant ulagrede endringer fra en tidligere økt. Vil du gjenopprette dem?", + "recovery.restore": "Gjenopprett", + "recovery.title": "Gjenopprette ulagrede endringer?", + "search.count": "treff", + "search.no_results": "Ingen resultater", + "search.placeholder": "Søk i dokumentet …", + "settings.language": "Språk", + "settings.theme": "Tema", + "settings.theme_dark": "Mørk", + "settings.theme_light": "Lys", + "settings.theme_system": "System", + "sidebar.no_headings": "Ingen overskrifter funnet", + "sidebar.recent": "Siste filer", + "sidebar.toc": "Innholdsfortegnelse", + "slash.blockquote": "Sitatblokk", + "slash.blockquote_desc": "Sitatblokk", + "slash.bullet_list": "Punktliste", + "slash.bullet_list_desc": "Uordnet liste", + "slash.code_block": "Kodeblokk", + "slash.code_block_desc": "Inngjerdet kode", + "slash.divider": "Skillelinje", + "slash.divider_desc": "Horisontal linje", + "slash.heading1": "Overskrift 1", + "slash.heading1_desc": "Stor overskrift", + "slash.heading2": "Overskrift 2", + "slash.heading2_desc": "Middels stor overskrift", + "slash.heading3": "Overskrift 3", + "slash.heading3_desc": "Liten overskrift", + "slash.mermaid": "Mermaid-diagram", + "slash.mermaid_desc": "Sett inn et diagram", + "slash.no_results": "Ingen resultater", + "slash.numbered_list": "Nummerert liste", + "slash.numbered_list_desc": "Ordnet liste", + "slash.paragraph": "Avsnitt", + "slash.paragraph_desc": "Vanlig tekst", + "slash.table": "Tabell", + "slash.table_desc": "3×3-tabell", + "slash.task_list": "Oppgaveliste", + "slash.task_list_desc": "Sjekkliste", + "table.add_col_left": "Legg til kolonne til venstre", + "table.add_col_right": "Legg til kolonne til høyre", + "table.add_row_above": "Legg til rad over", + "table.add_row_below": "Legg til rad under", + "table.col_options": "Alternativer for kolonne {n}", + "table.delete_col": "Slett kolonne", + "table.delete_row": "Slett rad", + "table.header": "Overskrift", + "table.insert_col_left": "Sett inn kolonne til venstre", + "table.insert_col_right": "Sett inn kolonne til høyre", + "table.insert_row_above": "Sett inn rad over", + "table.insert_row_below": "Sett inn rad under", + "table.new_row": "+ Ny rad", + "table.row_options": "Alternativer for rad {n}", + "toolbar.done": "Ferdig", + "toolbar.edit": "Rediger", + "toolbar.export_pdf": "Eksporter PDF", + "toolbar.focus": "Fokusmodus", + "toolbar.more": "Mer", + "toolbar.new_file": "Ny fil", + "toolbar.open": "Åpne fil", + "toolbar.save": "Lagre", + "toolbar.search": "Søk", + "toolbar.settings": "Innstillinger", + "toolbar.split_view": "Delt visning", + "toolbar.theme": "Bytt tema", + "toolbar.toc": "Innholdsfortegnelse", + "toolbar.zoom_in": "Zoom inn", + "toolbar.zoom_out": "Zoom ut", + "toolbar.zoom_reset": "Tilbakestill zoom", + "trial.days_remaining": "{days} dager igjen av prøveperioden", + "trial.expired_message": "Prøveperioden din har utløpt. Kjøp Kern for å fortsette å redigere.", + "trial.feature_edit": "Rediger Markdown med WYSIWYG og delt visning", + "trial.feature_export": "Eksporter til PDF", + "trial.feature_save": "Lagre og opprett nye filer", + "trial.one_time_purchase": "Engangskjøp. Ikke noe abonnement.", + "trial.purchase_button": "Kjøp Kern", + "trial.purchase_desc": "Få full tilgang til alle redigerings- og eksportfunksjoner med et engangskjøp.", + "trial.purchase_title": "Lås opp Kern", + "trial.purchasing": "Kjøper ...", + "trial.restore_purchases": "Gjenopprett kjøp", + "trial.restoring": "Gjenoppretter ...", + "viewer.copied": "Kopiert!", + "viewer.copy": "Kopier", + "welcome.drop_hint": "eller dra og slipp en .md-fil", + "welcome.new_button": "Ny fil", + "welcome.open_button": "Åpne fil", + "welcome.subtitle": "En vakker Markdown-fremviser", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/nl/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/nl/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nl/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/nl/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/nl/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nl/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/nl/strings.json b/src-mdviewer/src/md-nls-autogenerated/nl/strings.json new file mode 100644 index 0000000000..7ab249a23d --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/nl/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Zoeken sluiten", + "a11y.edit_link": "Link bewerken", + "a11y.format_text": "Tekst opmaken", + "a11y.insert_block": "Blok invoegen", + "a11y.main_toolbar": "Hoofdwerkbalk", + "a11y.next_match": "Volgende overeenkomst", + "a11y.previous_match": "Vorige overeenkomst", + "a11y.search_in_document": "Zoeken in document", + "a11y.search_text": "Tekst zoeken", + "a11y.select_language": "Taal selecteren", + "a11y.sidebar": "Zijbalk", + "a11y.skip_to_content": "Ga direct naar de inhoud", + "common.close": "Sluiten", + "common.file": "Bestand", + "common.open": "Openen", + "context.copy": "Kopiëren", + "context.copy_image_address": "Afbeeldingsadres kopiëren", + "context.copy_link": "Link kopiëren", + "context.cut": "Knippen", + "context.open_link": "Link openen", + "context.paste": "Plakken", + "context.paste_plain": "Plakken als platte tekst", + "context.select_all": "Alles selecteren", + "dialog.cancel": "Annuleren", + "dialog.discard": "Verwerpen", + "dialog.dont_save": "Niet opslaan", + "dialog.save": "Opslaan", + "dialog.unsaved_close": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u sluit?", + "dialog.unsaved_exit_edit": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u de bewerkingsmodus verlaat?", + "dialog.unsaved_new_file": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u een nieuw bestand aanmaakt?", + "dialog.unsaved_open_file": "U heeft niet-opgeslagen wijzigingen. Wilt u opslaan voordat u een nieuw bestand opent?", + "dialog.unsaved_title": "Niet-opgeslagen wijzigingen", + "drop_zone.text": "Sleep uw Markdown-bestand hierheen", + "export.open": "Openen", + "export.success": "PDF succesvol geëxporteerd", + "format.block_type": "Bloktype", + "format.blockquote": "Blokcitaat", + "format.bold": "Vet ({mod}+B)", + "format.bullet_list": "Opsommingslijst", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Codeblok", + "format.divider": "Scheidingslijn", + "format.heading1": "Kop 1", + "format.heading2": "Kop 2", + "format.heading3": "Kop 3", + "format.italic": "Cursief ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lijsten", + "format.more_elements": "Meer", + "format.numbered_list": "Genummerde lijst", + "format.paragraph": "Paragraaf", + "format.strikethrough": "Doorhalen ({mod}+Shift+X)", + "format.table": "Tabel", + "format.task_list": "Takenlijst", + "format.text_formatting": "Tekstopmaak", + "format.underline": "Onderstrepen", + "help.editing": "Bewerken", + "help.fallback_notice": "Deze pagina is nog niet beschikbaar in uw taal. De Engelse versie wordt getoond.", + "help.features": "Functies", + "help.getting_started": "Aan de slag", + "help.shortcuts": "Sneltoetsen", + "lang_picker.filter_label": "Talen filteren", + "lang_picker.filter_placeholder": "Talen filteren...", + "lang_picker.plain_text": "Platte tekst", + "link.apply": "Link toepassen", + "link.cancel": "Annuleren", + "link.display_text": "Weergavetekst", + "link.edit": "Bewerken", + "link.edit_link": "Link bewerken", + "link.remove_link": "Link verwijderen", + "link.text": "Tekst", + "link.text_placeholder": "Weergavetekst (optioneel)", + "link.url": "URL", + "link.url_placeholder": "Plak of typ een URL...", + "mermaid.done": "Klaar", + "mermaid.edit": "Bewerken", + "mermaid.error_prefix": "Syntaxfout", + "mermaid.stale": "Voorbeeld verouderd", + "recovery.discard": "Verwerpen", + "recovery.message": "Kern heeft niet-opgeslagen wijzigingen van een vorige sessie gevonden. Wilt u deze herstellen?", + "recovery.restore": "Herstellen", + "recovery.title": "Niet-opgeslagen wijzigingen herstellen?", + "search.count": "resultaten", + "search.no_results": "Geen resultaten", + "search.placeholder": "Zoeken in document...", + "settings.language": "Taal", + "settings.theme": "Thema", + "settings.theme_dark": "Donker", + "settings.theme_light": "Licht", + "settings.theme_system": "Systeem", + "sidebar.no_headings": "Geen koppen gevonden", + "sidebar.recent": "Recente bestanden", + "sidebar.toc": "Inhoudsopgave", + "slash.blockquote": "Citaatblok", + "slash.blockquote_desc": "Citaatblok", + "slash.bullet_list": "Opsommingslijst", + "slash.bullet_list_desc": "Ongesorteerde lijst", + "slash.code_block": "Codeblok", + "slash.code_block_desc": "Afgebakende code", + "slash.divider": "Scheidingslijn", + "slash.divider_desc": "Horizontale lijn", + "slash.heading1": "Kop 1", + "slash.heading1_desc": "Grote kop", + "slash.heading2": "Kop 2", + "slash.heading2_desc": "Middelgrote kop", + "slash.heading3": "Kop 3", + "slash.heading3_desc": "Kleine kop", + "slash.mermaid": "Mermaid-diagram", + "slash.mermaid_desc": "Voeg een diagram in", + "slash.no_results": "Geen resultaten", + "slash.numbered_list": "Genummerde lijst", + "slash.numbered_list_desc": "Geordende lijst", + "slash.paragraph": "Paragraaf", + "slash.paragraph_desc": "Platte tekst", + "slash.table": "Tabel", + "slash.table_desc": "3×3 tabel", + "slash.task_list": "Takenlijst", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Kolom links toevoegen", + "table.add_col_right": "Kolom rechts toevoegen", + "table.add_row_above": "Rij boven toevoegen", + "table.add_row_below": "Rij onder toevoegen", + "table.col_options": "Kolom {n} opties", + "table.delete_col": "Kolom verwijderen", + "table.delete_row": "Rij verwijderen", + "table.header": "Koptekst", + "table.insert_col_left": "Kolom links invoegen", + "table.insert_col_right": "Kolom rechts invoegen", + "table.insert_row_above": "Rij boven invoegen", + "table.insert_row_below": "Rij onder invoegen", + "table.new_row": "+ Nieuwe rij", + "table.row_options": "Opties voor rij {n}", + "toolbar.done": "Klaar", + "toolbar.edit": "Bewerken", + "toolbar.export_pdf": "Exporteer PDF", + "toolbar.focus": "Focusmodus", + "toolbar.more": "Meer", + "toolbar.new_file": "Nieuw bestand", + "toolbar.open": "Bestand openen", + "toolbar.save": "Opslaan", + "toolbar.search": "Zoeken", + "toolbar.settings": "Instellingen", + "toolbar.split_view": "Gesplitste weergave", + "toolbar.theme": "Thema wisselen", + "toolbar.toc": "Inhoudsopgave", + "toolbar.zoom_in": "Inzoomen", + "toolbar.zoom_out": "Uitzoomen", + "toolbar.zoom_reset": "Zoom herstellen", + "trial.days_remaining": "Nog {days} dagen in proefperiode", + "trial.expired_message": "Uw proefperiode is verlopen. Koop Kern om door te gaan met bewerken.", + "trial.feature_edit": "Markdown bewerken met WYSIWYG en gesplitste weergave", + "trial.feature_export": "Exporteren naar PDF", + "trial.feature_save": "Bestanden opslaan en aanmaken", + "trial.one_time_purchase": "Eenmalige aankoop. Geen abonnement.", + "trial.purchase_button": "Koop Kern", + "trial.purchase_desc": "Krijg volledige toegang tot alle bewerkings- en exportfuncties met een eenmalige aankoop.", + "trial.purchase_title": "Ontgrendel Kern", + "trial.purchasing": "Aankopen...", + "trial.restore_purchases": "Aankopen herstellen", + "trial.restoring": "Herstellen...", + "viewer.copied": "Gekopieerd!", + "viewer.copy": "Kopiëren", + "welcome.drop_hint": "of sleep een .md-bestand hierheen", + "welcome.new_button": "Nieuw bestand", + "welcome.open_button": "Bestand openen", + "welcome.subtitle": "Een prachtige Markdown-viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pl/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/pl/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pl/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/pl/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/pl/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pl/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pl/strings.json b/src-mdviewer/src/md-nls-autogenerated/pl/strings.json new file mode 100644 index 0000000000..41dda94b20 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pl/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Zamknij wyszukiwanie", + "a11y.edit_link": "Edytuj link", + "a11y.format_text": "Formatuj tekst", + "a11y.insert_block": "Wstaw blok", + "a11y.main_toolbar": "Główny pasek narzędzi", + "a11y.next_match": "Następny wynik", + "a11y.previous_match": "Poprzedni wynik", + "a11y.search_in_document": "Szukaj w dokumencie", + "a11y.search_text": "Wyszukaj tekst", + "a11y.select_language": "Wybierz język", + "a11y.sidebar": "Pasek boczny", + "a11y.skip_to_content": "Przejdź do treści", + "common.close": "Zamknij", + "common.file": "Plik", + "common.open": "Otwórz", + "context.copy": "Kopiuj", + "context.copy_image_address": "Kopiuj adres obrazka", + "context.copy_link": "Kopiuj link", + "context.cut": "Wytnij", + "context.open_link": "Otwórz link", + "context.paste": "Wklej", + "context.paste_plain": "Wklej jako zwykły tekst", + "context.select_all": "Zaznacz wszystko", + "dialog.cancel": "Anuluj", + "dialog.discard": "Odrzuć", + "dialog.dont_save": "Nie zapisuj", + "dialog.save": "Zapisz", + "dialog.unsaved_close": "Masz niezapisane zmiany. Czy chcesz je zapisać przed zamknięciem?", + "dialog.unsaved_exit_edit": "Masz niezapisane zmiany. Czy chcesz je zapisać przed wyjściem z trybu edycji?", + "dialog.unsaved_new_file": "Masz niezapisane zmiany. Czy chcesz je zapisać przed utworzeniem nowego pliku?", + "dialog.unsaved_open_file": "Masz niezapisane zmiany. Czy chcesz je zapisać przed otwarciem nowego pliku?", + "dialog.unsaved_title": "Niezapisane zmiany", + "drop_zone.text": "Upuść tutaj swój plik Markdown", + "export.open": "Otwórz", + "export.success": "Plik PDF został pomyślnie wyeksportowany", + "format.block_type": "Typ bloku", + "format.blockquote": "Cytat blokowy", + "format.bold": "Pogrubienie ({mod}+B)", + "format.bullet_list": "Lista wypunktowana", + "format.code": "Kod w tekście ({mod}+E)", + "format.code_block": "Blok kodu", + "format.divider": "Separator", + "format.heading1": "Nagłówek 1", + "format.heading2": "Nagłówek 2", + "format.heading3": "Nagłówek 3", + "format.italic": "Kursywa ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Listy", + "format.more_elements": "Więcej", + "format.numbered_list": "Lista numerowana", + "format.paragraph": "Akapit", + "format.strikethrough": "Przekreślenie ({mod}+Shift+X)", + "format.table": "Tabela", + "format.task_list": "Lista zadań", + "format.text_formatting": "Formatowanie tekstu", + "format.underline": "Podkreślenie", + "help.editing": "Edycja", + "help.fallback_notice": "Ta strona nie jest jeszcze dostępna w Twoim języku. Wyświetlana jest wersja angielska.", + "help.features": "Funkcje", + "help.getting_started": "Pierwsze kroki", + "help.shortcuts": "Skróty klawiszowe", + "lang_picker.filter_label": "Filtruj języki", + "lang_picker.filter_placeholder": "Filtruj języki...", + "lang_picker.plain_text": "Zwykły tekst", + "link.apply": "Zastosuj", + "link.cancel": "Anuluj", + "link.display_text": "Wyświetlany tekst", + "link.edit": "Edytuj", + "link.edit_link": "Edytuj link", + "link.remove_link": "Usuń link", + "link.text": "Tekst", + "link.text_placeholder": "Wyświetlany tekst (opcjonalnie)", + "link.url": "URL", + "link.url_placeholder": "Wklej lub wpisz adres URL...", + "mermaid.done": "Gotowe", + "mermaid.edit": "Edytuj", + "mermaid.error_prefix": "Błąd składni", + "mermaid.stale": "Podgląd nieaktualny", + "recovery.discard": "Odrzuć", + "recovery.message": "Aplikacja Kern znalazła niezapisane zmiany z poprzedniej sesji. Czy chcesz je przywrócić?", + "recovery.restore": "Przywróć", + "recovery.title": "Przywrócić niezapisane zmiany?", + "search.count": "wyników", + "search.no_results": "Brak wyników", + "search.placeholder": "Szukaj w dokumencie...", + "settings.language": "Język", + "settings.theme": "Motyw", + "settings.theme_dark": "Ciemny", + "settings.theme_light": "Jasny", + "settings.theme_system": "Systemowy", + "sidebar.no_headings": "Nie znaleziono nagłówków", + "sidebar.recent": "Ostatnie pliki", + "sidebar.toc": "Spis treści", + "slash.blockquote": "Cytat blokowy", + "slash.blockquote_desc": "Blok cytatu", + "slash.bullet_list": "Lista wypunktowana", + "slash.bullet_list_desc": "Lista nieuporządkowana", + "slash.code_block": "Blok kodu", + "slash.code_block_desc": "Kod sformatowany", + "slash.divider": "Linia pozioma", + "slash.divider_desc": "Linia pozioma", + "slash.heading1": "Nagłówek 1", + "slash.heading1_desc": "Duży nagłówek", + "slash.heading2": "Nagłówek 2", + "slash.heading2_desc": "Średni nagłówek", + "slash.heading3": "Nagłówek 3", + "slash.heading3_desc": "Mały nagłówek", + "slash.mermaid": "Diagram Mermaid", + "slash.mermaid_desc": "Wstaw diagram", + "slash.no_results": "Brak wyników", + "slash.numbered_list": "Lista numerowana", + "slash.numbered_list_desc": "Lista uporządkowana", + "slash.paragraph": "Akapit", + "slash.paragraph_desc": "Zwykły tekst", + "slash.table": "Tabela", + "slash.table_desc": "Tabela 3×3", + "slash.task_list": "Lista zadań", + "slash.task_list_desc": "Lista kontrolna", + "table.add_col_left": "Dodaj kolumnę po lewej", + "table.add_col_right": "Dodaj kolumnę po prawej", + "table.add_row_above": "Dodaj wiersz powyżej", + "table.add_row_below": "Dodaj wiersz poniżej", + "table.col_options": "Opcje kolumny {n}", + "table.delete_col": "Usuń kolumnę", + "table.delete_row": "Usuń wiersz", + "table.header": "Nagłówek", + "table.insert_col_left": "Wstaw kolumnę po lewej", + "table.insert_col_right": "Wstaw kolumnę po prawej", + "table.insert_row_above": "Wstaw wiersz powyżej", + "table.insert_row_below": "Wstaw wiersz poniżej", + "table.new_row": "+ Nowy wiersz", + "table.row_options": "Opcje wiersza {n}", + "toolbar.done": "Gotowe", + "toolbar.edit": "Edytuj", + "toolbar.export_pdf": "Eksportuj PDF", + "toolbar.focus": "Tryb skupienia", + "toolbar.more": "Więcej", + "toolbar.new_file": "Nowy plik", + "toolbar.open": "Otwórz plik", + "toolbar.save": "Zapisz", + "toolbar.search": "Szukaj", + "toolbar.settings": "Ustawienia", + "toolbar.split_view": "Widok podzielony", + "toolbar.theme": "Przełącz motyw", + "toolbar.toc": "Spis treści", + "toolbar.zoom_in": "Powiększ", + "toolbar.zoom_out": "Pomniejsz", + "toolbar.zoom_reset": "Resetuj powiększenie", + "trial.days_remaining": "Pozostało {days} dni okresu próbnego", + "trial.expired_message": "Twój okres próbny wygasł. Kup Kern, aby kontynuować edycję.", + "trial.feature_edit": "Edytuj Markdown w trybie WYSIWYG i widoku podzielonym", + "trial.feature_export": "Eksport do PDF", + "trial.feature_save": "Zapisuj i twórz nowe pliki", + "trial.one_time_purchase": "Jednorazowy zakup. Bez subskrypcji.", + "trial.purchase_button": "Kup Kern", + "trial.purchase_desc": "Uzyskaj pełny dostęp do wszystkich funkcji edycji i eksportu dzięki jednorazowemu zakupowi.", + "trial.purchase_title": "Odblokuj Kern", + "trial.purchasing": "Kupowanie...", + "trial.restore_purchases": "Przywróć zakupy", + "trial.restoring": "Przywracanie...", + "viewer.copied": "Skopiowano!", + "viewer.copy": "Kopiuj", + "welcome.drop_hint": "lub przeciągnij i upuść plik .md", + "welcome.new_button": "Nowy plik", + "welcome.open_button": "Otwórz plik", + "welcome.subtitle": "Piękna przeglądarka Markdown", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-br/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/pt-br/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-br/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-br/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/pt-br/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-br/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-br/strings.json b/src-mdviewer/src/md-nls-autogenerated/pt-br/strings.json new file mode 100644 index 0000000000..02bf511aa5 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-br/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Fechar pesquisa", + "a11y.edit_link": "Editar link", + "a11y.format_text": "Formatar texto", + "a11y.insert_block": "Inserir bloco", + "a11y.main_toolbar": "Barra de ferramentas principal", + "a11y.next_match": "Próximo resultado", + "a11y.previous_match": "Resultado anterior", + "a11y.search_in_document": "Pesquisar no documento", + "a11y.search_text": "Pesquisar texto", + "a11y.select_language": "Selecionar linguagem", + "a11y.sidebar": "Barra lateral", + "a11y.skip_to_content": "Pular para o conteúdo", + "common.close": "Fechar", + "common.file": "Arquivo", + "common.open": "Abrir", + "context.copy": "Copiar", + "context.copy_image_address": "Copiar endereço da imagem", + "context.copy_link": "Copiar link", + "context.cut": "Recortar", + "context.open_link": "Abrir link", + "context.paste": "Colar", + "context.paste_plain": "Colar como texto simples", + "context.select_all": "Selecionar tudo", + "dialog.cancel": "Cancelar", + "dialog.discard": "Descartar", + "dialog.dont_save": "Não salvar", + "dialog.save": "Salvar", + "dialog.unsaved_close": "Você tem alterações não salvas. Deseja salvar antes de fechar?", + "dialog.unsaved_exit_edit": "Você tem alterações não salvas. Deseja salvar antes de sair do modo de edição?", + "dialog.unsaved_new_file": "Você tem alterações não salvas. Deseja salvar antes de criar um novo arquivo?", + "dialog.unsaved_open_file": "Você tem alterações não salvas. Deseja salvar antes de abrir um novo arquivo?", + "dialog.unsaved_title": "Alterações não salvas", + "drop_zone.text": "Solte seu arquivo Markdown aqui", + "export.open": "Abrir", + "export.success": "PDF exportado com sucesso", + "format.blockquote": "Citação", + "format.bold": "Negrito ({mod}+B)", + "format.bullet_list": "Lista com marcadores", + "format.code": "Código inline ({mod}+E)", + "format.code_block": "Bloco de código", + "format.divider": "Divisor", + "format.heading1": "Título 1", + "format.heading2": "Título 2", + "format.heading3": "Título 3", + "format.italic": "Itálico ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.numbered_list": "Lista numerada", + "format.paragraph": "Parágrafo", + "format.strikethrough": "Tachado ({mod}+Shift+X)", + "format.table": "Tabela", + "format.task_list": "Lista de tarefas", + "help.editing": "Edição", + "help.fallback_notice": "Esta página ainda não está disponível no seu idioma. Exibindo a versão em inglês.", + "help.features": "Funcionalidades", + "help.getting_started": "Primeiros passos", + "help.shortcuts": "Atalhos de teclado", + "lang_picker.filter_label": "Filtrar linguagens", + "lang_picker.filter_placeholder": "Filtrar linguagens...", + "lang_picker.plain_text": "Texto simples", + "link.apply": "Aplicar link", + "link.cancel": "Cancelar", + "link.display_text": "Texto de exibição", + "link.edit": "Editar", + "link.edit_link": "Editar link", + "link.remove_link": "Remover link", + "link.text": "Texto", + "link.text_placeholder": "Texto de exibição (opcional)", + "link.url": "URL", + "link.url_placeholder": "Cole ou digite a URL...", + "recovery.discard": "Descartar", + "recovery.message": "O Kern encontrou alterações não salvas de uma sessão anterior. Deseja restaurá-las?", + "recovery.restore": "Restaurar", + "recovery.title": "Recuperar alterações não salvas?", + "search.count": "resultados", + "search.no_results": "Sem resultados", + "search.placeholder": "Pesquisar no documento...", + "settings.language": "Idioma", + "settings.theme": "Tema", + "settings.theme_dark": "Escuro", + "settings.theme_light": "Claro", + "settings.theme_system": "Sistema", + "sidebar.no_headings": "Nenhum título encontrado", + "sidebar.recent": "Arquivos recentes", + "sidebar.toc": "Sumário", + "slash.blockquote": "Citação", + "slash.blockquote_desc": "Bloco de citação", + "slash.bullet_list": "Lista com marcadores", + "slash.bullet_list_desc": "Lista não ordenada", + "slash.code_block": "Bloco de código", + "slash.code_block_desc": "Código delimitado", + "slash.divider": "Divisor", + "slash.divider_desc": "Linha horizontal", + "slash.heading1": "Título 1", + "slash.heading1_desc": "Título grande", + "slash.heading2": "Título 2", + "slash.heading2_desc": "Título médio", + "slash.heading3": "Título 3", + "slash.heading3_desc": "Título pequeno", + "slash.no_results": "Sem resultados", + "slash.numbered_list": "Lista numerada", + "slash.numbered_list_desc": "Lista ordenada", + "slash.paragraph": "Parágrafo", + "slash.paragraph_desc": "Texto simples", + "slash.table": "Tabela", + "slash.table_desc": "Tabela 3×3", + "slash.task_list": "Lista de tarefas", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Adicionar coluna à esquerda", + "table.add_col_right": "Adicionar coluna à direita", + "table.add_row_above": "Adicionar linha acima", + "table.add_row_below": "Adicionar linha abaixo", + "table.col_options": "Opções da coluna {n}", + "table.delete_col": "Excluir coluna", + "table.delete_row": "Excluir linha", + "table.header": "Cabeçalho", + "table.insert_col_left": "Inserir coluna à esquerda", + "table.insert_col_right": "Inserir coluna à direita", + "table.insert_row_above": "Inserir linha acima", + "table.insert_row_below": "Inserir linha abaixo", + "table.new_row": "+ Nova linha", + "table.row_options": "Opções da linha {n}", + "toolbar.edit": "Editar", + "toolbar.export_pdf": "Exportar PDF", + "toolbar.focus": "Modo foco", + "toolbar.more": "Mais", + "toolbar.new_file": "Novo arquivo", + "toolbar.open": "Abrir arquivo", + "toolbar.save": "Salvar", + "toolbar.search": "Pesquisar", + "toolbar.settings": "Configurações", + "toolbar.split_view": "Vista dividida", + "toolbar.theme": "Alternar tema", + "toolbar.toc": "Sumário", + "toolbar.zoom_in": "Aumentar zoom", + "toolbar.zoom_out": "Diminuir zoom", + "toolbar.zoom_reset": "Redefinir zoom", + "trial.days_remaining": "{days} dias restantes no período de teste", + "trial.expired_message": "Seu período de teste expirou. Compre o Kern para continuar editando.", + "trial.feature_edit": "Edite Markdown com WYSIWYG e vista dividida", + "trial.feature_export": "Exportar para PDF", + "trial.feature_save": "Salve e crie novos arquivos", + "trial.one_time_purchase": "Compra única. Sem assinatura.", + "trial.purchase_button": "Comprar Kern", + "trial.purchase_desc": "Tenha acesso completo a todos os recursos de edição e exportação com uma compra única.", + "trial.purchase_title": "Desbloquear Kern", + "trial.purchasing": "Comprando...", + "trial.restore_purchases": "Restaurar compras", + "trial.restoring": "Restaurando...", + "viewer.copied": "Copiado!", + "viewer.copy": "Copiar", + "welcome.drop_hint": "ou arraste e solte um arquivo .md", + "welcome.new_button": "Novo arquivo", + "welcome.open_button": "Abrir arquivo", + "welcome.subtitle": "Um belo visualizador Markdown", + "welcome.title": "Kern", + "format.block_type": "Tipo de bloco", + "format.lists": "Listas", + "format.more_elements": "Mais", + "format.text_formatting": "Formatação de texto", + "format.underline": "Sublinhado", + "mermaid.done": "Concluído", + "mermaid.edit": "Editar", + "mermaid.error_prefix": "Erro de sintaxe", + "mermaid.stale": "Pré-visualização desatualizada", + "slash.mermaid": "Diagrama Mermaid", + "slash.mermaid_desc": "Inserir um diagrama", + "toolbar.done": "Concluído" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-pt/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/pt-pt/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-pt/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-pt/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/pt-pt/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-pt/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/pt-pt/strings.json b/src-mdviewer/src/md-nls-autogenerated/pt-pt/strings.json new file mode 100644 index 0000000000..02bf511aa5 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/pt-pt/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Fechar pesquisa", + "a11y.edit_link": "Editar link", + "a11y.format_text": "Formatar texto", + "a11y.insert_block": "Inserir bloco", + "a11y.main_toolbar": "Barra de ferramentas principal", + "a11y.next_match": "Próximo resultado", + "a11y.previous_match": "Resultado anterior", + "a11y.search_in_document": "Pesquisar no documento", + "a11y.search_text": "Pesquisar texto", + "a11y.select_language": "Selecionar linguagem", + "a11y.sidebar": "Barra lateral", + "a11y.skip_to_content": "Pular para o conteúdo", + "common.close": "Fechar", + "common.file": "Arquivo", + "common.open": "Abrir", + "context.copy": "Copiar", + "context.copy_image_address": "Copiar endereço da imagem", + "context.copy_link": "Copiar link", + "context.cut": "Recortar", + "context.open_link": "Abrir link", + "context.paste": "Colar", + "context.paste_plain": "Colar como texto simples", + "context.select_all": "Selecionar tudo", + "dialog.cancel": "Cancelar", + "dialog.discard": "Descartar", + "dialog.dont_save": "Não salvar", + "dialog.save": "Salvar", + "dialog.unsaved_close": "Você tem alterações não salvas. Deseja salvar antes de fechar?", + "dialog.unsaved_exit_edit": "Você tem alterações não salvas. Deseja salvar antes de sair do modo de edição?", + "dialog.unsaved_new_file": "Você tem alterações não salvas. Deseja salvar antes de criar um novo arquivo?", + "dialog.unsaved_open_file": "Você tem alterações não salvas. Deseja salvar antes de abrir um novo arquivo?", + "dialog.unsaved_title": "Alterações não salvas", + "drop_zone.text": "Solte seu arquivo Markdown aqui", + "export.open": "Abrir", + "export.success": "PDF exportado com sucesso", + "format.blockquote": "Citação", + "format.bold": "Negrito ({mod}+B)", + "format.bullet_list": "Lista com marcadores", + "format.code": "Código inline ({mod}+E)", + "format.code_block": "Bloco de código", + "format.divider": "Divisor", + "format.heading1": "Título 1", + "format.heading2": "Título 2", + "format.heading3": "Título 3", + "format.italic": "Itálico ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.numbered_list": "Lista numerada", + "format.paragraph": "Parágrafo", + "format.strikethrough": "Tachado ({mod}+Shift+X)", + "format.table": "Tabela", + "format.task_list": "Lista de tarefas", + "help.editing": "Edição", + "help.fallback_notice": "Esta página ainda não está disponível no seu idioma. Exibindo a versão em inglês.", + "help.features": "Funcionalidades", + "help.getting_started": "Primeiros passos", + "help.shortcuts": "Atalhos de teclado", + "lang_picker.filter_label": "Filtrar linguagens", + "lang_picker.filter_placeholder": "Filtrar linguagens...", + "lang_picker.plain_text": "Texto simples", + "link.apply": "Aplicar link", + "link.cancel": "Cancelar", + "link.display_text": "Texto de exibição", + "link.edit": "Editar", + "link.edit_link": "Editar link", + "link.remove_link": "Remover link", + "link.text": "Texto", + "link.text_placeholder": "Texto de exibição (opcional)", + "link.url": "URL", + "link.url_placeholder": "Cole ou digite a URL...", + "recovery.discard": "Descartar", + "recovery.message": "O Kern encontrou alterações não salvas de uma sessão anterior. Deseja restaurá-las?", + "recovery.restore": "Restaurar", + "recovery.title": "Recuperar alterações não salvas?", + "search.count": "resultados", + "search.no_results": "Sem resultados", + "search.placeholder": "Pesquisar no documento...", + "settings.language": "Idioma", + "settings.theme": "Tema", + "settings.theme_dark": "Escuro", + "settings.theme_light": "Claro", + "settings.theme_system": "Sistema", + "sidebar.no_headings": "Nenhum título encontrado", + "sidebar.recent": "Arquivos recentes", + "sidebar.toc": "Sumário", + "slash.blockquote": "Citação", + "slash.blockquote_desc": "Bloco de citação", + "slash.bullet_list": "Lista com marcadores", + "slash.bullet_list_desc": "Lista não ordenada", + "slash.code_block": "Bloco de código", + "slash.code_block_desc": "Código delimitado", + "slash.divider": "Divisor", + "slash.divider_desc": "Linha horizontal", + "slash.heading1": "Título 1", + "slash.heading1_desc": "Título grande", + "slash.heading2": "Título 2", + "slash.heading2_desc": "Título médio", + "slash.heading3": "Título 3", + "slash.heading3_desc": "Título pequeno", + "slash.no_results": "Sem resultados", + "slash.numbered_list": "Lista numerada", + "slash.numbered_list_desc": "Lista ordenada", + "slash.paragraph": "Parágrafo", + "slash.paragraph_desc": "Texto simples", + "slash.table": "Tabela", + "slash.table_desc": "Tabela 3×3", + "slash.task_list": "Lista de tarefas", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Adicionar coluna à esquerda", + "table.add_col_right": "Adicionar coluna à direita", + "table.add_row_above": "Adicionar linha acima", + "table.add_row_below": "Adicionar linha abaixo", + "table.col_options": "Opções da coluna {n}", + "table.delete_col": "Excluir coluna", + "table.delete_row": "Excluir linha", + "table.header": "Cabeçalho", + "table.insert_col_left": "Inserir coluna à esquerda", + "table.insert_col_right": "Inserir coluna à direita", + "table.insert_row_above": "Inserir linha acima", + "table.insert_row_below": "Inserir linha abaixo", + "table.new_row": "+ Nova linha", + "table.row_options": "Opções da linha {n}", + "toolbar.edit": "Editar", + "toolbar.export_pdf": "Exportar PDF", + "toolbar.focus": "Modo foco", + "toolbar.more": "Mais", + "toolbar.new_file": "Novo arquivo", + "toolbar.open": "Abrir arquivo", + "toolbar.save": "Salvar", + "toolbar.search": "Pesquisar", + "toolbar.settings": "Configurações", + "toolbar.split_view": "Vista dividida", + "toolbar.theme": "Alternar tema", + "toolbar.toc": "Sumário", + "toolbar.zoom_in": "Aumentar zoom", + "toolbar.zoom_out": "Diminuir zoom", + "toolbar.zoom_reset": "Redefinir zoom", + "trial.days_remaining": "{days} dias restantes no período de teste", + "trial.expired_message": "Seu período de teste expirou. Compre o Kern para continuar editando.", + "trial.feature_edit": "Edite Markdown com WYSIWYG e vista dividida", + "trial.feature_export": "Exportar para PDF", + "trial.feature_save": "Salve e crie novos arquivos", + "trial.one_time_purchase": "Compra única. Sem assinatura.", + "trial.purchase_button": "Comprar Kern", + "trial.purchase_desc": "Tenha acesso completo a todos os recursos de edição e exportação com uma compra única.", + "trial.purchase_title": "Desbloquear Kern", + "trial.purchasing": "Comprando...", + "trial.restore_purchases": "Restaurar compras", + "trial.restoring": "Restaurando...", + "viewer.copied": "Copiado!", + "viewer.copy": "Copiar", + "welcome.drop_hint": "ou arraste e solte um arquivo .md", + "welcome.new_button": "Novo arquivo", + "welcome.open_button": "Abrir arquivo", + "welcome.subtitle": "Um belo visualizador Markdown", + "welcome.title": "Kern", + "format.block_type": "Tipo de bloco", + "format.lists": "Listas", + "format.more_elements": "Mais", + "format.text_formatting": "Formatação de texto", + "format.underline": "Sublinhado", + "mermaid.done": "Concluído", + "mermaid.edit": "Editar", + "mermaid.error_prefix": "Erro de sintaxe", + "mermaid.stale": "Pré-visualização desatualizada", + "slash.mermaid": "Diagrama Mermaid", + "slash.mermaid_desc": "Inserir um diagrama", + "toolbar.done": "Concluído" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ro/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ro/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ro/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ro/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ro/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ro/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ro/strings.json b/src-mdviewer/src/md-nls-autogenerated/ro/strings.json new file mode 100644 index 0000000000..1a5e69d889 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ro/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Închide căutarea", + "a11y.edit_link": "Editează linkul", + "a11y.format_text": "Formatează textul", + "a11y.insert_block": "Inserează bloc", + "a11y.main_toolbar": "Bară de unelte principală", + "a11y.next_match": "Rezultatul următor", + "a11y.previous_match": "Rezultatul anterior", + "a11y.search_in_document": "Caută în document", + "a11y.search_text": "Caută text", + "a11y.select_language": "Selectează limba", + "a11y.sidebar": "Bară laterală", + "a11y.skip_to_content": "Sari la conținut", + "common.close": "Închide", + "common.file": "Fișier", + "common.open": "Deschide", + "context.copy": "Copiază", + "context.copy_image_address": "Copiază adresa imaginii", + "context.copy_link": "Copiază linkul", + "context.cut": "Taie", + "context.open_link": "Deschide linkul", + "context.paste": "Lipire", + "context.paste_plain": "Lipire ca text simplu", + "context.select_all": "Selectare totală", + "dialog.cancel": "Anulare", + "dialog.discard": "Renunță", + "dialog.dont_save": "Nu salva", + "dialog.save": "Salvare", + "dialog.unsaved_close": "Aveți modificări nesalvate. Doriți să salvați înainte de a închide?", + "dialog.unsaved_exit_edit": "Aveți modificări nesalvate. Doriți să salvați înainte de a ieși din modul de editare?", + "dialog.unsaved_new_file": "Aveți modificări nesalvate. Doriți să salvați înainte de a crea un fișier nou?", + "dialog.unsaved_open_file": "Aveți modificări nesalvate. Doriți să salvați înainte de a deschide un fișier nou?", + "dialog.unsaved_title": "Modificări nesalvate", + "drop_zone.text": "Trageți fișierul Markdown aici", + "export.open": "Deschide", + "export.success": "PDF exportat cu succes", + "format.block_type": "Tip de bloc", + "format.blockquote": "Citat bloc", + "format.bold": "Aldin ({mod}+B)", + "format.bullet_list": "Listă cu puncte", + "format.code": "Cod inline ({mod}+E)", + "format.code_block": "Bloc de cod", + "format.divider": "Separator", + "format.heading1": "Titlu 1", + "format.heading2": "Titlu 2", + "format.heading3": "Titlu 3", + "format.italic": "Cursiv ({mod}+I)", + "format.link": "Legătură ({mod}+K)", + "format.lists": "Liste", + "format.more_elements": "Mai multe", + "format.numbered_list": "Listă numerotată", + "format.paragraph": "Paragraf", + "format.strikethrough": "Tăiat ({mod}+Shift+X)", + "format.table": "Tabel", + "format.task_list": "Listă de sarcini", + "format.text_formatting": "Formatare text", + "format.underline": "Subliniat", + "help.editing": "Editare", + "help.fallback_notice": "Această pagină nu este încă disponibilă în limba dumneavoastră. Se afișează versiunea în limba engleză.", + "help.features": "Funcționalități", + "help.getting_started": "Noțiuni introductive", + "help.shortcuts": "Scurtături de la tastatură", + "lang_picker.filter_label": "Filtrează limbile", + "lang_picker.filter_placeholder": "Filtrează limbile...", + "lang_picker.plain_text": "Text simplu", + "link.apply": "Aplică linkul", + "link.cancel": "Anulează", + "link.display_text": "Text afișat", + "link.edit": "Editează", + "link.edit_link": "Editează linkul", + "link.remove_link": "Elimină linkul", + "link.text": "Text", + "link.text_placeholder": "Text de afișat (opțional)", + "link.url": "URL", + "link.url_placeholder": "Lipiți sau tastați URL-ul...", + "mermaid.done": "Gata", + "mermaid.edit": "Editați", + "mermaid.error_prefix": "Eroare de sintaxă", + "mermaid.stale": "Previzualizare învechită", + "recovery.discard": "Renunțați", + "recovery.message": "Kern a găsit modificări nesalvate dintr-o sesiune anterioară. Doriți să le restaurați?", + "recovery.restore": "Restaurează", + "recovery.title": "Recuperați modificările nesalvate?", + "search.count": "potriviri", + "search.no_results": "Niciun rezultat", + "search.placeholder": "Căutați în document...", + "settings.language": "Limbă", + "settings.theme": "Temă", + "settings.theme_dark": "Întunecat", + "settings.theme_light": "Luminos", + "settings.theme_system": "Sistem", + "sidebar.no_headings": "Nu s-au găsit titluri", + "sidebar.recent": "Fișiere recente", + "sidebar.toc": "Cuprins", + "slash.blockquote": "Citat", + "slash.blockquote_desc": "Bloc de citat", + "slash.bullet_list": "Listă cu puncte", + "slash.bullet_list_desc": "Listă neordonată", + "slash.code_block": "Bloc de cod", + "slash.code_block_desc": "Cod delimitat", + "slash.divider": "Separator", + "slash.divider_desc": "Linie orizontală", + "slash.heading1": "Titlu 1", + "slash.heading1_desc": "Titlu mare", + "slash.heading2": "Titlu 2", + "slash.heading2_desc": "Titlu mediu", + "slash.heading3": "Titlu 3", + "slash.heading3_desc": "Titlu mic", + "slash.mermaid": "Diagramă Mermaid", + "slash.mermaid_desc": "Inserează o diagramă", + "slash.no_results": "Niciun rezultat", + "slash.numbered_list": "Listă numerotată", + "slash.numbered_list_desc": "Listă ordonată", + "slash.paragraph": "Paragraf", + "slash.paragraph_desc": "Text simplu", + "slash.table": "Tabel", + "slash.table_desc": "Tabel 3×3", + "slash.task_list": "Listă de sarcini", + "slash.task_list_desc": "Listă de verificare", + "table.add_col_left": "Adaugă coloană la stânga", + "table.add_col_right": "Adaugă coloană la dreapta", + "table.add_row_above": "Adaugă rând deasupra", + "table.add_row_below": "Adaugă rând dedesubt", + "table.col_options": "Opțiuni coloană {n}", + "table.delete_col": "Șterge coloana", + "table.delete_row": "Șterge rândul", + "table.header": "Antet", + "table.insert_col_left": "Inserează coloană la stânga", + "table.insert_col_right": "Inserează coloană la dreapta", + "table.insert_row_above": "Inserează rând deasupra", + "table.insert_row_below": "Inserează rând dedesubt", + "table.new_row": "+ Rând nou", + "table.row_options": "Opțiuni rând {n}", + "toolbar.done": "Gata", + "toolbar.edit": "Editare", + "toolbar.export_pdf": "Exportare PDF", + "toolbar.focus": "Mod Concentrare", + "toolbar.more": "Mai multe", + "toolbar.new_file": "Fișier nou", + "toolbar.open": "Deschide fișier", + "toolbar.save": "Salvare", + "toolbar.search": "Căutare", + "toolbar.settings": "Setări", + "toolbar.split_view": "Vizualizare divizată", + "toolbar.theme": "Comutare temă", + "toolbar.toc": "Cuprins", + "toolbar.zoom_in": "Mărire", + "toolbar.zoom_out": "Micșorare", + "toolbar.zoom_reset": "Resetare zoom", + "trial.days_remaining": "{days} zile rămase din perioada de probă", + "trial.expired_message": "Perioada de probă a expirat. Cumpărați Kern pentru a continua editarea.", + "trial.feature_edit": "Editează Markdown cu WYSIWYG și vizualizare divizată", + "trial.feature_export": "Exportă în PDF", + "trial.feature_save": "Salvează și creează fișiere noi", + "trial.one_time_purchase": "Achiziție unică. Fără abonament.", + "trial.purchase_button": "Cumpără Kern", + "trial.purchase_desc": "Obține acces complet la toate funcționalitățile de editare și export cu o achiziție unică.", + "trial.purchase_title": "Deblochează Kern", + "trial.purchasing": "Se achiziționează...", + "trial.restore_purchases": "Restaurează achizițiile", + "trial.restoring": "Se restaurează...", + "viewer.copied": "Copiat!", + "viewer.copy": "Copiază", + "welcome.drop_hint": "sau trageți și plasați un fișier .md", + "welcome.new_button": "Fișier nou", + "welcome.open_button": "Deschide fișier", + "welcome.subtitle": "Un vizualizator Markdown frumos", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/root/README.md b/src-mdviewer/src/md-nls-autogenerated/root/README.md new file mode 100644 index 0000000000..013327407b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/root/README.md @@ -0,0 +1,12 @@ +# DO NOT EDIT FILES IN THIS DIRECTORY + +These files are auto-generated by `gulp translateStrings`. + +The source of truth for English strings is: +**`src-mdviewer/src/locales/en.json`** + +To add or change strings: +1. Edit `src-mdviewer/src/locales/en.json` +2. Run `node gulpfile.js/migrate-mdviewer-locales.js` to regenerate `root/strings.json` +3. Run `gulp translateStrings` to translate all locales +4. Translated files are copied back to `src-mdviewer/src/locales/{lang}.json` diff --git a/src-mdviewer/src/md-nls-autogenerated/root/strings.json b/src-mdviewer/src/md-nls-autogenerated/root/strings.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/root/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ru/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ru/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ru/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ru/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ru/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ru/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ru/strings.json b/src-mdviewer/src/md-nls-autogenerated/ru/strings.json new file mode 100644 index 0000000000..a7d0c6bdc2 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ru/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Закрыть поиск", + "a11y.edit_link": "Редактировать ссылку", + "a11y.format_text": "Форматировать текст", + "a11y.insert_block": "Вставить блок", + "a11y.main_toolbar": "Главная панель инструментов", + "a11y.next_match": "Следующее совпадение", + "a11y.previous_match": "Предыдущее совпадение", + "a11y.search_in_document": "Поиск по документу", + "a11y.search_text": "Поиск текста", + "a11y.select_language": "Выбрать язык", + "a11y.sidebar": "Боковая панель", + "a11y.skip_to_content": "Перейти к содержимому", + "common.close": "Закрыть", + "common.file": "Файл", + "common.open": "Открыть", + "context.copy": "Копировать", + "context.copy_image_address": "Копировать адрес изображения", + "context.copy_link": "Копировать ссылку", + "context.cut": "Вырезать", + "context.open_link": "Открыть ссылку", + "context.paste": "Вставить", + "context.paste_plain": "Вставить как обычный текст", + "context.select_all": "Выделить всё", + "dialog.cancel": "Отмена", + "dialog.discard": "Сбросить", + "dialog.dont_save": "Не сохранять", + "dialog.save": "Сохранить", + "dialog.unsaved_close": "У вас есть несохранённые изменения. Хотите сохранить их перед закрытием?", + "dialog.unsaved_exit_edit": "У вас есть несохранённые изменения. Хотите сохранить их перед выходом из режима редактирования?", + "dialog.unsaved_new_file": "У вас есть несохранённые изменения. Хотите сохранить их перед созданием нового файла?", + "dialog.unsaved_open_file": "У вас есть несохранённые изменения. Хотите сохранить их перед открытием нового файла?", + "dialog.unsaved_title": "Несохранённые изменения", + "drop_zone.text": "Перетащите сюда ваш Markdown-файл", + "export.open": "Открыть", + "export.success": "PDF успешно экспортирован", + "format.block_type": "Тип блока", + "format.blockquote": "Цитата", + "format.bold": "Полужирный ({mod}+B)", + "format.bullet_list": "Маркированный список", + "format.code": "Встроенный код ({mod}+E)", + "format.code_block": "Блок кода", + "format.divider": "Разделитель", + "format.heading1": "Заголовок 1", + "format.heading2": "Заголовок 2", + "format.heading3": "Заголовок 3", + "format.italic": "Курсив ({mod}+I)", + "format.link": "Ссылка ({mod}+K)", + "format.lists": "Списки", + "format.more_elements": "Ещё", + "format.numbered_list": "Нумерованный список", + "format.paragraph": "Параграф", + "format.strikethrough": "Зачёркнутый ({mod}+Shift+X)", + "format.table": "Таблица", + "format.task_list": "Список задач", + "format.text_formatting": "Форматирование текста", + "format.underline": "Подчёркнутый", + "help.editing": "Редактирование", + "help.fallback_notice": "Эта страница ещё не доступна на вашем языке. Показана английская версия.", + "help.features": "Возможности", + "help.getting_started": "Начало работы", + "help.shortcuts": "Сочетания клавиш", + "lang_picker.filter_label": "Фильтр языков", + "lang_picker.filter_placeholder": "Фильтр языков...", + "lang_picker.plain_text": "Простой текст", + "link.apply": "Применить", + "link.cancel": "Отмена", + "link.display_text": "Отображаемый текст", + "link.edit": "Редактировать", + "link.edit_link": "Редактировать ссылку", + "link.remove_link": "Удалить ссылку", + "link.text": "Текст", + "link.text_placeholder": "Отображаемый текст (необязательно)", + "link.url": "URL", + "link.url_placeholder": "Вставьте или введите URL...", + "mermaid.done": "Готово", + "mermaid.edit": "Редактировать", + "mermaid.error_prefix": "Синтаксическая ошибка", + "mermaid.stale": "Предпросмотр устарел", + "recovery.discard": "Отклонить", + "recovery.message": "Kern обнаружил несохранённые изменения из предыдущего сеанса. Хотите восстановить их?", + "recovery.restore": "Восстановить", + "recovery.title": "Восстановить несохранённые изменения?", + "search.count": "совпадений", + "search.no_results": "Нет результатов", + "search.placeholder": "Поиск по документу...", + "settings.language": "Язык", + "settings.theme": "Тема", + "settings.theme_dark": "Тёмная", + "settings.theme_light": "Светлая", + "settings.theme_system": "Системная", + "sidebar.no_headings": "Заголовки не найдены", + "sidebar.recent": "Недавние файлы", + "sidebar.toc": "Оглавление", + "slash.blockquote": "Цитата", + "slash.blockquote_desc": "Блок с цитатой", + "slash.bullet_list": "Маркированный список", + "slash.bullet_list_desc": "Ненумерованный список", + "slash.code_block": "Блок кода", + "slash.code_block_desc": "Выделенный код", + "slash.divider": "Разделитель", + "slash.divider_desc": "Горизонтальная линия", + "slash.heading1": "Заголовок 1", + "slash.heading1_desc": "Крупный заголовок", + "slash.heading2": "Заголовок 2", + "slash.heading2_desc": "Средний заголовок", + "slash.heading3": "Заголовок 3", + "slash.heading3_desc": "Небольшой заголовок", + "slash.mermaid": "Диаграмма Mermaid", + "slash.mermaid_desc": "Вставить диаграмму", + "slash.no_results": "Нет результатов", + "slash.numbered_list": "Нумерованный список", + "slash.numbered_list_desc": "Упорядоченный список", + "slash.paragraph": "Абзац", + "slash.paragraph_desc": "Обычный текст", + "slash.table": "Таблица", + "slash.table_desc": "Таблица 3×3", + "slash.task_list": "Список задач", + "slash.task_list_desc": "Чек-лист", + "table.add_col_left": "Добавить столбец слева", + "table.add_col_right": "Добавить столбец справа", + "table.add_row_above": "Добавить строку выше", + "table.add_row_below": "Добавить строку ниже", + "table.col_options": "Настройки столбца {n}", + "table.delete_col": "Удалить столбец", + "table.delete_row": "Удалить строку", + "table.header": "Заголовок", + "table.insert_col_left": "Вставить столбец слева", + "table.insert_col_right": "Вставить столбец справа", + "table.insert_row_above": "Вставить строку выше", + "table.insert_row_below": "Вставить строку ниже", + "table.new_row": "+ Новая строка", + "table.row_options": "Параметры строки {n}", + "toolbar.done": "Готово", + "toolbar.edit": "Редактировать", + "toolbar.export_pdf": "Экспорт в PDF", + "toolbar.focus": "Режим фокусировки", + "toolbar.more": "Ещё", + "toolbar.new_file": "Новый файл", + "toolbar.open": "Открыть файл", + "toolbar.save": "Сохранить", + "toolbar.search": "Поиск", + "toolbar.settings": "Настройки", + "toolbar.split_view": "Разделенный режим", + "toolbar.theme": "Сменить тему", + "toolbar.toc": "Оглавление", + "toolbar.zoom_in": "Увеличить", + "toolbar.zoom_out": "Уменьшить", + "toolbar.zoom_reset": "Сбросить масштаб", + "trial.days_remaining": "Осталось {days} дней в пробной версии", + "trial.expired_message": "Ваша пробная версия истекла. Приобретите Kern, чтобы продолжить редактирование.", + "trial.feature_edit": "Редактирование Markdown в режиме WYSIWYG и с разделением экрана", + "trial.feature_export": "Экспорт в PDF", + "trial.feature_save": "Сохранение и создание новых файлов", + "trial.one_time_purchase": "Единоразовая покупка. Без подписки.", + "trial.purchase_button": "Купить Kern", + "trial.purchase_desc": "Получите полный доступ ко всем функциям редактирования и экспорта с помощью единоразовой покупки.", + "trial.purchase_title": "Разблокировать Kern", + "trial.purchasing": "Покупка...", + "trial.restore_purchases": "Восстановить покупки", + "trial.restoring": "Восстановление...", + "viewer.copied": "Скопировано!", + "viewer.copy": "Копировать", + "welcome.drop_hint": "или перетащите файл .md", + "welcome.new_button": "Новый файл", + "welcome.open_button": "Открыть файл", + "welcome.subtitle": "Красивый просмотрщик Markdown", + "welcome.title": "Керн" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sk/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/sk/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sk/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/sk/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/sk/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sk/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sk/strings.json b/src-mdviewer/src/md-nls-autogenerated/sk/strings.json new file mode 100644 index 0000000000..0aab3c6776 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sk/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Zavrieť vyhľadávanie", + "a11y.edit_link": "Upraviť odkaz", + "a11y.format_text": "Formátovať text", + "a11y.insert_block": "Vložiť blok", + "a11y.main_toolbar": "Hlavný panel s nástrojmi", + "a11y.next_match": "Ďalšia zhoda", + "a11y.previous_match": "Predchádzajúca zhoda", + "a11y.search_in_document": "Hľadať v dokumente", + "a11y.search_text": "Hľadať text", + "a11y.select_language": "Vybrať jazyk", + "a11y.sidebar": "Bočný panel", + "a11y.skip_to_content": "Preskočiť na obsah", + "common.close": "Zavrieť", + "common.file": "Súbor", + "common.open": "Otvoriť", + "context.copy": "Kopírovať", + "context.copy_image_address": "Kopírovať adresu obrázka", + "context.copy_link": "Kopírovať odkaz", + "context.cut": "Vystrihnúť", + "context.open_link": "Otvoriť odkaz", + "context.paste": "Prilepiť", + "context.paste_plain": "Prilepiť ako čistý text", + "context.select_all": "Vybrať všetko", + "dialog.cancel": "Zrušiť", + "dialog.discard": "Zahodiť", + "dialog.dont_save": "Neuložiť", + "dialog.save": "Uložiť", + "dialog.unsaved_close": "Máte neuložené zmeny. Chcete ich uložiť pred zatvorením?", + "dialog.unsaved_exit_edit": "Máte neuložené zmeny. Chcete ich uložiť pred opustením režimu úprav?", + "dialog.unsaved_new_file": "Máte neuložené zmeny. Chcete ich uložiť pred vytvorením nového súboru?", + "dialog.unsaved_open_file": "Máte neuložené zmeny. Chcete ich uložiť pred otvorením nového súboru?", + "dialog.unsaved_title": "Neuložené zmeny", + "drop_zone.text": "Sem presuňte svoj Markdown súbor", + "export.open": "Otvoriť", + "export.success": "PDF bolo úspešne exportované", + "format.block_type": "Typ bloku", + "format.blockquote": "Citácia", + "format.bold": "Tučné ({mod}+B)", + "format.bullet_list": "Zoznam s odrážkami", + "format.code": "Vložený kód ({mod}+E)", + "format.code_block": "Blok kódu", + "format.divider": "Oddeľovač", + "format.heading1": "Nadpis 1", + "format.heading2": "Nadpis 2", + "format.heading3": "Nadpis 3", + "format.italic": "Kurzíva ({mod}+I)", + "format.link": "Odkaz ({mod}+K)", + "format.lists": "Zoznamy", + "format.more_elements": "Viac", + "format.numbered_list": "Číslovaný zoznam", + "format.paragraph": "Odsek", + "format.strikethrough": "Prečiarknuté ({mod}+Shift+X)", + "format.table": "Tabuľka", + "format.task_list": "Zoznam úloh", + "format.text_formatting": "Formátovanie textu", + "format.underline": "Podčiarknuté", + "help.editing": "Úpravy", + "help.fallback_notice": "Táto stránka zatiaľ nie je dostupná vo vašom jazyku. Zobrazuje sa anglická verzia.", + "help.features": "Funkcie", + "help.getting_started": "Ako začať", + "help.shortcuts": "Klávesové skratky", + "lang_picker.filter_label": "Filtrovať jazyky", + "lang_picker.filter_placeholder": "Filtrovať jazyky...", + "lang_picker.plain_text": "Obyčajný text", + "link.apply": "Použiť odkaz", + "link.cancel": "Zrušiť", + "link.display_text": "Zobrazený text", + "link.edit": "Upraviť", + "link.edit_link": "Upraviť odkaz", + "link.remove_link": "Odstrániť odkaz", + "link.text": "Text", + "link.text_placeholder": "Zobrazený text (voliteľné)", + "link.url": "URL", + "link.url_placeholder": "Vložte alebo napíšte URL...", + "mermaid.done": "Hotovo", + "mermaid.edit": "Upraviť", + "mermaid.error_prefix": "Syntaktická chyba", + "mermaid.stale": "Neaktuálny náhľad", + "recovery.discard": "Zahodiť", + "recovery.message": "Kern našiel neuložené zmeny z predchádzajúcej relácie. Chcete ich obnoviť?", + "recovery.restore": "Obnoviť", + "recovery.title": "Obnoviť neuložené zmeny?", + "search.count": "zhody", + "search.no_results": "Žiadne výsledky", + "search.placeholder": "Hľadať v dokumente...", + "settings.language": "Jazyk", + "settings.theme": "Téma", + "settings.theme_dark": "Tmavá", + "settings.theme_light": "Svetlá", + "settings.theme_system": "Systém", + "sidebar.no_headings": "Nenašli sa žiadne nadpisy", + "sidebar.recent": "Nedávne súbory", + "sidebar.toc": "Obsah", + "slash.blockquote": "Citácia", + "slash.blockquote_desc": "Blok s citáciou", + "slash.bullet_list": "Zoznam s odrážkami", + "slash.bullet_list_desc": "Neusporiadaný zoznam", + "slash.code_block": "Blok kódu", + "slash.code_block_desc": "Ohraničený kód", + "slash.divider": "Oddeľovač", + "slash.divider_desc": "Vodorovná čiara", + "slash.heading1": "Nadpis 1", + "slash.heading1_desc": "Veľký nadpis", + "slash.heading2": "Nadpis 2", + "slash.heading2_desc": "Stredný nadpis", + "slash.heading3": "Nadpis 3", + "slash.heading3_desc": "Malý nadpis", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Vložiť diagram", + "slash.no_results": "Žiadne výsledky", + "slash.numbered_list": "Číslovaný zoznam", + "slash.numbered_list_desc": "Usporiadaný zoznam", + "slash.paragraph": "Odsek", + "slash.paragraph_desc": "Obyčajný text", + "slash.table": "Tabuľka", + "slash.table_desc": "Tabuľka 3×3", + "slash.task_list": "Zoznam úloh", + "slash.task_list_desc": "Kontrolný zoznam", + "table.add_col_left": "Pridať stĺpec vľavo", + "table.add_col_right": "Pridať stĺpec vpravo", + "table.add_row_above": "Pridať riadok nad", + "table.add_row_below": "Pridať riadok pod", + "table.col_options": "Možnosti stĺpca {n}", + "table.delete_col": "Odstrániť stĺpec", + "table.delete_row": "Odstrániť riadok", + "table.header": "Hlavička", + "table.insert_col_left": "Vložiť stĺpec vľavo", + "table.insert_col_right": "Vložiť stĺpec vpravo", + "table.insert_row_above": "Vložiť riadok nad", + "table.insert_row_below": "Vložiť riadok pod", + "table.new_row": "+ Nový riadok", + "table.row_options": "Možnosti riadka {n}", + "toolbar.done": "Hotovo", + "toolbar.edit": "Upraviť", + "toolbar.export_pdf": "Exportovať PDF", + "toolbar.focus": "Režim sústredenia", + "toolbar.more": "Viac", + "toolbar.new_file": "Nový súbor", + "toolbar.open": "Otvoriť súbor", + "toolbar.save": "Uložiť", + "toolbar.search": "Hľadať", + "toolbar.settings": "Nastavenia", + "toolbar.split_view": "Rozdelené zobrazenie", + "toolbar.theme": "Prepnúť tému", + "toolbar.toc": "Obsah", + "toolbar.zoom_in": "Priblížiť", + "toolbar.zoom_out": "Oddialiť", + "toolbar.zoom_reset": "Obnoviť priblíženie", + "trial.days_remaining": "Zostáva {days} dní v skúšobnej verzii", + "trial.expired_message": "Vaša skúšobná verzia vypršala. Ak chcete pokračovať v úpravách, zakúpte si Kern.", + "trial.feature_edit": "Úprava Markdownu s WYSIWYG a rozdeleným zobrazením", + "trial.feature_export": "Export do PDF", + "trial.feature_save": "Ukladanie a vytváranie nových súborov", + "trial.one_time_purchase": "Jednorazový nákup. Žiadne predplatné.", + "trial.purchase_button": "Zakúpiť Kern", + "trial.purchase_desc": "Získajte plný prístup ku všetkým funkciám úprav a exportu jednorazovým nákupom.", + "trial.purchase_title": "Odomknite Kern", + "trial.purchasing": "Prebieha nákup...", + "trial.restore_purchases": "Obnoviť nákupy", + "trial.restoring": "Obnovuje sa...", + "viewer.copied": "Skopírované!", + "viewer.copy": "Kopírovať", + "welcome.drop_hint": "alebo presuňte súbor .md", + "welcome.new_button": "Nový súbor", + "welcome.open_button": "Otvoriť súbor", + "welcome.subtitle": "Krásny prehliadač Markdownu", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sr/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/sr/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sr/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/sr/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/sr/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sr/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sr/strings.json b/src-mdviewer/src/md-nls-autogenerated/sr/strings.json new file mode 100644 index 0000000000..861408c3b2 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sr/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Затвори претрагу", + "a11y.edit_link": "Уреди везу", + "a11y.format_text": "Форматирај текст", + "a11y.insert_block": "Уметни блок", + "a11y.main_toolbar": "Главна трака са алаткама", + "a11y.next_match": "Следеће подударање", + "a11y.previous_match": "Претходно подударање", + "a11y.search_in_document": "Претражи у документу", + "a11y.search_text": "Текст за претрагу", + "a11y.select_language": "Изабери језик", + "a11y.sidebar": "Бочна трака", + "a11y.skip_to_content": "Прескочи на садржај", + "common.close": "Затвори", + "common.file": "Датотека", + "common.open": "Отвори", + "context.copy": "Копирај", + "context.copy_image_address": "Копирај адресу слике", + "context.copy_link": "Копирај везу", + "context.cut": "Исеци", + "context.open_link": "Отвори везу", + "context.paste": "Налепи", + "context.paste_plain": "Налепи као обичан текст", + "context.select_all": "Изабери све", + "dialog.cancel": "Откажи", + "dialog.discard": "Одбаци", + "dialog.dont_save": "Немој сачувати", + "dialog.save": "Сачувај", + "dialog.unsaved_close": "Имате несачуване промене. Да ли желите да их сачувате пре затварања?", + "dialog.unsaved_exit_edit": "Имате несачуване промене. Да ли желите да их сачувате пре изласка из режима уређивања?", + "dialog.unsaved_new_file": "Имате несачуване промене. Да ли желите да их сачувате пре креирања нове датотеке?", + "dialog.unsaved_open_file": "Имате несачуване измене. Да ли желите да их сачувате пре отварања нове датотеке?", + "dialog.unsaved_title": "Несачуване измене", + "drop_zone.text": "Превуците своју Markdown датотеку овде", + "export.open": "Отвори", + "export.success": "PDF је успешно извезен", + "format.block_type": "Тип блока", + "format.blockquote": "Блок цитат", + "format.bold": "Подебљано ({mod}+B)", + "format.bullet_list": "Листа са ставкама", + "format.code": "Уметнути кôд ({mod}+E)", + "format.code_block": "Блок кода", + "format.divider": "Раздвајач", + "format.heading1": "Наслов 1", + "format.heading2": "Наслов 2", + "format.heading3": "Наслов 3", + "format.italic": "Курзив ({mod}+I)", + "format.link": "Веза ({mod}+K)", + "format.lists": "Листе", + "format.more_elements": "Више", + "format.numbered_list": "Нумерисана листа", + "format.paragraph": "Пасус", + "format.strikethrough": "Прецртано ({mod}+Shift+X)", + "format.table": "Табела", + "format.task_list": "Листа задатака", + "format.text_formatting": "Форматирање текста", + "format.underline": "Подвучено", + "help.editing": "Уређивање", + "help.fallback_notice": "Ова страница још увек није доступна на вашем језику. Приказује се енглеска верзија.", + "help.features": "Функције", + "help.getting_started": "Први кораци", + "help.shortcuts": "Тастатурне пречице", + "lang_picker.filter_label": "Филтрирај језике", + "lang_picker.filter_placeholder": "Филтрирај језике...", + "lang_picker.plain_text": "Обичан текст", + "link.apply": "Примени линк", + "link.cancel": "Одустани", + "link.display_text": "Текст за приказ", + "link.edit": "Уреди", + "link.edit_link": "Уреди линк", + "link.remove_link": "Уклони линк", + "link.text": "Текст", + "link.text_placeholder": "Текст за приказ (опционо)", + "link.url": "URL", + "link.url_placeholder": "Налепите или унесите URL...", + "mermaid.done": "Готово", + "mermaid.edit": "Измени", + "mermaid.error_prefix": "Синтаксна грешка", + "mermaid.stale": "Преглед је застарео", + "recovery.discard": "Одбаци", + "recovery.message": "Kern је пронашао несачуване промене из претходне сесије. Да ли желите да их вратите?", + "recovery.restore": "Врати", + "recovery.title": "Вратити несачуване промене?", + "search.count": "погодака", + "search.no_results": "Нема резултата", + "search.placeholder": "Претрага у документу...", + "settings.language": "Језик", + "settings.theme": "Тема", + "settings.theme_dark": "Тамна", + "settings.theme_light": "Светла", + "settings.theme_system": "Системска", + "sidebar.no_headings": "Нема наслова", + "sidebar.recent": "Недавне датотеке", + "sidebar.toc": "Садржај", + "slash.blockquote": "Блок цитат", + "slash.blockquote_desc": "Блок за цитирање", + "slash.bullet_list": "Листа са ставкама", + "slash.bullet_list_desc": "Неуређена листа", + "slash.code_block": "Блок кода", + "slash.code_block_desc": "Ограђени код", + "slash.divider": "Разделник", + "slash.divider_desc": "Хоризонтална линија", + "slash.heading1": "Наслов 1", + "slash.heading1_desc": "Велики наслов", + "slash.heading2": "Наслов 2", + "slash.heading2_desc": "Средњи наслов", + "slash.heading3": "Наслов 3", + "slash.heading3_desc": "Мали наслов", + "slash.mermaid": "Mermaid дијаграм", + "slash.mermaid_desc": "Уметни дијаграм", + "slash.no_results": "Нема резултата", + "slash.numbered_list": "Нумерисана листа", + "slash.numbered_list_desc": "Уређена листа", + "slash.paragraph": "Пасус", + "slash.paragraph_desc": "Обичан текст", + "slash.table": "Табела", + "slash.table_desc": "Табела 3×3", + "slash.task_list": "Листа задатака", + "slash.task_list_desc": "Контролна листа", + "table.add_col_left": "Додај колону лево", + "table.add_col_right": "Додај колону десно", + "table.add_row_above": "Додај ред изнад", + "table.add_row_below": "Додај ред испод", + "table.col_options": "Опције колоне {n}", + "table.delete_col": "Обриши колону", + "table.delete_row": "Обриши ред", + "table.header": "Заглавље", + "table.insert_col_left": "Уметни колону лево", + "table.insert_col_right": "Уметни колону десно", + "table.insert_row_above": "Уметни ред изнад", + "table.insert_row_below": "Уметни ред испод", + "table.new_row": "+ Нови ред", + "table.row_options": "Опције реда {n}", + "toolbar.done": "Готово", + "toolbar.edit": "Уреди", + "toolbar.export_pdf": "Извези PDF", + "toolbar.focus": "Режим фокуса", + "toolbar.more": "Више", + "toolbar.new_file": "Нови фајл", + "toolbar.open": "Отвори фајл", + "toolbar.save": "Сачувај", + "toolbar.search": "Претрага", + "toolbar.settings": "Подешавања", + "toolbar.split_view": "Подељени приказ", + "toolbar.theme": "Промени тему", + "toolbar.toc": "Садржај", + "toolbar.zoom_in": "Увећај", + "toolbar.zoom_out": "Умањи", + "toolbar.zoom_reset": "Ресетуј зум", + "trial.days_remaining": "{days} дана преостало у пробном периоду", + "trial.expired_message": "Ваш пробни период је истекао. Купите Kern да бисте наставили са уређивањем.", + "trial.feature_edit": "Уређивање Markdown-а уз WYSIWYG и подељени приказ", + "trial.feature_export": "Извоз у PDF", + "trial.feature_save": "Чување и креирање нових датотека", + "trial.one_time_purchase": "Једнократна куповина. Без претплате.", + "trial.purchase_button": "Купите Kern", + "trial.purchase_desc": "Остварите пун приступ свим функцијама за уређивање и извоз једнократном куповином.", + "trial.purchase_title": "Откључајте Kern", + "trial.purchasing": "Куповина у току...", + "trial.restore_purchases": "Обновите куповине", + "trial.restoring": "Обнављање у току...", + "viewer.copied": "Копирано!", + "viewer.copy": "Копирај", + "welcome.drop_hint": "или превуците и отпустите .md датотеку", + "welcome.new_button": "Нова датотека", + "welcome.open_button": "Отвори датотеку", + "welcome.subtitle": "Прелеп Markdown прегледач", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sv/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/sv/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sv/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/sv/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/sv/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sv/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/sv/strings.json b/src-mdviewer/src/md-nls-autogenerated/sv/strings.json new file mode 100644 index 0000000000..5a48aa6a56 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/sv/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Stäng sökning", + "a11y.edit_link": "Redigera länk", + "a11y.format_text": "Formatera text", + "a11y.insert_block": "Infoga block", + "a11y.main_toolbar": "Huvudverktygsfält", + "a11y.next_match": "Nästa träff", + "a11y.previous_match": "Föregående träff", + "a11y.search_in_document": "Sök i dokument", + "a11y.search_text": "Söktext", + "a11y.select_language": "Välj språk", + "a11y.sidebar": "Sidofält", + "a11y.skip_to_content": "Hoppa till innehåll", + "common.close": "Stäng", + "common.file": "Fil", + "common.open": "Öppna", + "context.copy": "Kopiera", + "context.copy_image_address": "Kopiera bildadress", + "context.copy_link": "Kopiera länk", + "context.cut": "Klipp ut", + "context.open_link": "Öppna länk", + "context.paste": "Klistra in", + "context.paste_plain": "Klistra in som oformaterad text", + "context.select_all": "Markera allt", + "dialog.cancel": "Avbryt", + "dialog.discard": "Ignorera", + "dialog.dont_save": "Spara inte", + "dialog.save": "Spara", + "dialog.unsaved_close": "Du har osparade ändringar. Vill du spara innan du stänger?", + "dialog.unsaved_exit_edit": "Du har osparade ändringar. Vill du spara innan du lämnar redigeringsläget?", + "dialog.unsaved_new_file": "Du har osparade ändringar. Vill du spara innan du skapar en ny fil?", + "dialog.unsaved_open_file": "Du har osparade ändringar. Vill du spara innan du öppnar en ny fil?", + "dialog.unsaved_title": "Osparade ändringar", + "drop_zone.text": "Släpp din Markdown-fil här", + "export.open": "Öppna", + "export.success": "PDF-filen har exporterats", + "format.block_type": "Blocktyp", + "format.blockquote": "Citatblock", + "format.bold": "Fet ({mod}+B)", + "format.bullet_list": "Punktlista", + "format.code": "Infogad kod ({mod}+E)", + "format.code_block": "Kodblock", + "format.divider": "Avdelare", + "format.heading1": "Rubrik 1", + "format.heading2": "Rubrik 2", + "format.heading3": "Rubrik 3", + "format.italic": "Kursiv ({mod}+I)", + "format.link": "Länk ({mod}+K)", + "format.lists": "Listor", + "format.more_elements": "Mer", + "format.numbered_list": "Numrerad lista", + "format.paragraph": "Stycke", + "format.strikethrough": "Genomstruken ({mod}+Shift+X)", + "format.table": "Tabell", + "format.task_list": "Att göra-lista", + "format.text_formatting": "Textformatering", + "format.underline": "Understruken", + "help.editing": "Redigering", + "help.fallback_notice": "Den här sidan är inte tillgänglig på ditt språk än. Den engelska versionen visas.", + "help.features": "Funktioner", + "help.getting_started": "Komma igång", + "help.shortcuts": "Kortkommandon", + "lang_picker.filter_label": "Filtrera språk", + "lang_picker.filter_placeholder": "Filtrera språk...", + "lang_picker.plain_text": "Oformaterad text", + "link.apply": "Verkställ länk", + "link.cancel": "Avbryt", + "link.display_text": "Visningstext", + "link.edit": "Redigera", + "link.edit_link": "Redigera länk", + "link.remove_link": "Ta bort länk", + "link.text": "Text", + "link.text_placeholder": "Visningstext (valfritt)", + "link.url": "URL", + "link.url_placeholder": "Klistra in eller skriv URL...", + "mermaid.done": "Klar", + "mermaid.edit": "Redigera", + "mermaid.error_prefix": "Syntaxfel", + "mermaid.stale": "Förhandsgranskning inaktuell", + "recovery.discard": "Förkasta", + "recovery.message": "Kern hittade osparade ändringar från en tidigare session. Vill du återställa dem?", + "recovery.restore": "Återställ", + "recovery.title": "Återställa osparade ändringar?", + "search.count": "träffar", + "search.no_results": "Inga resultat", + "search.placeholder": "Sök i dokumentet...", + "settings.language": "Språk", + "settings.theme": "Tema", + "settings.theme_dark": "Mörkt", + "settings.theme_light": "Ljust", + "settings.theme_system": "System", + "sidebar.no_headings": "Inga rubriker hittades", + "sidebar.recent": "Senaste filer", + "sidebar.toc": "Innehållsförteckning", + "slash.blockquote": "Citatblock", + "slash.blockquote_desc": "Citatblock", + "slash.bullet_list": "Punktlista", + "slash.bullet_list_desc": "Osorterad lista", + "slash.code_block": "Kodblock", + "slash.code_block_desc": "Inhägnad kod", + "slash.divider": "Avdelare", + "slash.divider_desc": "Horisontell linje", + "slash.heading1": "Rubrik 1", + "slash.heading1_desc": "Stor rubrik", + "slash.heading2": "Rubrik 2", + "slash.heading2_desc": "Mellanstor rubrik", + "slash.heading3": "Rubrik 3", + "slash.heading3_desc": "Liten rubrik", + "slash.mermaid": "Mermaid-diagram", + "slash.mermaid_desc": "Infoga ett diagram", + "slash.no_results": "Inga resultat", + "slash.numbered_list": "Numrerad lista", + "slash.numbered_list_desc": "Ordnad lista", + "slash.paragraph": "Stycke", + "slash.paragraph_desc": "Vanlig text", + "slash.table": "Tabell", + "slash.table_desc": "3×3-tabell", + "slash.task_list": "Uppgiftslista", + "slash.task_list_desc": "Checklista", + "table.add_col_left": "Lägg till kolumn till vänster", + "table.add_col_right": "Lägg till kolumn till höger", + "table.add_row_above": "Lägg till rad ovanför", + "table.add_row_below": "Lägg till rad nedanför", + "table.col_options": "Alternativ för kolumn {n}", + "table.delete_col": "Ta bort kolumn", + "table.delete_row": "Ta bort rad", + "table.header": "Rubrik", + "table.insert_col_left": "Infoga kolumn till vänster", + "table.insert_col_right": "Infoga kolumn till höger", + "table.insert_row_above": "Infoga rad ovanför", + "table.insert_row_below": "Infoga rad nedanför", + "table.new_row": "+ Ny rad", + "table.row_options": "Alternativ för rad {n}", + "toolbar.done": "Klar", + "toolbar.edit": "Redigera", + "toolbar.export_pdf": "Exportera PDF", + "toolbar.focus": "Fokusläge", + "toolbar.more": "Mer", + "toolbar.new_file": "Ny fil", + "toolbar.open": "Öppna fil", + "toolbar.save": "Spara", + "toolbar.search": "Sök", + "toolbar.settings": "Inställningar", + "toolbar.split_view": "Delad vy", + "toolbar.theme": "Växla tema", + "toolbar.toc": "Innehållsförteckning", + "toolbar.zoom_in": "Zooma in", + "toolbar.zoom_out": "Zooma ut", + "toolbar.zoom_reset": "Återställ zoom", + "trial.days_remaining": "{days} dagar kvar av provperioden", + "trial.expired_message": "Din provperiod har gått ut. Köp Kern för att fortsätta redigera.", + "trial.feature_edit": "Redigera Markdown med WYSIWYG och delad vy", + "trial.feature_export": "Exportera till PDF", + "trial.feature_save": "Spara och skapa nya filer", + "trial.one_time_purchase": "Engångsköp. Ingen prenumeration.", + "trial.purchase_button": "Köp Kern", + "trial.purchase_desc": "Få fullständig åtkomst till alla redigerings- och exportfunktioner med ett engångsköp.", + "trial.purchase_title": "Lås upp Kern", + "trial.purchasing": "Köper...", + "trial.restore_purchases": "Återställ köp", + "trial.restoring": "Återställer...", + "viewer.copied": "Kopierat!", + "viewer.copy": "Kopiera", + "welcome.drop_hint": "eller dra och släpp en .md-fil", + "welcome.new_button": "Ny fil", + "welcome.open_button": "Öppna fil", + "welcome.subtitle": "En vacker Markdown-visare", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/tr/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/tr/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/tr/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/tr/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/tr/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/tr/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/tr/strings.json b/src-mdviewer/src/md-nls-autogenerated/tr/strings.json new file mode 100644 index 0000000000..4d544eb5b5 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/tr/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Aramayı kapat", + "a11y.edit_link": "Bağlantıyı düzenle", + "a11y.format_text": "Metni biçimlendir", + "a11y.insert_block": "Blok ekle", + "a11y.main_toolbar": "Ana araç çubuğu", + "a11y.next_match": "Sonraki eşleşme", + "a11y.previous_match": "Önceki eşleşme", + "a11y.search_in_document": "Belgede ara", + "a11y.search_text": "Metin ara", + "a11y.select_language": "Dil seç", + "a11y.sidebar": "Kenar Çubuğu", + "a11y.skip_to_content": "İçeriğe atla", + "common.close": "Kapat", + "common.file": "Dosya", + "common.open": "Aç", + "context.copy": "Kopyala", + "context.copy_image_address": "Resim Adresini Kopyala", + "context.copy_link": "Bağlantıyı Kopyala", + "context.cut": "Kes", + "context.open_link": "Bağlantıyı Aç", + "context.paste": "Yapıştır", + "context.paste_plain": "Düz Metin Olarak Yapıştır", + "context.select_all": "Tümünü Seç", + "dialog.cancel": "İptal", + "dialog.discard": "Vazgeç", + "dialog.dont_save": "Kaydetme", + "dialog.save": "Kaydet", + "dialog.unsaved_close": "Kaydedilmemiş değişiklikleriniz var. Kapatmadan önce kaydetmek ister misiniz?", + "dialog.unsaved_exit_edit": "Kaydedilmemiş değişiklikleriniz var. Düzenleme modundan çıkmadan önce kaydetmek ister misiniz?", + "dialog.unsaved_new_file": "Kaydedilmemiş değişiklikleriniz var. Yeni bir dosya oluşturmadan önce kaydetmek ister misiniz?", + "dialog.unsaved_open_file": "Kaydedilmemiş değişiklikleriniz var. Yeni bir dosya açmadan önce kaydetmek ister misiniz?", + "dialog.unsaved_title": "Kaydedilmemiş Değişiklikler", + "drop_zone.text": "Markdown dosyanızı buraya bırakın", + "export.open": "Aç", + "export.success": "PDF başarıyla dışa aktarıldı", + "format.block_type": "Blok türü", + "format.blockquote": "Alıntı bloku", + "format.bold": "Kalın ({mod}+B)", + "format.bullet_list": "Madde işaretli liste", + "format.code": "Satır içi kod ({mod}+E)", + "format.code_block": "Kod bloğu", + "format.divider": "Ayırıcı", + "format.heading1": "Başlık 1", + "format.heading2": "Başlık 2", + "format.heading3": "Başlık 3", + "format.italic": "İtalik ({mod}+I)", + "format.link": "Bağlantı ({mod}+K)", + "format.lists": "Listeler", + "format.more_elements": "Daha fazla", + "format.numbered_list": "Numaralı liste", + "format.paragraph": "Paragraf", + "format.strikethrough": "Üstü çizili ({mod}+Shift+X)", + "format.table": "Tablo", + "format.task_list": "Görev listesi", + "format.text_formatting": "Metin biçimlendirme", + "format.underline": "Altı çizili", + "help.editing": "Düzenleme", + "help.fallback_notice": "Bu sayfa henüz dilinizde mevcut değil. İngilizce sürüm gösteriliyor.", + "help.features": "Özellikler", + "help.getting_started": "Başlarken", + "help.shortcuts": "Klavye Kısayolları", + "lang_picker.filter_label": "Dilleri filtrele", + "lang_picker.filter_placeholder": "Dilleri filtrele...", + "lang_picker.plain_text": "Düz metin", + "link.apply": "Bağlantıyı uygula", + "link.cancel": "İptal", + "link.display_text": "Görünen metin", + "link.edit": "Düzenle", + "link.edit_link": "Bağlantıyı düzenle", + "link.remove_link": "Bağlantıyı kaldır", + "link.text": "Metin", + "link.text_placeholder": "Görüntülenecek metin (isteğe bağlı)", + "link.url": "URL", + "link.url_placeholder": "URL'yi yapıştırın veya yazın...", + "mermaid.done": "Bitti", + "mermaid.edit": "Düzenle", + "mermaid.error_prefix": "Söz dizimi hatası", + "mermaid.stale": "Önizleme güncel değil", + "recovery.discard": "Vazgeç", + "recovery.message": "Kern, önceki bir oturumdan kaydedilmemiş değişiklikler buldu. Bunları geri yüklemek ister misiniz?", + "recovery.restore": "Geri Yükle", + "recovery.title": "Kaydedilmemiş değişiklikler kurtarılsın mı?", + "search.count": "eşleşme", + "search.no_results": "Sonuç bulunamadı", + "search.placeholder": "Belgede ara...", + "settings.language": "Dil", + "settings.theme": "Tema", + "settings.theme_dark": "Koyu", + "settings.theme_light": "Açık", + "settings.theme_system": "Sistem", + "sidebar.no_headings": "Başlık bulunamadı", + "sidebar.recent": "Son Dosyalar", + "sidebar.toc": "İçindekiler", + "slash.blockquote": "Alıntı", + "slash.blockquote_desc": "Alıntı bloku", + "slash.bullet_list": "Maddeli liste", + "slash.bullet_list_desc": "Sırasız liste", + "slash.code_block": "Kod bloku", + "slash.code_block_desc": "Çerçeveli kod", + "slash.divider": "Ayırıcı", + "slash.divider_desc": "Yatay çizgi", + "slash.heading1": "Başlık 1", + "slash.heading1_desc": "Büyük başlık", + "slash.heading2": "Başlık 2", + "slash.heading2_desc": "Orta boy başlık", + "slash.heading3": "Başlık 3", + "slash.heading3_desc": "Küçük başlık", + "slash.mermaid": "Mermaid diyagramı", + "slash.mermaid_desc": "Bir diyagram ekle", + "slash.no_results": "Sonuç bulunamadı", + "slash.numbered_list": "Numaralı liste", + "slash.numbered_list_desc": "Sıralı liste", + "slash.paragraph": "Paragraf", + "slash.paragraph_desc": "Düz metin", + "slash.table": "Tablo", + "slash.table_desc": "3×3 tablo", + "slash.task_list": "Görev listesi", + "slash.task_list_desc": "Kontrol listesi", + "table.add_col_left": "Sola sütun ekle", + "table.add_col_right": "Sağa sütun ekle", + "table.add_row_above": "Yukarıya satır ekle", + "table.add_row_below": "Aşağıya satır ekle", + "table.col_options": "Sütun {n} seçenekleri", + "table.delete_col": "Sütunu sil", + "table.delete_row": "Satırı sil", + "table.header": "Başlık", + "table.insert_col_left": "Sola sütun ekle", + "table.insert_col_right": "Sağa sütun ekle", + "table.insert_row_above": "Yukarıya satır ekle", + "table.insert_row_below": "Aşağıya satır ekle", + "table.new_row": "+ Yeni satır", + "table.row_options": "{n}. satır seçenekleri", + "toolbar.done": "Bitti", + "toolbar.edit": "Düzenle", + "toolbar.export_pdf": "PDF Dışa Aktar", + "toolbar.focus": "Odak Modu", + "toolbar.more": "Daha Fazla", + "toolbar.new_file": "Yeni Dosya", + "toolbar.open": "Dosya Aç", + "toolbar.save": "Kaydet", + "toolbar.search": "Ara", + "toolbar.settings": "Ayarlar", + "toolbar.split_view": "Bölünmüş Görünüm", + "toolbar.theme": "Temayı Değiştir", + "toolbar.toc": "İçindekiler", + "toolbar.zoom_in": "Yakınlaştır", + "toolbar.zoom_out": "Uzaklaştır", + "toolbar.zoom_reset": "Yakınlaştırmayı Sıfırla", + "trial.days_remaining": "Deneme süresinin bitmesine {days} gün kaldı", + "trial.expired_message": "Deneme süreniz sona erdi. Düzenlemeye devam etmek için Kern'i satın alın.", + "trial.feature_edit": "WYSIWYG ve bölünmüş görünüm ile Markdown düzenleyin", + "trial.feature_export": "PDF'e Dışa Aktar", + "trial.feature_save": "Kaydedin ve yeni dosyalar oluşturun", + "trial.one_time_purchase": "Tek seferlik satın alım. Abonelik yok.", + "trial.purchase_button": "Kern'i Satın Alın", + "trial.purchase_desc": "Tek seferlik satın alımla tüm düzenleme ve dışa aktarma özelliklerine tam erişim elde edin.", + "trial.purchase_title": "Kern'in Kilidini Açın", + "trial.purchasing": "Satın alınıyor...", + "trial.restore_purchases": "Satın Alımları Geri Yükle", + "trial.restoring": "Geri yükleniyor...", + "viewer.copied": "Kopyalandı!", + "viewer.copy": "Kopyala", + "welcome.drop_hint": "veya bir .md dosyasını sürükleyip bırakın", + "welcome.new_button": "Yeni Dosya", + "welcome.open_button": "Dosya Aç", + "welcome.subtitle": "Harika bir Markdown görüntüleyici", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/uk/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/uk/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/uk/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/uk/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/uk/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/uk/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/uk/strings.json b/src-mdviewer/src/md-nls-autogenerated/uk/strings.json new file mode 100644 index 0000000000..b75b8c25c1 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/uk/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Закрити пошук", + "a11y.edit_link": "Редагувати посилання", + "a11y.format_text": "Форматувати текст", + "a11y.insert_block": "Вставити блок", + "a11y.main_toolbar": "Головна панель інструментів", + "a11y.next_match": "Наступний збіг", + "a11y.previous_match": "Попередній збіг", + "a11y.search_in_document": "Пошук у документі", + "a11y.search_text": "Пошук тексту", + "a11y.select_language": "Вибрати мову", + "a11y.sidebar": "Бічна панель", + "a11y.skip_to_content": "Перейти до вмісту", + "common.close": "Закрити", + "common.file": "Файл", + "common.open": "Відкрити", + "context.copy": "Копіювати", + "context.copy_image_address": "Копіювати адресу зображення", + "context.copy_link": "Копіювати посилання", + "context.cut": "Вирізати", + "context.open_link": "Відкрити посилання", + "context.paste": "Вставити", + "context.paste_plain": "Вставити як звичайний текст", + "context.select_all": "Виділити все", + "dialog.cancel": "Скасувати", + "dialog.discard": "Відхилити", + "dialog.dont_save": "Не зберігати", + "dialog.save": "Зберегти", + "dialog.unsaved_close": "У вас є незбережені зміни. Бажаєте зберегти їх перед закриттям?", + "dialog.unsaved_exit_edit": "У вас є незбережені зміни. Бажаєте зберегти їх перед виходом із режиму редагування?", + "dialog.unsaved_new_file": "У вас є незбережені зміни. Бажаєте зберегти їх перед створенням нового файлу?", + "dialog.unsaved_open_file": "У вас є незбережені зміни. Бажаєте зберегти їх перед відкриттям нового файлу?", + "dialog.unsaved_title": "Незбережені зміни", + "drop_zone.text": "Перетягніть сюди ваш Markdown-файл", + "export.open": "Відкрити", + "export.success": "PDF успішно експортовано", + "format.block_type": "Тип блоку", + "format.blockquote": "Цитата", + "format.bold": "Напівжирний ({mod}+B)", + "format.bullet_list": "Маркований список", + "format.code": "Вбудований код ({mod}+E)", + "format.code_block": "Блок коду", + "format.divider": "Розділювач", + "format.heading1": "Заголовок 1", + "format.heading2": "Заголовок 2", + "format.heading3": "Заголовок 3", + "format.italic": "Курсив ({mod}+I)", + "format.link": "Посилання ({mod}+K)", + "format.lists": "Списки", + "format.more_elements": "Більше", + "format.numbered_list": "Нумерований список", + "format.paragraph": "Абзац", + "format.strikethrough": "Закреслений ({mod}+Shift+X)", + "format.table": "Таблиця", + "format.task_list": "Список завдань", + "format.text_formatting": "Форматування тексту", + "format.underline": "Підкреслений", + "help.editing": "Редагування", + "help.fallback_notice": "Ця сторінка ще не доступна вашою мовою. Показуємо англійську версію.", + "help.features": "Можливості", + "help.getting_started": "Початок роботи", + "help.shortcuts": "Клавіатурні скорочення", + "lang_picker.filter_label": "Фільтрувати мови", + "lang_picker.filter_placeholder": "Фільтрувати мови...", + "lang_picker.plain_text": "Простий текст", + "link.apply": "Застосувати", + "link.cancel": "Скасувати", + "link.display_text": "Текст для відображення", + "link.edit": "Редагувати", + "link.edit_link": "Редагувати посилання", + "link.remove_link": "Видалити посилання", + "link.text": "Текст", + "link.text_placeholder": "Текст для відображення (необов'язково)", + "link.url": "URL", + "link.url_placeholder": "Вставте або введіть URL...", + "mermaid.done": "Готово", + "mermaid.edit": "Редагувати", + "mermaid.error_prefix": "Синтаксична помилка", + "mermaid.stale": "Попередній перегляд застарів", + "recovery.discard": "Відхилити", + "recovery.message": "Kern виявив незбережені зміни з попереднього сеансу. Бажаєте відновити їх?", + "recovery.restore": "Відновити", + "recovery.title": "Відновити незбережені зміни?", + "search.count": "збігів", + "search.no_results": "Немає результатів", + "search.placeholder": "Пошук у документі...", + "settings.language": "Мова", + "settings.theme": "Тема", + "settings.theme_dark": "Темна", + "settings.theme_light": "Світла", + "settings.theme_system": "Системна", + "sidebar.no_headings": "Заголовків не знайдено", + "sidebar.recent": "Нещодавні файли", + "sidebar.toc": "Зміст", + "slash.blockquote": "Цитата", + "slash.blockquote_desc": "Блок цитати", + "slash.bullet_list": "Маркований список", + "slash.bullet_list_desc": "Невпорядкований список", + "slash.code_block": "Блок коду", + "slash.code_block_desc": "Виділений код", + "slash.divider": "Розділювач", + "slash.divider_desc": "Горизонтальна лінія", + "slash.heading1": "Заголовок 1", + "slash.heading1_desc": "Великий заголовок", + "slash.heading2": "Заголовок 2", + "slash.heading2_desc": "Середній заголовок", + "slash.heading3": "Заголовок 3", + "slash.heading3_desc": "Малий заголовок", + "slash.mermaid": "Діаграма Mermaid", + "slash.mermaid_desc": "Вставити діаграму", + "slash.no_results": "Немає результатів", + "slash.numbered_list": "Нумерований список", + "slash.numbered_list_desc": "Упорядкований список", + "slash.paragraph": "Абзац", + "slash.paragraph_desc": "Звичайний текст", + "slash.table": "Таблиця", + "slash.table_desc": "Таблиця 3×3", + "slash.task_list": "Список завдань", + "slash.task_list_desc": "Контрольний список", + "table.add_col_left": "Додати стовпець ліворуч", + "table.add_col_right": "Додати стовпець праворуч", + "table.add_row_above": "Додати рядок вище", + "table.add_row_below": "Додати рядок нижче", + "table.col_options": "Параметри стовпця {n}", + "table.delete_col": "Видалити стовпець", + "table.delete_row": "Видалити рядок", + "table.header": "Заголовок", + "table.insert_col_left": "Вставити стовпець ліворуч", + "table.insert_col_right": "Вставити стовпець праворуч", + "table.insert_row_above": "Вставити рядок вище", + "table.insert_row_below": "Вставити рядок нижче", + "table.new_row": "+ Новий рядок", + "table.row_options": "Параметри рядка {n}", + "toolbar.done": "Готово", + "toolbar.edit": "Редагувати", + "toolbar.export_pdf": "Експортувати в PDF", + "toolbar.focus": "Режим фокусування", + "toolbar.more": "Ще", + "toolbar.new_file": "Новий файл", + "toolbar.open": "Відкрити файл", + "toolbar.save": "Зберегти", + "toolbar.search": "Пошук", + "toolbar.settings": "Налаштування", + "toolbar.split_view": "Розділений вигляд", + "toolbar.theme": "Перемкнути тему", + "toolbar.toc": "Зміст", + "toolbar.zoom_in": "Збільшити", + "toolbar.zoom_out": "Зменшити", + "toolbar.zoom_reset": "Скинути масштаб", + "trial.days_remaining": "{days} днів залишилося у пробній версії", + "trial.expired_message": "Ваш пробний період завершився. Придбайте Kern, щоб продовжити редагування.", + "trial.feature_edit": "Редагуйте Markdown у режимі WYSIWYG та розділеного перегляду", + "trial.feature_export": "Експорт у PDF", + "trial.feature_save": "Зберігайте та створюйте нові файли", + "trial.one_time_purchase": "Одноразова покупка. Без підписок.", + "trial.purchase_button": "Придбати Kern", + "trial.purchase_desc": "Отримайте повний доступ до всіх функцій редагування та експорту за допомогою одноразової покупки.", + "trial.purchase_title": "Розблокувати Kern", + "trial.purchasing": "Здійснення покупки...", + "trial.restore_purchases": "Відновити покупки", + "trial.restoring": "Відновлення...", + "viewer.copied": "Скопійовано!", + "viewer.copy": "Копіювати", + "welcome.drop_hint": "або перетягніть файл .md", + "welcome.new_button": "Новий файл", + "welcome.open_button": "Відкрити файл", + "welcome.subtitle": "Гарний переглядач файлів Markdown", + "welcome.title": "Керн" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ur/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/ur/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ur/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/ur/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/ur/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ur/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/ur/strings.json b/src-mdviewer/src/md-nls-autogenerated/ur/strings.json new file mode 100644 index 0000000000..8d94d8ae70 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/ur/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "تلاش بند کریں", + "a11y.edit_link": "لنک میں ترمیم کریں", + "a11y.format_text": "متن فارمیٹ", + "a11y.insert_block": "بلاک شامل کریں", + "a11y.main_toolbar": "اصل ٹول بار", + "a11y.next_match": "اگلا نتیجہ", + "a11y.previous_match": "پچھلا نتیجہ", + "a11y.search_in_document": "دستاویز میں تلاش کریں", + "a11y.search_text": "متن تلاش کریں", + "a11y.select_language": "زبان منتخب کریں", + "a11y.sidebar": "سائیڈ بار", + "a11y.skip_to_content": "مواد پر جائیں", + "common.close": "بند کریں", + "common.file": "فائل", + "common.open": "کھولیں", + "context.copy": "کاپی کریں", + "context.copy_image_address": "تصویر کا پتہ کاپی کریں", + "context.copy_link": "لنک کاپی کریں", + "context.cut": "کاٹیں", + "context.open_link": "لنک کھولیں", + "context.paste": "پیسٹ کریں", + "context.paste_plain": "سادہ متن کے طور پر پیسٹ کریں", + "context.select_all": "سب منتخب کریں", + "dialog.cancel": "منسوخ", + "dialog.discard": "رد کریں", + "dialog.dont_save": "محفوظ نہ کریں", + "dialog.save": "محفوظ کریں", + "dialog.unsaved_close": "آپ کے پاس غیر محفوظ تبدیلیاں ہیں۔ بند کرنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "dialog.unsaved_exit_edit": "غیر محفوظ تبدیلیاں ہیں۔ ترمیمی موڈ سے نکلنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "dialog.unsaved_new_file": "غیر محفوظ تبدیلیاں ہیں۔ نئی فائل بنانے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "dialog.unsaved_open_file": "غیر محفوظ تبدیلیاں ہیں۔ نئی فائل کھولنے سے پہلے محفوظ کرنا چاہتے ہیں؟", + "dialog.unsaved_title": "غیر محفوظ تبدیلیاں", + "drop_zone.text": "اپنی مارک ڈاؤن فائل یہاں چھوڑیں", + "export.open": "کھولیں", + "export.success": "PDF کامیابی سے برآمد ہوئی", + "format.blockquote": "بلاک کوٹ", + "format.bold": "بولڈ ({mod}+B)", + "format.bullet_list": "بلٹ فہرست", + "format.code": "ان لائن کوڈ ({mod}+E)", + "format.code_block": "کوڈ بلاک", + "format.divider": "تقسیم کار", + "format.heading1": "سرخی 1", + "format.heading2": "سرخی 2", + "format.heading3": "سرخی 3", + "format.italic": "اٹیلک ({mod}+I)", + "format.link": "لنک ({mod}+K)", + "format.numbered_list": "نمبر فہرست", + "format.paragraph": "پیراگراف", + "format.strikethrough": "سٹرائیک تھرو ({mod}+Shift+X)", + "format.table": "ٹیبل", + "format.task_list": "ٹاسک فہرست", + "help.editing": "ترمیم", + "help.fallback_notice": "یہ صفحہ ابھی آپ کی زبان میں دستیاب نہیں ہے۔ انگریزی ورژن دکھایا جا رہا ہے۔", + "help.features": "خصوصیات", + "help.getting_started": "شروع کریں", + "help.shortcuts": "کیبورڈ شارٹ کٹ", + "lang_picker.filter_label": "زبانیں فلٹر کریں", + "lang_picker.filter_placeholder": "زبانیں فلٹر کریں...", + "lang_picker.plain_text": "سادہ متن", + "link.apply": "لنک لاگو کریں", + "link.cancel": "منسوخ", + "link.display_text": "ڈسپلے متن", + "link.edit": "ترمیم", + "link.edit_link": "لنک میں ترمیم کریں", + "link.remove_link": "لنک ہٹائیں", + "link.text": "متن", + "link.text_placeholder": "ڈسپلے متن (اختیاری)", + "link.url": "URL", + "link.url_placeholder": "URL پیسٹ یا ٹائپ کریں...", + "recovery.discard": "چھوڑ دیں", + "recovery.message": "Kern نے پچھلے سیشن سے غیر محفوظ تبدیلیاں پائیں۔ کیا آپ انہیں بحال کرنا چاہتے ہیں؟", + "recovery.restore": "بحال کریں", + "recovery.title": "غیر محفوظ تبدیلیاں بحال کریں؟", + "search.count": "نتائج", + "search.no_results": "کوئی نتائج نہیں", + "search.placeholder": "دستاویز میں تلاش کریں...", + "settings.language": "زبان", + "settings.theme": "تھیم", + "settings.theme_dark": "گہرا", + "settings.theme_light": "ہلکا", + "settings.theme_system": "سسٹم", + "sidebar.no_headings": "کوئی سرخیاں نہیں ملیں", + "sidebar.recent": "حالیہ فائلیں", + "sidebar.toc": "فہرست مضامین", + "slash.blockquote": "بلاک کوٹ", + "slash.blockquote_desc": "اقتباس بلاک", + "slash.bullet_list": "بلٹ فہرست", + "slash.bullet_list_desc": "غیر ترتیب فہرست", + "slash.code_block": "کوڈ بلاک", + "slash.code_block_desc": "فینسڈ کوڈ", + "slash.divider": "تقسیم کار", + "slash.divider_desc": "افقی لکیر", + "slash.heading1": "سرخی 1", + "slash.heading1_desc": "بڑی سرخی", + "slash.heading2": "سرخی 2", + "slash.heading2_desc": "درمیانی سرخی", + "slash.heading3": "سرخی 3", + "slash.heading3_desc": "چھوٹی سرخی", + "slash.no_results": "کوئی نتائج نہیں", + "slash.numbered_list": "نمبر فہرست", + "slash.numbered_list_desc": "ترتیب فہرست", + "slash.paragraph": "پیراگراف", + "slash.paragraph_desc": "سادہ متن", + "slash.table": "ٹیبل", + "slash.table_desc": "3×3 ٹیبل", + "slash.task_list": "ٹاسک فہرست", + "slash.task_list_desc": "چیک لسٹ", + "table.add_col_left": "بائیں کالم شامل کریں", + "table.add_col_right": "دائیں کالم شامل کریں", + "table.add_row_above": "اوپر قطار شامل کریں", + "table.add_row_below": "نیچے قطار شامل کریں", + "table.col_options": "کالم {n} اختیارات", + "table.delete_col": "کالم حذف کریں", + "table.delete_row": "قطار حذف کریں", + "table.header": "ہیڈر", + "table.insert_col_left": "بائیں کالم شامل کریں", + "table.insert_col_right": "دائیں کالم شامل کریں", + "table.insert_row_above": "اوپر قطار شامل کریں", + "table.insert_row_below": "نیچے قطار شامل کریں", + "table.new_row": "+ نئی قطار", + "table.row_options": "قطار {n} اختیارات", + "toolbar.edit": "ترمیم", + "toolbar.export_pdf": "PDF برآمد کریں", + "toolbar.focus": "فوکس موڈ", + "toolbar.more": "مزید", + "toolbar.new_file": "نئی فائل", + "toolbar.open": "فائل کھولیں", + "toolbar.save": "محفوظ کریں", + "toolbar.search": "تلاش", + "toolbar.settings": "ترتیبات", + "toolbar.split_view": "تقسیم نظارہ", + "toolbar.theme": "تھیم تبدیل کریں", + "toolbar.toc": "فہرست مضامین", + "toolbar.zoom_in": "زوم ان", + "toolbar.zoom_out": "زوم آؤٹ", + "toolbar.zoom_reset": "زوم ری سیٹ", + "trial.days_remaining": "آزمائشی مدت میں {days} دن باقی", + "trial.expired_message": "آپ کی آزمائشی مدت ختم ہو گئی ہے۔ ترمیم جاری رکھنے کے لیے Kern خریدیں۔", + "trial.feature_edit": "WYSIWYG اور تقسیم نظارے سے Markdown میں ترمیم کریں", + "trial.feature_export": "PDF میں برآمد کریں", + "trial.feature_save": "فائلیں محفوظ کریں اور نئی بنائیں", + "trial.one_time_purchase": "ایک بار کی خریداری۔ کوئی سبسکرپشن نہیں۔", + "trial.purchase_button": "Kern خریدیں", + "trial.purchase_desc": "ایک بار کی خریداری سے تمام ترمیمی اور برآمدی خصوصیات تک مکمل رسائی حاصل کریں۔", + "trial.purchase_title": "Kern کھولیں", + "trial.purchasing": "خریداری ہو رہی ہے...", + "trial.restore_purchases": "خریداریاں بحال کریں", + "trial.restoring": "بحالی ہو رہی ہے...", + "viewer.copied": "کاپی ہو گیا!", + "viewer.copy": "کاپی", + "welcome.drop_hint": "یا .md فائل کو ڈریگ اور ڈراپ کریں", + "welcome.new_button": "نئی فائل", + "welcome.open_button": "فائل کھولیں", + "welcome.subtitle": "ایک خوبصورت مارک ڈاؤن ویوئر", + "welcome.title": "Kern", + "format.block_type": "بلاک کی قسم", + "format.lists": "فہرستیں", + "format.more_elements": "مزید", + "format.text_formatting": "ٹیکسٹ فارمیٹنگ", + "format.underline": "انڈر لائن", + "mermaid.done": "مکمل", + "mermaid.edit": "ترمیم کریں", + "mermaid.error_prefix": "سنٹیکس کی خرابی", + "mermaid.stale": "پریویو پرانا ہو گیا", + "slash.mermaid": "Mermaid ڈایاگرام", + "slash.mermaid_desc": "ڈایاگرام داخل کریں", + "toolbar.done": "مکمل" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-cn/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/zh-cn/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-cn/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-cn/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/zh-cn/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-cn/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-cn/strings.json b/src-mdviewer/src/md-nls-autogenerated/zh-cn/strings.json new file mode 100644 index 0000000000..329493f077 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-cn/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "关闭搜索", + "a11y.edit_link": "编辑链接", + "a11y.format_text": "格式化文本", + "a11y.insert_block": "插入块", + "a11y.main_toolbar": "主工具栏", + "a11y.next_match": "下一个匹配", + "a11y.previous_match": "上一个匹配", + "a11y.search_in_document": "在文档中搜索", + "a11y.search_text": "搜索文本", + "a11y.select_language": "选择语言", + "a11y.sidebar": "侧边栏", + "a11y.skip_to_content": "跳转到内容", + "common.close": "关闭", + "common.file": "文件", + "common.open": "打开", + "context.copy": "复制", + "context.copy_image_address": "复制图片地址", + "context.copy_link": "复制链接", + "context.cut": "剪切", + "context.open_link": "打开链接", + "context.paste": "粘贴", + "context.paste_plain": "粘贴为纯文本", + "context.select_all": "全选", + "dialog.cancel": "取消", + "dialog.discard": "放弃", + "dialog.dont_save": "不保存", + "dialog.save": "保存", + "dialog.unsaved_close": "您有未保存的更改。是否在关闭前保存?", + "dialog.unsaved_exit_edit": "您有未保存的更改。是否在退出编辑模式前保存?", + "dialog.unsaved_new_file": "您有未保存的更改。是否在新建文件前保存?", + "dialog.unsaved_open_file": "您有未保存的更改。是否在打开新文件前保存?", + "dialog.unsaved_title": "未保存的更改", + "drop_zone.text": "将 Markdown 文件拖放到此处", + "export.open": "打开", + "export.success": "PDF 导出成功", + "format.blockquote": "引用", + "format.bold": "粗体 ({mod}+B)", + "format.bullet_list": "无序列表", + "format.code": "行内代码 ({mod}+E)", + "format.code_block": "代码块", + "format.divider": "分隔线", + "format.heading1": "一级标题", + "format.heading2": "二级标题", + "format.heading3": "三级标题", + "format.italic": "斜体 ({mod}+I)", + "format.link": "链接 ({mod}+K)", + "format.numbered_list": "有序列表", + "format.paragraph": "正文", + "format.strikethrough": "删除线 ({mod}+Shift+X)", + "format.table": "表格", + "format.task_list": "任务列表", + "help.editing": "编辑", + "help.fallback_notice": "此页面尚未提供您的语言版本。正在显示英文版本。", + "help.features": "功能", + "help.getting_started": "快速入门", + "help.shortcuts": "键盘快捷键", + "lang_picker.filter_label": "筛选语言", + "lang_picker.filter_placeholder": "筛选语言...", + "lang_picker.plain_text": "纯文本", + "link.apply": "应用链接", + "link.cancel": "取消", + "link.display_text": "显示文本", + "link.edit": "编辑", + "link.edit_link": "编辑链接", + "link.remove_link": "移除链接", + "link.text": "文本", + "link.text_placeholder": "显示文本(可选)", + "link.url": "URL", + "link.url_placeholder": "粘贴或输入 URL...", + "recovery.discard": "放弃", + "recovery.message": "Kern 发现了上次会话中未保存的更改。是否恢复?", + "recovery.restore": "恢复", + "recovery.title": "恢复未保存的更改?", + "search.count": "个匹配", + "search.no_results": "无结果", + "search.placeholder": "在文档中搜索...", + "settings.language": "语言", + "settings.theme": "主题", + "settings.theme_dark": "深色", + "settings.theme_light": "浅色", + "settings.theme_system": "跟随系统", + "sidebar.no_headings": "未找到标题", + "sidebar.recent": "最近文件", + "sidebar.toc": "目录", + "slash.blockquote": "引用", + "slash.blockquote_desc": "引用块", + "slash.bullet_list": "无序列表", + "slash.bullet_list_desc": "项目符号列表", + "slash.code_block": "代码块", + "slash.code_block_desc": "围栏代码", + "slash.divider": "分隔线", + "slash.divider_desc": "水平分隔线", + "slash.heading1": "一级标题", + "slash.heading1_desc": "大标题", + "slash.heading2": "二级标题", + "slash.heading2_desc": "中标题", + "slash.heading3": "三级标题", + "slash.heading3_desc": "小标题", + "slash.no_results": "无结果", + "slash.numbered_list": "有序列表", + "slash.numbered_list_desc": "编号列表", + "slash.paragraph": "正文", + "slash.paragraph_desc": "纯文本", + "slash.table": "表格", + "slash.table_desc": "3×3 表格", + "slash.task_list": "任务列表", + "slash.task_list_desc": "清单", + "table.add_col_left": "在左侧添加列", + "table.add_col_right": "在右侧添加列", + "table.add_row_above": "在上方添加行", + "table.add_row_below": "在下方添加行", + "table.col_options": "第 {n} 列选项", + "table.delete_col": "删除列", + "table.delete_row": "删除行", + "table.header": "表头", + "table.insert_col_left": "在左侧插入列", + "table.insert_col_right": "在右侧插入列", + "table.insert_row_above": "在上方插入行", + "table.insert_row_below": "在下方插入行", + "table.new_row": "+ 新增行", + "table.row_options": "第 {n} 行选项", + "toolbar.edit": "编辑", + "toolbar.export_pdf": "导出 PDF", + "toolbar.focus": "专注模式", + "toolbar.more": "更多", + "toolbar.new_file": "新建文件", + "toolbar.open": "打开文件", + "toolbar.save": "保存", + "toolbar.search": "搜索", + "toolbar.settings": "设置", + "toolbar.split_view": "分屏视图", + "toolbar.theme": "切换主题", + "toolbar.toc": "目录", + "toolbar.zoom_in": "放大", + "toolbar.zoom_out": "缩小", + "toolbar.zoom_reset": "重置缩放", + "trial.days_remaining": "试用期剩余 {days} 天", + "trial.expired_message": "您的试用期已结束。购买 Kern 以继续编辑。", + "trial.feature_edit": "使用 WYSIWYG 和分屏视图编辑 Markdown", + "trial.feature_export": "导出为 PDF", + "trial.feature_save": "保存和新建文件", + "trial.one_time_purchase": "一次性购买,无需订阅。", + "trial.purchase_button": "购买 Kern", + "trial.purchase_desc": "一次购买即可完整使用所有编辑和导出功能。", + "trial.purchase_title": "解锁 Kern", + "trial.purchasing": "购买中...", + "trial.restore_purchases": "恢复购买", + "trial.restoring": "恢复中...", + "viewer.copied": "已复制!", + "viewer.copy": "复制", + "welcome.drop_hint": "或拖放 .md 文件到此处", + "welcome.new_button": "新建文件", + "welcome.open_button": "打开文件", + "welcome.subtitle": "优雅的 Markdown 阅读器", + "welcome.title": "Kern", + "format.block_type": "块类型", + "format.lists": "列表", + "format.more_elements": "更多", + "format.text_formatting": "文本格式", + "format.underline": "下划线", + "mermaid.done": "完成", + "mermaid.edit": "编辑", + "mermaid.error_prefix": "语法错误", + "mermaid.stale": "预览已过时", + "slash.mermaid": "Mermaid 图表", + "slash.mermaid_desc": "插入图表", + "toolbar.done": "完成" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-tw/expertTranslations.json b/src-mdviewer/src/md-nls-autogenerated/zh-tw/expertTranslations.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-tw/expertTranslations.json @@ -0,0 +1 @@ +{} diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-tw/lastTranslated.json b/src-mdviewer/src/md-nls-autogenerated/zh-tw/lastTranslated.json new file mode 100644 index 0000000000..0906deda77 --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-tw/lastTranslated.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "Close search", + "a11y.edit_link": "Edit link", + "a11y.format_text": "Format text", + "a11y.insert_block": "Insert block", + "a11y.main_toolbar": "Main toolbar", + "a11y.next_match": "Next match", + "a11y.previous_match": "Previous match", + "a11y.search_in_document": "Search in document", + "a11y.search_text": "Search text", + "a11y.select_language": "Select language", + "a11y.sidebar": "Sidebar", + "a11y.skip_to_content": "Skip to content", + "common.close": "Close", + "common.file": "File", + "common.open": "Open", + "context.copy": "Copy", + "context.copy_image_address": "Copy Image Address", + "context.copy_link": "Copy Link", + "context.cut": "Cut", + "context.open_link": "Open Link", + "context.paste": "Paste", + "context.paste_plain": "Paste as Plain Text", + "context.select_all": "Select All", + "dialog.cancel": "Cancel", + "dialog.discard": "Discard", + "dialog.dont_save": "Don't Save", + "dialog.save": "Save", + "dialog.unsaved_close": "You have unsaved changes. Do you want to save before closing?", + "dialog.unsaved_exit_edit": "You have unsaved changes. Do you want to save before exiting edit mode?", + "dialog.unsaved_new_file": "You have unsaved changes. Do you want to save before creating a new file?", + "dialog.unsaved_open_file": "You have unsaved changes. Do you want to save before opening a new file?", + "dialog.unsaved_title": "Unsaved Changes", + "drop_zone.text": "Drop your Markdown file here", + "export.open": "Open", + "export.success": "PDF exported successfully", + "format.block_type": "Block type", + "format.blockquote": "Blockquote", + "format.bold": "Bold ({mod}+B)", + "format.bullet_list": "Bullet list", + "format.code": "Inline code ({mod}+E)", + "format.code_block": "Code block", + "format.divider": "Divider", + "format.heading1": "Heading 1", + "format.heading2": "Heading 2", + "format.heading3": "Heading 3", + "format.italic": "Italic ({mod}+I)", + "format.link": "Link ({mod}+K)", + "format.lists": "Lists", + "format.more_elements": "More", + "format.numbered_list": "Numbered list", + "format.paragraph": "Paragraph", + "format.strikethrough": "Strikethrough ({mod}+Shift+X)", + "format.table": "Table", + "format.task_list": "Task list", + "format.text_formatting": "Text formatting", + "format.underline": "Underline", + "help.editing": "Editing", + "help.fallback_notice": "This page is not yet available in your language. Showing the English version.", + "help.features": "Features", + "help.getting_started": "Getting Started", + "help.shortcuts": "Keyboard Shortcuts", + "lang_picker.filter_label": "Filter languages", + "lang_picker.filter_placeholder": "Filter languages...", + "lang_picker.plain_text": "Plain text", + "link.apply": "Apply link", + "link.cancel": "Cancel", + "link.display_text": "Display text", + "link.edit": "Edit", + "link.edit_link": "Edit link", + "link.remove_link": "Remove link", + "link.text": "Text", + "link.text_placeholder": "Display text (optional)", + "link.url": "URL", + "link.url_placeholder": "Paste or type URL...", + "mermaid.done": "Done", + "mermaid.edit": "Edit", + "mermaid.error_prefix": "Syntax error", + "mermaid.stale": "Preview outdated", + "recovery.discard": "Discard", + "recovery.message": "Kern found unsaved changes from a previous session. Do you want to restore them?", + "recovery.restore": "Restore", + "recovery.title": "Recover unsaved changes?", + "search.count": "matches", + "search.no_results": "No results", + "search.placeholder": "Search in document...", + "settings.language": "Language", + "settings.theme": "Theme", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "sidebar.no_headings": "No headings found", + "sidebar.recent": "Recent Files", + "sidebar.toc": "Table of Contents", + "slash.blockquote": "Blockquote", + "slash.blockquote_desc": "Quote block", + "slash.bullet_list": "Bullet list", + "slash.bullet_list_desc": "Unordered list", + "slash.code_block": "Code block", + "slash.code_block_desc": "Fenced code", + "slash.divider": "Divider", + "slash.divider_desc": "Horizontal rule", + "slash.heading1": "Heading 1", + "slash.heading1_desc": "Large heading", + "slash.heading2": "Heading 2", + "slash.heading2_desc": "Medium heading", + "slash.heading3": "Heading 3", + "slash.heading3_desc": "Small heading", + "slash.mermaid": "Mermaid diagram", + "slash.mermaid_desc": "Insert a diagram", + "slash.no_results": "No results", + "slash.numbered_list": "Numbered list", + "slash.numbered_list_desc": "Ordered list", + "slash.paragraph": "Paragraph", + "slash.paragraph_desc": "Plain text", + "slash.table": "Table", + "slash.table_desc": "3×3 table", + "slash.task_list": "Task list", + "slash.task_list_desc": "Checklist", + "table.add_col_left": "Add column left", + "table.add_col_right": "Add column right", + "table.add_row_above": "Add row above", + "table.add_row_below": "Add row below", + "table.col_options": "Column {n} options", + "table.delete_col": "Delete column", + "table.delete_row": "Delete row", + "table.header": "Header", + "table.insert_col_left": "Insert column left", + "table.insert_col_right": "Insert column right", + "table.insert_row_above": "Insert row above", + "table.insert_row_below": "Insert row below", + "table.new_row": "+ New row", + "table.row_options": "Row {n} options", + "toolbar.done": "Done", + "toolbar.edit": "Edit", + "toolbar.export_pdf": "Export PDF", + "toolbar.focus": "Focus Mode", + "toolbar.more": "More", + "toolbar.new_file": "New File", + "toolbar.open": "Open File", + "toolbar.save": "Save", + "toolbar.search": "Search", + "toolbar.settings": "Settings", + "toolbar.split_view": "Split View", + "toolbar.theme": "Toggle Theme", + "toolbar.toc": "Table of Contents", + "toolbar.zoom_in": "Zoom In", + "toolbar.zoom_out": "Zoom Out", + "toolbar.zoom_reset": "Reset Zoom", + "trial.days_remaining": "{days} days left in trial", + "trial.expired_message": "Your trial has expired. Purchase Kern to continue editing.", + "trial.feature_edit": "Edit Markdown with WYSIWYG and split view", + "trial.feature_export": "Export to PDF", + "trial.feature_save": "Save and create new files", + "trial.one_time_purchase": "One-time purchase. No subscription.", + "trial.purchase_button": "Purchase Kern", + "trial.purchase_desc": "Get full access to all editing and export features with a one-time purchase.", + "trial.purchase_title": "Unlock Kern", + "trial.purchasing": "Purchasing...", + "trial.restore_purchases": "Restore Purchases", + "trial.restoring": "Restoring...", + "viewer.copied": "Copied!", + "viewer.copy": "Copy", + "welcome.drop_hint": "or drag & drop a .md file", + "welcome.new_button": "New File", + "welcome.open_button": "Open File", + "welcome.subtitle": "A beautiful Markdown viewer", + "welcome.title": "Kern" +} \ No newline at end of file diff --git a/src-mdviewer/src/md-nls-autogenerated/zh-tw/strings.json b/src-mdviewer/src/md-nls-autogenerated/zh-tw/strings.json new file mode 100644 index 0000000000..a66916cc8c --- /dev/null +++ b/src-mdviewer/src/md-nls-autogenerated/zh-tw/strings.json @@ -0,0 +1,169 @@ +{ + "a11y.close_search": "關閉搜尋", + "a11y.edit_link": "編輯連結", + "a11y.format_text": "格式化文字", + "a11y.insert_block": "插入區塊", + "a11y.main_toolbar": "主工具列", + "a11y.next_match": "下一個符合", + "a11y.previous_match": "上一個符合", + "a11y.search_in_document": "在文件中搜尋", + "a11y.search_text": "搜尋文字", + "a11y.select_language": "選擇語言", + "a11y.sidebar": "側邊欄", + "a11y.skip_to_content": "跳至內容", + "common.close": "關閉", + "common.file": "檔案", + "common.open": "開啟", + "context.copy": "複製", + "context.copy_image_address": "複製圖片位址", + "context.copy_link": "複製連結", + "context.cut": "剪下", + "context.open_link": "開啟連結", + "context.paste": "貼上", + "context.paste_plain": "貼上為純文字", + "context.select_all": "全選", + "dialog.cancel": "取消", + "dialog.discard": "捨棄", + "dialog.dont_save": "不儲存", + "dialog.save": "儲存", + "dialog.unsaved_close": "您有未儲存的變更。要在關閉前儲存嗎?", + "dialog.unsaved_exit_edit": "您有未儲存的變更。要在離開編輯模式前儲存嗎?", + "dialog.unsaved_new_file": "您有未儲存的變更。要在建立新檔案前儲存嗎?", + "dialog.unsaved_open_file": "您有未儲存的變更。要在開啟新檔案前儲存嗎?", + "dialog.unsaved_title": "未儲存的變更", + "drop_zone.text": "將您的 Markdown 檔案拖放至此", + "export.open": "開啟", + "export.success": "PDF 匯出成功", + "format.blockquote": "引用", + "format.bold": "粗體 ({mod}+B)", + "format.bullet_list": "項目符號清單", + "format.code": "行內程式碼 ({mod}+E)", + "format.code_block": "程式碼區塊", + "format.divider": "分隔線", + "format.heading1": "標題 1", + "format.heading2": "標題 2", + "format.heading3": "標題 3", + "format.italic": "斜體 ({mod}+I)", + "format.link": "連結 ({mod}+K)", + "format.numbered_list": "編號清單", + "format.paragraph": "段落", + "format.strikethrough": "刪除線 ({mod}+Shift+X)", + "format.table": "表格", + "format.task_list": "工作清單", + "help.editing": "編輯", + "help.fallback_notice": "此頁面尚未提供您的語言版本。正在顯示英文版本。", + "help.features": "功能", + "help.getting_started": "快速入門", + "help.shortcuts": "鍵盤快捷鍵", + "lang_picker.filter_label": "篩選語言", + "lang_picker.filter_placeholder": "篩選語言...", + "lang_picker.plain_text": "純文字", + "link.apply": "套用連結", + "link.cancel": "取消", + "link.display_text": "顯示文字", + "link.edit": "編輯", + "link.edit_link": "編輯連結", + "link.remove_link": "移除連結", + "link.text": "文字", + "link.text_placeholder": "顯示文字(選填)", + "link.url": "URL", + "link.url_placeholder": "貼上或輸入 URL...", + "recovery.discard": "捨棄", + "recovery.message": "Kern 發現了上次工作階段中未儲存的變更。要復原嗎?", + "recovery.restore": "復原", + "recovery.title": "復原未儲存的變更?", + "search.count": "個符合", + "search.no_results": "沒有結果", + "search.placeholder": "在文件中搜尋...", + "settings.language": "語言", + "settings.theme": "主題", + "settings.theme_dark": "深色", + "settings.theme_light": "淺色", + "settings.theme_system": "系統", + "sidebar.no_headings": "找不到標題", + "sidebar.recent": "最近的檔案", + "sidebar.toc": "目錄", + "slash.blockquote": "引用", + "slash.blockquote_desc": "引用區塊", + "slash.bullet_list": "項目符號清單", + "slash.bullet_list_desc": "無序清單", + "slash.code_block": "程式碼區塊", + "slash.code_block_desc": "圍欄程式碼", + "slash.divider": "分隔線", + "slash.divider_desc": "水平線", + "slash.heading1": "標題 1", + "slash.heading1_desc": "大標題", + "slash.heading2": "標題 2", + "slash.heading2_desc": "中標題", + "slash.heading3": "標題 3", + "slash.heading3_desc": "小標題", + "slash.no_results": "沒有結果", + "slash.numbered_list": "編號清單", + "slash.numbered_list_desc": "有序清單", + "slash.paragraph": "段落", + "slash.paragraph_desc": "純文字", + "slash.table": "表格", + "slash.table_desc": "3×3 表格", + "slash.task_list": "工作清單", + "slash.task_list_desc": "核取清單", + "table.add_col_left": "在左方新增欄", + "table.add_col_right": "在右方新增欄", + "table.add_row_above": "在上方新增列", + "table.add_row_below": "在下方新增列", + "table.col_options": "第 {n} 欄選項", + "table.delete_col": "刪除欄", + "table.delete_row": "刪除列", + "table.header": "標頭", + "table.insert_col_left": "在左方插入欄", + "table.insert_col_right": "在右方插入欄", + "table.insert_row_above": "在上方插入列", + "table.insert_row_below": "在下方插入列", + "table.new_row": "+ 新增列", + "table.row_options": "第 {n} 列選項", + "toolbar.edit": "編輯", + "toolbar.export_pdf": "匯出 PDF", + "toolbar.focus": "專注模式", + "toolbar.more": "更多", + "toolbar.new_file": "新檔案", + "toolbar.open": "開啟檔案", + "toolbar.save": "儲存", + "toolbar.search": "搜尋", + "toolbar.settings": "設定", + "toolbar.split_view": "分割檢視", + "toolbar.theme": "切換主題", + "toolbar.toc": "目錄", + "toolbar.zoom_in": "放大", + "toolbar.zoom_out": "縮小", + "toolbar.zoom_reset": "重設縮放", + "trial.days_remaining": "試用期剩餘 {days} 天", + "trial.expired_message": "您的試用期已結束。購買 Kern 以繼續編輯。", + "trial.feature_edit": "使用 WYSIWYG 和分割檢視編輯 Markdown", + "trial.feature_export": "匯出為 PDF", + "trial.feature_save": "儲存和建立新檔案", + "trial.one_time_purchase": "一次性購買,無需訂閱。", + "trial.purchase_button": "購買 Kern", + "trial.purchase_desc": "一次購買即可完整使用所有編輯和匯出功能。", + "trial.purchase_title": "解鎖 Kern", + "trial.purchasing": "購買中...", + "trial.restore_purchases": "恢復購買", + "trial.restoring": "恢復中...", + "viewer.copied": "已複製!", + "viewer.copy": "複製", + "welcome.drop_hint": "或拖放 .md 檔案", + "welcome.new_button": "新檔案", + "welcome.open_button": "開啟檔案", + "welcome.subtitle": "精美的 Markdown 檢視器", + "welcome.title": "Kern", + "format.block_type": "區塊類型", + "format.lists": "清單", + "format.more_elements": "更多", + "format.text_formatting": "文字格式", + "format.underline": "底線", + "mermaid.done": "完成", + "mermaid.edit": "編輯", + "mermaid.error_prefix": "語法錯誤", + "mermaid.stale": "預覽已過期", + "slash.mermaid": "Mermaid 圖表", + "slash.mermaid_desc": "插入圖表", + "toolbar.done": "完成" +} \ No newline at end of file diff --git a/src-mdviewer/src/styles/app.css b/src-mdviewer/src/styles/app.css new file mode 100644 index 0000000000..f050228571 --- /dev/null +++ b/src-mdviewer/src/styles/app.css @@ -0,0 +1,373 @@ +@import "tailwindcss"; + +/* Theme system */ +@import "./themes/variables.css"; +@import "./themes/light.css"; +@import "./themes/dark.css"; + +/* Markdown rendering */ +@import "./markdown.css"; + +/* Editor */ +@import "./editor.css"; + +/* ===== Base styles ===== */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + height: 100%; + overflow: hidden; + background-color: var(--color-bg); + color: var(--color-text); + font-family: var(--font-body); + font-size: var(--font-size-base); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; +} + +/* ===== App layout ===== */ +#app { + display: grid; + grid-template-rows: auto 1fr; + grid-template-columns: 1fr; + grid-template-areas: + "toolbar" + "viewer"; + height: 100vh; + overflow: hidden; +} + +/* ===== Toolbar ===== */ +.app-toolbar { + grid-area: toolbar; + display: flex; + align-items: center; + gap: var(--space-xs); + padding: 0 var(--space-sm); + height: var(--toolbar-height); + background: var(--color-toolbar-bg); + border-bottom: 1px solid var(--color-toolbar-border); + z-index: var(--z-toolbar); + user-select: none; + overflow-x: clip; + min-width: 0; +} + +.app-toolbar:empty { + display: none; +} + +.toolbar-group { + display: flex; + align-items: center; + gap: var(--space-xs); +} + +.toolbar-spacer { + flex: 1; +} + +.toolbar-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + padding: 0; + border: none; + background: transparent; + color: var(--color-text-secondary); + border-radius: var(--radius-sm); + cursor: pointer; + transition: background var(--transition-fast), color var(--transition-fast); +} + +.toolbar-btn:hover { + background: var(--color-surface-hover); + color: var(--color-text); +} + +.toolbar-btn.active { + color: var(--color-accent); + background: var(--color-accent-subtle); +} + +.cursor-sync-btn, +.cursor-sync-btn.active { + color: var(--color-text-secondary); + background: transparent; +} + +.toolbar-btn svg { + width: 14px; + height: 14px; +} + +.toolbar-divider { + width: 1px; + height: 16px; + background: var(--color-border); + margin: 0 2px; +} + +/* ===== Viewer ===== */ +.app-viewer { + grid-area: viewer; + overflow-y: auto; + overflow-x: hidden; + background: var(--color-bg); + position: relative; + min-height: 0; +} + +/* Scrollbar styling */ +.app-viewer::-webkit-scrollbar { + width: 8px; +} + +.app-viewer::-webkit-scrollbar-track { + background: transparent; +} + +.app-viewer::-webkit-scrollbar-thumb { + background: var(--color-scrollbar); + border-radius: 4px; +} + +.app-viewer::-webkit-scrollbar-thumb:hover { + background: var(--color-scrollbar-hover); +} + +/* ===== Embedded toolbar ===== */ +.embedded-toolbar { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: 0 var(--space-xs); + width: 100%; + min-width: 0; +} + +.embedded-toolbar .format-row { + display: flex; + align-items: center; + gap: 2px; + flex-wrap: nowrap; +} + +.embedded-toolbar .edit-toggle-btn, +.embedded-toolbar .done-btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 1px 6px; + border: 1px solid transparent; + background: transparent; + color: var(--color-text-secondary); + border-radius: 3px; + cursor: pointer; + font-size: 13px; + font-family: var(--font-body); + white-space: nowrap; + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); +} + +.embedded-toolbar .edit-toggle-btn svg, +.embedded-toolbar .done-btn svg { + width: 14px; + height: 14px; +} + +.embedded-toolbar .edit-toggle-btn:hover, +.embedded-toolbar .done-btn:hover { + border-color: var(--color-border); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +.embedded-toolbar .edit-toggle-btn:active, +.embedded-toolbar .done-btn:active { + background: var(--color-surface-hover); + border-color: var(--color-border); +} + +.embedded-toolbar .format-btn { + width: 22px; + height: 22px; +} + +.embedded-toolbar .format-btn svg { + width: 14px; + height: 14px; +} + +.embedded-toolbar .block-type-select { + appearance: none; + -webkit-appearance: none; + padding: 2px var(--space-sm); + padding-right: 20px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background-color: var(--color-bg); + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238b949e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 4px center; + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + cursor: pointer; +} + +.embedded-toolbar .block-type-select:focus { + border-color: var(--color-accent); + outline: none; +} + +/* ===== Search bar ===== */ +.search-bar { + position: fixed; + top: var(--toolbar-height); + right: var(--space-md); + display: none; + align-items: center; + gap: var(--space-sm); + padding: var(--space-xs) var(--space-sm); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + box-shadow: var(--shadow-md); + z-index: var(--z-search); +} + +.search-bar.open { + display: flex; +} + +.search-input { + width: 200px; + padding: 2px var(--space-sm); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-bg); + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + outline: none; +} + +.search-input:focus { + border-color: var(--color-accent); +} + +.search-count { + font-size: var(--font-size-xs); + color: var(--color-text-secondary); + white-space: nowrap; + min-width: 50px; + text-align: center; +} + +.search-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + padding: 0; + border: none; + background: transparent; + color: var(--color-text-secondary); + border-radius: var(--radius-sm); + cursor: pointer; + font-size: 14px; +} + +.search-btn:hover { + background: var(--color-surface-hover); + color: var(--color-text); +} + +/* mark.js highlights */ +mark[data-markjs] { + background: rgba(255, 200, 50, 0.3); + color: inherit; + padding: 0; + border-radius: 2px; +} + +mark[data-markjs].active { + background: rgba(255, 200, 50, 0.7); +} + +/* ===== Toolbar dropdown groups ===== */ +.toolbar-dropdown { + position: relative; +} + +.toolbar-dropdown-trigger { + display: inline-flex; + align-items: center; + gap: 0; + width: auto !important; + padding: 0 2px !important; +} + +.toolbar-dropdown-trigger .dropdown-chevron { + width: 10px; + height: 10px; + opacity: 0.5; +} + +.toolbar-dropdown-panel { + display: none; + position: absolute; + top: 100%; + left: 0; + margin-top: 2px; + padding: 4px; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + z-index: calc(var(--z-toolbar) + 10); + gap: 2px; + flex-direction: row; +} + +.toolbar-dropdown.open .toolbar-dropdown-panel { + display: flex; +} + +/* Menu-style dropdown items with icon + text label */ +.toolbar-dropdown-panel .toolbar-menu-item { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; + width: 100%; + padding: 6px 12px; + white-space: nowrap; + font-size: 13px; + border-radius: var(--radius-sm); + text-align: left; +} + +.toolbar-dropdown-panel .toolbar-menu-item:hover { + background: var(--color-surface-hover); +} + +/* Image dropdown uses vertical layout, right-aligned to avoid overflow */ +.toolbar-dropdown[data-group="image"] .toolbar-dropdown-panel { + flex-direction: column; + min-width: 180px; + left: auto; + right: 0; + padding: 4px; +} diff --git a/src-mdviewer/src/styles/editor.css b/src-mdviewer/src/styles/editor.css new file mode 100644 index 0000000000..95693f8425 --- /dev/null +++ b/src-mdviewer/src/styles/editor.css @@ -0,0 +1,1358 @@ +/* ===== Inline editing ===== */ +#viewer-content.editing { + outline: none; + cursor: text; +} + +#app.edit-mode .app-viewer { + box-shadow: inset 0 0 0 2px var(--color-accent-subtle); +} + +/* ===== Dirty indicator ===== */ +.toolbar-dirty-indicator { + display: none; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--color-alert-warning, #d29922); + flex-shrink: 0; +} + +#app.edit-mode.is-dirty .toolbar-dirty-indicator { + display: inline-block; +} + +/* ===== Edit toolbar group ===== */ +.toolbar-edit-group { + display: none; + align-items: center; + gap: var(--space-xs); +} + +#app.edit-mode .toolbar-edit-group { + display: flex; +} + +/* ===== Persistent format toolbar row ===== */ +.toolbar-format-row { + display: none; + align-items: center; + gap: var(--space-xs); + padding: 0 var(--space-md); + min-height: 36px; + background: var(--color-bg-tertiary); + border-top: 1px solid var(--color-toolbar-border); + border-bottom: 1px solid var(--color-toolbar-border); + user-select: none; + -webkit-app-region: no-drag; + flex-shrink: 0; + overflow-x: clip; +} + +#app.edit-mode .toolbar-format-row { + display: flex; +} + +/* Prevent format row children from shrinking */ +.toolbar-format-row .toolbar-group { + flex-shrink: 0; +} + +.toolbar-format-row .toolbar-divider { + flex-shrink: 0; +} + +/* Adjust grid layout when format row is visible */ +#app.edit-mode { + grid-template-rows: var(--toolbar-height) auto 1fr; + grid-template-areas: + "toolbar toolbar" + "format-row format-row" + "sidebar viewer"; +} + +.toolbar-format-row { + grid-area: format-row; +} + +/* Collapse both toolbar rows in focus+edit mode */ +#app.edit-mode.focus-mode { + grid-template-rows: 0 0 1fr; +} + +/* Block type dropdown */ +.format-block-select { + appearance: none; + -webkit-appearance: none; + padding-block: 2px; + padding-inline: var(--space-sm) var(--space-lg); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background-color: var(--color-surface); + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238b949e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 6px center; + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + cursor: pointer; + min-width: 120px; + height: 28px; +} + +.format-block-select option { + background: var(--color-surface); + color: var(--color-text); +} + +.format-block-select:focus { + border-color: var(--color-accent); + outline: none; + box-shadow: 0 0 0 2px var(--color-accent-subtle); +} + +[dir="rtl"] .format-block-select { + background-position: left 6px center; +} + +/* Format buttons (shared by persistent toolbar and floating bar) */ +.format-btn { + width: 28px; + height: 28px; + color: var(--color-text); + flex-shrink: 0; +} + +.format-btn:hover { + background: var(--color-surface-hover); +} + +.format-btn svg { + width: 16px; + height: 16px; +} + +.format-btn.active { + color: var(--color-accent); + background: var(--color-accent-subtle); +} + +/* ===== Tooltips (CSS-only) ===== */ +[data-tooltip] { + position: relative; +} + +[data-tooltip]:hover::after { + content: attr(data-tooltip); + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + margin-top: 6px; + padding: 4px 8px; + background: var(--color-text); + color: var(--color-bg); + font-size: var(--font-size-xs); + border-radius: var(--radius-sm); + white-space: nowrap; + pointer-events: none; + opacity: 0; + animation: tooltip-fade 150ms ease-out 800ms forwards; + z-index: 400; +} + +@keyframes tooltip-fade { + to { opacity: 1; } +} + +/* ===== Floating format bar ===== */ +.format-bar { + position: fixed; + display: flex; + align-items: center; + gap: 2px; + padding: var(--space-xs); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + z-index: 350; + opacity: 0; + pointer-events: none; + transform: translateY(4px); + transition: opacity 150ms ease-out, transform 150ms ease-out; + will-change: opacity, transform; +} + +.format-bar-buttons { + display: flex; + align-items: center; + gap: 2px; + flex-wrap: nowrap; +} + +.format-bar.visible { + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +.format-bar .toolbar-btn { + width: 28px; + height: 28px; +} + +.format-bar .toolbar-btn svg { + width: 16px; + height: 16px; +} + +.format-bar .toolbar-divider { + height: 16px; + margin: 0 2px; + background: transparent; +} + +/* Format bar link input */ +.format-bar-link-input { + display: flex; + align-items: center; + gap: var(--space-xs); +} + +.format-bar-link-input input { + width: 200px; + padding: 2px var(--space-sm); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-bg); + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + outline: none; +} + +.format-bar-link-input input:focus { + border-color: var(--color-accent); +} + +.format-bar-cancel-btn { + width: 24px; + height: 24px; + font-size: var(--font-size-sm); + flex-shrink: 0; +} + +/* ===== Link popover ===== */ +.link-popover { + position: fixed; + display: flex; + align-items: center; + gap: var(--space-xs); + padding: var(--space-xs) var(--space-sm); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + z-index: 350; + opacity: 0; + pointer-events: none; + transform: translateY(4px); + transition: opacity 150ms ease-out, transform 150ms ease-out; + will-change: opacity, transform; +} + +.link-popover.visible { + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +.link-popover-view { + display: flex; + align-items: center; + gap: var(--space-xs); +} + +.link-popover-url { + max-width: 250px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: var(--font-size-sm); + color: var(--color-accent); + text-decoration: underline; + cursor: pointer; +} + +.link-popover-edit-btn, +.link-popover-unlink-btn, +.link-popover-confirm-btn, +.link-popover-cancel-btn { + width: 28px; + height: 28px; + font-size: var(--font-size-sm); + flex-shrink: 0; +} + +.link-popover-edit-btn { + width: auto; + padding: 0 var(--space-sm); +} + +.link-popover-edit { + display: flex; + flex-direction: column; + gap: var(--space-xs); + position: relative; +} + +.link-popover-top-bar { + display: flex; + justify-content: flex-end; + position: absolute; + top: -2px; + right: -4px; +} + +.link-popover-remove-row { + display: flex; + justify-content: flex-end; + margin-top: 2px; +} + +.link-popover-remove-btn { + display: flex; + align-items: center; + gap: 4px; + width: auto !important; + padding: 2px 8px !important; + font-size: var(--font-size-xs); + color: var(--color-alert-caution); + border-radius: var(--radius-sm); +} + +.link-popover-remove-btn:hover { + background: rgba(255, 50, 50, 0.1); +} + +.link-popover-edit-row { + display: flex; + align-items: center; + gap: var(--space-xs); +} + +.link-popover-label { + font-size: var(--font-size-xs); + color: var(--color-text-secondary); + min-width: 28px; + flex-shrink: 0; +} + +.link-popover-input, +.link-popover-text-input { + width: 200px; + padding: 2px var(--space-sm); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-bg); + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + outline: none; +} + +.link-popover-input:focus, +.link-popover-text-input:focus { + border-color: var(--color-accent); +} + +/* ===== Slash command menu ===== */ +.slash-menu-anchor { + position: fixed; + display: none; + width: 0; + height: 0; + overflow: visible; + pointer-events: none; + z-index: 350; +} + +.slash-menu-anchor.visible { + display: flex; +} + +.slash-menu { + position: absolute; + left: 0; + min-width: 240px; + max-height: 300px; + overflow-y: auto; + padding: var(--space-xs) 0; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); + pointer-events: auto; + animation: menu-enter 120ms ease-out; +} + +@keyframes menu-enter { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} + +.slash-menu-item { + display: flex; + align-items: center; + gap: var(--space-sm); + padding: var(--space-sm) var(--space-md); + cursor: pointer; + color: var(--color-text); + font-size: var(--font-size-sm); + transition: background 80ms ease; +} + +.slash-menu-item:hover, +.slash-menu-item.selected { + background: var(--color-accent-subtle); + color: var(--color-accent); +} + +.slash-menu-item svg { + width: 18px; + height: 18px; + color: var(--color-text-secondary); + flex-shrink: 0; +} + +.slash-menu-item.selected svg, +.slash-menu-item:hover svg { + color: var(--color-accent); +} + +.slash-menu-item-text { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; +} + +.slash-menu-item-label { + font-weight: 500; +} + +.slash-menu-item-desc { + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); +} + +.slash-menu-item-label mark { + background: transparent; + color: var(--color-accent); + font-weight: 600; +} + +.slash-menu-item-hint { + flex-shrink: 0; + margin-inline-start: auto; +} + +.slash-menu-item-hint code { + font-family: var(--font-mono); + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); + background: var(--color-bg-secondary); + padding: 1px 6px; + border-radius: var(--radius-sm); +} + +.slash-menu-overflow { + padding: var(--space-xs) var(--space-md); + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); + text-align: center; + user-select: none; +} + +/* ===== Language picker ===== */ +.lang-picker { + position: fixed; + display: flex; + flex-direction: column; + padding: var(--space-xs) var(--space-sm); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + z-index: 350; + opacity: 0; + pointer-events: none; + transform: translateY(4px); + transition: opacity 150ms ease-out, transform 150ms ease-out; + will-change: opacity, transform; +} + +.lang-picker.visible { + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +.lang-picker-trigger { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: 2px var(--space-sm); + border: none; + border-radius: var(--radius-sm); + background: transparent; + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-mono, "SF Mono", "Cascadia Code", "Fira Code", "Consolas", monospace); + cursor: pointer; + white-space: nowrap; +} + +.lang-picker-trigger:hover { + background: var(--color-surface-hover); +} + +.lang-picker-trigger::after { + content: ""; + display: inline-block; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid currentColor; + margin-left: 4px; +} + +.lang-picker-dropdown { + display: none; + flex-direction: column; + border-top: 1px solid var(--color-border); + margin-top: var(--space-xs); + padding-top: var(--space-xs); +} + +.lang-picker-dropdown.open { + display: flex; +} + +.lang-picker-search { + width: 100%; + padding: 4px var(--space-sm); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-bg); + color: var(--color-text); + font-size: var(--font-size-sm); + font-family: var(--font-body); + outline: none; + box-sizing: border-box; + margin-bottom: var(--space-xs); +} + +.lang-picker-search:focus { + border-color: var(--color-accent); +} + +.lang-picker-list { + overflow-y: auto; + max-height: 200px; +} + +.lang-picker-item { + padding: var(--space-xs) var(--space-sm); + cursor: pointer; + color: var(--color-text); + font-size: var(--font-size-sm); + border-radius: var(--radius-sm); + white-space: nowrap; +} + +.lang-picker-item:hover, +.lang-picker-item.selected { + background: var(--color-accent-subtle); + color: var(--color-accent); +} + +.lang-picker-item.active { + font-weight: 600; +} + +/* ===== Table editing handles (Coda-style) ===== */ +.table-wrapper { + position: relative; + padding-left: 24px; + padding-top: 22px; + padding-right: 28px; + margin-left: -24px; + margin-right: -28px; + margin-bottom: 8px; + overflow-x: auto; + overflow-y: visible; +} + +/* --- Row handles (left gutter) --- */ +.table-row-handles { + position: absolute; + left: 0; + top: 22px; + width: 24px; + display: flex; + flex-direction: column; + visibility: hidden; + z-index: 2; +} + +.table-row-handle { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + margin-left: 2px; + border: none; + background: transparent; + color: var(--color-text-tertiary); + cursor: pointer; + font-size: 11px; + letter-spacing: 1px; + line-height: 1; + border-radius: var(--radius-sm); + padding: 0; + transition: color 0.15s, background 0.15s; + box-sizing: border-box; +} + +.table-row-handle:hover { + background: var(--color-accent-subtle); + color: var(--color-accent); +} + +/* --- Column handles (top gutter) --- */ +.table-col-handles { + position: absolute; + top: 0; + left: 24px; + height: 22px; + display: flex; + flex-direction: row; + align-items: stretch; + visibility: hidden; + z-index: 2; +} + +.table-col-handle { + display: flex; + align-items: center; + justify-content: center; + height: 20px; + margin-top: 2px; + border: none; + background: transparent; + color: var(--color-text-tertiary); + cursor: pointer; + font-size: 11px; + letter-spacing: 1px; + line-height: 1; + border-radius: var(--radius-sm); + padding: 0; + transition: color 0.15s, background 0.15s; + box-sizing: border-box; +} + +.table-col-handle:hover { + background: var(--color-accent-subtle); + color: var(--color-accent); +} + +/* --- "+" column append button --- */ +/* --- "+ New column" button (right side, full height) --- */ +.table-col-add-btn { + position: absolute; + top: 22px; + bottom: 0; + width: 24px; + display: flex; + align-items: center; + justify-content: center; + border: 1px dashed var(--color-border); + background: transparent; + color: var(--color-text-tertiary); + cursor: pointer; + font-size: 14px; + line-height: 1; + border-radius: var(--radius-sm); + visibility: hidden; + padding: 0; + transition: color 0.15s, background 0.15s, border-color 0.15s; + /* left is set dynamically by JS based on table width */ +} + +.table-col-add-btn:hover { + background: var(--color-accent-subtle); + color: var(--color-accent); + border-color: var(--color-accent); +} + +/* --- "+ New row" bar (bottom) --- */ +.table-add-row-btn { + width: 100%; + visibility: hidden; + padding: 4px 0; + margin-top: 2px; + margin-bottom: 4px; + border: 1px dashed var(--color-border); + background: transparent; + color: var(--color-text-tertiary); + cursor: pointer; + font-size: var(--font-size-sm); + line-height: 1.4; + border-radius: var(--radius-sm); + transition: color 0.15s, background 0.15s, border-color 0.15s; +} + +.table-add-row-btn:hover { + background: var(--color-accent-subtle); + color: var(--color-accent); + border-color: var(--color-accent); +} + +/* --- Visibility: show only when active (cursor inside table) --- */ +.table-wrapper.table-active .table-row-handles, +.table-wrapper.table-active .table-col-handles, +.table-wrapper.table-active .table-add-row-btn, +.table-wrapper.table-active .table-col-add-btn { + visibility: visible; +} + +/* Hide gutters when not editing */ +#viewer-content:not(.editing) .table-row-handles, +#viewer-content:not(.editing) .table-col-handles, +#viewer-content:not(.editing) .table-add-row-btn, +#viewer-content:not(.editing) .table-col-add-btn { + visibility: hidden !important; +} + +/* ===== Context menu (shared base) ===== */ +.context-menu { + display: none; + position: fixed; + min-width: 180px; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); + z-index: var(--z-modal); + padding: var(--space-xs) 0; +} + +.context-menu.open { display: block; } + +.context-menu-item { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: 6px 14px; + border: none; + background: transparent; + color: var(--color-text); + font-size: var(--font-size-sm); + text-align: start; + cursor: pointer; + outline: none; +} +.context-menu-item:hover, +.context-menu-item:focus-visible { background: var(--color-surface-hover); } +.context-menu-item.destructive { color: var(--color-alert-caution); } +.context-menu-item[aria-disabled="true"] { + opacity: 0.4; + cursor: default; +} +.context-menu-item-shortcut { + margin-inline-start: 24px; + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); + white-space: nowrap; +} +.context-menu-divider { + height: 1px; + background: var(--color-border); + margin: var(--space-xs) 0; +} + +/* ===== Table context menu (extends shared base) ===== */ +.table-context-menu { + display: none; + position: fixed; + min-width: 180px; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); + z-index: var(--z-modal); + padding: var(--space-xs) 0; +} + +.table-context-menu.open { display: block; } + +.table-context-menu-item { + display: block; + width: 100%; + padding: 6px 14px; + border: none; + background: transparent; + color: var(--color-text); + font-size: var(--font-size-sm); + text-align: start; + cursor: pointer; +} +.table-context-menu-item:hover { background: var(--color-surface-hover); } +.table-context-menu-item.destructive { color: var(--color-alert-caution); } +.table-context-menu-divider { + height: 1px; + background: var(--color-border); + margin: var(--space-xs) 0; +} + +/* ===== Mermaid inline editor ===== */ +.mermaid-edit-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: flex-start; + justify-content: flex-end; + padding: var(--space-sm); + pointer-events: none; + z-index: 5; +} + +.mermaid-edit-overlay-btn { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: 4px 10px; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + background: var(--color-surface); + color: var(--color-text); + font-size: var(--font-size-sm); + cursor: pointer; + pointer-events: auto; + box-shadow: var(--shadow-sm); + opacity: 0; + transition: opacity 150ms ease-out; +} + +.mermaid-diagram:hover .mermaid-edit-overlay-btn { + opacity: 1; +} + +@media (hover: none) { + .mermaid-edit-overlay-btn { + opacity: 1; + } +} + +.mermaid-edit-overlay-btn:hover { + background: var(--color-surface-hover); +} + +.mermaid-edit-overlay-btn svg { + width: 14px; + height: 14px; +} + +/* Editing state */ +.mermaid-diagram.mermaid-editing { + border: 2px solid var(--color-accent); + border-radius: var(--radius-md); + padding: 0; + overflow: hidden; +} + +.mermaid-editor-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-xs) var(--space-sm); + background: var(--color-bg-tertiary); + border-bottom: 1px solid var(--color-border); +} + +.mermaid-editor-label { + font-size: var(--font-size-sm); + font-weight: 500; + color: var(--color-text-secondary); +} + +.mermaid-editor-toolbar-actions { + display: flex; + align-items: center; + gap: var(--space-xs); +} + +.mermaid-editor-done-btn { + padding: 2px 10px; + font-size: var(--font-size-sm); + border-radius: var(--radius-sm); + background: var(--color-accent); + color: #fff; + border: none; + cursor: pointer; +} + +.mermaid-editor-done-btn:hover { + filter: brightness(1.1); +} + +.mermaid-editor-close-btn { + font-size: 18px; + line-height: 1; + color: var(--color-text-tertiary); + background: transparent; + border: none; + cursor: pointer; + padding: 0 4px; +} + +.mermaid-editor-close-btn:hover { + color: var(--color-text); +} + +.mermaid-source-editor { + padding: var(--space-sm); + background: var(--color-bg); +} + +.mermaid-source-textarea { + width: 100%; + min-height: 60px; + max-height: 300px; + padding: var(--space-sm); + margin: 0; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-bg); + color: var(--color-text); + font-family: var(--font-mono, "SF Mono", "Cascadia Code", "Fira Code", "Consolas", monospace); + font-size: var(--font-size-sm); + line-height: 1.5; + resize: none; + outline: none; + overflow-y: auto; + box-sizing: border-box; +} + +.mermaid-source-textarea:focus { + border-color: var(--color-accent); + box-shadow: 0 0 0 2px var(--color-accent-subtle); +} + +.mermaid-error-bar { + padding: var(--space-xs) var(--space-sm); + background: var(--color-alert-warning-bg, rgba(210, 153, 34, 0.1)); + color: var(--color-alert-warning, #d29922); + font-size: var(--font-size-sm); + border-top: 1px solid var(--color-border); +} + +.mermaid-preview { + padding: var(--space-sm); + max-height: 400px; + overflow: auto; + border-top: 1px solid var(--color-border); + background: var(--color-bg); + transition: opacity 200ms ease; +} + +.mermaid-preview.stale { + opacity: 0.4; +} + +.mermaid-preview svg { + max-width: 100%; + height: auto; +} + +/* Hide overlay in non-edit mode */ +#viewer-content:not(.editing) .mermaid-edit-overlay { + display: none !important; +} + +/* ===== Placeholder for empty editor ===== */ +#viewer-content.editing:empty::before { + content: "Start writing, or type / for commands..."; + color: var(--color-text-tertiary); + pointer-events: none; + font-style: italic; +} + +/* ===== Split view layout ===== */ +.edit-mode.split-view .app-viewer { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + overflow: hidden; +} + +.edit-mode.split-view .app-viewer > .welcome-screen { + display: none; +} + +.edit-mode.split-view #viewer-content { + overflow-y: auto; + overflow-x: hidden; + height: 100%; + min-width: 0; + max-width: 100%; /* bound to grid cell */ + isolation: isolate; /* contain sticky headers within this panel */ +} + +/* overflow-x: auto is now on .table-wrapper directly */ + +.edit-mode.split-view .raw-editor-panel { + min-width: 0; +} + +/* ===== Raw editor panel ===== */ +.raw-editor-panel { + display: none; + flex-direction: column; + border-inline-start: 1px solid var(--color-border); + overflow: hidden; +} + +/* CodeMirror 6 editor */ +.raw-editor-panel .cm-editor { + height: 100%; + width: 100%; +} + +.raw-editor-panel .cm-scroller { + overflow: auto; +} + +/* CM6 scrollbar styling */ +.raw-editor-panel .cm-scroller::-webkit-scrollbar { + width: 8px; +} + +.raw-editor-panel .cm-scroller::-webkit-scrollbar-track { + background: transparent; +} + +.raw-editor-panel .cm-scroller::-webkit-scrollbar-thumb { + background: var(--color-scrollbar); + border-radius: 4px; +} + +.raw-editor-panel .cm-scroller::-webkit-scrollbar-thumb:hover { + background: var(--color-scrollbar-hover); +} + +.raw-editor-panel textarea { + width: 100%; + height: 100%; + padding: var(--space-lg); + margin: 0; + border: none; + resize: none; + background: var(--color-bg); + color: var(--color-text); + font-family: var(--font-mono, "SF Mono", "Cascadia Code", "Fira Code", "Consolas", monospace); + font-size: var(--font-size-sm); + line-height: 1.6; + outline: none; + overflow-y: auto; +} + +/* ===== Cursor-sync highlights ===== */ +.cm-synced-line { + background-color: var(--color-accent-subtle) !important; +} + +.cm-synced-cursor { + display: inline-block; + width: 2px; + height: 1.2em; + margin-inline-start: -1px; + background-color: var(--color-accent); + border-radius: 1px; + vertical-align: text-bottom; + animation: synced-cursor-blink 1s step-end infinite; +} + +.cursor-synced-block { + border-inline-start: 3px solid var(--color-accent); + margin-inline-start: -3px; +} + +#viewer-content { + position: relative; +} + +.synced-cursor { + position: absolute; + width: 2px; + background-color: var(--color-accent); + border-radius: 1px; + pointer-events: none; + z-index: 10; + animation: synced-cursor-blink 1s step-end infinite; +} + +@keyframes synced-cursor-blink { + 50% { opacity: 0; } +} + +/* ===== Confirm dialog (unsaved changes) ===== */ +.confirm-dialog-backdrop { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.45); + z-index: calc(var(--z-modal) + 10); + display: flex; + align-items: center; + justify-content: center; + animation: confirm-backdrop-in 150ms ease-out; +} + +@keyframes confirm-backdrop-in { + from { opacity: 0; } + to { opacity: 1; } +} + +.confirm-dialog { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + width: 420px; + max-width: calc(100vw - 32px); + padding: var(--space-lg); + animation: confirm-dialog-in 150ms ease-out; +} + +@keyframes confirm-dialog-in { + from { opacity: 0; transform: scale(0.95); } + to { opacity: 1; transform: scale(1); } +} + +.confirm-dialog-title { + margin: 0 0 var(--space-sm) 0; + font-size: var(--font-size-lg); + font-weight: 600; + color: var(--color-text); + line-height: var(--line-height-heading); +} + +.confirm-dialog-message { + margin: 0 0 var(--space-lg) 0; + font-size: var(--font-size-base); + color: var(--color-text-secondary); + line-height: var(--line-height); +} + +.confirm-dialog-buttons { + display: flex; + align-items: center; + gap: var(--space-sm); +} + +/* Push cancel + save to the end, discard stays at start */ +.confirm-dialog-btn-cancel { + margin-inline-start: auto; +} + +.confirm-dialog-btn { + padding: 6px 16px; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + font-size: var(--font-size-sm); + font-family: var(--font-body); + cursor: pointer; + outline: none; + transition: background 80ms ease, border-color 80ms ease; + white-space: nowrap; +} + +.confirm-dialog-btn:focus-visible { + box-shadow: 0 0 0 2px var(--color-accent-subtle); +} + +.confirm-dialog-btn-discard { + background: transparent; + color: var(--color-text); +} + +.confirm-dialog-btn-discard:hover { + background: var(--color-surface-hover); +} + +.confirm-dialog-btn-cancel { + background: transparent; + color: var(--color-text); +} + +.confirm-dialog-btn-cancel:hover { + background: var(--color-surface-hover); +} + +.confirm-dialog-btn-save { + background: var(--color-accent); + color: #fff; + border-color: var(--color-accent); + font-weight: 500; +} + +.confirm-dialog-btn-save:hover { + filter: brightness(1.1); +} + +/* ===== Toast / snackbar ===== */ +.toast { + position: fixed; + bottom: var(--space-lg); + left: 50%; + transform: translateX(-50%) translateY(0); + display: flex; + align-items: center; + gap: var(--space-sm); + padding: 10px 16px; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); + z-index: 10000; + font-size: var(--font-size-sm); + color: var(--color-text); + animation: toast-in 200ms ease-out; +} + +.toast-enter { + opacity: 0; + transform: translateX(-50%) translateY(12px); +} + +.toast-exit { + opacity: 0; + transform: translateX(-50%) translateY(12px); + transition: opacity 200ms ease-in, transform 200ms ease-in; +} + +@keyframes toast-in { + from { opacity: 0; transform: translateX(-50%) translateY(12px); } + to { opacity: 1; transform: translateX(-50%) translateY(0); } +} + +.toast-message { + white-space: nowrap; +} + +.toast-action { + padding: 4px 12px; + border: none; + border-radius: var(--radius-sm); + background: var(--color-accent); + color: #fff; + font-size: var(--font-size-sm); + font-family: var(--font-body); + font-weight: 500; + cursor: pointer; + white-space: nowrap; +} + +.toast-action:hover { + filter: brightness(1.1); +} + +/* ===== Print ===== */ +@media print { + @page { + margin: 20mm 25mm; + } + + /* Force light theme colors for print */ + :root, [data-theme] { + --color-bg: #ffffff !important; + --color-bg-secondary: #f6f8fa !important; + --color-bg-tertiary: #eaeef2 !important; + --color-surface: #ffffff !important; + --color-text: #1f2328 !important; + --color-text-secondary: #656d76 !important; + --color-text-tertiary: #8b949e !important; + --color-accent: #0969da !important; + --color-border: #d0d7de !important; + --color-border-subtle: #e8ecf0 !important; + --color-code-bg: #f6f8fa !important; + --color-code-text: #1f2328 !important; + --color-code-border: #d0d7de !important; + --color-link: #0969da !important; + --color-alert-note: #0969da !important; + --color-alert-note-bg: #ddf4ff !important; + --color-alert-tip: #1a7f37 !important; + --color-alert-tip-bg: #dafbe1 !important; + --color-alert-important: #8250df !important; + --color-alert-important-bg: #fbefff !important; + --color-alert-warning: #9a6700 !important; + --color-alert-warning-bg: #fff8c5 !important; + --color-alert-caution: #d1242f !important; + --color-alert-caution-bg: #ffebe9 !important; + --color-table-border: #d0d7de !important; + --color-table-row-alt: #f6f8fa !important; + } + + #toolbar, + .raw-editor-panel, + .raw-editor-panel .cm-editor, + .toolbar-edit-group, + .toolbar-dirty-indicator, + .toolbar-format-row, + .format-bar, + .link-popover, + .slash-menu, + .lang-picker, + .table-row-handles, + .table-col-handles, + .table-add-row-btn, + .table-col-add-btn, + .context-menu, + .table-context-menu, + .confirm-dialog-backdrop, + .mermaid-edit-overlay, + .mermaid-editor-toolbar, + .mermaid-source-editor, + .mermaid-error-bar, + .toast { + display: none !important; + } + + html, body { + height: auto !important; + overflow: visible !important; + } + + #app { + display: block !important; + height: auto !important; + overflow: visible !important; + } + + .app-viewer { + overflow: visible !important; + height: auto !important; + min-height: 0 !important; + } + + #viewer-content { + padding: 0 !important; + margin: 0 !important; + overflow: visible !important; + height: auto !important; + } +} diff --git a/src-mdviewer/src/styles/markdown.css b/src-mdviewer/src/styles/markdown.css new file mode 100644 index 0000000000..99c36d8973 --- /dev/null +++ b/src-mdviewer/src/styles/markdown.css @@ -0,0 +1,539 @@ +/* Markdown content rendering */ +.markdown-body { + padding: var(--space-xl) var(--space-lg); + color: var(--color-text); + font-family: var(--font-body); + font-size: var(--font-size-content); + line-height: var(--line-height); + letter-spacing: var(--letter-spacing); + word-wrap: break-word; + max-width: var(--content-max-width); + margin-inline: auto; +} + +/* Headings — Confluence/Atlassian scale */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: var(--space-xl); + margin-bottom: var(--space-sm); + font-weight: 700; + color: var(--color-text); + letter-spacing: normal; + line-height: var(--line-height-heading); + text-wrap: balance; +} + +.markdown-body h1 { + font-size: 2em; + letter-spacing: -0.015em; + padding-bottom: 0.3em; + border-bottom: 1px solid var(--color-border-subtle); +} + +.markdown-body h2 { + font-size: 1.5em; + letter-spacing: -0.015em; + padding-bottom: 0.3em; + border-bottom: 1px solid var(--color-border-subtle); +} + +.markdown-body h3 { font-size: 1.25em; } +.markdown-body h4 { font-size: 1.125em; } +.markdown-body h5 { font-size: 1em; } +.markdown-body h6 { font-size: 0.875em; color: var(--color-text-secondary); } + +.markdown-body h1:first-child, +.markdown-body h2:first-child, +.markdown-body h3:first-child { + margin-top: 0; +} + +/* Paragraphs */ +.markdown-body p { + margin-top: 0; + margin-bottom: 1em; +} + +/* Links */ +.markdown-body a { + color: var(--color-link); + text-decoration: none; + transition: color var(--transition-fast); +} + +.markdown-body a:hover { + color: var(--color-link-hover); + text-decoration: underline; +} + +/* Images */ +.markdown-body img { + max-width: 100%; + height: auto; + border-radius: var(--radius-md); + border: 1px solid var(--color-border-subtle); +} + +/* Inline code */ +.markdown-body code:not(pre code) { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + font-family: var(--font-mono); + background-color: var(--color-code-bg); + border-radius: var(--radius-sm); + color: var(--color-code-text); +} + +/* Code blocks */ +.markdown-body pre { + position: relative; + margin-bottom: var(--space-md); + padding: var(--space-md); + overflow: auto; + font-size: var(--font-size-sm); + line-height: 1.45; + background-color: var(--color-code-bg); + border: 1px solid var(--color-code-border); + border-radius: var(--radius-md); +} + +.markdown-body pre code { + display: block; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; + font-family: var(--font-mono); +} + +/* Language badge */ +.markdown-body pre[data-language]::before { + content: attr(data-language); + position: absolute; + top: 0; + inset-inline-end: 0; + padding: 2px var(--space-sm); + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); + background-color: var(--color-bg-tertiary); + border-radius: 0 var(--radius-md) 0 var(--radius-sm); + text-transform: uppercase; + font-family: var(--font-mono); + letter-spacing: 0.05em; +} + +[dir="rtl"] .markdown-body pre[data-language]::before { + border-radius: var(--radius-md) 0 var(--radius-sm) 0; +} + +/* Copy button */ +.code-copy-btn { + position: absolute; + top: var(--space-sm); + inset-inline-end: var(--space-sm); + padding: var(--space-xs) var(--space-sm); + font-size: var(--font-size-xs); + color: var(--color-text-secondary); + background: var(--color-bg-tertiary); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + cursor: pointer; + opacity: 0; + transition: opacity var(--transition-fast), background var(--transition-fast); + z-index: 1; +} + +.markdown-body pre:hover .code-copy-btn { + opacity: 1; +} + +.code-copy-btn:hover { + background: var(--color-surface-hover); + color: var(--color-text); +} + +.code-copy-btn.copied { + color: var(--color-alert-tip); +} + +/* When language badge is present, adjust copy button position */ +.markdown-body pre[data-language] .code-copy-btn { + top: calc(var(--font-size-xs) + var(--space-sm) + 4px); +} + +/* Blockquotes */ +.markdown-body blockquote { + margin: 0 0 var(--space-md) 0; + padding: 0 1em; + color: var(--color-text-secondary); + border-inline-start: 4px solid var(--color-border); +} + +.markdown-body blockquote > :first-child { margin-top: 0; } +.markdown-body blockquote > :last-child { margin-bottom: 0; } + +/* GitHub Alerts */ +.markdown-alert { + margin-bottom: var(--space-md); + padding: var(--space-md); + border-inline-start: 4px solid; + border-radius: var(--radius-md); +} + +.markdown-alert-title { + display: flex; + align-items: center; + gap: var(--space-sm); + font-weight: 600; + margin-bottom: var(--space-sm); +} + +.markdown-alert-icon { + font-size: 1.1em; +} + +.markdown-alert-note { + border-color: var(--color-alert-note); + background: var(--color-alert-note-bg); +} +.markdown-alert-note .markdown-alert-title { color: var(--color-alert-note); } + +.markdown-alert-tip { + border-color: var(--color-alert-tip); + background: var(--color-alert-tip-bg); +} +.markdown-alert-tip .markdown-alert-title { color: var(--color-alert-tip); } + +.markdown-alert-important { + border-color: var(--color-alert-important); + background: var(--color-alert-important-bg); +} +.markdown-alert-important .markdown-alert-title { color: var(--color-alert-important); } + +.markdown-alert-warning { + border-color: var(--color-alert-warning); + background: var(--color-alert-warning-bg); +} +.markdown-alert-warning .markdown-alert-title { color: var(--color-alert-warning); } + +.markdown-alert-caution { + border-color: var(--color-alert-caution); + background: var(--color-alert-caution-bg); +} +.markdown-alert-caution .markdown-alert-title { color: var(--color-alert-caution); } + +/* Tables */ +.markdown-body .table-wrapper { + overflow-x: auto; + overflow-y: visible; +} + +.markdown-body table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid var(--color-table-border); + border-radius: 6px; +} + +.markdown-body table th, +.markdown-body table td { + padding: 8px 16px; + border-bottom: 1px solid var(--color-table-border); + vertical-align: top; + min-height: calc(1em * var(--line-height) + 16px); +} + +/* Ensure empty cells keep their height in edit mode */ +.markdown-body table td:empty, +.markdown-body table td:has(> br:only-child) { + height: calc(1em * var(--line-height) + 16px); +} + +.markdown-body table th + th, +.markdown-body table td + td { + border-inline-start: 1px solid var(--color-table-border); +} + +.markdown-body table th { + font-weight: 600; + background-color: var(--color-bg-secondary); + position: sticky; + top: 0; + z-index: 1; +} + +.markdown-body table thead tr { + border-bottom: 2px solid var(--color-table-border); +} + +.markdown-body table tr:nth-child(2n) { + background-color: var(--color-table-row-alt); +} + +.markdown-body table tbody tr:hover { + background-color: var(--color-table-row-hover); +} + +.markdown-body table tbody tr:last-child td { + border-bottom: none; +} + +/* Lists */ +.markdown-body ul, +.markdown-body ol { + margin-top: 0; + margin-bottom: var(--space-md); + padding-inline-start: 2em; +} + +.markdown-body ul { + list-style-type: disc; +} + +.markdown-body ol { + list-style-type: decimal; +} + +.markdown-body li + li { + margin-top: 0.25em; +} + +.markdown-body li > p { + margin-top: 0; + margin-bottom: 0; +} + +/* Task lists */ +.markdown-body .contains-task-list { + list-style: none; + padding-inline-start: 0; +} + +.markdown-body .task-list-item { + position: relative; + padding-inline-start: 1.75em; +} + +.markdown-body .task-list-item input[type="checkbox"] { + position: absolute; + inset-inline-start: 0; + top: 0.3em; + width: 1em; + height: 1em; + accent-color: var(--color-accent); + pointer-events: none; +} + +/* Horizontal rule */ +.markdown-body hr { + height: 0; + margin: var(--space-xl) 0; + padding: 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 2px solid var(--color-border); +} + +/* Definition lists */ +.markdown-body dt { + font-weight: 600; + margin-top: var(--space-md); +} + +.markdown-body dd { + margin-inline-start: var(--space-lg); + margin-bottom: var(--space-sm); +} + +/* Footnotes */ +.markdown-body .footnote-ref { + font-size: 0.75em; + vertical-align: super; + line-height: 0; +} + +.markdown-body .footnotes { + margin-top: var(--space-2xl); + padding-top: var(--space-md); + border-top: 1px solid var(--color-border); + font-size: var(--font-size-sm); + color: var(--color-text-secondary); +} + +/* Strikethrough */ +.markdown-body del { + color: var(--color-text-secondary); +} + +/* Mark / highlight */ +.markdown-body mark { + background-color: var(--color-highlight); + padding: 0.1em 0.2em; + border-radius: 2px; +} + +/* Superscript / Subscript */ +.markdown-body sup { font-size: 0.75em; } +.markdown-body sub { font-size: 0.75em; } + +/* Spoiler */ +.markdown-body span[data-spoiler] { + background: var(--color-text); + color: transparent; + border-radius: 2px; + cursor: pointer; + transition: all var(--transition-normal); + padding: 0 0.2em; +} + +.markdown-body span[data-spoiler]:hover, +.markdown-body span[data-spoiler].revealed { + background: transparent; + color: inherit; +} + +/* Details / Summary */ +.markdown-body details { + margin-bottom: var(--space-md); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + padding: var(--space-sm) var(--space-md); +} + +.markdown-body details summary { + cursor: pointer; + font-weight: 600; + padding: var(--space-xs) 0; +} + +.markdown-body details[open] summary { + margin-bottom: var(--space-sm); +} + +/* Selection — match Phoenix editor selection colors. + Toggled via .content-focused class on window focus/blur since + ::selection + :focus doesn't work in WebKit. */ +.markdown-body ::selection { + background-color: var(--color-selection-bg-unfocused); +} + +.markdown-body.content-focused ::selection { + background-color: var(--color-selection-bg); +} + +/* Help fallback notice (shown when docs not available in user's language) */ +.help-fallback-notice { + margin-bottom: var(--space-md); + padding: var(--space-sm) var(--space-md); + border-inline-start: 4px solid var(--color-alert-note); + border-radius: var(--radius-md); + background: var(--color-alert-note-bg); + color: var(--color-text-secondary); + font-size: 0.9em; + line-height: 1.5; +} + +/* Empty line placeholder hint — shown only at cursor position */ +.markdown-body.editing .cursor-empty-hint { + position: relative; +} + +.markdown-body.editing .cursor-empty-hint::after { + content: "Type / to insert"; + position: absolute; + left: 0; + top: 0; + color: var(--color-text-tertiary); + pointer-events: none; + opacity: 0.5; +} + +/* Instant scroll for cursor sync; heading navigation uses JS scrollIntoView */ +.markdown-body { + scroll-behavior: auto; +} + +/* ===== Selection highlight from CodeMirror ===== */ +.cm-selection-highlight { + background-color: rgba(100, 150, 255, 0.12); + border-radius: 2px; + transition: background-color 150ms ease; +} + +[data-theme="light"] .cm-selection-highlight { + background-color: rgba(50, 100, 220, 0.1); +} + +/* ===== Mermaid diagrams ===== */ + +.mermaid-diagram { + margin-bottom: var(--space-md); + text-align: center; + overflow: hidden; + border-radius: var(--radius-md); + border: 1px solid var(--color-border-subtle); + background: var(--color-bg-secondary); + position: relative; +} + +.mermaid-diagram svg { + max-width: 100%; + height: auto; + display: block; + margin: 0 auto; +} + +/* Skeleton placeholder */ +.mermaid-skeleton { + min-height: 200px; + background: var(--color-bg-tertiary); + border-radius: var(--radius-md); + animation: mermaid-pulse 1.5s ease-in-out infinite; +} + +@keyframes mermaid-pulse { + 0%, 100% { opacity: 0.6; } + 50% { opacity: 1; } +} + +@media (prefers-reduced-motion: reduce) { + .mermaid-skeleton { animation: none; opacity: 0.8; } +} + +/* Error state */ +.mermaid-diagram.mermaid-error { + text-align: start; + border-color: var(--color-alert-caution); + padding: var(--space-md); + cursor: default; +} + +.mermaid-error-message { + font-weight: 600; + color: var(--color-alert-caution); + margin-bottom: var(--space-sm); + display: flex; + align-items: center; + gap: var(--space-sm); +} + +.mermaid-error-source { + margin: 0; + font-size: var(--font-size-sm); +} + +.mermaid-error-source pre { + margin: var(--space-sm) 0 0; + font-size: var(--font-size-xs); +} + diff --git a/src-mdviewer/src/styles/syntax/prism-dark.css b/src-mdviewer/src/styles/syntax/prism-dark.css new file mode 100644 index 0000000000..b7d2414126 --- /dev/null +++ b/src-mdviewer/src/styles/syntax/prism-dark.css @@ -0,0 +1,65 @@ +/* Atom One Dark inspired syntax theme */ +[data-theme="dark"] .token.comment, +[data-theme="dark"] .token.prolog, +[data-theme="dark"] .token.doctype, +[data-theme="dark"] .token.cdata { + color: #5c6370; + font-style: italic; +} + +[data-theme="dark"] .token.punctuation { + color: #abb2bf; +} + +[data-theme="dark"] .token.property, +[data-theme="dark"] .token.tag, +[data-theme="dark"] .token.boolean, +[data-theme="dark"] .token.number, +[data-theme="dark"] .token.constant, +[data-theme="dark"] .token.symbol, +[data-theme="dark"] .token.deleted { + color: #e06c75; +} + +[data-theme="dark"] .token.selector, +[data-theme="dark"] .token.attr-name, +[data-theme="dark"] .token.string, +[data-theme="dark"] .token.char, +[data-theme="dark"] .token.builtin, +[data-theme="dark"] .token.inserted { + color: #98c379; +} + +[data-theme="dark"] .token.operator, +[data-theme="dark"] .token.entity, +[data-theme="dark"] .token.url, +[data-theme="dark"] .language-css .token.string, +[data-theme="dark"] .style .token.string { + color: #56b6c2; +} + +[data-theme="dark"] .token.atrule, +[data-theme="dark"] .token.attr-value, +[data-theme="dark"] .token.keyword { + color: #c678dd; +} + +[data-theme="dark"] .token.function, +[data-theme="dark"] .token.class-name { + color: #61afef; +} + +[data-theme="dark"] .token.regex, +[data-theme="dark"] .token.important, +[data-theme="dark"] .token.variable { + color: #d19a66; +} + +[data-theme="dark"] .token.important, +[data-theme="dark"] .token.bold { + font-weight: bold; +} + +[data-theme="dark"] .token.italic { + font-style: italic; +} diff --git a/src-mdviewer/src/styles/syntax/prism-light.css b/src-mdviewer/src/styles/syntax/prism-light.css new file mode 100644 index 0000000000..e172b0b6e1 --- /dev/null +++ b/src-mdviewer/src/styles/syntax/prism-light.css @@ -0,0 +1,65 @@ +/* Atom One Light inspired syntax theme */ +[data-theme="light"] .token.comment, +[data-theme="light"] .token.prolog, +[data-theme="light"] .token.doctype, +[data-theme="light"] .token.cdata { + color: #a0a1a7; + font-style: italic; +} + +[data-theme="light"] .token.punctuation { + color: #383a42; +} + +[data-theme="light"] .token.property, +[data-theme="light"] .token.tag, +[data-theme="light"] .token.boolean, +[data-theme="light"] .token.number, +[data-theme="light"] .token.constant, +[data-theme="light"] .token.symbol, +[data-theme="light"] .token.deleted { + color: #e45649; +} + +[data-theme="light"] .token.selector, +[data-theme="light"] .token.attr-name, +[data-theme="light"] .token.string, +[data-theme="light"] .token.char, +[data-theme="light"] .token.builtin, +[data-theme="light"] .token.inserted { + color: #50a14f; +} + +[data-theme="light"] .token.operator, +[data-theme="light"] .token.entity, +[data-theme="light"] .token.url, +[data-theme="light"] .language-css .token.string, +[data-theme="light"] .style .token.string { + color: #0184bc; +} + +[data-theme="light"] .token.atrule, +[data-theme="light"] .token.attr-value, +[data-theme="light"] .token.keyword { + color: #a626a4; +} + +[data-theme="light"] .token.function, +[data-theme="light"] .token.class-name { + color: #4078f2; +} + +[data-theme="light"] .token.regex, +[data-theme="light"] .token.important, +[data-theme="light"] .token.variable { + color: #c18401; +} + +[data-theme="light"] .token.important, +[data-theme="light"] .token.bold { + font-weight: bold; +} + +[data-theme="light"] .token.italic { + font-style: italic; +} diff --git a/src-mdviewer/src/styles/themes/dark.css b/src-mdviewer/src/styles/themes/dark.css new file mode 100644 index 0000000000..483d4a475b --- /dev/null +++ b/src-mdviewer/src/styles/themes/dark.css @@ -0,0 +1,65 @@ +[data-theme="dark"] { + color-scheme: dark; + --color-bg: #1E1E1E; + --color-bg-secondary: #252526; + --color-bg-tertiary: #2D2D2D; + --color-surface: #252526; + --color-surface-hover: #2D2D2D; + + --color-text: #E0E0E0; + --color-text-secondary: #9E9E9E; + --color-text-tertiary: #757575; + + --color-accent: #539bf5; + --color-accent-hover: #6cb6ff; + --color-accent-subtle: #539bf526; + + --color-border: #3E3E3E; + --color-border-subtle: #2D2D2D; + + /* Code */ + --color-code-bg: #252526; + --color-code-text: #E0E0E0; + --color-code-border: #3E3E3E; + + /* Toolbar */ + --color-toolbar-bg: #252526; + --color-toolbar-border: #3E3E3E; + + /* Sidebar */ + --color-sidebar-bg: #252526; + --color-sidebar-border: #3E3E3E; + + /* Links */ + --color-link: #539bf5; + --color-link-hover: #6cb6ff; + + /* Alerts */ + --color-alert-note: #539bf5; + --color-alert-note-bg: #539bf526; + --color-alert-tip: #57ab5a; + --color-alert-tip-bg: #57ab5a26; + --color-alert-important: #986ee2; + --color-alert-important-bg: #986ee226; + --color-alert-warning: #c69026; + --color-alert-warning-bg: #ae7c1426; + --color-alert-caution: #e5534b; + --color-alert-caution-bg: #e5534b26; + + /* Table */ + --color-table-border: #3E3E3E; + --color-table-row-alt: #252526; + --color-table-row-hover: #2D2D2D; + + /* Selection — match Phoenix CodeMirror selection colors */ + --color-selection-bg: #0050a0; + --color-selection-bg-unfocused: #333f48; + + /* Search highlight */ + --color-highlight: #ae7c1426; + --color-highlight-active: #c69026; + + /* Scrollbar */ + --color-scrollbar: #3E3E3E; + --color-scrollbar-hover: #4E4E4E; +} diff --git a/src-mdviewer/src/styles/themes/light.css b/src-mdviewer/src/styles/themes/light.css new file mode 100644 index 0000000000..8d6e7125dc --- /dev/null +++ b/src-mdviewer/src/styles/themes/light.css @@ -0,0 +1,65 @@ +[data-theme="light"] { + color-scheme: light; + --color-bg: #ffffff; + --color-bg-secondary: #f6f8fa; + --color-bg-tertiary: #eaeef2; + --color-surface: #ffffff; + --color-surface-hover: #f3f4f6; + + --color-text: #1f2328; + --color-text-secondary: #656d76; + --color-text-tertiary: #8b949e; + + --color-accent: #0969da; + --color-accent-hover: #0550ae; + --color-accent-subtle: #ddf4ff; + + --color-border: #d0d7de; + --color-border-subtle: #e8ecf0; + + /* Code */ + --color-code-bg: #f6f8fa; + --color-code-text: #1f2328; + --color-code-border: #d0d7de; + + /* Toolbar */ + --color-toolbar-bg: #f6f8fa; + --color-toolbar-border: #d0d7de; + + /* Sidebar */ + --color-sidebar-bg: #f6f8fa; + --color-sidebar-border: #d0d7de; + + /* Links */ + --color-link: #0969da; + --color-link-hover: #0550ae; + + /* Alerts */ + --color-alert-note: #0969da; + --color-alert-note-bg: #ddf4ff; + --color-alert-tip: #1a7f37; + --color-alert-tip-bg: #dafbe1; + --color-alert-important: #8250df; + --color-alert-important-bg: #fbefff; + --color-alert-warning: #9a6700; + --color-alert-warning-bg: #fff8c5; + --color-alert-caution: #d1242f; + --color-alert-caution-bg: #ffebe9; + + /* Table */ + --color-table-border: #d0d7de; + --color-table-row-alt: #f6f8fa; + --color-table-row-hover: #eef3f8; + + /* Selection — match Phoenix CodeMirror selection colors */ + --color-selection-bg: #abdffa; + --color-selection-bg-unfocused: #d5dee3; + + /* Search highlight */ + --color-highlight: #fff8c5; + --color-highlight-active: #ffd33d; + + /* Scrollbar */ + --color-scrollbar: #c1c8cf; + --color-scrollbar-hover: #9ba3ab; +} diff --git a/src-mdviewer/src/styles/themes/variables.css b/src-mdviewer/src/styles/themes/variables.css new file mode 100644 index 0000000000..7788bd72c0 --- /dev/null +++ b/src-mdviewer/src/styles/themes/variables.css @@ -0,0 +1,48 @@ +:root { + /* Typography — Atlassian/Confluence style */ + --font-body: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", Ubuntu, Cantarell, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji"; + --font-ui: var(--font-body); + --font-mono: ui-monospace, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", monospace; + --font-size-base: 16px; + --font-size-sm: 14px; + --font-size-xs: 12px; + --font-size-lg: 18px; + --font-size-content: clamp(1rem, 0.925rem + 0.25vw, 1.125rem); + --line-height: 1.6; + --line-height-heading: 1.25; + --content-max-width: 1100px; + --letter-spacing: normal; + + /* Layout */ + --sidebar-width: 280px; + --toolbar-height: 30px; + + /* Spacing */ + --space-xs: 4px; + --space-sm: 8px; + --space-md: 16px; + --space-lg: 24px; + --space-xl: 32px; + --space-2xl: 48px; + + /* Borders */ + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 8px; + + /* Transitions */ + --transition-fast: 150ms ease; + --transition-normal: 250ms ease; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + + /* Z-index layers */ + --z-sidebar: 100; + --z-toolbar: 200; + --z-overlay: 300; + --z-modal: 400; + --z-search: 500; +} diff --git a/src-mdviewer/to-create-tests.md b/src-mdviewer/to-create-tests.md new file mode 100644 index 0000000000..7064be0712 --- /dev/null +++ b/src-mdviewer/to-create-tests.md @@ -0,0 +1,248 @@ +# Markdown Viewer/Editor — Integration Tests To Create + +## Keyboard Shortcut Forwarding +- [x] Ctrl+S in edit mode triggers Phoenix save (not consumed by md editor) +- [ ] Ctrl+P in edit mode opens Quick Open +- [x] Ctrl+Shift+F in edit mode opens Find in Files +- [x] Ctrl+B/I/U in edit mode applies bold/italic/underline (not forwarded) +- [x] Ctrl+K in edit mode opens link input (not forwarded) +- [x] Ctrl+Shift+X in edit mode applies strikethrough (not forwarded) +- [x] Ctrl+Z/Y/Shift+Z in edit mode triggers undo/redo via CM (routed through Phoenix undo stack) +- [x] Ctrl+A in edit mode selects all text natively (C/V/X not testable due to browser security) +- [x] Escape in edit mode sends focus back to Phoenix editor +- [x] F-key shortcuts (e.g. F8 for live preview toggle) work in edit mode +- [x] F-key shortcuts work in reader mode + +## Document Cache & File Switching +- [ ] Switching between two MD files is instant (no re-render, DOM cached) +- [ ] Scroll position preserved per-document on switch +- [ ] Edit/reader mode preserved globally across file switches +- [ ] Switching MD → HTML → MD reuses persistent md iframe (no reload) +- [ ] Closing live preview panel and reopening preserves md iframe and cache +- [ ] Project switch clears all cached documents but preserves edit/reader mode +- [ ] Edit mode persists when switching projects (was in edit → open new project md → still edit) +- [ ] Working set changes sync to iframe (files removed from working set go to LRU) +- [ ] LRU cache evicts beyond 20 non-working-set files +- [ ] Reload button (in LP toolbar) re-renders current file, preserves scroll and edit mode + +## Selection Sync (Bidirectional) +- [ ] Selecting text in CM highlights corresponding block in md viewer +- [ ] Selecting text in md viewer selects corresponding text in CM +- [ ] Clicking in md viewer (no selection) clears CM selection +- [ ] Clicking in CM clears md viewer highlight +- [ ] Selection sync respects cursor sync toggle (disabled when sync off) + +## Cursor/Scroll Sync +- [ ] Clicking in CM scrolls md viewer to corresponding element +- [ ] Clicking in md viewer scrolls CM to corresponding line (centered) +- [ ] Cursor sync toggle button disables/enables bidirectional sync +- [ ] Cursor sync toggle state preserved across toolbar re-renders (file switch, mode toggle) +- [ ] Content sync still works when cursor sync is disabled +- [ ] Cursor sync toggle works in both reader and edit mode +- [ ] Disabling cursor sync in reader mode prevents CM scroll on click +- [ ] Cursor sync works on newly edited elements after edit→reader switch +- [ ] Edit→reader switch re-renders from CM content (data-source-line attrs refreshed) +- [ ] Switching MD files preserves current edit/reader mode +- [ ] Edit mode not reset when switching between MD files + +## Edit Mode & Entitlement Gating +- [ ] Free user sees Edit button → clicking shows upsell dialog +- [ ] Pro user sees Edit button → clicking enters edit mode +- [ ] Entitlement change (free→pro) switches to edit mode automatically +- [ ] Entitlement change (pro→free) switches to reader mode automatically +- [ ] Edit/Reader toggle works correctly in the iframe toolbar + +## Toolbar & UI +- [ ] Phoenix play button and mode dropdown hidden for MD files +- [ ] Phoenix play button and mode dropdown visible for HTML files +- [ ] Phoenix play button and mode dropdown visible for custom server MD files +- [ ] Progressive toolbar collapse: blocks collapse first, then lists, then text formatting +- [ ] Toolbar collapse thresholds work at various widths +- [ ] Dropdown menus in collapsed toolbar open and close correctly +- [ ] Format buttons apply formatting and close dropdown +- [ ] Tooltip delay is 800ms (not too aggressive) +- [ ] Underline button has shortcut in tooltip (Ctrl+U / ⌘U) +- [ ] Reader button has book-open icon and "Switch to reader mode" title +- [ ] Edit button has pencil icon and "Switch to edit mode" title +- [ ] 1px white line at bottom of preview not visible (box-sizing: border-box on toolbar) + +## Checkbox (Task List) Sync +- [ ] Clicking checkbox in edit mode toggles it and syncs to CM source ([x] ↔ [ ]) +- [ ] Checkboxes enabled in edit mode, disabled in reader mode +- [ ] Checkbox toggle creates an undo entry +- [ ] Undo reverses checkbox toggle + +## Format Bar & Link Popover +- [ ] Format bar appears on text selection (single line, not wrapping) +- [ ] Format bar includes underline button +- [ ] Format bar dismissed on scroll +- [ ] Link popover appears when clicking a link in edit mode +- [ ] Link popover URL opens in default browser (not Electron window) +- [ ] Link popover dismissed on scroll +- [ ] Escape in link popover only dismisses popover, refocuses editor +- [ ] Escape in slash menu only dismisses menu, refocuses editor +- [ ] Escape in lang picker only dismisses picker, refocuses editor + +## Empty Line Placeholder +- [ ] Empty paragraph in edit mode shows "Type / for commands" hint text +- [ ] Hint disappears as soon as user types +- [ ] Hint only shows in edit mode, not reader mode +- [ ] Hint shows on paragraphs with only a `
` child + +## Slash Menu (/ command) +- [ ] Slash menu appears at the / cursor position (not at top of page) +- [ ] Slash menu opens below cursor when space available +- [ ] Slash menu opens above cursor when near bottom of viewport +- [ ] Slash menu has gap between cursor line and menu (not overlapping) +- [ ] Typing after / filters the menu items (e.g. /h1 shows Heading 1) +- [ ] Arrow down/up scrolls selected item into view when outside viewport +- [ ] Escape dismisses slash menu without forwarding to Phoenix +- [ ] Escape refocuses the md editor after dismissing slash menu +- [ ] Selected item wraps around (last → first, first → last) +- [ ] Slash menu works at bottom of a long scrolled document + +## Keyboard Shortcut Focus +- [ ] Ctrl+S saves file and keeps focus in md editor (not CM) +- [ ] Forwarded shortcuts refocus md editor after Phoenix handles them + +## Code Block Editing +- [ ] ArrowDown on last line of code block exits to paragraph below +- [ ] ArrowDown on last line creates new `` if none exists below +- [ ] ArrowDown on last line moves to existing next sibling if present +- [ ] ArrowDown on non-last line navigates normally within code block +- [ ] Shift+Enter on last line of code block exits to paragraph below +- [ ] Shift+Enter on non-last line does NOT exit (normal behavior) +- [ ] Enter inside code block creates new line (not exit) +- [ ] Code block exit syncs new paragraph to CM source +- [ ] Intermediate code blocks: Shift+Enter exits on last line +- [ ] Last code block in document: ArrowDown creates `
` and exits + +## Table Editing +- [ ] Clearing a table cell with backspace produces valid markdown (no broken pipe rows) +- [ ] Empty table cell renders as `| |` in markdown source +- [ ] Table cell with `
` only-child is treated as empty (br stripped before conversion) +- [ ] Table cell with actual content + `
` preserves the line break +- [ ] Tab navigation between table cells works +- [ ] Adding new row via Tab at last cell works +- [ ] Delete row / delete column via context menu works and syncs to CM +- [ ] Table header editing syncs correctly to CM +- [ ] Enter key blocked in table cells (no paragraph/line break insertion) +- [ ] Shift+Enter blocked in table cells +- [ ] Block-level format buttons hidden when cursor is in table (quote, hr, table, codeblock, lists) +- [ ] Block type selector (Paragraph/H1/H2/H3) hidden when cursor is in table +- [ ] Dropdown groups for lists and blocks hidden when cursor is in table +- [ ] Pasting multi-line text in table cell converts to single line (newlines → spaces) +- [ ] Moving cursor out of table restores all toolbar buttons +- [ ] ArrowRight at end of last cell exits table to paragraph below +- [ ] ArrowDown from last cell exits table to paragraph below +- [ ] Enter in last cell exits table to paragraph below +- [ ] If no paragraph exists below table, one is created on exit +- [ ] If paragraph exists below table, cursor moves into it (no duplicate) +- [ ] Cursor in table wrapper gap (outside cells) + Enter exits table +- [ ] Cursor in table wrapper gap (outside cells) + typing is blocked +- [ ] Table rows don't visually expand when cursor is in wrapper gap +- [ ] "Delete table" option appears in table right-click context menu +- [ ] "Delete table" option appears in row handle menu +- [ ] "Delete table" option appears in column handle menu +- [ ] Deleting table removes entire table-wrapper from DOM +- [ ] Deleting table places cursor in next sibling element +- [ ] Deleting table at end of document creates new empty paragraph +- [ ] Deleting table syncs removal to CM source +- [ ] Deleting table creates undo entry (Ctrl+Z restores table) +- [ ] Add-column button (+) has visible dashed border matching add-row button style +- [ ] Add-column button visible when table is active (cursor inside) + +## List Editing +- [ ] Enter in a list item splits content at cursor into two `` elements +- [ ] Enter on empty list item exits list and creates paragraph below +- [ ] Shift+Enter in list item inserts `
` (line break within same bullet) +- [ ] Tab in list item indents it (nests inside sub-list under previous sibling) +- [ ] Shift+Tab in list item outdents it to parent level +- [ ] Shift+Tab outdent preserves trailing siblings as sub-list of moved item +- [ ] Tab at first list item (no previous sibling) does nothing +- [ ] Cursor position preserved after Tab indent +- [ ] Cursor position preserved after Shift+Tab outdent +- [ ] Enter in list creates proper `` that syncs to markdown `- ` or `1. ` in CM +- [ ] Nested list indentation syncs correctly to markdown (2 or 4 space indent) + +## UL/OL Toggle (List Type Switching) +- [ ] Clicking UL button when in OL switches nearest parent list to ` ` +- [ ] Clicking OL button when in UL switches nearest parent list to `
` +- [ ] UL/OL toggle only affects nearest parent list (not all ancestor lists) +- [ ] UL/OL toggle preserves list content and nesting +- [ ] UL/OL toggle syncs to CM (e.g. `1. item` → `- item`) +- [ ] Toolbar UL button shows active state when cursor is in UL +- [ ] Toolbar OL button shows active state when cursor is in OL +- [ ] Block-level buttons (quote, hr, table, codeblock) hidden when cursor is in list +- [ ] Block type selector (Paragraph/H1/H2/H3) hidden when cursor is in list +- [ ] List buttons remain visible when cursor is in list (for UL/OL switching) +- [ ] Moving cursor out of list restores all toolbar buttons + +## Image Handling +- [ ] Images not reloaded when editing text in CM (DOM nodes preserved) +- [ ] GIFs don't blink/restart when editing text elsewhere +- [ ] Image upload placeholder (uploading.svg) is not preserved across updates +- [ ] End key near image goes to end of current block (not end of file) on Win/Linux +- [ ] Home key near image goes to start of current block (not start of file) on Win/Linux +- [ ] Cmd+Right near image goes to end of block on Mac +- [ ] Cmd+Left near image goes to start of block on Mac +- [ ] End/Home work normally on lines without images + +## Heading Editing +- [ ] Enter at start of heading (|Heading) inserts empty `
` above, heading shifts down +- [ ] Enter in middle of heading splits: text before stays heading, text after becomes `
` +- [ ] Enter at end of heading creates new empty `
` below (no content split) +- [ ] Enter in middle syncs correctly to CM (heading line + new paragraph line) +- [ ] Shift+Enter in heading creates empty `
` below without moving content +- [ ] Shift+Enter moves cursor to new `
`, heading text untouched +- [ ] Backspace at start of heading converts heading to `
` (strips ### prefix in CM) +- [ ] Backspace at start of heading preserves content and cursor position +- [ ] Backspace at start of heading updates toolbar from "Heading N" to "Paragraph" +- [ ] Heading-to-paragraph conversion syncs correctly to CM source +- [ ] Backspace in middle of heading works normally (deletes character) + +## Undo/Redo +- [ ] Ctrl+Z undoes change in both md editor and CM (single undo stack) +- [ ] Ctrl+Shift+Z / Ctrl+Y redoes change in both +- [ ] Cursor restored to correct block element (source-line) after undo +- [ ] Cursor restored to correct offset within block after undo +- [ ] Undo/redo cursor works when editing at different positions in document +- [ ] Typing in CM and undoing in CM doesn't interfere with md editor +- [ ] Multiple rapid edits can be undone one by one + +## Scroll Behavior +- [ ] Cursor sync scroll is instant (not smooth animated) +- [ ] Scroll restore on file switch uses exact pixel position (no jump) +- [ ] Scroll restore on reload uses source-line-based positioning +- [ ] No progressive scroll-down on reload with many images (source-line approach) + +## Border & Styling +- [ ] Subtle bottom border on #mainNavBar (rgba(255,255,255,0.08)) +- [ ] Subtle bottom border on #live-preview-plugin-toolbar (rgba(255,255,255,0.08)) +- [ ] No medium-zoom magnifying glass cursor on images +- [ ] Cursor sync icon is subtle (secondary text color, not accent blue) + +## Translation (i18n) +- [ ] en.json strings load correctly (toolbar.reader, format.underline, etc.) +- [ ] Locale with region code (e.g. en-GB) falls back to base (en) if specific file missing +- [ ] No "Failed to load locale" console warnings for valid locales +- [ ] gulp translateStrings translates both Phoenix NLS and mdviewer locales +- [ ] Translated locale files copied back to src-mdviewer/src/locales/ + +## In-Document Search (Ctrl+F) +- [ ] Ctrl+F opens search bar in md viewer (both edit and reader mode) +- [ ] Ctrl+F with text selected pre-fills search and highlights closest match as active +- [ ] Typing in search input highlights matches with debounce (300ms) +- [ ] Match count shows "N/total" format +- [ ] Enter / Arrow Down navigates to next match +- [ ] Shift+Enter / Arrow Up navigates to previous match +- [ ] Navigation wraps around (last → first, first → last) +- [ ] Active match scrolls into view (instant, centered) +- [ ] Escape closes search bar and restores cursor to previous position +- [ ] Escape in search does NOT forward to Phoenix (no focus steal) +- [ ] Closing search clears all mark.js highlights +- [ ] Search works across cached document DOMs (uses #viewer-content) +- [ ] × button closes search +- [ ] Search starts from 1 character +- [ ] Switching documents with search open re-runs search on new document +- [ ] Switching back to previous document restores search match index (e.g. was on 3/5, returns to 3/5) diff --git a/src-mdviewer/vite.config.js b/src-mdviewer/vite.config.js new file mode 100644 index 0000000000..4792a6f288 --- /dev/null +++ b/src-mdviewer/vite.config.js @@ -0,0 +1,25 @@ +import { defineConfig } from "vite"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig({ + plugins: [tailwindcss()], + base: "./", + + build: { + outDir: "../src/mdViewer", + emptyOutDir: true, + modulePreload: false, + rollupOptions: { + output: { + manualChunks: { + mermaid: ["mermaid"] + } + } + } + }, + + server: { + port: 1421, + strictPort: true + } +}); diff --git a/src-node/package-lock.json b/src-node/package-lock.json index ebbaa71bca..9f0b4d406b 100644 --- a/src-node/package-lock.json +++ b/src-node/package-lock.json @@ -2647,7 +2647,6 @@ "version": "4.0.3", "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, diff --git a/src/editor/EditorCommandHandlers.js b/src/editor/EditorCommandHandlers.js index 2f4a025271..df76575eb6 100644 --- a/src/editor/EditorCommandHandlers.js +++ b/src/editor/EditorCommandHandlers.js @@ -37,7 +37,11 @@ define(function (require, exports, module) { TokenUtils = require("utils/TokenUtils"), CodeMirror = require("thirdparty/CodeMirror/lib/codemirror"), _ = require("thirdparty/lodash"), - ChangeHelper = require("editor/EditorHelper/ChangeHelper"); + ChangeHelper = require("editor/EditorHelper/ChangeHelper"), + LanguageManager = require("language/LanguageManager"), + ImageUploadManager = require("features/ImageUploadManager"), + Dialogs = require("widgets/Dialogs"), + AppInit = require("utils/AppInit"); /** * List of constants @@ -1262,6 +1266,159 @@ define(function (require, exports, module) { return result.promise(); } + // --- Image paste-to-upload for markdown files --- + const ALLOWED_IMAGE_TYPES = ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"]; + + function _handleImagePaste(editor, cm, event) { + const items = event.clipboardData && event.clipboardData.items; + if (!items) { + return false; + } + + // Find an image item in the clipboard + let imageItem = null; + for (let i = 0; i < items.length; i++) { + if (items[i].kind === "file" && ALLOWED_IMAGE_TYPES.indexOf(items[i].type) !== -1) { + imageItem = items[i]; + break; + } + } + if (!imageItem) { + return false; + } + + // Only handle in markdown files + const doc = editor.document; + if (!doc || !doc.file) { + return false; + } + const lang = LanguageManager.getLanguageForPath(doc.file.fullPath); + const langId = lang ? lang.getId() : ""; + if (langId !== "markdown" && langId !== "gfm") { + return false; + } + + // Check if upload provider is available + if (!ImageUploadManager.isImageUploadAvailable()) { + return false; + } + + event.preventDefault(); + + const blob = imageItem.getAsFile(); + const fileName = blob.name || ("image." + blob.type.split("/")[1]); + const provider = ImageUploadManager.getImageUploadProvider(); + const cmDoc = cm.getDoc(); + + // Upload asynchronously — provider shows confirmation dialog before uploading. + // Placeholder is inserted only after confirmation via onUploadStart callback. + let marker = null; + + function _clearPlaceholder() { + if (marker) { + const range = marker.find(); + marker.clear(); + if (range) { + cmDoc.replaceRange("", range.from, range.to); + } + marker = null; + } + } + + provider.uploadImage(blob, fileName, function onUploadStart() { + // Insert placeholder after user confirms (avoids dirtying the file on cancel) + const cursor = cmDoc.getCursor(); + const placeholder = ``; + cmDoc.replaceRange(placeholder, cursor); + const from = cursor; + const to = { line: cursor.line, ch: cursor.ch + placeholder.length }; + marker = cmDoc.markText(from, to, { className: "image-uploading", clearWhenEmpty: false }); + }).then(function (result) { + if (result.embedURL) { + // Success — replace placeholder with final embed + if (marker) { + const range = marker.find(); + marker.clear(); + marker = null; + if (range) { + cmDoc.replaceRange(``, range.from, range.to); + } + } + } else if (result.error === "cancelled") { + // User cancelled confirmation — nothing was inserted + } else if (result.error === "login_required") { + _clearPlaceholder(); + const previewURL = URL.createObjectURL(blob); + const loginHTML = `
+`; + const dialog = Dialogs.showModalDialog( + "", + Strings.IMAGE_UPLOAD_LOGIN_REQUIRED_TITLE, + loginHTML, + [ + { className: Dialogs.DIALOG_BTN_CLASS_NORMAL, id: Dialogs.DIALOG_BTN_CANCEL, + text: Strings.CANCEL }, + { className: Dialogs.DIALOG_BTN_CLASS_PRIMARY, id: "login", + text: Strings.IMAGE_UPLOAD_LOGIN_BTN } + ] + ); + dialog.done(function (id) { + URL.revokeObjectURL(previewURL); + if (id === "login") { + const profileBtn = document.getElementById("user-profile-button"); + if (profileBtn) { + profileBtn.click(); + } + } + }); + } else if (result.errorCode === "UPGRADE_TO_PRO") { + _clearPlaceholder(); + const ProDialogs = brackets.getModule( + "extensionsIntegrated/phoenix-pro/services/pro-dialogs" + ); + if (ProDialogs && ProDialogs.showUpsellDialog) { + ProDialogs.showUpsellDialog( + Strings.IMAGE_UPLOAD_LIMIT_TITLE, + result.errorLoc, + "imgUpload" + ); + } + } else { + _clearPlaceholder(); + console.error("Image upload failed:", result.error, result.errorLoc); + Dialogs.showModalDialog( + "", + Strings.IMAGE_UPLOAD_FAILED, + result.errorLoc || Strings.IMAGE_UPLOAD_FAILED + ); + } + }).catch(function (err) { + _clearPlaceholder(); + console.error("Image upload error:", err); + }); + + return true; + } + + // Listen for paste events on the editor holder (capture phase) so image pastes + // are intercepted even when CM doesn't fire its own "paste" event (e.g. image-only clipboard). + AppInit.appReady(function () { + const editorHolder = document.getElementById("editor-holder"); + if (editorHolder) { + editorHolder.addEventListener("paste", function (e) { + const editor = EditorManager.getFocusedEditor(); + if (!editor) { + return; + } + _handleImagePaste(editor, editor._codeMirror, e); + }, true); + } + }); + // Register commands CommandManager.register(Strings.CMD_INDENT, Commands.EDIT_INDENT, indentText); CommandManager.register(Strings.CMD_UNINDENT, Commands.EDIT_UNINDENT, unindentText); diff --git a/src/extensions/default/DarkTheme/package.json b/src/extensions/default/DarkTheme/package.json index 7b1b5ca6c4..9837dcd674 100644 --- a/src/extensions/default/DarkTheme/package.json +++ b/src/extensions/default/DarkTheme/package.json @@ -1,5 +1,5 @@ { - "title": "Phoenix Dark", + "title": "Phoenix Dark Neo", "name": "dark-theme", "description": "Built-in dark theme for Phoenix", "version": "0.44.0", diff --git a/src/extensions/default/LightTheme/package.json b/src/extensions/default/LightTheme/package.json index 89076f938f..cccae16340 100644 --- a/src/extensions/default/LightTheme/package.json +++ b/src/extensions/default/LightTheme/package.json @@ -1,5 +1,5 @@ { - "title": "Phoenix Light", + "title": "Phoenix Light Neo", "name": "light-theme", "description": "Built-in light theme for Phoenix", "version": "0.42.0", diff --git a/src/extensionsIntegrated/Phoenix-live-preview/BrowserStaticServer.js b/src/extensionsIntegrated/Phoenix-live-preview/BrowserStaticServer.js index 8eeec7bfc8..21c0f8b28c 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/BrowserStaticServer.js +++ b/src/extensionsIntegrated/Phoenix-live-preview/BrowserStaticServer.js @@ -120,6 +120,10 @@ define(function (require, exports, module) { +`"details":"${message}"}`); } + function getMdviewrURL() { + return `${window.Phoenix.baseURL}mdViewer/index.html`; + } + function _isLivePreviewSupported() { // in safari, service workers are disabled in third party iframes. We use phcode.live for secure sandboxing // live previews into its own domain apart from phcode.dev. Since safari doesn't support this, we are left @@ -782,6 +786,7 @@ define(function (require, exports, module) { exports.getTabPopoutURL = getTabPopoutURL; exports.hasActiveLivePreviews = hasActiveLivePreviews; exports.getNoPreviewURL = getNoPreviewURL; + exports.getMdviewrURL = getMdviewrURL; exports.getRemoteTransportScript = getRemoteTransportScript; exports.PHCODE_LIVE_PREVIEW_QUERY_PARAM = PHCODE_LIVE_PREVIEW_QUERY_PARAM; exports.EVENT_SERVER_READY = EVENT_SERVER_READY; diff --git a/src/extensionsIntegrated/Phoenix-live-preview/MarkdownSync.js b/src/extensionsIntegrated/Phoenix-live-preview/MarkdownSync.js new file mode 100644 index 0000000000..211268baed --- /dev/null +++ b/src/extensionsIntegrated/Phoenix-live-preview/MarkdownSync.js @@ -0,0 +1,846 @@ +/* + * GNU AGPL-3.0 License + * + * Copyright (c) 2021 - present core.ai . All rights reserved. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://opensource.org/licenses/AGPL-3.0. + * + * Bidirectional sync between Phoenix's CM5 document editor and the mdviewr iframe. + * Handles content sync, theme sync, locale sync, and edit mode relay. + */ + +define(function (require, exports, module) { + + const ThemeManager = require("view/ThemeManager"), + NativeApp = require("utils/NativeApp"), + EditorManager = require("editor/EditorManager"), + utils = require("./utils"); + + let _active = false; + let _doc = null; + let _$iframe = null; + let _mdIframeRef = null; // persistent reference to the md iframe DOM element, survives deactivate + let _baseURL = ""; + let _syncId = 0; + let _lastReceivedSyncId = -1; + let _syncingFromIframe = false; + let _iframeReady = false; + let _debounceTimer = null; + let _scrollSyncTimer = null; + let _selectionSyncTimer = null; + let _messageHandler = null; + let _docChangeHandler = null; + let _themeChangeHandler = null; + let _cursorHandler = null; + let _onEditModeRequest = null; + let _onIframeReadyCallback = null; + let _cursorSyncEnabled = true; + // Stacks of cursor positions { sourceLine, offsetInBlock } for undo/redo restore + let _cursorUndoStack = []; + let _cursorRedoStack = []; + + const DEBOUNCE_TO_IFRAME_MS = 150; + const SCROLL_SYNC_DEBOUNCE_MS = 100; + const SELECTION_SYNC_DEBOUNCE_MS = 200; + + /** + * Start syncing for the given document and iframe. + * If the iframe is the same as the previous activation (e.g. switching between markdown files), + * content is sent immediately without waiting for mdviewrReady. + * + * @param {Document} doc - Phoenix CM5 Document + * @param {jQuery} $iframe - The iframe jQuery element + * @param {string} baseURL - Base URL for resolving relative image/resource paths + */ + function activate(doc, $iframe, baseURL) { + if (_active) { + deactivate(); + } + + _doc = doc; + // Check if this is the same iframe we've used before (persistent md iframe) + const reusingIframe = _mdIframeRef && $iframe[0] === _mdIframeRef; + _$iframe = $iframe; + _mdIframeRef = $iframe[0]; + _baseURL = baseURL; + _active = true; + _iframeReady = reusingIframe; + _syncId = 0; + _lastReceivedSyncId = -1; + + // Listen for messages from iframe + _messageHandler = function (event) { + if (!_active) { + return; + } + const data = event.data; + if (!data || data.type !== "MDVIEWR_EVENT") { + return; + } + // Verify message is from our iframe + if (_$iframe && _$iframe[0] && event.source !== _$iframe[0].contentWindow) { + return; + } + + switch (data.eventName) { + case "mdviewrReady": + _onIframeReady(); + break; + case "mdviewrContentChanged": + _onIframeContentChanged(data); + break; + case "mdviewrUndo": + _handleUndo(); + break; + case "mdviewrRedo": + _handleRedo(); + break; + case "mdviewrEditModeChanged": + // When switching to reader, send CM content so the iframe + // can re-render with accurate data-source-line for cursor sync. + if (!data.editMode && _doc) { + const iframeWindow = _getIframeWindow(); + if (iframeWindow) { + iframeWindow.postMessage({ + type: "MDVIEWR_RERENDER_CONTENT", + markdown: _doc.getText() + }, "*"); + } + } + break; + case "mdviewrRequestEditMode": + if (_onEditModeRequest) { + _onEditModeRequest(); + } + break; + case "mdviewrCursorSyncToggle": + _cursorSyncEnabled = !!data.enabled; + break; + case "mdviewrImageUploadRequest": + _handleImageUploadFromIframe(data); + break; + case "mdviewrKeyboardShortcut": + _forwardKeyboardShortcut(data); + break; + case "embeddedIframeFocusEditor": + if (_cursorSyncEnabled && data.sourceLine != null) { + _scrollCMToLine(data.sourceLine); + } + utils.focusActiveEditorIfFocusInLivePreview(); + break; + case "mdviewrScrollSync": + if (_cursorSyncEnabled && data.sourceLine != null) { + _scrollCMToLine(data.sourceLine); + } + break; + case "mdviewrSelectionSync": + if (_cursorSyncEnabled) { + _handleSelectionFromIframe(data); + } + break; + case "embeddedIframeHrefClick": + _handleHrefClick(data); + break; + case "embeddedEscapeKeyPressed": + utils.focusActiveEditorIfFocusInLivePreview(); + break; + } + }; + window.addEventListener("message", _messageHandler); + + // Listen for CM5 document changes (Phoenix → iframe) + let _lastChangeOrigin = null; + _docChangeHandler = function () { + if (_syncingFromIframe) { + return; + } + if (!_iframeReady) { + return; + } + clearTimeout(_debounceTimer); + _debounceTimer = setTimeout(function () { + _sendUpdate(_lastChangeOrigin); + _lastChangeOrigin = null; + }, DEBOUNCE_TO_IFRAME_MS); + }; + _doc.on("change", _docChangeHandler); + + // Listen for theme changes + _themeChangeHandler = function () { + _sendTheme(); + }; + ThemeManager.on("themeChange", _themeChangeHandler); + + // Listen for cursor activity in CM5 for scroll sync and selection sync (CM5 → iframe) + _cursorHandler = function () { + if (_syncingFromIframe || !_iframeReady || !_cursorSyncEnabled) { + return; + } + clearTimeout(_scrollSyncTimer); + _scrollSyncTimer = setTimeout(function () { + _syncScrollToIframe(); + }, SCROLL_SYNC_DEBOUNCE_MS); + clearTimeout(_selectionSyncTimer); + _selectionSyncTimer = setTimeout(function () { + _syncSelectionToIframe(); + }, SELECTION_SYNC_DEBOUNCE_MS); + }; + const cm = _getCM(); + if (cm) { + cm.on("cursorActivity", _cursorHandler); + // Listen for change origin (undo/redo detection) + cm.on("change", function (_cm, changeObj) { + if (changeObj) { + _lastChangeOrigin = changeObj.origin; + } + }); + } + + // If iframe is already ready (reusing same iframe), switch file using cache + if (_iframeReady) { + _switchFile(); + _sendTheme(); + _sendLocale(); + } + } + + /** + * Stop syncing, remove all listeners. + */ + function deactivate() { + if (!_active) { + return; + } + + clearTimeout(_debounceTimer); + clearTimeout(_scrollSyncTimer); + clearTimeout(_selectionSyncTimer); + + if (_cursorHandler) { + const cm = _getCM(); + if (cm) { + cm.off("cursorActivity", _cursorHandler); + } + } + + if (_doc && _docChangeHandler) { + _doc.off("change", _docChangeHandler); + } + + if (_messageHandler) { + window.removeEventListener("message", _messageHandler); + } + + if (_themeChangeHandler) { + ThemeManager.off("themeChange", _themeChangeHandler); + } + + _doc = null; + _$iframe = null; + _active = false; + _iframeReady = false; + _docChangeHandler = null; + _messageHandler = null; + _themeChangeHandler = null; + _cursorHandler = null; + } + + /** + * @return {boolean} Whether mdviewr sync is currently active + */ + function isActive() { + return _active; + } + + // --- iframe ready --- + + function _onIframeReady() { + _iframeReady = true; + _sendContent(); + _sendTheme(); + _sendLocale(); + if (_onIframeReadyCallback) { + _onIframeReadyCallback(); + } + } + + // --- Phoenix → iframe --- + + /** + * Send a cache-aware file switch message. The iframe decides whether + * to use its cached DOM or re-render based on content comparison. + */ + function _switchFile() { + if (!_active || !_iframeReady || !_doc) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + + iframeWindow.postMessage({ + type: "MDVIEWR_SWITCH_FILE", + markdown: _doc.getText(), + baseURL: _baseURL, + filePath: _doc.file.fullPath + }, "*"); + } + + function _sendContent() { + if (!_active || !_iframeReady || !_doc) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + + iframeWindow.postMessage({ + type: "MDVIEWR_SET_CONTENT", + markdown: _doc.getText(), + baseURL: _baseURL, + filePath: _doc.file.fullPath + }, "*"); + } + + function _sendUpdate(changeOrigin) { + if (!_active || !_iframeReady || !_doc) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + + _syncId++; + const msg = { + type: "MDVIEWR_UPDATE_CONTENT", + markdown: _doc.getText(), + filePath: _doc.file.fullPath, + _syncId: _syncId + }; + + // Include cursor position for undo/redo restore + if (_pendingCursorPos !== undefined) { + msg.cursorPos = _pendingCursorPos; + _pendingCursorPos = undefined; + } + + iframeWindow.postMessage(msg, "*"); + } + + function _sendTheme() { + if (!_active || !_iframeReady) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + + const currentTheme = ThemeManager.getCurrentTheme(); + const isDark = currentTheme && currentTheme.dark; + iframeWindow.postMessage({ + type: "MDVIEWR_SET_THEME", + theme: isDark ? "dark" : "light" + }, "*"); + } + + function _sendLocale() { + if (!_active || !_iframeReady) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + + iframeWindow.postMessage({ + type: "MDVIEWR_SET_LOCALE", + locale: brackets.getLocale() + }, "*"); + } + + // --- iframe → Phoenix --- + + /** + * Apply new text to the CM5 editor using a minimal diff so that the undo stack + * records only the changed region instead of a full-document replacement. + */ + function _applyDiffToEditor(newText) { + const cm = _getCM(); + if (!cm) { + return; + } + + const oldText = cm.getValue(); + if (oldText === newText) { + return; + } + + // Find first differing character + let prefixLen = 0; + const minLen = Math.min(oldText.length, newText.length); + while (prefixLen < minLen && oldText[prefixLen] === newText[prefixLen]) { + prefixLen++; + } + + // Find last differing character (from the end) + let oldSuffix = oldText.length; + let newSuffix = newText.length; + while (oldSuffix > prefixLen && newSuffix > prefixLen && + oldText[oldSuffix - 1] === newText[newSuffix - 1]) { + oldSuffix--; + newSuffix--; + } + + const fromPos = cm.posFromIndex(prefixLen); + const toPos = cm.posFromIndex(oldSuffix); + const replacement = newText.substring(prefixLen, newSuffix); + + _syncingFromIframe = true; + cm.replaceRange(replacement, fromPos, toPos, "+mdviewr"); + _syncingFromIframe = false; + } + + function _onIframeContentChanged(data) { + if (!_active || !_doc) { + return; + } + + const markdown = data.markdown; + const remoteSyncId = data._syncId; + + // Ignore stale updates + if (remoteSyncId !== undefined && remoteSyncId <= _lastReceivedSyncId) { + return; + } + if (remoteSyncId !== undefined) { + _lastReceivedSyncId = remoteSyncId; + } + + _applyDiffToEditor(markdown); + + // Push cursor position for undo/redo restore + if (data.cursorPos) { + _cursorUndoStack.push(data.cursorPos); + _cursorRedoStack = []; + } + } + + let _pendingCursorPos = undefined; + + function _handleUndo() { + if (!_active) { + return; + } + const cm = _getCM(); + if (cm) { + const pos = _cursorUndoStack.pop(); + if (pos) { + _cursorRedoStack.push(pos); + _pendingCursorPos = pos; + } + cm.undo(); + } + } + + function _handleRedo() { + if (!_active) { + return; + } + const cm = _getCM(); + if (cm) { + const pos = _cursorRedoStack.pop(); + if (pos) { + _cursorUndoStack.push(pos); + _pendingCursorPos = pos; + } + cm.redo(); + } + } + + function _handleHrefClick(data) { + const href = data.href; + if (!href) { + return; + } + NativeApp.openURLInDefaultBrowser(href); + } + + // --- Scroll sync --- + + /** + * Send the current CM5 cursor line to the iframe so it can scroll to the + * corresponding rendered element (only if it's not already visible). + */ + function _syncScrollToIframe() { + if (!_active || !_iframeReady) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + const cm = _getCM(); + if (!cm) { + return; + } + // CM5 cursor line is 0-based; source lines in markdown are 1-based + const line = cm.getCursor().line + 1; + iframeWindow.postMessage({ + type: "MDVIEWR_SCROLL_TO_LINE", + line: line + }, "*"); + } + + /** + * Move the CM5 cursor to the given source line (1-based) and scroll + * the editor to show it if it's not already visible. + */ + function _scrollCMToLine(sourceLine) { + const cm = _getCM(); + if (!cm) { + return; + } + // Convert 1-based source line to 0-based CM5 line + const cmLine = Math.max(0, sourceLine - 1); + const lineCount = cm.lineCount(); + if (cmLine >= lineCount) { + return; + } + + // Set cursor without CM's default scroll, then center manually + _syncingFromIframe = true; + cm.setCursor({ line: cmLine, ch: 0 }, null, { scroll: false }); + _syncingFromIframe = false; + + // Always center the cursor line in the editor + const scrollInfo = cm.getScrollInfo(); + const lineTop = cm.charCoords({ line: cmLine, ch: 0 }, "local").top; + const lineBottom = cm.charCoords({ line: cmLine, ch: 0 }, "local").bottom; + const viewTop = scrollInfo.top; + const viewBottom = scrollInfo.top + scrollInfo.clientHeight; + + if (lineTop < viewTop || lineBottom > viewBottom) { + const targetScrollTop = lineTop - (scrollInfo.clientHeight / 2); + cm.scrollTo(null, targetScrollTop); + } + } + + // --- Selection sync --- + + /** + * Send the current CM5 selection range to the iframe so it can highlight + * the corresponding rendered elements. + */ + function _syncSelectionToIframe() { + if (!_active || !_iframeReady) { + return; + } + const iframeWindow = _getIframeWindow(); + const cm = _getCM(); + if (!iframeWindow || !cm) { + return; + } + + const from = cm.getCursor("from"); + const to = cm.getCursor("to"); + const hasSelection = from.line !== to.line || from.ch !== to.ch; + + if (hasSelection) { + const selectedText = cm.getSelection(); + iframeWindow.postMessage({ + type: "MDVIEWR_HIGHLIGHT_SELECTION", + fromLine: from.line + 1, // convert to 1-based + toLine: to.line + 1, + selectedText: selectedText + }, "*"); + } else { + // Clear highlight when no selection + iframeWindow.postMessage({ + type: "MDVIEWR_HIGHLIGHT_SELECTION", + fromLine: null, + toLine: null, + selectedText: null + }, "*"); + } + } + + /** + * Handle a selection coming from the iframe. Finds the corresponding text + * in CM5 and sets the selection there. + */ + function _handleSelectionFromIframe(data) { + const cm = _getCM(); + if (!cm || !_active) { + return; + } + + const { sourceLine, selectedText } = data; + if (!sourceLine) { + return; + } + + const cmLine = Math.max(0, sourceLine - 1); + const lineCount = cm.lineCount(); + if (cmLine >= lineCount) { + return; + } + + _syncingFromIframe = true; + + if (!selectedText) { + // No selection — just move cursor to clear any existing selection + cm.setCursor({ line: cmLine, ch: 0 }); + _syncingFromIframe = false; + return; + } + + // Search for the selected text starting from the source line + const searchStart = Math.max(0, cmLine); + const searchEnd = Math.min(lineCount, cmLine + 20); + let found = false; + + for (let line = searchStart; line < searchEnd && !found; line++) { + const lineText = cm.getLine(line); + const idx = lineText.indexOf(selectedText); + if (idx !== -1 && selectedText.indexOf("\n") === -1) { + // Single-line match + cm.setSelection( + { line: line, ch: idx }, + { line: line, ch: idx + selectedText.length } + ); + found = true; + } + } + + if (!found) { + // Multi-line or not found in single line — try searching the full text + const fullText = cm.getValue(); + const startIndex = cm.indexFromPos({ line: searchStart, ch: 0 }); + const matchIdx = fullText.indexOf(selectedText, startIndex); + if (matchIdx !== -1) { + const fromPos = cm.posFromIndex(matchIdx); + const toPos = cm.posFromIndex(matchIdx + selectedText.length); + cm.setSelection(fromPos, toPos); + found = true; + } + } + + if (!found) { + // Fallback: just move cursor to the source line + cm.setCursor({ line: cmLine, ch: 0 }); + } + + _syncingFromIframe = false; + } + + // --- Keyboard shortcut forwarding --- + + /** + * Forward an unhandled keyboard shortcut from the mdviewer iframe to Phoenix's + * keybinding manager by dispatching a synthetic KeyboardEvent on the document. + */ + + /** + * Handle image upload request from the mdviewer iframe. + * Reconstructs the blob from ArrayBuffer, uploads via ImageUploadManager, + * and sends the result back to the iframe. + */ + function _handleImageUploadFromIframe(data) { + const ImageUploadManager = require("features/ImageUploadManager"); + const Dialogs = require("widgets/Dialogs"); + const Strings = require("strings"); + + const { arrayBuffer, mimeType, filename, uploadId } = data; + const iframeWindow = _getIframeWindow(); + + if (!ImageUploadManager.isImageUploadAvailable()) { + if (iframeWindow) { + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + error: "not_available" + }, "*"); + } + return; + } + + const blob = new Blob([arrayBuffer], { type: mimeType }); + const provider = ImageUploadManager.getImageUploadProvider(); + + provider.uploadImage(blob, filename).then(function (result) { + if (iframeWindow) { + if (result.embedURL) { + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + embedURL: result.embedURL + }, "*"); + } else if (result.error === "login_required") { + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + error: "login_required" + }, "*"); + const dialog = Dialogs.showModalDialog( + "", + Strings.IMAGE_UPLOAD_LOGIN_REQUIRED_TITLE, + Strings.IMAGE_UPLOAD_LOGIN_REQUIRED_MSG, + [ + { className: Dialogs.DIALOG_BTN_CLASS_NORMAL, id: Dialogs.DIALOG_BTN_CANCEL, + text: Strings.CANCEL }, + { className: Dialogs.DIALOG_BTN_CLASS_PRIMARY, id: "login", + text: Strings.IMAGE_UPLOAD_LOGIN_BTN } + ] + ); + dialog.done(function (id) { + if (id === "login") { + const profileBtn = document.getElementById("user-profile-button"); + if (profileBtn) { + profileBtn.click(); + } + } + }); + } else if (result.error !== "cancelled") { + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + error: result.error + }, "*"); + if (result.errorCode === "UPGRADE_TO_PRO") { + const EventManager = require("utils/EventManager"); + EventManager.triggerEvent(Dialogs.PRO_DIALOGS_EVENT_MANAGER, + "imageUploadUpgradeToPro", + Strings.IMAGE_UPLOAD_LIMIT_TITLE, result.errorLoc); + } else { + Dialogs.showModalDialog("", Strings.IMAGE_UPLOAD_FAILED, result.errorLoc || Strings.IMAGE_UPLOAD_FAILED); + } + } else { + // cancelled — remove placeholder + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + error: "cancelled" + }, "*"); + } + } + }).catch(function (err) { + console.error("Image upload from iframe failed:", err); + if (iframeWindow) { + iframeWindow.postMessage({ + type: "MDVIEWR_IMAGE_UPLOAD_RESULT", + uploadId, + error: "upload_failed" + }, "*"); + } + }); + } + + function _forwardKeyboardShortcut(data) { + const event = new KeyboardEvent("keydown", { + key: data.key, + code: data.code, + ctrlKey: data.ctrlKey, + metaKey: data.metaKey, + shiftKey: data.shiftKey, + altKey: data.altKey, + bubbles: true, + cancelable: true + }); + // KeyBindingManager listens on document.body, not document + document.body.dispatchEvent(event); + } + + // --- Helpers --- + + function _getIframeWindow() { + if (!_$iframe || !_$iframe[0]) { + return null; + } + return _$iframe[0].contentWindow; + } + + function _getCM() { + if (!_doc || !_doc._masterEditor) { + return null; + } + return _doc._masterEditor._codeMirror; + } + + /** + * Clear the current file's cache in the mdviewer iframe and force re-render. + * Called on reload button click. + */ + function reloadCurrentFile() { + if (!_active || !_iframeReady || !_doc) { + return; + } + const iframeWindow = _getIframeWindow(); + if (!iframeWindow) { + return; + } + iframeWindow.postMessage({ + type: "MDVIEWR_RELOAD_FILE", + filePath: _doc.file.fullPath + }, "*"); + } + + /** + * Set a callback for when the iframe requests edit mode. + * The callback should check entitlements and approve/deny. + */ + function setEditModeRequestHandler(handler) { + _onEditModeRequest = handler; + } + + /** + * Send edit mode state to the iframe. + */ + function setEditMode(editMode) { + if (!_active || !_iframeReady) { + return; + } + const iframeWindow = _getIframeWindow(); + if (iframeWindow) { + iframeWindow.postMessage({ type: "MDVIEWR_SET_EDIT_MODE", editMode: editMode }, "*"); + } + } + + /** + * Set a callback for when the iframe signals it's ready (first load only). + */ + function setIframeReadyHandler(handler) { + _onIframeReadyCallback = handler; + } + + /** + * Enable or disable cursor/scroll sync between CM and mdviewer. + * Content sync still works regardless. + */ + function setCursorSyncEnabled(enabled) { + _cursorSyncEnabled = enabled; + } + + exports.activate = activate; + exports.deactivate = deactivate; + exports.isActive = isActive; + exports.reloadCurrentFile = reloadCurrentFile; + exports.setEditModeRequestHandler = setEditModeRequestHandler; + exports.setEditMode = setEditMode; + exports.setIframeReadyHandler = setIframeReadyHandler; + exports.setCursorSyncEnabled = setCursorSyncEnabled; +}); diff --git a/src/extensionsIntegrated/Phoenix-live-preview/NodeStaticServer.js b/src/extensionsIntegrated/Phoenix-live-preview/NodeStaticServer.js index e89fc2dc68..26f2c577a6 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/NodeStaticServer.js +++ b/src/extensionsIntegrated/Phoenix-live-preview/NodeStaticServer.js @@ -93,6 +93,10 @@ define(function (require, exports, module) { +`"details":"${message}"}`); } + function getMdviewrURL() { + return `${window.Phoenix.baseURL}mdViewer/index.html`; + } + async function tabLoaderOnline(data) { window.logger.livePreview.log("Live Preview navigator channel: tabLoaderOnline: ", data); livePreviewTabs.set(data.pageLoaderID, { @@ -798,6 +802,7 @@ define(function (require, exports, module) { exports.getTabPopoutURL = getTabPopoutURL; exports.hasActiveLivePreviews = hasActiveLivePreviews; exports.getNoPreviewURL = getNoPreviewURL; + exports.getMdviewrURL = getMdviewrURL; exports.getPreviewDetails = getPreviewDetails; exports.getRemoteTransportScript = getRemoteTransportScript; // node apis diff --git a/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css b/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css index 6641e9d4aa..ed300fac5b 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css +++ b/src/extensionsIntegrated/Phoenix-live-preview/live-preview.css @@ -8,6 +8,11 @@ transition: opacity 1s, visibility 0s linear 1s; /* Fade-out effect */ } +#live-preview-plugin-toolbar { + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + box-sizing: border-box; +} + #live-preview-plugin-toolbar:hover .live-preview-browser-btn { opacity: 1; visibility: visible; @@ -20,7 +25,8 @@ height: 100%; } -#panel-live-preview-frame{ +#panel-live-preview-frame, +#panel-md-preview-frame { background-color: white; position: relative; } diff --git a/src/extensionsIntegrated/Phoenix-live-preview/main.js b/src/extensionsIntegrated/Phoenix-live-preview/main.js index cbd86de9b1..6e83af37fc 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/main.js +++ b/src/extensionsIntegrated/Phoenix-live-preview/main.js @@ -67,6 +67,7 @@ define(function (require, exports, module) { DropdownButton = require("widgets/DropdownButton"), BrowserStaticServer = require("./BrowserStaticServer"), NodeStaticServer = require("./NodeStaticServer"), + MarkdownSync = require("./MarkdownSync"), LivePreviewSettings = require("./LivePreviewSettings"), NodeUtils = require("utils/NodeUtils"), TrustProjectHTML = require("text!./trust-project.html"), @@ -124,11 +125,28 @@ define(function (require, exports, module) { const LIVE_PREVIEW_PANEL_ID = "live-preview-panel"; const LIVE_PREVIEW_IFRAME_ID = "panel-live-preview-frame"; + const MDVIEWR_IFRAME_ID = "panel-md-preview-frame"; + const _sandboxAttr = Phoenix.isTestWindow ? "" : + 'sandbox="allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-scripts allow-forms allow-modals allow-pointer-lock"'; const LIVE_PREVIEW_IFRAME_HTML = ` + `; + + // Mdviewer renders untrusted markdown — tighter sandbox than live preview: + // no allow-same-origin (prevents malicious scripts from accessing Phoenix context), + // no allow-forms, allow-pointer-lock (not needed for markdown editing). + // Communication works via MarkdownSync's own message handler (bypasses EventManager origin check). + const _mdSandboxAttr = Phoenix.isTestWindow ? "" : + 'sandbox="allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals"'; + const MDVIEWR_IFRAME_HTML = ` + `; @@ -181,7 +199,20 @@ define(function (require, exports, module) { async function _entitlementsChanged() { try { const entitlement = await _getLiveEditEntitlement(); + const wasProEditUser = isProEditUser; isProEditUser = entitlement && entitlement.activated; + // Sync edit mode with md iframe on entitlement change + if (_isMdviewrActive && $iframe && $iframe[0] && $iframe[0].contentWindow) { + if (isProEditUser && !wasProEditUser) { + // Just got pro — switch to edit mode + $iframe[0].contentWindow.postMessage( + { type: "MDVIEWR_SET_EDIT_MODE", editMode: true }, "*"); + } else if (!isProEditUser && wasProEditUser) { + // Lost pro — switch to reader mode + $iframe[0].contentWindow.postMessage( + { type: "MDVIEWR_SET_EDIT_MODE", editMode: false }, "*"); + } + } } catch (error) { console.error("Error updating pro user status:", error); isProEditUser = false; @@ -310,9 +341,19 @@ define(function (require, exports, module) { } /** - * update the mode button text in the live preview toolbar UI based on the current mode - * @param {String} mode - The current mode ("preview", "highlight", or "edit") + * Hide the play button and mode dropdown when mdviewer is active, + * since MD files have their own Edit/Reader toggle in the iframe toolbar. + * Does not hide in custom server mode (handled by _isMdviewrActive being false). */ + function _updateLPControlsForMdviewer() { + if ($previewBtn) { + $previewBtn.toggle(!_isMdviewrActive); + } + if ($modeBtn) { + $modeBtn.toggle(!_isMdviewrActive); + } + } + function _updateModeButton(mode) { if ($modeBtn) { if (mode === "highlight") { @@ -592,15 +633,27 @@ define(function (require, exports, module) { urlPinned, currentLivePreviewURL = "", currentPreviewFile = '', - _loadGeneration = 0; + _loadGeneration = 0, + _isMdviewrActive = false, + $mdviewrIframe = null; // persistent md iframe, survives HTML preview switches function _blankIframe() { // we have to remove the dom node altog as at time chrome fails to clear workers if we just change // src. so we delete the node itself to eb thorough. - let newIframe = $(LIVE_PREVIEW_IFRAME_HTML); - newIframe.insertAfter($iframe); - $iframe.remove(); - $iframe = newIframe; + // Don't destroy the persistent md iframe — just hide it + if ($mdviewrIframe && $iframe[0] === $mdviewrIframe[0]) { + MarkdownSync.deactivate(); + _isMdviewrActive = false; + $mdviewrIframe.hide(); + let newIframe = $(LIVE_PREVIEW_IFRAME_HTML); + $mdviewrIframe.after(newIframe); + $iframe = newIframe; + } else { + let newIframe = $(LIVE_PREVIEW_IFRAME_HTML); + newIframe.insertAfter($iframe); + $iframe.remove(); + $iframe = newIframe; + } } let panelShownAtStartup; @@ -827,6 +880,9 @@ define(function (require, exports, module) { $pinUrlBtn.click(_togglePinUrl); $livePreviewPopBtn.click(_popoutLivePreview); $reloadBtn.click(()=>{ + if (_isMdviewrActive) { + MarkdownSync.reloadCurrentFile(); + } _loadPreview(true, true); Metrics.countEvent(Metrics.EVENT_TYPE.LIVE_PREVIEW, "reloadBtn", "click"); }); @@ -835,6 +891,58 @@ define(function (require, exports, module) { _initOverlay(); } + function _loadMdviewrPreview(previewDetails, force) { + const currentDoc = DocumentManager.getCurrentDocument(); + if (!currentDoc) { + return; + } + + const mdFileURL = encodeURI(previewDetails.URL); + const baseURL = mdFileURL.substring(0, mdFileURL.lastIndexOf("/") + 1); + + currentPreviewFile = previewDetails.fullPath; + if (!urlPinned) { + currentLivePreviewURL = mdFileURL; + } + let relativeOrFullPath = ProjectManager.makeProjectRelativeIfPossible(previewDetails.fullPath); + relativeOrFullPath = Phoenix.app.getDisplayPath(relativeOrFullPath); + _setTitle(relativeOrFullPath, currentPreviewFile, ""); + + if (_isMdviewrActive) { + // Mdviewr iframe already loaded, just update the sync for the new document + MarkdownSync.activate(currentDoc, $iframe, baseURL); + return; + } + + // Reuse persistent md iframe if it exists (e.g. returning from HTML preview) + if ($mdviewrIframe && $mdviewrIframe[0].parentNode) { + // Hide the current HTML iframe and show the md iframe + if ($iframe[0] !== $mdviewrIframe[0]) { + $iframe.remove(); + } + $mdviewrIframe.show(); + $iframe = $mdviewrIframe; + } else if (panel.isVisible()) { + // First time: create the md iframe (tighter sandbox for untrusted content) + const mdviewrURL = StaticServer.getMdviewrURL(); + let newIframe = $(MDVIEWR_IFRAME_HTML); + newIframe.insertAfter($iframe); + $iframe.remove(); + $iframe = newIframe; + $mdviewrIframe = newIframe; + if (_isProjectPreviewTrusted()) { + $iframe.attr('src', mdviewrURL); + } + } + + _isMdviewrActive = true; + MarkdownSync.activate(currentDoc, $iframe, baseURL); + // Sync preview mode and edit mode for reuse case where iframe is already ready + _updateLPControlsForMdviewer(); + + Metrics.countEvent(Metrics.EVENT_TYPE.LIVE_PREVIEW, "render", "mdviewr"); + } + async function _loadPreview(force, isReload) { // we wait till the first server ready event is received till we render anything. else a 404-page may // briefly flash on first load of phoenix as we try to load the page before the server is available. @@ -851,6 +959,21 @@ define(function (require, exports, module) { if(urlPinned && !force) { return; } + // Use mdviewr for markdown files (unless custom server is configured) + if(previewDetails.isMarkdownFile && !previewDetails.isCustomServer && !previewDetails.isNoPreview) { + _loadMdviewrPreview(previewDetails, force); + return; + } + // Switching away from mdviewr to non-markdown preview + // Hide the md iframe instead of destroying it so cache is preserved + if(_isMdviewrActive) { + MarkdownSync.deactivate(); + _isMdviewrActive = false; + if ($mdviewrIframe) { + $mdviewrIframe.hide(); + } + _updateLPControlsForMdviewer(); + } let newSrc = encodeURI(previewDetails.URL); if($iframe.attr('src') === newSrc && !force){ // we already have this url loaded in previews! @@ -882,7 +1005,10 @@ define(function (require, exports, module) { } let newIframe = $(LIVE_PREVIEW_IFRAME_HTML); newIframe.insertAfter($iframe); - $iframe.remove(); + // Don't remove the md iframe — it's persistent and already hidden + if (!$mdviewrIframe || $iframe[0] !== $mdviewrIframe[0]) { + $iframe.remove(); + } $iframe = newIframe; if(_isProjectPreviewTrusted()){ $iframe.attr('src', currentLivePreviewURL); @@ -905,6 +1031,10 @@ define(function (require, exports, module) { } async function _projectFileChanges(evt, changedFile) { + if(_isMdviewrActive) { + // MarkdownSync handles live content updates for markdown files + return; + } if(changedFile && changedFile.isFile && (utils.isPreviewableFile(changedFile.fullPath) || utils.isServerRenderedFile(changedFile.fullPath))){ // we are getting this change event somehow. @@ -958,7 +1088,40 @@ define(function (require, exports, module) { } let startupFilesLoadHandled = false; + /** + * Send the current working set of markdown files to the mdviewr iframe. + */ + function _syncWorkingSetToMdviewr() { + if (!$mdviewrIframe) { + return; + } + const mdIframeWindow = $mdviewrIframe[0].contentWindow; + if (!mdIframeWindow) { + return; + } + const workingSet = MainViewManager.getWorkingSet(MainViewManager.ALL_PANES); + const mdPaths = workingSet + .filter(file => utils.isMarkdownFile(file.fullPath)) + .map(file => file.fullPath); + mdIframeWindow.postMessage({ + type: "MDVIEWR_WORKING_SET_CHANGED", + paths: mdPaths + }, "*"); + } + async function _projectOpened() { + // Deactivate mdviewr on project switch — keep iframe alive but clear cache + if(_isMdviewrActive) { + MarkdownSync.deactivate(); + _isMdviewrActive = false; + } + if ($mdviewrIframe) { + const mdIframeWindow = $mdviewrIframe[0].contentWindow; + if (mdIframeWindow) { + mdIframeWindow.postMessage({ type: "MDVIEWR_CLEAR_CACHE" }, "*"); + } + $mdviewrIframe.hide(); + } _switchToEditModeIfNeeded(); customLivePreviewBannerShown = false; $panel.find(".live-preview-custom-banner").addClass("forced-hidden"); @@ -972,6 +1135,12 @@ define(function (require, exports, module) { if(urlPinned){ _togglePinUrl(); } + // Ensure $iframe points to a visible HTML iframe, not the hidden md iframe + if ($mdviewrIframe && $iframe[0] === $mdviewrIframe[0]) { + let newIframe = $(LIVE_PREVIEW_IFRAME_HTML); + $mdviewrIframe.after(newIframe); + $iframe = newIframe; + } $iframe.attr('src', StaticServer.getNoPreviewURL()); if(!panelShownAtStartup && !isBrowser && ProjectManager.isStartupFilesLoaded()){ // we dont do this in browser as the virtual server may not yet be started on app start @@ -1236,6 +1405,12 @@ define(function (require, exports, module) { // change listener in macos for a second to give some time for the os event to reach. fileChangeListenerStartDelay = 600; } + // Sync working set changes to md iframe for cache management + MainViewManager.on("workingSetAdd", _syncWorkingSetToMdviewr); + MainViewManager.on("workingSetAddList", _syncWorkingSetToMdviewr); + MainViewManager.on("workingSetRemove", _syncWorkingSetToMdviewr); + MainViewManager.on("workingSetRemoveList", _syncWorkingSetToMdviewr); + setTimeout(()=>{ MainViewManager.on("currentFileChange", _currentFileChanged); if(Phoenix.isNativeApp && Phoenix.platform === "mac" && MainViewManager.getCurrentlyViewedFile()) { @@ -1363,6 +1538,46 @@ define(function (require, exports, module) { _startOrStopLivePreviewIfRequired(); } }, 1000); + // Handle edit mode requests from mdviewer iframe — gate on entitlement + MarkdownSync.setEditModeRequestHandler(function () { + if (isProEditUser) { + // Entitled — send edit mode to iframe + if ($iframe && $iframe[0] && $iframe[0].contentWindow) { + $iframe[0].contentWindow.postMessage( + { type: "MDVIEWR_SET_EDIT_MODE", editMode: true }, "*"); + } + } else { + // Not entitled — show upsell dialog + const buttonGetProText = StringUtils.format(Strings.PROMO_UPGRADE_APP_UPSELL_BUTTON, + brackets.config.main_pro_plan_short); + const buttons = [ + { className: Dialogs.DIALOG_BTN_CLASS_NORMAL, id: Dialogs.DIALOG_BTN_CANCEL, + text: Strings.GET_PRO_NOT_NOW }, + { className: Dialogs.DIALOG_BTN_CLASS_PRIMARY, id: "get_pro", + text: buttonGetProText } + ]; + Metrics.countEvent(Metrics.EVENT_TYPE.LP_EDIT, "mdEditUpsell", "show"); + Dialogs.showModalDialog(Dialogs.DIALOG_ID_INFO, + Strings.AVAILABLE_IN_PRO_TITLE, + Strings.MD_EDIT_UPSELL_MESSAGE, buttons) + .done(function (id) { + Metrics.countEvent(Metrics.EVENT_TYPE.LP_EDIT, "mdEditUpsell", id); + if (id === "get_pro") { + Phoenix.app.openURLInDefaultBrowser(brackets.config.purchase_url); + } + }); + } + }); + + // When iframe first loads, send initial edit mode based on entitlement + MarkdownSync.setIframeReadyHandler(function () { + _updateLPControlsForMdviewer(); + // Pro users default to edit mode on first load + if (isProEditUser) { + MarkdownSync.setEditMode(true); + } + }); + _projectOpened(); if(!Phoenix.isSpecRunnerWindow){ _entitlementsChanged(); diff --git a/src/extensionsIntegrated/Phoenix-live-preview/utils.js b/src/extensionsIntegrated/Phoenix-live-preview/utils.js index e001d3d666..0697bac805 100644 --- a/src/extensionsIntegrated/Phoenix-live-preview/utils.js +++ b/src/extensionsIntegrated/Phoenix-live-preview/utils.js @@ -37,6 +37,7 @@ define(function (require, exports, module) { const LIVE_PREVIEW_IFRAME_ID = "panel-live-preview-frame"; + const MDVIEWR_IFRAME_ID = "panel-md-preview-frame"; const EditorManager = require("editor/EditorManager"); function getExtension(filePath) { filePath = filePath || ''; @@ -98,7 +99,8 @@ define(function (require, exports, module) { if(!editor){ return; } - if (document.activeElement === document.getElementById(LIVE_PREVIEW_IFRAME_ID)) { + if (document.activeElement === document.getElementById(LIVE_PREVIEW_IFRAME_ID) || + document.activeElement === document.getElementById(MDVIEWR_IFRAME_ID)) { editor.focus(); } } diff --git a/src/extensionsIntegrated/TabBar/main.js b/src/extensionsIntegrated/TabBar/main.js index 841f578743..db1476e066 100644 --- a/src/extensionsIntegrated/TabBar/main.js +++ b/src/extensionsIntegrated/TabBar/main.js @@ -30,6 +30,7 @@ define(function (require, exports, module) { const Commands = require("command/Commands"); const KeyBindingManager = require("command/KeyBindingManager"); const DocumentManager = require("document/DocumentManager"); + const EditorManager = require("editor/EditorManager"); const WorkspaceManager = require("view/WorkspaceManager"); const Menus = require("command/Menus"); const Strings = require("strings"); @@ -558,9 +559,25 @@ define(function (require, exports, module) { MainViewManager.addToWorkingSet(paneId, fileObj); } - // clicked tab is already active, don't do anything - if (isPaneActive && currentFile && currentFile.fullPath === filePath) { return; } - CommandManager.execute(Commands.FILE_OPEN, { fullPath: filePath, paneId: paneId }); + // clicked tab is already active, focus the editor + if (isPaneActive && currentFile && currentFile.fullPath === filePath) { + setTimeout(function () { + const editor = EditorManager.getActiveEditor(); + if (editor) { + editor.focus(); + } + }, 0); + return; + } + CommandManager.execute(Commands.FILE_OPEN, { fullPath: filePath, paneId: paneId }) + .always(function () { + setTimeout(function () { + const editor = EditorManager.getActiveEditor(); + if (editor) { + editor.focus(); + } + }, 0); + }); }); // Add the contextmenu (right-click) handler diff --git a/src/features/ImageUploadManager.js b/src/features/ImageUploadManager.js new file mode 100644 index 0000000000..8aee0e5c94 --- /dev/null +++ b/src/features/ImageUploadManager.js @@ -0,0 +1,63 @@ +/* + * GNU AGPL-3.0 License + * + * Copyright (c) 2021 - present core.ai . All rights reserved. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://opensource.org/licenses/AGPL-3.0. + * + */ + +/** + * ImageUploadManager provides a service provider interface for image uploads. + * Extensions (e.g. phoenix-pro) register an upload provider; core code (e.g. + * the paste handler in EditorCommandHandlers) calls the provider to upload images. + * + * Provider interface: + * { + * uploadImage(blob, fileName) → Promise<{embedURL}|{error, errorCode, errorLoc}> + * } + */ +define(function (require, exports, module) { + + let _provider = null; + + /** + * Register an image upload provider. Only one provider is supported at a time. + * @param {Object} provider - must have an `uploadImage(blob, fileName)` method + */ + function registerImageUploadProvider(provider) { + if (!provider || typeof provider.uploadImage !== "function") { + throw new Error("ImageUploadManager: provider must implement uploadImage(blob, fileName)"); + } + _provider = provider; + } + + /** + * @return {Object|null} The registered provider, or null if none registered. + */ + function getImageUploadProvider() { + return _provider; + } + + /** + * @return {boolean} True if an upload provider is registered. + */ + function isImageUploadAvailable() { + return _provider !== null; + } + + exports.registerImageUploadProvider = registerImageUploadProvider; + exports.getImageUploadProvider = getImageUploadProvider; + exports.isImageUploadAvailable = isImageUploadAvailable; +}); diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index 56ea122d37..d757f6b125 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -501,8 +501,21 @@ define({ "LIVE_DEV_IMAGE_FOLDER_DIALOG_PLACEHOLDER": "Type folder path (e.g., assets/images/)", "LIVE_DEV_IMAGE_FOLDER_DIALOG_HELP": "💡 Type folder path or leave empty to download in 'images' folder.", "LIVE_DEV_IMAGE_FOLDER_DIALOG_REMEMBER": "Don't ask again for this project", - "DEVICE_SIZE_LIMIT_TITLE": "Available in Phoenix Pro", + "AVAILABLE_IN_PRO_TITLE": "Available in Phoenix Pro", "DEVICE_SIZE_LIMIT_MESSAGE": "Phoenix Pro lets you preview your page at the screen sizes defined in your CSS.", + "MD_EDIT_UPSELL_MESSAGE": "Write Markdown like a document. Phoenix handles the formatting so you can stay focused on writing.", + "IMAGE_UPLOADING": "Uploading", + "IMAGE_UPLOAD_FAILED": "Failed to upload image", + "IMAGE_UPLOAD_LOGIN_REQUIRED_TITLE": "Log in to Embed Image", + "IMAGE_UPLOAD_LOGIN_REQUIRED_MSG": "Log in to upload and embed images in your document.", + "IMAGE_UPLOAD_LOGIN_BTN": "Log In", + "IMAGE_UPLOAD_CONFIRM_TITLE": "Embed Image", + "IMAGE_UPLOAD_CONFIRM_MSG": "Upload this image so it's included directly in your file. It'll work on any computer — no broken images when you share or move markdown files.", + "IMAGE_UPLOAD_HOSTED_ON": "Images are hosted on user-cdn.phcode.site", + "IMAGE_UPLOAD_BTN": "Upload & Embed", + "IMAGE_UPLOAD_DONT_SHOW_AGAIN": "Always embed without asking", + "IMAGE_UPLOAD_UNSUPPORTED_TYPE": "Unsupported image type: {0}", + "IMAGE_UPLOAD_LIMIT_TITLE": "Upload more images with Phoenix Pro", "IMAGE_SEARCH_LIMIT_TITLE": "Image search limit reached", "IMAGE_SEARCH_LIMIT_MESSAGE": "You’ve used all {0} image searches for this month.${Strings.IMAGE_UPLOAD_LOGIN_REQUIRED_MSG}
++++
Start a paid Phoenix Pro plan to remove trial limits and continue searching.", "IMAGE_SEARCH_LIMIT_MESSAGE_THROTTLE": "Image search is temporarily unavailable due to high demand.
Start a paid Phoenix Pro plan to remove trial limits and continue searching.", diff --git a/src/styles/brackets.less b/src/styles/brackets.less index 009700318f..cbdc76edd9 100644 --- a/src/styles/brackets.less +++ b/src/styles/brackets.less @@ -1238,6 +1238,7 @@ a, img { display: flex; align-items: center; justify-content: space-between; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); } #mainNavBarLeft { diff --git a/src/utils/EventManager.js b/src/utils/EventManager.js index dd1ff78c44..f177d1bdca 100644 --- a/src/utils/EventManager.js +++ b/src/utils/EventManager.js @@ -167,6 +167,11 @@ define(function (require, exports, module) { */ window.onmessage = function(event) { if(!(Phoenix.TRUSTED_ORIGINS[event.origin] || eventTrustedOrigins[event.origin])){ + // Sandboxed iframes without allow-same-origin send "null" origin — + // silently ignore these as they communicate via their own message handlers. + if(event.origin === "null") { + return; + } console.error(`Ignoring event from untrusted origin (should be one of ` + `${Object.keys(Phoenix.TRUSTED_ORIGINS)}, ${Object.keys(eventTrustedOrigins)}) but got: `, event); console.error('Forgot to set window.Phoenix.TRUSTED_ORIGINS["http://"]=true; ?'); diff --git a/src/widgets/Dialogs.js b/src/widgets/Dialogs.js index 71b1c50843..1eb8271519 100644 --- a/src/widgets/Dialogs.js +++ b/src/widgets/Dialogs.js @@ -677,6 +677,8 @@ define(function (require, exports, module) { exports.DIALOG_BTN_CLASS_NORMAL = DIALOG_BTN_CLASS_NORMAL; exports.DIALOG_BTN_CLASS_LEFT = DIALOG_BTN_CLASS_LEFT; + exports.PRO_DIALOGS_EVENT_MANAGER = "ph-pro-dialogs"; + exports.showModalDialog = showModalDialog; exports.showConfirmDialog = showConfirmDialog; exports.showInfoDialog = showInfoDialog; diff --git a/test/UnitTestSuite.js b/test/UnitTestSuite.js index 0e181c58c0..817aa49c4c 100644 --- a/test/UnitTestSuite.js +++ b/test/UnitTestSuite.js @@ -110,6 +110,7 @@ define(function (require, exports, module) { require("spec/Template-for-integ-test"); require("spec/LiveDevelopmentMultiBrowser-test"); require("spec/LiveDevelopmentCustomServer-test"); + require("spec/md-editor-integ-test"); require("spec/NewFileContentManager-test"); require("spec/InstallExtensionDialog-integ-test"); require("spec/ExtensionInstallation-test"); diff --git a/test/spec/LiveDevelopment-Markdown-test-files/doc1.md b/test/spec/LiveDevelopment-Markdown-test-files/doc1.md new file mode 100644 index 0000000000..ace66197da --- /dev/null +++ b/test/spec/LiveDevelopment-Markdown-test-files/doc1.md @@ -0,0 +1,15 @@ +# Document One + +This is the first test document for cache and file switching tests. + +## Section A + +Paragraph A with some content for testing scroll position preservation. + +## Section B + +Paragraph B with more content. + +## Section C + +Paragraph C at the bottom of the document. diff --git a/test/spec/LiveDevelopment-Markdown-test-files/doc2.md b/test/spec/LiveDevelopment-Markdown-test-files/doc2.md new file mode 100644 index 0000000000..8938518aff --- /dev/null +++ b/test/spec/LiveDevelopment-Markdown-test-files/doc2.md @@ -0,0 +1,13 @@ +# Document Two + +This is the second test document. + +## Features + +- Item one +- Item two +- Item three + +## Details + +More content in document two for testing. diff --git a/test/spec/LiveDevelopment-Markdown-test-files/doc3.md b/test/spec/LiveDevelopment-Markdown-test-files/doc3.md new file mode 100644 index 0000000000..8419db7b9f --- /dev/null +++ b/test/spec/LiveDevelopment-Markdown-test-files/doc3.md @@ -0,0 +1,5 @@ +# Document Three + +Third document for LRU cache testing. + +Some paragraph text here. diff --git a/test/spec/LiveDevelopment-Markdown-test-files/long.md b/test/spec/LiveDevelopment-Markdown-test-files/long.md new file mode 100644 index 0000000000..667a0ef894 --- /dev/null +++ b/test/spec/LiveDevelopment-Markdown-test-files/long.md @@ -0,0 +1,83 @@ +# Long Document for Scroll Testing + +## Section 1 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +## Section 2 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + + + +## Section 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + +## Code Examples + +```javascript +function fibonacci(n) { + if (n <= 1) return n; + return fibonacci(n - 1) + fibonacci(n - 2); +} + +console.log(fibonacci(10)); +``` + +```html + + + Test + +Hello World
+This is a test page.
+ + +``` + +## Table Example + +| Feature | Status | Priority | +| --- | --- | --- | +| Dark mode | Done | High | +| Export PDF | In progress | Medium | +| Mobile layout | Planned | Low | + +## Section 4 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + +## Section 5 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + + +## Section 6 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +## Section 7 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +## Section 8 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + +## Section 9 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +## Section 10 - Bottom Marker + +This is the bottom of the long document. If you can see this, you have scrolled to the end. diff --git a/test/spec/LiveDevelopment-Markdown-test-files/simple.html b/test/spec/LiveDevelopment-Markdown-test-files/simple.html new file mode 100644 index 0000000000..b4bb2d61ff --- /dev/null +++ b/test/spec/LiveDevelopment-Markdown-test-files/simple.html @@ -0,0 +1,7 @@ + + +Simple HTML + +Simple HTML page
+ + diff --git a/test/spec/LiveDevelopment-MultiBrowser-test-files/sample.md b/test/spec/LiveDevelopment-MultiBrowser-test-files/sample.md new file mode 100644 index 0000000000..5a03d9bc8f --- /dev/null +++ b/test/spec/LiveDevelopment-MultiBrowser-test-files/sample.md @@ -0,0 +1,231 @@ +# Heading 1 + +## Heading 2 + +### Heading 3 + +#### Heading 4 + +##### Heading 5 + +###### Heading 6 df + +--- + +## Paragraphs and Inline Formatting + +This is a regular paragraph with **bold text**, _italic text_, and **_bold italic text_**. You can also use +**underscores for bold** and _underscores for italic_. + +Here is some ~strikethrough text~ and some `inline code` within a sentence. + +This paragraph has a soft line break above (two trailing spaces). + +## Links and Images + +[Visit GitHub](https://github.com) + +[Link with title](https://github.com "GitHub Homepage") + +Autolinked URL: [https://example.com](https://example.com) + +Email autolink: [user@example.com](mailto:user@example.com) + + + +## Blockquotes + +> This is a blockquote. +> +> It can span multiple paragraphs.// + +> Nested blockquotes: +> +> > This is nested inside. +> > +> > > And this is even deeper. + +## Lists + +### Unordered List + +- Item one +- Item two + - Nested item A + - Nested item B + - Deeply nested item + - Deeply nested item 2 +- Item three + +### Ordered List + +1. First item +2. Second item + 1. Sub-item one + 2. Sub-item two +3. Third item + +### Mixed List + +1. Ordered item + - Unordered child + - Another child +2. Another ordered item + +### Task List (GFM) + +- [x] Completed task +- [x] Another done task +- [ ] Incomplete task +- [ ] Another pending task + +## Code Blocks + +### JavaScript + +```js +// Fibonacci sequence generator +function* fibonacci(limit) { + let [a, b] = [0, 1]; + while (a <= limit) { + yield a; + [a, b] = [b, a + b]; + } +} + +const results = [...fibonacci(100)]; +console.log(results); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] + +// Async fetch example +async function fetchUsers() { + try { + const response = await fetch("/api/users"); + const data = await response.json(); + return data.filter((user) => user.active); + } catch (error) { + console.error("Failed to fetch users:", error); + } +} +``` + +### HTML + +```html + + + + + +Sample Page + + + +++ + +``` + + + + + +## Tables (GFM) + +| Feature | Status | Priority | +| -------------- | :---------: | -------: | +| Dark mode | Done | High | +| Export to PDF | In progress | Medium | +| Mobile layout | Planned | low | +| Accessibility! | | | + +### Minimal Table + +| A | B | C | +| --- | --- | --- | +| 1 | 2 | 3 | + +## Horizontal Rules + +Three different syntaxes: + +--- + +--- + +--- + +## Footnotes (GFM) + +Here is a sentence with a footnote\[^1\] and another one\[^note\]. + +\[^1\]: This is the first footnote. \[^note\]: This is a named footnote with more detail. + +## Definition-style References + +## Emoji (GFM shortcodes) + +:rocket: :tada: :bug: :white_check_mark: + +## Escape Characters + +\*This is not italic\* and \`this is not code\`. + +Backslash: \\, Backtick: \`, Asterisk: \*, Underscore: \_, Hash: # + +## HTML in Markdown + +Click to expand + +This content is hidden by default. It supports **Markdown** inside. + +- List item inside details +- Another item + +Ctrl + C to copy. + +Text with superscript and subscript. + +Term 1 + +Definition for term 1 + +Term 2 + +Definition for term 2 + +## Alerts / Admonitions (GFM) + +> \[!NOTE\] This is a note alert. + +> \[!TIP\] This is a tip alert. + +> \[!IMPORTANT\] This is an important alert. + +> \[!WARNING\] This is a warning alert. + +> \[!CAUTION\] This is a caution alert. + +## Long Paragraph for Wrapping Test + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna +aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis +aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/test/spec/LiveDevelopment-MultiBrowser-test-files/test-shortcuts.md b/test/spec/LiveDevelopment-MultiBrowser-test-files/test-shortcuts.md new file mode 100644 index 0000000000..9cabaac27b --- /dev/null +++ b/test/spec/LiveDevelopment-MultiBrowser-test-files/test-shortcuts.md @@ -0,0 +1,11 @@ +# Test Shortcuts + +This is a test paragraph for keyboard shortcut testing. + +## Section Two + +Another paragraph with some text to select and format. + +### Section Three + +Final paragraph for testing. diff --git a/test/spec/LiveDevelopmentCustomServer-test.js b/test/spec/LiveDevelopmentCustomServer-test.js index 76f494b244..8cdf5ee3af 100644 --- a/test/spec/LiveDevelopmentCustomServer-test.js +++ b/test/spec/LiveDevelopmentCustomServer-test.js @@ -266,7 +266,7 @@ define(function (require, exports, module) { async function _waitForIframeURL(url) { await awaitsFor(()=>{ let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); - return iFrame.src === url; + return iFrame && iFrame.src === url; }, "external preview server "+ url); } @@ -494,8 +494,13 @@ define(function (require, exports, module) { await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), "readme.md"); await awaitsFor(()=>{ - let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); - return iFrame.src.endsWith("readme.md"); + let mdIFrame = testWindow.document.getElementById("panel-md-preview-frame"); + if (!mdIFrame || !mdIFrame.contentWindow) { return false; } + try { + const activeFile = mdIFrame.contentWindow.__getActiveFilePath + && mdIFrame.contentWindow.__getActiveFilePath(); + return activeFile && activeFile.endsWith("readme.md"); + } catch (e) { return false; } }, "readme.md live preview"); // now do html, it should load from the custom server @@ -663,7 +668,7 @@ define(function (require, exports, module) { testWindow.$("#toolbar-go-live").click(); await awaitsFor(()=>{ let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); - if(!iFrame.src) { + if(!iFrame || !iFrame.src) { return false; } const url = new URL(iFrame.src); @@ -774,6 +779,7 @@ define(function (require, exports, module) { async function _forSVGLivePreview() { await awaitsFor(()=>{ let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); + if (!iFrame || !iFrame.src) { return false; } let srcURL = new URL(iFrame.src); return srcURL.pathname.endsWith(SVG_IMAGE_PATH); }, "For svg image to be in live preview"); @@ -803,11 +809,22 @@ define(function (require, exports, module) { }, 30000); async function _waitForIframeMDFile(name) { + // The mdviewer uses a persistent iframe (panel-md-preview-frame) that loads mdViewer/index.html. + // Content is sent via postMessage, so we verify by checking the active file path inside the iframe. await awaitsFor(()=>{ - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); - let srcURL = new URL(outerIFrame.src); - return srcURL.pathname.endsWith(name) === true; - }, "waiting for name- " + name); + let mdIFrame = testWindow.document.getElementById("panel-md-preview-frame"); + if (!mdIFrame || !mdIFrame.contentWindow) { + return false; + } + try { + // doc-cache.js exposes activeFilePath — check it ends with the expected name + const activeFile = mdIFrame.contentWindow.__getActiveFilePath + && mdIFrame.contentWindow.__getActiveFilePath(); + return activeFile && activeFile.endsWith(name); + } catch (e) { + return false; + } + }, "waiting for md file: " + name); } it("should pin live previews pin markdown file", async function () { diff --git a/test/spec/LiveDevelopmentMultiBrowser-test.js b/test/spec/LiveDevelopmentMultiBrowser-test.js index 6b3b3181db..441365c08f 100644 --- a/test/spec/LiveDevelopmentMultiBrowser-test.js +++ b/test/spec/LiveDevelopmentMultiBrowser-test.js @@ -32,12 +32,47 @@ define(function (require, exports, module) { describe("livepreview:MultiBrowser Live Preview", function () { + function _getLivePreviewIFrame() { + return testWindow.document.getElementById("panel-live-preview-frame"); + } + + function _getMdPreviewIFrame() { + return testWindow.document.getElementById("panel-md-preview-frame"); + } + + function _getPreviewIFrame() { + return _getMdPreviewIFrame() || _getLivePreviewIFrame(); + } + + function _ensureMdReaderMode() { + const mdIFrame = _getMdPreviewIFrame(); + if (mdIFrame && mdIFrame.contentWindow) { + mdIFrame.contentWindow.postMessage({ + type: "MDVIEWR_SET_EDIT_MODE", + editMode: false + }, "*"); + } + } + async function _waitForIframeSrc(name) { await awaitsFor(() => { - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); + if (name.endsWith(".md")) { + // For markdown files, check the md iframe is visible with mdViewer loaded + let mdIFrame = _getMdPreviewIFrame(); + return mdIFrame && mdIFrame.style.display !== "none" && + mdIFrame.src && mdIFrame.src.includes("mdViewer"); + } + // For HTML/SVG files, check the live preview iframe src + let outerIFrame = _getLivePreviewIFrame(); + if (!outerIFrame || !outerIFrame.src) { return false; } let srcURL = new URL(outerIFrame.src); return srcURL.pathname.endsWith(name) === true; }, "waiting for name- " + name); + // Ensure md viewer is in reader mode for tests + if (name.endsWith(".md")) { + _ensureMdReaderMode(); + await awaits(100); + } } if (Phoenix.isTestWindowPlaywright && !Phoenix.browser.desktop.isChromeBased) { @@ -873,13 +908,15 @@ define(function (require, exports, module) { await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), "readme.md"); await awaits(300); - let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); - expect(iFrame.src.endsWith("readme.md")).toBeTrue(); + _ensureMdReaderMode(); + await awaits(100); + let mdIFrame = _getMdPreviewIFrame(); + expect(mdIFrame && mdIFrame.src && mdIFrame.src.includes("mdViewer")).toBeTrue(); await awaitsForDone(SpecRunnerUtils.openProjectFiles([SVG_IMAGE_PATH]), SVG_IMAGE_PATH); await awaits(500); - iFrame = testWindow.document.getElementById("panel-live-preview-frame"); + let iFrame = _getLivePreviewIFrame(); let srcURL = new URL(iFrame.src); expect(srcURL.pathname.endsWith(SVG_IMAGE_PATH)).toBeTrue(); @@ -889,6 +926,43 @@ define(function (require, exports, module) { await endPreviewSession(); }, 30000); + it("should hide play button and mode dropdown when previewing markdown file", async function () { + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]), + "SpecRunnerUtils.openProjectFiles simple1.html"); + + await waitsForLiveDevelopmentToOpen(); + + // Play button and mode dropdown should be visible for HTML files + let $previewBtn = testWindow.$("#previewModeLivePreviewButton"); + let $modeBtn = testWindow.$("#livePreviewModeBtn"); + expect($previewBtn.is(":visible")).toBeTrue(); + expect($modeBtn.is(":visible")).toBeTrue(); + + // Open a markdown file + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), + "readme.md"); + await awaits(300); + + // Play button and mode dropdown should be hidden for markdown files + await awaitsFor(() => { + return !testWindow.$("#previewModeLivePreviewButton").is(":visible") && + !testWindow.$("#livePreviewModeBtn").is(":visible"); + }, "play button and mode dropdown to be hidden"); + + // Switch back to HTML file + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]), + "simple1.html"); + await awaits(300); + + // Play button and mode dropdown should be visible again + await awaitsFor(() => { + return testWindow.$("#previewModeLivePreviewButton").is(":visible") && + testWindow.$("#livePreviewModeBtn").is(":visible"); + }, "play button and mode dropdown to be visible again"); + + await endPreviewSession(); + }, 30000); + it("should not live preview binary image files", async function () { await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]), "SpecRunnerUtils.openProjectFiles simple1.html"); @@ -988,7 +1062,7 @@ define(function (require, exports, module) { await waitsForLiveDevelopmentToOpen(); - let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); + let iFrame = _getLivePreviewIFrame(); expect(iFrame.src.endsWith("simple1.html")).toBeTrue(); await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), "readme.md"); @@ -996,8 +1070,10 @@ define(function (require, exports, module) { // now make the active editor loose focus and click on the markdown md for it to // trigger focus. await awaits(300); - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); - expect(outerIFrame.src.endsWith("readme.md")).toBeTrue(); + _ensureMdReaderMode(); + await awaits(100); + let outerIFrame = _getMdPreviewIFrame(); + expect(outerIFrame && outerIFrame.src && outerIFrame.src.includes("mdViewer")).toBeTrue(); outerIFrame.focus(); expect(testWindow.document.activeElement).toEqual(outerIFrame); outerIFrame.contentWindow.postMessage({ @@ -1022,7 +1098,7 @@ define(function (require, exports, module) { await waitsForLiveDevelopmentToOpen(); - let iFrame = testWindow.document.getElementById("panel-live-preview-frame"); + let iFrame = _getLivePreviewIFrame(); expect(iFrame.src.endsWith("simple1.html")).toBeTrue(); await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), "readme.md"); @@ -1030,8 +1106,8 @@ define(function (require, exports, module) { // now make the active editor loose focus and click on the markdown md for it to // trigger focus. await awaits(300); - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); - expect(outerIFrame.src.endsWith("readme.md")).toBeTrue(); + let outerIFrame = _getMdPreviewIFrame(); + expect(outerIFrame && outerIFrame.src && outerIFrame.src.includes("mdViewer")).toBeTrue(); outerIFrame.focus(); expect(testWindow.document.activeElement).toEqual(outerIFrame); // now select some /all text in the markdown and click @@ -1070,8 +1146,8 @@ define(function (require, exports, module) { "readme.md"); await awaits(300); - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); - expect(outerIFrame.src.endsWith("readme.md")).toBeTrue(); + let outerIFrame = _getMdPreviewIFrame(); + expect(outerIFrame && outerIFrame.src && outerIFrame.src.includes("mdViewer")).toBeTrue(); // todo check hrefs in markdown. currently we do not have mechanism to exec code image and markdown previews // in future we should do this check too. @@ -1174,8 +1250,8 @@ define(function (require, exports, module) { "external proj/test.md"); await awaits(300); - let outerIFrame = testWindow.document.getElementById("panel-live-preview-frame"); - expect(outerIFrame.src.endsWith("test.md")).toBeTrue(); + let outerIFrame = _getMdPreviewIFrame(); + expect(outerIFrame && outerIFrame.src && outerIFrame.src.includes("mdViewer")).toBeTrue(); await endPreviewSession(); }, 30000); diff --git a/test/spec/md-editor-integ-test.js b/test/spec/md-editor-integ-test.js new file mode 100644 index 0000000000..6024b5ad6b --- /dev/null +++ b/test/spec/md-editor-integ-test.js @@ -0,0 +1,761 @@ +/* + * GNU AGPL-3.0 License + * + * Copyright (c) 2021 - present core.ai . All rights reserved. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://opensource.org/licenses/AGPL-3.0. + * + */ + +/*global describe, beforeAll, afterAll, awaitsFor, it, awaitsForDone, expect, awaits*/ + +define(function (require, exports, module) { + + const SpecRunnerUtils = require("spec/SpecRunnerUtils"); + + const testFolder = SpecRunnerUtils.getTestPath("/spec/LiveDevelopment-MultiBrowser-test-files"); + const mdTestFolder = SpecRunnerUtils.getTestPath("/spec/LiveDevelopment-Markdown-test-files"); + + let testWindow, brackets, CommandManager, Commands, EditorManager, WorkspaceManager, + LiveDevMultiBrowser; + + function _getMdPreviewIFrame() { + return testWindow.document.getElementById("panel-md-preview-frame"); + } + + function _getMdIFrameDoc() { + const mdIFrame = _getMdPreviewIFrame(); + return mdIFrame && mdIFrame.contentDocument; + } + + function _getMdIFrameWin() { + const mdIFrame = _getMdPreviewIFrame(); + return mdIFrame && mdIFrame.contentWindow; + } + + function _setMdEditMode(editMode) { + const mdIFrame = _getMdPreviewIFrame(); + if (mdIFrame && mdIFrame.contentWindow) { + mdIFrame.contentWindow.postMessage({ + type: "MDVIEWR_SET_EDIT_MODE", + editMode: editMode + }, "*"); + } + } + + async function _enterEditMode() { + _setMdEditMode(true); + // Also set directly via the iframe's window if accessible (no sandbox in tests) + const win = _getMdIFrameWin(); + if (win && win.__setEditModeForTest) { + win.__setEditModeForTest(true); + } + await awaitsFor(() => { + const mdDoc = _getMdIFrameDoc(); + if (!mdDoc) { return false; } + const content = mdDoc.getElementById("viewer-content"); + return content && content.classList.contains("editing"); + }, "edit mode to activate"); + } + + async function _enterReaderMode() { + _setMdEditMode(false); + const win = _getMdIFrameWin(); + if (win && win.__setEditModeForTest) { + win.__setEditModeForTest(false); + } + await awaitsFor(() => { + const mdDoc = _getMdIFrameDoc(); + if (!mdDoc) { return false; } + const content = mdDoc.getElementById("viewer-content"); + return content && !content.classList.contains("editing"); + }, "reader mode to activate"); + } + + async function _focusMdContent() { + const mdDoc = _getMdIFrameDoc(); + const content = mdDoc.getElementById("viewer-content"); + content.focus(); + await awaitsFor(() => mdDoc.activeElement === content || content.contains(mdDoc.activeElement), + "md content to have focus"); + } + + function _isMac() { + return brackets.platform === "mac"; + } + + /** + * Dispatch a keyboard event on the md iframe's document (capture phase target). + * Uses Cmd on Mac and Ctrl on other platforms. + * Note: synthetic events are "untrusted" — execCommand won't fire from them. + * For formatting tests, use _execCommandInMdIframe() instead. + */ + function _dispatchKeyInMdIframe(key, options = {}) { + const mdDoc = _getMdIFrameDoc(); + if (!mdDoc) { + return; + } + const mac = _isMac(); + const event = new KeyboardEvent("keydown", { + key: key, + code: options.code || ("Key" + key.toUpperCase()), + keyCode: options.keyCode || key.toUpperCase().charCodeAt(0), + which: options.keyCode || key.toUpperCase().charCodeAt(0), + ctrlKey: mac ? false : (options.mod !== false), + metaKey: mac ? (options.mod !== false) : false, + shiftKey: !!options.shiftKey, + altKey: !!options.altKey, + bubbles: true, + cancelable: true + }); + // Dispatch on document so capture-phase listeners in bridge.js fire + mdDoc.dispatchEvent(event); + } + + /** + * Dispatch a keyboard event without modifier keys. + */ + function _dispatchPlainKeyInMdIframe(key, options = {}) { + const mdDoc = _getMdIFrameDoc(); + if (!mdDoc) { + return; + } + const event = new KeyboardEvent("keydown", { + key: key, + code: options.code || key, + keyCode: options.keyCode || 0, + which: options.keyCode || 0, + ctrlKey: false, + metaKey: false, + shiftKey: !!options.shiftKey, + altKey: false, + bubbles: true, + cancelable: true + }); + mdDoc.dispatchEvent(event); + } + + /** + * Execute a formatting command directly in the md iframe's contenteditable. + * Used instead of synthetic keyboard events since browsers reject + * execCommand from untrusted KeyboardEvents. + * Also triggers content sync to CM via the mdviewer's own input handler. + */ + function _execCommandInMdIframe(command, value) { + const mdDoc = _getMdIFrameDoc(); + const win = _getMdIFrameWin(); + if (mdDoc) { + mdDoc.execCommand(command, false, value || null); + // Trigger content sync via the iframe's own helper (dispatches input + // event from within the iframe context so the editor picks it up) + if (win && win.__triggerContentSync) { + win.__triggerContentSync(); + } + } + } + + /** + * Select text in the md iframe content. + * @param {string} selector - CSS selector for the element + * @param {number} startOffset - start character offset + * @param {number} endOffset - end character offset + */ + function _selectTextInMdIframe(selector, startOffset, endOffset) { + const mdDoc = _getMdIFrameDoc(); + const win = _getMdIFrameWin(); + if (!mdDoc || !win) { + return; + } + const el = mdDoc.querySelector(selector); + if (!el || !el.firstChild || el.firstChild.nodeType !== Node.TEXT_NODE) { + return; + } + const textNode = el.firstChild; + const range = mdDoc.createRange(); + range.setStart(textNode, Math.min(startOffset, textNode.textContent.length)); + range.setEnd(textNode, Math.min(endOffset, textNode.textContent.length)); + const sel = win.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + // Trigger selectionchange so editor updates toolbar state + mdDoc.dispatchEvent(new Event("selectionchange")); + } + + async function _waitForMdPreviewReady() { + await awaitsFor(() => { + const mdIFrame = _getMdPreviewIFrame(); + if (!mdIFrame || mdIFrame.style.display === "none") { return false; } + if (!mdIFrame.src || !mdIFrame.src.includes("mdViewer")) { return false; } + // Wait for bridge to initialize (exposes test helpers) + const win = mdIFrame.contentWindow; + return win && typeof win.__setEditModeForTest === "function"; + }, "md preview to be ready with bridge initialized"); + } + + describe("livepreview:Markdown Editor", function () { + + if (Phoenix.browser.desktop.isFirefox || + (Phoenix.isTestWindowPlaywright && !Phoenix.browser.desktop.isChromeBased)) { + it("Markdown editor tests are disabled in Firefox/non-Chrome playwright", function () { + // Firefox sandbox prevents service worker access from nested iframes. + // Non-Chrome playwright doesn't spawn virtual server needed for live preview. + }); + return; + } + + let testFilePath; + + beforeAll(async function () { + if (!testWindow) { + const useWindowInsteadOfIframe = Phoenix.browser.desktop.isFirefox; + testWindow = await SpecRunnerUtils.createTestWindowAndRun({ + forceReload: false, useWindowInsteadOfIframe + }); + brackets = testWindow.brackets; + CommandManager = brackets.test.CommandManager; + Commands = brackets.test.Commands; + EditorManager = brackets.test.EditorManager; + WorkspaceManager = brackets.test.WorkspaceManager; + LiveDevMultiBrowser = brackets.test.LiveDevMultiBrowser; + + await SpecRunnerUtils.loadProjectInTestWindow(testFolder); + await SpecRunnerUtils.deletePathAsync(testFolder + "/.phcode.json", true); + + // Ensure live preview panel is open + if (!WorkspaceManager.isPanelVisible("live-preview-panel")) { + await awaitsForDone(CommandManager.execute(Commands.FILE_LIVE_FILE_PREVIEW)); + } + + // Open an HTML file first to start live dev + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]), + "open simple1.html"); + LiveDevMultiBrowser.open(); + await awaitsFor(() => { + return LiveDevMultiBrowser.status === LiveDevMultiBrowser.STATUS_ACTIVE; + }, "live dev to open", 20000); + + // Now open the test markdown file + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["test-shortcuts.md"]), + "open test-shortcuts.md"); + await _waitForMdPreviewReady(); + testFilePath = testFolder + "/test-shortcuts.md"; + } + }, 30000); + + afterAll(async function () { + // Final cleanup for the entire Markdown Editor test suite + if (LiveDevMultiBrowser) { + LiveDevMultiBrowser.close(); + } + if (CommandManager) { + await awaitsForDone(CommandManager.execute(Commands.FILE_CLOSE_ALL, { _forceClose: true }), + "final close all files"); + } + testWindow = null; + brackets = null; + CommandManager = null; + Commands = null; + EditorManager = null; + WorkspaceManager = null; + LiveDevMultiBrowser = null; + }, 30000); + + const ORIGINAL_MD_CONTENT = "# Test Shortcuts\n\nThis is a test paragraph for keyboard shortcut testing.\n\n" + + "## Section Two\n\nAnother paragraph with some text to select and format.\n\n" + + "### Section Three\n\nFinal paragraph for testing.\n"; + + async function _resetFileContent() { + const editor = EditorManager.getActiveEditor(); + if (editor && editor.document) { + const cm = editor._codeMirror; + cm.setValue(ORIGINAL_MD_CONTENT); + await awaitsForDone(CommandManager.execute(Commands.FILE_SAVE), "save after reset"); + await awaitsFor(() => !editor.document.isDirty, "document to be clean after reset save"); + await awaitsFor(() => { + const mdDoc = _getMdIFrameDoc(); + const content = mdDoc && mdDoc.getElementById("viewer-content"); + return content && content.querySelector("h1") && + content.querySelector("h1").textContent.includes("Test Shortcuts"); + }, "viewer to sync with reset content"); + } + } + + let _tempFileCounter = 0; + + /** + * Create a fresh temp .md file with clean content, open it, and wait for + * the md preview to be ready. Avoids CM→iframe re-render races. + */ + async function _openFreshMdFile(content) { + content = content || ORIGINAL_MD_CONTENT; + _tempFileCounter++; + const tempPath = testFolder + "/_test_temp_" + _tempFileCounter + ".md"; + await SpecRunnerUtils.createTextFileAsync(tempPath, content); + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["_test_temp_" + _tempFileCounter + ".md"]), + "open temp md file"); + await _waitForMdPreviewReady(); + // Wait for viewer to have the content rendered and settled + await awaitsFor(() => { + const win = _getMdIFrameWin(); + const mdDoc = _getMdIFrameDoc(); + const el = mdDoc && mdDoc.getElementById("viewer-content"); + return el && el.querySelector("h1, p") && + win && win.__isSuppressingContentChange && !win.__isSuppressingContentChange(); + }, "temp file content to render and settle"); + return tempPath; + } + + async function _cleanupTempFiles() { + for (let i = 1; i <= _tempFileCounter; i++) { + const p = testFolder + "/_test_temp_" + i + ".md"; + await SpecRunnerUtils.deletePathAsync(p, true); + } + } + + describe("Keyboard Shortcut Forwarding", function () { + + function _listenForShortcut(key) { + let received = false; + const mdIFrame = _getMdPreviewIFrame(); + const parentWin = mdIFrame.contentWindow.parent; + const handler = function (event) { + if (event.data && event.data.type === "MDVIEWR_EVENT" && + event.data.eventName === "mdviewrKeyboardShortcut" && + event.data.key === key) { + received = true; + } + }; + parentWin.addEventListener("message", handler); + return { + check: () => received, + cleanup: () => parentWin.removeEventListener("message", handler) + }; + } + + it("should Ctrl+S in edit mode trigger Phoenix save", async function () { + await _enterEditMode(); + await _focusMdContent(); + + // Make a small edit in CM to dirty the document + const editor = EditorManager.getActiveEditor(); + const cm = editor._codeMirror; + const doc = editor.document; + cm.replaceRange(" ", { line: 0, ch: 0 }); + + await awaitsFor(() => doc.isDirty, "document to become dirty"); + + // Dispatch Ctrl+S in the md iframe — should trigger save + _dispatchKeyInMdIframe("s"); + + await awaitsFor(() => !doc.isDirty, "document to be saved (dirty flag cleared)"); + }, 10000); + + it("should Ctrl+Shift+F in edit mode open Find in Files", async function () { + await _enterEditMode(); + await _focusMdContent(); + + const listener = _listenForShortcut("f"); + _dispatchKeyInMdIframe("f", { shiftKey: true }); + await awaitsFor(() => listener.check(), "Ctrl+Shift+F shortcut to be forwarded"); + listener.cleanup(); + + // Dismiss the Find in Files bar if it opened + await awaitsFor(() => { + return testWindow.$(".modal-bar").is(":visible") || + testWindow.$("#search-result-container").is(":visible"); + }, "search bar to appear", 3000).catch(() => {}); + if (testWindow.$(".modal-bar").is(":visible")) { + testWindow.$(".modal-bar .close").click(); + } + }, 10000); + + it("should Ctrl+B in edit mode apply bold", async function () { + await _resetFileContent(); + await _enterEditMode(); + await _focusMdContent(); + + await awaitsFor(() => { + const win = _getMdIFrameWin(); + return win && !win.__isSuppressingContentChange(); + }, "suppression to clear"); + + _selectTextInMdIframe("#viewer-content p", 0, 4); + _execCommandInMdIframe("bold"); + + await awaitsFor(() => { + const content = _getMdIFrameDoc().getElementById("viewer-content"); + return content.querySelector("b, strong") !== null; + }, "bold to be applied in viewer"); + }, 10000); + + it("should Ctrl+I in edit mode apply italic", async function () { + await _resetFileContent(); + await _enterEditMode(); + await _focusMdContent(); + + await awaitsFor(() => { + const win = _getMdIFrameWin(); + return win && !win.__isSuppressingContentChange(); + }, "suppression to clear"); + + _selectTextInMdIframe("#viewer-content h2", 0, 4); + _execCommandInMdIframe("italic"); + + await awaitsFor(() => { + const content = _getMdIFrameDoc().getElementById("viewer-content"); + return content.querySelector("i, em") !== null; + }, "italic to be applied in viewer"); + }, 10000); + + it("should Ctrl+U in edit mode apply underline", async function () { + await _resetFileContent(); + await _enterEditMode(); + await _focusMdContent(); + + await awaitsFor(() => { + const win = _getMdIFrameWin(); + return win && !win.__isSuppressingContentChange(); + }, "suppression to clear"); + + _selectTextInMdIframe("#viewer-content h3", 0, 4); + _execCommandInMdIframe("underline"); + + await awaitsFor(() => { + const content = _getMdIFrameDoc().getElementById("viewer-content"); + return content.querySelector("u") !== null; + }, "underline to be applied in viewer"); + }, 10000); + + // Bold button disabled in headings is verified manually — the test + // infrastructure has timing issues with selectionchange + rAF in + // cross-iframe context. See updateFormatState in embedded-toolbar.js + // and onSelectionState in format-bar.js for the implementation. + + it("should Ctrl+Z in edit mode forward undo to Phoenix", async function () { + await _enterEditMode(); + await _focusMdContent(); + + let undoReceived = false; + const mdIFrame = _getMdPreviewIFrame(); + const parentWin = mdIFrame.contentWindow.parent; + const handler = function (event) { + if (event.data && event.data.type === "MDVIEWR_EVENT" && + event.data.eventName === "mdviewrUndo") { + undoReceived = true; + } + }; + parentWin.addEventListener("message", handler); + + _dispatchKeyInMdIframe("z"); + await awaitsFor(() => undoReceived, "Ctrl+Z undo to be forwarded"); + parentWin.removeEventListener("message", handler); + }, 10000); + + it("should Ctrl+Y in edit mode forward redo to Phoenix", async function () { + await _enterEditMode(); + await _focusMdContent(); + + let redoReceived = false; + const mdIFrame = _getMdPreviewIFrame(); + const parentWin = mdIFrame.contentWindow.parent; + const handler = function (event) { + if (event.data && event.data.type === "MDVIEWR_EVENT" && + event.data.eventName === "mdviewrRedo") { + redoReceived = true; + } + }; + parentWin.addEventListener("message", handler); + + _dispatchKeyInMdIframe("y"); + await awaitsFor(() => redoReceived, "Ctrl+Y redo to be forwarded"); + parentWin.removeEventListener("message", handler); + }, 10000); + + it("should Ctrl+Shift+Z in edit mode forward redo to Phoenix", async function () { + await _enterEditMode(); + await _focusMdContent(); + + let redoReceived = false; + const mdIFrame = _getMdPreviewIFrame(); + const parentWin = mdIFrame.contentWindow.parent; + const handler = function (event) { + if (event.data && event.data.type === "MDVIEWR_EVENT" && + event.data.eventName === "mdviewrRedo") { + redoReceived = true; + } + }; + parentWin.addEventListener("message", handler); + + _dispatchKeyInMdIframe("z", { shiftKey: true }); + await awaitsFor(() => redoReceived, "Ctrl+Shift+Z redo to be forwarded"); + parentWin.removeEventListener("message", handler); + }, 10000); + + it("should Ctrl+A in edit mode select all text natively", async function () { + await _enterEditMode(); + await _focusMdContent(); + + _execCommandInMdIframe("selectAll"); + + await awaitsFor(() => { + const sel = _getMdIFrameWin().getSelection(); + return sel.toString().length > 0; + }, "text to be selected"); + }, 10000); + + it("should Escape in edit mode send focus back to Phoenix editor", async function () { + await _enterEditMode(); + await _focusMdContent(); + + _dispatchPlainKeyInMdIframe("Escape", { keyCode: 27, code: "Escape" }); + + await awaitsFor(() => { + const activeEl = testWindow.document.activeElement; + const editorHolder = testWindow.document.getElementById("editor-holder"); + return editorHolder && editorHolder.contains(activeEl); + }, "editor to regain focus"); + }, 10000); + + it("should F-key shortcuts work in edit mode", async function () { + await _enterEditMode(); + await _focusMdContent(); + + const listener = _listenForShortcut("F8"); + _dispatchPlainKeyInMdIframe("F8", { keyCode: 119, code: "F8" }); + await awaitsFor(() => listener.check(), "F8 shortcut to be forwarded in edit mode"); + listener.cleanup(); + }, 10000); + + it("should F-key shortcuts work in reader mode", async function () { + await _enterReaderMode(); + + const listener = _listenForShortcut("F8"); + _dispatchPlainKeyInMdIframe("F8", { keyCode: 119, code: "F8" }); + await awaitsFor(() => listener.check(), "F8 shortcut to be forwarded in reader mode"); + listener.cleanup(); + }, 10000); + + it("should Ctrl+Shift+X in edit mode apply strikethrough (not forwarded)", async function () { + await _enterEditMode(); + _selectTextInMdIframe("#viewer-content p", 0, 4); + _execCommandInMdIframe("strikethrough"); + + await awaitsFor(() => { + const content = _getMdIFrameDoc().getElementById("viewer-content"); + return content.querySelector("s, strike, del") !== null; + }, "strikethrough to be applied"); + }, 10000); + + it("should Ctrl+K in edit mode create a link (not forwarded)", async function () { + await _enterEditMode(); + await _focusMdContent(); + + _selectTextInMdIframe("#viewer-content p", 0, 5); + _execCommandInMdIframe("createLink", "https://test.example.com"); + + await awaitsFor(() => { + const content = _getMdIFrameDoc().getElementById("viewer-content"); + return content.querySelector("a[href='https://test.example.com']") !== null; + }, "link to be created"); + }, 10000); + }); + + describe("Document Cache & File Switching", function () { + + async function _switchToMdTestProject() { + await SpecRunnerUtils.loadProjectInTestWindow(mdTestFolder); + await SpecRunnerUtils.deletePathAsync(mdTestFolder + "/.phcode.json", true); + } + + async function _openMdFileAndWaitForPreview(fileName) { + await awaitsForDone(SpecRunnerUtils.openProjectFiles([fileName]), + "open " + fileName); + await _waitForMdPreviewReady(); + } + + function _getViewerScrollTop() { + const mdDoc = _getMdIFrameDoc(); + const viewer = mdDoc && mdDoc.querySelector(".app-viewer"); + return viewer ? viewer.scrollTop : 0; + } + + function _setViewerScrollTop(scrollTop) { + const mdDoc = _getMdIFrameDoc(); + const viewer = mdDoc && mdDoc.querySelector(".app-viewer"); + if (viewer) { + viewer.scrollTop = scrollTop; + } + } + + function _getViewerH1Text() { + const mdDoc = _getMdIFrameDoc(); + const h1 = mdDoc && mdDoc.querySelector("#viewer-content h1"); + return h1 ? h1.textContent : ""; + } + + async function _assertMdEditMode(shouldBeEditing) { + await awaitsFor(() => { + const mdDoc = _getMdIFrameDoc(); + const content = mdDoc && mdDoc.getElementById("viewer-content"); + if (!content) { return false; } + return shouldBeEditing + ? content.classList.contains("editing") + : !content.classList.contains("editing"); + }, shouldBeEditing ? "md viewer to be in edit mode" : "md viewer to be in reader mode"); + } + + beforeAll(async function () { + // Switch to the md test project for these tests + if (testWindow) { + _setMdEditMode(false); + await awaitsForDone(CommandManager.execute(Commands.FILE_CLOSE_ALL, { _forceClose: true }), + "close all before project switch"); + await _switchToMdTestProject(); + + // Start live dev + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple.html"]), + "open simple.html"); + if (!WorkspaceManager.isPanelVisible("live-preview-panel")) { + await awaitsForDone(CommandManager.execute(Commands.FILE_LIVE_FILE_PREVIEW)); + } + LiveDevMultiBrowser.open(); + await awaitsFor(() => { + return LiveDevMultiBrowser.status === LiveDevMultiBrowser.STATUS_ACTIVE; + }, "live dev to open", 20000); + } + }, 30000); + + it("should switch between MD files with viewer showing correct content", async function () { + await _openMdFileAndWaitForPreview("doc1.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document One"), + "doc1 heading to appear"); + + await _openMdFileAndWaitForPreview("doc2.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document Two"), + "doc2 heading to appear"); + + // Switch back to doc1 — should show doc1 content + await _openMdFileAndWaitForPreview("doc1.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document One"), + "doc1 heading to appear on switch back"); + }, 15000); + + it("should preserve scroll position per-document on switch", async function () { + // Open long doc, scroll down + await _openMdFileAndWaitForPreview("long.md"); + await awaitsFor(() => _getViewerH1Text().includes("Long Document"), + "long doc heading to appear"); + + _setViewerScrollTop(300); + await awaitsFor(() => _getViewerScrollTop() >= 290, "scroll to apply"); + const scrollBefore = _getViewerScrollTop(); + + // Switch to doc2 + await _openMdFileAndWaitForPreview("doc2.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document Two"), + "doc2 heading to appear"); + + // Switch back to long doc — scroll should be restored + await _openMdFileAndWaitForPreview("long.md"); + await awaitsFor(() => { + const scroll = _getViewerScrollTop(); + return Math.abs(scroll - scrollBefore) < 50; + }, "scroll position to be restored"); + }, 15000); + + it("should preserve edit/reader mode globally across file switches", async function () { + await _openMdFileAndWaitForPreview("doc1.md"); + await _enterEditMode(); + + // Switch to another md file — should still be in edit mode + await _openMdFileAndWaitForPreview("doc2.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document Two"), + "doc2 heading to appear"); + await _assertMdEditMode(true); + + // Switch to reader mode + await _enterReaderMode(); + await _assertMdEditMode(false); + + // Switch to doc1 — should still be in reader mode + await _openMdFileAndWaitForPreview("doc1.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document One"), + "doc1 heading to appear"); + await _assertMdEditMode(false); + }, 15000); + + it("should switch MD to HTML and back reusing persistent md iframe", async function () { + await _openMdFileAndWaitForPreview("doc1.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document One"), + "doc1 content to load"); + + // Set a verification code inside the md iframe to prove persistence + const verificationCode = "persist_" + Date.now(); + _getMdIFrameWin().__test_verification = verificationCode; + + // Switch to HTML file + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple.html"]), + "open simple.html"); + await awaitsFor(() => { + const lpFrame = testWindow.document.getElementById("panel-live-preview-frame"); + return lpFrame && lpFrame.src && !lpFrame.src.includes("mdViewer"); + }, "HTML preview to load"); + + // Switch back to md file + await _openMdFileAndWaitForPreview("doc1.md"); + await awaitsFor(() => _getViewerH1Text().includes("Document One"), + "doc1 content to load after switch back"); + + // Verify iframe was NOT reloaded — our JS variable should survive + const win = _getMdIFrameWin(); + expect(win.__test_verification).toBe(verificationCode); + }, 15000); + + it("should preserve edit mode across project switches", async function () { + await _openMdFileAndWaitForPreview("doc1.md"); + await _enterEditMode(); + + // Switch to a different project + const otherProject = SpecRunnerUtils.getTestPath("/spec/LiveDevelopment-MultiBrowser-test-files"); + await SpecRunnerUtils.loadProjectInTestWindow(otherProject); + + // Open an HTML file and start live dev in the other project + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]), + "open simple1.html in other project"); + LiveDevMultiBrowser.open(); + await awaitsFor(() => { + return LiveDevMultiBrowser.status === LiveDevMultiBrowser.STATUS_ACTIVE; + }, "live dev active in other project", 20000); + + // Now open an md file in the other project + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]), + "open readme.md in other project"); + await _waitForMdPreviewReady(); + + // Edit mode should be preserved + await _assertMdEditMode(true); + + // Switch back to the md test project + await _switchToMdTestProject(); + await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple.html"]), + "reopen simple.html"); + LiveDevMultiBrowser.open(); + await awaitsFor(() => { + return LiveDevMultiBrowser.status === LiveDevMultiBrowser.STATUS_ACTIVE; + }, "live dev to reopen", 20000); + }, 30000); + }); + + }); +}); diff --git a/tracking-repos.json b/tracking-repos.json index 7cee151d68..501a623e66 100644 --- a/tracking-repos.json +++ b/tracking-repos.json @@ -1,5 +1,5 @@ { "phoenixPro": { - "commitID": "4b7f18af0837e289a48e6064ef884f66397b5f61" + "commitID": "7528dbc255a617cc86cfd9cae39abeedc4e9f634" } }++Hello, World!
+This is a sample HTML page.
+ +