Compare commits

..

1 Commits

Author SHA1 Message Date
Daniel J. Geiger 7958b7144a feat: Support subtypes for ExcalidrawTextElement 2023-10-14 17:46:57 -05:00
142 changed files with 3824 additions and 7194 deletions
+3
View File
@@ -0,0 +1,3 @@
## 2020-10-13
- Added ability to embed scene source into exported PNG/SVG files so you can import the scene from them (open via `Load` button or drag & drop). #2219
+11 -116
View File
@@ -145,14 +145,6 @@
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/code-frame@^7.22.13":
version "7.22.13"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
dependencies:
"@babel/highlight" "^7.22.13"
chalk "^2.4.2"
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8":
version "7.18.8"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d"
@@ -210,16 +202,6 @@
"@jridgewell/gen-mapping" "^0.3.2"
jsesc "^2.5.1"
"@babel/generator@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
dependencies:
"@babel/types" "^7.23.0"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
@@ -283,11 +265,6 @@
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
"@babel/helper-environment-visitor@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
"@babel/helper-explode-assignable-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
@@ -303,14 +280,6 @@
"@babel/template" "^7.18.6"
"@babel/types" "^7.18.9"
"@babel/helper-function-name@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
dependencies:
"@babel/template" "^7.22.15"
"@babel/types" "^7.23.0"
"@babel/helper-hoist-variables@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
@@ -318,13 +287,6 @@
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-member-expression-to-functions@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
@@ -412,28 +374,11 @@
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-split-export-declaration@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-string-parser@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
"@babel/helper-validator-identifier@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
"@babel/helper-validator-option@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
@@ -467,25 +412,11 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/highlight@^7.22.13":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
chalk "^2.4.2"
js-tokens "^4.0.0"
"@babel/parser@^7.12.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8", "@babel/parser@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539"
integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
@@ -1216,28 +1147,19 @@
"@babel/parser" "^7.18.6"
"@babel/types" "^7.18.6"
"@babel/template@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
dependencies:
"@babel/code-frame" "^7.22.13"
"@babel/parser" "^7.22.15"
"@babel/types" "^7.22.15"
"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9":
version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98"
integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==
dependencies:
"@babel/code-frame" "^7.22.13"
"@babel/generator" "^7.23.0"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/parser" "^7.23.0"
"@babel/types" "^7.23.0"
"@babel/code-frame" "^7.18.6"
"@babel/generator" "^7.18.9"
"@babel/helper-environment-visitor" "^7.18.9"
"@babel/helper-function-name" "^7.18.9"
"@babel/helper-hoist-variables" "^7.18.6"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/parser" "^7.18.9"
"@babel/types" "^7.18.9"
debug "^4.1.0"
globals "^11.1.0"
@@ -1249,15 +1171,6 @@
"@babel/helper-validator-identifier" "^7.18.6"
to-fast-properties "^2.0.0"
"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
dependencies:
"@babel/helper-string-parser" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
"@colors/colors@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
@@ -1757,11 +1670,6 @@
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
"@jridgewell/resolve-uri@^3.1.0":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
@@ -1780,19 +1688,6 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
"@jridgewell/sourcemap-codec@^1.4.14":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.17":
version "0.3.20"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.14"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
@@ -80,8 +80,7 @@ export const ExportToExcalidrawPlus: React.FC<{
appState: Partial<AppState>;
files: BinaryFiles;
onError: (error: Error) => void;
onSuccess: () => void;
}> = ({ elements, appState, files, onError, onSuccess }) => {
}> = ({ elements, appState, files, onError }) => {
const { t } = useI18n();
return (
<Card color="primary">
@@ -108,7 +107,6 @@ export const ExportToExcalidrawPlus: React.FC<{
try {
trackEvent("export", "eplus", `ui (${getFrame()})`);
await exportToExcalidrawPlus(elements, appState, files);
onSuccess();
} catch (error: any) {
console.error(error);
if (error.name !== "AbortError") {
+3 -8
View File
@@ -608,7 +608,7 @@ const ExcalidrawWrapper = () => {
canvas: HTMLCanvasElement,
) => {
if (exportedElements.length === 0) {
throw new Error(t("alerts.cannotExportEmptyCanvas"));
return window.alert(t("alerts.cannotExportEmptyCanvas"));
}
if (canvas) {
try {
@@ -624,7 +624,7 @@ const ExcalidrawWrapper = () => {
);
if (errorMessage) {
throw new Error(errorMessage);
setErrorMessage(errorMessage);
}
if (url) {
@@ -634,7 +634,7 @@ const ExcalidrawWrapper = () => {
if (error.name !== "AbortError") {
const { width, height } = canvas;
console.error(error, { width, height });
throw new Error(error.message);
setErrorMessage(error.message);
}
}
}
@@ -714,11 +714,6 @@ const ExcalidrawWrapper = () => {
},
});
}}
onSuccess={() => {
excalidrawAPI?.updateScene({
appState: { openDialog: null },
});
}}
/>
);
},
+2 -2
View File
@@ -49,11 +49,11 @@
"png-chunk-text": "1.0.0",
"png-chunks-encode": "1.0.0",
"png-chunks-extract": "1.0.0",
"points-on-curve": "1.0.1",
"points-on-curve": "0.2.0",
"pwacompat": "2.0.17",
"react": "18.2.0",
"react-dom": "18.2.0",
"roughjs": "4.6.4",
"roughjs": "4.5.2",
"sass": "1.51.0",
"socket.io-client": "2.3.1",
"tunnel-rat": "0.1.2"
+6 -6
View File
@@ -10,7 +10,7 @@ import {
computeBoundTextPosition,
computeContainerDimensionForBoundText,
getBoundTextElement,
measureText,
measureTextElement,
redrawTextBoundingBox,
} from "../element/textElement";
import {
@@ -31,7 +31,6 @@ import {
} from "../element/types";
import { AppState } from "../types";
import { Mutable } from "../utility-types";
import { getFontString } from "../utils";
import { register } from "./register";
export const actionUnbindText = register({
@@ -48,10 +47,11 @@ export const actionUnbindText = register({
selectedElements.forEach((element) => {
const boundTextElement = getBoundTextElement(element);
if (boundTextElement) {
const { width, height, baseline } = measureText(
boundTextElement.originalText,
getFontString(boundTextElement),
boundTextElement.lineHeight,
const { width, height, baseline } = measureTextElement(
boundTextElement,
{
text: boundTextElement.originalText,
},
);
const originalContainerHeight = getOriginalContainerHeightFromCache(
element.id,
+10 -94
View File
@@ -10,34 +10,26 @@ import { actionDeleteSelected } from "./actionDeleteSelected";
import { exportCanvas } from "../data/index";
import { getNonDeletedElements, isTextElement } from "../element";
import { t } from "../i18n";
import { isFirefox } from "../constants";
export const actionCopy = register({
name: "copy",
trackEvent: { category: "element" },
perform: async (elements, appState, _, app) => {
perform: (elements, appState, _, app) => {
const elementsToCopy = app.scene.getSelectedElements({
selectedElementIds: appState.selectedElementIds,
includeBoundTextElement: true,
includeElementsInFrames: true,
});
try {
await copyToClipboard(elementsToCopy, app.files);
} catch (error: any) {
return {
commitToHistory: false,
appState: {
...appState,
errorMessage: error.message,
},
};
}
copyToClipboard(elementsToCopy, app.files);
return {
commitToHistory: false,
};
},
predicate: (elements, appState, appProps, app) => {
return app.device.isMobile && !!navigator.clipboard;
},
contextItemLabel: "labels.copy",
// don't supply a shortcut since we handle this conditionally via onCopy event
keyTest: undefined,
@@ -46,91 +38,15 @@ export const actionCopy = register({
export const actionPaste = register({
name: "paste",
trackEvent: { category: "element" },
perform: async (elements, appState, data, app) => {
const MIME_TYPES: Record<string, string> = {};
try {
try {
const clipboardItems = await navigator.clipboard?.read();
for (const item of clipboardItems) {
for (const type of item.types) {
try {
const blob = await item.getType(type);
MIME_TYPES[type] = await blob.text();
} catch (error: any) {
console.warn(
`Cannot retrieve ${type} from clipboardItem: ${error.message}`,
);
}
}
}
if (Object.keys(MIME_TYPES).length === 0) {
console.warn(
"No clipboard data found from clipboard.read(). Falling back to clipboard.readText()",
);
// throw so we fall back onto clipboard.readText()
throw new Error("No clipboard data found");
}
} catch (error: any) {
try {
MIME_TYPES["text/plain"] = await navigator.clipboard?.readText();
} catch (error: any) {
console.warn(`Cannot readText() from clipboard: ${error.message}`);
if (isFirefox) {
return {
commitToHistory: false,
appState: {
...appState,
errorMessage: t("hints.firefox_clipboard_write"),
},
};
}
throw error;
}
}
} catch (error: any) {
console.error(`actionPaste: ${error.message}`);
return {
commitToHistory: false,
appState: {
...appState,
errorMessage: error.message,
},
};
}
try {
console.log("actionPaste (1)", { MIME_TYPES });
const event = new ClipboardEvent("paste", {
clipboardData: new DataTransfer(),
});
for (const [type, value] of Object.entries(MIME_TYPES)) {
try {
event.clipboardData?.setData(type, value);
} catch (error: any) {
console.warn(
`Cannot set ${type} as clipboardData item: ${error.message}`,
);
}
}
event.clipboardData?.types.forEach((type) => {
console.log(
`actionPaste (2) event.clipboardData?.getData(${type})`,
event.clipboardData?.getData(type),
);
});
app.pasteFromClipboard(event);
} catch (error: any) {
return {
commitToHistory: false,
appState: {
...appState,
errorMessage: error.message,
},
};
}
perform: (elements: any, appStates: any, data, app) => {
app.pasteFromClipboard(null);
return {
commitToHistory: false,
};
},
predicate: (elements, appState, appProps, app) => {
return app.device.isMobile && !!navigator.clipboard;
},
contextItemLabel: "labels.paste",
// don't supply a shortcut since we handle this conditionally via onCopy event
keyTest: undefined,
-1
View File
@@ -46,7 +46,6 @@ const deleteSelectedElements = (
appState: {
...appState,
selectedElementIds: {},
selectedGroupIds: {},
},
};
};
+1 -9
View File
@@ -191,15 +191,7 @@ export const actionSaveFileToDisk = register({
},
app.files,
);
return {
commitToHistory: false,
appState: {
...appState,
openDialog: null,
fileHandle,
toast: { message: t("toast.fileSaved") },
},
};
return { commitToHistory: false, appState: { ...appState, fileHandle } };
} catch (error: any) {
if (error?.name !== "AbortError") {
console.error(error);
-167
View File
@@ -1,167 +0,0 @@
import { Excalidraw } from "../packages/excalidraw/index";
import { queryByTestId } from "@testing-library/react";
import { render } from "../tests/test-utils";
import { UI } from "../tests/helpers/ui";
import { API } from "../tests/helpers/api";
import { COLOR_PALETTE, DEFAULT_ELEMENT_BACKGROUND_PICKS } from "../colors";
import { FONT_FAMILY, STROKE_WIDTH } from "../constants";
const { h } = window;
describe("element locking", () => {
beforeEach(async () => {
await render(<Excalidraw />);
});
describe("properties when tool selected", () => {
it("should show active background top picks", () => {
UI.clickTool("rectangle");
const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1];
// just in case we change it in the future
expect(color).not.toBe(COLOR_PALETTE.transparent);
h.setState({
currentItemBackgroundColor: color,
});
const activeColor = queryByTestId(
document.body,
`color-top-pick-${color}`,
);
expect(activeColor).toHaveClass("active");
});
it("should show fill style when background non-transparent", () => {
UI.clickTool("rectangle");
const color = DEFAULT_ELEMENT_BACKGROUND_PICKS[1];
// just in case we change it in the future
expect(color).not.toBe(COLOR_PALETTE.transparent);
h.setState({
currentItemBackgroundColor: color,
currentItemFillStyle: "hachure",
});
const hachureFillButton = queryByTestId(document.body, `fill-hachure`);
expect(hachureFillButton).toHaveClass("active");
h.setState({
currentItemFillStyle: "solid",
});
const solidFillStyle = queryByTestId(document.body, `fill-solid`);
expect(solidFillStyle).toHaveClass("active");
});
it("should not show fill style when background transparent", () => {
UI.clickTool("rectangle");
h.setState({
currentItemBackgroundColor: COLOR_PALETTE.transparent,
currentItemFillStyle: "hachure",
});
const hachureFillButton = queryByTestId(document.body, `fill-hachure`);
expect(hachureFillButton).toBe(null);
});
it("should show horizontal text align for text tool", () => {
UI.clickTool("text");
h.setState({
currentItemTextAlign: "right",
});
const centerTextAlign = queryByTestId(document.body, `align-right`);
expect(centerTextAlign).toBeChecked();
});
});
describe("properties when elements selected", () => {
it("should show active styles when single element selected", () => {
const rect = API.createElement({
type: "rectangle",
backgroundColor: "red",
fillStyle: "cross-hatch",
});
h.elements = [rect];
API.setSelectedElements([rect]);
const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`);
expect(crossHatchButton).toHaveClass("active");
});
it("should not show fill style selected element's background is transparent", () => {
const rect = API.createElement({
type: "rectangle",
backgroundColor: COLOR_PALETTE.transparent,
fillStyle: "cross-hatch",
});
h.elements = [rect];
API.setSelectedElements([rect]);
const crossHatchButton = queryByTestId(document.body, `fill-cross-hatch`);
expect(crossHatchButton).toBe(null);
});
it("should highlight common stroke width of selected elements", () => {
const rect1 = API.createElement({
type: "rectangle",
strokeWidth: STROKE_WIDTH.thin,
});
const rect2 = API.createElement({
type: "rectangle",
strokeWidth: STROKE_WIDTH.thin,
});
h.elements = [rect1, rect2];
API.setSelectedElements([rect1, rect2]);
const thinStrokeWidthButton = queryByTestId(
document.body,
`strokeWidth-thin`,
);
expect(thinStrokeWidthButton).toBeChecked();
});
it("should not highlight any stroke width button if no common style", () => {
const rect1 = API.createElement({
type: "rectangle",
strokeWidth: STROKE_WIDTH.thin,
});
const rect2 = API.createElement({
type: "rectangle",
strokeWidth: STROKE_WIDTH.bold,
});
h.elements = [rect1, rect2];
API.setSelectedElements([rect1, rect2]);
expect(queryByTestId(document.body, `strokeWidth-thin`)).not.toBe(null);
expect(
queryByTestId(document.body, `strokeWidth-thin`),
).not.toBeChecked();
expect(
queryByTestId(document.body, `strokeWidth-bold`),
).not.toBeChecked();
expect(
queryByTestId(document.body, `strokeWidth-extraBold`),
).not.toBeChecked();
});
it("should show properties of different element types when selected", () => {
const rect = API.createElement({
type: "rectangle",
strokeWidth: STROKE_WIDTH.bold,
});
const text = API.createElement({
type: "text",
fontFamily: FONT_FAMILY.Cascadia,
});
h.elements = [rect, text];
API.setSelectedElements([rect, text]);
expect(queryByTestId(document.body, `strokeWidth-bold`)).toBeChecked();
expect(queryByTestId(document.body, `font-family-code`)).toBeChecked();
});
});
});
+27 -84
View File
@@ -1,4 +1,4 @@
import { AppState, Primitive } from "../../src/types";
import { AppState } from "../../src/types";
import {
DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE,
DEFAULT_ELEMENT_BACKGROUND_PICKS,
@@ -51,7 +51,6 @@ import {
DEFAULT_FONT_SIZE,
FONT_FAMILY,
ROUNDNESS,
STROKE_WIDTH,
VERTICAL_ALIGN,
} from "../constants";
import {
@@ -83,6 +82,7 @@ import { getLanguage, t } from "../i18n";
import { KEYS } from "../keys";
import { randomInteger } from "../random";
import {
canChangeRoundness,
canHaveArrowheads,
getCommonAttributeOfSelectedElements,
getSelectedElements,
@@ -118,44 +118,25 @@ export const changeProperty = (
});
};
export const getFormValue = function <T extends Primitive>(
export const getFormValue = function <T>(
elements: readonly ExcalidrawElement[],
appState: AppState,
getAttribute: (element: ExcalidrawElement) => T,
isRelevantElement: true | ((element: ExcalidrawElement) => boolean),
defaultValue: T | ((isSomeElementSelected: boolean) => T),
defaultValue: T,
): T {
const editingElement = appState.editingElement;
const nonDeletedElements = getNonDeletedElements(elements);
let ret: T | null = null;
if (editingElement) {
ret = getAttribute(editingElement);
}
if (!ret) {
const hasSelection = isSomeElementSelected(nonDeletedElements, appState);
if (hasSelection) {
ret =
getCommonAttributeOfSelectedElements(
isRelevantElement === true
? nonDeletedElements
: nonDeletedElements.filter((el) => isRelevantElement(el)),
return (
(editingElement && getAttribute(editingElement)) ??
(isSomeElementSelected(nonDeletedElements, appState)
? getCommonAttributeOfSelectedElements(
nonDeletedElements,
appState,
getAttribute,
) ??
(typeof defaultValue === "function"
? defaultValue(true)
: defaultValue);
} else {
ret =
typeof defaultValue === "function" ? defaultValue(false) : defaultValue;
}
}
return ret;
)
: defaultValue) ??
defaultValue
);
};
const offsetElementAfterFontResize = (
@@ -266,7 +247,6 @@ export const actionChangeStrokeColor = register({
elements,
appState,
(element) => element.strokeColor,
true,
appState.currentItemStrokeColor,
)}
onChange={(color) => updateData({ currentItemStrokeColor: color })}
@@ -309,7 +289,6 @@ export const actionChangeBackgroundColor = register({
elements,
appState,
(element) => element.backgroundColor,
true,
appState.currentItemBackgroundColor,
)}
onChange={(color) => updateData({ currentItemBackgroundColor: color })}
@@ -359,28 +338,23 @@ export const actionChangeFillStyle = register({
} (${getShortcutKey("Alt-Click")})`,
icon: allElementsZigZag ? FillZigZagIcon : FillHachureIcon,
active: allElementsZigZag ? true : undefined,
testId: `fill-hachure`,
},
{
value: "cross-hatch",
text: t("labels.crossHatch"),
icon: FillCrossHatchIcon,
testId: `fill-cross-hatch`,
},
{
value: "solid",
text: t("labels.solid"),
icon: FillSolidIcon,
testId: `fill-solid`,
},
]}
value={getFormValue(
elements,
appState,
(element) => element.fillStyle,
(element) => element.hasOwnProperty("fillStyle"),
(hasSelection) =>
hasSelection ? null : appState.currentItemFillStyle,
appState.currentItemFillStyle,
)}
onClick={(value, event) => {
const nextValue =
@@ -419,31 +393,26 @@ export const actionChangeStrokeWidth = register({
group="stroke-width"
options={[
{
value: STROKE_WIDTH.thin,
value: 1,
text: t("labels.thin"),
icon: StrokeWidthBaseIcon,
testId: "strokeWidth-thin",
},
{
value: STROKE_WIDTH.bold,
value: 2,
text: t("labels.bold"),
icon: StrokeWidthBoldIcon,
testId: "strokeWidth-bold",
},
{
value: STROKE_WIDTH.extraBold,
value: 4,
text: t("labels.extraBold"),
icon: StrokeWidthExtraBoldIcon,
testId: "strokeWidth-extraBold",
},
]}
value={getFormValue(
elements,
appState,
(element) => element.strokeWidth,
(element) => element.hasOwnProperty("strokeWidth"),
(hasSelection) =>
hasSelection ? null : appState.currentItemStrokeWidth,
appState.currentItemStrokeWidth,
)}
onChange={(value) => updateData(value)}
/>
@@ -492,9 +461,7 @@ export const actionChangeSloppiness = register({
elements,
appState,
(element) => element.roughness,
(element) => element.hasOwnProperty("roughness"),
(hasSelection) =>
hasSelection ? null : appState.currentItemRoughness,
appState.currentItemRoughness,
)}
onChange={(value) => updateData(value)}
/>
@@ -542,9 +509,7 @@ export const actionChangeStrokeStyle = register({
elements,
appState,
(element) => element.strokeStyle,
(element) => element.hasOwnProperty("strokeStyle"),
(hasSelection) =>
hasSelection ? null : appState.currentItemStrokeStyle,
appState.currentItemStrokeStyle,
)}
onChange={(value) => updateData(value)}
/>
@@ -584,7 +549,6 @@ export const actionChangeOpacity = register({
elements,
appState,
(element) => element.opacity,
true,
appState.currentItemOpacity,
) ?? undefined
}
@@ -643,12 +607,7 @@ export const actionChangeFontSize = register({
}
return null;
},
(element) =>
isTextElement(element) || getBoundTextElement(element) !== null,
(hasSelection) =>
hasSelection
? null
: appState.currentItemFontSize || DEFAULT_FONT_SIZE,
appState.currentItemFontSize || DEFAULT_FONT_SIZE,
)}
onChange={(value) => updateData(value)}
/>
@@ -733,25 +692,21 @@ export const actionChangeFontFamily = register({
value: FontFamilyValues;
text: string;
icon: JSX.Element;
testId: string;
}[] = [
{
value: FONT_FAMILY.Virgil,
text: t("labels.handDrawn"),
icon: FreedrawIcon,
testId: "font-family-virgil",
},
{
value: FONT_FAMILY.Helvetica,
text: t("labels.normal"),
icon: FontFamilyNormalIcon,
testId: "font-family-normal",
},
{
value: FONT_FAMILY.Cascadia,
text: t("labels.code"),
icon: FontFamilyCodeIcon,
testId: "font-family-code",
},
];
@@ -774,12 +729,7 @@ export const actionChangeFontFamily = register({
}
return null;
},
(element) =>
isTextElement(element) || getBoundTextElement(element) !== null,
(hasSelection) =>
hasSelection
? null
: appState.currentItemFontFamily || DEFAULT_FONT_FAMILY,
appState.currentItemFontFamily || DEFAULT_FONT_FAMILY,
)}
onChange={(value) => updateData(value)}
/>
@@ -856,10 +806,7 @@ export const actionChangeTextAlign = register({
}
return null;
},
(element) =>
isTextElement(element) || getBoundTextElement(element) !== null,
(hasSelection) =>
hasSelection ? null : appState.currentItemTextAlign,
appState.currentItemTextAlign,
)}
onChange={(value) => updateData(value)}
/>
@@ -935,9 +882,7 @@ export const actionChangeVerticalAlign = register({
}
return null;
},
(element) =>
isTextElement(element) || getBoundTextElement(element) !== null,
(hasSelection) => (hasSelection ? null : VERTICAL_ALIGN.MIDDLE),
VERTICAL_ALIGN.MIDDLE,
)}
onChange={(value) => updateData(value)}
/>
@@ -1002,9 +947,9 @@ export const actionChangeRoundness = register({
appState,
(element) =>
hasLegacyRoundness ? null : element.roundness ? "round" : "sharp",
(element) => element.hasOwnProperty("roundness"),
(hasSelection) =>
hasSelection ? null : appState.currentItemRoundness,
(canChangeRoundness(appState.activeTool.type) &&
appState.currentItemRoundness) ||
null,
)}
onChange={(value) => updateData(value)}
/>
@@ -1098,7 +1043,6 @@ export const actionChangeArrowhead = register({
isLinearElement(element) && canHaveArrowheads(element.type)
? element.startArrowhead
: appState.currentItemStartArrowhead,
true,
appState.currentItemStartArrowhead,
)}
onChange={(value) => updateData({ position: "start", type: value })}
@@ -1145,7 +1089,6 @@ export const actionChangeArrowhead = register({
isLinearElement(element) && canHaveArrowheads(element.type)
? element.endArrowhead
: appState.currentItemEndArrowhead,
true,
appState.currentItemEndArrowhead,
)}
onChange={(value) => updateData({ position: "end", type: value })}
+12 -7
View File
@@ -1,21 +1,26 @@
import { parseClipboard } from "./clipboard";
import { createPasteEvent } from "./tests/test-utils";
describe("Test parseClipboard", () => {
it("should parse valid json correctly", async () => {
let text = "123";
let clipboardData = await parseClipboard(
createPasteEvent({ "text/plain": text }),
);
let clipboardData = await parseClipboard({
//@ts-ignore
clipboardData: {
getData: () => text,
},
});
expect(clipboardData.text).toBe(text);
text = "[123]";
clipboardData = await parseClipboard(
createPasteEvent({ "text/plain": text }),
);
clipboardData = await parseClipboard({
//@ts-ignore
clipboardData: {
getData: () => text,
},
});
expect(clipboardData.text).toBe(text);
});
+16 -74
View File
@@ -18,14 +18,11 @@ type ElementsClipboard = {
files: BinaryFiles | undefined;
};
export type PastedMixedContent = { type: "text" | "imageUrl"; value: string }[];
export interface ClipboardData {
spreadsheet?: Spreadsheet;
elements?: readonly ExcalidrawElement[];
files?: BinaryFiles;
text?: string;
mixedContent?: PastedMixedContent;
errorMessage?: string;
programmaticAPI?: boolean;
}
@@ -118,7 +115,7 @@ export const copyToClipboard = async (
await copyTextToSystemClipboard(json);
} catch (error: any) {
PREFER_APP_CLIPBOARD = true;
throw error;
console.error(error);
}
};
@@ -145,71 +142,22 @@ const parsePotentialSpreadsheet = (
return null;
};
/** internal, specific to parsing paste events. Do not reuse. */
function parseHTMLTree(el: ChildNode) {
let result: PastedMixedContent = [];
for (const node of el.childNodes) {
if (node.nodeType === 3) {
const text = node.textContent?.trim();
if (text) {
result.push({ type: "text", value: text });
}
} else if (node instanceof HTMLImageElement) {
const url = node.getAttribute("src");
if (url && url.startsWith("http")) {
result.push({ type: "imageUrl", value: url });
}
} else {
result = result.concat(parseHTMLTree(node));
}
}
return result;
}
const maybeParseHTMLPaste = (event: ClipboardEvent) => {
const html = event.clipboardData?.getData("text/html");
if (!html) {
return null;
}
try {
const doc = new DOMParser().parseFromString(html, "text/html");
const content = parseHTMLTree(doc.body);
if (content.length) {
return content;
}
} catch (error: any) {
console.error(`error in parseHTMLFromPaste: ${error.message}`);
}
return null;
};
/**
* Retrieves content from system clipboard (either from ClipboardEvent or
* via async clipboard API if supported)
*/
const getSystemClipboard = async (
event: ClipboardEvent,
isPlainPaste = false,
): Promise<
| { type: "text"; value: string }
| { type: "mixedContent"; value: PastedMixedContent }
> => {
export const getSystemClipboard = async (
event: ClipboardEvent | null,
): Promise<string> => {
try {
const mixedContent = !isPlainPaste && event && maybeParseHTMLPaste(event);
if (mixedContent) {
return { type: "mixedContent", value: mixedContent };
}
const text = event
? event.clipboardData?.getData("text/plain")
: probablySupportsClipboardReadText &&
(await navigator.clipboard.readText());
const text = event.clipboardData?.getData("text/plain");
return { type: "text", value: (text || "").trim() };
return (text || "").trim();
} catch {
return { type: "text", value: "" };
return "";
}
};
@@ -217,23 +165,17 @@ const getSystemClipboard = async (
* Attempts to parse clipboard. Prefers system clipboard.
*/
export const parseClipboard = async (
event: ClipboardEvent,
event: ClipboardEvent | null,
isPlainPaste = false,
): Promise<ClipboardData> => {
const systemClipboard = await getSystemClipboard(event, isPlainPaste);
if (systemClipboard.type === "mixedContent") {
return {
mixedContent: systemClipboard.value,
};
}
const systemClipboard = await getSystemClipboard(event);
// if system clipboard empty, couldn't be resolved, or contains previously
// copied excalidraw scene as SVG, fall back to previously copied excalidraw
// elements
if (
!systemClipboard ||
(!isPlainPaste && systemClipboard.value.includes(SVG_EXPORT_TAG))
(!isPlainPaste && systemClipboard.includes(SVG_EXPORT_TAG))
) {
return getAppClipboard();
}
@@ -241,7 +183,7 @@ export const parseClipboard = async (
// if system clipboard contains spreadsheet, use it even though it's
// technically possible it's staler than in-app clipboard
const spreadsheetResult =
!isPlainPaste && parsePotentialSpreadsheet(systemClipboard.value);
!isPlainPaste && parsePotentialSpreadsheet(systemClipboard);
if (spreadsheetResult) {
return spreadsheetResult;
@@ -250,7 +192,7 @@ export const parseClipboard = async (
const appClipboardData = getAppClipboard();
try {
const systemClipboardData = JSON.parse(systemClipboard.value);
const systemClipboardData = JSON.parse(systemClipboard);
const programmaticAPI =
systemClipboardData.type === EXPORT_DATA_TYPES.excalidrawClipboardWithAPI;
if (clipboardContainsElements(systemClipboardData)) {
@@ -274,7 +216,7 @@ export const parseClipboard = async (
? JSON.stringify(appClipboardData.elements, null, 2)
: undefined,
}
: { text: systemClipboard.value };
: { text: systemClipboard };
};
export const copyBlobToClipboardAsPng = async (blob: Blob | Promise<Blob>) => {
+13 -14
View File
@@ -1,7 +1,7 @@
import React, { useState } from "react";
import { ActionManager } from "../actions/manager";
import { getNonDeletedElements } from "../element";
import { ExcalidrawElement } from "../element/types";
import { ExcalidrawElement, PointerType } from "../element/types";
import { t } from "../i18n";
import { useDevice } from "../components/App";
import {
@@ -11,6 +11,7 @@ import {
hasBackground,
hasStrokeStyle,
hasStrokeWidth,
hasText,
} from "../scene";
import { SHAPES } from "../shapes";
import { AppClassProperties, UIAppState, Zoom } from "../types";
@@ -19,7 +20,7 @@ import Stack from "./Stack";
import { ToolButton } from "./ToolButton";
import { hasStrokeColor } from "../scene/comparisons";
import { trackEvent } from "../analytics";
import { hasBoundTextElement, isTextElement } from "../element/typeChecks";
import { hasBoundTextElement } from "../element/typeChecks";
import clsx from "clsx";
import { actionToggleZenMode } from "../actions";
import { Tooltip } from "./Tooltip";
@@ -65,8 +66,7 @@ export const SelectedShapeActions = ({
const isRTL = document.documentElement.getAttribute("dir") === "rtl";
const showFillIcons =
(hasBackground(appState.activeTool.type) &&
!isTransparent(appState.currentItemBackgroundColor)) ||
hasBackground(appState.activeTool.type) ||
targetElements.some(
(element) =>
hasBackground(element.type) && !isTransparent(element.backgroundColor),
@@ -123,15 +123,14 @@ export const SelectedShapeActions = ({
<>{renderAction("changeRoundness")}</>
)}
{(appState.activeTool.type === "text" ||
targetElements.some(isTextElement)) && (
{(hasText(appState.activeTool.type) ||
targetElements.some((element) => hasText(element.type))) && (
<>
{renderAction("changeFontSize")}
{renderAction("changeFontFamily")}
{(appState.activeTool.type === "text" ||
suppportsHorizontalAlign(targetElements)) &&
{suppportsHorizontalAlign(targetElements) &&
renderAction("changeTextAlign")}
</>
)}
@@ -214,11 +213,15 @@ export const SelectedShapeActions = ({
};
export const ShapesSwitcher = ({
interactiveCanvas,
activeTool,
onImageAction,
appState,
app,
}: {
interactiveCanvas: HTMLCanvasElement | null;
activeTool: UIAppState["activeTool"];
onImageAction: (data: { pointerType: PointerType | null }) => void;
appState: UIAppState;
app: AppClassProperties;
}) => {
@@ -260,13 +263,9 @@ export const ShapesSwitcher = ({
if (appState.activeTool.type !== value) {
trackEvent("toolbar", value, "ui");
}
app.setActiveTool({ type: value });
if (value === "image") {
app.setActiveTool({
type: value,
insertOnCanvasDirectly: pointerType !== "mouse",
});
} else {
app.setActiveTool({ type: value });
onImageAction({ pointerType });
}
}}
/>
+30 -188
View File
@@ -47,7 +47,7 @@ import {
isEraserActive,
isHandToolActive,
} from "../appState";
import { PastedMixedContent, parseClipboard } from "../clipboard";
import { parseClipboard } from "../clipboard";
import {
APP_NAME,
CURSOR_TYPE,
@@ -275,7 +275,6 @@ import {
generateIdFromFile,
getDataURL,
getFileFromEvent,
ImageURLToFile,
isImageFileHandle,
isSupportedImageFile,
loadSceneOrLibraryFromBlob,
@@ -374,7 +373,6 @@ import {
resetCursor,
setCursorForShape,
} from "../cursor";
import { Emitter } from "../emitter";
const AppContext = React.createContext<AppClassProperties>(null!);
const AppPropsContext = React.createContext<AppProps>(null!);
@@ -506,30 +504,6 @@ class App extends React.Component<AppProps, AppState> {
laserPathManager: LaserPathManager = new LaserPathManager(this);
onChangeEmitter = new Emitter<
[
elements: readonly ExcalidrawElement[],
appState: AppState,
files: BinaryFiles,
]
>();
onPointerDownEmitter = new Emitter<
[
activeTool: AppState["activeTool"],
pointerDownState: PointerDownState,
event: React.PointerEvent<HTMLElement>,
]
>();
onPointerUpEmitter = new Emitter<
[
activeTool: AppState["activeTool"],
pointerDownState: PointerDownState,
event: PointerEvent,
]
>();
constructor(props: AppProps) {
super(props);
const defaultAppState = getDefaultAppState();
@@ -593,9 +567,6 @@ class App extends React.Component<AppProps, AppState> {
resetCursor: this.resetCursor,
updateFrameRendering: this.updateFrameRendering,
toggleSidebar: this.toggleSidebar,
onChange: (cb) => this.onChangeEmitter.on(cb),
onPointerDown: (cb) => this.onPointerDownEmitter.on(cb),
onPointerUp: (cb) => this.onPointerUpEmitter.on(cb),
} as const;
if (typeof excalidrawRef === "function") {
excalidrawRef(api);
@@ -1217,6 +1188,7 @@ class App extends React.Component<AppProps, AppState> {
>
<LayerUI
canvas={this.canvas}
interactiveCanvas={this.interactiveCanvas}
appState={this.state}
files={this.files}
setAppState={this.setAppState}
@@ -1233,6 +1205,7 @@ class App extends React.Component<AppProps, AppState> {
this.state.zenModeEnabled
}
UIOptions={this.props.UIOptions}
onImageAction={this.onImageAction}
onExportImage={this.onExportImage}
renderWelcomeScreen={
!this.state.isLoading &&
@@ -1275,12 +1248,6 @@ class App extends React.Component<AppProps, AppState> {
top={this.state.contextMenu.top}
left={this.state.contextMenu.left}
actionManager={this.actionManager}
onClose={(cb) => {
this.setState({ contextMenu: null }, () => {
this.focusContainer();
cb?.();
});
}}
/>
)}
<StaticCanvas
@@ -1784,7 +1751,6 @@ class App extends React.Component<AppProps, AppState> {
this.scene.destroy();
this.library.destroy();
this.laserPathManager.destroy();
this.onChangeEmitter.destroy();
ShapeCache.destroy();
SnapCache.destroy();
clearTimeout(touchTimeout);
@@ -2069,11 +2035,6 @@ class App extends React.Component<AppProps, AppState> {
this.state,
this.files,
);
this.onChangeEmitter.trigger(
this.scene.getElementsIncludingDeleted(),
this.state,
this.files,
);
}
}
@@ -2201,21 +2162,14 @@ class App extends React.Component<AppProps, AppState> {
};
public pasteFromClipboard = withBatchedUpdates(
async (event: ClipboardEvent) => {
async (event: ClipboardEvent | null) => {
const isPlainPaste = !!(IS_PLAIN_PASTE && event);
console.warn(
"pasteFromClipboard",
event?.clipboardData?.types,
event?.clipboardData?.getData("text/plain"),
);
// #686
const target = document.activeElement;
const isExcalidrawActive =
this.excalidrawContainerRef.current?.contains(target);
if (event && !isExcalidrawActive) {
console.log("exit (1)");
return;
}
@@ -2228,10 +2182,24 @@ class App extends React.Component<AppProps, AppState> {
(!(elementUnderCursor instanceof HTMLCanvasElement) ||
isWritableElement(target))
) {
console.log("exit (2)");
return;
}
// must be called in the same frame (thus before any awaits) as the paste
// event else some browsers (FF...) will clear the clipboardData
// (something something security)
let file = event?.clipboardData?.files[0];
const data = await parseClipboard(event, isPlainPaste);
if (!file && data.text && !isPlainPaste) {
const string = data.text.trim();
if (string.startsWith("<svg") && string.endsWith("</svg>")) {
// ignore SVG validation/normalization which will be done during image
// initialization
file = SVGStringToFile(string);
}
}
const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(
{
clientX: this.lastViewportPosition.x,
@@ -2240,29 +2208,6 @@ class App extends React.Component<AppProps, AppState> {
this.state,
);
// must be called in the same frame (thus before any awaits) as the paste
// event else some browsers (FF...) will clear the clipboardData
// (something something security)
let file = event?.clipboardData?.files[0];
const data = await parseClipboard(event, isPlainPaste);
if (!file && !isPlainPaste) {
if (data.mixedContent) {
return this.addElementsFromMixedContentPaste(data.mixedContent, {
isPlainPaste,
sceneX,
sceneY,
});
} else if (data.text) {
const string = data.text.trim();
if (string.startsWith("<svg") && string.endsWith("</svg>")) {
// ignore SVG validation/normalization which will be done during image
// initialization
file = SVGStringToFile(string);
}
}
}
// prefer spreadsheet data over image file (MS Office/Libre Office)
if (isSupportedImageFile(file) && !data.spreadsheet) {
const imageElement = this.createImageElement({ sceneX, sceneY });
@@ -2316,7 +2261,6 @@ class App extends React.Component<AppProps, AppState> {
});
} else if (data.text) {
const maybeUrl = extractSrc(data.text);
if (
!isPlainPaste &&
embeddableURLValidator(maybeUrl, this.props.validateEmbeddable) &&
@@ -2451,85 +2395,6 @@ class App extends React.Component<AppProps, AppState> {
this.setActiveTool({ type: "selection" });
};
// TODO rewrite this to paste both text & images at the same time if
// pasted data contains both
private async addElementsFromMixedContentPaste(
mixedContent: PastedMixedContent,
{
isPlainPaste,
sceneX,
sceneY,
}: { isPlainPaste: boolean; sceneX: number; sceneY: number },
) {
if (
!isPlainPaste &&
mixedContent.some((node) => node.type === "imageUrl")
) {
const imageURLs = mixedContent
.filter((node) => node.type === "imageUrl")
.map((node) => node.value);
const responses = await Promise.all(
imageURLs.map(async (url) => {
try {
return { file: await ImageURLToFile(url) };
} catch (error: any) {
return { errorMessage: error.message as string };
}
}),
);
let y = sceneY;
let firstImageYOffsetDone = false;
const nextSelectedIds: Record<ExcalidrawElement["id"], true> = {};
for (const response of responses) {
if (response.file) {
const imageElement = this.createImageElement({
sceneX,
sceneY: y,
});
const initializedImageElement = await this.insertImageElement(
imageElement,
response.file,
);
if (initializedImageElement) {
// vertically center first image in the batch
if (!firstImageYOffsetDone) {
firstImageYOffsetDone = true;
y -= initializedImageElement.height / 2;
}
// hack to reset the `y` coord because we vertically center during
// insertImageElement
mutateElement(initializedImageElement, { y }, false);
y = imageElement.y + imageElement.height + 25;
nextSelectedIds[imageElement.id] = true;
}
}
}
this.setState({
selectedElementIds: makeNextSelectedElementIds(
nextSelectedIds,
this.state,
),
});
const error = responses.find((response) => !!response.errorMessage);
if (error && error.errorMessage) {
this.setState({ errorMessage: error.errorMessage });
}
} else {
const textNodes = mixedContent.filter((node) => node.type === "text");
if (textNodes.length) {
this.addTextFromPaste(
textNodes.map((node) => node.value).join("\n\n"),
isPlainPaste,
);
}
}
}
private addTextFromPaste(text: string, isPlainPaste = false) {
const { x, y } = viewportCoordsToSceneCoords(
{
@@ -3269,16 +3134,11 @@ class App extends React.Component<AppProps, AppState> {
});
setActiveTool = (
tool: (
| (
| { type: Exclude<ToolType, "image"> }
| {
type: Extract<ToolType, "image">;
insertOnCanvasDirectly?: boolean;
}
)
| { type: "custom"; customType: string }
) & { locked?: boolean },
tool:
| {
type: ToolType;
}
| { type: "custom"; customType: string },
) => {
const nextActiveTool = updateActiveTool(this.state, tool);
if (nextActiveTool.type === "hand") {
@@ -3293,10 +3153,7 @@ class App extends React.Component<AppProps, AppState> {
this.setState({ suggestedBindings: [] });
}
if (nextActiveTool.type === "image") {
this.onImageAction({
insertOnCanvasDirectly:
(tool.type === "image" && tool.insertOnCanvasDirectly) ?? false,
});
this.onImageAction();
}
this.setState((prevState) => {
@@ -4540,7 +4397,6 @@ class App extends React.Component<AppProps, AppState> {
setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO);
}
}
private handleCanvasPointerDown = (
event: React.PointerEvent<HTMLElement>,
) => {
@@ -4730,7 +4586,7 @@ class App extends React.Component<AppProps, AppState> {
pointerDownState,
);
} else if (this.state.activeTool.type === "custom") {
setCursorForShape(this.interactiveCanvas, this.state);
setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO);
} else if (this.state.activeTool.type === "frame") {
this.createFrameElementOnPointerDown(pointerDownState);
} else if (this.state.activeTool.type === "laser") {
@@ -4749,11 +4605,6 @@ class App extends React.Component<AppProps, AppState> {
}
this.props?.onPointerDown?.(this.state.activeTool, pointerDownState);
this.onPointerDownEmitter.trigger(
this.state.activeTool,
pointerDownState,
event,
);
const onPointerMove =
this.onPointerMoveFromPointerDownHandler(pointerDownState);
@@ -6606,12 +6457,6 @@ class App extends React.Component<AppProps, AppState> {
this.setState({ pendingImageElementId: null });
}
this.onPointerUpEmitter.trigger(
this.state.activeTool,
pointerDownState,
childEvent,
);
if (draggingElement?.type === "freedraw") {
const pointerCoords = viewportCoordsToSceneCoords(
childEvent,
@@ -7453,7 +7298,7 @@ class App extends React.Component<AppProps, AppState> {
this.scene.addNewElement(imageElement);
try {
return await this.initializeImage({
await this.initializeImage({
imageFile,
imageElement,
showCursorImagePreview,
@@ -7466,7 +7311,6 @@ class App extends React.Component<AppProps, AppState> {
this.setState({
errorMessage: error.message || t("errors.imageInsertError"),
});
return null;
}
};
@@ -7509,11 +7353,9 @@ class App extends React.Component<AppProps, AppState> {
}
};
private onImageAction = async ({
insertOnCanvasDirectly,
}: {
insertOnCanvasDirectly: boolean;
}) => {
private onImageAction = async (
{ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false },
) => {
try {
const clientX = this.state.width / 2 + this.state.offsetLeft;
const clientY = this.state.height / 2 + this.state.offsetTop;
-1
View File
@@ -55,7 +55,6 @@ export const TopPicks = ({
type="button"
title={color}
onClick={() => onChange(color)}
data-testid={`color-top-pick-${color}`}
>
<div className="color-picker__button-outline" />
</button>
+9 -5
View File
@@ -9,7 +9,11 @@ import {
} from "../actions/shortcuts";
import { Action } from "../actions/types";
import { ActionManager } from "../actions/manager";
import { useExcalidrawAppState, useExcalidrawElements } from "./App";
import {
useExcalidrawAppState,
useExcalidrawElements,
useExcalidrawSetAppState,
} from "./App";
import React from "react";
export type ContextMenuItem = typeof CONTEXT_MENU_SEPARATOR | Action;
@@ -21,14 +25,14 @@ type ContextMenuProps = {
items: ContextMenuItems;
top: number;
left: number;
onClose: (cb?: () => void) => void;
};
export const CONTEXT_MENU_SEPARATOR = "separator";
export const ContextMenu = React.memo(
({ actionManager, items, top, left, onClose }: ContextMenuProps) => {
({ actionManager, items, top, left }: ContextMenuProps) => {
const appState = useExcalidrawAppState();
const setAppState = useExcalidrawSetAppState();
const elements = useExcalidrawElements();
const filteredItems = items.reduce((acc: ContextMenuItem[], item) => {
@@ -50,7 +54,7 @@ export const ContextMenu = React.memo(
return (
<Popover
onCloseRequest={() => onClose()}
onCloseRequest={() => setAppState({ contextMenu: null })}
top={top}
left={left}
fitInViewport={true}
@@ -98,7 +102,7 @@ export const ContextMenu = React.memo(
// we need update state before executing the action in case
// the action uses the appState it's being passed (that still
// contains a defined contextMenu) to return the next state.
onClose(() => {
setAppState({ contextMenu: null }, () => {
actionManager.executeAction(item, "contextMenu");
});
}}
+3 -12
View File
@@ -23,15 +23,12 @@ export type ExportCB = (
const JSONExportModal = ({
elements,
appState,
setAppState,
files,
actionManager,
exportOpts,
canvas,
onCloseRequest,
}: {
appState: UIAppState;
setAppState: React.Component<any, UIAppState>["setState"];
files: BinaryFiles;
elements: readonly NonDeletedExcalidrawElement[];
actionManager: ActionManager;
@@ -75,14 +72,9 @@ const JSONExportModal = ({
title={t("exportDialog.link_button")}
aria-label={t("exportDialog.link_button")}
showAriaLabel={true}
onClick={async () => {
try {
trackEvent("export", "link", `ui (${getFrame()})`);
await onExportToBackend(elements, appState, files, canvas);
onCloseRequest();
} catch (error: any) {
setAppState({ errorMessage: error.message });
}
onClick={() => {
onExportToBackend(elements, appState, files, canvas);
trackEvent("export", "link", `ui (${getFrame()})`);
}}
/>
</Card>
@@ -122,7 +114,6 @@ export const JSONExportDialog = ({
<JSONExportModal
elements={elements}
appState={appState}
setAppState={setAppState}
files={files}
actionManager={actionManager}
onCloseRequest={handleClose}
+24 -2
View File
@@ -62,6 +62,7 @@ interface LayerUIProps {
appState: UIAppState;
files: BinaryFiles;
canvas: HTMLCanvasElement;
interactiveCanvas: HTMLCanvasElement | null;
setAppState: React.Component<any, AppState>["setState"];
elements: readonly NonDeletedExcalidrawElement[];
onLockToggle: () => void;
@@ -72,6 +73,7 @@ interface LayerUIProps {
renderTopRightUI?: ExcalidrawProps["renderTopRightUI"];
renderCustomStats?: ExcalidrawProps["renderCustomStats"];
UIOptions: AppProps["UIOptions"];
onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;
onExportImage: AppClassProperties["onExportImage"];
renderWelcomeScreen: boolean;
children?: React.ReactNode;
@@ -121,6 +123,7 @@ const LayerUI = ({
setAppState,
elements,
canvas,
interactiveCanvas,
onLockToggle,
onHandToolToggle,
onPenModeToggle,
@@ -128,6 +131,7 @@ const LayerUI = ({
renderTopRightUI,
renderCustomStats,
UIOptions,
onImageAction,
onExportImage,
renderWelcomeScreen,
children,
@@ -276,8 +280,14 @@ const LayerUI = ({
<ShapesSwitcher
appState={appState}
interactiveCanvas={interactiveCanvas}
activeTool={appState.activeTool}
app={app}
onImageAction={({ pointerType }) => {
onImageAction({
insertOnCanvasDirectly: pointerType !== "mouse",
});
}}
/>
</Stack.Row>
</Island>
@@ -462,6 +472,8 @@ const LayerUI = ({
onLockToggle={onLockToggle}
onHandToolToggle={onHandToolToggle}
onPenModeToggle={onPenModeToggle}
interactiveCanvas={interactiveCanvas}
onImageAction={onImageAction}
renderTopRightUI={renderTopRightUI}
renderCustomStats={renderCustomStats}
renderSidebars={renderSidebars}
@@ -548,8 +560,18 @@ const areEqual = (prevProps: LayerUIProps, nextProps: LayerUIProps) => {
return false;
}
const { canvas: _pC, appState: prevAppState, ...prev } = prevProps;
const { canvas: _nC, appState: nextAppState, ...next } = nextProps;
const {
canvas: _pC,
interactiveCanvas: _pIC,
appState: prevAppState,
...prev
} = prevProps;
const {
canvas: _nC,
interactiveCanvas: _nIC,
appState: nextAppState,
...next
} = nextProps;
return (
isShallowEqual(
+10 -1
View File
@@ -36,7 +36,9 @@ type MobileMenuProps = {
onLockToggle: () => void;
onHandToolToggle: () => void;
onPenModeToggle: () => void;
interactiveCanvas: HTMLCanvasElement | null;
onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;
renderTopRightUI?: (
isMobile: boolean,
appState: UIAppState,
@@ -56,7 +58,8 @@ export const MobileMenu = ({
onLockToggle,
onHandToolToggle,
onPenModeToggle,
interactiveCanvas,
onImageAction,
renderTopRightUI,
renderCustomStats,
renderSidebars,
@@ -82,8 +85,14 @@ export const MobileMenu = ({
<Stack.Row gap={1}>
<ShapesSwitcher
appState={appState}
interactiveCanvas={interactiveCanvas}
activeTool={appState.activeTool}
app={app}
onImageAction={({ pointerType }) => {
onImageAction({
insertOnCanvasDirectly: pointerType !== "mouse",
});
}}
/>
</Stack.Row>
</Island>
+5 -5
View File
@@ -83,12 +83,12 @@ export const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => {
}
};
useEffect(() => {
isMountedRef.current = true;
return () => {
useEffect(
() => () => {
isMountedRef.current = false;
};
}, []);
},
[],
);
const lastPointerTypeRef = useRef<PointerType | null>(null);
+3 -15
View File
@@ -296,18 +296,6 @@ export const ROUNDNESS = {
* collaboration */
export const PRECEDING_ELEMENT_KEY = "__precedingElement__";
export const ROUGHNESS = {
architect: 0,
artist: 1,
cartoonist: 2,
} as const;
export const STROKE_WIDTH = {
thin: 1,
bold: 2,
extraBold: 4,
} as const;
export const DEFAULT_ELEMENT_PROPS: {
strokeColor: ExcalidrawElement["strokeColor"];
backgroundColor: ExcalidrawElement["backgroundColor"];
@@ -320,10 +308,10 @@ export const DEFAULT_ELEMENT_PROPS: {
} = {
strokeColor: COLOR_PALETTE.black,
backgroundColor: COLOR_PALETTE.transparent,
fillStyle: "solid",
strokeWidth: 2,
fillStyle: "hachure",
strokeWidth: 1,
strokeStyle: "solid",
roughness: ROUGHNESS.artist,
roughness: 1,
opacity: 100,
locked: false,
};
-2
View File
@@ -99,7 +99,5 @@ export const setCursorForShape = (
interactiveCanvas.style.cursor = `url(${url}), auto`;
} else if (!["image", "custom"].includes(appState.activeTool.type)) {
interactiveCanvas.style.cursor = CURSOR_TYPE.CROSSHAIR;
} else {
interactiveCanvas.style.cursor = CURSOR_TYPE.AUTO;
}
};
File diff suppressed because it is too large Load Diff
+3 -31
View File
@@ -8,7 +8,7 @@ import { t } from "../i18n";
import { calculateScrollCenter } from "../scene";
import { AppState, DataURL, LibraryItem } from "../types";
import { ValueOf } from "../utility-types";
import { bytesToHexString, isPromiseLike } from "../utils";
import { bytesToHexString } from "../utils";
import { FileSystemHandle, nativeFileSystemSupported } from "./filesystem";
import { isValidExcalidrawData, isValidLibrary } from "./json";
import { restore, restoreLibraryItems } from "./restore";
@@ -207,13 +207,10 @@ export const loadLibraryFromBlob = async (
};
export const canvasToBlob = async (
canvas: HTMLCanvasElement | Promise<HTMLCanvasElement>,
canvas: HTMLCanvasElement,
): Promise<Blob> => {
return new Promise(async (resolve, reject) => {
return new Promise((resolve, reject) => {
try {
if (isPromiseLike(canvas)) {
canvas = await canvas;
}
canvas.toBlob((blob) => {
if (!blob) {
return reject(
@@ -327,31 +324,6 @@ export const SVGStringToFile = (SVGString: string, filename: string = "") => {
}) as File & { type: typeof MIME_TYPES.svg };
};
export const ImageURLToFile = async (
imageUrl: string,
filename: string = "",
): Promise<File | undefined> => {
let response;
try {
response = await fetch(imageUrl);
} catch (error: any) {
throw new Error(t("errors.failedToFetchImage"));
}
if (!response.ok) {
throw new Error(t("errors.failedToFetchImage"));
}
const blob = await response.blob();
if (blob.type && isSupportedImageFile(blob)) {
const name = filename || blob.name || "";
return new File([blob], name, { type: blob.type });
}
throw new Error(t("errors.unsupportedFileType"));
};
export const getFileFromEvent = async (
event: React.DragEvent<HTMLDivElement>,
) => {
+7 -1
View File
@@ -66,14 +66,17 @@ export const exportCanvas = async (
}
}
const tempCanvas = exportToCanvas(elements, appState, files, {
const tempCanvas = await exportToCanvas(elements, appState, files, {
exportBackground,
viewBackgroundColor,
exportPadding,
});
tempCanvas.style.display = "none";
document.body.appendChild(tempCanvas);
if (type === "png") {
let blob = await canvasToBlob(tempCanvas);
tempCanvas.remove();
if (appState.exportEmbedScene) {
blob = await (
await import(/* webpackChunkName: "image" */ "./image")
@@ -111,8 +114,11 @@ export const exportCanvas = async (
} else {
throw new Error(t("alerts.couldNotCopyToClipboard"));
}
} finally {
tempCanvas.remove();
}
} else {
tempCanvas.remove();
// shouldn't happen
throw new Error("Unsupported export type");
}
+8 -8
View File
@@ -34,13 +34,13 @@ import {
import { getDefaultAppState } from "../appState";
import { LinearElementEditor } from "../element/linearElementEditor";
import { bumpVersion } from "../element/mutateElement";
import { getFontString, getUpdatedTimestamp, updateActiveTool } from "../utils";
import { getUpdatedTimestamp, updateActiveTool } from "../utils";
import { arrayToMap } from "../utils";
import { MarkOptional, Mutable } from "../utility-types";
import {
detectLineHeight,
getDefaultLineHeight,
measureBaseline,
measureTextElement,
} from "../element/textElement";
import { normalizeLink } from "./url";
@@ -93,7 +93,8 @@ const repairBinding = (binding: PointBinding | null) => {
};
const restoreElementWithProperties = <
T extends Required<Omit<ExcalidrawElement, "customData">> & {
T extends Required<Omit<ExcalidrawElement, "subtype" | "customData">> & {
subtype?: ExcalidrawElement["subtype"];
customData?: ExcalidrawElement["customData"];
/** @deprecated */
boundElementIds?: readonly ExcalidrawElement["id"][];
@@ -159,6 +160,9 @@ const restoreElementWithProperties = <
locked: element.locked ?? false,
};
if ("subtype" in element) {
base.subtype = element.subtype;
}
if ("customData" in element) {
base.customData = element.customData;
}
@@ -204,11 +208,7 @@ const restoreElement = (
: // no element height likely means programmatic use, so default
// to a fixed line height
getDefaultLineHeight(element.fontFamily));
const baseline = measureBaseline(
element.text,
getFontString(element),
lineHeight,
);
const baseline = measureTextElement(element, { text }).baseline;
element = restoreElementWithProperties(element, {
fontSize,
fontFamily,
+9 -44
View File
@@ -5,31 +5,7 @@ import {
} from "./transform";
import { ExcalidrawArrowElement } from "../element/types";
const opts = { regenerateIds: false };
describe("Test Transform", () => {
it("should generate id unless opts.regenerateIds is set to false explicitly", () => {
const elements = [
{
type: "rectangle",
x: 100,
y: 100,
id: "rect-1",
},
];
let data = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
);
expect(data.length).toBe(1);
expect(data[0].id).toBe("id0");
data = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(data[0].id).toBe("rect-1");
});
it("should transform regular shapes", () => {
const elements = [
{
@@ -83,7 +59,6 @@ describe("Test Transform", () => {
convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
).forEach((ele) => {
expect(ele).toMatchSnapshot({
seed: expect.any(Number),
@@ -112,7 +87,6 @@ describe("Test Transform", () => {
];
convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
).forEach((ele) => {
expect(ele).toMatchSnapshot({
seed: expect.any(Number),
@@ -154,7 +128,6 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(4);
@@ -237,7 +210,6 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(12);
@@ -295,7 +267,6 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(8);
@@ -329,7 +300,6 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(4);
@@ -351,7 +321,7 @@ describe("Test Transform", () => {
});
expect(text).toMatchObject({
x: 240,
x: 340,
y: 226.5,
type: "text",
text: "HELLO WORLD!!",
@@ -371,7 +341,7 @@ describe("Test Transform", () => {
});
expect(ellipse).toMatchObject({
x: 355,
x: 555,
y: 189,
type: "ellipse",
boundElements: [
@@ -413,10 +383,10 @@ describe("Test Transform", () => {
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(4);
const [arrow, text1, text2, text3] = excaldrawElements;
expect(arrow).toMatchObject({
@@ -436,7 +406,7 @@ describe("Test Transform", () => {
});
expect(text1).toMatchObject({
x: 240,
x: 340,
y: 226.5,
type: "text",
text: "HELLO WORLD!!",
@@ -456,7 +426,7 @@ describe("Test Transform", () => {
});
expect(text3).toMatchObject({
x: 355,
x: 555,
y: 226.5,
type: "text",
boundElements: [
@@ -529,7 +499,6 @@ describe("Test Transform", () => {
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(5);
@@ -578,7 +547,6 @@ describe("Test Transform", () => {
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(4);
@@ -632,18 +600,17 @@ describe("Test Transform", () => {
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(4);
const [, , arrow, text] = excaldrawElements;
const [, , arrow] = excaldrawElements;
expect(arrow).toMatchObject({
type: "arrow",
x: 255,
y: 239,
boundElements: [
{
id: text.id,
id: "id46",
type: "text",
},
],
@@ -683,18 +650,17 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(2);
const [arrow, rect] = excaldrawElements;
expect((arrow as ExcalidrawArrowElement).endBinding).toStrictEqual({
elementId: "rect-1",
focus: 0,
gap: 205,
gap: 5,
});
expect(rect.boundElements).toStrictEqual([
{
id: arrow.id,
id: "id47",
type: "arrow",
},
]);
@@ -726,7 +692,6 @@ describe("Test Transform", () => {
];
const excaldrawElements = convertToExcalidrawElements(
elements as ExcalidrawElementSkeleton[],
opts,
);
expect(excaldrawElements.length).toBe(1);
+5 -89
View File
@@ -39,8 +39,6 @@ import {
} from "../element/types";
import { MarkOptional } from "../utility-types";
import { assertNever, getFontString } from "../utils";
import { getSizeFromPoints } from "../points";
import { randomId } from "../random";
export type ValidLinearElement = {
type: "arrow" | "line";
@@ -161,7 +159,7 @@ export type ExcalidrawElementSkeleton =
} & Partial<ExcalidrawImageElement>);
const DEFAULT_LINEAR_ELEMENT_PROPS = {
width: 100,
width: 300,
height: 0,
};
@@ -359,48 +357,6 @@ const bindLinearElementToElement = (
);
}
}
// Update start/end points by 0.5 so bindings don't overlap with start/end bound element coordinates.
const endPointIndex = linearElement.points.length - 1;
const delta = 0.5;
const newPoints = JSON.parse(JSON.stringify(linearElement.points));
// left to right so shift the arrow towards right
if (
linearElement.points[endPointIndex][0] >
linearElement.points[endPointIndex - 1][0]
) {
newPoints[0][0] = delta;
newPoints[endPointIndex][0] -= delta;
}
// right to left so shift the arrow towards left
if (
linearElement.points[endPointIndex][0] <
linearElement.points[endPointIndex - 1][0]
) {
newPoints[0][0] = -delta;
newPoints[endPointIndex][0] += delta;
}
// top to bottom so shift the arrow towards top
if (
linearElement.points[endPointIndex][1] >
linearElement.points[endPointIndex - 1][1]
) {
newPoints[0][1] = delta;
newPoints[endPointIndex][1] -= delta;
}
// bottom to top so shift the arrow towards bottom
if (
linearElement.points[endPointIndex][1] <
linearElement.points[endPointIndex - 1][1]
) {
newPoints[0][1] = -delta;
newPoints[endPointIndex][1] += delta;
}
Object.assign(linearElement, { points: newPoints });
return {
linearElement,
startBoundElement,
@@ -428,28 +384,18 @@ class ElementStore {
}
export const convertToExcalidrawElements = (
elementsSkeleton: ExcalidrawElementSkeleton[] | null,
opts?: { regenerateIds: boolean },
elements: ExcalidrawElementSkeleton[] | null,
) => {
if (!elementsSkeleton) {
if (!elements) {
return [];
}
const elements: ExcalidrawElementSkeleton[] = JSON.parse(
JSON.stringify(elementsSkeleton),
);
const elementStore = new ElementStore();
const elementsWithIds = new Map<string, ExcalidrawElementSkeleton>();
const oldToNewElementIdMap = new Map<string, string>();
// Create individual elements
for (const element of elements) {
let excalidrawElement: ExcalidrawElement;
const originalId = element.id;
if (opts?.regenerateIds !== false) {
Object.assign(element, { id: randomId() });
}
switch (element.type) {
case "rectangle":
case "ellipse":
@@ -498,11 +444,6 @@ export const convertToExcalidrawElements = (
],
...element,
});
Object.assign(
excalidrawElement,
getSizeFromPoints(excalidrawElement.points),
);
break;
}
case "text": {
@@ -558,9 +499,6 @@ export const convertToExcalidrawElements = (
} else {
elementStore.add(excalidrawElement);
elementsWithIds.set(excalidrawElement.id, element);
if (originalId) {
oldToNewElementIdMap.set(originalId, excalidrawElement.id);
}
}
}
@@ -586,18 +524,6 @@ export const convertToExcalidrawElements = (
element.type === "arrow" ? element?.start : undefined;
const originalEnd =
element.type === "arrow" ? element?.end : undefined;
if (originalStart && originalStart.id) {
const newStartId = oldToNewElementIdMap.get(originalStart.id);
if (newStartId) {
Object.assign(originalStart, { id: newStartId });
}
}
if (originalEnd && originalEnd.id) {
const newEndId = oldToNewElementIdMap.get(originalEnd.id);
if (newEndId) {
Object.assign(originalEnd, { id: newEndId });
}
}
const { linearElement, startBoundElement, endBoundElement } =
bindLinearElementToElement(
container as ExcalidrawArrowElement,
@@ -613,23 +539,13 @@ export const convertToExcalidrawElements = (
} else {
switch (element.type) {
case "arrow": {
const { start, end } = element;
if (start && start.id) {
const newStartId = oldToNewElementIdMap.get(start.id);
Object.assign(start, { id: newStartId });
}
if (end && end.id) {
const newEndId = oldToNewElementIdMap.get(end.id);
Object.assign(end, { id: newEndId });
}
const { linearElement, startBoundElement, endBoundElement } =
bindLinearElementToElement(
excalidrawElement as ExcalidrawArrowElement,
start,
end,
element.start,
element.end,
elementStore,
);
elementStore.add(linearElement);
elementStore.add(startBoundElement);
elementStore.add(endBoundElement);
+1 -1
View File
@@ -392,7 +392,7 @@ export const getLinkHandleFromCoords = (
[x1, y1, x2, y2]: Bounds,
angle: number,
appState: Pick<UIAppState, "zoom">,
): Bounds => {
): [x: number, y: number, width: number, height: number] => {
const size = DEFAULT_LINK_SIZE;
const linkWidth = size / appState.zoom.value;
const linkHeight = size / appState.zoom.value;
+16 -16
View File
@@ -34,12 +34,7 @@ export type RectangleBox = {
type MaybeQuadraticSolution = [number | null, number | null] | false;
// x and y position of top left corner, x and y position of bottom right corner
export type Bounds = readonly [
minX: number,
minY: number,
maxX: number,
maxY: number,
];
export type Bounds = readonly [x1: number, y1: number, x2: number, y2: number];
export class ElementBounds {
private static boundsCache = new WeakMap<
@@ -68,7 +63,7 @@ export class ElementBounds {
}
private static calculateBounds(element: ExcalidrawElement): Bounds {
let bounds: Bounds;
let bounds: [number, number, number, number];
const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);
@@ -392,7 +387,7 @@ const getCubicBezierCurveBound = (
export const getMinMaxXYFromCurvePathOps = (
ops: Op[],
transformXY?: (x: number, y: number) => [number, number],
): Bounds => {
): [number, number, number, number] => {
let currentP: Point = [0, 0];
const { minX, minY, maxX, maxY } = ops.reduce(
@@ -440,9 +435,9 @@ export const getMinMaxXYFromCurvePathOps = (
return [minX, minY, maxX, maxY];
};
export const getBoundsFromPoints = (
const getBoundsFromPoints = (
points: ExcalidrawFreeDrawElement["points"],
): Bounds => {
): [number, number, number, number] => {
let minX = Infinity;
let minY = Infinity;
let maxX = -Infinity;
@@ -594,7 +589,7 @@ const getLinearElementRotatedBounds = (
element: ExcalidrawLinearElement,
cx: number,
cy: number,
): Bounds => {
): [number, number, number, number] => {
if (element.points.length < 2) {
const [pointX, pointY] = element.points[0];
const [x, y] = rotate(
@@ -605,7 +600,7 @@ const getLinearElementRotatedBounds = (
element.angle,
);
let coords: Bounds = [x, y, x, y];
let coords: [number, number, number, number] = [x, y, x, y];
const boundTextElement = getBoundTextElement(element);
if (boundTextElement) {
const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(
@@ -630,7 +625,12 @@ const getLinearElementRotatedBounds = (
const transformXY = (x: number, y: number) =>
rotate(element.x + x, element.y + y, cx, cy, element.angle);
const res = getMinMaxXYFromCurvePathOps(ops, transformXY);
let coords: Bounds = [res[0], res[1], res[2], res[3]];
let coords: [number, number, number, number] = [
res[0],
res[1],
res[2],
res[3],
];
const boundTextElement = getBoundTextElement(element);
if (boundTextElement) {
const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(
@@ -692,7 +692,7 @@ export const getResizedElementAbsoluteCoords = (
nextWidth: number,
nextHeight: number,
normalizePoints: boolean,
): Bounds => {
): [number, number, number, number] => {
if (!(isLinearElement(element) || isFreeDrawElement(element))) {
return [
element.x,
@@ -709,7 +709,7 @@ export const getResizedElementAbsoluteCoords = (
normalizePoints,
);
let bounds: Bounds;
let bounds: [number, number, number, number];
if (isFreeDrawElement(element)) {
// Free Draw
@@ -740,7 +740,7 @@ export const getResizedElementAbsoluteCoords = (
export const getElementPointsCoords = (
element: ExcalidrawLinearElement,
points: readonly (readonly [number, number])[],
): Bounds => {
): [number, number, number, number] => {
// This might be computationally heavey
const gen = rough.generator();
const curve =
+1 -3
View File
@@ -494,9 +494,7 @@ const hitTestFreeDrawElement = (
// for filled freedraw shapes, support
// selecting from inside
if (shape && shape.sets.length) {
return element.fillStyle === "solid"
? hitTestCurveInside(shape, x, y, "round")
: hitTestRoughShape(shape, x, y, threshold);
return hitTestRoughShape(shape, x, y, threshold);
}
return false;
+37 -51
View File
@@ -1,5 +1,5 @@
import { updateBoundElements } from "./binding";
import { Bounds, getCommonBounds } from "./bounds";
import { getCommonBounds } from "./bounds";
import { mutateElement } from "./mutateElement";
import { getPerfectElementSize } from "./sizeHelpers";
import { NonDeletedExcalidrawElement } from "./types";
@@ -8,11 +8,7 @@ import { getBoundTextElement } from "./textElement";
import { isSelectedViaGroup } from "../groups";
import { getGridPoint } from "../math";
import Scene from "../scene/Scene";
import {
isArrowElement,
isBoundToContainer,
isFrameElement,
} from "./typeChecks";
import { isFrameElement } from "./typeChecks";
export const dragSelectedElements = (
pointerDownState: PointerDownState,
@@ -39,41 +35,44 @@ export const dragSelectedElements = (
if (frames.length > 0) {
const elementsInFrames = scene
.getNonDeletedElements()
.filter((e) => !isBoundToContainer(e))
.filter((e) => e.frameId !== null)
.filter((e) => frames.includes(e.frameId!));
elementsInFrames.forEach((element) => elementsToUpdate.add(element));
}
const commonBounds = getCommonBounds(
Array.from(elementsToUpdate).map(
(el) => pointerDownState.originalElements.get(el.id) ?? el,
),
);
const adjustedOffset = calculateOffset(
commonBounds,
offset,
snapOffset,
gridSize,
);
elementsToUpdate.forEach((element) => {
updateElementCoords(pointerDownState, element, adjustedOffset);
updateElementCoords(
pointerDownState,
element,
offset,
snapOffset,
gridSize,
);
// update coords of bound text only if we're dragging the container directly
// (we don't drag the group that it's part of)
if (
// Don't update coords of arrow label since we calculate its position during render
!isArrowElement(element) &&
// container isn't part of any group
// (perf optim so we don't check `isSelectedViaGroup()` in every case)
(!element.groupIds.length ||
// container is part of a group, but we're dragging the container directly
(appState.editingGroupId && !isSelectedViaGroup(appState, element)))
!element.groupIds.length ||
// container is part of a group, but we're dragging the container directly
(appState.editingGroupId && !isSelectedViaGroup(appState, element))
) {
const textElement = getBoundTextElement(element);
if (textElement) {
updateElementCoords(pointerDownState, textElement, adjustedOffset);
if (
textElement &&
// when container is added to a frame, so will its bound text
// so the text is already in `elementsToUpdate` and we should avoid
// updating its coords again
(!textElement.frameId || !frames.includes(textElement.frameId))
) {
updateElementCoords(
pointerDownState,
textElement,
offset,
snapOffset,
gridSize,
);
}
}
updateBoundElements(element, {
@@ -82,20 +81,23 @@ export const dragSelectedElements = (
});
};
const calculateOffset = (
commonBounds: Bounds,
const updateElementCoords = (
pointerDownState: PointerDownState,
element: NonDeletedExcalidrawElement,
dragOffset: { x: number; y: number },
snapOffset: { x: number; y: number },
gridSize: AppState["gridSize"],
): { x: number; y: number } => {
const [x, y] = commonBounds;
let nextX = x + dragOffset.x + snapOffset.x;
let nextY = y + dragOffset.y + snapOffset.y;
) => {
const originalElement =
pointerDownState.originalElements.get(element.id) ?? element;
let nextX = originalElement.x + dragOffset.x + snapOffset.x;
let nextY = originalElement.y + dragOffset.y + snapOffset.y;
if (snapOffset.x === 0 || snapOffset.y === 0) {
const [nextGridX, nextGridY] = getGridPoint(
x + dragOffset.x,
y + dragOffset.y,
originalElement.x + dragOffset.x,
originalElement.y + dragOffset.y,
gridSize,
);
@@ -107,22 +109,6 @@ const calculateOffset = (
nextY = nextGridY;
}
}
return {
x: nextX - x,
y: nextY - y,
};
};
const updateElementCoords = (
pointerDownState: PointerDownState,
element: NonDeletedExcalidrawElement,
dragOffset: { x: number; y: number },
) => {
const originalElement =
pointerDownState.originalElements.get(element.id) ?? element;
const nextX = originalElement.x + dragOffset.x;
const nextY = originalElement.y + dragOffset.y;
mutateElement(element, {
x: nextX,
-9
View File
@@ -28,7 +28,6 @@ const embeddedLinkCache = new Map<string, EmbeddedLink>();
const RE_YOUTUBE =
/^(?:http(?:s)?:\/\/)?(?:www\.)?youtu(?:be\.com|\.be)\/(embed\/|watch\?v=|shorts\/|playlist\?list=|embed\/videoseries\?list=)?([a-zA-Z0-9_-]+)(?:\?t=|&t=|\?start=|&start=)?([a-zA-Z0-9_-]+)?[^\s]*$/;
const RE_VIMEO =
/^(?:http(?:s)?:\/\/)?(?:(?:w){3}.)?(?:player\.)?vimeo\.com\/(?:video\/)?([^?\s]+)(?:\?.*)?$/;
const RE_FIGMA = /^https:\/\/(?:www\.)?figma\.com/;
@@ -48,9 +47,6 @@ const RE_VALTOWN =
const RE_GENERIC_EMBED =
/^<(?:iframe|blockquote)[\s\S]*?\s(?:src|href)=["']([^"']*)["'][\s\S]*?>$/i;
const RE_GIPHY =
/giphy.com\/(?:clips|embed|gifs)\/[a-zA-Z0-9]*?-?([a-zA-Z0-9]+)(?:[^a-zA-Z0-9]|$)/;
const ALLOWED_DOMAINS = new Set([
"youtube.com",
"youtu.be",
@@ -63,7 +59,6 @@ const ALLOWED_DOMAINS = new Set([
"*.simplepdf.eu",
"stackblitz.com",
"val.town",
"giphy.com",
]);
const createSrcDoc = (body: string) => {
@@ -313,10 +308,6 @@ export const extractSrc = (htmlString: string): string => {
return gistMatch[1];
}
if (RE_GIPHY.test(htmlString)) {
return `https://giphy.com/embed/${RE_GIPHY.exec(htmlString)![1]}`;
}
const match = htmlString.match(RE_GENERIC_EMBED);
if (match && match.length === 2) {
return match[1];
+1 -2
View File
@@ -21,7 +21,6 @@ import {
} from "../math";
import { getElementAbsoluteCoords, getLockedLinearCursorAlignSize } from ".";
import {
Bounds,
getCurvePathOps,
getElementPointsCoords,
getMinMaxXYFromCurvePathOps,
@@ -1317,7 +1316,7 @@ export class LinearElementEditor {
static getMinMaxXYWithBoundText = (
element: ExcalidrawLinearElement,
elementBounds: Bounds,
elementBounds: [number, number, number, number],
boundTextElement: ExcalidrawTextElementWithContainer,
): [number, number, number, number, number, number] => {
let [x1, y1, x2, y2] = elementBounds;
+24 -3
View File
@@ -6,12 +6,21 @@ import { Point } from "../types";
import { getUpdatedTimestamp } from "../utils";
import { Mutable } from "../utility-types";
import { ShapeCache } from "../scene/ShapeCache";
import { getSubtypeMethods } from "./subtypes";
type ElementUpdate<TElement extends ExcalidrawElement> = Omit<
Partial<TElement>,
"id" | "version" | "versionNonce"
>;
const cleanUpdates = <TElement extends Mutable<ExcalidrawElement>>(
element: TElement,
updates: ElementUpdate<TElement>,
): ElementUpdate<TElement> => {
const map = getSubtypeMethods(element.subtype);
return map?.clean ? (map.clean(updates) as typeof updates) : updates;
};
// This function tracks updates of text elements for the purposes for collaboration.
// The version is used to compare updates when more than one user is working in
// the same drawing. Note: this will trigger the component to update. Make sure you
@@ -22,6 +31,8 @@ export const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(
informMutation = true,
): TElement => {
let didChange = false;
let increment = false;
const oldUpdates = cleanUpdates(element, updates);
// casting to any because can't use `in` operator
// (see https://github.com/microsoft/TypeScript/issues/21732)
@@ -70,6 +81,7 @@ export const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(
}
}
if (!didChangePoints) {
key in oldUpdates && (increment = true);
continue;
}
}
@@ -77,6 +89,7 @@ export const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(
(element as any)[key] = value;
didChange = true;
key in oldUpdates && (increment = true);
}
}
if (!didChange) {
@@ -92,9 +105,11 @@ export const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(
ShapeCache.delete(element);
}
element.version++;
element.versionNonce = randomInteger();
element.updated = getUpdatedTimestamp();
if (increment) {
element.version++;
element.versionNonce = randomInteger();
element.updated = getUpdatedTimestamp();
}
if (informMutation) {
Scene.getScene(element)?.informMutation();
@@ -108,6 +123,8 @@ export const newElementWith = <TElement extends ExcalidrawElement>(
updates: ElementUpdate<TElement>,
): TElement => {
let didChange = false;
let increment = false;
const oldUpdates = cleanUpdates(element, updates);
for (const key in updates) {
const value = (updates as any)[key];
if (typeof value !== "undefined") {
@@ -119,6 +136,7 @@ export const newElementWith = <TElement extends ExcalidrawElement>(
continue;
}
didChange = true;
key in oldUpdates && (increment = true);
}
}
@@ -126,6 +144,9 @@ export const newElementWith = <TElement extends ExcalidrawElement>(
return element;
}
if (!increment) {
return { ...element, ...updates };
}
return {
...element,
...updates,
+39 -24
View File
@@ -15,12 +15,7 @@ import {
ExcalidrawFrameElement,
ExcalidrawEmbeddableElement,
} from "../element/types";
import {
arrayToMap,
getFontString,
getUpdatedTimestamp,
isTestEnv,
} from "../utils";
import { arrayToMap, getUpdatedTimestamp, isTestEnv } from "../utils";
import { randomInteger, randomId } from "../random";
import { bumpVersion, newElementWith } from "./mutateElement";
import { getNewGroupIdsForDuplication } from "../groups";
@@ -30,9 +25,9 @@ import { adjustXYWithRotation } from "../math";
import { getResizedElementAbsoluteCoords } from "./bounds";
import {
getContainerElement,
measureText,
measureTextElement,
normalizeText,
wrapText,
wrapTextElement,
getBoundTextMaxWidth,
getDefaultLineHeight,
} from "./textElement";
@@ -45,6 +40,21 @@ import {
VERTICAL_ALIGN,
} from "../constants";
import { MarkOptional, Merge, Mutable } from "../utility-types";
import { getSubtypeMethods } from "./subtypes";
export const maybeGetSubtypeProps = (obj: {
subtype?: ExcalidrawElement["subtype"];
customData?: ExcalidrawElement["customData"];
}) => {
const data: typeof obj = {};
if ("subtype" in obj && obj.subtype !== undefined) {
data.subtype = obj.subtype;
}
if ("customData" in obj && obj.customData !== undefined) {
data.customData = obj.customData;
}
return data as typeof obj;
};
export type ElementConstructorOpts = MarkOptional<
Omit<ExcalidrawGenericElement, "id" | "type" | "isDeleted" | "updated">,
@@ -58,6 +68,8 @@ export type ElementConstructorOpts = MarkOptional<
| "version"
| "versionNonce"
| "link"
| "subtype"
| "customData"
| "strokeStyle"
| "fillStyle"
| "strokeColor"
@@ -93,8 +105,10 @@ const _newElementBase = <T extends ExcalidrawElement>(
...rest
}: ElementConstructorOpts & Omit<Partial<ExcalidrawGenericElement>, "type">,
) => {
const { subtype, customData } = rest;
// assign type to guard against excess properties
const element: Merge<ExcalidrawGenericElement, { type: T["type"] }> = {
...maybeGetSubtypeProps({ subtype, customData }),
id: rest.id || randomId(),
type,
x,
@@ -128,8 +142,11 @@ export const newElement = (
opts: {
type: ExcalidrawGenericElement["type"];
} & ElementConstructorOpts,
): NonDeleted<ExcalidrawGenericElement> =>
_newElementBase<ExcalidrawGenericElement>(opts.type, opts);
): NonDeleted<ExcalidrawGenericElement> => {
const map = getSubtypeMethods(opts?.subtype);
map?.clean && map.clean(opts);
return _newElementBase<ExcalidrawGenericElement>(opts.type, opts);
};
export const newEmbeddableElement = (
opts: {
@@ -196,10 +213,12 @@ export const newTextElement = (
const fontSize = opts.fontSize || DEFAULT_FONT_SIZE;
const lineHeight = opts.lineHeight || getDefaultLineHeight(fontFamily);
const text = normalizeText(opts.text);
const metrics = measureText(
text,
getFontString({ fontFamily, fontSize }),
lineHeight,
const metrics = measureTextElement(
{ ...opts, fontSize, fontFamily, lineHeight },
{
text,
customData: opts.customData,
},
);
const textAlign = opts.textAlign || DEFAULT_TEXT_ALIGN;
const verticalAlign = opts.verticalAlign || DEFAULT_VERTICAL_ALIGN;
@@ -244,7 +263,9 @@ const getAdjustedDimensions = (
width: nextWidth,
height: nextHeight,
baseline: nextBaseline,
} = measureText(nextText, getFontString(element), element.lineHeight);
} = measureTextElement(element, {
text: nextText,
});
const { textAlign, verticalAlign } = element;
let x: number;
let y: number;
@@ -253,11 +274,7 @@ const getAdjustedDimensions = (
verticalAlign === VERTICAL_ALIGN.MIDDLE &&
!element.containerId
) {
const prevMetrics = measureText(
element.text,
getFontString(element),
element.lineHeight,
);
const prevMetrics = measureTextElement(element);
const offsets = getTextElementPositionOffsets(element, {
width: nextWidth - prevMetrics.width,
height: nextHeight - prevMetrics.height,
@@ -313,11 +330,9 @@ export const refreshTextDimensions = (
}
const container = getContainerElement(textElement);
if (container) {
text = wrapText(
text = wrapTextElement(textElement, getBoundTextMaxWidth(container), {
text,
getFontString(textElement),
getBoundTextMaxWidth(container),
);
});
}
const dimensions = getAdjustedDimensions(textElement, text);
return { text, ...dimensions };
+2 -6
View File
@@ -51,7 +51,7 @@ import {
handleBindTextResize,
getBoundTextMaxWidth,
getApproxMinLineHeight,
measureText,
measureTextElement,
getBoundTextMaxHeight,
} from "./textElement";
import { LinearElementEditor } from "./linearElementEditor";
@@ -224,11 +224,7 @@ const measureFontSizeFromWidth = (
if (nextFontSize < MIN_FONT_SIZE) {
return null;
}
const metrics = measureText(
element.text,
getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }),
element.lineHeight,
);
const metrics = measureTextElement(element, { fontSize: nextFontSize });
return {
size: nextFontSize,
baseline: metrics.baseline + (nextHeight - metrics.height),
+1 -2
View File
@@ -13,7 +13,6 @@ import {
MaybeTransformHandleType,
} from "./transformHandles";
import { AppState, Zoom } from "../types";
import { Bounds } from "./bounds";
const isInsideTransformHandle = (
transformHandle: TransformHandle,
@@ -88,7 +87,7 @@ export const getElementWithTransformHandleType = (
};
export const getTransformHandleTypeFromCoords = (
[x1, y1, x2, y2]: Bounds,
[x1, y1, x2, y2]: readonly [number, number, number, number],
scenePointerX: number,
scenePointerY: number,
zoom: Zoom,
+222
View File
@@ -0,0 +1,222 @@
import { ExcalidrawElement, ExcalidrawTextElement, NonDeleted } from "../types";
import { getNonDeletedElements } from "../";
import { isTextElement } from "../typeChecks";
import { getContainerElement, redrawTextBoundingBox } from "../textElement";
import { ShapeCache } from "../../scene/ShapeCache";
import Scene from "../../scene/Scene";
// Use "let" instead of "const" so we can dynamically add subtypes
let subtypeNames: readonly Subtype[] = [];
let parentTypeMap: readonly {
subtype: Subtype;
parentType: ExcalidrawElement["type"];
}[] = [];
export type SubtypeRecord = Readonly<{
subtype: Subtype;
parents: readonly ExcalidrawElement["type"][];
}>;
// Subtype Names
export type Subtype = Required<ExcalidrawElement>["subtype"];
export const getSubtypeNames = (): readonly Subtype[] => {
return subtypeNames;
};
// Subtype Methods
export type SubtypeMethods = {
clean: (
updates: Omit<
Partial<ExcalidrawElement>,
"id" | "version" | "versionNonce"
>,
) => Omit<Partial<ExcalidrawElement>, "id" | "version" | "versionNonce">;
ensureLoaded: (callback?: () => void) => Promise<void>;
getEditorStyle: (element: ExcalidrawTextElement) => Record<string, any>;
measureText: (
element: Pick<
ExcalidrawTextElement,
| "subtype"
| "customData"
| "fontSize"
| "fontFamily"
| "text"
| "lineHeight"
>,
next?: {
fontSize?: number;
text?: string;
customData?: ExcalidrawElement["customData"];
},
) => { width: number; height: number; baseline: number };
render: (
element: NonDeleted<ExcalidrawElement>,
context: CanvasRenderingContext2D,
) => void;
renderSvg: (
svgRoot: SVGElement,
root: SVGElement,
element: NonDeleted<ExcalidrawElement>,
opt?: { offsetX?: number; offsetY?: number },
) => void;
wrapText: (
element: Pick<
ExcalidrawTextElement,
| "subtype"
| "customData"
| "fontSize"
| "fontFamily"
| "originalText"
| "lineHeight"
>,
containerWidth: number,
next?: {
fontSize?: number;
text?: string;
customData?: ExcalidrawElement["customData"];
},
) => string;
};
type MethodMap = { subtype: Subtype; methods: Partial<SubtypeMethods> };
const methodMaps = [] as Array<MethodMap>;
// Use `getSubtypeMethods` to call subtype-specialized methods, like `render`.
export const getSubtypeMethods = (
subtype: Subtype | undefined,
): Partial<SubtypeMethods> | undefined => {
const map = methodMaps.find((method) => method.subtype === subtype);
return map?.methods;
};
export const addSubtypeMethods = (
subtype: Subtype,
methods: Partial<SubtypeMethods>,
) => {
if (!subtypeNames.includes(subtype)) {
return;
}
if (!methodMaps.find((method) => method.subtype === subtype)) {
methodMaps.push({ subtype, methods });
}
};
// Callback to re-render subtyped `ExcalidrawElement`s after completing
// async loading of the subtype.
export type SubtypeLoadedCb = (hasSubtype: SubtypeCheckFn) => void;
export type SubtypeCheckFn = (element: ExcalidrawElement) => boolean;
// Functions to prepare subtypes for use
export type SubtypePrepFn = (onSubtypeLoaded?: SubtypeLoadedCb) => {
methods: Partial<SubtypeMethods>;
};
// This is the main method to set up the subtype. The optional
// `onSubtypeLoaded` callback may be used to re-render subtyped
// `ExcalidrawElement`s after the subtype has finished async loading.
export const prepareSubtype = (
record: SubtypeRecord,
subtypePrepFn: SubtypePrepFn,
onSubtypeLoaded?: SubtypeLoadedCb,
): { methods: Partial<SubtypeMethods> } => {
const map = getSubtypeMethods(record.subtype);
if (map) {
return { methods: map };
}
// Check for undefined/null subtypes and parentTypes
if (
record.subtype === undefined ||
record.subtype === "" ||
record.parents === undefined ||
record.parents.length === 0
) {
return { methods: {} };
}
// Register the types
const subtype = record.subtype;
subtypeNames = [...subtypeNames, subtype];
record.parents.forEach((parentType) => {
parentTypeMap = [...parentTypeMap, { subtype, parentType }];
});
// Prepare the subtype
const { methods } = subtypePrepFn(onSubtypeLoaded);
// Register the subtype's methods
addSubtypeMethods(record.subtype, methods);
return { methods };
};
// Ensure all subtypes are loaded before continuing, eg to
// redraw text element bounding boxes correctly.
export const ensureSubtypesLoadedForElements = async (
elements: readonly ExcalidrawElement[],
callback?: () => void,
) => {
// Only ensure the loading of subtypes which are actually needed.
// We don't want to be held up by eg downloading the MathJax SVG fonts
// if we don't actually need them yet.
const subtypesUsed = [] as Subtype[];
elements.forEach((el) => {
if (
"subtype" in el &&
el.subtype !== undefined &&
!subtypesUsed.includes(el.subtype)
) {
subtypesUsed.push(el.subtype);
}
});
await ensureSubtypesLoaded(subtypesUsed, callback);
};
export const ensureSubtypesLoaded = async (
subtypes: Subtype[],
callback?: () => void,
) => {
// Use a for loop so we can do `await map.ensureLoaded()`
for (let i = 0; i < subtypes.length; i++) {
const subtype = subtypes[i];
// Should be defined if prepareSubtype() has run
const map = getSubtypeMethods(subtype);
if (map?.ensureLoaded) {
await map.ensureLoaded();
}
}
if (callback) {
callback();
}
};
// Call this method after finishing any async loading for
// subtypes of ExcalidrawElement if the newly loaded code
// would change the rendering.
export const checkRefreshOnSubtypeLoad = (
hasSubtype: SubtypeCheckFn,
elements: readonly ExcalidrawElement[],
) => {
let refreshNeeded = false;
const scenes: Scene[] = [];
getNonDeletedElements(elements).forEach((element) => {
// If the element is of the subtype that was just
// registered, update the element's dimensions, mark the
// element for a re-render, and indicate the scene needs a refresh.
if (hasSubtype(element)) {
ShapeCache.delete(element);
if (isTextElement(element)) {
redrawTextBoundingBox(element, getContainerElement(element));
}
refreshNeeded = true;
const scene = Scene.getScene(element);
if (scene && !scenes.includes(scene)) {
// Store in case we have multiple scenes
scenes.push(scene);
}
}
});
// Only inform each scene once
scenes.forEach((scene) => scene.informMutation());
return refreshNeeded;
};
+39 -20
View File
@@ -1,3 +1,4 @@
import { getSubtypeMethods, SubtypeMethods } from "./subtypes";
import { getFontString, arrayToMap, isTestEnv } from "../utils";
import {
ExcalidrawElement,
@@ -36,6 +37,30 @@ import {
} from "./textWysiwyg";
import { ExtractSetType } from "../utility-types";
export const measureTextElement = function (element, next) {
const map = getSubtypeMethods(element.subtype);
if (map?.measureText) {
return map.measureText(element, next);
}
const fontSize = next?.fontSize ?? element.fontSize;
const font = getFontString({ fontSize, fontFamily: element.fontFamily });
const text = next?.text ?? element.text;
return measureText(text, font, element.lineHeight);
} as SubtypeMethods["measureText"];
export const wrapTextElement = function (element, containerWidth, next) {
const map = getSubtypeMethods(element.subtype);
if (map?.wrapText) {
return map.wrapText(element, containerWidth, next);
}
const fontSize = next?.fontSize ?? element.fontSize;
const font = getFontString({ fontSize, fontFamily: element.fontFamily });
const text = next?.text ?? element.originalText;
return wrapText(text, font, containerWidth);
} as SubtypeMethods["wrapText"];
export const normalizeText = (text: string) => {
return (
text
@@ -68,22 +93,24 @@ export const redrawTextBoundingBox = (
if (container) {
maxWidth = getBoundTextMaxWidth(container, textElement);
boundTextUpdates.text = wrapText(
textElement.originalText,
getFontString(textElement),
maxWidth,
);
boundTextUpdates.text = wrapTextElement(textElement, maxWidth);
}
const metrics = measureText(
boundTextUpdates.text,
getFontString(textElement),
textElement.lineHeight,
);
const metrics = measureTextElement(textElement, {
text: boundTextUpdates.text,
});
boundTextUpdates.width = metrics.width;
boundTextUpdates.height = metrics.height;
boundTextUpdates.baseline = metrics.baseline;
// Maintain coordX for non left-aligned text in case the width has changed
if (!container) {
if (textElement.textAlign === TEXT_ALIGN.RIGHT) {
boundTextUpdates.x += textElement.width - metrics.width;
} else if (textElement.textAlign === TEXT_ALIGN.CENTER) {
boundTextUpdates.x += textElement.width / 2 - metrics.width / 2;
}
}
if (container) {
const maxContainerHeight = getBoundTextMaxHeight(
container,
@@ -196,17 +223,9 @@ export const handleBindTextResize = (
(transformHandleType !== "n" && transformHandleType !== "s")
) {
if (text) {
text = wrapText(
textElement.originalText,
getFontString(textElement),
maxWidth,
);
text = wrapTextElement(textElement, maxWidth);
}
const metrics = measureText(
text,
getFontString(textElement),
textElement.lineHeight,
);
const metrics = measureTextElement(textElement, { text });
nextHeight = metrics.height;
nextWidth = metrics.width;
nextBaseLine = metrics.baseline;
+47 -42
View File
@@ -18,7 +18,6 @@ import {
import { API } from "../tests/helpers/api";
import { mutateElement } from "./mutateElement";
import { getOriginalContainerHeightFromCache } from "./textWysiwyg";
import { getTextEditor } from "../tests/queries/dom";
// Unmount ReactDOM from root
ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
@@ -26,6 +25,12 @@ ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
const tab = " ";
const mouse = new Pointer("mouse");
const getTextEditor = () => {
return document.querySelector(
".excalidraw-textEditorContainer > textarea",
) as HTMLTextAreaElement;
};
const updateTextEditor = (editor: HTMLTextAreaElement, value: string) => {
fireEvent.change(editor, { target: { value } });
editor.dispatchEvent(new Event("input"));
@@ -180,7 +185,7 @@ describe("textWysiwyg", () => {
expect(h.state.editingElement?.id).toBe(boundText.id);
});
it("should edit text under cursor when clicked with text tool", async () => {
it("should edit text under cursor when clicked with text tool", () => {
const text = API.createElement({
type: "text",
text: "ola",
@@ -195,14 +200,14 @@ describe("textWysiwyg", () => {
mouse.clickAt(text.x + 50, text.y + 50);
const editor = await getTextEditor(false);
const editor = getTextEditor();
expect(editor).not.toBe(null);
expect(h.state.editingElement?.id).toBe(text.id);
expect(h.elements.length).toBe(1);
});
it("should edit text under cursor when double-clicked with selection tool", async () => {
it("should edit text under cursor when double-clicked with selection tool", () => {
const text = API.createElement({
type: "text",
text: "ola",
@@ -217,7 +222,7 @@ describe("textWysiwyg", () => {
mouse.doubleClickAt(text.x + 50, text.y + 50);
const editor = await getTextEditor(false);
const editor = getTextEditor();
expect(editor).not.toBe(null);
expect(h.state.editingElement?.id).toBe(text.id);
@@ -244,7 +249,7 @@ describe("textWysiwyg", () => {
textElement = UI.createElement("text");
mouse.clickOn(textElement);
textarea = await getTextEditor(true);
textarea = getTextEditor();
});
afterAll(() => {
@@ -454,7 +459,7 @@ describe("textWysiwyg", () => {
UI.clickTool("text");
mouse.clickAt(750, 300);
textarea = await getTextEditor(true);
textarea = getTextEditor();
updateTextEditor(
textarea,
"Excalidraw is an opensource virtual collaborative whiteboard for sketching hand-drawn like diagrams!",
@@ -506,7 +511,7 @@ describe("textWysiwyg", () => {
{ id: text.id, type: "text" },
]);
mouse.down();
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
@@ -534,7 +539,7 @@ describe("textWysiwyg", () => {
]);
expect(text.angle).toBe(rectangle.angle);
mouse.down();
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
@@ -561,7 +566,7 @@ describe("textWysiwyg", () => {
API.setSelectedElements([diamond]);
Keyboard.keyPress(KEYS.ENTER);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
const value = new Array(1000).fill("1").join("\n");
@@ -596,7 +601,7 @@ describe("textWysiwyg", () => {
expect(text.type).toBe("text");
expect(text.containerId).toBe(null);
mouse.down();
let editor = await getTextEditor(true);
let editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
editor.blur();
@@ -611,7 +616,7 @@ describe("textWysiwyg", () => {
expect(text.containerId).toBe(rectangle.id);
mouse.down();
editor = await getTextEditor(true);
editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
await new Promise((r) => setTimeout(r, 0));
@@ -633,7 +638,7 @@ describe("textWysiwyg", () => {
const text = h.elements[1] as ExcalidrawTextElementWithContainer;
expect(text.type).toBe("text");
expect(text.containerId).toBe(rectangle.id);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
@@ -668,7 +673,7 @@ describe("textWysiwyg", () => {
{ id: text.id, type: "text" },
]);
mouse.down();
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
await new Promise((r) => setTimeout(r, 0));
@@ -693,7 +698,7 @@ describe("textWysiwyg", () => {
freedraw.y + freedraw.height / 2,
);
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
fireEvent.keyDown(editor, { key: KEYS.ESCAPE });
@@ -727,7 +732,7 @@ describe("textWysiwyg", () => {
expect(text.type).toBe("text");
expect(text.containerId).toBe(null);
mouse.down();
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
@@ -742,7 +747,7 @@ describe("textWysiwyg", () => {
UI.clickTool("text");
mouse.clickAt(20, 30);
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(
editor,
@@ -787,7 +792,7 @@ describe("textWysiwyg", () => {
mouse.down();
const text = h.elements[1] as ExcalidrawTextElementWithContainer;
let editor = await getTextEditor(true);
let editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello World!");
@@ -800,7 +805,7 @@ describe("textWysiwyg", () => {
rectangle.y + rectangle.height / 2,
);
mouse.down();
editor = await getTextEditor(true);
editor = getTextEditor();
editor.select();
fireEvent.click(screen.getByTitle(/code/i));
@@ -833,7 +838,7 @@ describe("textWysiwyg", () => {
Keyboard.keyDown(KEYS.ENTER);
let text = h.elements[1] as ExcalidrawTextElementWithContainer;
let editor = await getTextEditor(true);
let editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
@@ -854,7 +859,7 @@ describe("textWysiwyg", () => {
mouse.select(rectangle);
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
updateTextEditor(editor, "Hello");
await new Promise((r) => setTimeout(r, 0));
@@ -883,7 +888,7 @@ describe("textWysiwyg", () => {
const text = h.elements[1] as ExcalidrawTextElementWithContainer;
expect(text.containerId).toBe(rectangle.id);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
@@ -920,7 +925,7 @@ describe("textWysiwyg", () => {
// Bind first text
const text = h.elements[1] as ExcalidrawTextElementWithContainer;
expect(text.containerId).toBe(rectangle.id);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello World!");
editor.blur();
@@ -941,7 +946,7 @@ describe("textWysiwyg", () => {
it("should respect text alignment when resizing", async () => {
Keyboard.keyPress(KEYS.ENTER);
let editor = await getTextEditor(true);
let editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello");
editor.blur();
@@ -958,7 +963,7 @@ describe("textWysiwyg", () => {
mouse.select(rectangle);
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
editor.select();
@@ -981,7 +986,7 @@ describe("textWysiwyg", () => {
mouse.select(rectangle);
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
editor.select();
@@ -1019,7 +1024,7 @@ describe("textWysiwyg", () => {
expect(text.type).toBe("text");
expect(text.containerId).toBe(rectangle.id);
mouse.down();
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
@@ -1034,7 +1039,7 @@ describe("textWysiwyg", () => {
it("should scale font size correctly when resizing using shift", async () => {
Keyboard.keyPress(KEYS.ENTER);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello");
editor.blur();
@@ -1054,7 +1059,7 @@ describe("textWysiwyg", () => {
it("should bind text correctly when container duplicated with alt-drag", async () => {
Keyboard.keyPress(KEYS.ENTER);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello");
editor.blur();
@@ -1086,7 +1091,7 @@ describe("textWysiwyg", () => {
it("undo should work", async () => {
Keyboard.keyPress(KEYS.ENTER);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello");
editor.blur();
@@ -1123,7 +1128,7 @@ describe("textWysiwyg", () => {
it("should not allow bound text with only whitespaces", async () => {
Keyboard.keyPress(KEYS.ENTER);
const editor = await getTextEditor(true);
const editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, " ");
@@ -1178,7 +1183,7 @@ describe("textWysiwyg", () => {
it("should reset the container height cache when resizing", async () => {
Keyboard.keyPress(KEYS.ENTER);
expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75);
let editor = await getTextEditor(true);
let editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello");
editor.blur();
@@ -1190,7 +1195,7 @@ describe("textWysiwyg", () => {
mouse.select(rectangle);
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
editor.blur();
@@ -1206,7 +1211,7 @@ describe("textWysiwyg", () => {
Keyboard.keyPress(KEYS.ENTER);
expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75);
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
editor.blur();
@@ -1231,7 +1236,7 @@ describe("textWysiwyg", () => {
Keyboard.keyPress(KEYS.ENTER);
expect(getOriginalContainerHeightFromCache(rectangle.id)).toBe(75);
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(editor, "Hello World!");
editor.blur();
expect(
@@ -1263,12 +1268,12 @@ describe("textWysiwyg", () => {
beforeEach(async () => {
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
updateTextEditor(editor, "Hello");
editor.blur();
mouse.select(rectangle);
Keyboard.keyPress(KEYS.ENTER);
editor = await getTextEditor(true);
editor = getTextEditor();
editor.select();
});
@@ -1379,7 +1384,7 @@ describe("textWysiwyg", () => {
it("should wrap text in a container when wrap text in container triggered from context menu", async () => {
UI.clickTool("text");
mouse.clickAt(20, 30);
const editor = await getTextEditor(true);
const editor = getTextEditor();
updateTextEditor(
editor,
@@ -1425,7 +1430,7 @@ describe("textWysiwyg", () => {
type: "text",
},
],
fillStyle: "solid",
fillStyle: "hachure",
groupIds: [],
height: 35,
isDeleted: false,
@@ -1438,7 +1443,7 @@ describe("textWysiwyg", () => {
},
strokeColor: "#1e1e1e",
strokeStyle: "solid",
strokeWidth: 2,
strokeWidth: 1,
type: "rectangle",
updated: 1,
version: 1,
@@ -1467,7 +1472,7 @@ describe("textWysiwyg", () => {
// Bind first text
let text = h.elements[1] as ExcalidrawTextElementWithContainer;
expect(text.containerId).toBe(rectangle.id);
let editor = await getTextEditor(true);
let editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Hello!");
expect(
@@ -1492,7 +1497,7 @@ describe("textWysiwyg", () => {
rectangle.x + rectangle.width / 2,
rectangle.y + rectangle.height / 2,
);
editor = await getTextEditor(true);
editor = getTextEditor();
await new Promise((r) => setTimeout(r, 0));
updateTextEditor(editor, "Excalidraw");
editor.blur();
+57 -7
View File
@@ -26,6 +26,7 @@ import {
getContainerElement,
getTextElementAngle,
getTextWidth,
measureText,
normalizeText,
redrawTextBoundingBox,
wrapText,
@@ -43,8 +44,10 @@ import { actionZoomIn, actionZoomOut } from "../actions/actionCanvas";
import App from "../components/App";
import { LinearElementEditor } from "./linearElementEditor";
import { parseClipboard } from "../clipboard";
import { SubtypeMethods, getSubtypeMethods } from "./subtypes";
const getTransform = (
offsetX: number,
width: number,
height: number,
angle: number,
@@ -62,7 +65,8 @@ const getTransform = (
if (height > maxHeight && zoom.value !== 1) {
translateY = (maxHeight * (zoom.value - 1)) / 2;
}
return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;
const offset = offsetX !== 0 ? ` translate(${offsetX}px, 0px)` : "";
return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)${offset}`;
};
const originalContainerCache: {
@@ -97,6 +101,14 @@ export const getOriginalContainerHeightFromCache = (
return originalContainerCache[id]?.height ?? null;
};
const getEditorStyle = function (element) {
const map = getSubtypeMethods(element.subtype);
if (map?.getEditorStyle) {
return map.getEditorStyle(element);
}
return {};
} as SubtypeMethods["getEditorStyle"];
export const textWysiwyg = ({
id,
onChange,
@@ -156,11 +168,24 @@ export const textWysiwyg = ({
const container = getContainerElement(updatedTextElement);
let maxWidth = updatedTextElement.width;
let maxHeight = updatedTextElement.height;
let textElementWidth = updatedTextElement.width;
// Editing metrics
const eMetrics = measureText(
container && updatedTextElement.containerId
? wrapText(
updatedTextElement.originalText,
getFontString(updatedTextElement),
getBoundTextMaxWidth(container),
)
: updatedTextElement.originalText,
getFontString(updatedTextElement),
updatedTextElement.lineHeight,
);
let maxHeight = eMetrics.height;
let textElementWidth = Math.max(updatedTextElement.width, eMetrics.width);
// Set to element height by default since that's
// what is going to be used for unbounded text
const textElementHeight = updatedTextElement.height;
const textElementHeight = Math.max(updatedTextElement.height, maxHeight);
if (container && updatedTextElement.containerId) {
if (isArrowElement(container)) {
@@ -246,13 +271,35 @@ export const textWysiwyg = ({
editable.selectionEnd = editable.value.length - diff;
}
let transformWidth = updatedTextElement.width;
if (!container) {
maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;
textElementWidth = Math.min(textElementWidth, maxWidth);
} else {
textElementWidth += 0.5;
transformWidth += 0.5;
}
// Horizontal offset in case updatedTextElement has a non-WYSIWYG subtype
const offWidth = container
? Math.min(
0,
updatedTextElement.width - Math.min(maxWidth, eMetrics.width),
)
: Math.min(maxWidth, updatedTextElement.width) -
Math.min(maxWidth, eMetrics.width);
const offsetX =
textAlign === "right"
? offWidth
: textAlign === "center"
? offWidth / 2
: 0;
const { width: w, height: h } = updatedTextElement;
const transformOrigin =
updatedTextElement.width !== eMetrics.width ||
updatedTextElement.height !== eMetrics.height
? { transformOrigin: `${w / 2}px ${h / 2}px` }
: {};
let lineHeight = updatedTextElement.lineHeight;
// In Safari the font size gets rounded off when rendering hence calculating the line height by rounding off font size
@@ -270,13 +317,15 @@ export const textWysiwyg = ({
font: getFontString(updatedTextElement),
// must be defined *after* font ¯\_(ツ)_/¯
lineHeight,
width: `${textElementWidth}px`,
width: `${Math.min(textElementWidth, maxWidth)}px`,
height: `${textElementHeight}px`,
left: `${viewportX}px`,
top: `${viewportY}px`,
...transformOrigin,
transform: getTransform(
textElementWidth,
textElementHeight,
offsetX,
transformWidth,
updatedTextElement.height,
getTextElementAngle(updatedTextElement),
appState,
maxWidth,
@@ -334,6 +383,7 @@ export const textWysiwyg = ({
whiteSpace,
overflowWrap: "break-word",
boxSizing: "content-box",
...getEditorStyle(element),
});
editable.value = element.originalText;
updateWysiwygStyle();
+2 -2
View File
@@ -4,7 +4,7 @@ import {
PointerType,
} from "./types";
import { Bounds, getElementAbsoluteCoords } from "./bounds";
import { getElementAbsoluteCoords } from "./bounds";
import { rotate } from "../math";
import { InteractiveCanvasAppState, Zoom } from "../types";
import { isTextElement } from ".";
@@ -23,7 +23,7 @@ export type TransformHandleDirection =
export type TransformHandleType = TransformHandleDirection | "rotation";
export type TransformHandle = Bounds;
export type TransformHandle = [number, number, number, number];
export type TransformHandles = Partial<{
[T in TransformHandleType]: TransformHandle;
}>;
+1
View File
@@ -65,6 +65,7 @@ type _ExcalidrawElementBase = Readonly<{
updated: number;
link: string | null;
locked: boolean;
subtype?: string;
customData?: Record<string, any>;
}>;
-47
View File
@@ -1,47 +0,0 @@
type Subscriber<T extends any[]> = (...payload: T) => void;
export class Emitter<T extends any[] = []> {
public subscribers: Subscriber<T>[] = [];
public value: T | undefined;
private updateOnChangeOnly: boolean;
constructor(opts?: { initialState?: T; updateOnChangeOnly?: boolean }) {
this.updateOnChangeOnly = opts?.updateOnChangeOnly ?? false;
this.value = opts?.initialState;
}
/**
* Attaches subscriber
*
* @returns unsubscribe function
*/
on(...handlers: Subscriber<T>[] | Subscriber<T>[][]) {
const _handlers = handlers
.flat()
.filter((item) => typeof item === "function");
this.subscribers.push(..._handlers);
return () => this.off(_handlers);
}
off(...handlers: Subscriber<T>[] | Subscriber<T>[][]) {
const _handlers = handlers.flat();
this.subscribers = this.subscribers.filter(
(handler) => !_handlers.includes(handler),
);
}
trigger(...payload: T): any[] {
if (this.updateOnChangeOnly && this.value === payload) {
return [];
}
this.value = payload;
return this.subscribers.map((handler) => handler(...payload));
}
destroy() {
this.subscribers = [];
this.value = undefined;
}
}
+13 -13
View File
@@ -123,7 +123,7 @@ describe("adding elements to frames", () => {
const commonTestCases = async (
func: typeof resizeFrameOverElement | typeof dragElementIntoFrame,
) => {
describe.skip("when frame is in a layer below", async () => {
describe("when frame is in a layer below", async () => {
it("should add an element", async () => {
h.elements = [frame, rect2];
@@ -167,7 +167,7 @@ describe("adding elements to frames", () => {
});
});
describe.skip("when frame is in a layer above", async () => {
describe("when frame is in a layer above", async () => {
it("should add an element", async () => {
h.elements = [rect2, frame];
@@ -212,7 +212,7 @@ describe("adding elements to frames", () => {
});
describe("when frame is in an inner layer", async () => {
it.skip("should add elements", async () => {
it("should add elements", async () => {
h.elements = [rect2, frame, rect3];
func(frame, rect2);
@@ -223,7 +223,7 @@ describe("adding elements to frames", () => {
expectEqualIds([rect2, rect3, frame]);
});
it.skip("should add elements when there are other other elements in between", async () => {
it("should add elements when there are other other elements in between", async () => {
h.elements = [rect2, rect1, frame, rect4, rect3];
func(frame, rect2);
@@ -234,7 +234,7 @@ describe("adding elements to frames", () => {
expectEqualIds([rect1, rect2, rect3, frame, rect4]);
});
it.skip("should add elements when there are other elements in between and the order is reversed", async () => {
it("should add elements when there are other elements in between and the order is reversed", async () => {
h.elements = [rect3, rect4, frame, rect2, rect1];
func(frame, rect2);
@@ -289,7 +289,7 @@ describe("adding elements to frames", () => {
describe("resizing frame over elements", async () => {
await commonTestCases(resizeFrameOverElement);
it.skip("resizing over text containers and labelled arrows", async () => {
it("resizing over text containers and labelled arrows", async () => {
await resizingTest(
"rectangle",
["frame", "rectangle", "text"],
@@ -339,7 +339,7 @@ describe("adding elements to frames", () => {
// );
});
it.skip("should add arrow bound with text when frame is in a layer below", async () => {
it("should add arrow bound with text when frame is in a layer below", async () => {
h.elements = [frame, arrow, text];
resizeFrameOverElement(frame, arrow);
@@ -359,7 +359,7 @@ describe("adding elements to frames", () => {
expectEqualIds([arrow, text, frame]);
});
it.skip("should add arrow bound with text when frame is in an inner layer", async () => {
it("should add arrow bound with text when frame is in an inner layer", async () => {
h.elements = [arrow, frame, text];
resizeFrameOverElement(frame, arrow);
@@ -371,7 +371,7 @@ describe("adding elements to frames", () => {
});
describe("resizing frame over elements but downwards", async () => {
it.skip("should add elements when frame is in a layer below", async () => {
it("should add elements when frame is in a layer below", async () => {
h.elements = [frame, rect1, rect2, rect3, rect4];
resizeFrameOverElement(frame, rect4);
@@ -382,7 +382,7 @@ describe("adding elements to frames", () => {
expectEqualIds([rect2, rect3, frame, rect4, rect1]);
});
it.skip("should add elements when frame is in a layer above", async () => {
it("should add elements when frame is in a layer above", async () => {
h.elements = [rect1, rect2, rect3, rect4, frame];
resizeFrameOverElement(frame, rect4);
@@ -393,7 +393,7 @@ describe("adding elements to frames", () => {
expectEqualIds([rect1, rect2, rect3, frame, rect4]);
});
it.skip("should add elements when frame is in an inner layer", async () => {
it("should add elements when frame is in an inner layer", async () => {
h.elements = [rect1, rect2, frame, rect3, rect4];
resizeFrameOverElement(frame, rect4);
@@ -408,7 +408,7 @@ describe("adding elements to frames", () => {
describe("dragging elements into the frame", async () => {
await commonTestCases(dragElementIntoFrame);
it.skip("should drag element inside, duplicate it and keep it in frame", () => {
it("should drag element inside, duplicate it and keep it in frame", () => {
h.elements = [frame, rect2];
dragElementIntoFrame(frame, rect2);
@@ -422,7 +422,7 @@ describe("adding elements to frames", () => {
expectEqualIds([rect2_copy, rect2, frame]);
});
it.skip("should drag element inside, duplicate it and remove it from frame", () => {
it("should drag element inside, duplicate it and remove it from frame", () => {
h.elements = [frame, rect2];
dragElementIntoFrame(frame, rect2);
+217 -49
View File
@@ -19,10 +19,10 @@ import { mutateElement } from "./element/mutateElement";
import { AppClassProperties, AppState, StaticCanvasAppState } from "./types";
import { getElementsWithinSelection, getSelectedElements } from "./scene";
import { isFrameElement } from "./element";
import { moveOneRight } from "./zindex";
import { getElementsInGroup, selectGroupsFromGivenElements } from "./groups";
import Scene, { ExcalidrawElementsIncludingDeleted } from "./scene/Scene";
import { getElementLineSegments } from "./element/bounds";
import { doLineSegmentsIntersect } from "./packages/utils";
// --------------------------- Frame State ------------------------------------
export const bindElementsToFramesAfterDuplication = (
@@ -56,21 +56,130 @@ export const bindElementsToFramesAfterDuplication = (
}
};
export function isElementIntersectingFrame(
element: ExcalidrawElement,
frame: ExcalidrawFrameElement,
) {
const frameLineSegments = getElementLineSegments(frame);
// --------------------------- Frame Geometry ---------------------------------
class Point {
x: number;
y: number;
const elementLineSegments = getElementLineSegments(element);
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
const intersecting = frameLineSegments.some((frameLineSegment) =>
elementLineSegments.some((elementLineSegment) =>
doLineSegmentsIntersect(frameLineSegment, elementLineSegment),
),
);
class LineSegment {
first: Point;
second: Point;
return intersecting;
constructor(pointA: Point, pointB: Point) {
this.first = pointA;
this.second = pointB;
}
public getBoundingBox(): [Point, Point] {
return [
new Point(
Math.min(this.first.x, this.second.x),
Math.min(this.first.y, this.second.y),
),
new Point(
Math.max(this.first.x, this.second.x),
Math.max(this.first.y, this.second.y),
),
];
}
}
// https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/
class FrameGeometry {
private static EPSILON = 0.000001;
private static crossProduct(a: Point, b: Point) {
return a.x * b.y - b.x * a.y;
}
private static doBoundingBoxesIntersect(
a: [Point, Point],
b: [Point, Point],
) {
return (
a[0].x <= b[1].x &&
a[1].x >= b[0].x &&
a[0].y <= b[1].y &&
a[1].y >= b[0].y
);
}
private static isPointOnLine(a: LineSegment, b: Point) {
const aTmp = new LineSegment(
new Point(0, 0),
new Point(a.second.x - a.first.x, a.second.y - a.first.y),
);
const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);
const r = this.crossProduct(aTmp.second, bTmp);
return Math.abs(r) < this.EPSILON;
}
private static isPointRightOfLine(a: LineSegment, b: Point) {
const aTmp = new LineSegment(
new Point(0, 0),
new Point(a.second.x - a.first.x, a.second.y - a.first.y),
);
const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);
return this.crossProduct(aTmp.second, bTmp) < 0;
}
private static lineSegmentTouchesOrCrossesLine(
a: LineSegment,
b: LineSegment,
) {
return (
this.isPointOnLine(a, b.first) ||
this.isPointOnLine(a, b.second) ||
(this.isPointRightOfLine(a, b.first)
? !this.isPointRightOfLine(a, b.second)
: this.isPointRightOfLine(a, b.second))
);
}
private static doLineSegmentsIntersect(
a: [readonly [number, number], readonly [number, number]],
b: [readonly [number, number], readonly [number, number]],
) {
const aSegment = new LineSegment(
new Point(a[0][0], a[0][1]),
new Point(a[1][0], a[1][1]),
);
const bSegment = new LineSegment(
new Point(b[0][0], b[0][1]),
new Point(b[1][0], b[1][1]),
);
const box1 = aSegment.getBoundingBox();
const box2 = bSegment.getBoundingBox();
return (
this.doBoundingBoxesIntersect(box1, box2) &&
this.lineSegmentTouchesOrCrossesLine(aSegment, bSegment) &&
this.lineSegmentTouchesOrCrossesLine(bSegment, aSegment)
);
}
public static isElementIntersectingFrame(
element: ExcalidrawElement,
frame: ExcalidrawFrameElement,
) {
const frameLineSegments = getElementLineSegments(frame);
const elementLineSegments = getElementLineSegments(element);
const intersecting = frameLineSegments.some((frameLineSegment) =>
elementLineSegments.some((elementLineSegment) =>
this.doLineSegmentsIntersect(frameLineSegment, elementLineSegment),
),
);
return intersecting;
}
}
export const getElementsCompletelyInFrame = (
@@ -98,7 +207,10 @@ export const isElementContainingFrame = (
export const getElementsIntersectingFrame = (
elements: readonly ExcalidrawElement[],
frame: ExcalidrawFrameElement,
) => elements.filter((element) => isElementIntersectingFrame(element, frame));
) =>
elements.filter((element) =>
FrameGeometry.isElementIntersectingFrame(element, frame),
);
export const elementsAreInFrameBounds = (
elements: readonly ExcalidrawElement[],
@@ -124,7 +236,7 @@ export const elementOverlapsWithFrame = (
) => {
return (
elementsAreInFrameBounds([element], frame) ||
isElementIntersectingFrame(element, frame) ||
FrameGeometry.isElementIntersectingFrame(element, frame) ||
isElementContainingFrame([frame], element, frame)
);
};
@@ -161,7 +273,7 @@ export const groupsAreAtLeastIntersectingTheFrame = (
return !!elementsInGroup.find(
(element) =>
elementsAreInFrameBounds([element], frame) ||
isElementIntersectingFrame(element, frame),
FrameGeometry.isElementIntersectingFrame(element, frame),
);
};
@@ -182,7 +294,7 @@ export const groupsAreCompletelyOutOfFrame = (
elementsInGroup.find(
(element) =>
elementsAreInFrameBounds([element], frame) ||
isElementIntersectingFrame(element, frame),
FrameGeometry.isElementIntersectingFrame(element, frame),
) === undefined
);
};
@@ -242,7 +354,7 @@ export const getElementsInResizingFrame = (
);
for (const element of elementsNotCompletelyInFrame) {
if (!isElementIntersectingFrame(element, frame)) {
if (!FrameGeometry.isElementIntersectingFrame(element, frame)) {
if (element.groupIds.length === 0) {
nextElementsInFrame.delete(element);
}
@@ -351,17 +463,20 @@ export const addElementsToFrame = (
elementsToAdd: NonDeletedExcalidrawElement[],
frame: ExcalidrawFrameElement,
) => {
const { currTargetFrameChildrenMap } = allElements.reduce(
(acc, element, index) => {
if (element.frameId === frame.id) {
acc.currTargetFrameChildrenMap.set(element.id, true);
}
return acc;
},
{
currTargetFrameChildrenMap: new Map<ExcalidrawElement["id"], true>(),
},
);
const { allElementsIndexMap, currTargetFrameChildrenMap } =
allElements.reduce(
(acc, element, index) => {
acc.allElementsIndexMap.set(element.id, index);
if (element.frameId === frame.id) {
acc.currTargetFrameChildrenMap.set(element.id, true);
}
return acc;
},
{
allElementsIndexMap: new Map<ExcalidrawElement["id"], number>(),
currTargetFrameChildrenMap: new Map<ExcalidrawElement["id"], true>(),
},
);
const suppliedElementsToAddSet = new Set(elementsToAdd.map((el) => el.id));
@@ -387,6 +502,66 @@ export const addElementsToFrame = (
}
}
const finalElementsToAddSet = new Set(finalElementsToAdd.map((el) => el.id));
const nextElements: ExcalidrawElement[] = [];
const processedElements = new Set<ExcalidrawElement["id"]>();
for (const element of allElements) {
if (processedElements.has(element.id)) {
continue;
}
processedElements.add(element.id);
if (
finalElementsToAddSet.has(element.id) ||
(element.frameId && element.frameId === frame.id)
) {
// will be added in bulk once we process target frame
continue;
}
// target frame
if (element.id === frame.id) {
const currFrameChildren = getFrameElements(allElements, frame.id);
currFrameChildren.forEach((child) => {
processedElements.add(child.id);
});
// if not found, add all children on top by assigning the lowest index
const targetFrameIndex = allElementsIndexMap.get(frame.id) ?? -1;
const { newChildren_left, newChildren_right } = finalElementsToAdd.reduce(
(acc, element) => {
// if index not found, add on top of current frame children
const elementIndex = allElementsIndexMap.get(element.id) ?? Infinity;
if (elementIndex < targetFrameIndex) {
acc.newChildren_left.push(element);
} else {
acc.newChildren_right.push(element);
}
return acc;
},
{
newChildren_left: [] as ExcalidrawElement[],
newChildren_right: [] as ExcalidrawElement[],
},
);
nextElements.push(
...newChildren_left,
...currFrameChildren,
...newChildren_right,
element,
);
continue;
}
nextElements.push(element);
}
for (const element of finalElementsToAdd) {
mutateElement(
element,
@@ -396,7 +571,8 @@ export const addElementsToFrame = (
false,
);
}
return allElements.slice();
return nextElements;
};
export const removeElementsFromFrame = (
@@ -404,34 +580,20 @@ export const removeElementsFromFrame = (
elementsToRemove: NonDeletedExcalidrawElement[],
appState: AppState,
) => {
const _elementsToRemove = new Map<
ExcalidrawElement["id"],
ExcalidrawElement
>();
const toRemoveElementsByFrame = new Map<
ExcalidrawFrameElement["id"],
ExcalidrawElement[]
>();
const _elementsToRemove: ExcalidrawElement[] = [];
for (const element of elementsToRemove) {
if (element.frameId) {
_elementsToRemove.set(element.id, element);
const arr = toRemoveElementsByFrame.get(element.frameId) || [];
arr.push(element);
_elementsToRemove.push(element);
const boundTextElement = getBoundTextElement(element);
if (boundTextElement) {
_elementsToRemove.set(boundTextElement.id, boundTextElement);
arr.push(boundTextElement);
_elementsToRemove.push(boundTextElement);
}
toRemoveElementsByFrame.set(element.frameId, arr);
}
}
for (const [, element] of _elementsToRemove) {
for (const element of _elementsToRemove) {
mutateElement(
element,
{
@@ -441,7 +603,13 @@ export const removeElementsFromFrame = (
);
}
return allElements.slice();
const nextElements = moveOneRight(
allElements,
appState,
Array.from(_elementsToRemove),
);
return nextElements;
};
export const removeAllElementsFromFrame = (
+80 -129
View File
@@ -50,7 +50,7 @@
"veryLarge": "كبير جدا",
"solid": "كامل",
"hachure": "خطوط",
"zigzag": "متعرج",
"zigzag": "",
"crossHatch": "خطوط متقطعة",
"thin": "نحيف",
"bold": "داكن",
@@ -106,15 +106,11 @@
"increaseFontSize": "تكبير حجم الخط",
"unbindText": "فك ربط النص",
"bindText": "ربط النص بالحاوية",
"createContainerFromText": "نص مغلف في حاوية",
"createContainerFromText": "",
"link": {
"edit": "تعديل الرابط",
"editEmbed": "تحرير الرابط وإدراجه",
"create": "إنشاء رابط",
"createEmbed": "إنشاء رابط و إدراجه",
"label": "رابط",
"labelEmbed": "رابط و إدراج",
"empty": "لم يتم تعيين رابط"
"label": "رابط"
},
"lineEditor": {
"edit": "تحرير السطر",
@@ -128,9 +124,9 @@
},
"statusPublished": "نُشر",
"sidebarLock": "إبقاء الشريط الجانبي مفتوح",
"selectAllElementsInFrame": "تحديد جميع العناصر في الإطار",
"removeAllElementsFromFrame": "إزالة جميع العناصر من الإطار",
"eyeDropper": "اختيار اللون من القماش"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "لا توجد عناصر أضيفت بعد...",
@@ -164,16 +160,13 @@
"darkMode": "الوضع المظلم",
"lightMode": "الوضع المضيء",
"zenMode": "وضع التأمل",
"objectsSnapMode": "التقط إلى العناصر",
"exitZenMode": "إلغاء الوضع الليلى",
"cancel": "إلغاء",
"clear": "مسح",
"remove": "إزالة",
"embed": "تبديل الإدراج",
"publishLibrary": "انشر",
"submit": "أرسل",
"confirm": "تأكيد",
"embeddableInteractionButton": "اضغط للتفاعل"
"confirm": "تأكيد"
},
"alerts": {
"clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟",
@@ -196,28 +189,23 @@
"resetLibrary": "هذا سوف يمسح مكتبتك. هل أنت متأكد؟",
"removeItemsFromsLibrary": "حذف {{count}} عنصر (عناصر) من المكتبة؟",
"invalidEncryptionKey": "مفتاح التشفير يجب أن يكون من 22 حرفاً. التعاون المباشر معطل.",
"collabOfflineWarning": "لا يوجد اتصال بالانترنت.\nلن يتم حفظ التغييرات التي قمت بها!"
"collabOfflineWarning": ""
},
"errors": {
"unsupportedFileType": "نوع الملف غير مدعوم.",
"imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...",
"fileTooBig": "الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.",
"svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.",
"failedToFetchImage": "",
"invalidSVGString": "SVG غير صالح.",
"cannotResolveCollabServer": "تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.",
"importLibraryError": "تعذر تحميل المكتبة",
"collabSaveFailed": "تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يفضل أن تحفظ ملفك محليا كي لا تفقد عملك.",
"collabSaveFailed_sizeExceeded": "تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يفضّل حفظ الملف محليا كي لا تفقد عملك.",
"brave_measure_text_error": {
"line1": "يبدو أنك تستخدم متصفح Brave مع إعداد <bold>حظر صارم لتتبع البصمة</bold>.",
"line2": "قد يؤدي هذا إلى كسر <bold>عناصر النص</bold> في الرسومات الخاصة بك.",
"line3": "من المستحسن إلغاء تفعيل هذا الإعداد. يمكنك اتباع <link>هذه الخطوات</link> لفعل ذلك.",
"line4": "إذا لم يصلح تعطيل هذا الإعداد طريقة عرض النصوص، الرجاء كتابة <issueLink>بلاغ</issueLink> على حسابنا في GitHub، أو راسلنا على <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.",
"image": "سوف يتم دعم إضافة صور إلى المكتبة قريباً!"
"line1": "",
"line2": "",
"line3": "",
"line4": ""
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "وضع القلم - امنع اللمس",
"link": "إضافة/تحديث الرابط للشكل المحدد",
"eraser": "ممحاة",
"frame": "أداة الإطار",
"embeddable": "تضمين ويب",
"laser": "مؤشر ليزر",
"hand": "يد (أداة الإزاحة)",
"extraTools": "المزيد من أﻷدوات"
"frame": "",
"hand": "",
"extraTools": ""
},
"headings": {
"canvasActions": "إجراءات اللوحة",
@@ -251,7 +237,6 @@
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
"freeDraw": "انقر واسحب، افرج عند الانتهاء",
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
"embeddable": "اضغط مع السحب لإنشاء موقع ويب مضمّن",
"text_selected": "انقر نقراً مزدوجاً أو اضغط ادخال لتعديل النص",
"text_editing": "اضغط على Esc أو (Ctrl أو Cmd) + Enter لإنهاء التعديل",
"linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء",
@@ -260,15 +245,14 @@
"resizeImage": "يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،\nاضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز",
"rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران",
"lineEditor_info": "اضغط على مفتاح (Ctrl أو Cmd) و انقر بشكل مزدوج، أو اضغط على مفتاحي (Ctrl أو Cmd) و (Enter) لتعديل النقاط",
"lineEditor_pointSelected": "اضغط على حذف لإزالة النقطة (النِّقَاط)، Ctrl/Cmd+D للتكرار، أو اسحب للانتقال",
"lineEditor_nothingSelected": "اختر نقطة لتعديلها (اضغط على SHIFT لتحديد عدة نِقَاط),\nأو اضغط على ALT و انقر بالفأرة لإضافة نِقَاط جديدة",
"placeImage": "انقر لوضع الصورة، أو انقر واسحب لتعيين حجمها يدوياً",
"lineEditor_pointSelected": "",
"lineEditor_nothingSelected": "",
"placeImage": "",
"publishLibrary": "نشر مكتبتك",
"bindTextToElement": "اضغط على إدخال لإضافة نص",
"deepBoxSelect": "اضغط على Ctrl\\Cmd للاختيار العميق، ولمنع السحب",
"eraserRevert": "اضغط على Alt لاستعادة العناصر المعلَّمة للحذف",
"firefox_clipboard_write": "يمكن على الأرجح تمكين هذه الميزة عن طريق تعيين علم \"dom.events.asyncClipboard.clipboardItem\" إلى \"true\". لتغيير أعلام المتصفح في Firefox، قم بزيارة صفحة \"about:config\".",
"disableSnapping": "اضغط على Ctrl أو Cmd لتعطيل الالتقاط"
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "تعذر عرض المعاينة",
@@ -276,11 +260,11 @@
"canvasTooBigTip": "نصيحة: حاول تحريك العناصر البعيدة بشكل أقرب قليلاً."
},
"errorSplash": {
"headingMain": "حدث خطأ. حاول <button>تحديث الصفحة</button>.",
"headingMain": "",
"clearCanvasMessage": "إذا لم تعمل إعادة التحميل، حاول مرة أخرى ",
"clearCanvasCaveat": " هذا سيؤدي إلى فقدان العمل ",
"trackedToSentry": "تم تتبع الخطأ في المعرف {{eventId}} على نظامنا.",
"openIssueMessage": "حرصنا على عدم إضافة معلومات المشهد في بلاغ الخطأ. في حال كون مشهدك لا يحمل أي معلومات خاصة نرجو المتابعة على <button>نظام تتبع الأخطاء</button>. نرجو إضافة المعلومات أدناه بنسخها ولصقها في محتوى البلاغ على GitHub.",
"trackedToSentry": "",
"openIssueMessage": "",
"sceneContent": "محتوى المشهد:"
},
"roomDialog": {
@@ -310,16 +294,16 @@
"helpDialog": {
"blog": "اقرأ مدونتنا",
"click": "انقر",
"deepSelect": "تحديد عميق",
"deepBoxSelect": "تحديد عميق داخل المربع، ومنع السحب",
"deepSelect": "",
"deepBoxSelect": "",
"curvedArrow": "سهم مائل",
"curvedLine": "خط مائل",
"documentation": "دليل الاستخدام",
"doubleClick": "انقر مرتين",
"drag": "اسحب",
"editor": "المحرر",
"editLineArrowPoints": "تحرير سطر/نقاط سهم",
"editText": "تعديل النص / إضافة تسمية",
"editLineArrowPoints": "",
"editText": "",
"github": "عثرت على مشكلة؟ إرسال",
"howto": "اتبع التعليمات",
"or": "أو",
@@ -332,9 +316,9 @@
"view": "عرض",
"zoomToFit": "تكبير للملائمة",
"zoomToSelection": "تكبير للعنصر المحدد",
"toggleElementLock": "إغلاق/فتح المحدد",
"movePageUpDown": "نقل الصفحة أعلى/أسفل",
"movePageLeftRight": "نقل الصفحة يسار/يمين"
"toggleElementLock": "",
"movePageUpDown": "",
"movePageLeftRight": ""
},
"clearCanvasDialog": {
"title": "مسح اللوحة"
@@ -352,20 +336,20 @@
"authorName": "اسمك أو اسم المستخدم",
"libraryName": "اسم مكتبتك",
"libraryDesc": "وصف مكتبتك لمساعدة الناس على فهم استخدامها",
"githubHandle": "معالج GitHub (اختياري)، حتى تتمكن من تحرير المكتبة عند إرسالها للمراجعة",
"twitterHandle": "اسم مستخدم تويتر (اختياري)، حتى نعرف من الذي سيتم الإشارة إليه عند الترويج عبر تويتر",
"website": "رابط إلى موقعك الشخصي أو في مكان آخر (اختياري)"
"githubHandle": "",
"twitterHandle": "",
"website": ""
},
"errors": {
"required": "مطلوب",
"website": "أدخل عنوان URL صالح"
},
"noteDescription": "تقديم مكتبتك لتضمينها في مستودع المكتبة العامة <link></link> لأشخاص آخرين لاستخدامها في رسومهم.",
"noteGuidelines": "تحتاج المكتبة إلى الموافقة أولا. يرجى قراءة <link>المعايير</link> قبل تقديمها. سوف تحتاج إلى حساب GitHub للتواصل وإجراء التغييرات عند الطلب، ولكن ليس مطلوبا بشكل صارم.",
"noteLicense": "تقديمك يعني موافقتك على نشر المكتبة المقدمة تحت <link>MIT ترخيص</link>، ما يعني أن لأي أحد الحق في استخدامها دون قيود.",
"noteDescription": "",
"noteGuidelines": "",
"noteLicense": "",
"noteItems": "يجب أن يكون لكل عنصر مكتبة اسمه الخاص حتى يكون قابلاً للتصفية. سيتم تضمين عناصر المكتبة التالية:",
"atleastOneLibItem": "يرجى تحديد عنصر مكتبة واحد على الأقل للبدء",
"republishWarning": "ملاحظة: بعض العناصر المحددة معينة على أنه نشرها أو تقديمها من قبل. يجب عليك فقط إعادة إرسال العناصر عند تحديث مكتبة موجودة أو إرسالها."
"republishWarning": ""
},
"publishSuccessDialog": {
"title": "تم إرسال المكتبة",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "إزالة العناصر المحددة من المكتبة"
},
"imageExportDialog": {
"header": "تصدير الصورة",
"header": "",
"label": {
"withBackground": "الخلفية",
"onlySelected": "المحدد فقط",
"darkMode": "الوضع الداكن",
"embedScene": "تضمين المشهد",
"scale": "الحجم",
"padding": "الهوامش"
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.\nسيزيد حجم الملف المصدر."
"embedScene": ""
},
"title": {
"exportToPng": "تصدير بصيغة PNG",
"exportToSvg": "تصدير بصيغة SVG",
"copyPngToClipboard": "نسخ الـ PNG إلى الحافظة"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "نسخ إلى الحافظة"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,76 +411,43 @@
"fileSavedToFilename": "حفظ باسم {filename}",
"canvas": "لوحة الرسم",
"selection": "العنصر المحدد",
"pasteAsSingleElement": "استخدم {{shortcut}} للصق كعنصر واحد،\nأو لصق في محرر نص موجود",
"unableToEmbed": "تضمين هذا الرابط غير مسموح حاليًا. افتح بلاغاً على GitHub لطلب عنوان Url القائمة البيضاء",
"unrecognizedLinkFormat": "الرابط الذي ضمنته لا يتطابق مع التنسيق المتوقع. الرجاء محاولة لصق النص 'المضمن' المُزوَد من موقع المصدر"
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "شفاف",
"black": "أسود",
"white": "أبيض",
"red": "أحمر",
"pink": "وردي",
"grape": "عنبي",
"violet": "بنفسجي",
"gray": "رمادي",
"blue": "أزرق",
"cyan": "سماوي",
"teal": "أزرق مخضر",
"green": "أخضر",
"yellow": "أصفر",
"orange": "برتقالي",
"bronze": "برونزي"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
"center_heading": "جميع بياناتك محفوظة محليا في المتصفح الخاص بك.",
"center_heading_plus": "هل تريد الذهاب إلى Excalidraw+ بدلاً من ذلك؟",
"menuHint": "التصدير والتفضيلات واللغات ..."
"center_heading": "",
"center_heading_plus": "",
"menuHint": ""
},
"defaults": {
"menuHint": "التصدير والتفضيلات وغيرها...",
"center_heading": "الرسم البياني التصويري. بشكل مبسط.",
"toolbarHint": "اختر أداة و ابدأ الرسم!",
"helpHint": "الاختصارات و المساعدة"
"menuHint": "",
"center_heading": "",
"toolbarHint": "",
"helpHint": ""
}
},
"colorPicker": {
"mostUsedCustomColors": "الألوان المخصصة الأكثر استخداما",
"colors": "الألوان",
"shades": "الدرجات",
"hexCode": "رمز Hex",
"noShades": "لا تتوفر درجات لهذا اللون"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "تصدير كصورة",
"button": "تصدير كصورة",
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً."
},
"saveToDisk": {
"title": "حفظ الملف للجهاز",
"button": "حفظ الملف للجهاز",
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "تصدير إلى Excalidraw+",
"description": "حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك."
}
},
"modal": {
"loadFromFile": {
"title": "تحميل من ملف",
"button": "تحميل من ملف",
"description": "سيتم التحميل من الملف <bold>استبدال المحتوى الموجود</bold>.<br></br>يمكنك النسخ الاحتياطي لرسمك أولاً باستخدام أحد الخيارات أدناه."
},
"shareableLink": {
"title": "تحميل من رابط",
"button": "استبدال محتواي",
"description": "سيتسبب تحميل رسمة خارجية <bold>باستبدال محتواك الموجود حالياً</bold>.<br></br>بإمكانك إجراء النسخ الاحتياطي لرسمتك الحالية باستخدام أحد الخيارات أدناه."
}
}
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "",
"lightMode": "",
"zenMode": "",
"objectsSnapMode": "",
"exitZenMode": "",
"cancel": "",
"clear": "",
"remove": "",
"embed": "",
"publishLibrary": "",
"submit": "",
"confirm": "",
"embeddableInteractionButton": ""
"confirm": ""
},
"alerts": {
"clearReset": "",
@@ -203,7 +196,6 @@
"imageInsertError": "",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "",
"freeDraw": "",
"text": "",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+96 -145
View File
@@ -1,7 +1,7 @@
{
"labels": {
"paste": "Постави",
"pasteAsPlaintext": "Постави като обикновен текст",
"pasteAsPlaintext": "",
"pasteCharts": "Постави графики",
"selectAll": "Маркирай всичко",
"multiSelect": "Добави елемент към селекция",
@@ -50,7 +50,7 @@
"veryLarge": "Много голям",
"solid": "Солиден",
"hachure": "Хералдика",
"zigzag": "Зигзаг",
"zigzag": "",
"crossHatch": "Двойно-пресечено",
"thin": "Тънък",
"bold": "Ясно очертан",
@@ -63,7 +63,7 @@
"cartoonist": "Карикатурист",
"fileTitle": "Име на файл",
"colorPicker": "Избор на цвят",
"canvasColors": "Използван на платно",
"canvasColors": "",
"canvasBackground": "Фон на платно",
"drawingCanvas": "Платно за рисуване",
"layers": "Слоеве",
@@ -99,41 +99,37 @@
"share": "Сподели",
"showStroke": "",
"showBackground": "",
"toggleTheme": "Включи тема",
"personalLib": "Лична Библиотека",
"excalidrawLib": "Excalidraw Библиотека",
"decreaseFontSize": "Намали размера на шрифта",
"increaseFontSize": "Увеличи размера на шрифта",
"toggleTheme": "",
"personalLib": "",
"excalidrawLib": "",
"decreaseFontSize": "",
"increaseFontSize": "",
"unbindText": "",
"bindText": "",
"createContainerFromText": "",
"link": {
"edit": "Редактирай линк",
"editEmbed": "",
"edit": "",
"create": "",
"createEmbed": "",
"label": "Линк",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
"exit": ""
},
"elementLock": {
"lock": "Заключи",
"unlock": "Отключи",
"lockAll": "Заключи всички",
"unlockAll": "Отключи всички"
"lock": "",
"unlock": "",
"lockAll": "",
"unlockAll": ""
},
"statusPublished": "Публикувани",
"statusPublished": "",
"sidebarLock": "",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": "Избери цвят от платното"
"eyeDropper": ""
},
"library": {
"noItems": "Няма добавени неща все още...",
"noItems": "",
"hint_emptyLibrary": "",
"hint_emptyPrivateLibrary": ""
},
@@ -141,11 +137,11 @@
"clearReset": "Нулиране на платно",
"exportJSON": "",
"exportImage": "",
"export": "Запази на...",
"export": "",
"copyToClipboard": "Копиране в клипборда",
"save": "Запази към текущ файл",
"save": "",
"saveAs": "Запиши като",
"load": "Отвори",
"load": "",
"getShareableLink": "Получаване на връзка за споделяне",
"close": "Затвори",
"selectLanguage": "Избор на език",
@@ -164,16 +160,13 @@
"darkMode": "Тъмен режим",
"lightMode": "Светъл режим",
"zenMode": "Режим Zen",
"objectsSnapMode": "",
"exitZenMode": "Спиране на Zen режим",
"cancel": "Отмени",
"clear": "Изчисти",
"remove": "Премахване",
"embed": "",
"publishLibrary": "Публикувай",
"submit": "Изпрати",
"confirm": "Потвърждаване",
"embeddableInteractionButton": ""
"confirm": "Потвърждаване"
},
"alerts": {
"clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?",
@@ -182,42 +175,37 @@
"couldNotLoadInvalidFile": "Невалиден файл не може да се зареди",
"importBackendFailed": "Импортирането от бекенд не беше успешно.",
"cannotExportEmptyCanvas": "Не може да се експортира празно платно.",
"couldNotCopyToClipboard": "Не можем да копираме в клипбоарда.",
"couldNotCopyToClipboard": "",
"decryptFailed": "Данните не можаха да се дешифрират.",
"uploadedSecurly": "Качването е защитено с криптиране от край до край, което означава, че сървърът Excalidraw и трети страни не могат да четат съдържанието.",
"loadSceneOverridePrompt": "Зареждането на външна рисунка ще презапише настоящото ви съдържание. Желаете ли да продължите?",
"collabStopOverridePrompt": "Прекратяването на сесията ще презапише предишната, локално запазена, рисунка. Сигурни ли сте?\n\n(Ако искате да продължите с локалната рисунка, просто затворете таба на браузъра.)",
"errorAddingToLibrary": "Не можем да заредим от библиотеката",
"errorRemovingFromLibrary": "Не можем да премахнем елемент от библиотеката",
"errorAddingToLibrary": "",
"errorRemovingFromLibrary": "",
"confirmAddLibrary": "Ще се добавят {{numShapes}} фигура(и) във вашата библиотека. Сигурни ли сте?",
"imageDoesNotContainScene": "",
"cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл",
"invalidSceneUrl": "",
"resetLibrary": "",
"removeItemsFromsLibrary": "Изтрий {{count}} елемент(а) от библиотеката?",
"removeItemsFromsLibrary": "",
"invalidEncryptionKey": "",
"collabOfflineWarning": ""
},
"errors": {
"unsupportedFileType": "Този файлов формат не се поддържа.",
"imageInsertError": "",
"fileTooBig": "Файлът е твърде голям. Максималния допустим размер е {{maxSize}}.",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "Невалиден SVG.",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "Не можем да заредим библиотеката",
"importLibraryError": "",
"collabSaveFailed": "",
"collabSaveFailed_sizeExceeded": "",
"brave_measure_text_error": {
"line1": "",
"line2": "",
"line3": "Силно препоръчваме да изключите тази настройка. Можете да следвате <link>тези стъпки</link> за това как да го направите.",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -234,12 +222,10 @@
"lock": "Поддържайте избрания инструмент активен след рисуване",
"penMode": "",
"link": "",
"eraser": "Гума",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": "Още инструменти"
"extraTools": ""
},
"headings": {
"canvasActions": "Действия по платното",
@@ -251,7 +237,6 @@
"linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия",
"freeDraw": "Натиснете и влачете, пуснете като сте готови",
"text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите",
@@ -267,8 +252,7 @@
"bindTextToElement": "Натиснете Enter, за да добавите",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Невъзможност за показване на preview",
@@ -304,7 +288,7 @@
"link_details": "",
"link_button": "",
"excalidrawplus_description": "",
"excalidrawplus_button": "Експорт",
"excalidrawplus_button": "",
"excalidrawplus_exportError": ""
},
"helpDialog": {
@@ -315,7 +299,7 @@
"curvedArrow": "Извита стрелка",
"curvedLine": "Извита линия",
"documentation": "Документация",
"doubleClick": "двойно-щракване",
"doubleClick": "",
"drag": "плъзнете",
"editor": "Редактор",
"editLineArrowPoints": "",
@@ -324,41 +308,41 @@
"howto": "Следвайте нашите ръководства",
"or": "или",
"preventBinding": "Спри прилепяне на стрелките",
"tools": "Инструменти",
"tools": "",
"shortcuts": "Клавиши за бърз достъп",
"textFinish": "Завърши редактиране (текстов редактор)",
"textNewLine": "Добави нова линия (текстов редактор)",
"textFinish": "",
"textNewLine": "",
"title": "Помощ",
"view": "Преглед",
"zoomToFit": "Приближи докато се виждат всички елементи",
"zoomToSelection": "Приближи селекцията",
"toggleElementLock": "Заключи/Отключи селекция",
"movePageUpDown": "Премести страница нагоре/надолу",
"movePageLeftRight": "Премести страница наляво/надясно"
"toggleElementLock": "",
"movePageUpDown": "",
"movePageLeftRight": ""
},
"clearCanvasDialog": {
"title": "Изчисти платното"
"title": ""
},
"publishDialog": {
"title": "Публикувай библиотека",
"itemName": "Име",
"authorName": "Авторско име",
"githubUsername": "GitHub потребителско име",
"twitterUsername": "Twitter потребителско име",
"libraryName": "Име на библиотеката",
"libraryDesc": "Описание на библиотеката",
"website": "Уебсайт",
"title": "",
"itemName": "",
"authorName": "",
"githubUsername": "",
"twitterUsername": "",
"libraryName": "",
"libraryDesc": "",
"website": "",
"placeholder": {
"authorName": "Името или потребителското Ви име",
"libraryName": "Име на библиотеката Ви",
"libraryDesc": "Описание на библиотеката ви, за да помогнете на хората да разберат приложенията ѝ",
"authorName": "",
"libraryName": "",
"libraryDesc": "",
"githubHandle": "",
"twitterHandle": "",
"website": ""
},
"errors": {
"required": "Задължително",
"website": "Въведете валиден URL адрес"
"required": "",
"website": ""
},
"noteDescription": "",
"noteGuidelines": "",
@@ -372,15 +356,15 @@
"content": ""
},
"confirmDialog": {
"resetLibrary": "Нулирай библиотека",
"resetLibrary": "",
"removeItemsFromLib": ""
},
"imageExportDialog": {
"header": "",
"label": {
"withBackground": "Фон",
"onlySelected": "Само избраното",
"darkMode": "Тъмен режим",
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
@@ -389,14 +373,14 @@
"embedScene": ""
},
"title": {
"exportToPng": "Изнасяне в PNG",
"exportToSvg": "Изнасяне в SVG",
"copyPngToClipboard": "Копирай PNG в клипборда"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Копиране в клипборда"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -419,84 +403,51 @@
"width": "Широчина"
},
"toast": {
"addedToLibrary": "Добавена към библиотеката",
"addedToLibrary": "",
"copyStyles": "Копирани стилове.",
"copyToClipboard": "Копирано в клипборда.",
"copyToClipboardAsPng": "Копира {{exportSelection}} в клипборда като PNG\n({{exportColorScheme}})",
"fileSaved": "Файлът е запазен.",
"fileSavedToFilename": "Запазен към {filename}",
"canvas": "платно",
"selection": "селекция",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Прозрачен",
"black": "Черен",
"white": "Бял",
"red": "Червен",
"pink": "Розов",
"grape": "Грозде",
"violet": "Виолетово",
"gray": "Сив",
"blue": "Син",
"cyan": "Синьозелено",
"teal": "Тъмно синьо-зелено",
"green": "Зелено",
"yellow": "Жълто",
"orange": "Оранжево",
"bronze": "Бронзово"
"transparent": "",
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
"center_heading": "Всичките Ви данни са запазени локално в браузъра Ви.",
"center_heading": "",
"center_heading_plus": "",
"menuHint": "Експорт, предпочитания, езици, ..."
"menuHint": ""
},
"defaults": {
"menuHint": "Експорт, предпочитания, и още...",
"center_heading": "Диаграми. Направени. Просто.",
"toolbarHint": "Изберете инструмент & Започнете да рисувате!",
"helpHint": "Преки пътища & помощ"
"menuHint": "",
"center_heading": "",
"toolbarHint": "",
"helpHint": ""
}
},
"colorPicker": {
"mostUsedCustomColors": "Най-често използвани цветове",
"colors": "Цветове",
"shades": "Нюанси",
"hexCode": "Шестнадесетичен код",
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Изнеси като изображение",
"button": "Изнеси като изображение",
"description": ""
},
"saveToDisk": {
"title": "Запази към диск",
"button": "Запази към диск",
"description": ""
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Експортирай към Excalidraw+",
"description": "Запази сцената към Excalidraw+ работното място."
}
},
"modal": {
"loadFromFile": {
"title": "Зареди от файл",
"button": "Зареди от файл",
"description": ""
},
"shareableLink": {
"title": "Зареди от линк",
"button": "Замени моето съдържание",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "লিঙ্ক সংশোধন",
"editEmbed": "",
"create": "লিঙ্ক তৈরী",
"createEmbed": "",
"label": "লিঙ্ক নামকরণ",
"labelEmbed": "",
"empty": ""
"label": "লিঙ্ক নামকরণ"
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "ডার্ক মোড",
"lightMode": "লাইট মোড",
"zenMode": "জেন মোড",
"objectsSnapMode": "",
"exitZenMode": "জেন মোড বন্ধ করুন",
"cancel": "বাতিল",
"clear": "সাফ",
"remove": "বিয়োগ",
"embed": "",
"publishLibrary": "সংগ্রহ প্রকাশ করুন",
"submit": "জমা করুন",
"confirm": "নিশ্চিত করুন",
"embeddableInteractionButton": ""
"confirm": "নিশ্চিত করুন"
},
"alerts": {
"clearReset": "এটি পুরো ক্যানভাস সাফ করবে। আপনি কি নিশ্চিত?",
@@ -203,7 +196,6 @@
"imageInsertError": "ছবি সন্নিবেশ করা যায়নি। পরে আবার চেষ্টা করুন...",
"fileTooBig": "ফাইলটি খুব বড়। সর্বাধিক অনুমোদিত আকার হল {{maxSize}}৷",
"svgImageInsertError": "এসভীজী ছবি সন্নিবেশ করা যায়নি। এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
"failedToFetchImage": "",
"invalidSVGString": "এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
"cannotResolveCollabServer": "কোল্যাব সার্ভারের সাথে সংযোগ করা যায়নি। পৃষ্ঠাটি পুনরায় লোড করে আবার চেষ্টা করুন।",
"importLibraryError": "সংগ্রহ লোড করা যায়নি",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "একটি নির্বাচিত আকৃতির জন্য লিঙ্ক যোগ বা আপডেট করুন",
"eraser": "ঝাড়ন",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "একাধিক বিন্দু শুরু করতে ক্লিক করুন, একক লাইনের জন্য টেনে আনুন",
"freeDraw": "ক্লিক করুন এবং টেনে আনুন, আপনার কাজ শেষ হলে ছেড়ে দিন",
"text": "বিশেষ্য: আপনি নির্বাচন টুলের সাথে যে কোনো জায়গায় ডাবল-ক্লিক করে পাঠ্য যোগ করতে পারেন",
"embeddable": "",
"text_selected": "লেখা সম্পাদনা করতে ডাবল-ক্লিক করুন বা এন্টার টিপুন",
"text_editing": "লেখা সম্পাদনা শেষ করতে এসকেপ বা কন্ট্রোল/কম্যান্ড যোগে এন্টার টিপুন",
"linearElementMulti": "শেষ বিন্দুতে ক্লিক করুন অথবা শেষ করতে এসকেপ বা এন্টার টিপুন",
@@ -267,8 +252,7 @@
"bindTextToElement": "লেখা যোগ করতে এন্টার টিপুন",
"deepBoxSelect": "",
"eraserRevert": "মুছে ফেলার জন্য চিহ্নিত উপাদানগুলিকে ফিরিয়ে আনতে অল্ট ধরে রাখুন",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "প্রিভিউ দেখাতে অপারগ",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "বাছাই",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Edita l'enllaç",
"editEmbed": "",
"create": "Crea un enllaç",
"createEmbed": "",
"label": "Enllaç",
"labelEmbed": "",
"empty": ""
"label": "Enllaç"
},
"lineEditor": {
"edit": "Editar línia",
@@ -164,16 +160,13 @@
"darkMode": "Mode fosc",
"lightMode": "Mode clar",
"zenMode": "Mode zen",
"objectsSnapMode": "",
"exitZenMode": "Surt de mode zen",
"cancel": "Cancel·la",
"clear": "Neteja",
"remove": "Suprimeix",
"embed": "",
"publishLibrary": "Publica",
"submit": "Envia",
"confirm": "Confirma",
"embeddableInteractionButton": ""
"confirm": "Confirma"
},
"alerts": {
"clearReset": "S'esborrarà tot el llenç. N'esteu segur?",
@@ -203,7 +196,6 @@
"imageInsertError": "No s'ha pogut insertar la imatge, torneu-ho a provar més tard...",
"fileTooBig": "El fitxer és massa gros. La mida màxima permesa és {{maxSize}}.",
"svgImageInsertError": "No ha estat possible inserir la imatge SVG. Les marques SVG semblen invàlides.",
"failedToFetchImage": "",
"invalidSVGString": "SVG no vàlid.",
"cannotResolveCollabServer": "No ha estat possible connectar amb el servidor collab. Si us plau recarregueu la pàgina i torneu a provar.",
"importLibraryError": "No s'ha pogut carregar la biblioteca",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Afegeix / actualitza l'enllaç per a la forma seleccionada",
"eraser": "Esborrador",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Mà (eina de desplaçament)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Feu clic per a dibuixar múltiples punts; arrossegueu per a una sola línia",
"freeDraw": "Feu clic i arrossegueu, deixeu anar per a finalitzar",
"text": "Consell: també podeu afegir text fent doble clic en qualsevol lloc amb l'eina de selecció",
"embeddable": "",
"text_selected": "Feu doble clic o premeu Retorn per a editar el text",
"text_editing": "Premeu Escapada o Ctrl+Retorn (o Ordre+Retorn) per a finalitzar l'edició",
"linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Premeu enter per a afegir-hi text",
"deepBoxSelect": "Manteniu CtrlOrCmd per a selecció profunda, i per a evitar l'arrossegament",
"eraserRevert": "Mantingueu premuda Alt per a revertir els elements seleccionats per a esborrar",
"firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "No es pot mostrar la previsualització",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "S'ha desat a {filename}",
"canvas": "el llenç",
"selection": "la selecció",
"pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent"
},
"colors": {
"transparent": "Transparent",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Zabalit text do kontejneru",
"link": {
"edit": "Upravit odkaz",
"editEmbed": "",
"create": "Vytvořit odkaz",
"createEmbed": "",
"label": "Odkaz",
"labelEmbed": "",
"empty": ""
"label": "Odkaz"
},
"lineEditor": {
"edit": "Upravit čáru",
@@ -164,16 +160,13 @@
"darkMode": "Tmavý režim",
"lightMode": "Světlý režim",
"zenMode": "Zen mód",
"objectsSnapMode": "",
"exitZenMode": "Opustit zen mód",
"cancel": "Zrušit",
"clear": "Vyčistit",
"remove": "Odstranit",
"embed": "",
"publishLibrary": "Zveřejnit",
"submit": "Odeslat",
"confirm": "Potvrdit",
"embeddableInteractionButton": ""
"confirm": "Potvrdit"
},
"alerts": {
"clearReset": "Toto vymaže celé plátno. Jste si jisti?",
@@ -203,7 +196,6 @@
"imageInsertError": "Nelze vložit obrázek. Zkuste to později...",
"fileTooBig": "Soubor je příliš velký. Maximální povolená velikost je {{maxSize}}.",
"svgImageInsertError": "Nelze vložit SVG obrázek. Značení SVG je neplatné.",
"failedToFetchImage": "",
"invalidSVGString": "Neplatný SVG.",
"cannotResolveCollabServer": "Nelze se připojit ke sdílenému serveru. Prosím obnovte stránku a zkuste to znovu.",
"importLibraryError": "Nelze načíst knihovnu",
@@ -214,10 +206,6 @@
"line2": "To by mohlo vést k narušení <bold>Textových elementů</bold> ve vašich výkresech.",
"line3": "Důrazně doporučujeme zakázat toto nastavení. Můžete sledovat <link>tyto kroky</link> jak to udělat.",
"line4": "Pokud vypnutí tohoto nastavení neopravuje zobrazení textových prvků, prosím, otevřete <issueLink>problém</issueLink> na našem GitHubu, nebo nám napište na <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Přidat/aktualizovat odkaz pro vybraný tvar",
"eraser": "Guma",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Ruka (nástroj pro posouvání)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Kliknutím pro více bodů, táhnutím pro jednu čáru",
"freeDraw": "Klikněte a táhněte, pro ukončení pusťte",
"text": "Tip: Text můžete také přidat dvojitým kliknutím kdekoli pomocí nástroje pro výběr",
"embeddable": "",
"text_selected": "Dvojklikem nebo stisknutím klávesy ENTER upravíte text",
"text_editing": "Stiskněte Escape nebo Ctrl/Cmd+ENTER pro dokončení úprav",
"linearElementMulti": "Klikněte na poslední bod nebo stiskněte Escape anebo Enter pro dokončení",
@@ -267,8 +252,7 @@
"bindTextToElement": "Stiskněte Enter pro přidání textu",
"deepBoxSelect": "Podržte Ctrl/Cmd pro hluboký výběr a pro zabránění táhnutí",
"eraserRevert": "Podržením klávesy Alt vrátíte prvky označené pro smazání",
"firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Náhled nelze zobrazit",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Uloženo do {filename}",
"canvas": "plátno",
"selection": "výběr",
"pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru"
},
"colors": {
"transparent": "Průhledná",
@@ -467,36 +449,5 @@
"shades": "Stíny",
"hexCode": "Hex kód",
"noShades": "Pro tuto barvu nejsou k dispozici žádné odstíny"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+8 -57
View File
@@ -1,7 +1,7 @@
{
"labels": {
"paste": "Indsæt",
"pasteAsPlaintext": "Indsæt som klartekst",
"pasteAsPlaintext": "",
"pasteCharts": "Indsæt diagrammer",
"selectAll": "Marker alle",
"multiSelect": "Tilføj element til markering",
@@ -50,7 +50,7 @@
"veryLarge": "Meget stor",
"solid": "Solid",
"hachure": "Skravering",
"zigzag": "Zigzag",
"zigzag": "",
"crossHatch": "Krydsskravering",
"thin": "Tynd",
"bold": "Fed",
@@ -69,8 +69,8 @@
"layers": "Lag",
"actions": "Handlinger",
"language": "Sprog",
"liveCollaboration": "Live samarbejde...",
"duplicateSelection": "Duplikér",
"liveCollaboration": "",
"duplicateSelection": "",
"untitled": "Unavngivet",
"name": "Navn",
"yourName": "Dit navn",
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "Mørk tilstand",
"lightMode": "Lys baggrund",
"zenMode": "Zentilstand",
"objectsSnapMode": "",
"exitZenMode": "Stop zentilstand",
"cancel": "Annuller",
"clear": "Ryd",
"remove": "Fjern",
"embed": "",
"publishLibrary": "Publicér",
"submit": "Gem",
"confirm": "Bekræft",
"embeddableInteractionButton": ""
"confirm": "Bekræft"
},
"alerts": {
"clearReset": "Dette vil rydde hele lærredet. Er du sikker?",
@@ -203,7 +196,6 @@
"imageInsertError": "",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "",
"freeDraw": "Klik og træk, slip når du er færdig",
"text": "",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Gemt som {filename}",
"canvas": "canvas",
"selection": "markering",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Text in Container einbetten",
"link": {
"edit": "Link bearbeiten",
"editEmbed": "Link bearbeiten & einbetten",
"create": "Link erstellen",
"createEmbed": "Link erstellen & einbetten",
"label": "Link",
"labelEmbed": "Verlinken & einbetten",
"empty": "Kein Link festgelegt"
"label": "Link"
},
"lineEditor": {
"edit": "Linie bearbeiten",
@@ -164,16 +160,13 @@
"darkMode": "Dunkles Design",
"lightMode": "Helles Design",
"zenMode": "Zen-Modus",
"objectsSnapMode": "Einrasten an Objekten",
"exitZenMode": "Zen-Modus verlassen",
"cancel": "Abbrechen",
"clear": "Löschen",
"remove": "Entfernen",
"embed": "Einbettung umschalten",
"publishLibrary": "Veröffentlichen",
"submit": "Absenden",
"confirm": "Bestätigen",
"embeddableInteractionButton": "Klicken, um zu interagieren"
"confirm": "Bestätigen"
},
"alerts": {
"clearReset": "Dies wird die ganze Zeichenfläche löschen. Bist du dir sicher?",
@@ -203,7 +196,6 @@
"imageInsertError": "Das Bild konnte nicht eingefügt werden. Versuche es später erneut...",
"fileTooBig": "Die Datei ist zu groß. Die maximal zulässige Größe ist {{maxSize}}.",
"svgImageInsertError": "SVG-Bild konnte nicht eingefügt werden. Das SVG-Markup sieht ungültig aus.",
"failedToFetchImage": "Bild konnte nicht abgerufen werden.",
"invalidSVGString": "Ungültige SVG.",
"cannotResolveCollabServer": "Konnte keine Verbindung zum Collab-Server herstellen. Bitte lade die Seite neu und versuche es erneut.",
"importLibraryError": "Bibliothek konnte nicht geladen werden",
@@ -214,10 +206,6 @@
"line2": "Dies könnte dazu führen, dass die <bold>Textelemente</bold> in Ihren Zeichnungen zerstört werden.",
"line3": "Wir empfehlen dringend, diese Einstellung zu deaktivieren. Dazu kannst Du <link>diesen Schritten</link> folgen.",
"line4": "Wenn die Deaktivierung dieser Einstellung die fehlerhafte Anzeige von Textelementen nicht behebt, öffne bitte ein <issueLink>Ticket</issueLink> auf unserem GitHub oder schreibe uns auf <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Einbettbare Elemente können der Bibliothek nicht hinzugefügt werden.",
"image": "Unterstützung für das Hinzufügen von Bildern in die Bibliothek kommt bald!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Link für ausgewählte Form hinzufügen / aktualisieren",
"eraser": "Radierer",
"frame": "Rahmenwerkzeug",
"embeddable": "Web-Einbettung",
"laser": "Laserpointer",
"hand": "Hand (Schwenkwerkzeug)",
"extraTools": "Weitere Werkzeuge"
},
@@ -251,7 +237,6 @@
"linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie",
"freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist",
"text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst",
"embeddable": "Klicken und ziehen, um eine Webseiten-Einbettung zu erstellen",
"text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten",
"text_editing": "Drücke Escape oder CtrlOrCmd+Eingabetaste, um die Bearbeitung abzuschließen",
"linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken",
@@ -267,8 +252,7 @@
"bindTextToElement": "Zum Hinzufügen Eingabetaste drücken",
"deepBoxSelect": "Halte CtrlOrCmd gedrückt, um innerhalb der Gruppe auszuwählen, und um Ziehen zu vermeiden",
"eraserRevert": "Halte Alt gedrückt, um die zum Löschen markierten Elemente zurückzusetzen",
"firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\".",
"disableSnapping": "Halte CtrlOrCmd gedrückt, um das Einrasten zu deaktivieren"
"firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Als {filename} gespeichert",
"canvas": "Zeichenfläche",
"selection": "Auswahl",
"pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen",
"unableToEmbed": "Einbetten dieser URL ist derzeit nicht zulässig. Erstelle einen Issue auf GitHub, um die URL freigeben zu lassen",
"unrecognizedLinkFormat": "Der Link, den Du eingebettet hast, stimmt nicht mit dem erwarteten Format überein. Bitte versuche den 'embed' String einzufügen, der von der Quellseite zur Verfügung gestellt wird"
"pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen"
},
"colors": {
"transparent": "Transparent",
@@ -467,36 +449,5 @@
"shades": "Schattierungen",
"hexCode": "Hex-Code",
"noShades": "Keine Schattierungen für diese Farbe verfügbar"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Als Bild exportieren",
"button": "Als Bild exportieren",
"description": "Exportiere die Zeichnungsdaten als ein Bild, von dem Du später importieren kannst."
},
"saveToDisk": {
"title": "Auf Festplatte speichern",
"button": "Auf Festplatte speichern",
"description": "Exportiere die Zeichnungsdaten in eine Datei, von der Du später importieren kannst."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Export nach Excalidraw+",
"description": "Speichere die Szene in deinem Excalidraw+-Arbeitsbereich."
}
},
"modal": {
"loadFromFile": {
"title": "Aus Datei laden",
"button": "Aus Datei laden",
"description": "Das Laden aus einer Datei wird <bold>Deinen vorhandenen Inhalt ersetzen</bold>.<br></br>Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern."
},
"shareableLink": {
"title": "Aus Link laden",
"button": "Meinen Inhalt ersetzen",
"description": "Das Laden einer externen Zeichnung wird <bold>Deinen vorhandenen Inhalt ersetzen</bold>.<br></br>Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Επεξεργασία συνδέσμου",
"editEmbed": "",
"create": "Δημιουργία συνδέσμου",
"createEmbed": "",
"label": "Σύνδεσμος",
"labelEmbed": "",
"empty": ""
"label": "Σύνδεσμος"
},
"lineEditor": {
"edit": "Επεξεργασία γραμμής",
@@ -164,16 +160,13 @@
"darkMode": "Σκοτεινή λειτουργία",
"lightMode": "Φωτεινή λειτουργία",
"zenMode": "Λειτουργία Zεν",
"objectsSnapMode": "",
"exitZenMode": "Έξοδος από την λειτουργία Zen",
"cancel": "Ακύρωση",
"clear": "Καθαρισμός",
"remove": "Κατάργηση",
"embed": "",
"publishLibrary": "Δημοσίευση",
"submit": "Υποβολή",
"confirm": "Επιβεβαίωση",
"embeddableInteractionButton": ""
"confirm": "Επιβεβαίωση"
},
"alerts": {
"clearReset": "Αυτό θα σβήσει ολόκληρο τον καμβά. Είσαι σίγουρος;",
@@ -203,7 +196,6 @@
"imageInsertError": "Αδυναμία εισαγωγής εικόνας. Προσπαθήστε ξανά αργότερα...",
"fileTooBig": "Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπόμενο μέγεθος είναι {{maxSize}}.",
"svgImageInsertError": "Αδυναμία εισαγωγής εικόνας SVG. Η σήμανση της SVG δεν φαίνεται έγκυρη.",
"failedToFetchImage": "",
"invalidSVGString": "Μη έγκυρο SVG.",
"cannotResolveCollabServer": "Αδυναμία σύνδεσης με τον διακομιστή συνεργασίας. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.",
"importLibraryError": "Αδυναμία φόρτωσης βιβλιοθήκης",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Προσθήκη/ Ενημέρωση συνδέσμου για ένα επιλεγμένο σχήμα",
"eraser": "Γόμα",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή",
"freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει",
"text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών",
"embeddable": "",
"text_selected": "Κάντε διπλό κλικ ή πατήστε ENTER για να επεξεργαστείτε το κείμενο",
"text_editing": "Πατήστε Escape ή CtrlOrCmd+ENTER για να ολοκληρώσετε την επεξεργασία",
"linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις",
@@ -267,8 +252,7 @@
"bindTextToElement": "Πατήστε Enter για προσθήκη κειμένου",
"deepBoxSelect": "Κρατήστε πατημένο το CtrlOrCmd για να επιλέξετε βαθιά, και να αποτρέψετε τη μεταφορά",
"eraserRevert": "Κρατήστε πατημένο το Alt για να επαναφέρετε τα στοιχεία που σημειώθηκαν για διαγραφή",
"firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Αποθηκεύτηκε στο {filename}",
"canvas": "καμβάς",
"selection": "επιλογή",
"pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου"
},
"colors": {
"transparent": "Διαφανές",
@@ -467,36 +449,5 @@
"shades": "Αποχρώσεις",
"hexCode": "Κωδικός Hex",
"noShades": "Δεν υπάρχουν διαθέσιμες αποχρώσεις για αυτό το χρώμα"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
-1
View File
@@ -203,7 +203,6 @@
"imageInsertError": "Couldn't insert image. Try again later...",
"fileTooBig": "File is too big. Maximum allowed size is {{maxSize}}.",
"svgImageInsertError": "Couldn't insert SVG image. The SVG markup looks invalid.",
"failedToFetchImage": "Failed to fetch image.",
"invalidSVGString": "Invalid SVG.",
"cannotResolveCollabServer": "Couldn't connect to the collab server. Please reload the page and try again.",
"importLibraryError": "Couldn't load library",
+41 -90
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Envolver el texto en un contenedor",
"link": {
"edit": "Editar enlace",
"editEmbed": "Editar enlace e incrustar",
"create": "Crear enlace",
"createEmbed": "Crear enlace e incrustar",
"label": "Enlace",
"labelEmbed": "Enlazar e incrustar",
"empty": "No se ha establecido un enlace"
"label": "Enlace"
},
"lineEditor": {
"edit": "Editar línea",
@@ -128,9 +124,9 @@
},
"statusPublished": "Publicado",
"sidebarLock": "Mantener barra lateral abierta",
"selectAllElementsInFrame": "Seleccionar todos los elementos en el marco",
"removeAllElementsFromFrame": "Eliminar todos los elementos del marco",
"eyeDropper": "Seleccionar un color del lienzo"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "No hay elementos añadidos todavía...",
@@ -164,16 +160,13 @@
"darkMode": "Modo oscuro",
"lightMode": "Modo claro",
"zenMode": "Modo Zen",
"objectsSnapMode": "Ajustar a los objetos",
"exitZenMode": "Salir del modo Zen",
"cancel": "Cancelar",
"clear": "Borrar",
"remove": "Eliminar",
"embed": "",
"publishLibrary": "Publicar",
"submit": "Enviar",
"confirm": "Confirmar",
"embeddableInteractionButton": "Pulsa para interactuar"
"confirm": "Confirmar"
},
"alerts": {
"clearReset": "Esto limpiará todo el lienzo. Estás seguro?",
@@ -203,21 +196,16 @@
"imageInsertError": "No se pudo insertar la imagen. Inténtelo de nuevo más tarde...",
"fileTooBig": "Archivo demasiado grande. El tamaño máximo permitido es {{maxSize}}.",
"svgImageInsertError": "No se pudo insertar la imagen SVG. El código SVG parece inválido.",
"failedToFetchImage": "",
"invalidSVGString": "SVG no válido.",
"cannotResolveCollabServer": "No se pudo conectar al servidor colaborador. Por favor, vuelva a cargar la página y vuelva a intentarlo.",
"importLibraryError": "No se pudo cargar la librería",
"collabSaveFailed": "No se pudo guardar en la base de datos del backend. Si los problemas persisten, debería guardar su archivo localmente para asegurarse de que no pierde su trabajo.",
"collabSaveFailed_sizeExceeded": "No se pudo guardar en la base de datos del backend, el lienzo parece ser demasiado grande. Debería guardar el archivo localmente para asegurarse de que no pierde su trabajo.",
"brave_measure_text_error": {
"line1": "Parece que estás usando el navegador Brave con el ajuste <bold>Forzar el bloqueo de huellas digitales</bold> habilitado.",
"line2": "Esto podría resultar en errores en los <bold>Elementos de Texto</bold> en tus dibujos.",
"line3": "Recomendamos fuertemente deshabilitar esta configuración. Puedes seguir <link>estos pasos</link> sobre cómo hacerlo.",
"line1": "",
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,10 +224,8 @@
"link": "Añadir/Actualizar enlace para una forma seleccionada",
"eraser": "Borrar",
"frame": "",
"embeddable": "Incrustar Web",
"laser": "Puntero láser",
"hand": "Mano (herramienta de panoramización)",
"extraTools": "Más herramientas"
"extraTools": ""
},
"headings": {
"canvasActions": "Acciones del lienzo",
@@ -251,7 +237,6 @@
"linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea",
"freeDraw": "Haz clic y arrastra, suelta al terminar",
"text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección",
"embeddable": "Haga clic y arrastre para crear un sitio web incrustado",
"text_selected": "Doble clic o pulse ENTER para editar el texto",
"text_editing": "Pulse Escape o Ctrl/Cmd + ENTER para terminar de editar",
"linearElementMulti": "Haz clic en el último punto o presiona Escape o Enter para finalizar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Presione Entrar para agregar",
"deepBoxSelect": "Mantén CtrlOrCmd para seleccionar en profundidad, y para evitar arrastrar",
"eraserRevert": "Mantenga pulsado Alt para revertir los elementos marcados para su eliminación",
"firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\".",
"disableSnapping": "Mantén pulsado CtrlOrCmd para desactivar el ajuste"
"firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "No se puede mostrar la vista previa",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "Eliminar elementos seleccionados de la biblioteca"
},
"imageExportDialog": {
"header": "Exportar imagen",
"header": "",
"label": {
"withBackground": "Fondo",
"onlySelected": "Sólo seleccionados",
"darkMode": "Modo oscuro",
"embedScene": "Incrustar escena",
"scale": "Escalar",
"padding": "Espaciado"
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": ""
},
"title": {
"exportToPng": "Exportar a PNG",
"exportToSvg": "Exportar a SVG",
"copyPngToClipboard": "Copiar PNG al portapapeles"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Copiar al portapapeles"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,26 +411,24 @@
"fileSavedToFilename": "Guardado en {filename}",
"canvas": "lienzo",
"selection": "selección",
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente"
},
"colors": {
"transparent": "Transparente",
"black": "Negro",
"white": "Blanco",
"red": "Rojo",
"pink": "Rosa",
"grape": "Uva",
"violet": "Violeta",
"gray": "Gris",
"blue": "Azul",
"cyan": "Cian",
"teal": "Turquesa",
"green": "Verde",
"yellow": "Amarillo",
"orange": "Naranja",
"bronze": "Bronce"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -462,41 +444,10 @@
}
},
"colorPicker": {
"mostUsedCustomColors": "Colores personalizados más utilizados",
"colors": "Colores",
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "Código Hexadecimal",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportar como imagen",
"button": "Exportar como imagen",
"description": ""
},
"saveToDisk": {
"title": "Guardar en el disco",
"button": "Guardar en el disco",
"description": "Exporta los datos de la escena a un archivo desde el cual podrás importar más tarde."
},
"excalidrawPlus": {
"title": "",
"button": "Exportar a Excalidraw+",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "Cargar desde un archivo",
"button": "Cargar desde un archivo",
"description": ""
},
"shareableLink": {
"title": "Cargar desde un enlace",
"button": "Reemplazar mi contenido",
"description": "Cargar un dibujo externo <bold>reemplazará tu contenido existente</bold>.<br></br>Puedes primero hacer una copia de seguridad de tu dibujo usando una de las opciones de abajo."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Bilatu testua edukiontzi batean",
"link": {
"edit": "Editatu esteka",
"editEmbed": "Editatu esteka eta kapsulatu",
"create": "Sortu esteka",
"createEmbed": "Sortu esteka eta kapsulatu",
"label": "Esteka",
"labelEmbed": "Esteka eta kapsula",
"empty": "Ez da estekarik ezarri"
"label": "Esteka"
},
"lineEditor": {
"edit": "Editatu lerroa",
@@ -164,16 +160,13 @@
"darkMode": "Modu iluna",
"lightMode": "Modu argia",
"zenMode": "Zen modua",
"objectsSnapMode": "Atxiki objektuei",
"exitZenMode": "Irten Zen modutik",
"cancel": "Utzi",
"clear": "Garbitu",
"remove": "Kendu",
"embed": "Aldatu kapsulatzea",
"publishLibrary": "Argitaratu",
"submit": "Bidali",
"confirm": "Bai",
"embeddableInteractionButton": "Egin klik elkar eragiteko"
"confirm": "Bai"
},
"alerts": {
"clearReset": "Honek oihal osoa garbituko du. Ziur zaude?",
@@ -203,7 +196,6 @@
"imageInsertError": "Ezin izan da irudia txertatu. Saiatu berriro geroago...",
"fileTooBig": "Fitxategia handiegia da. Onartutako gehienezko tamaina {{maxSize}} da.",
"svgImageInsertError": "Ezin izan da SVG irudia txertatu. SVG markak baliogabea dirudi.",
"failedToFetchImage": "",
"invalidSVGString": "SVG baliogabea.",
"cannotResolveCollabServer": "Ezin izan da elkarlaneko zerbitzarira konektatu. Mesedez, berriro kargatu orria eta saiatu berriro.",
"importLibraryError": "Ezin izan da liburutegia kargatu",
@@ -214,10 +206,6 @@
"line2": "Honek zure marrazkietako <bold>Testu-elementuak</bold> hautsi ditzake.",
"line3": "Ezarpen hau desgaitzea gomendatzen dugu. <link>urrats hauek</link> jarrai ditzakezu hori nola egin jakiteko.",
"line4": "Ezarpen hau desgaituz gero, testu-elementuen bistaratzea konpontzen ez bada, ireki <issueLink>arazo</issueLink> gure GitHub-en edo idatzi iezaguzu <discordLink>Discord</discordLink> helbidera"
},
"libraryElementTypeError": {
"embeddable": "Kapsulatutako elementuak ezin dira liburutegira gehitu.",
"image": "Laster egongo da irudiak liburutegian gehitzeko laguntza!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Gehitu / Eguneratu esteka hautatutako forma baterako",
"eraser": "Borragoma",
"frame": "Marko tresna",
"embeddable": "Web kapsulatzea",
"laser": "Laser punteroa",
"hand": "Eskua (panoratze tresna)",
"extraTools": "Tresna gehiago"
},
@@ -251,7 +237,6 @@
"linearElement": "Egin klik hainbat puntu hasteko, arrastatu lerro bakarrerako",
"freeDraw": "Egin klik eta arrastatu, askatu amaitutakoan",
"text": "Aholkua: testua gehitu dezakezu edozein lekutan klik bikoitza eginez hautapen tresnarekin",
"embeddable": "Egin klik eta arrastatu webgunea kapsulatzeko",
"text_selected": "Egin klik bikoitza edo sakatu SARTU testua editatzeko",
"text_editing": "Sakatu Esc edo Ctrl+SARTU editatzen amaitzeko",
"linearElementMulti": "Egin klik azken puntuan edo sakatu Esc edo Sartu amaitzeko",
@@ -267,8 +252,7 @@
"bindTextToElement": "Sakatu Sartu testua gehitzeko",
"deepBoxSelect": "Eutsi Ctrl edo Cmd sakatuta aukeraketa sakona egiteko eta arrastatzea saihesteko",
"eraserRevert": "Eduki Alt sakatuta ezabatzeko markatutako elementuak leheneratzeko",
"firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera.",
"disableSnapping": "Eduki sakatuta Ctrl edo Cmd tekla atxikipena desgaitzeko"
"firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera."
},
"canvasError": {
"cannotShowPreview": "Ezin da oihala aurreikusi",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "{filename}-n gorde da",
"canvas": "oihala",
"selection": "hautapena",
"pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean",
"unableToEmbed": "Url hau txertatzea ez da une honetan onartzen. Sortu issue bat GitHub-en Urla zerrenda zurian sartzea eskatzeko",
"unrecognizedLinkFormat": "Kapsulatu duzun esteka ez dator bat espero den formatuarekin. Mesedez, saiatu iturburu-guneak emandako 'kapsulatu' katea itsasten"
"pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean"
},
"colors": {
"transparent": "Gardena",
@@ -467,36 +449,5 @@
"shades": "Ñabardurak",
"hexCode": "Hez kodea",
"noShades": "Kolore honetarako ez dago ñabardurarik eskuragarri"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Esportatu irudi gisa",
"button": "Esportatu irudi gisa",
"description": "Esportatu eszenaren datuak geroago inportatu ahal izango duzun irudi gisa."
},
"saveToDisk": {
"title": "Gorde diskoan",
"button": "Gorde diskoan",
"description": "Esportatu eszenaren datuak geroago inportatu ahal izango duzun fitxategi batan."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Esportatu Excalidraw+ra",
"description": "Gorde eszena zure Excalidraw+ laneko areara."
}
},
"modal": {
"loadFromFile": {
"title": "Fitxategitik kargatu",
"button": "Fitxategitik kargatu",
"description": "Fitxategi batetik kargatzeak <bold>lehendik duzun edukia ordezkatuko du</bold>.<br></br>Lehenengo marrazkiaren babeskopia egin dezakezu beheko aukeretako bat erabiliz."
},
"shareableLink": {
"title": "Estekatik kargatu",
"button": "Ordeztu nire edukia",
"description": "Kanpoko irudi bat kargatzeak <bold>lehendik duzun edukia ordezkatuko du</bold>.<br></br>. Zure marrazkiaren babeskopia egin dezakezu lehenik beheko aukeretako bat erabiliz."
}
}
}
}
+24 -73
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "متن را در یک جایگاه بپیچید",
"link": {
"edit": "ویرایش لینک",
"editEmbed": "",
"create": "ایجاد پیوند",
"createEmbed": "",
"label": "لینک",
"labelEmbed": "",
"empty": ""
"label": "لینک"
},
"lineEditor": {
"edit": "ویرایش لینک",
@@ -130,7 +126,7 @@
"sidebarLock": "باز نگه داشتن سایدبار",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": "انتخاب رنگ از کرباس"
"eyeDropper": ""
},
"library": {
"noItems": "آیتمی به اینجا اضافه نشده...",
@@ -164,16 +160,13 @@
"darkMode": "حالت تیره",
"lightMode": "حالت روشن",
"zenMode": "حالت ذن",
"objectsSnapMode": "",
"exitZenMode": "خروج از حالت تمرکز",
"cancel": "لغو",
"clear": "پاک کردن",
"remove": "پاک کردن",
"embed": "",
"publishLibrary": "انتشار",
"submit": "ارسال",
"confirm": "تایید",
"embeddableInteractionButton": ""
"confirm": "تایید"
},
"alerts": {
"clearReset": "این کار کل صفحه را پاک میکند. آیا مطمئنید؟",
@@ -203,7 +196,6 @@
"imageInsertError": "عکس ارسال نشد. بعداً دوباره تلاش کنید...",
"fileTooBig": "فایل خیلی بزرگ است حداکثر اندازه مجاز {{maxSize}}.",
"svgImageInsertError": "تصویر SVG وارد نشد. نشانه گذاری SVG نامعتبر به نظر می رسد.",
"failedToFetchImage": "",
"invalidSVGString": "SVG نادرست.",
"cannotResolveCollabServer": "به سرور collab متصل نشد. لطفا صفحه را مجددا بارگذاری کنید و دوباره تلاش کنید.",
"importLibraryError": "داده‌ها بارگذاری نشدند",
@@ -214,10 +206,6 @@
"line2": "این می تواند منجر به شکستن <bold>عناصر متن</bold> در نقاشی های شما شود.",
"line3": "اکیداً توصیه می کنیم این تنظیم را غیرفعال کنید. برای نحوه انجام این کار می‌توانید <link>این مراحل</link> را دنبال کنید.",
"line4": "اگر غیرفعال کردن این تنظیم نمایش عناصر متنی را برطرف نکرد، لطفاً یک <issueLink>مشکل</issueLink> را در GitHub ما باز کنید یا برای ما در <discordLink>Discord</discordLink> بنویسید."
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,10 +224,8 @@
"link": "افزودن/به‌روزرسانی پیوند برای شکل انتخابی",
"eraser": "پاک کن",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "دست (ابزار پانینگ)",
"extraTools": "ابزارهای بیشتر"
"extraTools": ""
},
"headings": {
"canvasActions": "عملیات روی بوم",
@@ -251,7 +237,6 @@
"linearElement": "برای چند نقطه کلیک و برای یک خط بکشید",
"freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید",
"text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید",
"embeddable": "",
"text_selected": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید",
"text_editing": "Escape یا CtrlOrCmd+ENTER را فشار دهید تا ویرایش تمام شود",
"linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار",
@@ -267,8 +252,7 @@
"bindTextToElement": "برای افزودن اینتر را بزنید",
"deepBoxSelect": "CtrlOrCmd را برای انتخاب عمیق و جلوگیری از کشیدن نگه دارید",
"eraserRevert": "Alt را نگه دارید تا عناصر علامت گذاری شده برای حذف برگردند",
"firefox_clipboard_write": "احتمالاً می‌توان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید.",
"disableSnapping": ""
"firefox_clipboard_write": "احتمالاً می‌توان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید."
},
"canvasError": {
"cannotShowPreview": "پیش نمایش نشان داده نمی شود",
@@ -378,7 +362,7 @@
"imageExportDialog": {
"header": "",
"label": {
"withBackground": "پس زمینه",
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
@@ -427,26 +411,24 @@
"fileSavedToFilename": "ذخیره در {filename}",
"canvas": "بوم",
"selection": "انتخاب",
"pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید"
},
"colors": {
"transparent": "شفاف",
"black": "سیاه",
"white": "سفید",
"red": "قرمز",
"pink": "صورتی",
"grape": "یاقوتی",
"violet": "بنفش",
"gray": "خاکستری",
"blue": "آبی",
"cyan": "فیروزه‌ای",
"teal": "سبزآبی",
"green": "سبز",
"yellow": "زرد",
"orange": "نارنجی",
"bronze": "برنزی"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -463,40 +445,9 @@
},
"colorPicker": {
"mostUsedCustomColors": "",
"colors": "رنگ‌ها",
"shades": "جلوه‌ها",
"hexCode": "کدِ هگز",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "ذخیره در دیسک",
"button": "ذخیره در دیسک",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "بارگذاری از فایل",
"button": "بارگذاری از فایل",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Muokkaa linkkiä",
"editEmbed": "",
"create": "Luo linkki",
"createEmbed": "",
"label": "Linkki",
"labelEmbed": "",
"empty": ""
"label": "Linkki"
},
"lineEditor": {
"edit": "Muokkaa riviä",
@@ -164,16 +160,13 @@
"darkMode": "Tumma tila",
"lightMode": "Vaalea tila",
"zenMode": "Zen-tila",
"objectsSnapMode": "",
"exitZenMode": "Poistu zen-tilasta",
"cancel": "Peruuta",
"clear": "Pyyhi",
"remove": "Poista",
"embed": "",
"publishLibrary": "Julkaise",
"submit": "Lähetä",
"confirm": "Vahvista",
"embeddableInteractionButton": ""
"confirm": "Vahvista"
},
"alerts": {
"clearReset": "Tämä tyhjentää koko piirtoalueen. Jatketaanko?",
@@ -203,7 +196,6 @@
"imageInsertError": "Kuvan lisääminen epäonnistui. Yritä myöhemmin uudelleen...",
"fileTooBig": "Tiedosto on liian suuri. Suurin sallittu koko on {{maxSize}}.",
"svgImageInsertError": "SVG- kuvaa ei voitu lisätä. Tiedoston SVG-sisältö näyttää virheelliseltä.",
"failedToFetchImage": "",
"invalidSVGString": "Virheellinen SVG.",
"cannotResolveCollabServer": "Yhteyden muodostaminen collab-palvelimeen epäonnistui. Virkistä sivu ja yritä uudelleen.",
"importLibraryError": "Kokoelman lataaminen epäonnistui",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Lisää/päivitä linkki valitulle muodolle",
"eraser": "Poistotyökalu",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Käsi (panning-työkalu)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Klikkaa piirtääksesi useampi piste, raahaa piirtääksesi yksittäinen viiva",
"freeDraw": "Paina ja raahaa, päästä irti kun olet valmis",
"text": "Vinkki: voit myös lisätä tekstiä kaksoisnapsauttamalla mihin tahansa valintatyökalulla",
"embeddable": "",
"text_selected": "Kaksoisnapsauta tai paina ENTER muokataksesi tekstiä",
"text_editing": "Paina Escape tai CtrlOrCmd+ENTER lopettaaksesi muokkaamisen",
"linearElementMulti": "Lopeta klikkaamalla viimeistä pistettä, painamalla Escape- tai Enter-näppäintä",
@@ -267,8 +252,7 @@
"bindTextToElement": "Lisää tekstiä painamalla enter",
"deepBoxSelect": "Käytä syvävalintaa ja estä raahaus painamalla CtrlOrCmd",
"eraserRevert": "Pidä Alt alaspainettuna, kumotaksesi merkittyjen elementtien poistamisen",
"firefox_clipboard_write": "Tämä ominaisuus voidaan todennäköisesti ottaa käyttöön asettamalla \"dom.events.asyncClipboard.clipboardItem\" kohta \"true\":ksi. Vaihtaaksesi selaimen kohdan Firefoxissa, käy \"about:config\" sivulla.",
"disableSnapping": ""
"firefox_clipboard_write": "Tämä ominaisuus voidaan todennäköisesti ottaa käyttöön asettamalla \"dom.events.asyncClipboard.clipboardItem\" kohta \"true\":ksi. Vaihtaaksesi selaimen kohdan Firefoxissa, käy \"about:config\" sivulla."
},
"canvasError": {
"cannotShowPreview": "Esikatselua ei voitu näyttää",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Tallennettiin kohteeseen {filename}",
"canvas": "piirtoalue",
"selection": "valinta",
"pasteAsSingleElement": "Käytä {{shortcut}} liittääksesi yhtenä elementtinä,\ntai liittääksesi olemassa olevaan tekstieditoriin",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Käytä {{shortcut}} liittääksesi yhtenä elementtinä,\ntai liittääksesi olemassa olevaan tekstieditoriin"
},
"colors": {
"transparent": "Läpinäkyvä",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+45 -94
View File
@@ -50,7 +50,7 @@
"veryLarge": "Très grande",
"solid": "Solide",
"hachure": "Hachures",
"zigzag": "Zigzag",
"zigzag": "",
"crossHatch": "Hachures croisées",
"thin": "Fine",
"bold": "Épaisse",
@@ -109,12 +109,8 @@
"createContainerFromText": "Encadrer le texte dans un conteneur",
"link": {
"edit": "Modifier le lien",
"editEmbed": "Éditer le lien & intégrer",
"create": "Ajouter un lien",
"createEmbed": "Créer un lien & intégrer",
"label": "Lien",
"labelEmbed": "",
"empty": "Aucun lien défini"
"label": "Lien"
},
"lineEditor": {
"edit": "Modifier la ligne",
@@ -128,8 +124,8 @@
},
"statusPublished": "Publié",
"sidebarLock": "Maintenir la barre latérale ouverte",
"selectAllElementsInFrame": "Sélectionner tous les éléments du cadre",
"removeAllElementsFromFrame": "Supprimer tous les éléments du cadre",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
@@ -164,16 +160,13 @@
"darkMode": "Mode sombre",
"lightMode": "Mode clair",
"zenMode": "Mode zen",
"objectsSnapMode": "Aimanter aux objets",
"exitZenMode": "Quitter le mode zen",
"cancel": "Annuler",
"clear": "Effacer",
"remove": "Supprimer",
"embed": "Activer/Désactiver l'intégration",
"publishLibrary": "Publier",
"submit": "Envoyer",
"confirm": "Confirmer",
"embeddableInteractionButton": "Cliquez pour interagir"
"confirm": "Confirmer"
},
"alerts": {
"clearReset": "L'intégralité du canevas va être effacée. Êtes-vous sûr ?",
@@ -203,21 +196,16 @@
"imageInsertError": "Impossible d'insérer l'image. Réessayez plus tard...",
"fileTooBig": "Le fichier est trop volumineux. La taille maximale autorisée est de {{maxSize}}.",
"svgImageInsertError": "Impossible d'insérer l'image SVG. Le balisage SVG semble invalide.",
"failedToFetchImage": "",
"invalidSVGString": "SVG invalide.",
"cannotResolveCollabServer": "Impossible de se connecter au serveur collaboratif. Veuillez recharger la page et réessayer.",
"importLibraryError": "Impossible de charger la bibliothèque",
"collabSaveFailed": "Impossible d'enregistrer dans la base de données en arrière-plan. Si des problèmes persistent, vous devriez enregistrer votre fichier localement pour vous assurer de ne pas perdre votre travail.",
"collabSaveFailed_sizeExceeded": "Impossible d'enregistrer dans la base de données en arrière-plan, le tableau semble trop grand. Vous devriez enregistrer le fichier localement pour vous assurer de ne pas perdre votre travail.",
"brave_measure_text_error": {
"line1": "On dirait que vous utilisez le navigateur Brave avec l'option <bold>Bloquer agressivement le fichage</bold> activée.",
"line2": "Cela pourrait entraîner des problèmes avec les <bold>Éléments Textuels</bold> dans vos dessins.",
"line3": "Nous recommandons fortement de désactiver cette option. Vous pouvez suivre <link>ces instructions</link> pour savoir comment faire.",
"line4": "Si désactiver cette option de résout pas le problème d'affichage des éléments textuels, veuillez ouvrir un <issueLink>ticket</issueLink> sur notre GitHub, ou écrivez-nous sur notre <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Les éléments intégrés ne peuvent pas être ajoutés à la librairie.",
"image": "Le support pour l'ajout d'images à la librairie arrive bientôt !"
"line1": "",
"line2": "",
"line3": "",
"line4": ""
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Mode stylo - évite le toucher",
"link": "Ajouter/mettre à jour le lien pour une forme sélectionnée",
"eraser": "Gomme",
"frame": "Outil de cadre",
"embeddable": "Intégration Web",
"laser": "",
"frame": "",
"hand": "Mains (outil de déplacement de la vue)",
"extraTools": "Plus d'outils"
"extraTools": ""
},
"headings": {
"canvasActions": "Actions du canevas",
@@ -251,7 +237,6 @@
"linearElement": "Cliquez pour démarrer plusieurs points, faites glisser pour une seule ligne",
"freeDraw": "Cliquez et faites glissez, relâchez quand vous avez terminé",
"text": "Astuce : vous pouvez aussi ajouter du texte en double-cliquant n'importe où avec l'outil de sélection",
"embeddable": "Cliquez et glissez pour créer une intégration de site web",
"text_selected": "Double-cliquez ou appuyez sur ENTRÉE pour modifier le texte",
"text_editing": "Appuyez sur ÉCHAP ou Ctrl/Cmd+ENTRÉE pour terminer l'édition",
"linearElementMulti": "Cliquez sur le dernier point ou appuyez sur Échap ou Entrée pour terminer",
@@ -267,8 +252,7 @@
"bindTextToElement": "Appuyer sur Entrée pour ajouter du texte",
"deepBoxSelect": "Maintenir Ctrl ou Cmd pour sélectionner dans les groupes et empêcher le déplacement",
"eraserRevert": "Maintenez Alt enfoncé pour annuler les éléments marqués pour suppression",
"firefox_clipboard_write": "Cette fonctionnalité devrait pouvoir être activée en définissant l'option \"dom.events.asyncClipboard.clipboard.clipboardItem\" à \"true\". Pour modifier les paramètres du navigateur dans Firefox, visitez la page \"about:config\".",
"disableSnapping": "Maintenez CtrlOuCmd pour désactiver l'aimantation"
"firefox_clipboard_write": "Cette fonctionnalité devrait pouvoir être activée en définissant l'option \"dom.events.asyncClipboard.clipboard.clipboardItem\" à \"true\". Pour modifier les paramètres du navigateur dans Firefox, visitez la page \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Impossible dafficher laperçu",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "Enlever les éléments sélectionnés de la bibliothèque"
},
"imageExportDialog": {
"header": "Exporter l'image",
"header": "",
"label": {
"withBackground": "Fond",
"onlySelected": "Uniquement la sélection",
"darkMode": "Mode sombre",
"embedScene": "Intégrer la scène",
"scale": "Échelle",
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": "Les données de la scène seront sauvegardées dans le fichier PNG/SVG exporté afin que la scène puisse être restaurée depuis celui-ci.\nCela augmentera la taille du fichier exporté."
"embedScene": ""
},
"title": {
"exportToPng": "Exporter en PNG",
"exportToSvg": "Exporter en SVG",
"copyPngToClipboard": "Copier le PNG dans le presse-papier"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Copier dans le presse-papier"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,26 +411,24 @@
"fileSavedToFilename": "Enregistré sous {filename}",
"canvas": "canevas",
"selection": "sélection",
"pasteAsSingleElement": "Utiliser {{shortcut}} pour coller comme un seul élément,\nou coller dans un éditeur de texte existant",
"unableToEmbed": "Intégrer cet URL n'est actuellement pas autorisé. Ouvrez un ticket sur GitHub pour demander son ajout à la liste blanche",
"unrecognizedLinkFormat": "Le lien que vous avez intégré ne correspond pas au format attendu. Veuillez essayer de coller la chaîne d'intégration fournie par le site source"
"pasteAsSingleElement": "Utiliser {{shortcut}} pour coller comme un seul élément,\nou coller dans un éditeur de texte existant"
},
"colors": {
"transparent": "Transparent",
"black": "Noir",
"white": "Blanc",
"red": "Rouge",
"pink": "Rose",
"grape": "Mauve",
"violet": "Violet",
"gray": "Gris",
"blue": "Bleu",
"cyan": "Cyan",
"teal": "Turquoise",
"green": "Vert",
"yellow": "Jaune",
"orange": "Orange",
"bronze": "Bronze"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -462,41 +444,10 @@
}
},
"colorPicker": {
"mostUsedCustomColors": "Couleurs personnalisées les plus fréquemment utilisées",
"colors": "Couleurs",
"shades": "Nuances",
"hexCode": "Code hex",
"noShades": "Aucune nuance disponible pour cette couleur"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exporter en image",
"button": "Exporter en image",
"description": "Exporter les données de la scène comme une image que vous pourrez importer ultérieurement."
},
"saveToDisk": {
"title": "Sauvegarder sur le disque",
"button": "Sauvegarder sur le disque",
"description": "Exporter les données de la scène comme un fichier que vous pourrez importer ultérieurement."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exporter vers Excalidraw+",
"description": "Enregistrer la scène dans votre espace de travail Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Charger depuis un fichier",
"button": "Charger depuis un fichier",
"description": "Charger depuis un fichier va <bold>remplacer votre contenu existant</bold>.<br></br>Vous pouvez d'abord sauvegarder votre dessin en utilisant l'une des options ci-dessous."
},
"shareableLink": {
"title": "Charger depuis un lien",
"button": "Remplacer mon contenu",
"description": "Charger un dessin externe va <bold>remplacer votre contenu existant</bold>.<br></br>Vous pouvez d'abord sauvegarder votre dessin en utilisant l'une des options ci-dessous."
}
}
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
}
}
+28 -77
View File
@@ -50,7 +50,7 @@
"veryLarge": "Moi grande",
"solid": "Sólido",
"hachure": "Folleto",
"zigzag": "Zigzag",
"zigzag": "",
"crossHatch": "Raiado transversal",
"thin": "Estreito",
"bold": "Groso",
@@ -109,12 +109,8 @@
"createContainerFromText": "Envolver o texto nun contedor",
"link": {
"edit": "Editar ligazón",
"editEmbed": "",
"create": "Crear ligazón",
"createEmbed": "",
"label": "Ligazón",
"labelEmbed": "",
"empty": ""
"label": "Ligazón"
},
"lineEditor": {
"edit": "Editar liña",
@@ -164,16 +160,13 @@
"darkMode": "Modo escuro",
"lightMode": "Modo claro",
"zenMode": "Modo zen",
"objectsSnapMode": "",
"exitZenMode": "Saír do modo zen",
"cancel": "Cancelar",
"clear": "Limpar",
"remove": "Eliminar",
"embed": "",
"publishLibrary": "Publicar",
"submit": "Enviar",
"confirm": "Confirmar",
"embeddableInteractionButton": "Faga clic para interactuar"
"confirm": "Confirmar"
},
"alerts": {
"clearReset": "Isto limpará todo o lenzo. Estás seguro?",
@@ -203,7 +196,6 @@
"imageInsertError": "Non se puido inserir a imaxe. Probe de novo máis tarde...",
"fileTooBig": "O ficheiro é demasiado grande. O tamaño máximo permitido é {{maxSize}}.",
"svgImageInsertError": "Non se puido inserir como imaxe SVG. O marcado SVG semella inválido.",
"failedToFetchImage": "",
"invalidSVGString": "SVG inválido.",
"cannotResolveCollabServer": "Non se puido conectar ao servidor de colaboración. Por favor recargue a páxina e probe de novo.",
"importLibraryError": "Non se puido cargar a biblioteca",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,10 +224,8 @@
"link": "Engadir/ Actualizar ligazón para a forma seleccionada",
"eraser": "Goma de borrar",
"frame": "",
"embeddable": "Inserir na web",
"laser": "Punteiro láser",
"hand": "Man (ferramenta de desprazamento)",
"extraTools": "Máis ferramentas"
"extraTools": ""
},
"headings": {
"canvasActions": "Accións do lenzo",
@@ -251,7 +237,6 @@
"linearElement": "Faga clic para iniciar varios puntos, arrastre para unha sola liña",
"freeDraw": "Fai clic e arrastra, solta cando acabes",
"text": "Consello: tamén podes engadir texto facendo dobre-clic en calquera lugar coa ferramenta de selección",
"embeddable": "Faga clic e arrastre para crear un sitio web embebido",
"text_selected": "Dobre-clic ou prema ENTER para editar o texto",
"text_editing": "Prema Escape ou CtrlOrCmd+ENTER para finalizar a edición",
"linearElementMulti": "Faga clic no último punto ou prema Escape ou Enter para rematar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Prema a tecla enter para engadir texto",
"deepBoxSelect": "Manteña pulsado CtrlOrCmd para seleccionar en profundidade e evitar o arrastre",
"eraserRevert": "Manteña pulsado Alt para reverter os elementos marcados para a súa eliminación",
"firefox_clipboard_write": "Esta función pódese activar establecendo a opción \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar as opcións do navegador en Firefox, visita a páxina \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Esta función pódese activar establecendo a opción \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar as opcións do navegador en Firefox, visita a páxina \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Non se pode mostrar a vista previa",
@@ -376,11 +360,11 @@
"removeItemsFromLib": "Eliminar os elementos seleccionados da biblioteca"
},
"imageExportDialog": {
"header": "Exportar imaxe",
"header": "",
"label": {
"withBackground": "Fondo",
"withBackground": "",
"onlySelected": "",
"darkMode": "Modo escuro",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
@@ -389,14 +373,14 @@
"embedScene": ""
},
"title": {
"exportToPng": "Exportar a PNG",
"exportToSvg": "Exportar a SVG",
"copyPngToClipboard": "Copiar PNG ao portapapeis"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Copiar ao portapapeis"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,26 +411,24 @@
"fileSavedToFilename": "Gardado en {filename}",
"canvas": "lenzo",
"selection": "selección",
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un único elemento\nou pega nun editor de texto existente",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un único elemento\nou pega nun editor de texto existente"
},
"colors": {
"transparent": "Transparente",
"black": "Negro",
"white": "Branco",
"red": "Vermello",
"pink": "Rosa",
"grape": "Uva",
"violet": "Violeta",
"gray": "Gris",
"blue": "Azul",
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "Verde",
"yellow": "Marelo",
"orange": "Laranxa",
"bronze": "Bronce"
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -463,40 +445,9 @@
},
"colorPicker": {
"mostUsedCustomColors": "",
"colors": "Cores",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportar como imaxe",
"button": "Exportar como imaxe",
"description": ""
},
"saveToDisk": {
"title": "Gardar no disco",
"button": "Gardar no disco",
"description": ""
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exportar a Excalidraw+",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "Cargar dende arquivo",
"button": "Cargar dende arquivo",
"description": ""
},
"shareableLink": {
"title": "Cargar dende un enlace",
"button": "Substituír o meu contido",
"description": ""
}
}
}
}
+7 -56
View File
@@ -50,7 +50,7 @@
"veryLarge": "גדול מאוד",
"solid": "מוצק",
"hachure": "קווים מקבילים קצרים להצגת כיוון וחדות שיפוע במפה",
"zigzag": "זיגזג",
"zigzag": "",
"crossHatch": "קווים מוצלבים שתי וערב",
"thin": "דק",
"bold": "מודגש",
@@ -109,12 +109,8 @@
"createContainerFromText": "ארוז טקסט במיכל",
"link": {
"edit": "עריכת קישור",
"editEmbed": "ערוך קישור ושבץ",
"create": "יצירת קישור",
"createEmbed": "צור קישור ושבץ",
"label": "קישור",
"labelEmbed": "קשר ושבץ",
"empty": "לא נקבע קישור"
"label": "קישור"
},
"lineEditor": {
"edit": "ערוך קו",
@@ -128,8 +124,8 @@
},
"statusPublished": "פורסם",
"sidebarLock": "שמור את סרגל הצד פתוח",
"selectAllElementsInFrame": "בחר את כל האלמנטים במסגרת",
"removeAllElementsFromFrame": "הסר את כל האלמנטים שבמסגרת",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
@@ -164,16 +160,13 @@
"darkMode": "מצב כהה",
"lightMode": "מצב בהיר",
"zenMode": "מצב זן",
"objectsSnapMode": "",
"exitZenMode": "צא ממצב זן",
"cancel": "ביטול",
"clear": "ניקוי",
"remove": "הסר",
"embed": "",
"publishLibrary": "פרסום",
"submit": "שליחה",
"confirm": "אשר",
"embeddableInteractionButton": ""
"confirm": "אשר"
},
"alerts": {
"clearReset": "פעולה זו תנקה את כל הקנבס. אתה בטוח?",
@@ -203,7 +196,6 @@
"imageInsertError": "לא ניתן היה להוסיף את התמונה. אנא נסה שוב מאוחר יותר...",
"fileTooBig": "הקובץ גדול מדי. הגודל המירבי המותר הינו {{maxSize}}.",
"svgImageInsertError": "לא ניתן היה להוסיף את תמונת ה-SVG. הסימונים בתוך קובץ ה-SVG עשויים להיות שגויים.",
"failedToFetchImage": "",
"invalidSVGString": "SVG שגוי.",
"cannotResolveCollabServer": "לא הצלחתי להתחבר לשרת השיתוף. אנא רענן את הדף ונסה שוב.",
"importLibraryError": "לא ניתן היה לטעון את הספריה",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "הוספה/עדכון קישור של הצורה שנבחרה",
"eraser": "מחק",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "יד (כלי הזזה)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "לחץ להתחלת מספר נקודות, גרור לקו יחיד",
"freeDraw": "לחץ וגרור, שחרר כשסיימת",
"text": "טיפ: אפשר להוסיף טקסט על ידי לחיצה כפולה בכל מקום עם כלי הבחירה",
"embeddable": "",
"text_selected": "לחץ לחיצה כפולה או הקש על אנטר לעריכת הטקסט",
"text_editing": "כדי לסיים את העריכה לחץ על מקש Escape או על Ctrl (Cmd במחשבי אפל) ומקש Enter",
"linearElementMulti": "הקלק על הנקודה האחרונה או הקש Escape או Enter לסיום",
@@ -267,8 +252,7 @@
"bindTextToElement": "הקש Enter כדי להוספת טקסט",
"deepBoxSelect": "החזק Ctrl / Cmd לבחירה עמוקה ולמניעת גרירה",
"eraserRevert": "החזק Alt להחזרת רכיבים מסומנים למחיקה",
"firefox_clipboard_write": "יכולות זה ניתנת להפעלה על ידי שינוי הדגל של \"dom.events.asyncClipboard.clipboardItem\" למצב \"true\". כדי לשנות את הדגל בדפדפן Firefox, בקר בעמוד ״about:config״.",
"disableSnapping": ""
"firefox_clipboard_write": "יכולות זה ניתנת להפעלה על ידי שינוי הדגל של \"dom.events.asyncClipboard.clipboardItem\" למצב \"true\". כדי לשנות את הדגל בדפדפן Firefox, בקר בעמוד ״about:config״."
},
"canvasError": {
"cannotShowPreview": "לא ניתן להראות תצוגה מקדימה",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "נשמר לקובץ {filename}",
"canvas": "קנבאס",
"selection": "בחירה",
"pasteAsSingleElement": "השתמש ב- {{shortcut}} כדי להדביק כפריט יחיד,\nאו הדבק לתוך עורך טקסט קיים",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "השתמש ב- {{shortcut}} כדי להדביק כפריט יחיד,\nאו הדבק לתוך עורך טקסט קיים"
},
"colors": {
"transparent": "שקוף",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "मूलपाठ कंटेनर में मोड के दिखाए",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "रेखा संपादित करे",
@@ -164,16 +160,13 @@
"darkMode": "डार्क मोड",
"lightMode": "लाइट मोड",
"zenMode": "ज़ेन मोड",
"objectsSnapMode": "वस्तुओं से पकड़े",
"exitZenMode": "जेन मोड से बाहर निकलें",
"cancel": "",
"clear": "साफ़ करे",
"remove": "हटाएं",
"embed": "",
"publishLibrary": "प्रकाशित करें",
"submit": "प्रस्तुत करे",
"confirm": "पुष्टि करें",
"embeddableInteractionButton": ""
"confirm": "पुष्टि करें"
},
"alerts": {
"clearReset": "इससे पूरा कैनवास साफ हो जाएगा। क्या आपको यकीन है?",
@@ -203,7 +196,6 @@
"imageInsertError": "छवि सम्मिलित नहीं की जा सकी. पुनः प्रयत्न करे...",
"fileTooBig": "फ़ाइल ज़रूरत से ज़्यादा बड़ी हैं. अधिकतम अनुमित परिमाण {{maxSize}} हैं",
"svgImageInsertError": "एसवीजी छवि सम्मिलित नहीं कर सके, एसवीजी रचना अनुचित हैं",
"failedToFetchImage": "",
"invalidSVGString": "अनुचित SVG",
"cannotResolveCollabServer": "कॉलेब सर्वर से कनेक्शन नहीं हो पा रहा. कृपया पृष्ठ को पुनः लाने का प्रयास करे.",
"importLibraryError": "संग्रह प्रतिष्ठापित नहीं किया जा सका",
@@ -214,10 +206,6 @@
"line2": "यह आपके चित्रों के <bold>पाठ तत्वों</bold>को खंडित कर सकता हैं",
"line3": "हमें आपसे ठोस आग्रह है की आप सेट्टिंग में इस विकल्प का चयन ना करे.<link> इस अनुक्रम </link> का पालन करके इसका पता लगा सकते हैं",
"line4": "यदि इस सेटिंग्स को अक्षम करने पर भी पृष्ठ ठीक नहीं दिखता हो तो, हमारे GitHub पर एक <issueLink>मुद्दा प्रस्तुत</issueLink> करे, या हमें <discordLink>डिस्कोर्ड</discordLink> पर लिखित सम्पर्क करें"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "रबड़",
"frame": "",
"embeddable": "",
"laser": "लेसर टॉर्च",
"hand": "हाथ ( खिसकाने का औज़ार)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "कई बिंदुओं को शुरू करने के लिए क्लिक करें, सिंगल लाइन के लिए खींचें",
"freeDraw": "क्लिक करें और खींचें। समाप्त करने के लिए, छोड़ो",
"text": "आप चयन टूल से कहीं भी डबल-क्लिक करके टेक्स्ट जोड़ सकते हैं",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "अंतिम बिंदु पर क्लिक करें या समाप्त होने के लिए एस्केप या एंटर दबाएं",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "मिटाने के लिए चुने हुए चीजों को ना चुनने के लिए Alt साथ में दबाए",
"firefox_clipboard_write": "\"dom.events.asyncClipboard.clipboardItem\" फ़्लैग को \"true\" पर सेट करके इस सुविधा को संभवतः सक्षम किया जा सकता है। Firefox में ब्राउज़र फ़्लैग बदलने के लिए, \"about:config\" पृष्ठ पर जाएँ।",
"disableSnapping": "स्नैपिंग को निष्क्रिय करने के लिए CtrlOrCmd दबाए रखें"
"firefox_clipboard_write": "\"dom.events.asyncClipboard.clipboardItem\" फ़्लैग को \"true\" पर सेट करके इस सुविधा को संभवतः सक्षम किया जा सकता है। Firefox में ब्राउज़र फ़्लैग बदलने के लिए, \"about:config\" पृष्ठ पर जाएँ।"
},
"canvasError": {
"cannotShowPreview": "पूर्वावलोकन नहीं दिखा सकते हैं",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "एक अवयव के रूप में चिपकाने के लिए {{shortcut}} का उपयोग करें,\nया किसी मौजूदा पाठ संपादक में चिपकायें",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "एक अवयव के रूप में चिपकाने के लिए {{shortcut}} का उपयोग करें,\nया किसी मौजूदा पाठ संपादक में चिपकायें"
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "छाया",
"hexCode": "हेक्स कोड",
"noShades": "इस रंग की कोई छाया उपलब्ध नहीं हैं"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "छवि स्वरूप में निर्यात करे",
"button": "छवि स्वरूप निर्यात करे",
"description": "दृष्य डेटा छवि स्वरूप में निर्यात करे, उस स्वरूप से आप उसे पुनः आयात कर सकते हो"
},
"saveToDisk": {
"title": "डिस्क में सम्हाले",
"button": "डिस्क में सम्हाले",
"description": "दृष्य डेटा बाहरी फ़ाइल में निर्यात करे, जहाँसे आप उसे पुनः आयात कर सकते हो"
},
"excalidrawPlus": {
"title": "एक्षकालीड्रॉ+",
"button": "एक्षकालीड्रॉ+ में निर्यात करे",
"description": "दृष्य को आपके एक्षकालीड्रॉ+ के कर्यस्थल में सम्हाले"
}
},
"modal": {
"loadFromFile": {
"title": "फ़ाइल से लोड करें:",
"button": "फ़ाइल से लोड करें:",
"description": "फ़ाइल से लोड करने पर <bold>यह आपके कार्य की जगह लेलेगा </bold><br></br>आपकी ड्रॉइंग निम्न दर्शित विकल्पो में से एक चुनके और उपयोग करके सम्हाल सकते हैं"
},
"shareableLink": {
"title": "लिंक से लोड करें:",
"button": "इस जगह प्रतिस्थापित करे",
"description": "बाहर का चित्र लोड करने पर <bold>यह आपके कार्य की जगह लेलेगा </bold><br></br>आप आपकी ड्रॉइंग पहले निम्न दर्शित विकल्पो में से एक चुनके और उपयोग करके सम्हाल सकते हों."
}
}
}
}
+5 -54
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Hivatkozás szerkesztése",
"editEmbed": "",
"create": "Hivatkozás létrehozása",
"createEmbed": "",
"label": "Hivatkozás",
"labelEmbed": "",
"empty": ""
"label": "Hivatkozás"
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "Sötét mód",
"lightMode": "Világos mód",
"zenMode": "Letisztult mód",
"objectsSnapMode": "",
"exitZenMode": "Kilépés a letisztult módból",
"cancel": "Mégsem",
"clear": "Kiűrítés",
"remove": "Eltávolítás",
"embed": "",
"publishLibrary": "Közzététel",
"submit": "Elküldés",
"confirm": "Megerősítés",
"embeddableInteractionButton": ""
"confirm": "Megerősítés"
},
"alerts": {
"clearReset": "Ez a művelet törli a vászont. Biztos benne?",
@@ -203,7 +196,6 @@
"imageInsertError": "Nem sikerült beszúrni a képet. Próbáld újra később...",
"fileTooBig": "A fájl túl nagy. A megengedett maximális méret {{maxSize}}.",
"svgImageInsertError": "Nem sikerült beszúrni az SVG-képet. Az SVG szintaktika érvénytelennek tűnik.",
"failedToFetchImage": "",
"invalidSVGString": "Érvénytelen SVG.",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Hivatkozás hozzáadása/frissítése a kiválasztott alakzathoz",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Kattintással görbe, az eger húzásával pedig egyenes nyilat rajzolhatsz",
"freeDraw": "Kattints és húzd, majd engedd el, amikor végeztél",
"text": "Tipp: A kijelölés eszközzel a dupla kattintás új szöveget hoz létre",
"embeddable": "",
"text_selected": "Kattints duplán, vagy nyomj entert a szöveg szerkesztéséhez",
"text_editing": "Nyomjd meg az Escape vagy a Ctrl/Cmd+ENTER billentyűkombinációt a szerkesztés befejezéséhez",
"linearElementMulti": "Kattints a következő ív pozíciójára, vagy fejezd be a nyilat az Escape vagy Enter megnyomásával",
@@ -267,8 +252,7 @@
"bindTextToElement": "Nyomd meg az Entert szöveg hozzáadáshoz",
"deepBoxSelect": "Tartsd lenyomva a Ctrl/Cmd billentyűt a mély kijelöléshez és a húzás megakadályozásához",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Előnézet nem jeleníthető meg",
@@ -376,7 +360,7 @@
"removeItemsFromLib": "A kiválasztott elemek eltávolítása a könyvtárból"
},
"imageExportDialog": {
"header": "Kép exportálása",
"header": "",
"label": {
"withBackground": "",
"onlySelected": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Mentve mint {filename}",
"canvas": "rajzvászon",
"selection": "kijelölés",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Átlátszó",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+23 -72
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Bungkus teks dalam kontainer",
"link": {
"edit": "Edit tautan",
"editEmbed": "",
"create": "Buat tautan",
"createEmbed": "",
"label": "Tautan",
"labelEmbed": "",
"empty": ""
"label": "Tautan"
},
"lineEditor": {
"edit": "Edit tautan",
@@ -128,9 +124,9 @@
},
"statusPublished": "Telah terbit",
"sidebarLock": "Biarkan sidebar tetap terbuka",
"selectAllElementsInFrame": "Pilih semua elemen di bingkai",
"removeAllElementsFromFrame": "Hapus semua elemen dari bingkai",
"eyeDropper": "Ambil warna dari kanvas"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "Belum ada item yang ditambahkan...",
@@ -164,16 +160,13 @@
"darkMode": "Mode gelap",
"lightMode": "Mode terang",
"zenMode": "Mode zen",
"objectsSnapMode": "",
"exitZenMode": "Keluar dari mode zen",
"cancel": "Batal",
"clear": "Hapus",
"remove": "Hapus",
"embed": "",
"publishLibrary": "Terbitkan",
"submit": "Kirimkan",
"confirm": "Konfirmasi",
"embeddableInteractionButton": ""
"confirm": "Konfirmasi"
},
"alerts": {
"clearReset": "Ini akan menghapus semua yang ada dikanvas. Apakah kamu yakin ?",
@@ -203,7 +196,6 @@
"imageInsertError": "Tidak dapat menyisipkan gambar. Coba lagi nanti...",
"fileTooBig": "File terlalu besar. Ukuran maksimum yang dibolehkan {{maxSize}}.",
"svgImageInsertError": "Tidak dapat menyisipkan gambar SVG. Markup SVG sepertinya tidak valid.",
"failedToFetchImage": "",
"invalidSVGString": "SVG tidak valid.",
"cannotResolveCollabServer": "Tidak dapat terhubung ke server kolab. Muat ulang laman dan coba lagi.",
"importLibraryError": "Tidak dapat memuat pustaka",
@@ -214,10 +206,6 @@
"line2": "Ini dapat membuat <bold>Elemen Teks</bold> dalam gambar mu.",
"line3": "Kami sangat menyarankan mematikan pengaturan ini. Anda dapat mengikuti <link>langkah-langkah ini</link> untuk melakukannya.",
"line4": "Jika mematikan pengaturan ini tidak membenarkan tampilan elemen teks, mohon buka\n<issueLink>isu</issueLink> di GitHub kami, atau chat kami di <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Mode pena - mencegah sentuhan",
"link": "Tambah/Perbarui tautan untuk bentuk yang dipilih",
"eraser": "Penghapus",
"frame": "Alat bingkai",
"embeddable": "",
"laser": "",
"frame": "",
"hand": "Tangan (alat panning)",
"extraTools": "Alat-alat lain"
"extraTools": ""
},
"headings": {
"canvasActions": "Opsi Kanvas",
@@ -251,7 +237,6 @@
"linearElement": "Klik untuk memulai banyak poin, seret untuk satu baris",
"freeDraw": "Klik dan seret, lepaskan jika Anda selesai",
"text": "Tip: Anda juga dapat menambahkan teks dengan klik ganda di mana saja dengan alat pemilihan",
"embeddable": "",
"text_selected": "Klik ganda atau tekan ENTER untuk edit teks",
"text_editing": "Tekan Escape atau CtrlAtauCmd+ENTER untuk selesai mengedit",
"linearElementMulti": "Klik pada titik akhir atau tekan Escape atau Enter untuk menyelesaikan",
@@ -267,8 +252,7 @@
"bindTextToElement": "Tekan enter untuk tambahkan teks",
"deepBoxSelect": "Tekan Ctrl atau Cmd untuk memilih yang di dalam, dan mencegah penggeseran",
"eraserRevert": "Tahan Alt untuk mengembalikan elemen yang ditandai untuk dihapus",
"firefox_clipboard_write": "Fitur ini dapat diaktifkan melalui pengaturan flag \"dom.events.asyncClipboard.clipboardItem\" ke \"true\". Untuk mengganti flag di Firefox, pergi ke laman \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Fitur ini dapat diaktifkan melalui pengaturan flag \"dom.events.asyncClipboard.clipboardItem\" ke \"true\". Untuk mengganti flag di Firefox, pergi ke laman \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Tidak dapat menampilkan pratinjau",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "Hapus item yang dipilih dari pustaka"
},
"imageExportDialog": {
"header": "Ekspor gambar",
"header": "",
"label": {
"withBackground": "Latar",
"onlySelected": "Hanya yang dipilih",
"darkMode": "Mode gelap",
"embedScene": "Sematkan pemandangan",
"scale": "Skala",
"padding": "Lapisan"
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": "Data pemandangan akan disimpan dalam file PNG/SVG yang diekspor sehingga pemandangan itu dapat dipulihkan darinya.\nAkan membesarkan ukuran file yang diekspor."
"embedScene": ""
},
"title": {
"exportToPng": "Ekspor ke PNG",
"exportToSvg": "Ekspor ke SVG",
"copyPngToClipboard": "Salin PNG ke papan klip"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Salin ke papan klip"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Disimpan ke {filename}",
"canvas": "kanvas",
"selection": "pilihan",
"pasteAsSingleElement": "Gunakan {{shortcut}} untuk menempelkan sebagai satu elemen,\natau tempelkan ke teks editor yang ada",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Gunakan {{shortcut}} untuk menempelkan sebagai satu elemen,\natau tempelkan ke teks editor yang ada"
},
"colors": {
"transparent": "Transparan",
@@ -467,36 +449,5 @@
"shades": "Nuansa",
"hexCode": "Kode hexa",
"noShades": "Tidak ada nuansa untuk warna ini"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Ekspor sebagai gambar",
"button": "Ekspor sebagai gambar",
"description": "Ekspor data pemandangan sebagai gambar yang dapat anda impor nanti."
},
"saveToDisk": {
"title": "Simpan ke disk",
"button": "Simpan ke disk",
"description": "Ekspor data pemandangan ke file yang dapat Anda dapat impor nanti."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Ekspor ke Excalidraw+",
"description": "Simpan pemandangan ke ruang kerja Excalidraw+ Anda."
}
},
"modal": {
"loadFromFile": {
"title": "Muat dari file",
"button": "Muat dari file",
"description": "Memuat dari file yang akan <bold>menggantikan konten Anda sekarang</bold>.<br></br>Anda dapat mencadangkan gambar anda dulu menggunakan opsi-opsi ini."
},
"shareableLink": {
"title": "Muat dari link",
"button": "Ganti konten saya",
"description": "Memuat dari file yang akan <bold>menggantikan konten Anda sekarang</bold>.<br></br>Anda dapat mencadangkan gambar anda dulu menggunakan opsi-opsi ini."
}
}
}
}
+9 -58
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Avvolgi il testo in un container",
"link": {
"edit": "Modifica link",
"editEmbed": "Modifica collegamento e incorpora",
"create": "Crea link",
"createEmbed": "Crea collegamento e incorpora",
"label": "Link",
"labelEmbed": "Collega & incorpora",
"empty": "Nessun collegamento impostato"
"label": "Link"
},
"lineEditor": {
"edit": "Modifica linea",
@@ -128,9 +124,9 @@
},
"statusPublished": "Pubblicato",
"sidebarLock": "Mantieni aperta la barra laterale",
"selectAllElementsInFrame": "Seleziona tutti gli elementi nel riquadro",
"removeAllElementsFromFrame": "Rimuovi tutti gli elementi dal riquadro",
"eyeDropper": "Scegli il colore della tela"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "Nessun elemento ancora aggiunto...",
@@ -164,16 +160,13 @@
"darkMode": "Tema scuro",
"lightMode": "Tema chiaro",
"zenMode": "Modalità Zen",
"objectsSnapMode": "Aggancia agli oggetti",
"exitZenMode": "Uscire dalla modalità zen",
"cancel": "Annulla",
"clear": "Cancella",
"remove": "Rimuovi",
"embed": "Attiva/disattiva incorporamento",
"publishLibrary": "Pubblica",
"submit": "Invia",
"confirm": "Conferma",
"embeddableInteractionButton": "Clicca per interagire"
"confirm": "Conferma"
},
"alerts": {
"clearReset": "Questa azione cancellerà l'intera tela. Sei sicuro?",
@@ -203,7 +196,6 @@
"imageInsertError": "Non è stato possibile inserire l'immagine. Riprova più tardi...",
"fileTooBig": "Il file è troppo grande. La dimensione massima consentita è {{maxSize}}.",
"svgImageInsertError": "Impossibile inserire l'immagine SVG. Il markup SVG non sembra corretto.",
"failedToFetchImage": "",
"invalidSVGString": "SVG non valido.",
"cannotResolveCollabServer": "Impossibile connettersi al server di collab. Ricarica la pagina e riprova.",
"importLibraryError": "Impossibile caricare la libreria",
@@ -214,10 +206,6 @@
"line2": "Ciò potrebbe causare la rottura degli <bold>Elementi di testo</bold> nei tuoi disegni.",
"line3": "Consigliamo vivamente di disabilitare questa impostazione. Puoi seguire <link>questi passaggi</link> su come farlo.",
"line4": "Se la disattivazione di questa impostazione non risolve la visualizzazione degli elementi di testo, apri un <issueLink>problema</issueLink> sul nostro GitHub o scrivici su <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Gli elementi incorporabili non possono essere aggiunti alla libreria.",
"image": "Il supporto per l'aggiunta d'immagini alla libreria verrà aggiunto a breve!"
}
},
"toolBar": {
@@ -235,9 +223,7 @@
"penMode": "Modalità penna - previene il tocco",
"link": "Aggiungi/ aggiorna il link per una forma selezionata",
"eraser": "Gomma",
"frame": "Strumento riquadro",
"embeddable": "Incorporamento Web",
"laser": "Puntatore laser",
"frame": "",
"hand": "Mano (strumento di panoramica)",
"extraTools": "Altri strumenti"
},
@@ -251,7 +237,6 @@
"linearElement": "Clicca per iniziare una linea in più punti, trascina per singola linea",
"freeDraw": "Clicca e trascina, rilascia quando avrai finito",
"text": "Suggerimento: puoi anche aggiungere del testo facendo doppio clic ovunque con lo strumento di selezione",
"embeddable": "Fare click e trascina per creare un incorporamento web",
"text_selected": "Fai doppio click o premi INVIO per modificare il testo",
"text_editing": "Premi ESC o CtrlOCmd+INVIO per completare le modifiche",
"linearElementMulti": "Clicca sull'ultimo punto o premi Esc o Invio per finire",
@@ -267,8 +252,7 @@
"bindTextToElement": "Premi invio per aggiungere il testo",
"deepBoxSelect": "Tieni premuto CtrlOCmd per selezionare in profondità e per impedire il trascinamento",
"eraserRevert": "Tieni premuto Alt per ripristinare gli elementi contrassegnati per l'eliminazione",
"firefox_clipboard_write": "Questa funzione può essere abilitata impostando il flag \"dom.events.asyncClipboard.clipboardItem\" su \"true\". Per modificare i flag del browser in Firefox, visitare la pagina \"about:config\".",
"disableSnapping": "Tieni premuto Ctrl o Cmd per disabilitare lo snap"
"firefox_clipboard_write": "Questa funzione può essere abilitata impostando il flag \"dom.events.asyncClipboard.clipboardItem\" su \"true\". Per modificare i flag del browser in Firefox, visitare la pagina \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Impossibile visualizzare l'anteprima",
@@ -383,7 +367,7 @@
"darkMode": "Tema scuro",
"embedScene": "Includi scena",
"scale": "Scala",
"padding": "Rientro"
"padding": ""
},
"tooltip": {
"embedScene": "I dati della scena saranno salvati nel file PNG/SVG esportato in modo che la scena possa essere ripristinata da esso.\nQuesto aumenterà la dimensione del file esportato."
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Salvato in {filename}",
"canvas": "tela",
"selection": "selezione",
"pasteAsSingleElement": "Usa {{shortcut}} per incollare come un singolo elemento,\no incollare in un editor di testo esistente",
"unableToEmbed": "Incorporare questo url non è permesso. Crea una issue su GitHub per richiedere che l'url sia autorizzato",
"unrecognizedLinkFormat": "Il link che hai incorporato non corrisponde al formato previsto. Prova a incollare la stringa 'embed' fornita dal sito di origine"
"pasteAsSingleElement": "Usa {{shortcut}} per incollare come un singolo elemento,\no incollare in un editor di testo esistente"
},
"colors": {
"transparent": "Trasparente",
@@ -467,36 +449,5 @@
"shades": "Sfumature",
"hexCode": "Codice esadecimale",
"noShades": "Nessuna sfumatura disponibile per questo colore"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Esporta come immagine",
"button": "Esporta come immagine",
"description": "Esporta i dati della scena come immagine, che potrai importare in seguito."
},
"saveToDisk": {
"title": "Salva su disco",
"button": "Salva su disco",
"description": "Esporta i dati della scena su file, che potrai importare in seguito."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Esporta su Excalidraw+",
"description": "Salva la scena sul tuo spazio di lavoro Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Carica da file",
"button": "Carica da file",
"description": "Il caricamento da file sostituirà <bold>il contenuto esistente</bold>.<br></br>Puoi salvare il tuo disegno prima usando una delle opzioni qui sotto."
},
"shareableLink": {
"title": "Carica da link",
"button": "Sostituisci il mio contenuto",
"description": "Il caricamento da file sostituirà <bold>il contenuto esistente</bold>.<br></br>Puoi salvare il tuo disegno prima usando una delle opzioni qui sotto."
}
}
}
}
+44 -93
View File
@@ -50,7 +50,7 @@
"veryLarge": "特大",
"solid": "ベタ塗り",
"hachure": "斜線",
"zigzag": "ジグザグ",
"zigzag": "",
"crossHatch": "網掛け",
"thin": "細",
"bold": "太字",
@@ -106,15 +106,11 @@
"increaseFontSize": "フォントサイズを拡大",
"unbindText": "テキストのバインド解除",
"bindText": "テキストをコンテナにバインド",
"createContainerFromText": "コンテナ内でテキストを折り返す",
"createContainerFromText": "",
"link": {
"edit": "リンクを編集",
"editEmbed": "リンクの編集と埋め込み",
"create": "リンクを作成",
"createEmbed": "リンクの作成と埋め込み",
"label": "リンク",
"labelEmbed": "リンクと埋め込み",
"empty": "リンクが設定されていません"
"label": "リンク"
},
"lineEditor": {
"edit": "行を編集",
@@ -128,9 +124,9 @@
},
"statusPublished": "公開済み",
"sidebarLock": "サイドバーを開いたままにする",
"selectAllElementsInFrame": "フレーム内のすべての要素を選択",
"removeAllElementsFromFrame": "フレーム内のすべての要素を削除",
"eyeDropper": "キャンバスから色を選択"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "まだアイテムが追加されていません…",
@@ -164,16 +160,13 @@
"darkMode": "ダークモード",
"lightMode": "ライトモード",
"zenMode": "Zenモード",
"objectsSnapMode": "",
"exitZenMode": "集中モードをやめる",
"cancel": "キャンセル",
"clear": "消去",
"remove": "削除",
"embed": "埋め込みの切り替え",
"publishLibrary": "公開",
"submit": "送信",
"confirm": "確認",
"embeddableInteractionButton": ""
"confirm": "確認"
},
"alerts": {
"clearReset": "この操作によってキャンバス全体が消えます。よろしいですか?",
@@ -203,21 +196,16 @@
"imageInsertError": "画像を挿入できませんでした。後でもう一度お試しください...",
"fileTooBig": "ファイルが大きすぎます。許可される最大サイズは {{maxSize}} です。",
"svgImageInsertError": "SVGイメージを挿入できませんでした。SVGマークアップは無効に見えます。",
"failedToFetchImage": "",
"invalidSVGString": "無効なSVGです。",
"cannotResolveCollabServer": "コラボレーションサーバに接続できませんでした。ページを再読み込みして、もう一度お試しください。",
"importLibraryError": "ライブラリを読み込めませんでした。",
"collabSaveFailed": "バックエンドデータベースに保存できませんでした。問題が解決しない場合は、作業を失わないようにローカルにファイルを保存してください。",
"collabSaveFailed_sizeExceeded": "キャンバスが大きすぎるため、バックエンドデータベースに保存できませんでした。問題が解決しない場合は、作業を失わないようにローカルにファイルを保存してください。",
"brave_measure_text_error": {
"line1": "<bold>Aggressly Block Fingerprinting</bold> の設定が有効なBraveブラウザを使用しているようです。",
"line2": "これにより、図面の <bold>テキスト要素</bold> が壊れる可能性があります。",
"line3": "この設定を無効にすることを強く推奨します。 <link>設定手順</link> をこちらから確認できます。",
"line4": "この設定を無効にすると、テキスト要素の表示が修正されません。 GitHub で <issueLink>Issue</issueLink> を開くか、 <discordLink>Discord</discordLink> にご記入ください"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
"line1": "",
"line2": "",
"line3": "",
"line4": ""
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "ペンモード - タッチ防止",
"link": "選択した図形のリンクを追加/更新",
"eraser": "消しゴム",
"frame": "フレームツール",
"embeddable": "Web埋め込み",
"laser": "",
"frame": "",
"hand": "手 (パンニングツール)",
"extraTools": "その他のツール"
"extraTools": ""
},
"headings": {
"canvasActions": "キャンバス操作",
@@ -251,7 +237,6 @@
"linearElement": "クリックすると複数の頂点からなる曲線を開始、ドラッグすると直線",
"freeDraw": "クリックしてドラッグします。離すと終了します",
"text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます",
"embeddable": "",
"text_selected": "テキストを編集するには、ダブルクリックまたはEnterキーを押します",
"text_editing": "Esc キーまたは CtrlOrCmd+ENTER キーを押して編集を終了します",
"linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します",
@@ -267,8 +252,7 @@
"bindTextToElement": "Enterを押してテキストを追加",
"deepBoxSelect": "CtrlOrCmd を押し続けることでドラッグを抑止し、深い選択を行います",
"eraserRevert": "Alt を押し続けることで削除マークされた要素を元に戻す",
"firefox_clipboard_write": "この機能は、\"dom.events.asyncClipboard.clipboardItem\" フラグを \"true\" に設定することで有効になる可能性があります。Firefox でブラウザーの設定を変更するには、\"about:config\" ページを参照してください。",
"disableSnapping": ""
"firefox_clipboard_write": "この機能は、\"dom.events.asyncClipboard.clipboardItem\" フラグを \"true\" に設定することで有効になる可能性があります。Firefox でブラウザーの設定を変更するには、\"about:config\" ページを参照してください。"
},
"canvasError": {
"cannotShowPreview": "プレビューを表示できません",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "選択したアイテムをライブラリから削除"
},
"imageExportDialog": {
"header": "画像をエクスポート",
"header": "",
"label": {
"withBackground": "背景",
"withBackground": "",
"onlySelected": "",
"darkMode": "ダークモード",
"darkMode": "",
"embedScene": "",
"scale": "スケール",
"padding": "余白"
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": ""
},
"title": {
"exportToPng": "PNG にエクスポート",
"exportToSvg": "SVG にエクスポート",
"copyPngToClipboard": "クリップボードにPNGをコピー"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "クリップボードにコピー"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,26 +411,24 @@
"fileSavedToFilename": "{filename} に保存しました",
"canvas": "キャンバス",
"selection": "選択",
"pasteAsSingleElement": "{{shortcut}} を使用して単一の要素として貼り付けるか、\n既存のテキストエディタに貼り付け",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "{{shortcut}} を使用して単一の要素として貼り付けるか、\n既存のテキストエディタに貼り付け"
},
"colors": {
"transparent": "透明",
"black": "",
"white": "",
"red": "",
"pink": "ピンク",
"grape": "グレープ",
"violet": "バイオレット",
"gray": "灰色",
"blue": "",
"cyan": "シアン",
"teal": "ティール",
"green": "",
"yellow": "",
"orange": "オレンジ",
"bronze": "ブロンズ"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -462,41 +444,10 @@
}
},
"colorPicker": {
"mostUsedCustomColors": "最も使用されているカスタム色",
"colors": "",
"shades": "",
"hexCode": "Hexコード",
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "画像としてエクスポート",
"button": "画像としてエクスポート",
"description": ""
},
"saveToDisk": {
"title": "ディスクに保存",
"button": "ディスクに保存",
"description": ""
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Excalidraw+にエクスポート",
"description": "Excalidraw+ ワークスペースにシーンを保存します。"
}
},
"modal": {
"loadFromFile": {
"title": "ファイルからロード",
"button": "ファイルからロード",
"description": ""
},
"shareableLink": {
"title": "リンクからロード",
"button": "",
"description": ""
}
}
}
}
+67 -116
View File
@@ -1,14 +1,14 @@
{
"labels": {
"paste": "Qoyıw",
"pasteAsPlaintext": "Ápiwayı tekst retinde qoyıw",
"pasteCharts": "Diagrammalardı qoyıw",
"paste": "",
"pasteAsPlaintext": "",
"pasteCharts": "",
"selectAll": "Barlıǵın tańlaw",
"multiSelect": "",
"moveCanvas": "",
"cut": "Qıyıw",
"cut": "",
"copy": "Kóshirip alıw",
"copyAsPng": "Almasıw buferine PNG retinde kóshirip alıw",
"copyAsPng": "",
"copyAsSvg": "",
"copyText": "",
"bringForward": "",
@@ -18,8 +18,8 @@
"delete": "Óshiriw",
"copyStyles": "",
"pasteStyles": "",
"stroke": "Jiyek",
"background": "Fon",
"stroke": "",
"background": "",
"fill": "",
"strokeWidth": "",
"strokeStyle": "",
@@ -29,31 +29,31 @@
"sloppiness": "",
"opacity": "",
"textAlign": "",
"edges": "Qırlar",
"edges": "",
"sharp": "",
"round": "",
"arrowheads": "",
"arrowhead_none": "",
"arrowhead_arrow": "Jebe",
"arrowhead_arrow": "",
"arrowhead_bar": "",
"arrowhead_dot": "Noqat",
"arrowhead_dot": "",
"arrowhead_triangle": "",
"fontSize": "Shrift ólshemi",
"fontFamily": "",
"addWatermark": "",
"handDrawn": "",
"normal": "",
"code": "Kod",
"code": "",
"small": "",
"medium": "",
"large": "Úlken",
"veryLarge": "Júdá úlken",
"large": "",
"veryLarge": "",
"solid": "",
"hachure": "",
"zigzag": "Zigzag",
"zigzag": "",
"crossHatch": "",
"thin": "Jińishke",
"bold": "Qalıń",
"thin": "",
"bold": "",
"left": "",
"center": "",
"right": "",
@@ -71,19 +71,19 @@
"language": "Til",
"liveCollaboration": "",
"duplicateSelection": "Nusqa",
"untitled": "Atamasız",
"untitled": "",
"name": "Ataması",
"yourName": "Atıńız",
"madeWithExcalidraw": "Excalidraw járdeminde islengen",
"madeWithExcalidraw": "",
"group": "",
"ungroup": "",
"collaborators": "Qatnasıwshılar",
"collaborators": "",
"showGrid": "",
"addToLibrary": "Kitapxanaǵa qosıw",
"removeFromLibrary": "Kitapxanadan alıp taslaw",
"libraryLoadingMessage": "Kitapxana júklenbekte…",
"libraries": "Kitapxanalardı kóriw",
"loadingScene": "Saxna júklenbekte…",
"loadingScene": "",
"align": "",
"alignTop": "",
"alignBottom": "",
@@ -99,26 +99,22 @@
"share": "Bólisiw",
"showStroke": "",
"showBackground": "",
"toggleTheme": "Temanı ózgertiw",
"personalLib": "Jeke kitapxana",
"excalidrawLib": "Excalidraw kitapxanası",
"decreaseFontSize": "Shrift ólshemin kishireytiw",
"increaseFontSize": "Shrift ólshemin úlkeytiw",
"toggleTheme": "",
"personalLib": "",
"excalidrawLib": "",
"decreaseFontSize": "",
"increaseFontSize": "",
"unbindText": "",
"bindText": "",
"createContainerFromText": "",
"link": {
"edit": "Siltemeni ózgertiw",
"editEmbed": "",
"create": "Siltemeni jaratıw",
"createEmbed": "",
"label": "Silteme",
"labelEmbed": "",
"empty": ""
"label": "Silteme"
},
"lineEditor": {
"edit": "Qatardı ózgertiw",
"exit": "Qatardı ózgertiw redaktorınan shıǵıw"
"edit": "",
"exit": ""
},
"elementLock": {
"lock": "Qulıplaw",
@@ -140,11 +136,11 @@
"buttons": {
"clearReset": "",
"exportJSON": "",
"exportImage": "Súwretti eksportlaw...",
"export": "Retinde saqlaw...",
"exportImage": "",
"export": "",
"copyToClipboard": "Almasıw buferine kóshirip alındı",
"save": "Ámeldegi faylǵa saqlaw",
"saveAs": "Retinde saqlaw",
"save": "",
"saveAs": "",
"load": "Ashıw",
"getShareableLink": "",
"close": "Jabıw",
@@ -164,16 +160,13 @@
"darkMode": "Qarańǵı tema",
"lightMode": "Jaqtı tema",
"zenMode": "",
"objectsSnapMode": "",
"exitZenMode": "",
"cancel": "Biykarlaw",
"clear": "Tazalaw",
"remove": "Óshiriw",
"embed": "",
"publishLibrary": "",
"submit": "Jiberiw",
"confirm": "Tastıyıqlaw",
"embeddableInteractionButton": ""
"confirm": "Tastıyıqlaw"
},
"alerts": {
"clearReset": "",
@@ -203,7 +196,6 @@
"imageInsertError": "",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "Jaramsız SVG.",
"cannotResolveCollabServer": "",
"importLibraryError": "Kitapxananı júklew ámelge aspadı",
@@ -214,16 +206,12 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
"selection": "",
"image": "Súwret qoyıw",
"rectangle": "Tórt múyeshlik",
"rectangle": "",
"diamond": "",
"ellipse": "",
"arrow": "",
@@ -236,22 +224,19 @@
"link": "",
"eraser": "Óshirgish",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
"headings": {
"canvasActions": "",
"selectedShapeActions": "",
"shapes": "Figuralar"
"shapes": ""
},
"hints": {
"canvasPanning": "",
"linearElement": "",
"freeDraw": "",
"text": "",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -264,11 +249,10 @@
"lineEditor_nothingSelected": "",
"placeImage": "",
"publishLibrary": "",
"bindTextToElement": "Tekst qosıw ushın Enter túymesin basıń",
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -297,18 +281,18 @@
"title": "Qátelik"
},
"exportDialog": {
"disk_title": "Diskke saqlaw",
"disk_title": "",
"disk_details": "",
"disk_button": "Faylǵa saqlaw",
"disk_button": "",
"link_title": "",
"link_details": "",
"link_button": "Siltemege eksportlaw",
"link_button": "",
"excalidrawplus_description": "",
"excalidrawplus_button": "Eksportlaw",
"excalidrawplus_exportError": ""
},
"helpDialog": {
"blog": "Biziń blogtı oqıń",
"blog": "",
"click": "basıw",
"deepSelect": "",
"deepBoxSelect": "",
@@ -317,7 +301,7 @@
"documentation": "Hújjetshilik",
"doubleClick": "",
"drag": "",
"editor": "Redaktor",
"editor": "",
"editLineArrowPoints": "",
"editText": "",
"github": "",
@@ -349,7 +333,7 @@
"libraryDesc": "",
"website": "Veb-sayt",
"placeholder": {
"authorName": "Atıńız yamasa paydalanıwshı atı",
"authorName": "",
"libraryName": "",
"libraryDesc": "",
"githubHandle": "",
@@ -372,15 +356,15 @@
"content": ""
},
"confirmDialog": {
"resetLibrary": "Kitapxananı qayta ornatıw",
"resetLibrary": "",
"removeItemsFromLib": ""
},
"imageExportDialog": {
"header": "Súwretti eksportlaw",
"header": "",
"label": {
"withBackground": "Fon",
"withBackground": "",
"onlySelected": "",
"darkMode": "Qarańǵı tema",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
@@ -394,9 +378,9 @@
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Almasıw buferine kóshirip alıw"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -405,8 +389,8 @@
},
"stats": {
"angle": "",
"element": "Element",
"elements": "Elementler",
"element": "",
"elements": "",
"height": "",
"scene": "Saxna",
"selected": "Tańlandı",
@@ -419,33 +403,31 @@
"width": ""
},
"toast": {
"addedToLibrary": "Kitapxanaǵa qosıldı",
"addedToLibrary": "",
"copyStyles": "",
"copyToClipboard": "Almasıw buferine kóshirip alındı.",
"copyToClipboard": "",
"copyToClipboardAsPng": "",
"fileSaved": "Fayl saqlandı.",
"fileSavedToFilename": "{filename} saqlandı",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
"black": "Qara",
"white": "Aq",
"red": "Qızıl",
"pink": "Qızǵılt",
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "Qızǵılt kók",
"violet": "",
"gray": "",
"blue": "Kók",
"cyan": "Kók aspan",
"teal": "Piruza",
"green": "Jasıl",
"yellow": "Sarı",
"orange": "Qızǵılt sarı",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
@@ -463,40 +445,9 @@
},
"colorPicker": {
"mostUsedCustomColors": "",
"colors": "Reńler",
"colors": "",
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Súwret retinde eksportlaw",
"button": "Súwret retinde eksportlaw",
"description": ""
},
"saveToDisk": {
"title": "Diskke saqlaw",
"button": "Diskke saqlaw",
"description": ""
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "Fayldan júklew",
"button": "Fayldan júklew",
"description": ""
},
"shareableLink": {
"title": "Siltemeden júklew",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Ẓreg aseɣwen",
"editEmbed": "",
"create": "Snulfu-d aseɣwen",
"createEmbed": "",
"label": "Aseɣwen",
"labelEmbed": "",
"empty": ""
"label": "Aseɣwen"
},
"lineEditor": {
"edit": "Ẓreg izirig",
@@ -164,16 +160,13 @@
"darkMode": "Askar imsulles",
"lightMode": "Askar afaw",
"zenMode": "Askar Zen",
"objectsSnapMode": "",
"exitZenMode": "Ffeɣ seg uskar Zen",
"cancel": "Sefsex",
"clear": "Sfeḍ",
"remove": "Kkes",
"embed": "",
"publishLibrary": "Ẓreg",
"submit": "Azen",
"confirm": "Sentem",
"embeddableInteractionButton": ""
"confirm": "Sentem"
},
"alerts": {
"clearReset": "Ayagi ad isfeḍ akk taɣzut n usuneɣ. Tetḥeqqeḍ?",
@@ -203,7 +196,6 @@
"imageInsertError": "D awezɣi tugra n tugna. Eɛreḍ tikkelt-nniḍen ardeqqal...",
"fileTooBig": "Afaylu meqqer aṭas. Tiddi tafellayt yurgen d {{maxSize}}.",
"svgImageInsertError": "D awezɣi tugra n tugna SVG. Acraḍ SVG yettban-d d armeɣtu.",
"failedToFetchImage": "",
"invalidSVGString": "SVG armeɣtu.",
"cannotResolveCollabServer": "Ulamek tuqqna s aqeddac n umyalel. Ma ulac uɣilif ales asali n usebter sakin eɛreḍ tikkelt-nniḍen.",
"importLibraryError": "Ur d-ssalay ara tamkarḍit",
@@ -214,10 +206,6 @@
"line2": "Ayagi yezmer ad d-iglu s truẓi n<bold>Iferdisen n uḍris</bold>deg wunuɣen-inek.",
"line3": "Ad k-nsemter ad tsexsiḍ aɣewwar-agi. Tzemreḍ ad tḍefreḍ<link>isurifen-agi</link> ɣef wamek ara txedmeḍ.",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Rnu/leqqem aseɣwen i talɣa yettwafernen",
"eraser": "Sfeḍ",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Afus (afecku n usmutti n tmuɣli)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig",
"freeDraw": "Ssit yerna zuɣer, serreḥ ticki tfukeḍ",
"text": "Tixidest: tzemreḍ daɣen ad ternuḍ aḍris s usiti snat n tikkal anida tebɣiḍ s ufecku n tefrayt",
"embeddable": "",
"text_selected": "Ssit snat n tikkal neɣ ssed taqeffalt Kcem akken ad tẓergeḍ aḍris",
"text_editing": "Ssit Escape neɣ CtrlOrCmd+ENTER akken ad tfakkeḍ asiẓreg",
"linearElementMulti": "Ssit ɣef tenqiḍt taneggarut neɣ ssed taqeffalt Escape neɣ taqeffalt Kcem akken ad tfakkeḍ",
@@ -267,8 +252,7 @@
"bindTextToElement": "Ssed ɣef kcem akken ad ternuḍ aḍris",
"deepBoxSelect": "Ṭṭef CtrlOrCmd akken ad tferneḍ s telqey, yerna ad trewleḍ i uzuɣer",
"eraserRevert": "Ssed Alt akken ad tsefsxeḍ iferdisen yettwacerḍen i tukksa",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Ulamek abeqqeḍ n teskant",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Yettwasekles di {filename}",
"canvas": "taɣzut n usuneɣ",
"selection": "tafrayt",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Afrawan",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "",
"lightMode": "",
"zenMode": "",
"objectsSnapMode": "",
"exitZenMode": "",
"cancel": "",
"clear": "",
"remove": "",
"embed": "",
"publishLibrary": "",
"submit": "",
"confirm": "",
"embeddableInteractionButton": ""
"confirm": ""
},
"alerts": {
"clearReset": "",
@@ -203,7 +196,6 @@
"imageInsertError": "Суретті жүктеу мүмкін болмады. Кейінірек қайталап көріңіз...",
"fileTooBig": "Файл өте үлкен. Максималды рұқсат етілген көлем {{maxSize}}.",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "",
"freeDraw": "",
"text": "",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "{filename} сақталды",
"canvas": "",
"selection": "таңдау",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "រុំអត្ថបទក្នុងប្រអប់មួយ",
"link": {
"edit": "កែតំណភ្ជាប់",
"editEmbed": "",
"create": "បង្កើតតំណភ្ជាប់",
"createEmbed": "",
"label": "តំណ",
"labelEmbed": "",
"empty": ""
"label": "តំណ"
},
"lineEditor": {
"edit": "កែសម្រួលបន្ទាត់",
@@ -164,16 +160,13 @@
"darkMode": "ម៉ូដងងឹត",
"lightMode": "ម៉ូដភ្លឺ",
"zenMode": "ម៉ូត Zen",
"objectsSnapMode": "",
"exitZenMode": "ចេញពី zen ម៉ូត",
"cancel": "បោះបង់",
"clear": "សម្អាត",
"remove": "ដកចេញ",
"embed": "",
"publishLibrary": "បោះពុម្ពផ្សាយ",
"submit": "ដាក់​ស្នើ",
"confirm": "បញ្ជាក់",
"embeddableInteractionButton": ""
"confirm": "បញ្ជាក់"
},
"alerts": {
"clearReset": "វានឹងសម្អាតបាវទាំងមូល។ តើ​អ្នក​ប្រាកដ​ឬ​អត់?",
@@ -203,7 +196,6 @@
"imageInsertError": "មិនអាចបញ្ចូលរូបភាពបានទេ។ សូម​ព្យាយាម​ម្តង​ទៀត​នៅ​ពេល​ក្រោយ……",
"fileTooBig": "ឯកសារធំពេក។ ទំហំអតិបរមាដែលអនុញ្ញាតគឺ {{maxSize}}។",
"svgImageInsertError": "មិនអាចបញ្ចូលរូបភាព SVG បានទេ។ ស្លាក SVG ហាក់ដូចជាមិនត្រឹមត្រូវ។",
"failedToFetchImage": "",
"invalidSVGString": "SVG មិន​ត្រឹមត្រូវ។",
"cannotResolveCollabServer": "មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេសហការផ្ទាល់បានទេ។ សូមផ្ទុកទំព័រឡើងវិញ ហើយព្យាយាមម្តងទៀត។",
"importLibraryError": "មិនអាចផ្ទុកបណ្ណាល័យបានទេ។",
@@ -214,10 +206,6 @@
"line2": "វាអាចបណ្តាលឱ្យមានការបំបែក <bold>ធាតុអត្ថបទ</bold> នៅក្នុងគំនូររបស់អ្នក។",
"line3": "យើងណែនាំយ៉ាងមុតមាំឱ្យបិទការកំណត់នេះ។ អ្នកអាចអនុវត្តតាម <link>ជំហានទាំងនេះ</link> ដើម្បីបិទការកំណត់នេះ។",
"line4": "ប្រសិនបើការបិទការកំណត់នេះមិនបានជួសជុលការបង្ហាញធាតុអត្ថបទទេ សូមដាក់ <issueLink>issue</issueLink> នៅលើ GitHub ឬរាយការណ៍នៅលើ <discordLink>Discord</discordLink> របស់យើង"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "បន្ថែម/ធ្វើបច្ចុប្បន្នភាពតំណភ្ជាប់សម្រាប់រូបរាងដែលបានជ្រើសរើស",
"eraser": "ជ័រលុប",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "ដៃ (panning tool)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "ចុចដើម្បីបង្កើតចំណុចច្រើន អូសដើម្បីបង្កើតបន្ទាត់មួយ",
"freeDraw": "ចុច​ហើយ​អូស លែង​ពេល​រួចរាល់",
"text": "គន្លឹះ៖ អ្នកក៏អាចបន្ថែមអត្ថបទដោយចុចពីរដងនៅកន្លែងណាមួយដោយប្រើឧបករណ៍ជ្រើសរើស",
"embeddable": "",
"text_selected": "ចុចពីរដង ឬចុច ENTER ដើម្បីកែសម្រួលអត្ថបទ",
"text_editing": "ចុច Escape ឬ CtrlOrCmd +ENTER ដើម្បីបញ្ចប់ការកែសម្រួល",
"linearElementMulti": "ចុចលើចំណុចចុងក្រោយ ឬចុច Esc/Enter ដើម្បីបញ្ចប់",
@@ -267,8 +252,7 @@
"bindTextToElement": "ចុច Enter ដើម្បីបន្ថែមអត្ថបទ",
"deepBoxSelect": "សង្កត់ CtrlOrCmd ដើម្បីជ្រើសរើសយ៉ាងជ្រៅ និងជៀសវាងការអូស",
"eraserRevert": "សង្កត់ Alt ដើម្បីដកការជ្រើសរើសធាតុដែលត្រូវបានសម្គាល់សម្រាប់ការលុប",
"firefox_clipboard_write": "បើកមុខងារនេះដោយកំណត់ទង់ \"dom.events.asyncClipboard.clipboardItem\" ទៅ \"true\" \nដើម្បីផ្លាស់ប្តូរទង់កម្មវិធីរុករកនៅក្នុង Firefox សូមចូលទៅកាន់ទំព័រ \"about:config\"។",
"disableSnapping": ""
"firefox_clipboard_write": "បើកមុខងារនេះដោយកំណត់ទង់ \"dom.events.asyncClipboard.clipboardItem\" ទៅ \"true\" \nដើម្បីផ្លាស់ប្តូរទង់កម្មវិធីរុករកនៅក្នុង Firefox សូមចូលទៅកាន់ទំព័រ \"about:config\"។"
},
"canvasError": {
"cannotShowPreview": "មិនអាចបង្ហាញការមើលជាមុនបាន",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "បានរក្សាទុកនៅក្នុង {filename}",
"canvas": "តំបន់គំនូរ",
"selection": "ការជ្រើសរើស",
"pasteAsSingleElement": "ប្រើ {{shortcut}} ដើម្បីបិទភ្ជាប់ជាធាតុតែមួយ,\nឬបិទភ្ជាប់ទៅក្នុងកម្មវិធីនិពន្ធអត្ថបទដែលមានស្រាប់",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "ប្រើ {{shortcut}} ដើម្បីបិទភ្ជាប់ជាធាតុតែមួយ,\nឬបិទភ្ជាប់ទៅក្នុងកម្មវិធីនិពន្ធអត្ថបទដែលមានស្រាប់"
},
"colors": {
"transparent": "ថ្លាមើលធ្លុះ",
@@ -467,36 +449,5 @@
"shades": "ស្រមោល",
"hexCode": "លេខកូដ hex",
"noShades": "មិនមានស្រមោលសម្រាប់ពណ៌នេះទេ"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+5 -54
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "텍스트를 컨테이너에 담기",
"link": {
"edit": "링크 수정하기",
"editEmbed": "링크 & 임베드 수정하기",
"create": "링크 만들기",
"createEmbed": "링크 & 임베드 만들기",
"label": "링크",
"labelEmbed": "링크 & 임베드",
"empty": "링크를 지정하지 않았습니다"
"label": "링크"
},
"lineEditor": {
"edit": "선 수정하기",
@@ -164,16 +160,13 @@
"darkMode": "다크 모드",
"lightMode": "밝은 모드",
"zenMode": "젠 모드",
"objectsSnapMode": "다른 요소들에 정렬시키기",
"exitZenMode": "젠 모드 종료하기",
"cancel": "취소",
"clear": "지우기",
"remove": "삭제",
"embed": "임베딩 토글",
"publishLibrary": "게시하기",
"submit": "제출",
"confirm": "확인",
"embeddableInteractionButton": "클릭하여 상호작용"
"confirm": "확인"
},
"alerts": {
"clearReset": "모든 작업 내용이 초기화됩니다. 계속하시겠습니까?",
@@ -203,7 +196,6 @@
"imageInsertError": "이미지를 삽입할 수 없습니다. 나중에 다시 시도 하십시오",
"fileTooBig": "파일이 너무 큽니다. 최대 크기는 {{maxSize}} 입니다.",
"svgImageInsertError": "SVG 이미지를 삽입하지 못했습니다. SVG 문법이 유효하지 않은 것 같습니다.",
"failedToFetchImage": "이미지를 가져오는데 실패했습니다.",
"invalidSVGString": "유효하지 않은 SVG입니다.",
"cannotResolveCollabServer": "협업 서버에 접속하는데 실패했습니다. 페이지를 새로고침하고 다시 시도해보세요.",
"importLibraryError": "라이브러리를 불러오지 못했습니다.",
@@ -214,10 +206,6 @@
"line2": "이 기능으로 인해 화이트보드의 <bold>텍스트 요소들</bold>이 손상될 수 있습니다.",
"line3": "저희는 해당 기능을 비활성화하는 것을 강력히 권장 드립니다. 비활성화 방법에 대해서는 <link>이 게시글</link>을 참고해주세요.",
"line4": "만약 이 설정을 껐음에도 텍스트 요소들이 올바르게 표시되지 않는다면, 저희 Github에 <issueLink>이슈</issueLink>를 올려주시거나 <discordLink>Discord</discordLink>로 알려주세요."
},
"libraryElementTypeError": {
"embeddable": "임베드 요소들은 라이브러리에 추가할 수 없습니다.",
"image": "라이브러리에 이미지 삽입 기능은 곧 지원될 예정입니다!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "선택한 도형에 대해서 링크를 추가/업데이트",
"eraser": "지우개",
"frame": "프레임 도구",
"embeddable": "웹 임베드",
"laser": "레이저 포인터",
"hand": "손 (패닝 도구)",
"extraTools": "다른 도구"
},
@@ -251,7 +237,6 @@
"linearElement": "여러 점을 연결하려면 클릭하고, 직선을 그리려면 바로 드래그하세요.",
"freeDraw": "클릭 후 드래그하세요. 완료되면 놓으세요.",
"text": "팁: 선택 툴로 아무 곳이나 더블 클릭해 텍스트를 추가할 수도 있습니다.",
"embeddable": "클릭 및 드래그하여 웹사이트 임베드 만들기",
"text_selected": "더블 클릭 또는 ENTER를 눌러서 텍스트 수정",
"text_editing": "ESC나 CtrlOrCmd+ENTER를 눌러서 수정을 종료하기",
"linearElementMulti": "마지막 지점을 클릭하거나 Esc 또는 Enter 키를 눌러 완료하세요.",
@@ -267,8 +252,7 @@
"bindTextToElement": "Enter 키를 눌러서 텍스트 추가하기",
"deepBoxSelect": "CtrlOrCmd 키를 눌러서 깊게 선택하고, 드래그하지 않도록 하기",
"eraserRevert": "Alt를 눌러서 삭제하도록 지정된 요소를 되돌리기",
"firefox_clipboard_write": "이 기능은 설정에서 \"dom.events.asyncClipboard.clipboardItem\" 플래그를 \"true\"로 설정하여 활성화할 수 있습니다. Firefox에서 브라우저 플래그를 수정하려면, \"about:config\" 페이지에 접속하세요.",
"disableSnapping": "CtrlOrCmd 키를 눌러서 다른 요소와의 정렬 무시하기"
"firefox_clipboard_write": "이 기능은 설정에서 \"dom.events.asyncClipboard.clipboardItem\" 플래그를 \"true\"로 설정하여 활성화할 수 있습니다. Firefox에서 브라우저 플래그를 수정하려면, \"about:config\" 페이지에 접속하세요."
},
"canvasError": {
"cannotShowPreview": "미리보기를 볼 수 없습니다",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "{filename} 로 저장되었습니다",
"canvas": "캔버스",
"selection": "선택한 요소",
"pasteAsSingleElement": "단일 요소로 붙여넣거나, 기존 텍스트 에디터에 붙여넣으려면 {{shortcut}} 을 사용하세요.",
"unableToEmbed": "이 URL의 임베딩이 허용되지 않았습니다. GitHub에 이슈를 남겨서 이 URL이 화이트리스트에 등재될 수 있도록 요청하세요",
"unrecognizedLinkFormat": "임베딩하려는 링크의 형식이 잘못된 것 같습니다. 원본 사이트에서 제공하는 \"임베딩\" 텍스트를 그대로 붙여 넣어 주세요"
"pasteAsSingleElement": "단일 요소로 붙여넣거나, 기존 텍스트 에디터에 붙여넣으려면 {{shortcut}} 을 사용하세요."
},
"colors": {
"transparent": "투명",
@@ -462,41 +444,10 @@
}
},
"colorPicker": {
"mostUsedCustomColors": "가장 많이 사용 색상들",
"mostUsedCustomColors": "많이 쓰이는 사용 색상들",
"colors": "색상",
"shades": "색조",
"hexCode": "Hex 코드",
"noShades": "사용할 수 있는 색조가 없음"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "이미지로 내보내기",
"button": "이미지로 내보내기",
"description": "나중에 다시 불러올 수 있도록 화면 데이터를 이미지로 내보냅니다."
},
"saveToDisk": {
"title": "디스크에 저장",
"button": "디스크에 저장",
"description": "나중에 다시 불러올 수 있도록 화면 데이터를 내보냅니다."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Excalidraw+로 내보내기",
"description": "화면을 당신의 Excalidraw+ 작업 공간으로 저장합니다."
}
},
"modal": {
"loadFromFile": {
"title": "파일에서 불러오기",
"button": "파일에서 불러오기",
"description": "파일을 불러오면 <bold>현재 작성된 데이터를 덮어쓰게 됩니다</bold>.<br></br>다음 옵션 중 하나를 선택하여 작업물을 백업해 둘 수 있습니다."
},
"shareableLink": {
"title": "주소에서 불러오기",
"button": "컨텐츠를 덮어쓰기",
"description": "외부 작업물을 불러오면 <bold>현재 작성된 데이터를 덮어쓰게 됩니다</bold>.<br></br>다음 옵션 중 하나를 선택하여 작업물을 백업해 둘 수 있습니다."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "دەق لە چوارچێوەیەکدا بپێچە",
"link": {
"edit": "دەستکاریکردنی بەستەر",
"editEmbed": "",
"create": "دروستکردنی بەستەر",
"createEmbed": "",
"label": "بەستەر",
"labelEmbed": "",
"empty": ""
"label": "بەستەر"
},
"lineEditor": {
"edit": "دەستکاری کردنی دێڕ",
@@ -164,16 +160,13 @@
"darkMode": "دۆخی تاریک",
"lightMode": "دۆخی ڕووناک",
"zenMode": "دۆخی زێن",
"objectsSnapMode": "",
"exitZenMode": "بەجێهێشتنی دۆخی زێن",
"cancel": "هەڵوەشاندنەوە",
"clear": "خاوێنکردنەوە",
"remove": "لابردن",
"embed": "",
"publishLibrary": "بڵاوکردنەوە",
"submit": "پێشکەشکردن",
"confirm": "دوپاتکردنەوە",
"embeddableInteractionButton": ""
"confirm": "دوپاتکردنەوە"
},
"alerts": {
"clearReset": "ئەمە هەموو تابلۆکە خاوێن دەکاتەوە، دڵنیایت؟",
@@ -203,7 +196,6 @@
"imageInsertError": "نەیتوانی وێنە داخڵ بکات. دواتر هەوڵ بدە",
"fileTooBig": "فایلەکە زۆر گەورەیە. زۆرترین قەبارەی ڕێگەپێدراو {{maxSize}}}.",
"svgImageInsertError": "نەیتوانی وێنەی SVG داخڵ بکات. نیشانەی ئێس ڤی جی نادروست دیارە.",
"failedToFetchImage": "",
"invalidSVGString": "ئێس ڤی جی نادروستە.",
"cannotResolveCollabServer": "ناتوانێت پەیوەندی بکات بە سێرڤەری کۆلاب. تکایە لاپەڕەکە دووبارە باربکەوە و دووبارە هەوڵ بدەوە.",
"importLibraryError": "نەیتوانی کتێبخانە بار بکات",
@@ -214,10 +206,6 @@
"line2": "ئەمە ئەکرێ ببێتە هۆی تێکدانی <bold>دانە دەقییەکان</bold> لە وێنەکێشانەکانتدا.",
"line3": "ئێمە بە توندی پێشنیاری لەکارخستنی ئەم ڕێکخستنە دەکەین. بۆ لە کارخستنی دەتوانیت بەم <link>هەنگاوانە</link>دا بڕۆیت.",
"line4": "ئەگەر لەکارخستنی ئەم ڕێکخستنە نەبوە هۆی چاککردنەوەی پێشاندانی دانە دەقییەکان، تکایە <issueLink>کێشە</issueLink>یەک بکەرەوە لەسەر گیتهەبەکەمان، یان بۆمان بنوسە لەسەر <discordLink>دیسکۆرد</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "زیادکردن/ نوێکردنەوەی لینک بۆ شێوەی دیاریکراو",
"eraser": "سڕەر",
"frame": "ئامرازی چوارچێوە",
"embeddable": "",
"laser": "",
"hand": "دەست (ئامرازی پانکردن)",
"extraTools": "ئامرازی زیاتر"
},
@@ -251,7 +237,6 @@
"linearElement": "کرتە بکە بۆ دەستپێکردنی چەند خاڵێک، ڕایبکێشە بۆ یەک هێڵ",
"freeDraw": "کرتە بکە و ڕایبکێشە، کاتێک تەواو بوویت دەست هەڵگرە",
"text": "زانیاری: هەروەها دەتوانیت دەق زیادبکەیت بە دوو کرتەکردن لە هەر شوێنێک لەگەڵ ئامڕازی دەستنیشانکردن",
"embeddable": "",
"text_selected": "دووجار کلیک بکە یان ENTER بکە بۆ دەستکاریکردنی دەق",
"text_editing": "بۆ تەواوکردنی دەستکاریکردنەکە Escape یان Ctrl/Cmd+ENTER بکە",
"linearElementMulti": "کلیک لەسەر کۆتا خاڵ بکە یان Escape یان Enter بکە بۆ تەواوکردن",
@@ -267,8 +252,7 @@
"bindTextToElement": "بۆ زیادکردنی دەق enter بکە",
"deepBoxSelect": "CtrlOrCmd ڕابگرە بۆ هەڵبژاردنی قووڵ، و بۆ ڕێگریکردن لە ڕاکێشان",
"eraserRevert": "بۆ گەڕاندنەوەی ئەو توخمانەی کە بۆ سڕینەوە نیشانە کراون، Alt ڕابگرە",
"firefox_clipboard_write": "ئەم تایبەتمەندییە بە ئەگەرێکی زۆرەوە دەتوانرێت چالاک بکرێت بە ڕێکخستنی ئاڵای \"dom.events.asyncClipboard.clipboardItem\" بۆ \"true\". بۆ گۆڕینی ئاڵاکانی وێبگەڕ لە فایەرفۆکسدا، سەردانی لاپەڕەی \"about:config\" بکە.",
"disableSnapping": ""
"firefox_clipboard_write": "ئەم تایبەتمەندییە بە ئەگەرێکی زۆرەوە دەتوانرێت چالاک بکرێت بە ڕێکخستنی ئاڵای \"dom.events.asyncClipboard.clipboardItem\" بۆ \"true\". بۆ گۆڕینی ئاڵاکانی وێبگەڕ لە فایەرفۆکسدا، سەردانی لاپەڕەی \"about:config\" بکە."
},
"canvasError": {
"cannotShowPreview": "ناتوانرێ پێشبینین پیشان بدرێت",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "هەڵگیراوە بۆ {filename}",
"canvas": "تابلۆ",
"selection": "دەستنیشانکراوەکان",
"pasteAsSingleElement": "بۆ دانانەوە وەکو یەک توخم یان دانانەوە بۆ نێو دەسکاریکەرێکی دەق کە بوونی هەیە {{shortcut}} بەکاربهێنە",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "بۆ دانانەوە وەکو یەک توخم یان دانانەوە بۆ نێو دەسکاریکەرێکی دەق کە بوونی هەیە {{shortcut}} بەکاربهێنە"
},
"colors": {
"transparent": "ڕوون",
@@ -467,36 +449,5 @@
"shades": "سێبەرەکان",
"hexCode": "کۆدی هێکس",
"noShades": "هیچ سێبەرێک بۆ ئەم ڕەنگە بەردەست نییە"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Redeguoti nuorodą",
"editEmbed": "",
"create": "Sukurti nuorodą",
"createEmbed": "",
"label": "Nuoroda",
"labelEmbed": "",
"empty": ""
"label": "Nuoroda"
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "Tamsus režimas",
"lightMode": "Šviesus režimas",
"zenMode": "„Zen“ režimas",
"objectsSnapMode": "",
"exitZenMode": "Išeiti iš „Zen“ režimo",
"cancel": "Atšaukti",
"clear": "Išvalyti",
"remove": "Pašalinti",
"embed": "",
"publishLibrary": "Paskelbti",
"submit": "Pateikti",
"confirm": "Patvirtinti",
"embeddableInteractionButton": ""
"confirm": "Patvirtinti"
},
"alerts": {
"clearReset": "",
@@ -203,7 +196,6 @@
"imageInsertError": "Nepyko įkelti paveiksliuko. Pabandyk vėliau...",
"fileTooBig": "Per didelis failas. Didžiausias leidžiamas dydis yra {{maxSize}}.",
"svgImageInsertError": "Nepavyko įtraukti SVG paveiksliuko. Panašu, jog SVG yra nevalidus.",
"failedToFetchImage": "",
"invalidSVGString": "Nevalidus SVG.",
"cannotResolveCollabServer": "Nepavyko prisijungti prie serverio bendradarbiavimui. Perkrauk puslapį ir pabandyk prisijungti dar kartą.",
"importLibraryError": "Nepavyko įkelti bibliotekos",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Pridėti / Atnaujinti pasirinktos figūros nuorodą",
"eraser": "Trintukas",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Paspaudimai sukurs papildomus taškus, nepertraukiamas tempimas sukurs liniją",
"freeDraw": "Spausk ir tempk, paleisk kai norėsi pabaigti",
"text": "Užuomina: tekstą taip pat galima pridėti bet kur su dvigubu pelės paspaudimu, kol parinkas žymėjimo įrankis",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Išsaugota į {filename}",
"canvas": "drobė",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Permatoma",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Ietilpināt tekstu figurā",
"link": {
"edit": "Rediģēt saiti",
"editEmbed": "",
"create": "Izveidot saiti",
"createEmbed": "",
"label": "Saite",
"labelEmbed": "",
"empty": ""
"label": "Saite"
},
"lineEditor": {
"edit": "Rediģēt līniju",
@@ -164,16 +160,13 @@
"darkMode": "Tumšais režīms",
"lightMode": "Gaišais režīms",
"zenMode": "Zen režīms",
"objectsSnapMode": "",
"exitZenMode": "Pamest Zen režīmu",
"cancel": "Atcelt",
"clear": "Notīrīt",
"remove": "Noņemt",
"embed": "",
"publishLibrary": "Publicēt",
"submit": "Iesniegt",
"confirm": "Apstiprināt",
"embeddableInteractionButton": ""
"confirm": "Apstiprināt"
},
"alerts": {
"clearReset": "Šī funkcija notīrīs visu tāfeli. Vai turpināt?",
@@ -203,7 +196,6 @@
"imageInsertError": "Nevarēja ievietot attēlu. Mēģiniet vēlāk...",
"fileTooBig": "Datne ir par lielu. Lielākais atļautais izmērs ir {{maxSize}}.",
"svgImageInsertError": "Nevarēja ievietot SVG attēlu. Šķiet, ka SVG marķējums nav derīgs.",
"failedToFetchImage": "",
"invalidSVGString": "Nederīgs SVG.",
"cannotResolveCollabServer": "Nevarēja savienoties ar sadarbošanās serveri. Lūdzu, pārlādējiet lapu un mēģiniet vēlreiz.",
"importLibraryError": "Nevarēja ielādēt bibliotēku",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Pievienot/rediģēt atlasītās figūras saiti",
"eraser": "Dzēšgumija",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Roka (panoramēšanas rīks)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Klikšķiniet, lai sāktu zīmēt vairākus punktus; velciet, lai zīmētu līniju",
"freeDraw": "Spiediet un velciet; atlaidiet, kad pabeidzat",
"text": "Ieteikums: lai pievienotu tekstu, varat arī jebkur dubultklikšķināt ar atlases rīku",
"embeddable": "",
"text_selected": "Dubultklikšķiniet vai spiediet ievades taustiņu, lai rediģētu tekstu",
"text_editing": "Spiediet iziešanas taustiņu vai CtrlOrCmd+ENTER, lai beigtu rediģēt",
"linearElementMulti": "Klikšķiniet uz pēdējā punkta vai spiediet izejas vai ievades taustiņu, lai pabeigtu",
@@ -267,8 +252,7 @@
"bindTextToElement": "Spiediet ievades taustiņu, lai pievienotu tekstu",
"deepBoxSelect": "Turient nospiestu Ctrl vai Cmd, lai atlasītu dziļumā un lai nepieļautu objektu pavilkšanu",
"eraserRevert": "Turiet Alt, lai noņemtu elementus no dzēsšanas atlases",
"firefox_clipboard_write": "Šis iestatījums var tikt ieslēgts ar \"dom.events.asyncClipboard.clipboardItem\" marķieri pārslēgtu uz \"true\". Lai mainītu pārlūka marķierus Firefox, apmeklē \"about:config\" lapu.",
"disableSnapping": ""
"firefox_clipboard_write": "Šis iestatījums var tikt ieslēgts ar \"dom.events.asyncClipboard.clipboardItem\" marķieri pārslēgtu uz \"true\". Lai mainītu pārlūka marķierus Firefox, apmeklē \"about:config\" lapu."
},
"canvasError": {
"cannotShowPreview": "Nevar rādīt priekšskatījumu",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Saglabāts kā {filename}",
"canvas": "tāfeli",
"selection": "atlasi",
"pasteAsSingleElement": "Izmantojiet {{shortcut}}, lai ielīmētu kā jaunu elementu, vai ielīmētu esošā teksta lauciņā",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Izmantojiet {{shortcut}}, lai ielīmētu kā jaunu elementu, vai ielīmētu esošā teksta lauciņā"
},
"colors": {
"transparent": "Caurspīdīgs",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "मजकूर कंटेनर मधे मोडून दाखवा",
"link": {
"edit": "दुवा संपादन",
"editEmbed": "",
"create": "दुवा तयार करा",
"createEmbed": "",
"label": "दुवा",
"labelEmbed": "",
"empty": ""
"label": "दुवा"
},
"lineEditor": {
"edit": "रेघ संपादन",
@@ -164,16 +160,13 @@
"darkMode": "अंधार स्थिथि",
"lightMode": "उजेड स्थिति",
"zenMode": "ध्यानग्र स्थिति",
"objectsSnapMode": "वस्तूंपासून पकड़ा",
"exitZenMode": "ध्यानग्र स्थितितून बाहेर",
"cancel": "रद्द",
"clear": "स्वछ",
"remove": "हटवा",
"embed": "",
"publishLibrary": "प्रकाशित करा",
"submit": "जमा करा",
"confirm": "पुष्टि करा",
"embeddableInteractionButton": ""
"confirm": "पुष्टि करा"
},
"alerts": {
"clearReset": "पटल स्वच्छ होणार, तुम्हाला खात्री आहे का?",
@@ -203,7 +196,6 @@
"imageInsertError": "प्रतिमा आत घालता येत नाही. नंतर पुन्हा प्रयत्न करा...",
"fileTooBig": "फाइल फार मोठी आहे. आकाराची कमाल परवानगी {{maxSize}} आहे.",
"svgImageInsertError": "एस-वी-जी प्रतिमा आत घालवू शकलो नाही. एस-वी-जी-मार्क-अप यंत्र अयोग्य आहे.",
"failedToFetchImage": "",
"invalidSVGString": "अयोग्य एस-वी-जी.",
"cannotResolveCollabServer": "कॉलेब-सर्वर हे पोहोचत नाही आहे. पान परत लोड करायचा प्रयत्न करावे.",
"importLibraryError": "संग्रह प्रतिस्थापित नाही करता आला",
@@ -214,10 +206,6 @@
"line2": "हे तुमच्या चित्रांच्या <bold>पाठ तत्वांनां </bold> खंडित करू शकतात.",
"line3": "तुम्हाला आमच्या कड़ून खूप आग्रह आहे की हे सेटिंग्स मधले चयन नका करु. <link>हे अनुक्रम </link> हे कसे करावे हे दाखवु शकते.",
"line4": "ही सेटिंग अक्षम करूनही पृष्ठ योग्यरित्या प्रदर्शित होत नसल्यास, आमच्या GitHub वर <issueLink>समस्या</issueLink> सबमिट करा, किव्हा <discordLink>डिस्कॉर्ड</discordLink> वर आम्हाला लिहा"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "निवडलेल्या आकारासाठी दुवा जोडा/बदल करा",
"eraser": "खोड रबर",
"frame": "",
"embeddable": "",
"laser": "लेसर टॉर्च",
"hand": "हात ( सरकवण्या चे उपकरण)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "अनेक बिंदु साठी क्लिक करा, रेघे साठी ड्रैग करा",
"freeDraw": "क्लिक आणि ड्रैग करा, झालं तेव्हा सोडा",
"text": "टीप: तुम्हीं निवड यंत्रानी कोठेही दुहेरी क्लिक करून टेक्स्ट जोडू शकता",
"embeddable": "",
"text_selected": "लेखन संपादन साठी दुहेरी क्लिक करा किव्हा एंटर दाबा",
"text_editing": "संपादन संपवायचं असल्यास एस्केप दाबा किव्हा कंट्रोल या कम्मांड बरोबार एंटर दाबा",
"linearElementMulti": "शेवटच्या बिंदु वर क्लिक करा किव्हा एस्केप या एंटर दाबा",
@@ -267,8 +252,7 @@
"bindTextToElement": "मजकूर जोडण्यासाठी एंटर की दाबा",
"deepBoxSelect": "खोल निवड ह्या साठी कंट्रोल किव्हा कमांड दाबून ठेवा, आणि बाहेर खेचणे वाचवण्या साठी पण",
"eraserRevert": "खोडण्या साठी घेतलेल्या वस्तु ना घेण्या साठी Alt दाबून ठेवावे",
"firefox_clipboard_write": "हे वैशिष्ट्य \"dom.events.asyncClipboard.clipboardItem\" फ्लॅग \"सत्य\" वर सेट करून शक्यतो सक्षम केले जाऊ शकते. Firefox मध्ये ब्राउझर फ्लॅग बदलण्यासाठी, \"about:config\" पृष्ठावर जा.",
"disableSnapping": "स्नैपिंग अक्षम करण्या साठी CtrlOrCmd दाबून ठेवा"
"firefox_clipboard_write": "हे वैशिष्ट्य \"dom.events.asyncClipboard.clipboardItem\" फ्लॅग \"सत्य\" वर सेट करून शक्यतो सक्षम केले जाऊ शकते. Firefox मध्ये ब्राउझर फ्लॅग बदलण्यासाठी, \"about:config\" पृष्ठावर जा."
},
"canvasError": {
"cannotShowPreview": "पूर्वावलोकन दाखवू शकत नाही",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "{filename} मधे जतन झाली",
"canvas": "पटल",
"selection": "निवड",
"pasteAsSingleElement": "एक घटक म्हणून चिपकावण्या साठी {{shortcut}} वापरा,\nकिंवा विद्यमान मजकूर संपादकात चिपकवा",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "एक घटक म्हणून चिपकावण्या साठी {{shortcut}} वापरा,\nकिंवा विद्यमान मजकूर संपादकात चिपकवा"
},
"colors": {
"transparent": "पारदर्शक",
@@ -467,36 +449,5 @@
"shades": "रंगछटा",
"hexCode": "हेक्स कोड",
"noShades": "ह्या रंगाच्या छटा उपलब्ध नाहित"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "छवि स्वरूपे निर्यात करा",
"button": "छवि स्वरूपे निर्यात करा",
"description": "सीन डेटा बाहेर एक फ़ाइल मधे जतन करा, त्या फ़ाइल मधुन तो डेटा नंतर परत आणु शकता."
},
"saveToDisk": {
"title": "डिस्क मधे जतन करा",
"button": "डिस्क मधे जतन करा",
"description": "सीन डेटा बाहेर एक फ़ाइल मधे जतन करा, त्या फ़ाइल मधुन तो डेटा नंतर परत आणु शकता."
},
"excalidrawPlus": {
"title": "एक्षकालीड्रॉ +",
"button": "एक्षकाली ड्रॉ+ मधे निर्यात करा",
"description": "दृष्य तुमच्या एक्षकालीड्रॉ+ चा कार्यस्थल मधे जतन करा."
}
},
"modal": {
"loadFromFile": {
"title": "फ़ाइल मधुन लोड करा",
"button": "फ़ाइल मधुन लोड करा",
"description": "फ़ाइल मधुन लोड केल्या वर ते <bold>तुमचा सध्याचा कामा ठिकाणि एईल </bold><br></br> तुम्हीं तुमचं चित्र एकाधं खाली दिलेलं विकल्प निवडुन पहले सुरक्षीत करु शकता."
},
"shareableLink": {
"title": "लिंक पासून लोड करा",
"button": "माझ सध्याचे कार्य बदला",
"description": "बाहरी चित्र लोड केल्या वर ते <bold>तुमचा सध्याचा कामा ठिकाणि एईल </bold><br></br> तुम्हीं तुमचं चित्र एकाधं खाली दिलेलं विकल्प निवडुन पहले सुरक्षीत करु शकता."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "",
"lightMode": "",
"zenMode": "",
"objectsSnapMode": "",
"exitZenMode": "ဇင်မြင်ကွင်းမှထွက်",
"cancel": "",
"clear": "",
"remove": "",
"embed": "",
"publishLibrary": "",
"submit": "",
"confirm": "",
"embeddableInteractionButton": ""
"confirm": ""
},
"alerts": {
"clearReset": "ကားချပ်တစ်ခုလုံးရှင်းလင်းပါတော့မည်။ အတည်ပြုပါ။",
@@ -203,7 +196,6 @@
"imageInsertError": "",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "အမှတ်များချမှတ်ရေးဆွဲရန်ကလစ်နှိပ်ပါ၊ မျဉ်းတစ်ကြောင်းတည်းအတွက် တရွတ်ဆွဲပါ။",
"freeDraw": "ကလစ်နှိပ်၍ တရွတ်ဆွဲပါ၊ ပြီးလျှင်လွှတ်ပါ။",
"text": "မှတ်ချက်။ ။မည်သည့်ကိရိယာရွေးထားသည်ဖြစ်စေ ကလစ်နှစ်ချက်နှိပ်၍စာသားထည့်နိုင်သည်",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "နောက်ဆုံးအမှတ်ပေါ်တွင်ကလစ်နှိပ်ခြင်း၊ Escape (သို့) Enter နှိပ်ခြင်းတို့ဖြင့်အဆုံးသတ်နိုင်",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "နမူနာမပြသနိုင်ပါ",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "La tekst flyte i en beholder",
"link": {
"edit": "Rediger lenke",
"editEmbed": "Rediger lenke og bygg inn",
"create": "Opprett lenke",
"createEmbed": "Opprett lenke og bygg inn",
"label": "Lenke",
"labelEmbed": "Lenk & bygg inn",
"empty": "Ingen lenke er valgt"
"label": "Lenke"
},
"lineEditor": {
"edit": "Rediger linje",
@@ -164,16 +160,13 @@
"darkMode": "Mørk modus",
"lightMode": "Lys modus",
"zenMode": "Zen-modus",
"objectsSnapMode": "",
"exitZenMode": "Avslutt zen-modus",
"cancel": "Avbryt",
"clear": "Tøm",
"remove": "Fjern",
"embed": "Slå av/på innebygging",
"publishLibrary": "Publiser",
"submit": "Send inn",
"confirm": "Bekreft",
"embeddableInteractionButton": "Klikk for å samhandle"
"confirm": "Bekreft"
},
"alerts": {
"clearReset": "Dette vil tømme lerretet. Er du sikker?",
@@ -203,7 +196,6 @@
"imageInsertError": "Kunne ikke sette inn bildet. Prøv igjen senere...",
"fileTooBig": "Filen er for stor. Maksimal tillatt størrelse er {{maxSize}}.",
"svgImageInsertError": "Kunne ikke sette inn SVG-bilde. SVG-koden ser ugyldig ut.",
"failedToFetchImage": "",
"invalidSVGString": "Ugyldig SVG.",
"cannotResolveCollabServer": "Kunne ikke koble til samarbeidsserveren. Vennligst oppdater siden og prøv på nytt.",
"importLibraryError": "Kunne ikke laste bibliotek",
@@ -214,10 +206,6 @@
"line2": "Dette kan resultere i å bryte <bold>tekst-elementene</bold> i tegningene.",
"line3": "Vi anbefaler på det sterkeste å deaktivere denne innstillingen. Du kan følge <link>disse trinnene</link> om hvordan du gjør det.",
"line4": "Hvis deaktivering av denne innstillingen ikke fikser visningen av tekstelementer, vennligst åpne en <issueLink>sak</issueLink> på vår GitHub, eller skriv oss på <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Innebygde elementer kan ikke legges til i biblioteket.",
"image": "Støtte for å legge til bilder i biblioteket kommer snart!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Legg til / oppdater link for en valgt figur",
"eraser": "Viskelær",
"frame": "Rammeverktøy",
"embeddable": "Nettinnbygging",
"laser": "",
"hand": "Hånd (panoreringsverktøy)",
"extraTools": "Flere verktøy"
},
@@ -251,7 +237,6 @@
"linearElement": "Klikk for å starte linje med flere punkter, eller dra for en enkel linje",
"freeDraw": "Klikk og dra, slipp når du er ferdig",
"text": "Tips: du kan også legge til tekst ved å dobbeltklikke hvor som helst med utvalgsverktøyet",
"embeddable": "Klikk og dra for å opprette en nettside innebygd",
"text_selected": "Dobbeltklikk eller trykk ENTER for å redigere tekst",
"text_editing": "Trykk Escape eller Ctrl/Cmd+Enter for å fullføre redigering",
"linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre",
@@ -267,8 +252,7 @@
"bindTextToElement": "Trykk Enter for å legge til tekst",
"deepBoxSelect": "Hold CTRL/CMD for å markere dypt og forhindre flytting",
"eraserRevert": "Hold Alt for å reversere elementene merket for sletting",
"firefox_clipboard_write": "Denne funksjonen kan sannsynligvis aktiveres ved å sette \"dom.events.asyncClipboard.clipboardItem\" flagget til \"true\". For å endre nettleserens flagg i Firefox, besøk \"about:config\"-siden.",
"disableSnapping": ""
"firefox_clipboard_write": "Denne funksjonen kan sannsynligvis aktiveres ved å sette \"dom.events.asyncClipboard.clipboardItem\" flagget til \"true\". For å endre nettleserens flagg i Firefox, besøk \"about:config\"-siden."
},
"canvasError": {
"cannotShowPreview": "Kan ikke vise forhåndsvisning",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Lagret til {filename}",
"canvas": "lerret",
"selection": "utvalg",
"pasteAsSingleElement": "Bruk {{shortcut}} for å lime inn som ett enkelt element,\neller lim inn i en eksisterende tekstbehandler",
"unableToEmbed": "Innbygging av denne nettadressen er ikke tillatt. Oppret en sak på GitHub for å be om url-hvitelisting",
"unrecognizedLinkFormat": "Linken du bygget inn samsvarer ikke med det forventede formatet. Prøv å lime inn \"bygg inn\"-strengen fra kildesiden"
"pasteAsSingleElement": "Bruk {{shortcut}} for å lime inn som ett enkelt element,\neller lim inn i en eksisterende tekstbehandler"
},
"colors": {
"transparent": "Gjennomsiktig",
@@ -467,36 +449,5 @@
"shades": "Toner",
"hexCode": "Heksadesimal kode",
"noShades": "Ingen toner tilgjengelig for denne fargen"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Eksporter som bilde",
"button": "Eksporter som bilde",
"description": "Eksporter scene-dataene til en fil som du kan importere fra senere."
},
"saveToDisk": {
"title": "Lagre til disk",
"button": "Lagre til disk",
"description": "Eksporter scene-dataene til en fil som du kan importere fra senere."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Eksporter til Excalidraw+",
"description": "Lagre scenen til ditt Excalidraw+-arbeidsområde."
}
},
"modal": {
"loadFromFile": {
"title": "Last inn fra fil",
"button": "Last inn fra fil",
"description": "Å laste fra en fil vil <bold>erstatte ditt eksisterende innhold</bold>.<br></br>Du kan sikkerhetskopiere tegningen din først ved å bruke en av valgene under."
},
"shareableLink": {
"title": "Last inn fra lenke",
"button": "Erstatt innholdet mitt",
"description": "Lasting av ekstern tegning vil <bold>erstatte ditt eksisterende innhold</bold>.<br></br>Du kan sikkerhetskopiere tegningen din først ved å bruke en av valgene nedenfor."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Wijzig link",
"editEmbed": "Link bewerken & insluiten",
"create": "Maak link",
"createEmbed": "Link maken en insluiten",
"label": "Link",
"labelEmbed": "Link toevoegen & insluiten",
"empty": "Er is geen link ingesteld"
"label": "Link"
},
"lineEditor": {
"edit": "Bewerk regel",
@@ -164,16 +160,13 @@
"darkMode": "Donkere modus",
"lightMode": "Lichte modus",
"zenMode": "Zen modus",
"objectsSnapMode": "",
"exitZenMode": "Verlaat zen modus",
"cancel": "Annuleren",
"clear": "Wissen",
"remove": "Verwijderen",
"embed": "Insluiten in-/uitschakelen",
"publishLibrary": "Publiceren",
"submit": "Versturen",
"confirm": "Bevestigen",
"embeddableInteractionButton": "Klik voor interactie"
"confirm": "Bevestigen"
},
"alerts": {
"clearReset": "Dit zal het hele canvas verwijderen. Weet je het zeker?",
@@ -203,7 +196,6 @@
"imageInsertError": "Afbeelding invoegen mislukt. Probeer het later opnieuw...",
"fileTooBig": "Bestand is te groot. Maximale grootte is {{maxSize}}.",
"svgImageInsertError": "Kon geen SVG-afbeelding invoegen. De SVG-opmaak ziet er niet geldig uit.",
"failedToFetchImage": "",
"invalidSVGString": "Ongeldige SVG.",
"cannotResolveCollabServer": "Kan geen verbinding maken met de collab server. Herlaad de pagina en probeer het opnieuw.",
"importLibraryError": "Kon bibliotheek niet laden",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "Ingesloten elementen kunnen niet worden toegevoegd aan de bibliotheek.",
"image": "Ondersteuning voor het toevoegen van afbeeldingen aan de bibliotheek komt binnenkort!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Link toevoegen / bijwerken voor een geselecteerde vorm",
"eraser": "Gum",
"frame": "",
"embeddable": "Web insluiten",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Klik om meerdere punten te starten, sleep voor één lijn",
"freeDraw": "Klik en sleep, laat los als je klaar bent",
"text": "Tip: je kunt tekst toevoegen door ergens dubbel te klikken met de selectietool",
"embeddable": "Klink-sleep om een website-insluiting te maken",
"text_selected": "Dubbelklik of druk op ENTER om tekst te bewerken",
"text_editing": "Druk op Escape of CtrlOrCmd+ENTER om het bewerken te voltooien",
"linearElementMulti": "Klik op het laatste punt of druk op Escape of Enter om te stoppen",
@@ -267,8 +252,7 @@
"bindTextToElement": "Druk op enter om tekst toe te voegen",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Kan voorbeeld niet tonen",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Opgeslagen als {filename}",
"canvas": "canvas",
"selection": "selectie",
"pasteAsSingleElement": "Gebruik {{shortcut}} om te plakken als een enkel element,\nof plak in een bestaande teksteditor",
"unableToEmbed": "Het insluiten van deze url is momenteel niet toegestaan. Zet een probleem op GitHub om de URL op de whitelist te zetten",
"unrecognizedLinkFormat": "De link die u hebt ingesloten komt niet overeen met het verwachte formaat. Probeer de 'embed' string van de bronsite te plakken"
"pasteAsSingleElement": "Gebruik {{shortcut}} om te plakken als een enkel element,\nof plak in een bestaande teksteditor"
},
"colors": {
"transparent": "Transparant",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Rediger lenke",
"editEmbed": "",
"create": "Lag lenke",
"createEmbed": "",
"label": "Lenke",
"labelEmbed": "",
"empty": ""
"label": "Lenke"
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "Mørk modus",
"lightMode": "Lys modus",
"zenMode": "Zen-modus",
"objectsSnapMode": "",
"exitZenMode": "Avslutt zen-modus",
"cancel": "Avbryt",
"clear": "Tøm",
"remove": "Fjern",
"embed": "",
"publishLibrary": "Publiser",
"submit": "Send inn",
"confirm": "Stadfest",
"embeddableInteractionButton": ""
"confirm": "Stadfest"
},
"alerts": {
"clearReset": "Dette vil tømme lerretet. Er du sikker?",
@@ -203,7 +196,6 @@
"imageInsertError": "Kunne ikkje sette inn biletet. Prøv igjen seinare...",
"fileTooBig": "Fila er for stor. Maksimal tillate storleik er {{maxSize}}.",
"svgImageInsertError": "Kunne ikkje sette inn SVG-biletet. SVG-koden ser ugyldig ut.",
"failedToFetchImage": "",
"invalidSVGString": "Ugyldig SVG.",
"cannotResolveCollabServer": "Kunne ikkje kople til samarbeidsserveren. Ver vennleg å oppdatere inn sida og prøv på nytt.",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Legg til/ oppdater lenke til valt figur",
"eraser": "Viskelêr",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Klikk for å starte linje med fleire punkt, eller drag for ei enkel linje",
"freeDraw": "Klikk og drag, slepp når du er ferdig",
"text": "Tips: du kan òg leggje til tekst ved å dobbeltklikke kor som helst med utvalgsverktyet",
"embeddable": "",
"text_selected": "Dobbelklikk eller trykk ENTER for å redigere teksta",
"text_editing": "Trykk Escape eller CtrlOrCmd+ENTER for å fullføre redigeringa",
"linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre",
@@ -267,8 +252,7 @@
"bindTextToElement": "Trykk på enter for å legge til tekst",
"deepBoxSelect": "Hald inne Ctrl / Cmd for å velje djupt, og forhindre flytting",
"eraserRevert": "Hald inne Alt for å reversere markering av element for sletting",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Kan ikkje vise førehandsvising",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Lagra som {filename}",
"canvas": "lerret",
"selection": "val",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Gjennomsiktig",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Modificar lo ligam",
"editEmbed": "",
"create": "Crear un ligam",
"createEmbed": "",
"label": "Ligam",
"labelEmbed": "",
"empty": ""
"label": "Ligam"
},
"lineEditor": {
"edit": "Modificar la linha",
@@ -164,16 +160,13 @@
"darkMode": "Mòde escur",
"lightMode": "Mòde clar",
"zenMode": "Mòde escur",
"objectsSnapMode": "",
"exitZenMode": "Sortir del mòde zen",
"cancel": "Anullar",
"clear": "Escafar",
"remove": "Tirar",
"embed": "",
"publishLibrary": "Publicar",
"submit": "Enviar",
"confirm": "Confirmar",
"embeddableInteractionButton": ""
"confirm": "Confirmar"
},
"alerts": {
"clearReset": "Aquò suprimirà lo canabàs complèt. O volètz vertadièrament?",
@@ -203,7 +196,6 @@
"imageInsertError": "Insercion dimatge impossibla. Tornatz ensajar mai tard...",
"fileTooBig": "Fichièr tròp pesuc. La talha maximala autorizada es {{maxSize}}.",
"svgImageInsertError": "Insercion dimatge SVG impossibla. Las balisas SVG semblan invalidas.",
"failedToFetchImage": "",
"invalidSVGString": "SVG invalid.",
"cannotResolveCollabServer": "Connexion impossibla al servidor collab. Mercés de recargar la pagina e tornar ensajar.",
"importLibraryError": "Impossible de cargar la bibliotèca",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Apondre/Actualizar lo ligam per una fòrma seleccionada",
"eraser": "Goma",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Man (aisina de desplaçament de la vista)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Clicatz per començar mantun punt, lisatz per una sola linha",
"freeDraw": "Clicatz e lisatz, relargatz un còp acabat",
"text": "Astúcia: podètz tanben apondre de tèxt en doble clicant ont que siá amb laisina de seleccion",
"embeddable": "",
"text_selected": "Clicatz dos còps o quichatz ENTRADA per modificar lo tèxt",
"text_editing": "Quichatz ESCAPAR o CtrlOrCmd+ENTRADA per acabar la modificacion",
"linearElementMulti": "Clicatz sul darrièr punt o quichatz Ecap o Entrada per acabar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Quichatz Entrada per apondre de tèxte",
"deepBoxSelect": "Gardar CtrlOCmd per una seleccion gropada e empachar lo desplaçament",
"eraserRevert": "Tenètz quichat Alt per anullar los elements marcats per supression",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Afichatge impossible de lapercebut",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Enregistrat jos {filename}",
"canvas": "canabàs",
"selection": "seleccion",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "Transparéncia",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "ਪਾਠ ਨੂੰ ਕੰਟੇਨਰ ਵਿੱਚ ਇਕੱਠਾ ਕਰੋ",
"link": {
"edit": "ਕੜੀ ਸੋਧੋ",
"editEmbed": "",
"create": "ਕੜੀ ਬਣਾਓ",
"createEmbed": "",
"label": "ਕੜੀ",
"labelEmbed": "",
"empty": ""
"label": "ਕੜੀ"
},
"lineEditor": {
"edit": "ਪੰਕਤੀ ਸੋਧੋ",
@@ -164,16 +160,13 @@
"darkMode": "ਡਾਰਕ ਮੋਡ",
"lightMode": "ਲਾਇਟ ਮੋਡ",
"zenMode": "ਜ਼ੈੱਨ ਮੋਡ",
"objectsSnapMode": "",
"exitZenMode": "ਜ਼ੈੱਨ ਮੋਡ 'ਚੋਂ ਬਾਹਰ ਨਿਕਲੋ",
"cancel": "ਰੱਦ ਕਰੋ",
"clear": "ਸਾਫ਼ ਕਰੋ",
"remove": "ਹਟਾਓ",
"embed": "",
"publishLibrary": "ਪ੍ਰਕਾਸ਼ਤ ਕਰੋ",
"submit": "ਜਮ੍ਹਾ ਕਰਵਾਓ",
"confirm": "ਪੁਸ਼ਟੀ ਕਰੋ",
"embeddableInteractionButton": ""
"confirm": "ਪੁਸ਼ਟੀ ਕਰੋ"
},
"alerts": {
"clearReset": "ਇਹ ਸਾਰਾ ਕੈਨਵਸ ਸਾਫ ਕਰ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",
@@ -203,7 +196,6 @@
"imageInsertError": "ਚਿੱਤਰ ਸ਼ਾਮਲ ਨਹੀਂ ਜਾ ਸਕਿਆ, ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ...",
"fileTooBig": "ਫਾਈਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡੀ ਹੈ। ਵੱਧ-ਤੋਂ-ਵੱਧ ਪ੍ਰਵਾਨਤ ਅਕਾਰ {{maxSize}} ਹੈ।",
"svgImageInsertError": "SVG ਤਸਵੀਰ ਸ਼ਾਮਲ ਨਹੀਂ ਕਰ ਸਕੇ। SVG ਮਾਰਕ-ਅੱਪ ਨਜਾਇਜ਼ ਲੱਗ ਰਿਹਾ ਹੈ।",
"failedToFetchImage": "",
"invalidSVGString": "SVG ਨਜਾਇਜ਼ ਹੈ।",
"cannotResolveCollabServer": "",
"importLibraryError": "ਲਾਇਬ੍ਰੇਰੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "ਰਬੜ",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਬਿੰਦੂਆਂ ਲਈ ਕਲਿੱਕ ਕਰਕੇ ਸ਼ੁਰੂਆਤ ਕਰੋ, ਇਕਹਿਰੀ ਲਕੀਰ ਲਈ ਘਸੀਟੋ",
"freeDraw": "ਕਲਿੱਕ ਕਰਕੇ ਘਸੀਟੋ, ਪੂਰਾ ਹੋਣ 'ਤੇ ਛੱਡ ਦਿਉ",
"text": "ਨੁਸਖਾ: ਤੁਸੀਂ ਚੋਣਕਾਰ ਸੰਦ ਰਾਹੀਂ ਕਿਤੇ ਵੀ ਡਬਲ-ਕਲਿੱਕ ਕਰਕੇ ਵੀ ਪਾਠ ਜੋੜ ਸਕਦੇ ਹੋ",
"embeddable": "",
"text_selected": "ਪਾਠ ਨੂੰ ਸੋਧਣ ਲਈ ਡਬਲ-ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
"text_editing": "ਸੋਧ ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਐਸਕੇਪ (Esc) ਜਾਂ Ctrl-ਜਾਂ-Cmd+ਐਂਟਰ (enter) ਦਬਾਓ",
"linearElementMulti": "ਮੁਕੰਮਲ ਕਰਨ ਲਈ ਆਖਰੀ ਬਿੰਦੂ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਜਾਂ ਇਸਕੇਪ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
@@ -267,8 +252,7 @@
"bindTextToElement": "ਪਾਠ ਜੋੜਨ ਲਈ ਐੰਟਰ ਦਬਾਓ",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "ਝਲਕ ਨਹੀਂ ਦਿਖਾ ਸਕਦੇ",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "{filename} ਵਿੱਚ ਸਾਂਭੀ",
"canvas": "ਕੈਨਵਸ",
"selection": "ਚੋਣ",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "ਪਾਰਦਰਸ਼ੀ",
@@ -467,36 +449,5 @@
"shades": "ਸ਼ੇਡਾਂ",
"hexCode": "ਹੈਕਸ ਕੋਡ",
"noShades": "ਇਸ ਰੰਗ ਦੀ ਕੋਈ ਸ਼ੇਡ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+47 -47
View File
@@ -1,56 +1,56 @@
{
"ar-SA": 99,
"az-AZ": 18,
"bg-BG": 75,
"bn-BD": 55,
"ca-ES": 81,
"cs-CZ": 91,
"da-DK": 31,
"ar-SA": 79,
"az-AZ": 20,
"bg-BG": 54,
"bn-BD": 59,
"ca-ES": 87,
"cs-CZ": 98,
"da-DK": 33,
"de-DE": 100,
"el-GR": 85,
"el-GR": 92,
"en": 100,
"es-ES": 96,
"eu-ES": 99,
"fa-IR": 87,
"fi-FI": 81,
"fr-FR": 98,
"gl-ES": 90,
"he-IL": 81,
"hi-IN": 75,
"hu-HU": 70,
"id-ID": 96,
"it-IT": 99,
"ja-JP": 95,
"kaa": 34,
"kab-KAB": 80,
"kk-KZ": 20,
"km-KH": 87,
"es-ES": 88,
"eu-ES": 100,
"fa-IR": 88,
"fi-FI": 87,
"fr-FR": 88,
"gl-ES": 88,
"he-IL": 86,
"hi-IN": 77,
"hu-HU": 76,
"id-ID": 94,
"it-IT": 98,
"ja-JP": 88,
"kaa": 18,
"kab-KAB": 87,
"kk-KZ": 21,
"km-KH": 94,
"ko-KR": 100,
"ku-TR": 92,
"lt-LT": 51,
"lv-LV": 82,
"mr-IN": 92,
"my-MM": 37,
"nb-NO": 99,
"nl-NL": 79,
"nn-NO": 71,
"oc-FR": 79,
"pa-IN": 82,
"pl-PL": 100,
"pt-BR": 96,
"pt-PT": 88,
"ku-TR": 100,
"lt-LT": 55,
"lv-LV": 88,
"mr-IN": 95,
"my-MM": 40,
"nb-NO": 100,
"nl-NL": 83,
"nn-NO": 76,
"oc-FR": 86,
"pa-IN": 89,
"pl-PL": 98,
"pt-BR": 98,
"pt-PT": 94,
"ro-RO": 98,
"ru-RU": 94,
"si-LK": 8,
"sk-SK": 99,
"ru-RU": 98,
"si-LK": 9,
"sk-SK": 98,
"sl-SI": 100,
"sv-SE": 100,
"ta-IN": 85,
"th-TH": 46,
"tr-TR": 91,
"uk-UA": 99,
"vi-VN": 51,
"zh-CN": 99,
"zh-HK": 24,
"ta-IN": 84,
"th-TH": 38,
"tr-TR": 86,
"uk-UA": 96,
"vi-VN": 56,
"zh-CN": 100,
"zh-HK": 25,
"zh-TW": 100
}
+9 -58
View File
@@ -104,17 +104,13 @@
"excalidrawLib": "Biblioteka Excalidraw",
"decreaseFontSize": "Zmniejsz rozmiar czcionki",
"increaseFontSize": "Zwiększ rozmiar czcionki",
"unbindText": "Odłącz tekst od kontenera",
"unbindText": "Rozłącz tekst",
"bindText": "Połącz tekst z kontenerem",
"createContainerFromText": "Zawijaj tekst w kontenerze",
"link": {
"edit": "Edytuj łącze",
"editEmbed": "Edytuj i osadź link",
"create": "Utwórz łącze",
"createEmbed": "Stwórz i osadź link",
"label": "Łącze",
"labelEmbed": "Podlinkuj i osadź",
"empty": "Brakujący link"
"label": "Łącze"
},
"lineEditor": {
"edit": "Edytuj linię",
@@ -128,8 +124,8 @@
},
"statusPublished": "Opublikowano",
"sidebarLock": "Panel boczny zawsze otwarty",
"selectAllElementsInFrame": "Zaznacz wszystkie elementy w ramce",
"removeAllElementsFromFrame": "Usuń wszystkie elementy z ramki",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": "Wybierz kolor z płótna"
},
"library": {
@@ -164,16 +160,13 @@
"darkMode": "Ciemny motyw",
"lightMode": "Jasny motyw",
"zenMode": "Tryb Zen",
"objectsSnapMode": "Przyciąganie do obiektów",
"exitZenMode": "Wyjdź z trybu Zen",
"cancel": "Anuluj",
"clear": "Wyczyść",
"remove": "Usuń",
"embed": "Przełącz osadzenie",
"publishLibrary": "Opublikuj",
"submit": "Prześlij",
"confirm": "Zatwierdź",
"embeddableInteractionButton": "Kliknij, aby wejść w interakcję"
"confirm": "Zatwierdź"
},
"alerts": {
"clearReset": "To spowoduje usunięcie wszystkiego z dokumentu. Czy chcesz kontynuować?",
@@ -203,7 +196,6 @@
"imageInsertError": "Nie udało się wstawić obrazu. Spróbuj ponownie później...",
"fileTooBig": "Plik jest zbyt duży. Maksymalny dozwolony rozmiar to {{maxSize}}.",
"svgImageInsertError": "Nie udało się wstawić obrazu SVG. Znacznik SVG wygląda na nieprawidłowy.",
"failedToFetchImage": "Nie udało się załadować obrazu.",
"invalidSVGString": "Nieprawidłowy SVG.",
"cannotResolveCollabServer": "Nie można połączyć się z serwerem współpracy w czasie rzeczywistym. Proszę odświeżyć stronę i spróbować ponownie.",
"importLibraryError": "Wystąpił błąd w trakcie ładowania biblioteki",
@@ -214,10 +206,6 @@
"line2": "Może to doprowadzić do złamania <bold>elementów tekstu</bold> na rysunkach.",
"line3": "Zdecydowanie zalecamy wyłączenie tego ustawienia. Możesz wykonać <link>te kroki</link>, aby to zrobić.",
"line4": "Jeśli wyłączenie tego ustawienia nie naprawia wyświetlania elementów tekstowych, zgłoś <issueLink>problem</issueLink> na naszym GitHubie lub napisz do nas na <discordLink>Discordzie</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Elementy osadzone nie mogą zostać dodane do biblioteki.",
"image": "Dodawania obrazów do biblioteki nadejdzie wkrótce!"
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Tryb pióra — zapobiegaj dotknięciom",
"link": "Dodaj/aktualizuj link dla wybranego kształtu",
"eraser": "Gumka",
"frame": "Ramka",
"embeddable": "Osadzenie z internetu",
"laser": "Wskaźnik laserowy",
"frame": "",
"hand": "Ręka (narzędzie do przesuwania)",
"extraTools": "Więcej narzędzi"
"extraTools": ""
},
"headings": {
"canvasActions": "Narzędzia",
@@ -251,7 +237,6 @@
"linearElement": "Naciśnij, aby zrobić punkt, przeciągnij, aby narysować linię",
"freeDraw": "Naciśnij i przeciągnij by rysować, puść kiedy skończysz",
"text": "Wskazówka: możesz również dodać tekst klikając dwukrotnie gdziekolwiek za pomocą narzędzia zaznaczania",
"embeddable": "Kliknij i przeciągnij, aby stworzyć osadzenie strony",
"text_selected": "Kliknij dwukrotnie lub naciśnij ENTER, aby edytować tekst",
"text_editing": "Naciśnij Escape lub Ctrl (Cmd w macOS) + ENTER, aby zakończyć edycję",
"linearElementMulti": "Aby zakończyć krzywą, ponownie kliknij w ostatni punkt, bądź naciśnij Esc albo Enter",
@@ -267,8 +252,7 @@
"bindTextToElement": "Wciśnij enter, aby dodać tekst",
"deepBoxSelect": "Przytrzymaj CtrlOrCmd, aby wybrać w obrębie grupy i uniknąć przeciągania",
"eraserRevert": "Przytrzymaj Alt, aby przywrócić elementy oznaczone do usunięcia",
"firefox_clipboard_write": "Ta funkcja może być włączona poprzez ustawienie flagi \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Aby zmienić flagi przeglądarki w Firefox, odwiedź stronę \"about:config\".",
"disableSnapping": "Przytrzymaj Ctrl lub Cmd, aby wyłączyć przyciąganie"
"firefox_clipboard_write": "Ta funkcja może być włączona poprzez ustawienie flagi \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Aby zmienić flagi przeglądarki w Firefox, odwiedź stronę \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Nie można wyświetlić podglądu",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Zapisano jako {filename}",
"canvas": "płótno",
"selection": "zaznaczenie",
"pasteAsSingleElement": "Użyj {{shortcut}}, aby wkleić jako pojedynczy element,\nlub wklej do istniejącego edytora tekstu",
"unableToEmbed": "Osadzenie tego linku jest obecnie niedozwolone. Zgłoś propozycję na portalu GitHub, aby dodać go do listy dozwolonych wyjątków",
"unrecognizedLinkFormat": "Osadzony link ma niewłaściwy format. Spróbuj wkleić całą zawartość pola \"embed\" z oryginalnej strony."
"pasteAsSingleElement": "Użyj {{shortcut}}, aby wkleić jako pojedynczy element,\nlub wklej do istniejącego edytora tekstu"
},
"colors": {
"transparent": "Przezroczysty",
@@ -467,36 +449,5 @@
"shades": "Odcienie",
"hexCode": "Kod HEX",
"noShades": "Brak dostępnych odcieni dla tego koloru"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Eksportuj jako obraz",
"button": "Eksportuj jako obraz",
"description": "Eksportuj zawartość sceny jako obraz z możliwością importowania."
},
"saveToDisk": {
"title": "Zapisz na dysku",
"button": "Zapisz na dysku",
"description": "Eksportuj zawartość sceny jako plik z możliwością importowania."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Eksportuj do Excalidraw+",
"description": "Zapisz scenę do swojego obszaru roboczego Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Wczytaj z pliku",
"button": "Wczytaj z pliku",
"description": "Wczytanie z pliku <bold>nadpisze istniejącą zawartość</bold>.<br></br>Możesz najpierw utworzyć kopię zapasową swojego rysunku, używając jednej z poniższych opcji."
},
"shareableLink": {
"title": "Wczytaj z linku",
"button": "Nadpisz moją zawartość",
"description": "Wczytanie zewnętrznego pliku <bold>nadpisze istniejącą zawartość</bold>.<br></br>Możesz najpierw utworzyć kopię zapasową swojego rysunku, używając jednej z poniższych opcji."
}
}
}
}
+9 -58
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Envolver texto em um contêiner",
"link": {
"edit": "Editar link",
"editEmbed": "",
"create": "Criar link",
"createEmbed": "",
"label": "Link",
"labelEmbed": "",
"empty": ""
"label": "Link"
},
"lineEditor": {
"edit": "Editar linha",
@@ -128,9 +124,9 @@
},
"statusPublished": "Publicado",
"sidebarLock": "Manter barra lateral aberta",
"selectAllElementsInFrame": "Selecionar todos os elementos no quadro",
"removeAllElementsFromFrame": "Remover todos os elementos do quadro",
"eyeDropper": "Escolher cor da tela"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "Nenhum item adicionado ainda...",
@@ -164,16 +160,13 @@
"darkMode": "Modo escuro",
"lightMode": "Modo claro",
"zenMode": "Modo Zen",
"objectsSnapMode": "",
"exitZenMode": "Sair do modo zen",
"cancel": "Cancelar",
"clear": "Limpar",
"remove": "Remover",
"embed": "",
"publishLibrary": "Publicar",
"submit": "Enviar",
"confirm": "Confirmar",
"embeddableInteractionButton": ""
"confirm": "Confirmar"
},
"alerts": {
"clearReset": "Isto irá limpar toda a tela. Você tem certeza?",
@@ -203,7 +196,6 @@
"imageInsertError": "Não foi possível inserir imagem. Tente novamente mais tarde...",
"fileTooBig": "O arquivo é muito grande. O tamanho máximo permitido é {{maxSize}}.",
"svgImageInsertError": "Não foi possível inserir a imagem SVG. A marcação SVG parece inválida.",
"failedToFetchImage": "",
"invalidSVGString": "SVG Inválido.",
"cannotResolveCollabServer": "Não foi possível conectar-se ao servidor colaborativo. Por favor, recarregue a página e tente novamente.",
"importLibraryError": "Não foi possível carregar a biblioteca",
@@ -214,10 +206,6 @@
"line2": "Isso pode acabar quebrando <bold>Elementos de Texto</bold> em seus desenhos.",
"line3": "Recomendamos fortemente desativar essa configuração. Você pode acessar o <link>passo a passo</link> sobre como fazer isso.",
"line4": "Se desativar essa configuração não corrigir a exibição de elementos de texto, por favor abra uma <issueLink>issue</issueLink> em nosso GitHub, ou mande uma mensagem em nosso <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Modo caneta — impede o toque",
"link": "Adicionar/Atualizar link para uma forma selecionada",
"eraser": "Borracha",
"frame": "Ferramenta de quadro",
"embeddable": "",
"laser": "",
"frame": "",
"hand": "Mão (ferramenta de rolagem)",
"extraTools": "Mais ferramentas"
"extraTools": ""
},
"headings": {
"canvasActions": "Ações da tela",
@@ -251,7 +237,6 @@
"linearElement": "Clique para iniciar vários pontos, arraste para uma única linha",
"freeDraw": "Toque e arraste, solte quando terminar",
"text": "Dica: você também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção",
"embeddable": "",
"text_selected": "Clique duplo ou tecle ENTER para editar o texto",
"text_editing": "Pressione Esc ou Ctrl/Cmd+ENTER para encerrar a edição",
"linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Pressione Enter para adicionar o texto",
"deepBoxSelect": "Segure Ctrl/Cmd para seleção profunda e para evitar arrastar",
"eraserRevert": "Segure a tecla Alt para inverter os elementos marcados para exclusão",
"firefox_clipboard_write": "Esse recurso pode ser ativado configurando a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Esse recurso pode ser ativado configurando a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Não é possível mostrar pré-visualização",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Salvo em {filename}",
"canvas": "tela",
"selection": "seleção",
"pasteAsSingleElement": "Use {{shortcut}} para colar como um único elemento,\nou cole em um editor de texto já existente",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Use {{shortcut}} para colar como um único elemento,\nou cole em um editor de texto já existente"
},
"colors": {
"transparent": "Transparente",
@@ -467,36 +449,5 @@
"shades": "Tons",
"hexCode": "Código hexadecimal",
"noShades": "Sem tons disponíveis para essa cor"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportar como imagem",
"button": "Exportar como imagem",
"description": "Exportar os dados da cena para um arquivo que você poderá importar mais tarde."
},
"saveToDisk": {
"title": "Salvar no computador",
"button": "Salvar no computador",
"description": "Exportar os dados da cena para um arquivo que você poderá importar mais tarde."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exportar para Excalidraw+",
"description": "Salvar a cena na sua área de trabalho Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Carregar de arquivo",
"button": "Carregar de arquivo",
"description": "Carregar de um arquivo irá <bold> substituir o conteúdo existente</bold>.<br></br>Você pode salvar seu desenho primeiro usando uma das opções abaixo."
},
"shareableLink": {
"title": "Carregar de um link",
"button": "Substituir meu conteúdo",
"description": "Carregar um desenho externo irá <bold> substituir seu conteúdo existente</bold>.<br></br>Você pode salvar seu desenho antes utilizando uma das opções abaixo."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Envolver texto num recipiente",
"link": {
"edit": "Editar ligação",
"editEmbed": "",
"create": "Criar ligação",
"createEmbed": "",
"label": "Ligação",
"labelEmbed": "",
"empty": ""
"label": "Ligação"
},
"lineEditor": {
"edit": "Editar linha",
@@ -164,16 +160,13 @@
"darkMode": "Modo escuro",
"lightMode": "Modo claro",
"zenMode": "Modo zen",
"objectsSnapMode": "",
"exitZenMode": "Sair do modo zen",
"cancel": "Cancelar",
"clear": "Limpar",
"remove": "Remover",
"embed": "",
"publishLibrary": "Publicar",
"submit": "Enviar",
"confirm": "Confirmar",
"embeddableInteractionButton": ""
"confirm": "Confirmar"
},
"alerts": {
"clearReset": "Isto irá limpar toda a área de desenho. Tem a certeza?",
@@ -203,7 +196,6 @@
"imageInsertError": "Não foi possível inserir a imagem, tente novamente mais tarde...",
"fileTooBig": "O ficheiro é muito grande. O tamanho máximo permitido é {{maxSize}}.",
"svgImageInsertError": "Não foi possível inserir a imagem SVG. A marcação SVG parece inválida.",
"failedToFetchImage": "",
"invalidSVGString": "SVG inválido.",
"cannotResolveCollabServer": "Não foi possível fazer a ligação ao servidor colaborativo. Por favor, volte a carregar a página e tente novamente.",
"importLibraryError": "Não foi possível carregar a biblioteca",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Acrescentar/ Adicionar ligação para uma forma seleccionada",
"eraser": "Borracha",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Mão (ferramenta de movimento da tela)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Clique para iniciar vários pontos, arraste para uma única linha",
"freeDraw": "Clique e arraste, large quando terminar",
"text": "Dica: também pode adicionar texto clicando duas vezes em qualquer lugar com a ferramenta de seleção",
"embeddable": "",
"text_selected": "Clique duas vezes ou pressione a tecla Enter para editar o texto",
"text_editing": "Pressione a tecla Escape ou CtrlOrCmd+ENTER para terminar a edição",
"linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar",
@@ -267,8 +252,7 @@
"bindTextToElement": "Carregue Enter para acrescentar texto",
"deepBoxSelect": "Mantenha a tecla CtrlOrCmd carregada para selecção profunda, impedindo o arrastamento",
"eraserRevert": "Carregue também em Alt para reverter os elementos marcados para serem apagados",
"firefox_clipboard_write": "Esta função pode provavelmente ser ativada definindo a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Esta função pode provavelmente ser ativada definindo a opção \"dom.events.asyncClipboard.clipboardItem\" como \"true\". Para alterar os sinalizadores do navegador no Firefox, visite a página \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Não é possível mostrar uma pré-visualização",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Guardado como {filename}",
"canvas": "área de desenho",
"selection": "seleção",
"pasteAsSingleElement": "Usar {{shortcut}} para colar como um único elemento,\nou colar num editor de texto existente",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Usar {{shortcut}} para colar como um único elemento,\nou colar num editor de texto existente"
},
"colors": {
"transparent": "Transparente",
@@ -467,36 +449,5 @@
"shades": "Tons",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "Guardar no disco",
"button": "Guardar no disco",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "Carregar a partir de ficheiro",
"button": "Carregar a partir de ficheiro",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Încadrare text într-un container",
"link": {
"edit": "Editare URL",
"editEmbed": "Editare URL și încorporare",
"create": "Creare URL",
"createEmbed": "Creare URL și încorporare",
"label": "URL",
"labelEmbed": "URL și încorporare",
"empty": "Nu este setat niciun URL"
"label": "URL"
},
"lineEditor": {
"edit": "Editare linie",
@@ -164,16 +160,13 @@
"darkMode": "Mod întunecat",
"lightMode": "Mod luminos",
"zenMode": "Mod zen",
"objectsSnapMode": "Ancorare la obiecte",
"exitZenMode": "Ieșire din modul zen",
"cancel": "Anulare",
"clear": "Ștergere",
"remove": "Eliminare",
"embed": "Comutare încorporare",
"publishLibrary": "Publicare",
"submit": "Trimitere",
"confirm": "Confirmare",
"embeddableInteractionButton": "Clic pentru interacționare"
"confirm": "Confirmare"
},
"alerts": {
"clearReset": "Această opțiune va șterge întreaga pânză. Confirmi?",
@@ -203,7 +196,6 @@
"imageInsertError": "Imaginea nu a putut fi introdusă. Reîncearcă mai târziu...",
"fileTooBig": "Fișierul este prea mare. Dimensiunea maximă permisă este de {{maxSize}}.",
"svgImageInsertError": "Imaginea SVG nu a putut fi introdus. Marcajul SVG pare invalid.",
"failedToFetchImage": "",
"invalidSVGString": "SVG invalid.",
"cannotResolveCollabServer": "Nu a putut fi realizată conexiunea la serverul de colaborare. Reîncarcă pagina și încearcă din nou.",
"importLibraryError": "Biblioteca nu a putut fi încărcată",
@@ -214,10 +206,6 @@
"line2": "Acest lucru poate duce la întreruperea <bold>elementelor text</bold> din desene.",
"line3": "Îți recomandăm ferm să dezactivezi această setare. Poți urma <link>acești pași</link> pentru a face acest lucru.",
"line4": "Dacă dezactivarea acestei setări nu duce la remedierea afișării elementelor text, deschide un tichet de <issueLink>problemă</issueLink> pe pagina noastră de GitHub sau scrie-ne pe <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Elementele încorporabile nu pot fi adăugate la bibliotecă.",
"image": "În curând vor putea fi adăugate imagini în bibliotecă!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Adăugare/actualizare URL pentru forma selectată",
"eraser": "Radieră",
"frame": "",
"embeddable": "Încorporare web",
"laser": "Indicator laser",
"hand": "Mână (instrument de panoramare)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Dă clic pentru a crea mai multe puncte, glisează pentru a forma o singură linie",
"freeDraw": "Dă clic pe pânză și glisează cursorul, apoi eliberează-l când ai terminat",
"text": "Sfat: poți adăuga text și dând dublu clic oriunde cu instrumentul de selecție",
"embeddable": "Dă clic și trage pentru a crea un cod de încorporare de pagină web",
"text_selected": "Dă dublu clic sau apasă tasta Enter pentru a edita textul",
"text_editing": "Apasă tasta Escape sau Ctrl sau Cmd + Enter pentru a finaliza editarea",
"linearElementMulti": "Dă clic pe ultimul punct sau apasă tasta Escape sau tasta Enter pentru a termina",
@@ -267,8 +252,7 @@
"bindTextToElement": "Apasă tasta Enter pentru a adăuga text",
"deepBoxSelect": "Ține apăsată tasta Ctrl sau Cmd pentru a efectua selectarea de adâncime și pentru a preveni glisarea",
"eraserRevert": "Ține apăsată tasta Alt pentru a anula elementele marcate pentru ștergere",
"firefox_clipboard_write": "Această caracteristică poate fi probabil activată prin setarea preferinței „dom.events.asyncClipboard.clipboardItem” ca „true”. Pentru a schimba preferințele navigatorului în Firefox, accesează pagina „about:config”.",
"disableSnapping": "Ține apăsat CtrlOrCmd pentru a dezactiva ancorarea"
"firefox_clipboard_write": "Această caracteristică poate fi probabil activată prin setarea preferinței „dom.events.asyncClipboard.clipboardItem” ca „true”. Pentru a schimba preferințele navigatorului în Firefox, accesează pagina „about:config”."
},
"canvasError": {
"cannotShowPreview": "Nu se poate afișa previzualizarea",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Salvat în {filename}",
"canvas": "pânza",
"selection": "selecția",
"pasteAsSingleElement": "Folosește {{shortcut}} pentru a insera ca un singur element\nsau insera într-un editor de text existent",
"unableToEmbed": "Încorporarea acestui URL nu este permisă momentan. Deschideți un tichet cu probleme pe GitHub pentru a solicita adăugarea acestui URL în lista albă",
"unrecognizedLinkFormat": "URL-ul pe care l-ai încorporat nu coincide cu formatul așteptat. Încearcă să lipești șirul „de încorporat” furnizat de pagina sursă"
"pasteAsSingleElement": "Folosește {{shortcut}} pentru a insera ca un singur element\nsau insera într-un editor de text existent"
},
"colors": {
"transparent": "Transparent",
@@ -467,36 +449,5 @@
"shades": "Nuanțe",
"hexCode": "Cod hexa",
"noShades": "Nu este disponibilă nicio nuanță pentru această culoare"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportare ca imagine",
"button": "Exportare ca imagine",
"description": "Exportă datele scenei ca fișier din care poți importa mai târziu."
},
"saveToDisk": {
"title": "Salvare pe disc",
"button": "Salvare pe disc",
"description": "Exportă datele scenei pe un fișier din care poți importa mai târziu."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exportare în Excalidraw+",
"description": "Salvează scena în spațiul de lucru Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Încărcare din fișier",
"button": "Încărcare din fișier",
"description": "Încărcarea dintr-un fișier va <bold>înlocui conținutul existent</bold>.<br></br>Poți face mai întâi o copie de rezervă a desenului folosind una dintre opțiunile de mai jos."
},
"shareableLink": {
"title": "Încărcare din lnk",
"button": "Înlocuiește conținutul meu",
"description": "Încărcarea unui desen extern va <bold>înlocui conținutul existent</bold>.<br></br>Poți face mai întâi o copie de rezervă a desenului folosind una dintre opțiunile de mai jos."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Поместить текст в контейнер",
"link": {
"edit": "Редактировать ссылку",
"editEmbed": "",
"create": "Создать ссылку",
"createEmbed": "",
"label": "Ссылка",
"labelEmbed": "",
"empty": ""
"label": "Ссылка"
},
"lineEditor": {
"edit": "Редактирование строки",
@@ -164,16 +160,13 @@
"darkMode": "Темная тема",
"lightMode": "Светлая тема",
"zenMode": "Режим Дзен",
"objectsSnapMode": "Привязка к объектам",
"exitZenMode": "Выключить режим концентрации внимания",
"cancel": "Отменить",
"clear": "Очистить",
"remove": "Удалить",
"embed": "",
"publishLibrary": "Опубликовать",
"submit": "Отправить",
"confirm": "Подтвердить",
"embeddableInteractionButton": ""
"confirm": "Подтвердить"
},
"alerts": {
"clearReset": "Это очистит весь холст. Вы уверены?",
@@ -203,7 +196,6 @@
"imageInsertError": "Не удалось вставить изображение. Попробуйте позже...",
"fileTooBig": "Очень большой файл. Максимально разрешенный размер {{maxSize}}.",
"svgImageInsertError": "Не удалось вставить изображение SVG. Разметка SVG выглядит недействительной.",
"failedToFetchImage": "Не удалось получить изображение.",
"invalidSVGString": "Некорректный SVG.",
"cannotResolveCollabServer": "Не удалось подключиться к серверу совместного редактирования. Перезагрузите страницу и повторите попытку.",
"importLibraryError": "Не удалось загрузить библиотеку",
@@ -214,10 +206,6 @@
"line2": "Это может привести к поломке <bold>Текстовых объектов</bold> на рисунке.",
"line3": "Мы настоятельно рекомендуем отключить эту настройку. Для этого нужно выполнить <link>эти шаги</link>.",
"line4": "Если отключение этой настройки не исправит отображение текстовых объектов, создайте <issueLink>issue</issueLink> на нашем GitHub или напишите нам в <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Добавить/обновить ссылку для выбранной фигуры",
"eraser": "Ластик",
"frame": "",
"embeddable": "",
"laser": "Лазерная указка",
"hand": "Рука (перемещение холста)",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии",
"freeDraw": "Нажмите и перетаскивайте, отпустите по завершении",
"text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст",
"embeddable": "",
"text_selected": "Дважды щелкните мышью или нажмите ENTER, чтобы редактировать текст",
"text_editing": "Нажмите Escape либо Ctrl или Cmd + ENTER для завершения редактирования",
"linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить",
@@ -267,8 +252,7 @@
"bindTextToElement": "Нажмите Enter для добавления текста",
"deepBoxSelect": "Удерживайте Ctrl или Cmd для глубокого выделения, чтобы предотвратить перетаскивание",
"eraserRevert": "Удерживайте Alt, чтобы вернуть элементы, отмеченные для удаления",
"firefox_clipboard_write": "Эта функция может быть включена при изменении значения флага \"dom.events.asyncClipboard.clipboardItem\" на \"true\". Чтобы изменить флаги браузера в Firefox, посетите страницу \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Эта функция может быть включена при изменении значения флага \"dom.events.asyncClipboard.clipboardItem\" на \"true\". Чтобы изменить флаги браузера в Firefox, посетите страницу \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Не удается отобразить предпросмотр",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Сохранено в {filename}",
"canvas": "холст",
"selection": "выделение",
"pasteAsSingleElement": "Используйте {{shortcut}}, чтобы вставить один объект,\nили вставьте в существующий текстовый редактор",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Используйте {{shortcut}}, чтобы вставить один объект,\nили вставьте в существующий текстовый редактор"
},
"colors": {
"transparent": "Прозрачный",
@@ -467,36 +449,5 @@
"shades": "Оттенки",
"hexCode": "Шестнадцатеричный код",
"noShades": "Нет доступных оттенков для этого цвета"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Экспортировать как изображение",
"button": "Экспортировать как изображение",
"description": ""
},
"saveToDisk": {
"title": "Сохранить на диск",
"button": "Сохранить на диск",
"description": ""
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Экспорт в Excalidraw+",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "Загрузить из файла",
"button": "Загрузить из файла",
"description": ""
},
"shareableLink": {
"title": "Загрузить по ссылке",
"button": "",
"description": ""
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "",
"editEmbed": "",
"create": "",
"createEmbed": "",
"label": "",
"labelEmbed": "",
"empty": ""
"label": ""
},
"lineEditor": {
"edit": "",
@@ -164,16 +160,13 @@
"darkMode": "",
"lightMode": "",
"zenMode": "",
"objectsSnapMode": "",
"exitZenMode": "",
"cancel": "",
"clear": "",
"remove": "",
"embed": "",
"publishLibrary": "",
"submit": "",
"confirm": "",
"embeddableInteractionButton": ""
"confirm": ""
},
"alerts": {
"clearReset": "",
@@ -203,7 +196,6 @@
"imageInsertError": "",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "",
"cannotResolveCollabServer": "",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "",
"eraser": "",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "",
"freeDraw": "",
"text": "",
"embeddable": "",
"text_selected": "",
"text_editing": "",
"linearElementMulti": "",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+8 -57
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Zabaliť text do kontajneru",
"link": {
"edit": "Upraviť odkaz",
"editEmbed": "Editovať a zapustiť odkaz",
"create": "Vytvoriť odkaz",
"createEmbed": "Vytvoriť a zapustiť odkaz",
"label": "Odkaz",
"labelEmbed": "Zapustiť odkaz",
"empty": "Nie je nastavený žiaden odkaz"
"label": "Odkaz"
},
"lineEditor": {
"edit": "Upraviť čiaru",
@@ -128,8 +124,8 @@
},
"statusPublished": "Zverejnené",
"sidebarLock": "Nechať bočný panel otvorený",
"selectAllElementsInFrame": "Vybrať všetky prvky v ráme",
"removeAllElementsFromFrame": "Odstrániť všetky prvky z rámu",
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": "Vybrať farbu z plátna"
},
"library": {
@@ -164,16 +160,13 @@
"darkMode": "Tmavý režim",
"lightMode": "Svetlý režim",
"zenMode": "Režim zen",
"objectsSnapMode": "Prichytiť k objektom",
"exitZenMode": "Zrušiť režim zen",
"cancel": "Zrušiť",
"clear": "Vymazať",
"remove": "Odstrániť",
"embed": "Prepnúť zapustenie",
"publishLibrary": "Uverejniť",
"submit": "Potvrdiť",
"confirm": "Potvrdiť",
"embeddableInteractionButton": "Kliknite pre interakciu"
"confirm": "Potvrdiť"
},
"alerts": {
"clearReset": "Týmto sa vyčistí celé plátno. Ste si istí?",
@@ -203,7 +196,6 @@
"imageInsertError": "Nepodarilo sa vložiť obrázok. Skúste to znova neskôr...",
"fileTooBig": "Súbor je príliš veľký. Maximálna povolená veľkosť je {{maxSize}}.",
"svgImageInsertError": "Nepodarilo sa vložiť SVG obrázok. SVG formát je pravdepodobne nevalidný.",
"failedToFetchImage": "",
"invalidSVGString": "Nevalidné SVG.",
"cannotResolveCollabServer": "Nepodarilo sa pripojiť ku kolaboračnému serveru. Prosím obnovte stránku a skúste to znovu.",
"importLibraryError": "Nepodarilo sa načítať knižnicu",
@@ -214,10 +206,6 @@
"line2": "To môže spôsobiť nesprávne zobrazenie <bold>textových prvkov</bold> vo vašej kresbe.",
"line3": "Dôrazne odporúčame vypnutie toho nastavenia. Môžete tak spraviť vykonaním <link>týchto krokov</link>.",
"line4": "Ak vypnutie toho nastavenia nevyrieši problém so zobrazením textových prvkov, prosím ohláste <issueLink>problém</issueLink> na našom GitHub-e alebo nám napíšte na náš <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Zapustené prvky nie je možné pridať do knižnice.",
"image": "Podpora pre pridávanie obrázkov do knižnice bude dostupná už čoskoro!"
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Režim pera zabrániť dotyku",
"link": "Pridať/ Upraviť odkaz pre vybraný tvar",
"eraser": "Guma",
"frame": "Nástroj rám",
"embeddable": "Web Embed",
"laser": "",
"frame": "",
"hand": "Ruka (nástroj pre pohyb plátna)",
"extraTools": "Ďalšie nástroje"
"extraTools": ""
},
"headings": {
"canvasActions": "Akcie plátna",
@@ -251,7 +237,6 @@
"linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky",
"freeDraw": "Kliknite a ťahajte, pustite na ukončenie",
"text": "Tip: text môžete pridať aj dvojklikom kdekoľvek, ak je zvolený nástroj výber",
"embeddable": "Kliknite a ťahajte pre zapustenie webovej stránky",
"text_selected": "Použite dvojklik alebo stlačte Enter na editáciu textu",
"text_editing": "Stlačte Escape alebo CtrlOrCmd+ENTER na ukončenie editovania",
"linearElementMulti": "Kliknite na počiatočný bod alebo stlačte Escape alebo Enter na ukončenie",
@@ -267,8 +252,7 @@
"bindTextToElement": "Stlačte enter na pridanie textu",
"deepBoxSelect": "Podržte CtrlOrCmd na výber v skupine alebo zamedzeniu poťiahnutia",
"eraserRevert": "Podržte Alt pre prehodenie položiek určených na vymazanie",
"firefox_clipboard_write": "Táto sa funkcionalita sa dá zapnúť nastavením \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Pre zmenu nastavení vo Firefox-e otvorte stránku \"about:config\".",
"disableSnapping": "Podržte CtrlOrCmd pre vypnutie prichytávania"
"firefox_clipboard_write": "Táto sa funkcionalita sa dá zapnúť nastavením \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Pre zmenu nastavení vo Firefox-e otvorte stránku \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Nie je možné zobraziť náhľad plátna",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Uložený ako {filename}",
"canvas": "plátna",
"selection": "výberu",
"pasteAsSingleElement": "Použitím {{shortcut}} vložte ako samostatný prvok alebo vložte do existujúceho editovaného textu",
"unableToEmbed": "Zapustenie tejto URL nie je povolené. Vytvorte issue na GitHub-e a požiadajte povolenie tejto URL",
"unrecognizedLinkFormat": "Odkaz, ktorý sa snažíte zapustiť nie je v očakávanom formáte. Prosím skúste vložiť 'odkaz na zdieľanie' poskytnutý zdrojovou webovou stránkou"
"pasteAsSingleElement": "Použitím {{shortcut}} vložte ako samostatný prvok alebo vložte do existujúceho editovaného textu"
},
"colors": {
"transparent": "Priehľadná",
@@ -467,36 +449,5 @@
"shades": "Odtiene",
"hexCode": "Hex kód",
"noShades": "Pre túto farbu nie sú dostupné žiadne odtiene"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportovať ako obrázok",
"button": "Exportovať ako obrázok",
"description": "Exportovať údaje scény ako obrázok, z ktorého môžu byť neskôr importované."
},
"saveToDisk": {
"title": "Uložiť na disk",
"button": "Uložiť na disk",
"description": "Exportovať údaje scény do súboru, z ktorého môžu byť neskôr importované."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exportovať ako Excalidraw+",
"description": "Uložiť scénu do vášho Excalidraw+ pracovného priestoru."
}
},
"modal": {
"loadFromFile": {
"title": "Načítať zo súboru",
"button": "Načítať zo súboru",
"description": "Načítanie zo súboru <bold>nahradí váš existujúci obsah</bold>.<br></br>Vašu kresbu môžete zálohovať jednou z nižšie uvedených možností."
},
"shareableLink": {
"title": "Načítať z odkazu",
"button": "Nahradiť môj obsah",
"description": "Načítanie externej kresby <bold>nahradí váš existujúci obsah</bold>.<br></br>Vašu kresbu môžete zálohovať jednou z nižšie uvedených možností."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Zavij besedilo v vsebnik",
"link": {
"edit": "Uredi povezavo",
"editEmbed": "Uredi povezavo in vdelaj",
"create": "Ustvari povezavo",
"createEmbed": "Ustvari povezavo in vdelaj",
"label": "Povezava",
"labelEmbed": "Povezava in vdelovanje",
"empty": "Povezava ni nastavljena"
"label": "Povezava"
},
"lineEditor": {
"edit": "Uredi črto",
@@ -164,16 +160,13 @@
"darkMode": "Temni način",
"lightMode": "Svetli način",
"zenMode": "Način Zen",
"objectsSnapMode": "Pripenjanje na predmete",
"exitZenMode": "Zapri način Zen",
"cancel": "Prekliči",
"clear": "Počisti",
"remove": "Odstrani",
"embed": "Preklopi vdelavo",
"publishLibrary": "Objavi",
"submit": "Pošlji",
"confirm": "Potrdi",
"embeddableInteractionButton": "Kliknite za interakcijo"
"confirm": "Potrdi"
},
"alerts": {
"clearReset": "To bo počistilo celotno platno. Ali ste prepričani?",
@@ -203,7 +196,6 @@
"imageInsertError": "Vstavljanje slike ni bilo uspešno. Poskusite ponovno kasneje...",
"fileTooBig": "Datoteka je prevelika. Največja dovoljena velikost je {{maxSize}}.",
"svgImageInsertError": "Vstavljanje slike SVG ni uspelo. Oznake SVG so videti neveljavne.",
"failedToFetchImage": "Pridobivanje slike ni uspelo.",
"invalidSVGString": "Neveljaven SVG.",
"cannotResolveCollabServer": "Povezave s strežnikom za sodelovanje ni bilo mogoče vzpostaviti. Ponovno naložite stran in poskusite znova.",
"importLibraryError": "Nalaganje knjižnice ni uspelo",
@@ -214,10 +206,6 @@
"line2": "To bi lahko povzročilo motnje v obnašanju <bold>besedilnih elementov</bold> v vaših risbah.",
"line3": "Močno priporočamo, da onemogočite to nastavitev. Sledite <link>tem korakom</link>, kako to storiti.",
"line4": "Če onemogočanje te nastavitve ne popravi prikaza besedilnih elementov, odprite <issueLink>vprašanje</issueLink> na našem GitHubu ali nam pišite na <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Vdelani elementi ne morejo biti dodani v knjižnico.",
"image": "Podpora za dodajanje slik v knjižnico prihaja kmalu!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Dodaj/posodobi povezavo za izbrano obliko",
"eraser": "Radirka",
"frame": "Okvir",
"embeddable": "Spletna vdelava",
"laser": "Laserski kazalec",
"hand": "Roka (orodje za premikanje)",
"extraTools": "Več orodij"
},
@@ -251,7 +237,6 @@
"linearElement": "Kliknite za začetek več točk, povlecite za posamezno črto",
"freeDraw": "Kliknite in povlecite, spustite, ko končate",
"text": "Namig: besedilo lahko dodate tudi z dvoklikom kjer koli z orodjem za izbiro",
"embeddable": "Kliknite in povlecite, da ustvarite spletno vdelavo",
"text_selected": "Dvokliknite ali pritisnite tipko Enter, da uredite besedilo",
"text_editing": "Pritisnite tipko Escape ali CtrlOrCmd+Enter za zaključek urejanja",
"linearElementMulti": "Kliknite zadnjo točko ali pritisnite Escape ali Enter, da končate",
@@ -267,8 +252,7 @@
"bindTextToElement": "Pritisnite tipko Enter za dodajanje besedila",
"deepBoxSelect": "Držite tipko CtrlOrCmd za globoko izbiro in preprečitev vlečenja",
"eraserRevert": "Pridržite tipko Alt, da razveljavite elemente, označene za brisanje",
"firefox_clipboard_write": "To funkcijo lahko verjetno omogočite z nastavitvijo zastavice \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Če želite spremeniti zastavice brskalnika v Firefoxu, obiščite stran \"about:config\".",
"disableSnapping": "Držite CtrlOrCmd, da onemogočite pripenjanje"
"firefox_clipboard_write": "To funkcijo lahko verjetno omogočite z nastavitvijo zastavice \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Če želite spremeniti zastavice brskalnika v Firefoxu, obiščite stran \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Predogleda ni bilo mogoče prikazati",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Shranjeno v {filename}",
"canvas": "platno",
"selection": "izbor",
"pasteAsSingleElement": "Uporabite {{shortcut}}, da prilepite kot en element,\n ali prilepite v obstoječ urejevalnik besedil",
"unableToEmbed": "Vdelava tega URL-ja trenutno ni dovoljena. Ustvarite vprašanje na GitHub-u in prosite za vmestitev URL-ja na seznam dovoljenih",
"unrecognizedLinkFormat": "Povezava, ki ste jo vdelali, se ne ujema s pričakovano obliko. Poskusite prilepiti niz za vdelavo, ki ste ga prejeli na izvorni strani"
"pasteAsSingleElement": "Uporabite {{shortcut}}, da prilepite kot en element,\n ali prilepite v obstoječ urejevalnik besedil"
},
"colors": {
"transparent": "Prosojno",
@@ -467,36 +449,5 @@
"shades": "Odtenki",
"hexCode": "Hex koda",
"noShades": "Odtenki za to barvo niso na voljo"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Izvozi kot sliko",
"button": "Izvozi kot sliko",
"description": "Izvozite podatke scene kot sliko, iz katere jo lahko pozneje uvozite."
},
"saveToDisk": {
"title": "Shrani na disk",
"button": "Shrani na disk",
"description": "Izvozite podatke scene v datoteko, iz katere jo lahko pozneje uvozite."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Izvozi v Excalidraw+",
"description": "Shrani sceno v svoj delovni prostor Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Naloži iz datoteke",
"button": "Naloži iz datoteke",
"description": "Nalaganje iz datoteke bo <bold>prepisalo vašo obstoječo vsebino</bold>.<br></br>Svojo risbo lahko najprej varnostno kopirate z eno od spodnjih možnosti."
},
"shareableLink": {
"title": "Naloži iz povezave",
"button": "Zamenjaj mojo vsebino",
"description": "Nalaganje zunanje risbe bo <bold>prepisalo vašo obstoječo vsebino</bold>.<br></br>Svojo risbo lahko najprej varnostno kopirate z eno od spodnjih možnosti."
}
}
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Radbryt text i en avgränsad yta",
"link": {
"edit": "Redigera länk",
"editEmbed": "Redigera länk & bädda in",
"create": "Skapa länk",
"createEmbed": "Skapa länk & bädda in",
"label": "Länk",
"labelEmbed": "Länka & bädda in",
"empty": "Ingen länk är angiven"
"label": "Länk"
},
"lineEditor": {
"edit": "Redigera linje",
@@ -164,16 +160,13 @@
"darkMode": "Mörkt läge",
"lightMode": "Ljust läge",
"zenMode": "Zen-läge",
"objectsSnapMode": "Fäst mot objekt",
"exitZenMode": "Gå ur zen-läge",
"cancel": "Avbryt",
"clear": "Rensa",
"remove": "Ta bort",
"embed": "Växla inbäddning",
"publishLibrary": "Publicera",
"submit": "Skicka",
"confirm": "Bekräfta",
"embeddableInteractionButton": "Klicka för att interagera"
"confirm": "Bekräfta"
},
"alerts": {
"clearReset": "Detta rensar hela canvasen. Är du säker?",
@@ -203,7 +196,6 @@
"imageInsertError": "Kunde inte infoga bild. Försök igen senare...",
"fileTooBig": "Filen är för stor. Maximal tillåten storlek är {{maxSize}}.",
"svgImageInsertError": "Kunde inte infoga SVG-bild. SVG-koden ser ogiltig ut.",
"failedToFetchImage": "Kunde inte hämta bilden.",
"invalidSVGString": "Ogiltig SVG.",
"cannotResolveCollabServer": "Det gick inte att ansluta till samarbets-servern. Ladda om sidan och försök igen.",
"importLibraryError": "Kunde inte ladda bibliotek",
@@ -214,10 +206,6 @@
"line2": "Detta kan resultera i trasiga <bold>Textelement</bold> i dina ritningar.",
"line3": "Vi rekommenderar starkt att du inaktiverar den här inställningen. Du kan följa <link>dessa steg</link> för att inaktivera den.",
"line4": "Om inaktivering av denna inställning inte åtgärdar visningen av textelement, öppna ett <issueLink>ärende</issueLink> på vår GitHub, eller skriv till oss på <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Inbäddbara element kan inte läggas till i biblioteket.",
"image": "Stöd för att lägga till bilder till biblioteket kommer snart!"
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Lägg till / Uppdatera länk för en vald form",
"eraser": "Radergummi",
"frame": "Rutverktyg",
"embeddable": "Bädda in (web)",
"laser": "Laserpekare",
"hand": "Hand (panoreringsverktyg)",
"extraTools": "Fler verktyg"
},
@@ -251,7 +237,6 @@
"linearElement": "Klicka för att starta flera punkter, dra för en linje",
"freeDraw": "Klicka och dra, släpp när du är klar",
"text": "Tips: du kan också lägga till text genom att dubbelklicka var som helst med markeringsverktyget",
"embeddable": "Klicka-dra för att skapa en webbplats-inbäddning",
"text_selected": "Dubbelklicka eller tryck ENTER för att redigera text",
"text_editing": "Tryck Escape eller CtrlOrCmd + ENTER för att slutföra redigeringen",
"linearElementMulti": "Klicka på sista punkten eller tryck Escape eller Enter för att avsluta",
@@ -267,8 +252,7 @@
"bindTextToElement": "Tryck på Enter för att lägga till text",
"deepBoxSelect": "Håll Ctrl eller Cmd för att djupvälja, och för att förhindra att dra",
"eraserRevert": "Håll Alt för att återställa de element som är markerade för borttagning",
"firefox_clipboard_write": "Denna funktion kan sannolikt aktiveras genom att ställa in \"dom.events.asyncClipboard.clipboardItem\" flaggan till \"true\". För att ändra webbläsarens flaggor i Firefox, besök \"about:config\" sidan.",
"disableSnapping": "Håll Ctrl eller Cmd för att inaktivera fästning"
"firefox_clipboard_write": "Denna funktion kan sannolikt aktiveras genom att ställa in \"dom.events.asyncClipboard.clipboardItem\" flaggan till \"true\". För att ändra webbläsarens flaggor i Firefox, besök \"about:config\" sidan."
},
"canvasError": {
"cannotShowPreview": "Kan inte visa förhandsgranskning",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Sparad till {filename}",
"canvas": "canvas",
"selection": "markering",
"pasteAsSingleElement": "Använd {{shortcut}} för att klistra in som ett enda element,\neller klistra in i en befintlig textredigerare",
"unableToEmbed": "Att bädda in denna webbadress är för närvarande inte tillåtet. Skapa en problemrapport på GitHub för att begära att webbadressen vitlistas.",
"unrecognizedLinkFormat": "Länken du bäddade in matchar inte det förväntade formatet. Försök klistra in 'embed'-strängen som tillhandahålls av källwebbplatsen"
"pasteAsSingleElement": "Använd {{shortcut}} för att klistra in som ett enda element,\neller klistra in i en befintlig textredigerare"
},
"colors": {
"transparent": "Genomskinlig",
@@ -467,36 +449,5 @@
"shades": "Nyanser",
"hexCode": "Hex-kod",
"noShades": "Inga nyanser tillgängliga för denna färg"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Exportera som bild",
"button": "Exportera som bild",
"description": "Exportera scendata som en bild från vilken du kan importera senare."
},
"saveToDisk": {
"title": "Spara till disk",
"button": "Spara till disk",
"description": "Exportera scendata till en fil från vilken du kan importera senare."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Exportera till Excalidraw+",
"description": "Spara skissen till din Excalidraw+ arbetsyta."
}
},
"modal": {
"loadFromFile": {
"title": "Läs in från fil",
"button": "Läs in från fil",
"description": "Laddar från en fil kommer <bold>ersätta ditt befintliga innehåll</bold>.<br></br>Du kan säkerhetskopiera din ritning först med hjälp av ett av alternativen nedan."
},
"shareableLink": {
"title": "Läs in från länk",
"button": "Ersätt mitt innehåll",
"description": "Inläsning av en extern ritning kommer <bold>ersätta ditt befintliga innehåll</bold>.<br></br>Du kan säkerhetskopiera din ritning först genom att använda ett av alternativen nedan."
}
}
}
}
+34 -83
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "உரையைக் கொள்கலனுள் சுருட்டு",
"link": {
"edit": "தொடுப்பைத் திருத்து",
"editEmbed": "",
"create": "தொடுப்பைப் படை",
"createEmbed": "",
"label": "தொடுப்பு",
"labelEmbed": "",
"empty": ""
"label": "தொடுப்பு"
},
"lineEditor": {
"edit": "தொடுப்பைத் திருத்து",
@@ -164,16 +160,13 @@
"darkMode": "கருமை பயன்முறை",
"lightMode": "வெளிர்ந்த பயன்முறை",
"zenMode": "ஜென் பயன்முறை",
"objectsSnapMode": "",
"exitZenMode": "ஜென் பயன்முறையை விலகு",
"cancel": "ரத்துசெய்",
"clear": "துடை",
"remove": "நீக்கு",
"embed": "",
"publishLibrary": "பிரசுரி",
"submit": "சமர்ப்பி",
"confirm": "உறுதிசெய்",
"embeddableInteractionButton": ""
"confirm": "உறுதிசெய்"
},
"alerts": {
"clearReset": "இது முழு கித்தானையும் துடைக்கும். நீங்கள் உறுதியா?",
@@ -203,7 +196,6 @@
"imageInsertError": "படத்தைப் புகுத்தவியலா. பிறகு மீண்டும் முயலவும்...",
"fileTooBig": "கோப்பு மிகப்பெரிது. அனுமதிக்கப்பட்ட அதிகபட்ச அளவு {{maxSize}}.",
"svgImageInsertError": "எஸ்விஜி படத்தைப் புகுத்தவியலா. எஸ்விஜியின் மார்க்அப் செல்லாததாக தெரிகிறது.",
"failedToFetchImage": "",
"invalidSVGString": "செல்லாத SVG.",
"cannotResolveCollabServer": "கூட்டுப்பணிச் சேவையகத்துடன் இணைக்க முடியவில்லை. பக்கத்தை மீளேற்றி மீண்டும் முயலவும்.",
"importLibraryError": "நூலகத்தை ஏற்ற முடியவில்லை",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -232,14 +220,12 @@
"text": "உரை",
"library": "நூலகம்",
"lock": "தேர்ந்த கருவியை வரைந்த பின்பும் வைத்திரு",
"penMode": "பேனா - தடுப்பு தொடுதல்",
"penMode": "",
"link": "தேர்தெடுத்த வடிவத்திற்குத் தொடுப்பைச் சேர்/ புதுப்பி",
"eraser": "அழிப்பி",
"frame": "சட்டகம் கருவி",
"embeddable": "",
"laser": "",
"hand": "கை (பார்வை நகர்கும் கருவி)",
"extraTools": "மற்ற கருவிகள்"
"frame": "",
"hand": "",
"extraTools": ""
},
"headings": {
"canvasActions": "கித்தான் செயல்கள்",
@@ -251,7 +237,6 @@
"linearElement": "பல புள்ளிகளைத் துவக்க சொடுக்கு, ஒற்றை வரிக்கு பிடித்திழு",
"freeDraw": "சொடுக்கி பிடித்திழு, முடித்ததும் விடுவி",
"text": "துணுக்குதவி: தெரிவு கருவி கொண்டு எங்காவது இரு-சொடுக்கி உரையைச் சேர்க்கலாம்",
"embeddable": "",
"text_selected": "உரையைத் திருத்த இரு-சொடுக்கு அ ENTERஐ அழுத்து",
"text_editing": "திருத்துவதை முடிக்க Escape அ CtrlOrCmd+ENTERஐ அழுத்து",
"linearElementMulti": "கடைசி புள்ளியில் சொடுக்கு அ முடிக்க Escape அ Enter அழுத்து",
@@ -267,8 +252,7 @@
"bindTextToElement": "உரையைச் சேர்க்க enterஐ அழுத்து",
"deepBoxSelect": "ஆழ்ந்துத் தேரவும் பிடித்திழுத்தலைத் தவிர்க்கவும் CtrlOrCmdஐ அழுத்திப்பிடி",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "முன்னோட்டம் காட்ட இயலவில்லை",
@@ -333,8 +317,8 @@
"zoomToFit": "அனைத்துறுப்புகளும் பொருந்தும்படி விரிவாக்கு",
"zoomToSelection": "தெரிவுக்கு விரிவாக்கு",
"toggleElementLock": "தேர்ந்தெடுப்பைப் பூட்டு/பூட்டவிழ்",
"movePageUpDown": "மேலே/கீழே நகர்த்தவும்",
"movePageLeftRight": "இடது/வலது பக்கம் நகர்த்தவும்"
"movePageUpDown": "",
"movePageLeftRight": ""
},
"clearCanvasDialog": {
"title": "கித்தானைத் துடை"
@@ -376,26 +360,26 @@
"removeItemsFromLib": "நூலகத்திலிருந்து தேர்ந்தெடுத்த உருப்படிகளை நீக்கு"
},
"imageExportDialog": {
"header": "படத்தை ஏற்றுமதிதல",
"header": "",
"label": {
"withBackground": "பின்னணி",
"onlySelected": "தேர்ந்ததை மட்டும்",
"darkMode": "இருள் பயன்முறை",
"embedScene": "காட்சியை உட்பொதி",
"scale": "அளவுகோல்",
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": ""
},
"title": {
"exportToPng": "PNGக்கு ஏற்றுமதிசெய்",
"exportToSvg": "SVGக்கு ஏற்றுமதிசெய்",
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
@@ -427,26 +411,24 @@
"fileSavedToFilename": "{filename}-க்கு சேமிக்கப்பட்டது",
"canvas": "கித்தான்",
"selection": "தெரிவு",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "ஒளிபுகுத்தன்மை",
"black": "கருப்பு",
"white": "வெள்ளை",
"red": "சிவப்பு",
"pink": "இளஞ்சிவப்பு",
"grape": "திராட்சை",
"violet": "ஊதா",
"gray": "சாம்பல்",
"blue": "நீலம்",
"cyan": "மயில்நிறம்",
"teal": "டீல்",
"green": "பச்சை",
"yellow": "மஞ்சள்",
"orange": "ஆரஞ்சு",
"bronze": "வெண்கலம்"
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+39 -88
View File
@@ -22,22 +22,22 @@
"background": "พื้นหลัง",
"fill": "เติมสี",
"strokeWidth": "น้ำหนักเส้นขอบ",
"strokeStyle": "รูปแบบเส้น",
"strokeStyle_solid": "เส้นทึบ",
"strokeStyle_dashed": "เส้นประ",
"strokeStyle_dotted": "จุด",
"strokeStyle": "",
"strokeStyle_solid": "",
"strokeStyle_dashed": "",
"strokeStyle_dotted": "",
"sloppiness": "ความเลอะเทอะ",
"opacity": "ความทึบแสง",
"textAlign": "จัดข้อความ",
"edges": "ขอบ",
"sharp": "",
"round": "",
"arrowheads": "หัวลูกศร",
"arrowhead_none": "ไม่มี",
"arrowhead_arrow": "ลูกศร",
"arrowhead_bar": "แถบ",
"arrowhead_dot": "จุด",
"arrowhead_triangle": "สามเหลี่ยม",
"arrowheads": "",
"arrowhead_none": "",
"arrowhead_arrow": "",
"arrowhead_bar": "",
"arrowhead_dot": "",
"arrowhead_triangle": "",
"fontSize": "ขนาดตัวอักษร",
"fontFamily": "แบบตัวอักษร",
"addWatermark": "เพิ่มลายน้ำ \"สร้างด้วย Excalidraw\"",
@@ -59,7 +59,7 @@
"right": "ขวา",
"extraBold": "หนาพิเศษ",
"architect": "",
"artist": "ศิลปิน",
"artist": "",
"cartoonist": "",
"fileTitle": "ชื่อไฟล์",
"colorPicker": "เลือกสีที่กำหนดเอง",
@@ -104,17 +104,13 @@
"excalidrawLib": "คลังของ Excalidraw",
"decreaseFontSize": "ลดขนาดตัวอักษร",
"increaseFontSize": "เพิ่มขนาดตัวอักษร",
"unbindText": "ยกเลิกการผูกติด",
"unbindText": "",
"bindText": "",
"createContainerFromText": "",
"link": {
"edit": "แก้ไขลิงก์",
"editEmbed": "แก้ไขลิงค์และการฝัง",
"create": "สร้างลิงค์",
"createEmbed": "สร้างลิงค์และการฝัง",
"label": "ลิงค์",
"labelEmbed": "ลิงค์และการฝัง",
"empty": "ไม่ได้ใส่ลิงค์"
"label": "ลิงค์"
},
"lineEditor": {
"edit": "แก้ไขเส้น",
@@ -133,18 +129,18 @@
"eyeDropper": ""
},
"library": {
"noItems": "ยังไม่มีรายการที่เพิ่มเข้าไปได้",
"noItems": "",
"hint_emptyLibrary": "",
"hint_emptyPrivateLibrary": ""
},
"buttons": {
"clearReset": "รีเซ็ทผืนผ้าใบ",
"clearReset": "",
"exportJSON": "ส่งออกไปยังไฟล์",
"exportImage": "ส่งออกเป็นรูปภาพ",
"export": "บันทึกไปยัง",
"copyToClipboard": "คัดลอกไปยังคลิปบอร์ด",
"save": "บันทึกเป็นไฟล์ปัจจุบัน",
"saveAs": "บันทึกเป็น",
"save": "",
"saveAs": "",
"load": "เปิด",
"getShareableLink": "สร้างลิงค์ที่แชร์ได้",
"close": "ปิด",
@@ -164,24 +160,21 @@
"darkMode": "โหมดกลางคืน",
"lightMode": "โหมดกลางวัน",
"zenMode": "โหมด Zen",
"objectsSnapMode": "",
"exitZenMode": "ออกจากโหมด Zen",
"cancel": "ยกเลิก",
"clear": "เคลียร์",
"remove": "ลบ",
"embed": "สลับการฝัง",
"publishLibrary": "เผยแพร่",
"submit": "ตกลง",
"confirm": "ยืนยัน",
"embeddableInteractionButton": "คลิกเพื่อปฏิสัมพันธ์"
"confirm": "ยืนยัน"
},
"alerts": {
"clearReset": "",
"couldNotCreateShareableLink": "ไม่สามารถสร้างลิงค์ได้",
"couldNotCreateShareableLink": "",
"couldNotCreateShareableLinkTooBig": "",
"couldNotLoadInvalidFile": "ไม่สามารถโหลดไฟล์ที่ผิดพลาดได้",
"importBackendFailed": "เกิดข้อผิดพลาดจากการนำเข้าจากระบบหลังบ้าน",
"cannotExportEmptyCanvas": "ไม่สามารถนำออกจากผืนผ้าใบที่ว่างเปล่าได้",
"importBackendFailed": "",
"cannotExportEmptyCanvas": "",
"couldNotCopyToClipboard": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้",
"decryptFailed": "ไม่สามารถถอดรหัสข้อมูลได้",
"uploadedSecurly": "การอัพโหลดได้ถูกเข้ารหัสแบบ end-to-end หมายความว่าเซิร์ฟเวอร์ของ Excalidraw และบุคคลอื่นไม่สามารถอ่านข้อมูลได้",
@@ -203,7 +196,6 @@
"imageInsertError": "ไม่สามารถเพิ่มรูปภาพได้ ลองอีกครั้งในภายหลัง",
"fileTooBig": "",
"svgImageInsertError": "",
"failedToFetchImage": "",
"invalidSVGString": "ไฟล์ SVG ผิดพลาด",
"cannotResolveCollabServer": "ไม่สามารถเชื่อต่อกับ collab เซิร์ฟเวอร์ได้ โปรดลองโหลดหน้านี้ใหม่และลองอีกครั้ง",
"importLibraryError": "",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "การเพิ่มองค์ประกอบที่ฝังยังไม่สามารถเพิ่มเข้าไปในไลบลารีได้",
"image": "การสนับสนุนสำหรับเพิ่มรูปภาพลงในไลบลารีจะมาในเร็ว ๆ นี้"
}
},
"toolBar": {
@@ -225,8 +213,8 @@
"image": "",
"rectangle": "สี่เหลี่ยมผืนผ้า",
"diamond": "",
"ellipse": "วงรี",
"arrow": "ลูกศร",
"ellipse": "",
"arrow": "",
"line": "",
"freedraw": "",
"text": "ข้อความ",
@@ -236,10 +224,8 @@
"link": "",
"eraser": "ยางลบ",
"frame": "",
"embeddable": "ฝังเว็บ",
"laser": "",
"hand": "",
"extraTools": "เครื่องมืออื่นๆ"
"extraTools": ""
},
"headings": {
"canvasActions": "",
@@ -251,7 +237,6 @@
"linearElement": "",
"freeDraw": "",
"text": "",
"embeddable": "คลิกและลากเพื่อสร้างการฝังสำหรับเว็บไซต์",
"text_selected": "คลิกสองครั้งหรือกด ENTER เพื่อแก้ไขข้อความ",
"text_editing": "กดปุ่ม Esc หรือกด Ctrl, Cmd + Enter เพื่อเสร็จการแก้ไข",
"linearElementMulti": "คลิกที่จุดสุดท้ายหรือกด Escape หรือ Enter เพื่อเสร็จสิ้น",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "",
@@ -319,7 +303,7 @@
"drag": "ลาก",
"editor": "",
"editLineArrowPoints": "",
"editText": "แก้ไขข้อความ / เพิ่มข้อความ",
"editText": "",
"github": "",
"howto": "",
"or": "",
@@ -380,7 +364,7 @@
"label": {
"withBackground": "",
"onlySelected": "",
"darkMode": "โหมดกลางคืน",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
@@ -389,14 +373,14 @@
"embedScene": ""
},
"title": {
"exportToPng": "ส่งออกไปเป็น SVG",
"exportToSvg": "ส่งออกไปเป็น SVG",
"copyPngToClipboard": "คัดลอก PNG ไปยังคลิปบอร์ด"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "คัดลอกไปยังคลิปบอร์ด"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -442,11 +424,11 @@
"gray": "",
"blue": "",
"cyan": "",
"teal": "ฟ้าน้ำทะเล",
"green": "เขียว",
"yellow": "เหลือง",
"orange": "ส้ม",
"bronze": "ทองแดง"
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+42 -91
View File
@@ -50,7 +50,7 @@
"veryLarge": "Çok geniş",
"solid": "Dolu",
"hachure": "Taralı",
"zigzag": "Zikzak",
"zigzag": "",
"crossHatch": "Çapraz-taralı",
"thin": "İnce",
"bold": "Kalın",
@@ -106,15 +106,11 @@
"increaseFontSize": "Yazı Tipi Boyutunu Büyült",
"unbindText": "Metni çöz",
"bindText": "Metni taşıyıcıya bağla",
"createContainerFromText": "Metni bileşen içinde sar",
"createContainerFromText": "",
"link": {
"edit": "Bağlantıyı düzenle",
"editEmbed": "Bağlantıyı düzenle & yerleştir",
"create": "Bağlantı oluştur",
"createEmbed": "Bağlantı oluştur & yerleştir",
"label": "Bağlantı",
"labelEmbed": "Bağlantı & yerleştirme",
"empty": "Herhangi bir bağlantı oluşturulmadı"
"label": "Bağlantı"
},
"lineEditor": {
"edit": "Çizgiyi düzenle",
@@ -128,9 +124,9 @@
},
"statusPublished": "Yayınlandı",
"sidebarLock": "Kenar çubuğu açık kalsın",
"selectAllElementsInFrame": "Çerçevedeki tüm bileşenleri seç",
"removeAllElementsFromFrame": "Çerçevedeki tüm bileşenleri sil",
"eyeDropper": "Tuvalden renk seç"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "Öğe eklenmedi...",
@@ -164,16 +160,13 @@
"darkMode": "Koyu tema",
"lightMode": "Açık tema",
"zenMode": "Zen modu",
"objectsSnapMode": "Nesnelere hizala",
"exitZenMode": "Zen modundan çık",
"cancel": "İptal",
"clear": "Temizle",
"remove": "Kaldır",
"embed": "",
"publishLibrary": "Yayınla",
"submit": "Gönder",
"confirm": "Onayla",
"embeddableInteractionButton": "Etkileşime girmek için tıkla"
"confirm": "Onayla"
},
"alerts": {
"clearReset": "Tuvalin tamamı temizlenecek. Emin misiniz?",
@@ -196,14 +189,13 @@
"resetLibrary": "Bu işlem kütüphanenizi sıfırlayacak. Emin misiniz?",
"removeItemsFromsLibrary": "{{count}} öğe(ler) kitaplıktan kaldırılsın mı?",
"invalidEncryptionKey": "Şifreleme anahtarı 22 karakter olmalı. Canlı işbirliği devre dışı bırakıldı.",
"collabOfflineWarning": "İnternet bağlantısı bulunamadı. Değişiklikleriniz kaydedilmeyecek!"
"collabOfflineWarning": ""
},
"errors": {
"unsupportedFileType": "Desteklenmeyen dosya türü.",
"imageInsertError": "Görsel eklenemedi. Daha sonra tekrar deneyin...",
"fileTooBig": "Dosya çok büyük. İzin verilen maksimum boyut {{maxSize}}.",
"svgImageInsertError": "SVG resmi eklenemedi. SVG işaretlemesi geçersiz görünüyor.",
"failedToFetchImage": "",
"invalidSVGString": "Geçersiz SVG.",
"cannotResolveCollabServer": "İş birliği sunucusuna bağlanılamıyor. Lütfen sayfayı yenileyip tekrar deneyin.",
"importLibraryError": "Kütüphane yüklenemedi",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": "Resimleri kütüphaneye ekleme desteği yakında geliyor!"
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Kalem modu - dokunmayı engelle",
"link": "Seçilen şekil için bağlantı Ekle/Güncelle",
"eraser": "Silgi",
"frame": "Çerçeve aracı",
"embeddable": "Web Yerleştirme",
"laser": "Lazer işaretçisi",
"frame": "",
"hand": "",
"extraTools": "Daha fazla araç"
"extraTools": ""
},
"headings": {
"canvasActions": "Tuval eylemleri",
@@ -251,7 +237,6 @@
"linearElement": "Birden fazla nokta için tıklayın, tek çizgi için sürükleyin",
"freeDraw": "Tıkla ve sürükle, bitirdiğinde serbest bırak",
"text": "İpucu: seçme aracıyla herhangi bir yere çift tıklayarak da yazı ekleyebilirsin",
"embeddable": "Web sitesi yerleştirmek için sürükle bırak",
"text_selected": "Metni düzenlemek için çift tıklayın veya ENTER'a basın",
"text_editing": "Düzenlemeyi bitirmek için ESC veya Ctrl/Cmd+ENTER tuşlarına basın",
"linearElementMulti": "Bitirmek için son noktaya tıklayın ya da Escape veya Enter tuşuna basın",
@@ -267,8 +252,7 @@
"bindTextToElement": "Enter tuşuna basarak metin ekleyin",
"deepBoxSelect": "Ctrl/Cmd tuşuna basılı tutarak derin seçim yapın ya da sürüklemeyi engelleyin",
"eraserRevert": "Alt tuşuna basılı tutarak silinme için işaretlenmiş ögeleri tersine çevirin",
"firefox_clipboard_write": "",
"disableSnapping": ""
"firefox_clipboard_write": ""
},
"canvasError": {
"cannotShowPreview": "Önizleme gösterilemiyor",
@@ -376,27 +360,27 @@
"removeItemsFromLib": "Seçilen ögeleri kütüphaneden kaldır"
},
"imageExportDialog": {
"header": "Resmi dışa aktar",
"header": "",
"label": {
"withBackground": "Arka plan",
"onlySelected": "Sadece seçilen",
"darkMode": "Karanlık mod",
"embedScene": "Sahne yerleştir",
"scale": "Ölçeklendir",
"padding": "Dış boşluk"
"withBackground": "",
"onlySelected": "",
"darkMode": "",
"embedScene": "",
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": "Sahne verisi, sahnenin geri yüklenebilmesi için dışarı aktarılan PNG/SVG dosyasına kaydedilecektir. Bu, dışa aktarılan dosya boyutunu arttıracaktır."
"embedScene": ""
},
"title": {
"exportToPng": "PNG olarak dışa aktar",
"exportToSvg": "SVG olarak dışa aktar",
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Panoya kopyala"
"exportToPng": "",
"exportToSvg": "",
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,31 +411,29 @@
"fileSavedToFilename": "{filename} kaydedildi",
"canvas": "tuval",
"selection": "seçim",
"pasteAsSingleElement": "Tekil obje olarak yapıştırmak için veya var olan bir metin editörüne yapıştırmak için {{shortcut}} kullanın",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": "Tekil obje olarak yapıştırmak için veya var olan bir metin editörüne yapıştırmak için {{shortcut}} kullanın"
},
"colors": {
"transparent": "Şeffaf",
"black": "Siyah",
"white": "Beyaz",
"red": "Kırmızı",
"pink": "Pembe",
"grape": "Koyu Mor",
"violet": "Menekşe rengi",
"gray": "Gri",
"blue": "Mavi",
"cyan": "Camgöbeği",
"teal": "Deniz mavisi",
"green": "Yeşil",
"yellow": "Sarı",
"orange": "Turuncu",
"black": "",
"white": "",
"red": "",
"pink": "",
"grape": "",
"violet": "",
"gray": "",
"blue": "",
"cyan": "",
"teal": "",
"green": "",
"yellow": "",
"orange": "",
"bronze": ""
},
"welcomeScreen": {
"app": {
"center_heading": "",
"center_heading_plus": "Ecalidraw+'a mı gitmek istediniz?",
"center_heading_plus": "",
"menuHint": "Dışa aktar, seçenekler, diller, ..."
},
"defaults": {
@@ -462,41 +444,10 @@
}
},
"colorPicker": {
"mostUsedCustomColors": "En çok kullanılan özel renkler",
"colors": "Renkler",
"mostUsedCustomColors": "",
"colors": "",
"shades": "",
"hexCode": "Hex kodu",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "Diske Kaydet",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}
+19 -68
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "Огорнути текст у контейнер",
"link": {
"edit": "Редагування посилання",
"editEmbed": "Редагування посилання і вкладення",
"create": "Створити посилання",
"createEmbed": "Створити посилання і вкладення",
"label": "Посилання",
"labelEmbed": "Посилання і вкладення",
"empty": "Посилання відсутнє"
"label": "Посилання"
},
"lineEditor": {
"edit": "Редагувати лінію",
@@ -128,9 +124,9 @@
},
"statusPublished": "Опубліковано",
"sidebarLock": "Не закривати бокове меню",
"selectAllElementsInFrame": "Обрати всі елементи у фреймі",
"removeAllElementsFromFrame": "Видалити всі елементи з фрейму",
"eyeDropper": "Вибрати колір з полотна"
"selectAllElementsInFrame": "",
"removeAllElementsFromFrame": "",
"eyeDropper": ""
},
"library": {
"noItems": "Тут поки пусто...",
@@ -164,16 +160,13 @@
"darkMode": "Темна тема",
"lightMode": "Світла тема",
"zenMode": "Режим Дзен",
"objectsSnapMode": "",
"exitZenMode": "Вийти з дзен-режиму",
"cancel": "Скасувати",
"clear": "Очистити",
"remove": "Видалити",
"embed": "Перемкнути вкладення",
"publishLibrary": "Опублікувати",
"submit": "Надіслати",
"confirm": "Підтвердити",
"embeddableInteractionButton": "Натисніть для взаємодії"
"confirm": "Підтвердити"
},
"alerts": {
"clearReset": "Це очистить все полотно. Впевнені?",
@@ -203,7 +196,6 @@
"imageInsertError": "Не вдалося вставити зображення. Повторіть спробу пізніше...",
"fileTooBig": "Занадто великий розмір файлу, максимальний розмір файлу {{maxSize}}.",
"svgImageInsertError": "Не вдалося вставити SVG-зображення. Помилка розмітки SVG.",
"failedToFetchImage": "",
"invalidSVGString": "Недійсний SVG.",
"cannotResolveCollabServer": "Не вдалося приєднатися до сервера. Перезавантажте сторінку та повторіть спробу.",
"importLibraryError": "Не вдалося завантажити бібліотеку",
@@ -214,10 +206,6 @@
"line2": "Це може нашкодити <bold>текстовим елементам</bold> у ваших малюнках.",
"line3": "Ми наполегливо рекомендуємо вимкнути це налаштування. Виконайте наступні <link>кроки</link>, щоб виправити це.",
"line4": "Якщо вимкнення цього параметра не вирішує показ текстових елементів, тоді створіть, будь ласка, <issueLink>запит на розв'язання проблеми</issueLink> на нашому GitHub або напишіть нам у <discordLink>Discord</discordLink>"
},
"libraryElementTypeError": {
"embeddable": "Вбудовані елементи не можна додати в бібліотеку.",
"image": "Підтримка додавання зображень в бібліотеку найближчим часом!"
}
},
"toolBar": {
@@ -235,11 +223,9 @@
"penMode": "Режим пера - запобігання дотику",
"link": "Додати/Оновити посилання для вибраної форми",
"eraser": "Очищувач",
"frame": "Інструмент фрейму",
"embeddable": "Веб вкладення",
"laser": "",
"frame": "",
"hand": "Рука (інструмент для панорамування)",
"extraTools": "Інші інструменти"
"extraTools": ""
},
"headings": {
"canvasActions": "Дії з полотном",
@@ -251,7 +237,6 @@
"linearElement": "Натисніть щоб додати кілька точок. Перетягніть щоб намалювати одну лінію",
"freeDraw": "Натисніть і потягніть, відпустіть коли завершите",
"text": "Порада: можна також додати текст, двічі клацнувши по будь-якому місці інструментом вибору",
"embeddable": "Клікніть та перетягніть для створення вбудованого вебсайту",
"text_selected": "Подвійний клік або натисніть клавішу ENTER, щоб редагувати текст",
"text_editing": "Натисніть клавішу Escape або Ctrl/Cmd+ENTER, щоб завершити редагування",
"linearElementMulti": "Натисніть на останню точку, клацніть Esc або Enter щоб завершити",
@@ -267,8 +252,7 @@
"bindTextToElement": "Натисніть Enter, щоб додати текст",
"deepBoxSelect": "Втримуйте Ctrl/Cmd для глибокого виділення та щоб попередити перетягування",
"eraserRevert": "Втримуйте клавішу Alt, щоб повернути елементи позначені для видалення",
"firefox_clipboard_write": "Цю функцію можна ввімкнути, встановивши значення \"true\" для налаштування \"dom.events.asyncClipboard.clipboardItem\". Перейдіть на сторінку «about:config», щоб змінити налаштування браузера у Firefox.",
"disableSnapping": ""
"firefox_clipboard_write": "Цю функцію можна ввімкнути, встановивши значення \"true\" для налаштування \"dom.events.asyncClipboard.clipboardItem\". Перейдіть на сторінку «about:config», щоб змінити налаштування браузера у Firefox."
},
"canvasError": {
"cannotShowPreview": "Не вдається показати попередній перегляд",
@@ -378,25 +362,25 @@
"imageExportDialog": {
"header": "Експортувати зображення",
"label": {
"withBackground": "Тло",
"withBackground": "",
"onlySelected": "Тільки вибране",
"darkMode": "Темний режим",
"embedScene": "Вбудована сцена",
"scale": "Масштабування",
"padding": "Відступ"
"scale": "",
"padding": ""
},
"tooltip": {
"embedScene": "Дані сцени будуть збережені в експортований файл PNG/SVG. Ця сцена може бути відновлена з нього, однак це збільшить розмір експортованого файлу."
"embedScene": ""
},
"title": {
"exportToPng": "Експортувати в PNG",
"exportToSvg": "Експортувати у SVG",
"copyPngToClipboard": "Скопіювати PNG в буфер обміну"
"copyPngToClipboard": ""
},
"button": {
"exportToPng": "PNG",
"exportToSvg": "SVG",
"copyPngToClipboard": "Копіювати в буфер обміну"
"copyPngToClipboard": ""
}
},
"encrypted": {
@@ -427,9 +411,7 @@
"fileSavedToFilename": "Збережено в {filename}",
"canvas": "полотно",
"selection": "виділення",
"pasteAsSingleElement": "Використайте {{shortcut}} для вставки самостійного зразка або використайте в текстовому редакторі",
"unableToEmbed": "Вбудування цієї url на даний час не допускається. Підніміть питання на GitHub, щоб попросити внести URL-адресу до білого списку",
"unrecognizedLinkFormat": "Посилання, яке ви вставили, не відповідає очікуваному формату. Будь ласка, спробуйте вставити рядок \"embed\", наданий сайтом-джерелом"
"pasteAsSingleElement": "Використайте {{shortcut}} для вставки самостійного зразка або використайте в текстовому редакторі"
},
"colors": {
"transparent": "Прозорий",
@@ -437,12 +419,12 @@
"white": "Білий",
"red": "Червоний",
"pink": "Рожевий",
"grape": "Виноградний",
"grape": "",
"violet": "Фіолетовий",
"gray": "Сірий",
"blue": "Синій",
"cyan": "Ціан",
"teal": "Бірюзовий",
"teal": "",
"green": "Зелений",
"yellow": "Жовтий",
"orange": "Помаранчевий",
@@ -464,39 +446,8 @@
"colorPicker": {
"mostUsedCustomColors": "Найбільш використовувані користувацькі кольори",
"colors": "Кольори",
"shades": "Тіні",
"shades": "",
"hexCode": "Hex-код",
"noShades": "Немає доступних відтінків цього кольору"
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "Експортувати як зображення",
"button": "Експортувати як зображення",
"description": "Експорт даних сцени у вигляді зображення, з якого можна імпортувати пізніше."
},
"saveToDisk": {
"title": "Зберегти на диск",
"button": "Зберегти на диск",
"description": "Експорт даних сцени в файл, з якого можна імпортувати пізніше."
},
"excalidrawPlus": {
"title": "Excalidraw+",
"button": "Експортувати до Excalidraw+",
"description": "Зберегти сцену до робочого простору Excalidraw+."
}
},
"modal": {
"loadFromFile": {
"title": "Завантажити з файлу",
"button": "Завантажити з файлу",
"description": "Завантаження з файлу <bold>замінить наявний вміст</bold>.<br></br>Ви можете спочатку створити резервну копію малюнка, скориставшись одним із наведених нижче способів."
},
"shareableLink": {
"title": "Завантажити з посилання",
"button": "Замінити мій контент",
"description": "Завантаження зовнішнього малюнка <bold>замінить ваш наявний вміст</bold>.<br></br>Ви можете спочатку створити резервну копію малюнка, скориставшись одним із наведених нижче способів."
}
}
"noShades": ""
}
}
+4 -53
View File
@@ -109,12 +109,8 @@
"createContainerFromText": "",
"link": {
"edit": "Sửa liên kết",
"editEmbed": "",
"create": "Tạo liên kết",
"createEmbed": "",
"label": "Liên kết",
"labelEmbed": "",
"empty": ""
"label": "Liên kết"
},
"lineEditor": {
"edit": "Điều chỉnh nét",
@@ -164,16 +160,13 @@
"darkMode": "Chế độ tối",
"lightMode": "Chế độ sáng",
"zenMode": "Chế độ zen",
"objectsSnapMode": "",
"exitZenMode": "Thoát chể độ zen",
"cancel": "Hủy",
"clear": "Làm sạch",
"remove": "Xóa",
"embed": "",
"publishLibrary": "Đăng tải",
"submit": "Gửi",
"confirm": "Xác nhận",
"embeddableInteractionButton": ""
"confirm": "Xác nhận"
},
"alerts": {
"clearReset": "Điều này sẽ dọn hết canvas. Bạn có chắc không?",
@@ -203,7 +196,6 @@
"imageInsertError": "Không thể thêm ảnh. Hãy thử lại sau...",
"fileTooBig": "Tệp tin quá lớn. Dung lượng tối đa cho phép là {{maxSize}}.",
"svgImageInsertError": "Không thể thêm ảnh SVG. Mã SVG có vẻ sai.",
"failedToFetchImage": "",
"invalidSVGString": "SVG không hợp lệ.",
"cannotResolveCollabServer": "Không thể kết nối với máy chủ hợp tác. Hãy tải lại trang và thử lại.",
"importLibraryError": "Không thể tải thư viện",
@@ -214,10 +206,6 @@
"line2": "",
"line3": "",
"line4": ""
},
"libraryElementTypeError": {
"embeddable": "",
"image": ""
}
},
"toolBar": {
@@ -236,8 +224,6 @@
"link": "Thêm/ Chỉnh sửa liên kết cho hình được chọn",
"eraser": "Xóa",
"frame": "",
"embeddable": "",
"laser": "",
"hand": "Tay kéo",
"extraTools": ""
},
@@ -251,7 +237,6 @@
"linearElement": "Ấn để bắt đầu nhiểm điểm vẽ, kéo để vẽ một đường thẳng",
"freeDraw": "Ấn bà kéo, thả khi bạn xong",
"text": "Mẹo: bạn có thể thêm văn bản tại bất cứ đâu bằng cách ấn hai lần bằng tool lựa chọn",
"embeddable": "",
"text_selected": "Ấn 2 lần hoặc nhấn ENTER để chỉnh văn bản",
"text_editing": "Nhấn Escape hoặc Ctrl/Cmd+ENTER để hoàn thành chỉnh sửa",
"linearElementMulti": "Nhấn vào điểm cuối hoặc nhấn Escape hoặc Enter để kết thúc",
@@ -267,8 +252,7 @@
"bindTextToElement": "",
"deepBoxSelect": "",
"eraserRevert": "",
"firefox_clipboard_write": "Tính năng này có thể được bật bằng cách đặt cờ \"dom.events.asyncClipboard.clipboardItem\" thành \"true\". Để thay đổi cờ trình duyệt trong Firefox, hãy truy cập trang \"about:config\".",
"disableSnapping": ""
"firefox_clipboard_write": "Tính năng này có thể được bật bằng cách đặt cờ \"dom.events.asyncClipboard.clipboardItem\" thành \"true\". Để thay đổi cờ trình duyệt trong Firefox, hãy truy cập trang \"about:config\"."
},
"canvasError": {
"cannotShowPreview": "Không thể xem trước",
@@ -427,9 +411,7 @@
"fileSavedToFilename": "",
"canvas": "canvas",
"selection": "",
"pasteAsSingleElement": "",
"unableToEmbed": "",
"unrecognizedLinkFormat": ""
"pasteAsSingleElement": ""
},
"colors": {
"transparent": "",
@@ -467,36 +449,5 @@
"shades": "",
"hexCode": "",
"noShades": ""
},
"overwriteConfirm": {
"action": {
"exportToImage": {
"title": "",
"button": "",
"description": ""
},
"saveToDisk": {
"title": "",
"button": "",
"description": ""
},
"excalidrawPlus": {
"title": "",
"button": "",
"description": ""
}
},
"modal": {
"loadFromFile": {
"title": "",
"button": "",
"description": ""
},
"shareableLink": {
"title": "",
"button": "",
"description": ""
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More