Compare commits
65 Commits
aakansha-fix
...
test-csb
| Author | SHA1 | Date | |
|---|---|---|---|
| e894d41a22 | |||
| 14d1d39e8e | |||
| 69336b4832 | |||
| 32b677fb8a | |||
| 570f725516 | |||
| a60860867c | |||
| 7a61196462 | |||
| 9653d676fe | |||
| 0cdd0eebf1 | |||
| ae8b1d8bf7 | |||
| 92ffe8dda6 | |||
| 4d9dbd5a45 | |||
| c66cabaefd | |||
| e073128469 | |||
| 835848d711 | |||
| 2bd1d7ef59 | |||
| 37c8b9c2ff | |||
| cf9f00f55f | |||
| 7ae9043221 | |||
| 7c567408c5 | |||
| 54612621aa | |||
| d27b3bbebe | |||
| e4ffc9812e | |||
| a066317d3c | |||
| 050bc1ce2b | |||
| 5007df6522 | |||
| d450c36581 | |||
| 66c92fc65a | |||
| 5f1cd4591a | |||
| 9be6243873 | |||
| c3f6d6d344 | |||
| 339636caab | |||
| 08115ef311 | |||
| e68abdbab4 | |||
| 8aff076782 | |||
| 96de887cc8 | |||
| 98ea46664c | |||
| 00e30ca0e4 | |||
| de6371aac4 | |||
| f47ddb988f | |||
| 59cbf5fde5 | |||
| 4486fbc2c6 | |||
| edfbac9d7d | |||
| 719ae7b72f | |||
| 631a228ca1 | |||
| 4b5270ab12 | |||
| dcee594b66 | |||
| 79d323fab1 | |||
| e4edda4555 | |||
| ca89d47d4c | |||
| 18c526d877 | |||
| cbc6bd1ad8 | |||
| 83d9282dbf | |||
| abff780983 | |||
| c009e03c8e | |||
| 24bf4cb5fb | |||
| 0850ab0dd0 | |||
| a7473169ba | |||
| f6325b1e5e | |||
| 466220a3a8 | |||
| d9cc7d1033 | |||
| c037e9854c | |||
| 9373961857 | |||
| 1fd2fe56ee | |||
| dba71e358d |
@@ -23,4 +23,5 @@ jobs:
|
|||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
- name: Auto release
|
- name: Auto release
|
||||||
run: |
|
run: |
|
||||||
|
yarn add @actions/core
|
||||||
yarn autorelease
|
yarn autorelease
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
name: Auto release preview @excalidraw/excalidraw-preview
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Auto-release-excalidraw-preview:
|
||||||
|
name: Auto release preview
|
||||||
|
if: github.event.comment.body == '@excalibot release package' && github.event.issue.pull_request
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: React to release comment
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reactions: "+1"
|
||||||
|
- name: Get PR SHA
|
||||||
|
id: sha
|
||||||
|
uses: actions/github-script@v4
|
||||||
|
with:
|
||||||
|
result-encoding: string
|
||||||
|
script: |
|
||||||
|
const { owner, repo, number } = context.issue;
|
||||||
|
const pr = await github.pulls.get({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
pull_number: number,
|
||||||
|
});
|
||||||
|
return pr.data.head.sha
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ steps.sha.outputs.result }}
|
||||||
|
fetch-depth: 2
|
||||||
|
- name: Setup Node.js 14.x
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 14.x
|
||||||
|
- name: Set up publish access
|
||||||
|
run: |
|
||||||
|
npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
- name: Auto release preview
|
||||||
|
id: "autorelease"
|
||||||
|
run: |
|
||||||
|
yarn add @actions/core
|
||||||
|
yarn autorelease preview ${{ github.event.issue.number }}
|
||||||
|
- name: Post comment post release
|
||||||
|
if: always()
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: "@${{ github.event.comment.user.login }} ${{ steps.autorelease.outputs.result }}"
|
||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
- name: Setup Node.js 14.x
|
- name: Setup Node.js 14.x
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 14.x
|
||||||
- name: Install and test
|
- name: Install and test
|
||||||
run: |
|
run: |
|
||||||
yarn --frozen-lockfile
|
yarn --frozen-lockfile
|
||||||
|
|||||||
@@ -23,3 +23,7 @@ static
|
|||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
src/packages/excalidraw/types
|
src/packages/excalidraw/types
|
||||||
|
src/packages/excalidraw/example/public/bundle.js
|
||||||
|
src/packages/excalidraw/example/public/excalidraw-assets-dev
|
||||||
|
src/packages/excalidraw/example/public/excalidraw.development.js
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -21,7 +21,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/browser": "6.2.5",
|
"@sentry/browser": "6.2.5",
|
||||||
"@sentry/integrations": "6.2.5",
|
"@sentry/integrations": "6.2.5",
|
||||||
"@testing-library/jest-dom": "5.16.1",
|
"@testing-library/jest-dom": "5.16.2",
|
||||||
"@testing-library/react": "12.1.2",
|
"@testing-library/react": "12.1.2",
|
||||||
"@tldraw/vec": "1.4.3",
|
"@tldraw/vec": "1.4.3",
|
||||||
"@types/jest": "27.4.0",
|
"@types/jest": "27.4.0",
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
"idb-keyval": "6.0.3",
|
"idb-keyval": "6.0.3",
|
||||||
"image-blob-reduce": "3.0.1",
|
"image-blob-reduce": "3.0.1",
|
||||||
"lodash.throttle": "4.1.1",
|
"lodash.throttle": "4.1.1",
|
||||||
"nanoid": "3.1.30",
|
"nanoid": "3.1.32",
|
||||||
"open-color": "1.9.1",
|
"open-color": "1.9.1",
|
||||||
"pako": "1.0.11",
|
"pako": "1.0.11",
|
||||||
"perfect-freehand": "1.0.16",
|
"perfect-freehand": "1.0.16",
|
||||||
@@ -50,9 +50,9 @@
|
|||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
"react-scripts": "4.0.3",
|
"react-scripts": "4.0.3",
|
||||||
"roughjs": "4.5.2",
|
"roughjs": "4.5.2",
|
||||||
"sass": "1.47.0",
|
"sass": "1.49.7",
|
||||||
"socket.io-client": "2.3.1",
|
"socket.io-client": "2.3.1",
|
||||||
"typescript": "4.5.4"
|
"typescript": "4.5.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@excalidraw/eslint-config": "1.0.0",
|
"@excalidraw/eslint-config": "1.0.0",
|
||||||
@@ -61,20 +61,20 @@
|
|||||||
"@types/lodash.throttle": "4.1.6",
|
"@types/lodash.throttle": "4.1.6",
|
||||||
"@types/pako": "1.0.3",
|
"@types/pako": "1.0.3",
|
||||||
"@types/resize-observer-browser": "0.1.6",
|
"@types/resize-observer-browser": "0.1.6",
|
||||||
"chai": "4.3.4",
|
"chai": "4.3.6",
|
||||||
"dotenv": "10.0.0",
|
"dotenv": "10.0.0",
|
||||||
"eslint-config-prettier": "8.3.0",
|
"eslint-config-prettier": "8.3.0",
|
||||||
"eslint-plugin-prettier": "3.3.1",
|
"eslint-plugin-prettier": "3.3.1",
|
||||||
"firebase-tools": "9.23.0",
|
"firebase-tools": "9.23.0",
|
||||||
"husky": "7.0.4",
|
"husky": "7.0.4",
|
||||||
"jest-canvas-mock": "2.3.1",
|
"jest-canvas-mock": "2.3.1",
|
||||||
"lint-staged": "12.1.7",
|
"lint-staged": "12.3.3",
|
||||||
"pepjs": "0.5.3",
|
"pepjs": "0.5.3",
|
||||||
"prettier": "2.5.1",
|
"prettier": "2.5.1",
|
||||||
"rewire": "5.0.0"
|
"rewire": "5.0.0"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"@typescript-eslint/typescript-estree": "5.3.0"
|
"@typescript-eslint/typescript-estree": "5.10.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.0.0"
|
"node": ">=14.0.0"
|
||||||
|
|||||||
+30
-5
@@ -1,5 +1,6 @@
|
|||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const { exec, execSync } = require("child_process");
|
const { exec, execSync } = require("child_process");
|
||||||
|
const core = require("@actions/core");
|
||||||
|
|
||||||
const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
|
const excalidrawDir = `${__dirname}/../src/packages/excalidraw`;
|
||||||
const excalidrawPackage = `${excalidrawDir}/package.json`;
|
const excalidrawPackage = `${excalidrawDir}/package.json`;
|
||||||
@@ -15,18 +16,25 @@ const publish = () => {
|
|||||||
execSync(`yarn --frozen-lockfile`, { cwd: excalidrawDir });
|
execSync(`yarn --frozen-lockfile`, { cwd: excalidrawDir });
|
||||||
execSync(`yarn run build:umd`, { cwd: excalidrawDir });
|
execSync(`yarn run build:umd`, { cwd: excalidrawDir });
|
||||||
execSync(`yarn --cwd ${excalidrawDir} publish`);
|
execSync(`yarn --cwd ${excalidrawDir} publish`);
|
||||||
|
console.info("Published 🎉");
|
||||||
|
core.setOutput(
|
||||||
|
"result",
|
||||||
|
`**Preview version has been shipped** :rocket:
|
||||||
|
You can use [@excalidraw/excalidraw-preview@${pkg.version}](https://www.npmjs.com/package/@excalidraw/excalidraw-preview/v/${pkg.version}) for testing!`,
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
core.setOutput("result", "package couldn't be published :warning:!");
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// get files changed between prev and head commit
|
// get files changed between prev and head commit
|
||||||
exec(`git diff --name-only HEAD^ HEAD`, async (error, stdout, stderr) => {
|
exec(`git diff --name-only HEAD^ HEAD`, async (error, stdout, stderr) => {
|
||||||
if (error || stderr) {
|
if (error || stderr) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
core.setOutput("result", ":warning: Package couldn't be published!");
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const changedFiles = stdout.trim().split("\n");
|
const changedFiles = stdout.trim().split("\n");
|
||||||
const filesToIgnoreRegex = /src\/excalidraw-app|packages\/utils/;
|
const filesToIgnoreRegex = /src\/excalidraw-app|packages\/utils/;
|
||||||
|
|
||||||
@@ -37,16 +45,33 @@ exec(`git diff --name-only HEAD^ HEAD`, async (error, stdout, stderr) => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
if (!excalidrawPackageFiles.length) {
|
if (!excalidrawPackageFiles.length) {
|
||||||
|
console.info("Skipping release as no valid diff found");
|
||||||
|
core.setOutput("result", "Skipping release as no valid diff found");
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update package.json
|
// update package.json
|
||||||
pkg.version = `${pkg.version}-${getShortCommitHash()}`;
|
|
||||||
pkg.name = "@excalidraw/excalidraw-next";
|
pkg.name = "@excalidraw/excalidraw-next";
|
||||||
fs.writeFileSync(excalidrawPackage, JSON.stringify(pkg, null, 2), "utf8");
|
let version = `${pkg.version}-${getShortCommitHash()}`;
|
||||||
|
|
||||||
// update readme
|
// update readme
|
||||||
const data = fs.readFileSync(`${excalidrawDir}/README_NEXT.md`, "utf8");
|
let data = fs.readFileSync(`${excalidrawDir}/README_NEXT.md`, "utf8");
|
||||||
|
|
||||||
|
const isPreview = process.argv.slice(2)[0] === "preview";
|
||||||
|
if (isPreview) {
|
||||||
|
// use pullNumber-commithash as the version for preview
|
||||||
|
const pullRequestNumber = process.argv.slice(3)[0];
|
||||||
|
version = `${pkg.version}-${pullRequestNumber}-${getShortCommitHash()}`;
|
||||||
|
// replace "excalidraw-next" with "excalidraw-preview"
|
||||||
|
pkg.name = "@excalidraw/excalidraw-preview";
|
||||||
|
data = data.replace(/excalidraw-next/g, "excalidraw-preview");
|
||||||
|
data = data.trim();
|
||||||
|
}
|
||||||
|
pkg.version = version;
|
||||||
|
|
||||||
|
fs.writeFileSync(excalidrawPackage, JSON.stringify(pkg, null, 2), "utf8");
|
||||||
|
|
||||||
fs.writeFileSync(`${excalidrawDir}/README.md`, data, "utf8");
|
fs.writeFileSync(`${excalidrawDir}/README.md`, data, "utf8");
|
||||||
|
console.info("Publish in progress...");
|
||||||
publish();
|
publish();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const crowdinMap = {
|
|||||||
"de-DE": "en-de",
|
"de-DE": "en-de",
|
||||||
"el-GR": "en-el",
|
"el-GR": "en-el",
|
||||||
"es-ES": "en-es",
|
"es-ES": "en-es",
|
||||||
|
"eu-ES": "en-eu",
|
||||||
"fa-IR": "en-fa",
|
"fa-IR": "en-fa",
|
||||||
"fi-FI": "en-fi",
|
"fi-FI": "en-fi",
|
||||||
"fr-FR": "en-fr",
|
"fr-FR": "en-fr",
|
||||||
@@ -42,6 +43,7 @@ const crowdinMap = {
|
|||||||
"zh-CN": "en-zhcn",
|
"zh-CN": "en-zhcn",
|
||||||
"zh-HK": "en-zhhk",
|
"zh-HK": "en-zhhk",
|
||||||
"zh-TW": "en-zhtw",
|
"zh-TW": "en-zhtw",
|
||||||
|
"lt-LT": "en-lt",
|
||||||
"lv-LV": "en-lv",
|
"lv-LV": "en-lv",
|
||||||
"cs-CZ": "en-cs",
|
"cs-CZ": "en-cs",
|
||||||
"kk-KZ": "en-kk",
|
"kk-KZ": "en-kk",
|
||||||
@@ -69,6 +71,7 @@ const flags = {
|
|||||||
"kab-KAB": "🏳",
|
"kab-KAB": "🏳",
|
||||||
"kk-KZ": "🇰🇿",
|
"kk-KZ": "🇰🇿",
|
||||||
"ko-KR": "🇰🇷",
|
"ko-KR": "🇰🇷",
|
||||||
|
"lt-LT": "🇱🇹",
|
||||||
"lv-LV": "🇱🇻",
|
"lv-LV": "🇱🇻",
|
||||||
"my-MM": "🇲🇲",
|
"my-MM": "🇲🇲",
|
||||||
"nb-NO": "🇳🇴",
|
"nb-NO": "🇳🇴",
|
||||||
@@ -102,6 +105,7 @@ const languages = {
|
|||||||
"de-DE": "Deutsch",
|
"de-DE": "Deutsch",
|
||||||
"el-GR": "Ελληνικά",
|
"el-GR": "Ελληνικά",
|
||||||
"es-ES": "Español",
|
"es-ES": "Español",
|
||||||
|
"eu-ES": "Euskara",
|
||||||
"fa-IR": "فارسی",
|
"fa-IR": "فارسی",
|
||||||
"fi-FI": "Suomi",
|
"fi-FI": "Suomi",
|
||||||
"fr-FR": "Français",
|
"fr-FR": "Français",
|
||||||
@@ -114,6 +118,7 @@ const languages = {
|
|||||||
"kab-KAB": "Taqbaylit",
|
"kab-KAB": "Taqbaylit",
|
||||||
"kk-KZ": "Қазақ тілі",
|
"kk-KZ": "Қазақ тілі",
|
||||||
"ko-KR": "한국어",
|
"ko-KR": "한국어",
|
||||||
|
"lt-LT": "Lietuvių",
|
||||||
"lv-LV": "Latviešu",
|
"lv-LV": "Latviešu",
|
||||||
"my-MM": "Burmese",
|
"my-MM": "Burmese",
|
||||||
"nb-NO": "Norsk bokmål",
|
"nb-NO": "Norsk bokmål",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { t } from "../i18n";
|
|||||||
import { CODES, KEYS } from "../keys";
|
import { CODES, KEYS } from "../keys";
|
||||||
import { getNormalizedZoom, getSelectedElements } from "../scene";
|
import { getNormalizedZoom, getSelectedElements } from "../scene";
|
||||||
import { centerScrollOn } from "../scene/scroll";
|
import { centerScrollOn } from "../scene/scroll";
|
||||||
import { getNewZoom } from "../scene/zoom";
|
import { getStateForZoom } from "../scene/zoom";
|
||||||
import { AppState, NormalizedZoomValue } from "../types";
|
import { AppState, NormalizedZoomValue } from "../types";
|
||||||
import { getShortcutKey } from "../utils";
|
import { getShortcutKey } from "../utils";
|
||||||
import { register } from "./register";
|
import { register } from "./register";
|
||||||
@@ -58,11 +58,15 @@ export const actionClearCanvas = register({
|
|||||||
files: {},
|
files: {},
|
||||||
theme: appState.theme,
|
theme: appState.theme,
|
||||||
elementLocked: appState.elementLocked,
|
elementLocked: appState.elementLocked,
|
||||||
|
penMode: appState.penMode,
|
||||||
|
penDetected: appState.penDetected,
|
||||||
exportBackground: appState.exportBackground,
|
exportBackground: appState.exportBackground,
|
||||||
exportEmbedScene: appState.exportEmbedScene,
|
exportEmbedScene: appState.exportEmbedScene,
|
||||||
gridSize: appState.gridSize,
|
gridSize: appState.gridSize,
|
||||||
showStats: appState.showStats,
|
showStats: appState.showStats,
|
||||||
pasteDialog: appState.pasteDialog,
|
pasteDialog: appState.pasteDialog,
|
||||||
|
elementType:
|
||||||
|
appState.elementType === "image" ? "selection" : appState.elementType,
|
||||||
},
|
},
|
||||||
commitToHistory: true,
|
commitToHistory: true,
|
||||||
};
|
};
|
||||||
@@ -73,17 +77,18 @@ export const actionClearCanvas = register({
|
|||||||
|
|
||||||
export const actionZoomIn = register({
|
export const actionZoomIn = register({
|
||||||
name: "zoomIn",
|
name: "zoomIn",
|
||||||
perform: (_elements, appState) => {
|
perform: (_elements, appState, _, app) => {
|
||||||
const zoom = getNewZoom(
|
|
||||||
getNormalizedZoom(appState.zoom.value + ZOOM_STEP),
|
|
||||||
appState.zoom,
|
|
||||||
{ left: appState.offsetLeft, top: appState.offsetTop },
|
|
||||||
{ x: appState.width / 2, y: appState.height / 2 },
|
|
||||||
);
|
|
||||||
return {
|
return {
|
||||||
appState: {
|
appState: {
|
||||||
...appState,
|
...appState,
|
||||||
zoom,
|
...getStateForZoom(
|
||||||
|
{
|
||||||
|
viewportX: appState.width / 2 + appState.offsetLeft,
|
||||||
|
viewportY: appState.height / 2 + appState.offsetTop,
|
||||||
|
nextZoom: getNormalizedZoom(appState.zoom.value + ZOOM_STEP),
|
||||||
|
},
|
||||||
|
appState,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
commitToHistory: false,
|
commitToHistory: false,
|
||||||
};
|
};
|
||||||
@@ -107,18 +112,18 @@ export const actionZoomIn = register({
|
|||||||
|
|
||||||
export const actionZoomOut = register({
|
export const actionZoomOut = register({
|
||||||
name: "zoomOut",
|
name: "zoomOut",
|
||||||
perform: (_elements, appState) => {
|
perform: (_elements, appState, _, app) => {
|
||||||
const zoom = getNewZoom(
|
|
||||||
getNormalizedZoom(appState.zoom.value - ZOOM_STEP),
|
|
||||||
appState.zoom,
|
|
||||||
{ left: appState.offsetLeft, top: appState.offsetTop },
|
|
||||||
{ x: appState.width / 2, y: appState.height / 2 },
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
appState: {
|
appState: {
|
||||||
...appState,
|
...appState,
|
||||||
zoom,
|
...getStateForZoom(
|
||||||
|
{
|
||||||
|
viewportX: appState.width / 2 + appState.offsetLeft,
|
||||||
|
viewportY: appState.height / 2 + appState.offsetTop,
|
||||||
|
nextZoom: getNormalizedZoom(appState.zoom.value - ZOOM_STEP),
|
||||||
|
},
|
||||||
|
appState,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
commitToHistory: false,
|
commitToHistory: false,
|
||||||
};
|
};
|
||||||
@@ -142,18 +147,17 @@ export const actionZoomOut = register({
|
|||||||
|
|
||||||
export const actionResetZoom = register({
|
export const actionResetZoom = register({
|
||||||
name: "resetZoom",
|
name: "resetZoom",
|
||||||
perform: (_elements, appState) => {
|
perform: (_elements, appState, _, app) => {
|
||||||
return {
|
return {
|
||||||
appState: {
|
appState: {
|
||||||
...appState,
|
...appState,
|
||||||
zoom: getNewZoom(
|
...getStateForZoom(
|
||||||
1 as NormalizedZoomValue,
|
|
||||||
appState.zoom,
|
|
||||||
{ left: appState.offsetLeft, top: appState.offsetTop },
|
|
||||||
{
|
{
|
||||||
x: appState.width / 2,
|
viewportX: appState.width / 2 + appState.offsetLeft,
|
||||||
y: appState.height / 2,
|
viewportY: appState.height / 2 + appState.offsetTop,
|
||||||
|
nextZoom: getNormalizedZoom(1),
|
||||||
},
|
},
|
||||||
|
appState,
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
commitToHistory: false,
|
commitToHistory: false,
|
||||||
@@ -212,14 +216,12 @@ const zoomToFitElements = (
|
|||||||
? getCommonBounds(selectedElements)
|
? getCommonBounds(selectedElements)
|
||||||
: getCommonBounds(nonDeletedElements);
|
: getCommonBounds(nonDeletedElements);
|
||||||
|
|
||||||
const zoomValue = zoomValueToFitBoundsOnViewport(commonBounds, {
|
const newZoom = {
|
||||||
width: appState.width,
|
value: zoomValueToFitBoundsOnViewport(commonBounds, {
|
||||||
height: appState.height,
|
width: appState.width,
|
||||||
});
|
height: appState.height,
|
||||||
const newZoom = getNewZoom(zoomValue, appState.zoom, {
|
}),
|
||||||
left: appState.offsetLeft,
|
};
|
||||||
top: appState.offsetTop,
|
|
||||||
});
|
|
||||||
|
|
||||||
const [x1, y1, x2, y2] = commonBounds;
|
const [x1, y1, x2, y2] = commonBounds;
|
||||||
const centerX = (x1 + x2) / 2;
|
const centerX = (x1 + x2) / 2;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export const actionCut = register({
|
|||||||
name: "cut",
|
name: "cut",
|
||||||
perform: (elements, appState, data, app) => {
|
perform: (elements, appState, data, app) => {
|
||||||
actionCopy.perform(elements, appState, data, app);
|
actionCopy.perform(elements, appState, data, app);
|
||||||
return actionDeleteSelected.perform(elements, appState, data, app);
|
return actionDeleteSelected.perform(elements, appState);
|
||||||
},
|
},
|
||||||
contextItemLabel: "labels.cut",
|
contextItemLabel: "labels.cut",
|
||||||
keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.code === CODES.X,
|
keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.code === CODES.X,
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ const changeFontSize = (
|
|||||||
elements: readonly ExcalidrawElement[],
|
elements: readonly ExcalidrawElement[],
|
||||||
appState: AppState,
|
appState: AppState,
|
||||||
getNewFontSize: (element: ExcalidrawTextElement) => number,
|
getNewFontSize: (element: ExcalidrawTextElement) => number,
|
||||||
|
fallbackValue?: ExcalidrawTextElement["fontSize"],
|
||||||
) => {
|
) => {
|
||||||
const newFontSizes = new Set<number>();
|
const newFontSizes = new Set<number>();
|
||||||
|
|
||||||
@@ -182,7 +183,7 @@ const changeFontSize = (
|
|||||||
currentItemFontSize:
|
currentItemFontSize:
|
||||||
newFontSizes.size === 1
|
newFontSizes.size === 1
|
||||||
? [...newFontSizes][0]
|
? [...newFontSizes][0]
|
||||||
: appState.currentItemFontSize,
|
: fallbackValue ?? appState.currentItemFontSize,
|
||||||
},
|
},
|
||||||
commitToHistory: true,
|
commitToHistory: true,
|
||||||
};
|
};
|
||||||
@@ -520,7 +521,7 @@ export const actionChangeOpacity = register({
|
|||||||
export const actionChangeFontSize = register({
|
export const actionChangeFontSize = register({
|
||||||
name: "changeFontSize",
|
name: "changeFontSize",
|
||||||
perform: (elements, appState, value) => {
|
perform: (elements, appState, value) => {
|
||||||
return changeFontSize(elements, appState, () => value);
|
return changeFontSize(elements, appState, () => value, value);
|
||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData }) => (
|
PanelComponent: ({ elements, appState, updateData }) => (
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@@ -532,21 +533,25 @@ export const actionChangeFontSize = register({
|
|||||||
value: 16,
|
value: 16,
|
||||||
text: t("labels.small"),
|
text: t("labels.small"),
|
||||||
icon: <FontSizeSmallIcon theme={appState.theme} />,
|
icon: <FontSizeSmallIcon theme={appState.theme} />,
|
||||||
|
testId: "fontSize-small",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 20,
|
value: 20,
|
||||||
text: t("labels.medium"),
|
text: t("labels.medium"),
|
||||||
icon: <FontSizeMediumIcon theme={appState.theme} />,
|
icon: <FontSizeMediumIcon theme={appState.theme} />,
|
||||||
|
testId: "fontSize-medium",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 28,
|
value: 28,
|
||||||
text: t("labels.large"),
|
text: t("labels.large"),
|
||||||
icon: <FontSizeLargeIcon theme={appState.theme} />,
|
icon: <FontSizeLargeIcon theme={appState.theme} />,
|
||||||
|
testId: "fontSize-large",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 36,
|
value: 36,
|
||||||
text: t("labels.veryLarge"),
|
text: t("labels.veryLarge"),
|
||||||
icon: <FontSizeExtraLargeIcon theme={appState.theme} />,
|
icon: <FontSizeExtraLargeIcon theme={appState.theme} />,
|
||||||
|
testId: "fontSize-veryLarge",
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
value={getFormValue(
|
value={getFormValue(
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import { getNonDeletedElements } from "../element";
|
||||||
|
import { mutateElement } from "../element/mutateElement";
|
||||||
|
import { getBoundTextElement, measureText } from "../element/textElement";
|
||||||
|
import { ExcalidrawTextElement } from "../element/types";
|
||||||
|
import { getSelectedElements } from "../scene";
|
||||||
|
import { getFontString } from "../utils";
|
||||||
|
import { register } from "./register";
|
||||||
|
|
||||||
|
export const actionUnbindText = register({
|
||||||
|
name: "unbindText",
|
||||||
|
contextItemLabel: "labels.unbindText",
|
||||||
|
perform: (elements, appState) => {
|
||||||
|
const selectedElements = getSelectedElements(
|
||||||
|
getNonDeletedElements(elements),
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
selectedElements.forEach((element) => {
|
||||||
|
const boundTextElement = getBoundTextElement(element);
|
||||||
|
if (boundTextElement) {
|
||||||
|
const { width, height, baseline } = measureText(
|
||||||
|
boundTextElement.originalText,
|
||||||
|
getFontString(boundTextElement),
|
||||||
|
);
|
||||||
|
mutateElement(boundTextElement as ExcalidrawTextElement, {
|
||||||
|
containerId: null,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
baseline,
|
||||||
|
text: boundTextElement.originalText,
|
||||||
|
});
|
||||||
|
mutateElement(element, {
|
||||||
|
boundElements: element.boundElements?.filter(
|
||||||
|
(ele) => ele.id !== boundTextElement.id,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
elements,
|
||||||
|
appState,
|
||||||
|
commitToHistory: true,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -80,3 +80,5 @@ export { actionToggleGridMode } from "./actionToggleGridMode";
|
|||||||
export { actionToggleZenMode } from "./actionToggleZenMode";
|
export { actionToggleZenMode } from "./actionToggleZenMode";
|
||||||
|
|
||||||
export { actionToggleStats } from "./actionToggleStats";
|
export { actionToggleStats } from "./actionToggleStats";
|
||||||
|
export { actionUnbindText } from "./actionUnbindText";
|
||||||
|
export { actionLink } from "../element/Hyperlink";
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ import { Action } from "./types";
|
|||||||
|
|
||||||
export let actions: readonly Action[] = [];
|
export let actions: readonly Action[] = [];
|
||||||
|
|
||||||
export const register = (action: Action): Action => {
|
export const register = <T extends Action>(action: T) => {
|
||||||
actions = actions.concat(action);
|
actions = actions.concat(action);
|
||||||
return action;
|
return action as T & {
|
||||||
|
keyTest?: unknown extends T["keyTest"] ? never : T["keyTest"];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ export type ShortcutName =
|
|||||||
| "addToLibrary"
|
| "addToLibrary"
|
||||||
| "viewMode"
|
| "viewMode"
|
||||||
| "flipHorizontal"
|
| "flipHorizontal"
|
||||||
| "flipVertical";
|
| "flipVertical"
|
||||||
|
| "link";
|
||||||
|
|
||||||
const shortcutMap: Record<ShortcutName, string[]> = {
|
const shortcutMap: Record<ShortcutName, string[]> = {
|
||||||
cut: [getShortcutKey("CtrlOrCmd+X")],
|
cut: [getShortcutKey("CtrlOrCmd+X")],
|
||||||
@@ -62,6 +63,7 @@ const shortcutMap: Record<ShortcutName, string[]> = {
|
|||||||
flipHorizontal: [getShortcutKey("Shift+H")],
|
flipHorizontal: [getShortcutKey("Shift+H")],
|
||||||
flipVertical: [getShortcutKey("Shift+V")],
|
flipVertical: [getShortcutKey("Shift+V")],
|
||||||
viewMode: [getShortcutKey("Alt+R")],
|
viewMode: [getShortcutKey("Alt+R")],
|
||||||
|
link: [getShortcutKey("CtrlOrCmd+K")],
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getShortcutFromShortcutName = (name: ShortcutName) => {
|
export const getShortcutFromShortcutName = (name: ShortcutName) => {
|
||||||
|
|||||||
@@ -103,7 +103,9 @@ export type ActionName =
|
|||||||
| "exportWithDarkMode"
|
| "exportWithDarkMode"
|
||||||
| "toggleTheme"
|
| "toggleTheme"
|
||||||
| "increaseFontSize"
|
| "increaseFontSize"
|
||||||
| "decreaseFontSize";
|
| "decreaseFontSize"
|
||||||
|
| "unbindText"
|
||||||
|
| "link";
|
||||||
|
|
||||||
export type PanelComponentProps = {
|
export type PanelComponentProps = {
|
||||||
elements: readonly ExcalidrawElement[];
|
elements: readonly ExcalidrawElement[];
|
||||||
@@ -123,7 +125,12 @@ export interface Action {
|
|||||||
appState: AppState,
|
appState: AppState,
|
||||||
elements: readonly ExcalidrawElement[],
|
elements: readonly ExcalidrawElement[],
|
||||||
) => boolean;
|
) => boolean;
|
||||||
contextItemLabel?: string;
|
contextItemLabel?:
|
||||||
|
| string
|
||||||
|
| ((
|
||||||
|
elements: readonly ExcalidrawElement[],
|
||||||
|
appState: Readonly<AppState>,
|
||||||
|
) => string);
|
||||||
contextItemPredicate?: (
|
contextItemPredicate?: (
|
||||||
elements: readonly ExcalidrawElement[],
|
elements: readonly ExcalidrawElement[],
|
||||||
appState: AppState,
|
appState: AppState,
|
||||||
|
|||||||
+9
-1
@@ -43,6 +43,8 @@ export const getDefaultAppState = (): Omit<
|
|||||||
editingLinearElement: null,
|
editingLinearElement: null,
|
||||||
elementLocked: false,
|
elementLocked: false,
|
||||||
elementType: "selection",
|
elementType: "selection",
|
||||||
|
penMode: false,
|
||||||
|
penDetected: false,
|
||||||
errorMessage: null,
|
errorMessage: null,
|
||||||
exportBackground: true,
|
exportBackground: true,
|
||||||
exportScale: defaultExportScale,
|
exportScale: defaultExportScale,
|
||||||
@@ -77,9 +79,12 @@ export const getDefaultAppState = (): Omit<
|
|||||||
toastMessage: null,
|
toastMessage: null,
|
||||||
viewBackgroundColor: oc.white,
|
viewBackgroundColor: oc.white,
|
||||||
zenModeEnabled: false,
|
zenModeEnabled: false,
|
||||||
zoom: { value: 1 as NormalizedZoomValue, translation: { x: 0, y: 0 } },
|
zoom: {
|
||||||
|
value: 1 as NormalizedZoomValue,
|
||||||
|
},
|
||||||
viewModeEnabled: false,
|
viewModeEnabled: false,
|
||||||
pendingImageElement: null,
|
pendingImageElement: null,
|
||||||
|
showHyperlinkPopup: false,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -127,6 +132,8 @@ const APP_STATE_STORAGE_CONF = (<
|
|||||||
editingLinearElement: { browser: false, export: false, server: false },
|
editingLinearElement: { browser: false, export: false, server: false },
|
||||||
elementLocked: { browser: true, export: false, server: false },
|
elementLocked: { browser: true, export: false, server: false },
|
||||||
elementType: { browser: true, export: false, server: false },
|
elementType: { browser: true, export: false, server: false },
|
||||||
|
penMode: { browser: false, export: false, server: false },
|
||||||
|
penDetected: { browser: false, export: false, server: false },
|
||||||
errorMessage: { browser: false, export: false, server: false },
|
errorMessage: { browser: false, export: false, server: false },
|
||||||
exportBackground: { browser: true, export: false, server: false },
|
exportBackground: { browser: true, export: false, server: false },
|
||||||
exportEmbedScene: { browser: true, export: false, server: false },
|
exportEmbedScene: { browser: true, export: false, server: false },
|
||||||
@@ -168,6 +175,7 @@ const APP_STATE_STORAGE_CONF = (<
|
|||||||
zoom: { browser: true, export: false, server: false },
|
zoom: { browser: true, export: false, server: false },
|
||||||
viewModeEnabled: { browser: false, export: false, server: false },
|
viewModeEnabled: { browser: false, export: false, server: false },
|
||||||
pendingImageElement: { browser: false, export: false, server: false },
|
pendingImageElement: { browser: false, export: false, server: false },
|
||||||
|
showHyperlinkPopup: { browser: false, export: false, server: false },
|
||||||
});
|
});
|
||||||
|
|
||||||
const _clearAppStateForStorage = <
|
const _clearAppStateForStorage = <
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ export const SelectedShapeActions = ({
|
|||||||
{renderAction("deleteSelectedElements")}
|
{renderAction("deleteSelectedElements")}
|
||||||
{renderAction("group")}
|
{renderAction("group")}
|
||||||
{renderAction("ungroup")}
|
{renderAction("ungroup")}
|
||||||
|
{targetElements.length === 1 && renderAction("link")}
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+387
-99
@@ -26,7 +26,9 @@ import {
|
|||||||
actionToggleGridMode,
|
actionToggleGridMode,
|
||||||
actionToggleStats,
|
actionToggleStats,
|
||||||
actionToggleZenMode,
|
actionToggleZenMode,
|
||||||
|
actionUnbindText,
|
||||||
actionUngroup,
|
actionUngroup,
|
||||||
|
actionLink,
|
||||||
} from "../actions";
|
} from "../actions";
|
||||||
import { createRedoAction, createUndoAction } from "../actions/actionHistory";
|
import { createRedoAction, createUndoAction } from "../actions/actionHistory";
|
||||||
import { ActionManager } from "../actions/manager";
|
import { ActionManager } from "../actions/manager";
|
||||||
@@ -140,6 +142,7 @@ import {
|
|||||||
InitializedExcalidrawImageElement,
|
InitializedExcalidrawImageElement,
|
||||||
ExcalidrawImageElement,
|
ExcalidrawImageElement,
|
||||||
FileId,
|
FileId,
|
||||||
|
NonDeletedExcalidrawElement,
|
||||||
} from "../element/types";
|
} from "../element/types";
|
||||||
import { getCenter, getDistance } from "../gesture";
|
import { getCenter, getDistance } from "../gesture";
|
||||||
import {
|
import {
|
||||||
@@ -160,6 +163,7 @@ import {
|
|||||||
shouldRotateWithDiscreteAngle,
|
shouldRotateWithDiscreteAngle,
|
||||||
isArrowKey,
|
isArrowKey,
|
||||||
KEYS,
|
KEYS,
|
||||||
|
isAndroid,
|
||||||
} from "../keys";
|
} from "../keys";
|
||||||
import { distance2d, getGridPoint, isPathALoop } from "../math";
|
import { distance2d, getGridPoint, isPathALoop } from "../math";
|
||||||
import { renderScene } from "../renderer";
|
import { renderScene } from "../renderer";
|
||||||
@@ -177,7 +181,7 @@ import {
|
|||||||
} from "../scene";
|
} from "../scene";
|
||||||
import Scene from "../scene/Scene";
|
import Scene from "../scene/Scene";
|
||||||
import { RenderConfig, ScrollBars } from "../scene/types";
|
import { RenderConfig, ScrollBars } from "../scene/types";
|
||||||
import { getNewZoom } from "../scene/zoom";
|
import { getStateForZoom } from "../scene/zoom";
|
||||||
import { findShapeByKey } from "../shapes";
|
import { findShapeByKey } from "../shapes";
|
||||||
import {
|
import {
|
||||||
AppClassProperties,
|
AppClassProperties,
|
||||||
@@ -209,6 +213,8 @@ import {
|
|||||||
tupleToCoors,
|
tupleToCoors,
|
||||||
viewportCoordsToSceneCoords,
|
viewportCoordsToSceneCoords,
|
||||||
withBatchedUpdates,
|
withBatchedUpdates,
|
||||||
|
wrapEvent,
|
||||||
|
withBatchedUpdatesThrottled,
|
||||||
} from "../utils";
|
} from "../utils";
|
||||||
import ContextMenu, { ContextMenuOption } from "./ContextMenu";
|
import ContextMenu, { ContextMenuOption } from "./ContextMenu";
|
||||||
import LayerUI from "./LayerUI";
|
import LayerUI from "./LayerUI";
|
||||||
@@ -238,6 +244,14 @@ import {
|
|||||||
getBoundTextElementId,
|
getBoundTextElementId,
|
||||||
} from "../element/textElement";
|
} from "../element/textElement";
|
||||||
import { isHittingElementNotConsideringBoundingBox } from "../element/collision";
|
import { isHittingElementNotConsideringBoundingBox } from "../element/collision";
|
||||||
|
import {
|
||||||
|
normalizeLink,
|
||||||
|
showHyperlinkTooltip,
|
||||||
|
hideHyperlinkToolip,
|
||||||
|
Hyperlink,
|
||||||
|
isPointHittingLinkIcon,
|
||||||
|
isLocalLink,
|
||||||
|
} from "../element/Hyperlink";
|
||||||
|
|
||||||
const IsMobileContext = React.createContext(false);
|
const IsMobileContext = React.createContext(false);
|
||||||
export const useIsMobile = () => useContext(IsMobileContext);
|
export const useIsMobile = () => useContext(IsMobileContext);
|
||||||
@@ -297,6 +311,11 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
public files: BinaryFiles = {};
|
public files: BinaryFiles = {};
|
||||||
public imageCache: AppClassProperties["imageCache"] = new Map();
|
public imageCache: AppClassProperties["imageCache"] = new Map();
|
||||||
|
|
||||||
|
hitLinkElement?: NonDeletedExcalidrawElement;
|
||||||
|
lastPointerDown: React.PointerEvent<HTMLCanvasElement> | null = null;
|
||||||
|
lastPointerUp: React.PointerEvent<HTMLElement> | PointerEvent | null = null;
|
||||||
|
contextMenuOpen: boolean = false;
|
||||||
|
|
||||||
constructor(props: AppProps) {
|
constructor(props: AppProps) {
|
||||||
super(props);
|
super(props);
|
||||||
const defaultAppState = getDefaultAppState();
|
const defaultAppState = getDefaultAppState();
|
||||||
@@ -319,6 +338,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
name,
|
name,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
|
showHyperlinkPopup: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.id = nanoid();
|
this.id = nanoid();
|
||||||
@@ -398,7 +418,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
ref={this.handleCanvasRef}
|
ref={this.handleCanvasRef}
|
||||||
onContextMenu={this.handleCanvasContextMenu}
|
onContextMenu={this.handleCanvasContextMenu}
|
||||||
onPointerMove={this.handleCanvasPointerMove}
|
onPointerMove={this.handleCanvasPointerMove}
|
||||||
onPointerUp={this.removePointer}
|
onPointerUp={this.handleCanvasPointerUp}
|
||||||
onPointerCancel={this.removePointer}
|
onPointerCancel={this.removePointer}
|
||||||
onTouchMove={this.handleTouchMove}
|
onTouchMove={this.handleTouchMove}
|
||||||
onPointerDown={this.handleCanvasPointerDown}
|
onPointerDown={this.handleCanvasPointerDown}
|
||||||
@@ -421,7 +441,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
onPointerDown={this.handleCanvasPointerDown}
|
onPointerDown={this.handleCanvasPointerDown}
|
||||||
onDoubleClick={this.handleCanvasDoubleClick}
|
onDoubleClick={this.handleCanvasDoubleClick}
|
||||||
onPointerMove={this.handleCanvasPointerMove}
|
onPointerMove={this.handleCanvasPointerMove}
|
||||||
onPointerUp={this.removePointer}
|
onPointerUp={this.handleCanvasPointerUp}
|
||||||
onPointerCancel={this.removePointer}
|
onPointerCancel={this.removePointer}
|
||||||
onTouchMove={this.handleTouchMove}
|
onTouchMove={this.handleTouchMove}
|
||||||
>
|
>
|
||||||
@@ -432,7 +452,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
const { zenModeEnabled, viewModeEnabled } = this.state;
|
const { zenModeEnabled, viewModeEnabled } = this.state;
|
||||||
|
const selectedElement = getSelectedElements(
|
||||||
|
this.scene.getElements(),
|
||||||
|
this.state,
|
||||||
|
);
|
||||||
const {
|
const {
|
||||||
onCollabButtonClick,
|
onCollabButtonClick,
|
||||||
renderTopRightUI,
|
renderTopRightUI,
|
||||||
@@ -466,6 +489,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
elements={this.scene.getElements()}
|
elements={this.scene.getElements()}
|
||||||
onCollabButtonClick={onCollabButtonClick}
|
onCollabButtonClick={onCollabButtonClick}
|
||||||
onLockToggle={this.toggleLock}
|
onLockToggle={this.toggleLock}
|
||||||
|
onPenModeToggle={this.togglePenMode}
|
||||||
onInsertElements={(elements) =>
|
onInsertElements={(elements) =>
|
||||||
this.addElementsFromPasteOrLibrary({
|
this.addElementsFromPasteOrLibrary({
|
||||||
elements,
|
elements,
|
||||||
@@ -476,7 +500,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
zenModeEnabled={zenModeEnabled}
|
zenModeEnabled={zenModeEnabled}
|
||||||
toggleZenMode={this.toggleZenMode}
|
toggleZenMode={this.toggleZenMode}
|
||||||
langCode={getLanguage().code}
|
langCode={getLanguage().code}
|
||||||
isCollaborating={this.props.isCollaborating || false}
|
isCollaborating={this.props.isCollaborating}
|
||||||
renderTopRightUI={renderTopRightUI}
|
renderTopRightUI={renderTopRightUI}
|
||||||
renderCustomFooter={renderFooter}
|
renderCustomFooter={renderFooter}
|
||||||
viewModeEnabled={viewModeEnabled}
|
viewModeEnabled={viewModeEnabled}
|
||||||
@@ -497,6 +521,15 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
/>
|
/>
|
||||||
<div className="excalidraw-textEditorContainer" />
|
<div className="excalidraw-textEditorContainer" />
|
||||||
<div className="excalidraw-contextMenuContainer" />
|
<div className="excalidraw-contextMenuContainer" />
|
||||||
|
{selectedElement.length === 1 && this.state.showHyperlinkPopup && (
|
||||||
|
<Hyperlink
|
||||||
|
key={selectedElement[0].id}
|
||||||
|
element={selectedElement[0]}
|
||||||
|
appState={this.state}
|
||||||
|
setAppState={this.setAppState}
|
||||||
|
onLinkOpen={this.props.onLinkOpen}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{this.state.showStats && (
|
{this.state.showStats && (
|
||||||
<Stats
|
<Stats
|
||||||
appState={this.state}
|
appState={this.state}
|
||||||
@@ -535,6 +568,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
private syncActionResult = withBatchedUpdates(
|
private syncActionResult = withBatchedUpdates(
|
||||||
(actionResult: ActionResult) => {
|
(actionResult: ActionResult) => {
|
||||||
|
// Since context menu closes when action triggered so setting to false
|
||||||
|
this.contextMenuOpen = false;
|
||||||
if (this.unmounted || actionResult === false) {
|
if (this.unmounted || actionResult === false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -809,6 +844,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public async componentDidMount() {
|
public async componentDidMount() {
|
||||||
|
this.unmounted = false;
|
||||||
this.excalidrawContainerValue.container =
|
this.excalidrawContainerValue.container =
|
||||||
this.excalidrawContainerRef.current;
|
this.excalidrawContainerRef.current;
|
||||||
|
|
||||||
@@ -1009,6 +1045,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps: AppProps, prevState: AppState) {
|
componentDidUpdate(prevProps: AppProps, prevState: AppState) {
|
||||||
|
// Hide hyperlink popup if shown when element type is not selection
|
||||||
|
if (
|
||||||
|
prevState.elementType === "selection" &&
|
||||||
|
this.state.elementType !== "selection" &&
|
||||||
|
this.state.showHyperlinkPopup
|
||||||
|
) {
|
||||||
|
this.setState({ showHyperlinkPopup: false });
|
||||||
|
}
|
||||||
if (prevProps.langCode !== this.props.langCode) {
|
if (prevProps.langCode !== this.props.langCode) {
|
||||||
this.updateLanguage();
|
this.updateLanguage();
|
||||||
}
|
}
|
||||||
@@ -1154,6 +1198,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
renderScrollbars: !this.isMobile,
|
renderScrollbars: !this.isMobile,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
if (scrollBars) {
|
if (scrollBars) {
|
||||||
currentScrollBars = scrollBars;
|
currentScrollBars = scrollBars;
|
||||||
}
|
}
|
||||||
@@ -1231,6 +1276,12 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onTapStart = (event: TouchEvent) => {
|
private onTapStart = (event: TouchEvent) => {
|
||||||
|
// fix for Apple Pencil Scribble
|
||||||
|
// On Android, preventing the event would disable contextMenu on tap-hold
|
||||||
|
if (!isAndroid) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
if (!didTapTwice) {
|
if (!didTapTwice) {
|
||||||
didTapTwice = true;
|
didTapTwice = true;
|
||||||
clearTimeout(tappedTwiceTimer);
|
clearTimeout(tappedTwiceTimer);
|
||||||
@@ -1252,7 +1303,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
didTapTwice = false;
|
didTapTwice = false;
|
||||||
clearTimeout(tappedTwiceTimer);
|
clearTimeout(tappedTwiceTimer);
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
if (isAndroid) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
if (event.touches.length === 2) {
|
if (event.touches.length === 2) {
|
||||||
this.setState({
|
this.setState({
|
||||||
selectedElementIds: {},
|
selectedElementIds: {},
|
||||||
@@ -1261,11 +1315,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private onTapEnd = (event: TouchEvent) => {
|
private onTapEnd = (event: TouchEvent) => {
|
||||||
|
this.resetContextMenuTimer();
|
||||||
if (event.touches.length > 0) {
|
if (event.touches.length > 0) {
|
||||||
this.setState({
|
this.setState({
|
||||||
previousSelectedElementIds: {},
|
previousSelectedElementIds: {},
|
||||||
selectedElementIds: this.state.previousSelectedElementIds,
|
selectedElementIds: this.state.previousSelectedElementIds,
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
gesture.pointers.clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1478,11 +1535,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
removePointer = (event: React.PointerEvent<HTMLElement> | PointerEvent) => {
|
removePointer = (event: React.PointerEvent<HTMLElement> | PointerEvent) => {
|
||||||
// remove touch handler for context menu on touch devices
|
if (touchTimeout) {
|
||||||
if (event.pointerType === "touch" && touchTimeout) {
|
this.resetContextMenuTimer();
|
||||||
clearTimeout(touchTimeout);
|
|
||||||
touchTimeout = 0;
|
|
||||||
invalidateContextMenu = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gesture.pointers.delete(event.pointerId);
|
gesture.pointers.delete(event.pointerId);
|
||||||
@@ -1499,6 +1553,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
togglePenMode = () => {
|
||||||
|
this.setState((prevState) => {
|
||||||
|
return {
|
||||||
|
penMode: !prevState.penMode,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
toggleZenMode = () => {
|
toggleZenMode = () => {
|
||||||
this.actionManager.executeAction(actionToggleZenMode);
|
this.actionManager.executeAction(actionToggleZenMode);
|
||||||
};
|
};
|
||||||
@@ -1649,10 +1711,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(isWritableElement(event.target) &&
|
(isWritableElement(event.target) && event.key !== KEYS.ESCAPE) ||
|
||||||
event.key !== KEYS.ESCAPE &&
|
|
||||||
// handle cmd/ctrl-modifier shortcuts even inside inputs
|
|
||||||
!event[KEYS.CTRL_OR_CMD]) ||
|
|
||||||
// case: using arrows to move between buttons
|
// case: using arrows to move between buttons
|
||||||
(isArrowKey(event.key) && isInputLike(event.target))
|
(isArrowKey(event.key) && isInputLike(event.target))
|
||||||
) {
|
) {
|
||||||
@@ -1877,18 +1936,20 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// zoom in at the right location on the touchMove handler already.
|
// zoom in at the right location on the touchMove handler already.
|
||||||
// On Macbook, we don't have those events so will zoom in at the
|
// On Macbook, we don't have those events so will zoom in at the
|
||||||
// current location instead.
|
// current location instead.
|
||||||
if (gesture.pointers.size === 2) {
|
if (gesture.pointers.size >= 2) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialScale = gesture.initialScale;
|
const initialScale = gesture.initialScale;
|
||||||
if (initialScale) {
|
if (initialScale) {
|
||||||
this.setState(({ zoom, offsetLeft, offsetTop }) => ({
|
this.setState((state) => ({
|
||||||
zoom: getNewZoom(
|
...getStateForZoom(
|
||||||
getNormalizedZoom(initialScale * event.scale),
|
{
|
||||||
zoom,
|
viewportX: cursorX,
|
||||||
{ left: offsetLeft, top: offsetTop },
|
viewportY: cursorY,
|
||||||
{ x: cursorX, y: cursorY },
|
nextZoom: getNormalizedZoom(initialScale * event.scale),
|
||||||
|
},
|
||||||
|
state,
|
||||||
),
|
),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -1915,20 +1976,15 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
text: string,
|
text: string,
|
||||||
originalText: string,
|
originalText: string,
|
||||||
isDeleted: boolean,
|
isDeleted: boolean,
|
||||||
isSubmit: boolean,
|
|
||||||
) => {
|
) => {
|
||||||
this.scene.replaceAllElements([
|
this.scene.replaceAllElements([
|
||||||
...this.scene.getElementsIncludingDeleted().map((_element) => {
|
...this.scene.getElementsIncludingDeleted().map((_element) => {
|
||||||
if (_element.id === element.id && isTextElement(_element)) {
|
if (_element.id === element.id && isTextElement(_element)) {
|
||||||
return updateTextElement(
|
return updateTextElement(_element, {
|
||||||
_element,
|
text,
|
||||||
{
|
isDeleted,
|
||||||
text,
|
originalText,
|
||||||
isDeleted,
|
});
|
||||||
originalText,
|
|
||||||
},
|
|
||||||
isSubmit,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return _element;
|
return _element;
|
||||||
}),
|
}),
|
||||||
@@ -1937,7 +1993,6 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
textWysiwyg({
|
textWysiwyg({
|
||||||
id: element.id,
|
id: element.id,
|
||||||
appState: this.state,
|
|
||||||
canvas: this.canvas,
|
canvas: this.canvas,
|
||||||
getViewportCoords: (x, y) => {
|
getViewportCoords: (x, y) => {
|
||||||
const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(
|
const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(
|
||||||
@@ -1953,14 +2008,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
];
|
];
|
||||||
},
|
},
|
||||||
onChange: withBatchedUpdates((text) => {
|
onChange: withBatchedUpdates((text) => {
|
||||||
updateElement(text, text, false, false);
|
updateElement(text, text, false);
|
||||||
if (isNonDeletedElement(element)) {
|
if (isNonDeletedElement(element)) {
|
||||||
updateBoundElements(element);
|
updateBoundElements(element);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
onSubmit: withBatchedUpdates(({ text, viaKeyboard, originalText }) => {
|
onSubmit: withBatchedUpdates(({ text, viaKeyboard, originalText }) => {
|
||||||
const isDeleted = !text.trim();
|
const isDeleted = !text.trim();
|
||||||
updateElement(text, originalText, isDeleted, true);
|
updateElement(text, originalText, isDeleted);
|
||||||
// select the created text element only if submitting via keyboard
|
// select the created text element only if submitting via keyboard
|
||||||
// (when submitting via click it should act as signal to deselect)
|
// (when submitting via click it should act as signal to deselect)
|
||||||
if (!isDeleted && viaKeyboard) {
|
if (!isDeleted && viaKeyboard) {
|
||||||
@@ -1993,13 +2048,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}),
|
}),
|
||||||
element,
|
element,
|
||||||
excalidrawContainer: this.excalidrawContainerRef.current,
|
excalidrawContainer: this.excalidrawContainerRef.current,
|
||||||
|
app: this,
|
||||||
});
|
});
|
||||||
// deselect all other elements when inserting text
|
// deselect all other elements when inserting text
|
||||||
this.deselectElements();
|
this.deselectElements();
|
||||||
|
|
||||||
// do an initial update to re-initialize element position since we were
|
// do an initial update to re-initialize element position since we were
|
||||||
// modifying element's x/y for sake of editor (case: syncing to remote)
|
// modifying element's x/y for sake of editor (case: syncing to remote)
|
||||||
updateElement(element.text, element.originalText, false, false);
|
updateElement(element.text, element.originalText, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private deselectElements() {
|
private deselectElements() {
|
||||||
@@ -2078,6 +2134,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
.filter(
|
.filter(
|
||||||
(element) => !(isTextElement(element) && element.containerId),
|
(element) => !(isTextElement(element) && element.containerId),
|
||||||
);
|
);
|
||||||
|
|
||||||
return getElementsAtPosition(elements, (element) =>
|
return getElementsAtPosition(elements, (element) =>
|
||||||
hitTest(element, this.state, x, y),
|
hitTest(element, this.state, x, y),
|
||||||
);
|
);
|
||||||
@@ -2303,6 +2360,91 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private getElementLinkAtPosition = (
|
||||||
|
scenePointer: Readonly<{ x: number; y: number }>,
|
||||||
|
hitElement: NonDeletedExcalidrawElement | null,
|
||||||
|
): ExcalidrawElement | undefined => {
|
||||||
|
// Reversing so we traverse the elements in decreasing order
|
||||||
|
// of z-index
|
||||||
|
const elements = this.scene.getElements().slice().reverse();
|
||||||
|
let hitElementIndex = Infinity;
|
||||||
|
|
||||||
|
return elements.find((element, index) => {
|
||||||
|
if (hitElement && element.id === hitElement.id) {
|
||||||
|
hitElementIndex = index;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
element.link &&
|
||||||
|
isPointHittingLinkIcon(
|
||||||
|
element,
|
||||||
|
this.state,
|
||||||
|
[scenePointer.x, scenePointer.y],
|
||||||
|
this.isMobile,
|
||||||
|
) &&
|
||||||
|
index <= hitElementIndex
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
private redirectToLink = (
|
||||||
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
|
isTouchScreen: boolean,
|
||||||
|
) => {
|
||||||
|
const draggedDistance = distance2d(
|
||||||
|
this.lastPointerDown!.clientX,
|
||||||
|
this.lastPointerDown!.clientY,
|
||||||
|
this.lastPointerUp!.clientX,
|
||||||
|
this.lastPointerUp!.clientY,
|
||||||
|
);
|
||||||
|
if (
|
||||||
|
!this.hitLinkElement ||
|
||||||
|
// For touch screen allow dragging threshold else strict check
|
||||||
|
(isTouchScreen && draggedDistance > DRAGGING_THRESHOLD) ||
|
||||||
|
(!isTouchScreen && draggedDistance !== 0)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const lastPointerDownCoords = viewportCoordsToSceneCoords(
|
||||||
|
this.lastPointerDown!,
|
||||||
|
this.state,
|
||||||
|
);
|
||||||
|
const lastPointerDownHittingLinkIcon = isPointHittingLinkIcon(
|
||||||
|
this.hitLinkElement!,
|
||||||
|
this.state,
|
||||||
|
[lastPointerDownCoords.x, lastPointerDownCoords.y],
|
||||||
|
this.isMobile,
|
||||||
|
);
|
||||||
|
const lastPointerUpCoords = viewportCoordsToSceneCoords(
|
||||||
|
this.lastPointerUp!,
|
||||||
|
this.state,
|
||||||
|
);
|
||||||
|
const lastPointerUpHittingLinkIcon = isPointHittingLinkIcon(
|
||||||
|
this.hitLinkElement!,
|
||||||
|
this.state,
|
||||||
|
[lastPointerUpCoords.x, lastPointerUpCoords.y],
|
||||||
|
this.isMobile,
|
||||||
|
);
|
||||||
|
if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {
|
||||||
|
const url = this.hitLinkElement.link;
|
||||||
|
if (url) {
|
||||||
|
let customEvent;
|
||||||
|
if (this.props.onLinkOpen) {
|
||||||
|
customEvent = wrapEvent(EVENT.EXCALIDRAW_LINK, event.nativeEvent);
|
||||||
|
this.props.onLinkOpen(this.hitLinkElement, customEvent);
|
||||||
|
}
|
||||||
|
if (!customEvent?.defaultPrevented) {
|
||||||
|
const target = isLocalLink(url) ? "_self" : "_blank";
|
||||||
|
const newWindow = window.open(undefined, target);
|
||||||
|
// https://mathiasbynens.github.io/rel-noopener/
|
||||||
|
if (newWindow) {
|
||||||
|
newWindow.opener = null;
|
||||||
|
newWindow.location = normalizeLink(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private handleCanvasPointerMove = (
|
private handleCanvasPointerMove = (
|
||||||
event: React.PointerEvent<HTMLCanvasElement>,
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
) => {
|
) => {
|
||||||
@@ -2328,19 +2470,32 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
gesture.lastCenter = center;
|
gesture.lastCenter = center;
|
||||||
|
|
||||||
const distance = getDistance(Array.from(gesture.pointers.values()));
|
const distance = getDistance(Array.from(gesture.pointers.values()));
|
||||||
const scaleFactor = distance / gesture.initialDistance;
|
const scaleFactor =
|
||||||
|
this.state.elementType === "freedraw" && this.state.penMode
|
||||||
|
? 1
|
||||||
|
: distance / gesture.initialDistance;
|
||||||
|
|
||||||
this.setState(({ zoom, scrollX, scrollY, offsetLeft, offsetTop }) => ({
|
const nextZoom = scaleFactor
|
||||||
scrollX: scrollX + deltaX / zoom.value,
|
? getNormalizedZoom(initialScale * scaleFactor)
|
||||||
scrollY: scrollY + deltaY / zoom.value,
|
: this.state.zoom.value;
|
||||||
zoom: getNewZoom(
|
|
||||||
getNormalizedZoom(initialScale * scaleFactor),
|
this.setState((state) => {
|
||||||
zoom,
|
const zoomState = getStateForZoom(
|
||||||
{ left: offsetLeft, top: offsetTop },
|
{
|
||||||
center,
|
viewportX: center.x,
|
||||||
),
|
viewportY: center.y,
|
||||||
shouldCacheIgnoreZoom: true,
|
nextZoom,
|
||||||
}));
|
},
|
||||||
|
state,
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
zoom: zoomState.zoom,
|
||||||
|
scrollX: zoomState.scrollX + deltaX / nextZoom,
|
||||||
|
scrollY: zoomState.scrollY + deltaY / nextZoom,
|
||||||
|
shouldCacheIgnoreZoom: true,
|
||||||
|
};
|
||||||
|
});
|
||||||
this.resetShouldCacheIgnoreZoomDebounced();
|
this.resetShouldCacheIgnoreZoomDebounced();
|
||||||
} else {
|
} else {
|
||||||
gesture.lastCenter =
|
gesture.lastCenter =
|
||||||
@@ -2522,42 +2677,66 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
scenePointer.x,
|
scenePointer.x,
|
||||||
scenePointer.y,
|
scenePointer.y,
|
||||||
);
|
);
|
||||||
if (this.state.elementType === "text") {
|
this.hitLinkElement = this.getElementLinkAtPosition(
|
||||||
setCursor(
|
scenePointer,
|
||||||
this.canvas,
|
hitElement,
|
||||||
isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR,
|
);
|
||||||
);
|
|
||||||
} else if (this.state.viewModeEnabled) {
|
if (
|
||||||
setCursor(this.canvas, CURSOR_TYPE.GRAB);
|
this.hitLinkElement &&
|
||||||
} else if (isOverScrollBar) {
|
!this.state.selectedElementIds[this.hitLinkElement.id]
|
||||||
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
) {
|
||||||
} else if (this.state.editingLinearElement) {
|
setCursor(this.canvas, CURSOR_TYPE.POINTER);
|
||||||
const element = LinearElementEditor.getElement(
|
showHyperlinkTooltip(this.hitLinkElement, this.state);
|
||||||
this.state.editingLinearElement.elementId,
|
} else {
|
||||||
);
|
hideHyperlinkToolip();
|
||||||
if (
|
if (
|
||||||
element &&
|
hitElement &&
|
||||||
isHittingElementNotConsideringBoundingBox(element, this.state, [
|
hitElement.link &&
|
||||||
scenePointer.x,
|
this.state.selectedElementIds[hitElement.id] &&
|
||||||
scenePointer.y,
|
!this.contextMenuOpen &&
|
||||||
])
|
!this.state.showHyperlinkPopup
|
||||||
|
) {
|
||||||
|
this.setState({ showHyperlinkPopup: "info" });
|
||||||
|
}
|
||||||
|
if (this.state.elementType === "text") {
|
||||||
|
setCursor(
|
||||||
|
this.canvas,
|
||||||
|
isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR,
|
||||||
|
);
|
||||||
|
} else if (this.state.viewModeEnabled) {
|
||||||
|
setCursor(this.canvas, CURSOR_TYPE.GRAB);
|
||||||
|
} else if (isOverScrollBar) {
|
||||||
|
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
||||||
|
} else if (this.state.editingLinearElement) {
|
||||||
|
const element = LinearElementEditor.getElement(
|
||||||
|
this.state.editingLinearElement.elementId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (
|
||||||
|
element &&
|
||||||
|
isHittingElementNotConsideringBoundingBox(element, this.state, [
|
||||||
|
scenePointer.x,
|
||||||
|
scenePointer.y,
|
||||||
|
])
|
||||||
|
) {
|
||||||
|
setCursor(this.canvas, CURSOR_TYPE.MOVE);
|
||||||
|
} else {
|
||||||
|
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
// if using cmd/ctrl, we're not dragging
|
||||||
|
!event[KEYS.CTRL_OR_CMD] &&
|
||||||
|
(hitElement ||
|
||||||
|
this.isHittingCommonBoundingBoxOfSelectedElements(
|
||||||
|
scenePointer,
|
||||||
|
selectedElements,
|
||||||
|
))
|
||||||
) {
|
) {
|
||||||
setCursor(this.canvas, CURSOR_TYPE.MOVE);
|
setCursor(this.canvas, CURSOR_TYPE.MOVE);
|
||||||
} else {
|
} else {
|
||||||
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
||||||
}
|
}
|
||||||
} else if (
|
|
||||||
// if using cmd/ctrl, we're not dragging
|
|
||||||
!event[KEYS.CTRL_OR_CMD] &&
|
|
||||||
(hitElement ||
|
|
||||||
this.isHittingCommonBoundingBoxOfSelectedElements(
|
|
||||||
scenePointer,
|
|
||||||
selectedElements,
|
|
||||||
))
|
|
||||||
) {
|
|
||||||
setCursor(this.canvas, CURSOR_TYPE.MOVE);
|
|
||||||
} else {
|
|
||||||
setCursor(this.canvas, CURSOR_TYPE.AUTO);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2576,14 +2755,24 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
if (selection?.anchorNode) {
|
if (selection?.anchorNode) {
|
||||||
selection.removeAllRanges();
|
selection.removeAllRanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);
|
this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);
|
||||||
this.maybeCleanupAfterMissingPointerUp(event);
|
this.maybeCleanupAfterMissingPointerUp(event);
|
||||||
|
|
||||||
|
//fires only once, if pen is detected, penMode is enabled
|
||||||
|
//the user can disable this by toggling the penMode button
|
||||||
|
if (!this.state.penDetected && event.pointerType === "pen") {
|
||||||
|
this.setState((prevState) => {
|
||||||
|
return {
|
||||||
|
penMode: true,
|
||||||
|
penDetected: true,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (isPanning) {
|
if (isPanning) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this.lastPointerDown = event;
|
||||||
this.setState({
|
this.setState({
|
||||||
lastPointerDownWith: event.pointerType,
|
lastPointerDownWith: event.pointerType,
|
||||||
cursorButton: "down",
|
cursorButton: "down",
|
||||||
@@ -2617,6 +2806,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since context menu closes on pointer down so setting to false
|
||||||
|
this.contextMenuOpen = false;
|
||||||
this.clearSelectionIfNotUsingSelection();
|
this.clearSelectionIfNotUsingSelection();
|
||||||
this.updateBindingEnabledOnPointerMove(event);
|
this.updateBindingEnabledOnPointerMove(event);
|
||||||
|
|
||||||
@@ -2624,6 +2815,17 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const allowOnPointerDown =
|
||||||
|
!this.state.penMode ||
|
||||||
|
event.pointerType !== "touch" ||
|
||||||
|
this.state.elementType === "selection" ||
|
||||||
|
this.state.elementType === "text" ||
|
||||||
|
this.state.elementType === "image";
|
||||||
|
|
||||||
|
if (!allowOnPointerDown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.state.elementType === "text") {
|
if (this.state.elementType === "text") {
|
||||||
this.handleTextOnPointerDown(event, pointerDownState);
|
this.handleTextOnPointerDown(event, pointerDownState);
|
||||||
return;
|
return;
|
||||||
@@ -2692,6 +2894,35 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private handleCanvasPointerUp = (
|
||||||
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
|
) => {
|
||||||
|
this.lastPointerUp = event;
|
||||||
|
const isTouchScreen = ["pen", "touch"].includes(event.pointerType);
|
||||||
|
if (isTouchScreen) {
|
||||||
|
const scenePointer = viewportCoordsToSceneCoords(
|
||||||
|
{ clientX: event.clientX, clientY: event.clientY },
|
||||||
|
this.state,
|
||||||
|
);
|
||||||
|
const hitElement = this.getElementAtPosition(
|
||||||
|
scenePointer.x,
|
||||||
|
scenePointer.y,
|
||||||
|
);
|
||||||
|
this.hitLinkElement = this.getElementLinkAtPosition(
|
||||||
|
scenePointer,
|
||||||
|
hitElement,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
this.hitLinkElement &&
|
||||||
|
!this.state.selectedElementIds[this.hitLinkElement.id]
|
||||||
|
) {
|
||||||
|
this.redirectToLink(event, isTouchScreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.removePointer(event);
|
||||||
|
};
|
||||||
|
|
||||||
private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (
|
private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (
|
||||||
event: React.PointerEvent<HTMLCanvasElement>,
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
): void => {
|
): void => {
|
||||||
@@ -2717,6 +2948,12 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private resetContextMenuTimer = () => {
|
||||||
|
clearTimeout(touchTimeout);
|
||||||
|
touchTimeout = 0;
|
||||||
|
invalidateContextMenu = false;
|
||||||
|
};
|
||||||
|
|
||||||
private maybeCleanupAfterMissingPointerUp(
|
private maybeCleanupAfterMissingPointerUp(
|
||||||
event: React.PointerEvent<HTMLCanvasElement>,
|
event: React.PointerEvent<HTMLCanvasElement>,
|
||||||
): void {
|
): void {
|
||||||
@@ -2751,7 +2988,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
setCursor(this.canvas, CURSOR_TYPE.GRABBING);
|
setCursor(this.canvas, CURSOR_TYPE.GRABBING);
|
||||||
let { clientX: lastX, clientY: lastY } = event;
|
let { clientX: lastX, clientY: lastY } = event;
|
||||||
const onPointerMove = withBatchedUpdates((event: PointerEvent) => {
|
const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {
|
||||||
const deltaX = lastX - event.clientX;
|
const deltaX = lastX - event.clientX;
|
||||||
const deltaY = lastY - event.clientY;
|
const deltaY = lastY - event.clientY;
|
||||||
lastX = event.clientX;
|
lastX = event.clientX;
|
||||||
@@ -2814,6 +3051,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
||||||
window.removeEventListener(EVENT.POINTER_UP, teardown);
|
window.removeEventListener(EVENT.POINTER_UP, teardown);
|
||||||
window.removeEventListener(EVENT.BLUR, teardown);
|
window.removeEventListener(EVENT.BLUR, teardown);
|
||||||
|
onPointerMove.flush();
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
window.addEventListener(EVENT.BLUR, teardown);
|
window.addEventListener(EVENT.BLUR, teardown);
|
||||||
@@ -2916,7 +3154,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
isDraggingScrollBar = true;
|
isDraggingScrollBar = true;
|
||||||
pointerDownState.lastCoords.x = event.clientX;
|
pointerDownState.lastCoords.x = event.clientX;
|
||||||
pointerDownState.lastCoords.y = event.clientY;
|
pointerDownState.lastCoords.y = event.clientY;
|
||||||
const onPointerMove = withBatchedUpdates((event: PointerEvent) => {
|
const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {
|
||||||
const target = event.target;
|
const target = event.target;
|
||||||
if (!(target instanceof HTMLElement)) {
|
if (!(target instanceof HTMLElement)) {
|
||||||
return;
|
return;
|
||||||
@@ -2935,6 +3173,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.savePointer(event.clientX, event.clientY, "up");
|
this.savePointer(event.clientX, event.clientY, "up");
|
||||||
window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);
|
||||||
window.removeEventListener(EVENT.POINTER_UP, onPointerUp);
|
window.removeEventListener(EVENT.POINTER_UP, onPointerUp);
|
||||||
|
onPointerMove.flush();
|
||||||
});
|
});
|
||||||
|
|
||||||
lastPointerUp = onPointerUp;
|
lastPointerUp = onPointerUp;
|
||||||
@@ -3032,7 +3271,6 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hitElement may already be set above, so check first
|
// hitElement may already be set above, so check first
|
||||||
pointerDownState.hit.element =
|
pointerDownState.hit.element =
|
||||||
pointerDownState.hit.element ??
|
pointerDownState.hit.element ??
|
||||||
@@ -3042,6 +3280,17 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (pointerDownState.hit.element) {
|
if (pointerDownState.hit.element) {
|
||||||
|
// Early return if pointer is hitting link icon
|
||||||
|
if (
|
||||||
|
isPointHittingLinkIcon(
|
||||||
|
pointerDownState.hit.element,
|
||||||
|
this.state,
|
||||||
|
[pointerDownState.origin.x, pointerDownState.origin.y],
|
||||||
|
this.isMobile,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
pointerDownState.hit.hasHitElementInside =
|
pointerDownState.hit.hasHitElementInside =
|
||||||
isHittingElementNotConsideringBoundingBox(
|
isHittingElementNotConsideringBoundingBox(
|
||||||
pointerDownState.hit.element,
|
pointerDownState.hit.element,
|
||||||
@@ -3123,6 +3372,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
...prevState.selectedElementIds,
|
...prevState.selectedElementIds,
|
||||||
[hitElement.id]: true,
|
[hitElement.id]: true,
|
||||||
},
|
},
|
||||||
|
showHyperlinkPopup: hitElement.link ? "info" : false,
|
||||||
},
|
},
|
||||||
this.scene.getElements(),
|
this.scene.getElements(),
|
||||||
);
|
);
|
||||||
@@ -3461,8 +3711,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
private onPointerMoveFromPointerDownHandler(
|
private onPointerMoveFromPointerDownHandler(
|
||||||
pointerDownState: PointerDownState,
|
pointerDownState: PointerDownState,
|
||||||
): (event: PointerEvent) => void {
|
) {
|
||||||
return withBatchedUpdates((event: PointerEvent) => {
|
return withBatchedUpdatesThrottled((event: PointerEvent) => {
|
||||||
// We need to initialize dragOffsetXY only after we've updated
|
// We need to initialize dragOffsetXY only after we've updated
|
||||||
// `state.selectedElementIds` on pointerDown. Doing it here in pointerMove
|
// `state.selectedElementIds` on pointerDown. Doing it here in pointerMove
|
||||||
// event handler should hopefully ensure we're already working with
|
// event handler should hopefully ensure we're already working with
|
||||||
@@ -3673,14 +3923,20 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
const dx = pointerCoords.x - draggingElement.x;
|
const dx = pointerCoords.x - draggingElement.x;
|
||||||
const dy = pointerCoords.y - draggingElement.y;
|
const dy = pointerCoords.y - draggingElement.y;
|
||||||
|
|
||||||
const pressures = draggingElement.simulatePressure
|
const lastPoint = points.length > 0 && points[points.length - 1];
|
||||||
? draggingElement.pressures
|
const discardPoint =
|
||||||
: [...draggingElement.pressures, event.pressure];
|
lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;
|
||||||
|
|
||||||
mutateElement(draggingElement, {
|
if (!discardPoint) {
|
||||||
points: [...points, [dx, dy]],
|
const pressures = draggingElement.simulatePressure
|
||||||
pressures,
|
? draggingElement.pressures
|
||||||
});
|
: [...draggingElement.pressures, event.pressure];
|
||||||
|
|
||||||
|
mutateElement(draggingElement, {
|
||||||
|
points: [...points, [dx, dy]],
|
||||||
|
pressures,
|
||||||
|
});
|
||||||
|
}
|
||||||
} else if (isLinearElement(draggingElement)) {
|
} else if (isLinearElement(draggingElement)) {
|
||||||
pointerDownState.drag.hasOccurred = true;
|
pointerDownState.drag.hasOccurred = true;
|
||||||
const points = draggingElement.points;
|
const points = draggingElement.points;
|
||||||
@@ -3779,6 +4035,11 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
: null),
|
: null),
|
||||||
},
|
},
|
||||||
|
showHyperlinkPopup:
|
||||||
|
elementsWithinSelection.length === 1 &&
|
||||||
|
elementsWithinSelection[0].link
|
||||||
|
? "info"
|
||||||
|
: false,
|
||||||
},
|
},
|
||||||
this.scene.getElements(),
|
this.scene.getElements(),
|
||||||
),
|
),
|
||||||
@@ -3872,6 +4133,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
lastPointerUp = null;
|
lastPointerUp = null;
|
||||||
|
|
||||||
|
if (pointerDownState.eventListeners.onMove) {
|
||||||
|
pointerDownState.eventListeners.onMove.flush();
|
||||||
|
}
|
||||||
|
|
||||||
window.removeEventListener(
|
window.removeEventListener(
|
||||||
EVENT.POINTER_MOVE,
|
EVENT.POINTER_MOVE,
|
||||||
pointerDownState.eventListeners.onMove!,
|
pointerDownState.eventListeners.onMove!,
|
||||||
@@ -4797,6 +5062,16 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
) => {
|
) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (
|
||||||
|
(event.nativeEvent.pointerType === "touch" ||
|
||||||
|
(event.nativeEvent.pointerType === "pen" &&
|
||||||
|
// always allow if user uses a pen secondary button
|
||||||
|
event.button !== POINTER_BUTTON.SECONDARY)) &&
|
||||||
|
this.state.elementType !== "selection"
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const { x, y } = viewportCoordsToSceneCoords(event, this.state);
|
const { x, y } = viewportCoordsToSceneCoords(event, this.state);
|
||||||
const element = this.getElementAtPosition(x, y, { preferSelected: true });
|
const element = this.getElementAtPosition(x, y, { preferSelected: true });
|
||||||
|
|
||||||
@@ -4930,6 +5205,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
},
|
},
|
||||||
type: "canvas" | "element",
|
type: "canvas" | "element",
|
||||||
) => {
|
) => {
|
||||||
|
if (this.state.showHyperlinkPopup) {
|
||||||
|
this.setState({ showHyperlinkPopup: false });
|
||||||
|
}
|
||||||
|
this.contextMenuOpen = true;
|
||||||
const maybeGroupAction = actionGroup.contextItemPredicate!(
|
const maybeGroupAction = actionGroup.contextItemPredicate!(
|
||||||
this.actionManager.getElementsIncludingDeleted(),
|
this.actionManager.getElementsIncludingDeleted(),
|
||||||
this.actionManager.getAppState(),
|
this.actionManager.getAppState(),
|
||||||
@@ -4981,6 +5260,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
actionManager: this.actionManager,
|
actionManager: this.actionManager,
|
||||||
appState: this.state,
|
appState: this.state,
|
||||||
container: this.excalidrawContainerRef.current!,
|
container: this.excalidrawContainerRef.current!,
|
||||||
|
elements,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ContextMenu.push({
|
ContextMenu.push({
|
||||||
@@ -5021,9 +5301,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
actionManager: this.actionManager,
|
actionManager: this.actionManager,
|
||||||
appState: this.state,
|
appState: this.state,
|
||||||
container: this.excalidrawContainerRef.current!,
|
container: this.excalidrawContainerRef.current!,
|
||||||
|
elements,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (type === "element") {
|
} else if (type === "element") {
|
||||||
|
const elementsWithUnbindedText = getSelectedElements(
|
||||||
|
elements,
|
||||||
|
this.state,
|
||||||
|
).some((element) => !hasBoundTextElement(element));
|
||||||
if (this.state.viewModeEnabled) {
|
if (this.state.viewModeEnabled) {
|
||||||
ContextMenu.push({
|
ContextMenu.push({
|
||||||
options: [navigator.clipboard && actionCopy, ...options],
|
options: [navigator.clipboard && actionCopy, ...options],
|
||||||
@@ -5032,6 +5317,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
actionManager: this.actionManager,
|
actionManager: this.actionManager,
|
||||||
appState: this.state,
|
appState: this.state,
|
||||||
container: this.excalidrawContainerRef.current!,
|
container: this.excalidrawContainerRef.current!,
|
||||||
|
elements,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ContextMenu.push({
|
ContextMenu.push({
|
||||||
@@ -5056,6 +5342,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
actionPasteStyles,
|
actionPasteStyles,
|
||||||
separator,
|
separator,
|
||||||
maybeGroupAction && actionGroup,
|
maybeGroupAction && actionGroup,
|
||||||
|
!elementsWithUnbindedText && actionUnbindText,
|
||||||
maybeUngroupAction && actionUngroup,
|
maybeUngroupAction && actionUngroup,
|
||||||
(maybeGroupAction || maybeUngroupAction) && separator,
|
(maybeGroupAction || maybeUngroupAction) && separator,
|
||||||
actionAddToLibrary,
|
actionAddToLibrary,
|
||||||
@@ -5068,6 +5355,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
maybeFlipHorizontal && actionFlipHorizontal,
|
maybeFlipHorizontal && actionFlipHorizontal,
|
||||||
maybeFlipVertical && actionFlipVertical,
|
maybeFlipVertical && actionFlipVertical,
|
||||||
(maybeFlipHorizontal || maybeFlipVertical) && separator,
|
(maybeFlipHorizontal || maybeFlipVertical) && separator,
|
||||||
|
actionLink.contextItemPredicate(elements, this.state) && actionLink,
|
||||||
actionDuplicateSelection,
|
actionDuplicateSelection,
|
||||||
actionDeleteSelected,
|
actionDeleteSelected,
|
||||||
],
|
],
|
||||||
@@ -5076,6 +5364,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
actionManager: this.actionManager,
|
actionManager: this.actionManager,
|
||||||
appState: this.state,
|
appState: this.state,
|
||||||
container: this.excalidrawContainerRef.current!,
|
container: this.excalidrawContainerRef.current!,
|
||||||
|
elements,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5114,15 +5403,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// round to nearest step
|
// round to nearest step
|
||||||
newZoom = Math.round(newZoom * ZOOM_STEP * 100) / (ZOOM_STEP * 100);
|
newZoom = Math.round(newZoom * ZOOM_STEP * 100) / (ZOOM_STEP * 100);
|
||||||
|
|
||||||
this.setState(({ zoom, offsetLeft, offsetTop }) => ({
|
this.setState((state) => ({
|
||||||
zoom: getNewZoom(
|
...getStateForZoom(
|
||||||
getNormalizedZoom(newZoom),
|
|
||||||
zoom,
|
|
||||||
{ left: offsetLeft, top: offsetTop },
|
|
||||||
{
|
{
|
||||||
x: cursorX,
|
viewportX: cursorX,
|
||||||
y: cursorY,
|
viewportY: cursorY,
|
||||||
|
nextZoom: getNormalizedZoom(newZoom),
|
||||||
},
|
},
|
||||||
|
state,
|
||||||
),
|
),
|
||||||
selectedElementIds: {},
|
selectedElementIds: {},
|
||||||
previousSelectedElementIds:
|
previousSelectedElementIds:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export const ButtonIconSelect = <T extends Object>({
|
|||||||
onChange,
|
onChange,
|
||||||
group,
|
group,
|
||||||
}: {
|
}: {
|
||||||
options: { value: T; text: string; icon: JSX.Element }[];
|
options: { value: T; text: string; icon: JSX.Element; testId?: string }[];
|
||||||
value: T | null;
|
value: T | null;
|
||||||
onChange: (value: T) => void;
|
onChange: (value: T) => void;
|
||||||
group: string;
|
group: string;
|
||||||
@@ -24,6 +24,7 @@ export const ButtonIconSelect = <T extends Object>({
|
|||||||
name={group}
|
name={group}
|
||||||
onChange={() => onChange(option.value)}
|
onChange={() => onChange(option.value)}
|
||||||
checked={value === option.value}
|
checked={value === option.value}
|
||||||
|
data-testid={option.testId}
|
||||||
/>
|
/>
|
||||||
{option.icon}
|
{option.icon}
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
import { Action } from "../actions/types";
|
import { Action } from "../actions/types";
|
||||||
import { ActionManager } from "../actions/manager";
|
import { ActionManager } from "../actions/manager";
|
||||||
import { AppState } from "../types";
|
import { AppState } from "../types";
|
||||||
|
import { NonDeletedExcalidrawElement } from "../element/types";
|
||||||
|
|
||||||
export type ContextMenuOption = "separator" | Action;
|
export type ContextMenuOption = "separator" | Action;
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ type ContextMenuProps = {
|
|||||||
left: number;
|
left: number;
|
||||||
actionManager: ActionManager;
|
actionManager: ActionManager;
|
||||||
appState: Readonly<AppState>;
|
appState: Readonly<AppState>;
|
||||||
|
elements: readonly NonDeletedExcalidrawElement[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const ContextMenu = ({
|
const ContextMenu = ({
|
||||||
@@ -30,6 +32,7 @@ const ContextMenu = ({
|
|||||||
left,
|
left,
|
||||||
actionManager,
|
actionManager,
|
||||||
appState,
|
appState,
|
||||||
|
elements,
|
||||||
}: ContextMenuProps) => {
|
}: ContextMenuProps) => {
|
||||||
return (
|
return (
|
||||||
<Popover
|
<Popover
|
||||||
@@ -37,6 +40,10 @@ const ContextMenu = ({
|
|||||||
top={top}
|
top={top}
|
||||||
left={left}
|
left={left}
|
||||||
fitInViewport={true}
|
fitInViewport={true}
|
||||||
|
offsetLeft={appState.offsetLeft}
|
||||||
|
offsetTop={appState.offsetTop}
|
||||||
|
viewportWidth={appState.width}
|
||||||
|
viewportHeight={appState.height}
|
||||||
>
|
>
|
||||||
<ul
|
<ul
|
||||||
className="context-menu"
|
className="context-menu"
|
||||||
@@ -48,9 +55,14 @@ const ContextMenu = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const actionName = option.name;
|
const actionName = option.name;
|
||||||
const label = option.contextItemLabel
|
let label = "";
|
||||||
? t(option.contextItemLabel)
|
if (option.contextItemLabel) {
|
||||||
: "";
|
if (typeof option.contextItemLabel === "function") {
|
||||||
|
label = t(option.contextItemLabel(elements, appState));
|
||||||
|
} else {
|
||||||
|
label = t(option.contextItemLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<li key={idx} data-testid={actionName} onClick={onCloseRequest}>
|
<li key={idx} data-testid={actionName} onClick={onCloseRequest}>
|
||||||
<button
|
<button
|
||||||
@@ -97,6 +109,7 @@ type ContextMenuParams = {
|
|||||||
actionManager: ContextMenuProps["actionManager"];
|
actionManager: ContextMenuProps["actionManager"];
|
||||||
appState: Readonly<AppState>;
|
appState: Readonly<AppState>;
|
||||||
container: HTMLElement;
|
container: HTMLElement;
|
||||||
|
elements: readonly NonDeletedExcalidrawElement[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleClose = (container: HTMLElement) => {
|
const handleClose = (container: HTMLElement) => {
|
||||||
@@ -125,6 +138,7 @@ export default {
|
|||||||
onCloseRequest={() => handleClose(params.container)}
|
onCloseRequest={() => handleClose(params.container)}
|
||||||
actionManager={params.actionManager}
|
actionManager={params.actionManager}
|
||||||
appState={params.appState}
|
appState={params.appState}
|
||||||
|
elements={params.elements}
|
||||||
/>,
|
/>,
|
||||||
getContextMenuNode(params.container),
|
getContextMenuNode(params.container),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -205,6 +205,10 @@ export const HelpDialog = ({ onClose }: { onClose?: () => void }) => {
|
|||||||
label={t("helpDialog.preventBinding")}
|
label={t("helpDialog.preventBinding")}
|
||||||
shortcuts={[getShortcutKey("CtrlOrCmd")]}
|
shortcuts={[getShortcutKey("CtrlOrCmd")]}
|
||||||
/>
|
/>
|
||||||
|
<Shortcut
|
||||||
|
label={t("toolBar.link")}
|
||||||
|
shortcuts={[getShortcutKey("CtrlOrCmd+K")]}
|
||||||
|
/>
|
||||||
</ShortcutIsland>
|
</ShortcutIsland>
|
||||||
<ShortcutIsland caption={t("helpDialog.view")}>
|
<ShortcutIsland caption={t("helpDialog.view")}>
|
||||||
<Shortcut
|
<Shortcut
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import { LibraryMenu } from "./LibraryMenu";
|
|||||||
|
|
||||||
import "./LayerUI.scss";
|
import "./LayerUI.scss";
|
||||||
import "./Toolbar.scss";
|
import "./Toolbar.scss";
|
||||||
|
import { PenModeButton } from "./PenModeButton";
|
||||||
|
|
||||||
interface LayerUIProps {
|
interface LayerUIProps {
|
||||||
actionManager: ActionManager;
|
actionManager: ActionManager;
|
||||||
@@ -46,6 +47,7 @@ interface LayerUIProps {
|
|||||||
elements: readonly NonDeletedExcalidrawElement[];
|
elements: readonly NonDeletedExcalidrawElement[];
|
||||||
onCollabButtonClick?: () => void;
|
onCollabButtonClick?: () => void;
|
||||||
onLockToggle: () => void;
|
onLockToggle: () => void;
|
||||||
|
onPenModeToggle: () => void;
|
||||||
onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;
|
onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;
|
||||||
zenModeEnabled: boolean;
|
zenModeEnabled: boolean;
|
||||||
showExitZenModeBtn: boolean;
|
showExitZenModeBtn: boolean;
|
||||||
@@ -76,6 +78,7 @@ const LayerUI = ({
|
|||||||
elements,
|
elements,
|
||||||
onCollabButtonClick,
|
onCollabButtonClick,
|
||||||
onLockToggle,
|
onLockToggle,
|
||||||
|
onPenModeToggle,
|
||||||
onInsertElements,
|
onInsertElements,
|
||||||
zenModeEnabled,
|
zenModeEnabled,
|
||||||
showExitZenModeBtn,
|
showExitZenModeBtn,
|
||||||
@@ -313,6 +316,13 @@ const LayerUI = ({
|
|||||||
"zen-mode": zenModeEnabled,
|
"zen-mode": zenModeEnabled,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
|
<PenModeButton
|
||||||
|
zenModeEnabled={zenModeEnabled}
|
||||||
|
checked={appState.penMode}
|
||||||
|
onChange={onPenModeToggle}
|
||||||
|
title={t("toolBar.penMode")}
|
||||||
|
penDetected={appState.penDetected}
|
||||||
|
/>
|
||||||
<LockButton
|
<LockButton
|
||||||
zenModeEnabled={zenModeEnabled}
|
zenModeEnabled={zenModeEnabled}
|
||||||
checked={appState.elementLocked}
|
checked={appState.elementLocked}
|
||||||
@@ -498,6 +508,7 @@ const LayerUI = ({
|
|||||||
setAppState={setAppState}
|
setAppState={setAppState}
|
||||||
onCollabButtonClick={onCollabButtonClick}
|
onCollabButtonClick={onCollabButtonClick}
|
||||||
onLockToggle={onLockToggle}
|
onLockToggle={onLockToggle}
|
||||||
|
onPenModeToggle={onPenModeToggle}
|
||||||
canvas={canvas}
|
canvas={canvas}
|
||||||
isCollaborating={isCollaborating}
|
isCollaborating={isCollaborating}
|
||||||
renderCustomFooter={renderCustomFooter}
|
renderCustomFooter={renderCustomFooter}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import { LockButton } from "./LockButton";
|
|||||||
import { UserList } from "./UserList";
|
import { UserList } from "./UserList";
|
||||||
import { BackgroundPickerAndDarkModeToggle } from "./BackgroundPickerAndDarkModeToggle";
|
import { BackgroundPickerAndDarkModeToggle } from "./BackgroundPickerAndDarkModeToggle";
|
||||||
import { LibraryButton } from "./LibraryButton";
|
import { LibraryButton } from "./LibraryButton";
|
||||||
|
import { PenModeButton } from "./PenModeButton";
|
||||||
|
|
||||||
type MobileMenuProps = {
|
type MobileMenuProps = {
|
||||||
appState: AppState;
|
appState: AppState;
|
||||||
@@ -28,6 +29,7 @@ type MobileMenuProps = {
|
|||||||
libraryMenu: JSX.Element | null;
|
libraryMenu: JSX.Element | null;
|
||||||
onCollabButtonClick?: () => void;
|
onCollabButtonClick?: () => void;
|
||||||
onLockToggle: () => void;
|
onLockToggle: () => void;
|
||||||
|
onPenModeToggle: () => void;
|
||||||
canvas: HTMLCanvasElement | null;
|
canvas: HTMLCanvasElement | null;
|
||||||
isCollaborating: boolean;
|
isCollaborating: boolean;
|
||||||
renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element;
|
renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element;
|
||||||
@@ -50,6 +52,7 @@ export const MobileMenu = ({
|
|||||||
setAppState,
|
setAppState,
|
||||||
onCollabButtonClick,
|
onCollabButtonClick,
|
||||||
onLockToggle,
|
onLockToggle,
|
||||||
|
onPenModeToggle,
|
||||||
canvas,
|
canvas,
|
||||||
isCollaborating,
|
isCollaborating,
|
||||||
renderCustomFooter,
|
renderCustomFooter,
|
||||||
@@ -92,6 +95,13 @@ export const MobileMenu = ({
|
|||||||
setAppState={setAppState}
|
setAppState={setAppState}
|
||||||
isMobile
|
isMobile
|
||||||
/>
|
/>
|
||||||
|
<PenModeButton
|
||||||
|
checked={appState.penMode}
|
||||||
|
onChange={onPenModeToggle}
|
||||||
|
title={t("toolBar.penMode")}
|
||||||
|
isMobile
|
||||||
|
penDetected={appState.penDetected}
|
||||||
|
/>
|
||||||
</Stack.Row>
|
</Stack.Row>
|
||||||
{libraryMenu}
|
{libraryMenu}
|
||||||
</Stack.Col>
|
</Stack.Col>
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
import "./ToolIcon.scss";
|
||||||
|
|
||||||
|
import clsx from "clsx";
|
||||||
|
import { ToolButtonSize } from "./ToolButton";
|
||||||
|
|
||||||
|
type PenModeIconProps = {
|
||||||
|
title?: string;
|
||||||
|
name?: string;
|
||||||
|
checked: boolean;
|
||||||
|
onChange?(): void;
|
||||||
|
zenModeEnabled?: boolean;
|
||||||
|
isMobile?: boolean;
|
||||||
|
penDetected: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
const DEFAULT_SIZE: ToolButtonSize = "medium";
|
||||||
|
|
||||||
|
const ICONS = {
|
||||||
|
CHECKED: (
|
||||||
|
<svg
|
||||||
|
width="205"
|
||||||
|
height="205"
|
||||||
|
viewBox="0 0 205 205"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path d="m35 195-25-29.17V50h50v115l-25 30" />
|
||||||
|
<path d="M10 40V10h50v30H10" />
|
||||||
|
<path d="M125 145h70v50h-70" />
|
||||||
|
<path d="M190 145v-30l-10-20h-40l-10 20v30h15v-30l5-5h20l5 5v30h15" />
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
|
UNCHECKED: (
|
||||||
|
<svg
|
||||||
|
width="205"
|
||||||
|
height="205"
|
||||||
|
viewBox="0 0 205 205"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
className="unlocked-icon rtl-mirror"
|
||||||
|
>
|
||||||
|
<path d="m35 195-25-29.17V50h50v115l-25 30" />
|
||||||
|
<path d="M10 40V10h50v30H10" />
|
||||||
|
<path d="M125 145h70v50h-70" />
|
||||||
|
<path d="M145 145v-30l-10-20H95l-10 20v30h15v-30l5-5h20l5 5v30h15" />
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
export const PenModeButton = (props: PenModeIconProps) => {
|
||||||
|
if (!props.penDetected) {
|
||||||
|
if (props.isMobile) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<label
|
||||||
|
className={clsx(
|
||||||
|
"ToolIcon ToolIcon__penMode ToolIcon_type_floating",
|
||||||
|
`ToolIcon_size_${DEFAULT_SIZE}`,
|
||||||
|
{
|
||||||
|
"is-mobile": props.isMobile,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="ToolIcon__icon ToolIcon__hidden" />
|
||||||
|
</label>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<label
|
||||||
|
className={clsx(
|
||||||
|
"ToolIcon ToolIcon__penMode ToolIcon_type_floating",
|
||||||
|
`ToolIcon_size_${DEFAULT_SIZE}`,
|
||||||
|
{
|
||||||
|
"is-mobile": props.isMobile,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
title={`${props.title}`}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
className="ToolIcon_type_checkbox"
|
||||||
|
type="checkbox"
|
||||||
|
name={props.name}
|
||||||
|
onChange={props.onChange}
|
||||||
|
checked={props.checked}
|
||||||
|
aria-label={props.title}
|
||||||
|
/>
|
||||||
|
<div className="ToolIcon__icon">
|
||||||
|
{props.checked ? ICONS.CHECKED : ICONS.UNCHECKED}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -8,6 +8,10 @@ type Props = {
|
|||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
onCloseRequest?(event: PointerEvent): void;
|
onCloseRequest?(event: PointerEvent): void;
|
||||||
fitInViewport?: boolean;
|
fitInViewport?: boolean;
|
||||||
|
offsetLeft?: number;
|
||||||
|
offsetTop?: number;
|
||||||
|
viewportWidth?: number;
|
||||||
|
viewportHeight?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Popover = ({
|
export const Popover = ({
|
||||||
@@ -16,6 +20,10 @@ export const Popover = ({
|
|||||||
top,
|
top,
|
||||||
onCloseRequest,
|
onCloseRequest,
|
||||||
fitInViewport = false,
|
fitInViewport = false,
|
||||||
|
offsetLeft = 0,
|
||||||
|
offsetTop = 0,
|
||||||
|
viewportWidth = window.innerWidth,
|
||||||
|
viewportHeight = window.innerHeight,
|
||||||
}: Props) => {
|
}: Props) => {
|
||||||
const popoverRef = useRef<HTMLDivElement>(null);
|
const popoverRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
@@ -24,17 +32,14 @@ export const Popover = ({
|
|||||||
if (fitInViewport && popoverRef.current) {
|
if (fitInViewport && popoverRef.current) {
|
||||||
const element = popoverRef.current;
|
const element = popoverRef.current;
|
||||||
const { x, y, width, height } = element.getBoundingClientRect();
|
const { x, y, width, height } = element.getBoundingClientRect();
|
||||||
|
if (x + width - offsetLeft > viewportWidth) {
|
||||||
const viewportWidth = window.innerWidth;
|
|
||||||
if (x + width > viewportWidth) {
|
|
||||||
element.style.left = `${viewportWidth - width}px`;
|
element.style.left = `${viewportWidth - width}px`;
|
||||||
}
|
}
|
||||||
const viewportHeight = window.innerHeight;
|
if (y + height - offsetTop > viewportHeight) {
|
||||||
if (y + height > viewportHeight) {
|
|
||||||
element.style.top = `${viewportHeight - height}px`;
|
element.style.top = `${viewportHeight - height}px`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [fitInViewport]);
|
}, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (onCloseRequest) {
|
if (onCloseRequest) {
|
||||||
|
|||||||
@@ -219,6 +219,10 @@
|
|||||||
margin-inline-end: 0;
|
margin-inline-end: 0;
|
||||||
top: 60px;
|
top: 60px;
|
||||||
}
|
}
|
||||||
|
.ToolIcon.ToolIcon__penMode {
|
||||||
|
margin-inline-end: 0;
|
||||||
|
top: 140px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.unlocked-icon {
|
.unlocked-icon {
|
||||||
|
|||||||
@@ -46,6 +46,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ToolIcon__hidden {
|
||||||
|
box-shadow: none !important;
|
||||||
|
background-color: transparent !important;
|
||||||
|
pointer-events: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
.ToolIcon.ToolIcon__lock {
|
.ToolIcon.ToolIcon__lock {
|
||||||
margin-inline-end: var(--space-factor);
|
margin-inline-end: var(--space-factor);
|
||||||
&.ToolIcon_type_floating {
|
&.ToolIcon_type_floating {
|
||||||
|
|||||||
+47
-31
@@ -2,7 +2,7 @@ import "./Tooltip.scss";
|
|||||||
|
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
|
|
||||||
const getTooltipDiv = () => {
|
export const getTooltipDiv = () => {
|
||||||
const existingDiv = document.querySelector<HTMLDivElement>(
|
const existingDiv = document.querySelector<HTMLDivElement>(
|
||||||
".excalidraw-tooltip",
|
".excalidraw-tooltip",
|
||||||
);
|
);
|
||||||
@@ -15,6 +15,50 @@ const getTooltipDiv = () => {
|
|||||||
return div;
|
return div;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const updateTooltipPosition = (
|
||||||
|
tooltip: HTMLDivElement,
|
||||||
|
item: {
|
||||||
|
left: number;
|
||||||
|
top: number;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
},
|
||||||
|
position: "bottom" | "top" = "bottom",
|
||||||
|
) => {
|
||||||
|
const tooltipRect = tooltip.getBoundingClientRect();
|
||||||
|
|
||||||
|
const viewportWidth = window.innerWidth;
|
||||||
|
const viewportHeight = window.innerHeight;
|
||||||
|
|
||||||
|
const margin = 5;
|
||||||
|
|
||||||
|
let left = item.left + item.width / 2 - tooltipRect.width / 2;
|
||||||
|
if (left < 0) {
|
||||||
|
left = margin;
|
||||||
|
} else if (left + tooltipRect.width >= viewportWidth) {
|
||||||
|
left = viewportWidth - tooltipRect.width - margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
let top: number;
|
||||||
|
|
||||||
|
if (position === "bottom") {
|
||||||
|
top = item.top + item.height + margin;
|
||||||
|
if (top + tooltipRect.height >= viewportHeight) {
|
||||||
|
top = item.top - tooltipRect.height - margin;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
top = item.top - tooltipRect.height - margin;
|
||||||
|
if (top < 0) {
|
||||||
|
top = item.top + item.height + margin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.assign(tooltip.style, {
|
||||||
|
top: `${top}px`,
|
||||||
|
left: `${left}px`,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const updateTooltip = (
|
const updateTooltip = (
|
||||||
item: HTMLDivElement,
|
item: HTMLDivElement,
|
||||||
tooltip: HTMLDivElement,
|
tooltip: HTMLDivElement,
|
||||||
@@ -27,35 +71,8 @@ const updateTooltip = (
|
|||||||
|
|
||||||
tooltip.textContent = label;
|
tooltip.textContent = label;
|
||||||
|
|
||||||
const {
|
const itemRect = item.getBoundingClientRect();
|
||||||
x: itemX,
|
updateTooltipPosition(tooltip, itemRect);
|
||||||
bottom: itemBottom,
|
|
||||||
top: itemTop,
|
|
||||||
width: itemWidth,
|
|
||||||
} = item.getBoundingClientRect();
|
|
||||||
|
|
||||||
const { width: labelWidth, height: labelHeight } =
|
|
||||||
tooltip.getBoundingClientRect();
|
|
||||||
|
|
||||||
const viewportWidth = window.innerWidth;
|
|
||||||
const viewportHeight = window.innerHeight;
|
|
||||||
|
|
||||||
const margin = 5;
|
|
||||||
|
|
||||||
const left = itemX + itemWidth / 2 - labelWidth / 2;
|
|
||||||
const offsetLeft =
|
|
||||||
left + labelWidth >= viewportWidth ? left + labelWidth - viewportWidth : 0;
|
|
||||||
|
|
||||||
const top = itemBottom + margin;
|
|
||||||
const offsetTop =
|
|
||||||
top + labelHeight >= viewportHeight
|
|
||||||
? itemBottom - itemTop + labelHeight + margin * 2
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
Object.assign(tooltip.style, {
|
|
||||||
top: `${top - offsetTop}px`,
|
|
||||||
left: `${left - offsetLeft}px`,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type TooltipProps = {
|
type TooltipProps = {
|
||||||
@@ -75,7 +92,6 @@ export const Tooltip = ({
|
|||||||
return () =>
|
return () =>
|
||||||
getTooltipDiv().classList.remove("excalidraw-tooltip--visible");
|
getTooltipDiv().classList.remove("excalidraw-tooltip--visible");
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="excalidraw-tooltip-wrapper"
|
className="excalidraw-tooltip-wrapper"
|
||||||
|
|||||||
@@ -892,3 +892,11 @@ export const publishIcon = createIcon(
|
|||||||
/>,
|
/>,
|
||||||
{ width: 640, height: 512 },
|
{ width: 640, height: 512 },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const editIcon = createIcon(
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z"
|
||||||
|
></path>,
|
||||||
|
{ width: 640, height: 512 },
|
||||||
|
);
|
||||||
|
|||||||
+4
-1
@@ -24,7 +24,7 @@ export const POINTER_BUTTON = {
|
|||||||
WHEEL: 1,
|
WHEEL: 1,
|
||||||
SECONDARY: 2,
|
SECONDARY: 2,
|
||||||
TOUCH: -1,
|
TOUCH: -1,
|
||||||
};
|
} as const;
|
||||||
|
|
||||||
export enum EVENT {
|
export enum EVENT {
|
||||||
COPY = "copy",
|
COPY = "copy",
|
||||||
@@ -52,6 +52,8 @@ export enum EVENT {
|
|||||||
HASHCHANGE = "hashchange",
|
HASHCHANGE = "hashchange",
|
||||||
VISIBILITY_CHANGE = "visibilitychange",
|
VISIBILITY_CHANGE = "visibilitychange",
|
||||||
SCROLL = "scroll",
|
SCROLL = "scroll",
|
||||||
|
// custom events
|
||||||
|
EXCALIDRAW_LINK = "excalidraw-link",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ENV = {
|
export const ENV = {
|
||||||
@@ -115,6 +117,7 @@ export const TOAST_TIMEOUT = 5000;
|
|||||||
export const VERSION_TIMEOUT = 30000;
|
export const VERSION_TIMEOUT = 30000;
|
||||||
export const SCROLL_TIMEOUT = 100;
|
export const SCROLL_TIMEOUT = 100;
|
||||||
export const ZOOM_STEP = 0.1;
|
export const ZOOM_STEP = 0.1;
|
||||||
|
export const HYPERLINK_TOOLTIP_DELAY = 300;
|
||||||
|
|
||||||
// Report a user inactive after IDLE_THRESHOLD milliseconds
|
// Report a user inactive after IDLE_THRESHOLD milliseconds
|
||||||
export const IDLE_THRESHOLD = 60_000;
|
export const IDLE_THRESHOLD = 60_000;
|
||||||
|
|||||||
+1
-1
@@ -105,6 +105,7 @@ const restoreElementWithProperties = <
|
|||||||
? element.boundElementIds.map((id) => ({ type: "arrow", id }))
|
? element.boundElementIds.map((id) => ({ type: "arrow", id }))
|
||||||
: element.boundElements ?? [],
|
: element.boundElements ?? [],
|
||||||
updated: element.updated ?? getUpdatedTimestamp(),
|
updated: element.updated ?? getUpdatedTimestamp(),
|
||||||
|
link: element.link ?? null,
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -261,7 +262,6 @@ export const restoreAppState = (
|
|||||||
typeof appState.zoom === "number"
|
typeof appState.zoom === "number"
|
||||||
? {
|
? {
|
||||||
value: appState.zoom as NormalizedZoomValue,
|
value: appState.zoom as NormalizedZoomValue,
|
||||||
translation: defaultAppState.zoom.translation,
|
|
||||||
}
|
}
|
||||||
: appState.zoom || defaultAppState.zoom,
|
: appState.zoom || defaultAppState.zoom,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
@import "../css/variables.module";
|
||||||
|
|
||||||
|
.excalidraw-hyperlinkContainer {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
position: absolute;
|
||||||
|
box-shadow: 0px 2px 4px 0 rgb(0 0 0 / 30%);
|
||||||
|
z-index: 100;
|
||||||
|
background: var(--island-bg-color);
|
||||||
|
border-radius: var(--border-radius-md);
|
||||||
|
box-sizing: border-box;
|
||||||
|
// to account for LS due to rendering icons after new link created
|
||||||
|
min-height: 42px;
|
||||||
|
|
||||||
|
&-input,
|
||||||
|
button {
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-input,
|
||||||
|
&-link {
|
||||||
|
height: 24px;
|
||||||
|
padding: 0 8px;
|
||||||
|
line-height: 24px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: var(--ui-font);
|
||||||
|
}
|
||||||
|
|
||||||
|
&-input {
|
||||||
|
width: 18rem;
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
color: var(--text-primary-color);
|
||||||
|
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-link {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
max-width: 15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
color: $oc-blue-6;
|
||||||
|
background-color: transparent !important;
|
||||||
|
font-weight: 500;
|
||||||
|
&.excalidraw-hyperlinkContainer--remove {
|
||||||
|
color: $oc-red-9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--remove .ToolIcon__icon svg {
|
||||||
|
color: $oc-red-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ToolIcon__icon {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__buttons {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,451 @@
|
|||||||
|
import { AppState, ExcalidrawProps, Point } from "../types";
|
||||||
|
import {
|
||||||
|
getShortcutKey,
|
||||||
|
sceneCoordsToViewportCoords,
|
||||||
|
viewportCoordsToSceneCoords,
|
||||||
|
wrapEvent,
|
||||||
|
} from "../utils";
|
||||||
|
import { mutateElement } from "./mutateElement";
|
||||||
|
import { NonDeletedExcalidrawElement } from "./types";
|
||||||
|
|
||||||
|
import { register } from "../actions/register";
|
||||||
|
import { ToolButton } from "../components/ToolButton";
|
||||||
|
import { editIcon, link, trash } from "../components/icons";
|
||||||
|
import { t } from "../i18n";
|
||||||
|
import {
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useLayoutEffect,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from "react";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import { KEYS } from "../keys";
|
||||||
|
import { DEFAULT_LINK_SIZE } from "../renderer/renderElement";
|
||||||
|
import { rotate } from "../math";
|
||||||
|
import { EVENT, HYPERLINK_TOOLTIP_DELAY, MIME_TYPES } from "../constants";
|
||||||
|
import { Bounds } from "./bounds";
|
||||||
|
import { getTooltipDiv, updateTooltipPosition } from "../components/Tooltip";
|
||||||
|
import { getSelectedElements } from "../scene";
|
||||||
|
import { isPointHittingElementBoundingBox } from "./collision";
|
||||||
|
import { getElementAbsoluteCoords } from "./";
|
||||||
|
|
||||||
|
import "./Hyperlink.scss";
|
||||||
|
|
||||||
|
const CONTAINER_WIDTH = 320;
|
||||||
|
const SPACE_BOTTOM = 85;
|
||||||
|
const CONTAINER_PADDING = 5;
|
||||||
|
const CONTAINER_HEIGHT = 42;
|
||||||
|
const AUTO_HIDE_TIMEOUT = 500;
|
||||||
|
|
||||||
|
export const EXTERNAL_LINK_IMG = document.createElement("img");
|
||||||
|
EXTERNAL_LINK_IMG.src = `data:${MIME_TYPES.svg}, ${encodeURIComponent(
|
||||||
|
`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#1971c2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-external-link"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>`,
|
||||||
|
)}`;
|
||||||
|
|
||||||
|
let IS_HYPERLINK_TOOLTIP_VISIBLE = false;
|
||||||
|
|
||||||
|
export const Hyperlink = ({
|
||||||
|
element,
|
||||||
|
appState,
|
||||||
|
setAppState,
|
||||||
|
onLinkOpen,
|
||||||
|
}: {
|
||||||
|
element: NonDeletedExcalidrawElement;
|
||||||
|
appState: AppState;
|
||||||
|
setAppState: React.Component<any, AppState>["setState"];
|
||||||
|
onLinkOpen: ExcalidrawProps["onLinkOpen"];
|
||||||
|
}) => {
|
||||||
|
const linkVal = element.link || "";
|
||||||
|
|
||||||
|
const [inputVal, setInputVal] = useState(linkVal);
|
||||||
|
const inputRef = useRef<HTMLInputElement>(null);
|
||||||
|
const isEditing = appState.showHyperlinkPopup === "editor" || !linkVal;
|
||||||
|
|
||||||
|
const handleSubmit = useCallback(() => {
|
||||||
|
if (!inputRef.current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const link = normalizeLink(inputRef.current.value);
|
||||||
|
|
||||||
|
mutateElement(element, { link });
|
||||||
|
setAppState({ showHyperlinkPopup: "info" });
|
||||||
|
}, [element, setAppState]);
|
||||||
|
|
||||||
|
useLayoutEffect(() => {
|
||||||
|
return () => {
|
||||||
|
handleSubmit();
|
||||||
|
};
|
||||||
|
}, [handleSubmit]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let timeoutId: number | null = null;
|
||||||
|
const handlePointerMove = (event: PointerEvent) => {
|
||||||
|
if (isEditing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (timeoutId) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
}
|
||||||
|
const shouldHide = shouldHideLinkPopup(element, appState, [
|
||||||
|
event.clientX,
|
||||||
|
event.clientY,
|
||||||
|
]) as boolean;
|
||||||
|
if (shouldHide) {
|
||||||
|
timeoutId = window.setTimeout(() => {
|
||||||
|
setAppState({ showHyperlinkPopup: false });
|
||||||
|
}, AUTO_HIDE_TIMEOUT);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener(EVENT.POINTER_MOVE, handlePointerMove, false);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener(EVENT.POINTER_MOVE, handlePointerMove, false);
|
||||||
|
if (timeoutId) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [appState, element, isEditing, setAppState]);
|
||||||
|
|
||||||
|
const handleRemove = useCallback(() => {
|
||||||
|
mutateElement(element, { link: null });
|
||||||
|
if (isEditing) {
|
||||||
|
inputRef.current!.value = "";
|
||||||
|
}
|
||||||
|
setAppState({ showHyperlinkPopup: false });
|
||||||
|
}, [setAppState, element, isEditing]);
|
||||||
|
|
||||||
|
const onEdit = () => {
|
||||||
|
setAppState({ showHyperlinkPopup: "editor" });
|
||||||
|
};
|
||||||
|
const { x, y } = getCoordsForPopover(element, appState);
|
||||||
|
if (
|
||||||
|
appState.draggingElement ||
|
||||||
|
appState.resizingElement ||
|
||||||
|
appState.isRotating
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="excalidraw-hyperlinkContainer"
|
||||||
|
style={{
|
||||||
|
top: `${y}px`,
|
||||||
|
left: `${x}px`,
|
||||||
|
width: CONTAINER_WIDTH,
|
||||||
|
padding: CONTAINER_PADDING,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{isEditing ? (
|
||||||
|
<input
|
||||||
|
className={clsx("excalidraw-hyperlinkContainer-input")}
|
||||||
|
placeholder="Type or paste your link here"
|
||||||
|
ref={inputRef}
|
||||||
|
value={inputVal}
|
||||||
|
onChange={(event) => setInputVal(event.target.value)}
|
||||||
|
autoFocus
|
||||||
|
onKeyDown={(event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
// prevent cmd/ctrl+k shortcut when editing link
|
||||||
|
if (event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
if (event.key === KEYS.ENTER || event.key === KEYS.ESCAPE) {
|
||||||
|
handleSubmit();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<a
|
||||||
|
href={element.link || ""}
|
||||||
|
className={clsx("excalidraw-hyperlinkContainer-link", {
|
||||||
|
"d-none": isEditing,
|
||||||
|
})}
|
||||||
|
target={isLocalLink(element.link) ? "_self" : "_blank"}
|
||||||
|
onClick={(event) => {
|
||||||
|
if (element.link && onLinkOpen) {
|
||||||
|
const customEvent = wrapEvent(
|
||||||
|
EVENT.EXCALIDRAW_LINK,
|
||||||
|
event.nativeEvent,
|
||||||
|
);
|
||||||
|
onLinkOpen(element, customEvent);
|
||||||
|
if (customEvent.defaultPrevented) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
{element.link}
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
<div className="excalidraw-hyperlinkContainer__buttons">
|
||||||
|
{!isEditing && (
|
||||||
|
<ToolButton
|
||||||
|
type="button"
|
||||||
|
title={t("buttons.edit")}
|
||||||
|
aria-label={t("buttons.edit")}
|
||||||
|
label={t("buttons.edit")}
|
||||||
|
onClick={onEdit}
|
||||||
|
className="excalidraw-hyperlinkContainer--edit"
|
||||||
|
icon={editIcon}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{linkVal && (
|
||||||
|
<ToolButton
|
||||||
|
type="button"
|
||||||
|
title={t("buttons.remove")}
|
||||||
|
aria-label={t("buttons.remove")}
|
||||||
|
label={t("buttons.remove")}
|
||||||
|
onClick={handleRemove}
|
||||||
|
className="excalidraw-hyperlinkContainer--remove"
|
||||||
|
icon={trash}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getCoordsForPopover = (
|
||||||
|
element: NonDeletedExcalidrawElement,
|
||||||
|
appState: AppState,
|
||||||
|
) => {
|
||||||
|
const [x1, y1] = getElementAbsoluteCoords(element);
|
||||||
|
const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(
|
||||||
|
{ sceneX: x1 + element.width / 2, sceneY: y1 },
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
const x = viewportX - appState.offsetLeft - CONTAINER_WIDTH / 2;
|
||||||
|
const y = viewportY - appState.offsetTop - SPACE_BOTTOM;
|
||||||
|
return { x, y };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const normalizeLink = (link: string) => {
|
||||||
|
link = link.trim();
|
||||||
|
if (link) {
|
||||||
|
// prefix with protocol if not fully-qualified
|
||||||
|
if (!link.includes("://") && !/^[[\\/]/.test(link)) {
|
||||||
|
link = `https://${link}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return link;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isLocalLink = (link: string | null) => {
|
||||||
|
return !!(link?.includes(location.origin) || link?.startsWith("/"));
|
||||||
|
};
|
||||||
|
|
||||||
|
export const actionLink = register({
|
||||||
|
name: "link",
|
||||||
|
perform: (elements, appState) => {
|
||||||
|
if (appState.showHyperlinkPopup === "editor") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
elements,
|
||||||
|
appState: {
|
||||||
|
...appState,
|
||||||
|
showHyperlinkPopup: "editor",
|
||||||
|
},
|
||||||
|
commitToHistory: true,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K,
|
||||||
|
contextItemLabel: (elements, appState) =>
|
||||||
|
getContextMenuLabel(elements, appState),
|
||||||
|
contextItemPredicate: (elements, appState) => {
|
||||||
|
const selectedElements = getSelectedElements(elements, appState);
|
||||||
|
return selectedElements.length === 1;
|
||||||
|
},
|
||||||
|
PanelComponent: ({ elements, appState, updateData }) => {
|
||||||
|
const selectedElements = getSelectedElements(elements, appState);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ToolButton
|
||||||
|
type="button"
|
||||||
|
icon={link}
|
||||||
|
aria-label={t(getContextMenuLabel(elements, appState))}
|
||||||
|
title={`${t("labels.link.label")} - ${getShortcutKey("CtrlOrCmd+K")}`}
|
||||||
|
onClick={() => updateData(null)}
|
||||||
|
selected={selectedElements.length === 1 && !!selectedElements[0].link}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const getContextMenuLabel = (
|
||||||
|
elements: readonly NonDeletedExcalidrawElement[],
|
||||||
|
appState: AppState,
|
||||||
|
) => {
|
||||||
|
const selectedElements = getSelectedElements(elements, appState);
|
||||||
|
const label = selectedElements[0]!.link
|
||||||
|
? "labels.link.edit"
|
||||||
|
: "labels.link.create";
|
||||||
|
return label;
|
||||||
|
};
|
||||||
|
export const getLinkHandleFromCoords = (
|
||||||
|
[x1, y1, x2, y2]: Bounds,
|
||||||
|
angle: number,
|
||||||
|
appState: AppState,
|
||||||
|
): [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;
|
||||||
|
const linkMarginY = size / appState.zoom.value;
|
||||||
|
const centerX = (x1 + x2) / 2;
|
||||||
|
const centerY = (y1 + y2) / 2;
|
||||||
|
const centeringOffset = (size - 8) / (2 * appState.zoom.value);
|
||||||
|
const dashedLineMargin = 4 / appState.zoom.value;
|
||||||
|
|
||||||
|
// Same as `ne` resize handle
|
||||||
|
const x = x2 + dashedLineMargin - centeringOffset;
|
||||||
|
const y = y1 - dashedLineMargin - linkMarginY + centeringOffset;
|
||||||
|
|
||||||
|
const [rotatedX, rotatedY] = rotate(
|
||||||
|
x + linkWidth / 2,
|
||||||
|
y + linkHeight / 2,
|
||||||
|
centerX,
|
||||||
|
centerY,
|
||||||
|
angle,
|
||||||
|
);
|
||||||
|
return [
|
||||||
|
rotatedX - linkWidth / 2,
|
||||||
|
rotatedY - linkHeight / 2,
|
||||||
|
linkWidth,
|
||||||
|
linkHeight,
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isPointHittingLinkIcon = (
|
||||||
|
element: NonDeletedExcalidrawElement,
|
||||||
|
appState: AppState,
|
||||||
|
[x, y]: Point,
|
||||||
|
isMobile: boolean,
|
||||||
|
) => {
|
||||||
|
const threshold = 4 / appState.zoom.value;
|
||||||
|
if (
|
||||||
|
!isMobile &&
|
||||||
|
appState.viewModeEnabled &&
|
||||||
|
isPointHittingElementBoundingBox(element, [x, y], threshold)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
|
||||||
|
|
||||||
|
const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords(
|
||||||
|
[x1, y1, x2, y2],
|
||||||
|
element.angle,
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
const hitLink =
|
||||||
|
x > linkX - threshold &&
|
||||||
|
x < linkX + threshold + linkWidth &&
|
||||||
|
y > linkY - threshold &&
|
||||||
|
y < linkY + linkHeight + threshold;
|
||||||
|
return hitLink;
|
||||||
|
};
|
||||||
|
|
||||||
|
let HYPERLINK_TOOLTIP_TIMEOUT_ID: number | null = null;
|
||||||
|
export const showHyperlinkTooltip = (
|
||||||
|
element: NonDeletedExcalidrawElement,
|
||||||
|
appState: AppState,
|
||||||
|
) => {
|
||||||
|
if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {
|
||||||
|
clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);
|
||||||
|
}
|
||||||
|
HYPERLINK_TOOLTIP_TIMEOUT_ID = window.setTimeout(
|
||||||
|
() => renderTooltip(element, appState),
|
||||||
|
HYPERLINK_TOOLTIP_DELAY,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderTooltip = (
|
||||||
|
element: NonDeletedExcalidrawElement,
|
||||||
|
appState: AppState,
|
||||||
|
) => {
|
||||||
|
if (!element.link) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const tooltipDiv = getTooltipDiv();
|
||||||
|
|
||||||
|
tooltipDiv.classList.add("excalidraw-tooltip--visible");
|
||||||
|
tooltipDiv.style.maxWidth = "20rem";
|
||||||
|
tooltipDiv.textContent = element.link;
|
||||||
|
|
||||||
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
|
||||||
|
|
||||||
|
const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords(
|
||||||
|
[x1, y1, x2, y2],
|
||||||
|
element.angle,
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
|
||||||
|
const linkViewportCoords = sceneCoordsToViewportCoords(
|
||||||
|
{ sceneX: linkX, sceneY: linkY },
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
|
||||||
|
updateTooltipPosition(
|
||||||
|
tooltipDiv,
|
||||||
|
{
|
||||||
|
left: linkViewportCoords.x,
|
||||||
|
top: linkViewportCoords.y,
|
||||||
|
width: linkWidth,
|
||||||
|
height: linkHeight,
|
||||||
|
},
|
||||||
|
"top",
|
||||||
|
);
|
||||||
|
|
||||||
|
IS_HYPERLINK_TOOLTIP_VISIBLE = true;
|
||||||
|
};
|
||||||
|
export const hideHyperlinkToolip = () => {
|
||||||
|
if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {
|
||||||
|
clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);
|
||||||
|
}
|
||||||
|
if (IS_HYPERLINK_TOOLTIP_VISIBLE) {
|
||||||
|
IS_HYPERLINK_TOOLTIP_VISIBLE = false;
|
||||||
|
getTooltipDiv().classList.remove("excalidraw-tooltip--visible");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const shouldHideLinkPopup = (
|
||||||
|
element: NonDeletedExcalidrawElement,
|
||||||
|
appState: AppState,
|
||||||
|
[clientX, clientY]: Point,
|
||||||
|
): Boolean => {
|
||||||
|
const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(
|
||||||
|
{ clientX, clientY },
|
||||||
|
appState,
|
||||||
|
);
|
||||||
|
|
||||||
|
const threshold = 15 / appState.zoom.value;
|
||||||
|
// hitbox to prevent hiding when hovered in element bounding box
|
||||||
|
if (isPointHittingElementBoundingBox(element, [sceneX, sceneY], threshold)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const [x1, y1, x2] = getElementAbsoluteCoords(element);
|
||||||
|
// hit box to prevent hiding when hovered in the vertical area between element and popover
|
||||||
|
if (
|
||||||
|
sceneX >= x1 &&
|
||||||
|
sceneX <= x2 &&
|
||||||
|
sceneY >= y1 - SPACE_BOTTOM &&
|
||||||
|
sceneY <= y1
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// hit box to prevent hiding when hovered around popover within threshold
|
||||||
|
const { x: popoverX, y: popoverY } = getCoordsForPopover(element, appState);
|
||||||
|
|
||||||
|
if (
|
||||||
|
clientX >= popoverX - threshold &&
|
||||||
|
clientX <= popoverX + CONTAINER_WIDTH + CONTAINER_PADDING * 2 + threshold &&
|
||||||
|
clientY >= popoverY - threshold &&
|
||||||
|
clientY <= popoverY + threshold + CONTAINER_PADDING * 2 + CONTAINER_HEIGHT
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
@@ -185,7 +185,7 @@ const getLinearElementAbsoluteCoords = (
|
|||||||
maxY + element.y,
|
maxY + element.y,
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
const shape = getShapeForElement(element) as Drawable[];
|
const shape = getShapeForElement(element)!;
|
||||||
|
|
||||||
// first element is always the curve
|
// first element is always the curve
|
||||||
const ops = getCurvePathOps(shape[0]);
|
const ops = getCurvePathOps(shape[0]);
|
||||||
@@ -326,7 +326,7 @@ const getLinearElementRotatedBounds = (
|
|||||||
return [minX, minY, maxX, maxY];
|
return [minX, minY, maxX, maxY];
|
||||||
}
|
}
|
||||||
|
|
||||||
const shape = getShapeForElement(element) as Drawable[];
|
const shape = getShapeForElement(element)!;
|
||||||
|
|
||||||
// first element is always the curve
|
// first element is always the curve
|
||||||
const ops = getCurvePathOps(shape[0]);
|
const ops = getCurvePathOps(shape[0]);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import {
|
|||||||
NonDeleted,
|
NonDeleted,
|
||||||
ExcalidrawFreeDrawElement,
|
ExcalidrawFreeDrawElement,
|
||||||
ExcalidrawImageElement,
|
ExcalidrawImageElement,
|
||||||
|
ExcalidrawLinearElement,
|
||||||
} from "./types";
|
} from "./types";
|
||||||
|
|
||||||
import { getElementAbsoluteCoords, getCurvePathOps, Bounds } from "./bounds";
|
import { getElementAbsoluteCoords, getCurvePathOps, Bounds } from "./bounds";
|
||||||
@@ -96,7 +97,6 @@ export const isHittingElementNotConsideringBoundingBox = (
|
|||||||
: isElementDraggableFromInside(element)
|
: isElementDraggableFromInside(element)
|
||||||
? isInsideCheck
|
? isInsideCheck
|
||||||
: isNearCheck;
|
: isNearCheck;
|
||||||
|
|
||||||
return hitTestPointAgainstElement({ element, point, threshold, check });
|
return hitTestPointAgainstElement({ element, point, threshold, check });
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ const isElementSelected = (
|
|||||||
element: NonDeleted<ExcalidrawElement>,
|
element: NonDeleted<ExcalidrawElement>,
|
||||||
) => appState.selectedElementIds[element.id];
|
) => appState.selectedElementIds[element.id];
|
||||||
|
|
||||||
const isPointHittingElementBoundingBox = (
|
export const isPointHittingElementBoundingBox = (
|
||||||
element: NonDeleted<ExcalidrawElement>,
|
element: NonDeleted<ExcalidrawElement>,
|
||||||
[x, y]: Point,
|
[x, y]: Point,
|
||||||
threshold: number,
|
threshold: number,
|
||||||
@@ -362,6 +362,14 @@ const hitTestFreeDrawElement = (
|
|||||||
B = element.points[i + 1];
|
B = element.points[i + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const shape = getShapeForElement(element);
|
||||||
|
|
||||||
|
// for filled freedraw shapes, support
|
||||||
|
// selecting from inside
|
||||||
|
if (shape && shape.sets.length) {
|
||||||
|
return hitTestRoughShape(shape, x, y, threshold);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -384,7 +392,11 @@ const hitTestLinear = (args: HitTestArgs): boolean => {
|
|||||||
}
|
}
|
||||||
const [relX, relY] = GAPoint.toTuple(point);
|
const [relX, relY] = GAPoint.toTuple(point);
|
||||||
|
|
||||||
const shape = getShapeForElement(element) as Drawable[];
|
const shape = getShapeForElement(element as ExcalidrawLinearElement);
|
||||||
|
|
||||||
|
if (!shape) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (args.check === isInsideCheck) {
|
if (args.check === isInsideCheck) {
|
||||||
const hit = shape.some((subshape) =>
|
const hit = shape.some((subshape) =>
|
||||||
@@ -822,7 +834,7 @@ const hitTestCurveInside = (
|
|||||||
sharpness: ExcalidrawElement["strokeSharpness"],
|
sharpness: ExcalidrawElement["strokeSharpness"],
|
||||||
) => {
|
) => {
|
||||||
const ops = getCurvePathOps(drawable);
|
const ops = getCurvePathOps(drawable);
|
||||||
const points: Point[] = [];
|
const points: Mutable<Point>[] = [];
|
||||||
let odd = false; // select one line out of double lines
|
let odd = false; // select one line out of double lines
|
||||||
for (const operation of ops) {
|
for (const operation of ops) {
|
||||||
if (operation.op === "move") {
|
if (operation.op === "move") {
|
||||||
@@ -836,13 +848,17 @@ const hitTestCurveInside = (
|
|||||||
points.push([operation.data[2], operation.data[3]]);
|
points.push([operation.data[2], operation.data[3]]);
|
||||||
points.push([operation.data[4], operation.data[5]]);
|
points.push([operation.data[4], operation.data[5]]);
|
||||||
}
|
}
|
||||||
|
} else if (operation.op === "lineTo") {
|
||||||
|
if (odd) {
|
||||||
|
points.push([operation.data[0], operation.data[1]]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (points.length >= 4) {
|
if (points.length >= 4) {
|
||||||
if (sharpness === "sharp") {
|
if (sharpness === "sharp") {
|
||||||
return isPointInPolygon(points, x, y);
|
return isPointInPolygon(points, x, y);
|
||||||
}
|
}
|
||||||
const polygonPoints = pointsOnBezierCurves(points as any, 10, 5);
|
const polygonPoints = pointsOnBezierCurves(points, 10, 5);
|
||||||
return isPointInPolygon(polygonPoints, x, y);
|
return isPointInPolygon(polygonPoints, x, y);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -897,9 +913,10 @@ const hitTestRoughShape = (
|
|||||||
// position of the previous operation
|
// position of the previous operation
|
||||||
return retVal;
|
return retVal;
|
||||||
} else if (op === "lineTo") {
|
} else if (op === "lineTo") {
|
||||||
// TODO: Implement this
|
return hitTestCurveInside(drawable, x, y, "sharp");
|
||||||
} else if (op === "qcurveTo") {
|
} else if (op === "qcurveTo") {
|
||||||
// TODO: Implement this
|
// TODO: Implement this
|
||||||
|
console.warn("qcurveTo is not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
+14
-11
@@ -21,7 +21,7 @@ import { AppState } from "../types";
|
|||||||
import { getElementAbsoluteCoords } from ".";
|
import { getElementAbsoluteCoords } from ".";
|
||||||
import { adjustXYWithRotation } from "../math";
|
import { adjustXYWithRotation } from "../math";
|
||||||
import { getResizedElementAbsoluteCoords } from "./bounds";
|
import { getResizedElementAbsoluteCoords } from "./bounds";
|
||||||
import { getContainerElement, measureText } from "./textElement";
|
import { getContainerElement, measureText, wrapText } from "./textElement";
|
||||||
import { isBoundToContainer } from "./typeChecks";
|
import { isBoundToContainer } from "./typeChecks";
|
||||||
import { BOUND_TEXT_PADDING } from "../constants";
|
import { BOUND_TEXT_PADDING } from "../constants";
|
||||||
|
|
||||||
@@ -35,6 +35,7 @@ type ElementConstructorOpts = MarkOptional<
|
|||||||
| "seed"
|
| "seed"
|
||||||
| "version"
|
| "version"
|
||||||
| "versionNonce"
|
| "versionNonce"
|
||||||
|
| "link"
|
||||||
>;
|
>;
|
||||||
|
|
||||||
const _newElementBase = <T extends ExcalidrawElement>(
|
const _newElementBase = <T extends ExcalidrawElement>(
|
||||||
@@ -55,6 +56,7 @@ const _newElementBase = <T extends ExcalidrawElement>(
|
|||||||
groupIds = [],
|
groupIds = [],
|
||||||
strokeSharpness,
|
strokeSharpness,
|
||||||
boundElements = null,
|
boundElements = null,
|
||||||
|
link = null,
|
||||||
...rest
|
...rest
|
||||||
}: ElementConstructorOpts & Omit<Partial<ExcalidrawGenericElement>, "type">,
|
}: ElementConstructorOpts & Omit<Partial<ExcalidrawGenericElement>, "type">,
|
||||||
) => {
|
) => {
|
||||||
@@ -81,6 +83,7 @@ const _newElementBase = <T extends ExcalidrawElement>(
|
|||||||
isDeleted: false as false,
|
isDeleted: false as false,
|
||||||
boundElements,
|
boundElements,
|
||||||
updated: getUpdatedTimestamp(),
|
updated: getUpdatedTimestamp(),
|
||||||
|
link,
|
||||||
};
|
};
|
||||||
return element;
|
return element;
|
||||||
};
|
};
|
||||||
@@ -247,17 +250,17 @@ export const updateTextElement = (
|
|||||||
text,
|
text,
|
||||||
isDeleted,
|
isDeleted,
|
||||||
originalText,
|
originalText,
|
||||||
}: { text: string; isDeleted?: boolean; originalText: string },
|
}: {
|
||||||
|
text: string;
|
||||||
isSubmit: boolean,
|
isDeleted?: boolean;
|
||||||
|
originalText: string;
|
||||||
|
},
|
||||||
): ExcalidrawTextElement => {
|
): ExcalidrawTextElement => {
|
||||||
const boundToContainer = isBoundToContainer(element);
|
const container = getContainerElement(element);
|
||||||
|
if (container) {
|
||||||
// Don't update dimensions and text value for bounded text unless submitted
|
text = wrapText(text, getFontString(element), container.width);
|
||||||
const dimensions =
|
}
|
||||||
boundToContainer && !isSubmit
|
const dimensions = getAdjustedDimensions(element, text);
|
||||||
? undefined
|
|
||||||
: getAdjustedDimensions(element, text);
|
|
||||||
return newElementWith(element, {
|
return newElementWith(element, {
|
||||||
text,
|
text,
|
||||||
originalText,
|
originalText,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import { Point, PointerDownState } from "../types";
|
|||||||
import Scene from "../scene/Scene";
|
import Scene from "../scene/Scene";
|
||||||
import {
|
import {
|
||||||
getApproxMinLineWidth,
|
getApproxMinLineWidth,
|
||||||
|
getBoundTextElement,
|
||||||
getBoundTextElementId,
|
getBoundTextElementId,
|
||||||
handleBindTextResize,
|
handleBindTextResize,
|
||||||
measureText,
|
measureText,
|
||||||
@@ -588,15 +589,12 @@ export const resizeSingleElement = (
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
let minWidth = 0;
|
let minWidth = 0;
|
||||||
if (boundTextElementId) {
|
const boundTextElement = getBoundTextElement(element);
|
||||||
const boundTextElement = Scene.getScene(element)!.getElement(
|
if (boundTextElement) {
|
||||||
boundTextElementId,
|
|
||||||
) as ExcalidrawTextElement;
|
|
||||||
minWidth = getApproxMinLineWidth(getFontString(boundTextElement));
|
minWidth = getApproxMinLineWidth(getFontString(boundTextElement));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
resizedElement.width > minWidth &&
|
resizedElement.width >= minWidth &&
|
||||||
resizedElement.height !== 0 &&
|
resizedElement.height !== 0 &&
|
||||||
Number.isFinite(resizedElement.x) &&
|
Number.isFinite(resizedElement.x) &&
|
||||||
Number.isFinite(resizedElement.y)
|
Number.isFinite(resizedElement.y)
|
||||||
|
|||||||
@@ -175,7 +175,6 @@ export const measureText = (
|
|||||||
container.style.whiteSpace = "pre";
|
container.style.whiteSpace = "pre";
|
||||||
container.style.font = font;
|
container.style.font = font;
|
||||||
container.style.minHeight = "1em";
|
container.style.minHeight = "1em";
|
||||||
|
|
||||||
if (maxWidth) {
|
if (maxWidth) {
|
||||||
const lineHeight = getApproxLineHeight(font);
|
const lineHeight = getApproxLineHeight(font);
|
||||||
container.style.width = `${String(maxWidth)}px`;
|
container.style.width = `${String(maxWidth)}px`;
|
||||||
@@ -205,8 +204,14 @@ export const measureText = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
const DUMMY_TEXT = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toLocaleUpperCase();
|
const DUMMY_TEXT = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toLocaleUpperCase();
|
||||||
|
const cacheApproxLineHeight: { [key: FontString]: number } = {};
|
||||||
|
|
||||||
export const getApproxLineHeight = (font: FontString) => {
|
export const getApproxLineHeight = (font: FontString) => {
|
||||||
return measureText(DUMMY_TEXT, font, null).height;
|
if (cacheApproxLineHeight[font]) {
|
||||||
|
return cacheApproxLineHeight[font];
|
||||||
|
}
|
||||||
|
cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;
|
||||||
|
return cacheApproxLineHeight[font];
|
||||||
};
|
};
|
||||||
|
|
||||||
let canvas: HTMLCanvasElement | undefined;
|
let canvas: HTMLCanvasElement | undefined;
|
||||||
@@ -362,10 +367,14 @@ export const charWidth = (() => {
|
|||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
export const getApproxMinLineWidth = (font: FontString) => {
|
export const getApproxMinLineWidth = (font: FontString) => {
|
||||||
return (
|
const minCharWidth = getMinCharWidth(font);
|
||||||
measureText(DUMMY_TEXT.split("").join("\n"), font).width +
|
if (minCharWidth === 0) {
|
||||||
BOUND_TEXT_PADDING * 2
|
return (
|
||||||
);
|
measureText(DUMMY_TEXT.split("").join("\n"), font).width +
|
||||||
|
BOUND_TEXT_PADDING * 2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return minCharWidth + BOUND_TEXT_PADDING * 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getApproxMinLineHeight = (font: FontString) => {
|
export const getApproxMinLineHeight = (font: FontString) => {
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
import ExcalidrawApp from "../excalidraw-app";
|
import ExcalidrawApp from "../excalidraw-app";
|
||||||
import { render, screen } from "../tests/test-utils";
|
import { GlobalTestState, render, screen } from "../tests/test-utils";
|
||||||
import { Keyboard, Pointer, UI } from "../tests/helpers/ui";
|
import { Keyboard, Pointer, UI } from "../tests/helpers/ui";
|
||||||
import { KEYS } from "../keys";
|
import { CODES, KEYS } from "../keys";
|
||||||
import { fireEvent } from "../tests/test-utils";
|
import { fireEvent } from "../tests/test-utils";
|
||||||
|
import { queryByText } from "@testing-library/react";
|
||||||
|
|
||||||
import { BOUND_TEXT_PADDING, FONT_FAMILY } from "../constants";
|
import { BOUND_TEXT_PADDING, FONT_FAMILY } from "../constants";
|
||||||
import { ExcalidrawTextElementWithContainer } from "./types";
|
import {
|
||||||
|
ExcalidrawTextElement,
|
||||||
|
ExcalidrawTextElementWithContainer,
|
||||||
|
} from "./types";
|
||||||
import * as textElementUtils from "./textElement";
|
import * as textElementUtils from "./textElement";
|
||||||
// Unmount ReactDOM from root
|
// Unmount ReactDOM from root
|
||||||
ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
|
ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
|
||||||
@@ -15,13 +20,16 @@ const mouse = new Pointer("mouse");
|
|||||||
|
|
||||||
describe("textWysiwyg", () => {
|
describe("textWysiwyg", () => {
|
||||||
describe("Test unbounded text", () => {
|
describe("Test unbounded text", () => {
|
||||||
|
const { h } = window;
|
||||||
|
|
||||||
let textarea: HTMLTextAreaElement;
|
let textarea: HTMLTextAreaElement;
|
||||||
|
let textElement: ExcalidrawTextElement;
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await render(<ExcalidrawApp />);
|
await render(<ExcalidrawApp />);
|
||||||
|
|
||||||
const element = UI.createElement("text");
|
textElement = UI.createElement("text");
|
||||||
|
|
||||||
mouse.clickOn(element);
|
mouse.clickOn(textElement);
|
||||||
textarea = document.querySelector(
|
textarea = document.querySelector(
|
||||||
".excalidraw-textEditorContainer > textarea",
|
".excalidraw-textEditorContainer > textarea",
|
||||||
)!;
|
)!;
|
||||||
@@ -171,16 +179,65 @@ describe("textWysiwyg", () => {
|
|||||||
|
|
||||||
expect(textarea.value).toEqual(`Line#1\nLine#2`);
|
expect(textarea.value).toEqual(`Line#1\nLine#2`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should resize text via shortcuts while in wysiwyg", () => {
|
||||||
|
textarea.value = "abc def";
|
||||||
|
const origFontSize = textElement.fontSize;
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
key: KEYS.CHEVRON_RIGHT,
|
||||||
|
ctrlKey: true,
|
||||||
|
shiftKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(textElement.fontSize).toBe(origFontSize * 1.1);
|
||||||
|
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
key: KEYS.CHEVRON_LEFT,
|
||||||
|
ctrlKey: true,
|
||||||
|
shiftKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(textElement.fontSize).toBe(origFontSize);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("zooming via keyboard should zoom canvas", () => {
|
||||||
|
expect(h.state.zoom.value).toBe(1);
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
code: CODES.MINUS,
|
||||||
|
ctrlKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(h.state.zoom.value).toBe(0.9);
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
code: CODES.NUM_SUBTRACT,
|
||||||
|
ctrlKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(h.state.zoom.value).toBe(0.8);
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
code: CODES.NUM_ADD,
|
||||||
|
ctrlKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(h.state.zoom.value).toBe(0.9);
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", {
|
||||||
|
code: CODES.EQUAL,
|
||||||
|
ctrlKey: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
expect(h.state.zoom.value).toBe(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Test bounded text", () => {
|
describe("Test bounded text", () => {
|
||||||
let rectangle: any;
|
let rectangle: any;
|
||||||
const {
|
const { h } = window;
|
||||||
h,
|
|
||||||
}: {
|
|
||||||
h: {
|
|
||||||
elements: any;
|
|
||||||
};
|
|
||||||
} = window;
|
|
||||||
|
|
||||||
const DUMMY_HEIGHT = 240;
|
const DUMMY_HEIGHT = 240;
|
||||||
const DUMMY_WIDTH = 160;
|
const DUMMY_WIDTH = 160;
|
||||||
@@ -195,6 +252,7 @@ describe("textWysiwyg", () => {
|
|||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await render(<ExcalidrawApp />);
|
await render(<ExcalidrawApp />);
|
||||||
|
h.elements = [];
|
||||||
|
|
||||||
rectangle = UI.createElement("rectangle", {
|
rectangle = UI.createElement("rectangle", {
|
||||||
x: 10,
|
x: 10,
|
||||||
@@ -222,9 +280,9 @@ describe("textWysiwyg", () => {
|
|||||||
".excalidraw-textEditorContainer > textarea",
|
".excalidraw-textEditorContainer > textarea",
|
||||||
) as HTMLTextAreaElement;
|
) as HTMLTextAreaElement;
|
||||||
|
|
||||||
await new Promise((r) => setTimeout(r, 0));
|
|
||||||
|
|
||||||
fireEvent.change(editor, { target: { value: "Hello World!" } });
|
fireEvent.change(editor, { target: { value: "Hello World!" } });
|
||||||
|
|
||||||
|
await new Promise((r) => setTimeout(r, 0));
|
||||||
editor.blur();
|
editor.blur();
|
||||||
expect(rectangle.boundElements).toStrictEqual([
|
expect(rectangle.boundElements).toStrictEqual([
|
||||||
{ id: text.id, type: "text" },
|
{ id: text.id, type: "text" },
|
||||||
@@ -258,6 +316,8 @@ describe("textWysiwyg", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should update font family correctly on undo/redo by selecting bounded text when font family was updated", async () => {
|
it("should update font family correctly on undo/redo by selecting bounded text when font family was updated", async () => {
|
||||||
|
expect(h.elements.length).toBe(1);
|
||||||
|
|
||||||
mouse.doubleClickAt(
|
mouse.doubleClickAt(
|
||||||
rectangle.x + rectangle.width / 2,
|
rectangle.x + rectangle.width / 2,
|
||||||
rectangle.y + rectangle.height / 2,
|
rectangle.y + rectangle.height / 2,
|
||||||
@@ -289,19 +349,25 @@ describe("textWysiwyg", () => {
|
|||||||
|
|
||||||
await new Promise((r) => setTimeout(r, 0));
|
await new Promise((r) => setTimeout(r, 0));
|
||||||
editor.blur();
|
editor.blur();
|
||||||
expect(h.elements[1].fontFamily).toEqual(FONT_FAMILY.Cascadia);
|
expect(
|
||||||
|
(h.elements[1] as ExcalidrawTextElementWithContainer).fontFamily,
|
||||||
|
).toEqual(FONT_FAMILY.Cascadia);
|
||||||
|
|
||||||
//undo
|
//undo
|
||||||
Keyboard.withModifierKeys({ ctrl: true }, () => {
|
Keyboard.withModifierKeys({ ctrl: true }, () => {
|
||||||
Keyboard.keyPress(KEYS.Z);
|
Keyboard.keyPress(KEYS.Z);
|
||||||
});
|
});
|
||||||
expect(h.elements[1].fontFamily).toEqual(FONT_FAMILY.Virgil);
|
expect(
|
||||||
|
(h.elements[1] as ExcalidrawTextElementWithContainer).fontFamily,
|
||||||
|
).toEqual(FONT_FAMILY.Virgil);
|
||||||
|
|
||||||
//redo
|
//redo
|
||||||
Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
|
Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
|
||||||
Keyboard.keyPress(KEYS.Z);
|
Keyboard.keyPress(KEYS.Z);
|
||||||
});
|
});
|
||||||
expect(h.elements[1].fontFamily).toEqual(FONT_FAMILY.Cascadia);
|
expect(
|
||||||
|
(h.elements[1] as ExcalidrawTextElementWithContainer).fontFamily,
|
||||||
|
).toEqual(FONT_FAMILY.Cascadia);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should wrap text and vertcially center align once text submitted", async () => {
|
it("should wrap text and vertcially center align once text submitted", async () => {
|
||||||
@@ -338,10 +404,9 @@ describe("textWysiwyg", () => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
Keyboard.withModifierKeys({}, () => {
|
expect(h.elements.length).toBe(1);
|
||||||
Keyboard.keyPress(KEYS.ENTER);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
Keyboard.keyDown(KEYS.ENTER);
|
||||||
let text = h.elements[1] as ExcalidrawTextElementWithContainer;
|
let text = h.elements[1] as ExcalidrawTextElementWithContainer;
|
||||||
let editor = document.querySelector(
|
let editor = document.querySelector(
|
||||||
".excalidraw-textEditorContainer > textarea",
|
".excalidraw-textEditorContainer > textarea",
|
||||||
@@ -409,5 +474,47 @@ describe("textWysiwyg", () => {
|
|||||||
expect(text.height).toBe(APPROX_LINE_HEIGHT);
|
expect(text.height).toBe(APPROX_LINE_HEIGHT);
|
||||||
expect(text.width).toBe(rectangle.width - BOUND_TEXT_PADDING * 2);
|
expect(text.width).toBe(rectangle.width - BOUND_TEXT_PADDING * 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should unbind bound text when unbind action from context menu is triggred", async () => {
|
||||||
|
expect(h.elements.length).toBe(1);
|
||||||
|
expect(h.elements[0].id).toBe(rectangle.id);
|
||||||
|
|
||||||
|
Keyboard.withModifierKeys({}, () => {
|
||||||
|
Keyboard.keyPress(KEYS.ENTER);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(h.elements.length).toBe(2);
|
||||||
|
|
||||||
|
const text = h.elements[1] as ExcalidrawTextElementWithContainer;
|
||||||
|
expect(text.containerId).toBe(rectangle.id);
|
||||||
|
|
||||||
|
const editor = document.querySelector(
|
||||||
|
".excalidraw-textEditorContainer > textarea",
|
||||||
|
) as HTMLTextAreaElement;
|
||||||
|
|
||||||
|
await new Promise((r) => setTimeout(r, 0));
|
||||||
|
|
||||||
|
fireEvent.change(editor, { target: { value: "Hello World!" } });
|
||||||
|
editor.blur();
|
||||||
|
expect(rectangle.boundElements).toStrictEqual([
|
||||||
|
{ id: text.id, type: "text" },
|
||||||
|
]);
|
||||||
|
mouse.reset();
|
||||||
|
UI.clickTool("selection");
|
||||||
|
mouse.clickAt(10, 20);
|
||||||
|
mouse.down();
|
||||||
|
mouse.up();
|
||||||
|
fireEvent.contextMenu(GlobalTestState.canvas, {
|
||||||
|
button: 2,
|
||||||
|
clientX: 20,
|
||||||
|
clientY: 30,
|
||||||
|
});
|
||||||
|
const contextMenu = document.querySelector(".context-menu");
|
||||||
|
fireEvent.click(queryByText(contextMenu as HTMLElement, "Unbind text")!);
|
||||||
|
expect(h.elements[0].boundElements).toEqual([]);
|
||||||
|
expect((h.elements[1] as ExcalidrawTextElement).containerId).toEqual(
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+74
-89
@@ -8,7 +8,11 @@ import {
|
|||||||
import Scene from "../scene/Scene";
|
import Scene from "../scene/Scene";
|
||||||
import { isBoundToContainer, isTextElement } from "./typeChecks";
|
import { isBoundToContainer, isTextElement } from "./typeChecks";
|
||||||
import { CLASSES, BOUND_TEXT_PADDING } from "../constants";
|
import { CLASSES, BOUND_TEXT_PADDING } from "../constants";
|
||||||
import { ExcalidrawElement, ExcalidrawTextElement } from "./types";
|
import {
|
||||||
|
ExcalidrawElement,
|
||||||
|
ExcalidrawTextElement,
|
||||||
|
ExcalidrawLinearElement,
|
||||||
|
} from "./types";
|
||||||
import { AppState } from "../types";
|
import { AppState } from "../types";
|
||||||
import { mutateElement } from "./mutateElement";
|
import { mutateElement } from "./mutateElement";
|
||||||
import {
|
import {
|
||||||
@@ -17,6 +21,12 @@ import {
|
|||||||
getContainerElement,
|
getContainerElement,
|
||||||
wrapText,
|
wrapText,
|
||||||
} from "./textElement";
|
} from "./textElement";
|
||||||
|
import {
|
||||||
|
actionDecreaseFontSize,
|
||||||
|
actionIncreaseFontSize,
|
||||||
|
} from "../actions/actionProperties";
|
||||||
|
import { actionZoomIn, actionZoomOut } from "../actions/actionCanvas";
|
||||||
|
import App from "../components/App";
|
||||||
|
|
||||||
const normalizeText = (text: string) => {
|
const normalizeText = (text: string) => {
|
||||||
return (
|
return (
|
||||||
@@ -36,33 +46,30 @@ const getTransform = (
|
|||||||
maxWidth: number,
|
maxWidth: number,
|
||||||
maxHeight: number,
|
maxHeight: number,
|
||||||
) => {
|
) => {
|
||||||
const { zoom, offsetTop, offsetLeft } = appState;
|
const { zoom } = appState;
|
||||||
const degree = (180 * angle) / Math.PI;
|
const degree = (180 * angle) / Math.PI;
|
||||||
// offsets must be multiplied by 2 to account for the division by 2 of
|
let translateX = (width * (zoom.value - 1)) / 2;
|
||||||
// the whole expression afterwards
|
let translateY = (height * (zoom.value - 1)) / 2;
|
||||||
let translateX = ((width - offsetLeft * 2) * (zoom.value - 1)) / 2;
|
|
||||||
let translateY = ((height - offsetTop * 2) * (zoom.value - 1)) / 2;
|
|
||||||
if (width > maxWidth && zoom.value !== 1) {
|
if (width > maxWidth && zoom.value !== 1) {
|
||||||
translateX = (maxWidth / 2) * (zoom.value - 1);
|
translateX = (maxWidth * (zoom.value - 1)) / 2;
|
||||||
}
|
}
|
||||||
if (height > maxHeight && zoom.value !== 1) {
|
if (height > maxHeight && zoom.value !== 1) {
|
||||||
translateY = ((maxHeight - offsetTop * 2) * (zoom.value - 1)) / 2;
|
translateY = (maxHeight * (zoom.value - 1)) / 2;
|
||||||
}
|
}
|
||||||
return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;
|
return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const textWysiwyg = ({
|
export const textWysiwyg = ({
|
||||||
id,
|
id,
|
||||||
appState,
|
|
||||||
onChange,
|
onChange,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
getViewportCoords,
|
getViewportCoords,
|
||||||
element,
|
element,
|
||||||
canvas,
|
canvas,
|
||||||
excalidrawContainer,
|
excalidrawContainer,
|
||||||
|
app,
|
||||||
}: {
|
}: {
|
||||||
id: ExcalidrawElement["id"];
|
id: ExcalidrawElement["id"];
|
||||||
appState: AppState;
|
|
||||||
onChange?: (text: string) => void;
|
onChange?: (text: string) => void;
|
||||||
onSubmit: (data: {
|
onSubmit: (data: {
|
||||||
text: string;
|
text: string;
|
||||||
@@ -73,12 +80,13 @@ export const textWysiwyg = ({
|
|||||||
element: ExcalidrawTextElement;
|
element: ExcalidrawTextElement;
|
||||||
canvas: HTMLCanvasElement | null;
|
canvas: HTMLCanvasElement | null;
|
||||||
excalidrawContainer: HTMLDivElement | null;
|
excalidrawContainer: HTMLDivElement | null;
|
||||||
|
app: App;
|
||||||
}) => {
|
}) => {
|
||||||
const textPropertiesUpdated = (
|
const textPropertiesUpdated = (
|
||||||
updatedElement: ExcalidrawTextElement,
|
updatedElement: ExcalidrawTextElement,
|
||||||
editable: HTMLTextAreaElement,
|
editable: HTMLTextAreaElement,
|
||||||
) => {
|
) => {
|
||||||
const currentFont = editable.style.fontFamily.replaceAll('"', "");
|
const currentFont = editable.style.fontFamily.replace(/"/g, "");
|
||||||
if (
|
if (
|
||||||
getFontFamilyString({ fontFamily: updatedElement.fontFamily }) !==
|
getFontFamilyString({ fontFamily: updatedElement.fontFamily }) !==
|
||||||
currentFont
|
currentFont
|
||||||
@@ -91,11 +99,13 @@ export const textWysiwyg = ({
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
let originalContainerHeight: number;
|
let originalContainerHeight: number;
|
||||||
let approxLineHeight = getApproxLineHeight(getFontString(element));
|
|
||||||
|
|
||||||
const initialText = element.originalText;
|
|
||||||
const updateWysiwygStyle = () => {
|
const updateWysiwygStyle = () => {
|
||||||
const updatedElement = Scene.getScene(element)?.getElement(id);
|
const appState = app.state;
|
||||||
|
const updatedElement = Scene.getScene(element)?.getElement(
|
||||||
|
id,
|
||||||
|
) as ExcalidrawTextElement;
|
||||||
|
const approxLineHeight = getApproxLineHeight(getFontString(updatedElement));
|
||||||
if (updatedElement && isTextElement(updatedElement)) {
|
if (updatedElement && isTextElement(updatedElement)) {
|
||||||
let coordX = updatedElement.x;
|
let coordX = updatedElement.x;
|
||||||
let coordY = updatedElement.y;
|
let coordY = updatedElement.y;
|
||||||
@@ -118,8 +128,6 @@ export const textWysiwyg = ({
|
|||||||
height = editorHeight;
|
height = editorHeight;
|
||||||
}
|
}
|
||||||
if (propertiesUpdated) {
|
if (propertiesUpdated) {
|
||||||
approxLineHeight = getApproxLineHeight(getFontString(updatedElement));
|
|
||||||
|
|
||||||
originalContainerHeight = container.height;
|
originalContainerHeight = container.height;
|
||||||
|
|
||||||
// update height of the editor after properties updated
|
// update height of the editor after properties updated
|
||||||
@@ -163,29 +171,12 @@ export const textWysiwyg = ({
|
|||||||
? approxLineHeight
|
? approxLineHeight
|
||||||
: updatedElement.height / lines.length;
|
: updatedElement.height / lines.length;
|
||||||
if (!container) {
|
if (!container) {
|
||||||
maxWidth =
|
maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;
|
||||||
(appState.offsetLeft + appState.width - viewportX - 8) /
|
|
||||||
appState.zoom.value -
|
|
||||||
// margin-right of parent if any
|
|
||||||
Number(
|
|
||||||
getComputedStyle(
|
|
||||||
excalidrawContainer?.parentNode as Element,
|
|
||||||
).marginRight.slice(0, -2),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure text editor height doesn't go beyond viewport
|
// Make sure text editor height doesn't go beyond viewport
|
||||||
const editorMaxHeight =
|
const editorMaxHeight =
|
||||||
(appState.height -
|
(appState.height - viewportY) / appState.zoom.value;
|
||||||
viewportY -
|
|
||||||
// There is a ~14px difference which keeps on increasing
|
|
||||||
// with every zoom step when offset present hence I am subtracting it here
|
|
||||||
// However this is not the best fix and breaks in
|
|
||||||
// few scenarios
|
|
||||||
(appState.offsetTop
|
|
||||||
? ((appState.zoom.value * 100 - 100) / 10) * 14
|
|
||||||
: 0)) /
|
|
||||||
appState.zoom.value;
|
|
||||||
const angle = container ? container.angle : updatedElement.angle;
|
const angle = container ? container.angle : updatedElement.angle;
|
||||||
Object.assign(editable.style, {
|
Object.assign(editable.style, {
|
||||||
font: getFontString(updatedElement),
|
font: getFontString(updatedElement),
|
||||||
@@ -215,6 +206,7 @@ export const textWysiwyg = ({
|
|||||||
if (isTestEnv()) {
|
if (isTestEnv()) {
|
||||||
editable.style.fontFamily = getFontFamilyString(updatedElement);
|
editable.style.fontFamily = getFontFamilyString(updatedElement);
|
||||||
}
|
}
|
||||||
|
mutateElement(updatedElement, { x: coordX, y: coordY });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -257,10 +249,14 @@ export const textWysiwyg = ({
|
|||||||
|
|
||||||
if (onChange) {
|
if (onChange) {
|
||||||
editable.oninput = () => {
|
editable.oninput = () => {
|
||||||
|
const updatedElement = Scene.getScene(element)?.getElement(
|
||||||
|
id,
|
||||||
|
) as ExcalidrawTextElement;
|
||||||
|
const font = getFontString(updatedElement);
|
||||||
// using scrollHeight here since we need to calculate
|
// using scrollHeight here since we need to calculate
|
||||||
// number of lines so cannot use editable.style.height
|
// number of lines so cannot use editable.style.height
|
||||||
// as that gets updated below
|
// as that gets updated below
|
||||||
const lines = editable.scrollHeight / approxLineHeight;
|
const lines = editable.scrollHeight / getApproxLineHeight(font);
|
||||||
// auto increase height only when lines > 1 so its
|
// auto increase height only when lines > 1 so its
|
||||||
// measured correctly and vertically alignes for
|
// measured correctly and vertically alignes for
|
||||||
// first line as well as setting height to "auto"
|
// first line as well as setting height to "auto"
|
||||||
@@ -272,7 +268,7 @@ export const textWysiwyg = ({
|
|||||||
const container = getContainerElement(element);
|
const container = getContainerElement(element);
|
||||||
const actualLineCount = wrapText(
|
const actualLineCount = wrapText(
|
||||||
editable.value,
|
editable.value,
|
||||||
getFontString(element),
|
font,
|
||||||
container!.width,
|
container!.width,
|
||||||
).split("\n").length;
|
).split("\n").length;
|
||||||
|
|
||||||
@@ -293,16 +289,26 @@ export const textWysiwyg = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
editable.onkeydown = (event) => {
|
editable.onkeydown = (event) => {
|
||||||
if (!event[KEYS.CTRL_OR_CMD]) {
|
event.stopPropagation();
|
||||||
event.stopPropagation();
|
|
||||||
}
|
if (!event.shiftKey && actionZoomIn.keyTest(event)) {
|
||||||
if (event.key === KEYS.ESCAPE) {
|
event.preventDefault();
|
||||||
|
app.actionManager.executeAction(actionZoomIn);
|
||||||
|
updateWysiwygStyle();
|
||||||
|
} else if (!event.shiftKey && actionZoomOut.keyTest(event)) {
|
||||||
|
event.preventDefault();
|
||||||
|
app.actionManager.executeAction(actionZoomOut);
|
||||||
|
updateWysiwygStyle();
|
||||||
|
} else if (actionDecreaseFontSize.keyTest(event)) {
|
||||||
|
app.actionManager.executeAction(actionDecreaseFontSize);
|
||||||
|
} else if (actionIncreaseFontSize.keyTest(event)) {
|
||||||
|
app.actionManager.executeAction(actionIncreaseFontSize);
|
||||||
|
} else if (event.key === KEYS.ESCAPE) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
submittedViaKeyboard = true;
|
submittedViaKeyboard = true;
|
||||||
handleSubmit();
|
handleSubmit();
|
||||||
} else if (event.key === KEYS.ENTER && event[KEYS.CTRL_OR_CMD]) {
|
} else if (event.key === KEYS.ENTER && event[KEYS.CTRL_OR_CMD]) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
|
||||||
if (event.isComposing || event.keyCode === 229) {
|
if (event.isComposing || event.keyCode === 229) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -315,7 +321,6 @@ export const textWysiwyg = ({
|
|||||||
event.code === CODES.BRACKET_RIGHT))
|
event.code === CODES.BRACKET_RIGHT))
|
||||||
) {
|
) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
|
||||||
if (event.shiftKey || event.code === CODES.BRACKET_LEFT) {
|
if (event.shiftKey || event.code === CODES.BRACKET_LEFT) {
|
||||||
outdent();
|
outdent();
|
||||||
} else {
|
} else {
|
||||||
@@ -434,61 +439,41 @@ export const textWysiwyg = ({
|
|||||||
// it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the
|
// it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the
|
||||||
// wysiwyg on update
|
// wysiwyg on update
|
||||||
cleanup();
|
cleanup();
|
||||||
const updateElement = Scene.getScene(element)?.getElement(element.id);
|
const updateElement = Scene.getScene(element)?.getElement(
|
||||||
|
element.id,
|
||||||
|
) as ExcalidrawTextElement;
|
||||||
if (!updateElement) {
|
if (!updateElement) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let wrappedText = "";
|
let text = editable.value;
|
||||||
if (isTextElement(updateElement) && updateElement?.containerId) {
|
const container = getContainerElement(updateElement);
|
||||||
const container = getContainerElement(updateElement);
|
|
||||||
|
|
||||||
if (container) {
|
if (container) {
|
||||||
wrappedText = wrapText(
|
text = updateElement.text;
|
||||||
editable.value,
|
if (editable.value) {
|
||||||
getFontString(updateElement),
|
const boundTextElementId = getBoundTextElementId(container);
|
||||||
container.width,
|
if (!boundTextElementId || boundTextElementId !== element.id) {
|
||||||
);
|
mutateElement(container, {
|
||||||
|
boundElements: (container.boundElements || []).concat({
|
||||||
if (updateElement.containerId) {
|
type: "text",
|
||||||
const editorHeight = Number(editable.style.height.slice(0, -2));
|
id: element.id,
|
||||||
if (editable.value) {
|
}),
|
||||||
// Don't mutate if text is not updated
|
});
|
||||||
if (initialText !== editable.value) {
|
|
||||||
mutateElement(updateElement, {
|
|
||||||
// vertically center align
|
|
||||||
y: container.y + container.height / 2 - editorHeight / 2,
|
|
||||||
height: editorHeight,
|
|
||||||
width: Number(editable.style.width.slice(0, -2)),
|
|
||||||
// preserve padding
|
|
||||||
x: container.x + BOUND_TEXT_PADDING,
|
|
||||||
angle: container.angle,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const boundTextElementId = getBoundTextElementId(container);
|
|
||||||
if (!boundTextElementId || boundTextElementId !== element.id) {
|
|
||||||
mutateElement(container, {
|
|
||||||
boundElements: (container.boundElements || []).concat({
|
|
||||||
type: "text",
|
|
||||||
id: element.id,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mutateElement(container, {
|
|
||||||
boundElements: container.boundElements?.filter(
|
|
||||||
(ele) => ele.type !== "text",
|
|
||||||
),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
mutateElement(container, {
|
||||||
|
boundElements: container.boundElements?.filter(
|
||||||
|
(ele) =>
|
||||||
|
!isTextElement(
|
||||||
|
ele as ExcalidrawTextElement | ExcalidrawLinearElement,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wrappedText = editable.value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmit({
|
onSubmit({
|
||||||
text: normalizeText(wrappedText),
|
text,
|
||||||
viaKeyboard: submittedViaKeyboard,
|
viaKeyboard: submittedViaKeyboard,
|
||||||
originalText: editable.value,
|
originalText: editable.value,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ type _ExcalidrawElementBase = Readonly<{
|
|||||||
| null;
|
| null;
|
||||||
/** epoch (ms) timestamp of last element update */
|
/** epoch (ms) timestamp of last element update */
|
||||||
updated: number;
|
updated: number;
|
||||||
|
link: string | null;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type ExcalidrawSelectionElement = _ExcalidrawElementBase & {
|
export type ExcalidrawSelectionElement = _ExcalidrawElementBase & {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ export const INITIAL_SCENE_UPDATE_TIMEOUT = 5000;
|
|||||||
export const FILE_UPLOAD_TIMEOUT = 300;
|
export const FILE_UPLOAD_TIMEOUT = 300;
|
||||||
export const LOAD_IMAGES_TIMEOUT = 500;
|
export const LOAD_IMAGES_TIMEOUT = 500;
|
||||||
export const SYNC_FULL_SCENE_INTERVAL_MS = 20000;
|
export const SYNC_FULL_SCENE_INTERVAL_MS = 20000;
|
||||||
|
export const SYNC_BROWSER_TABS_TIMEOUT = 50;
|
||||||
|
|
||||||
export const FILE_UPLOAD_MAX_BYTES = 3 * 1024 * 1024; // 3 MiB
|
export const FILE_UPLOAD_MAX_BYTES = 3 * 1024 * 1024; // 3 MiB
|
||||||
// 1 year (https://stackoverflow.com/a/25201898/927631)
|
// 1 year (https://stackoverflow.com/a/25201898/927631)
|
||||||
@@ -25,3 +26,13 @@ export const FIREBASE_STORAGE_PREFIXES = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const ROOM_ID_BYTES = 10;
|
export const ROOM_ID_BYTES = 10;
|
||||||
|
|
||||||
|
export const STORAGE_KEYS = {
|
||||||
|
LOCAL_STORAGE_ELEMENTS: "excalidraw",
|
||||||
|
LOCAL_STORAGE_APP_STATE: "excalidraw-state",
|
||||||
|
LOCAL_STORAGE_COLLAB: "excalidraw-collab",
|
||||||
|
LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG: "collabLinkForceLoadFlag",
|
||||||
|
LOCAL_STORAGE_LIBRARY: "excalidraw-library",
|
||||||
|
VERSION_DATA_STATE: "version-dataState",
|
||||||
|
VERSION_FILES: "version-files",
|
||||||
|
} as const;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {
|
|||||||
INITIAL_SCENE_UPDATE_TIMEOUT,
|
INITIAL_SCENE_UPDATE_TIMEOUT,
|
||||||
LOAD_IMAGES_TIMEOUT,
|
LOAD_IMAGES_TIMEOUT,
|
||||||
SCENE,
|
SCENE,
|
||||||
|
STORAGE_KEYS,
|
||||||
SYNC_FULL_SCENE_INTERVAL_MS,
|
SYNC_FULL_SCENE_INTERVAL_MS,
|
||||||
} from "../app_constants";
|
} from "../app_constants";
|
||||||
import {
|
import {
|
||||||
@@ -39,7 +40,6 @@ import {
|
|||||||
import {
|
import {
|
||||||
importUsernameFromLocalStorage,
|
importUsernameFromLocalStorage,
|
||||||
saveUsernameToLocalStorage,
|
saveUsernameToLocalStorage,
|
||||||
STORAGE_KEYS,
|
|
||||||
} from "../data/localStorage";
|
} from "../data/localStorage";
|
||||||
import Portal from "./Portal";
|
import Portal from "./Portal";
|
||||||
import RoomDialog from "./RoomDialog";
|
import RoomDialog from "./RoomDialog";
|
||||||
@@ -65,6 +65,7 @@ import {
|
|||||||
reconcileElements as _reconcileElements,
|
reconcileElements as _reconcileElements,
|
||||||
} from "./reconciliation";
|
} from "./reconciliation";
|
||||||
import { decryptData } from "../../data/encryption";
|
import { decryptData } from "../../data/encryption";
|
||||||
|
import { resetBrowserStateVersions } from "../data/tabSync";
|
||||||
|
|
||||||
interface CollabState {
|
interface CollabState {
|
||||||
modalIsShown: boolean;
|
modalIsShown: boolean;
|
||||||
@@ -86,6 +87,7 @@ export interface CollabAPI {
|
|||||||
onCollabButtonClick: CollabInstance["onCollabButtonClick"];
|
onCollabButtonClick: CollabInstance["onCollabButtonClick"];
|
||||||
broadcastElements: CollabInstance["broadcastElements"];
|
broadcastElements: CollabInstance["broadcastElements"];
|
||||||
fetchImageFilesFromFirebase: CollabInstance["fetchImageFilesFromFirebase"];
|
fetchImageFilesFromFirebase: CollabInstance["fetchImageFilesFromFirebase"];
|
||||||
|
setUsername: (username: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -246,6 +248,10 @@ class CollabWrapper extends PureComponent<Props, CollabState> {
|
|||||||
|
|
||||||
this.saveCollabRoomToFirebase();
|
this.saveCollabRoomToFirebase();
|
||||||
if (window.confirm(t("alerts.collabStopOverridePrompt"))) {
|
if (window.confirm(t("alerts.collabStopOverridePrompt"))) {
|
||||||
|
// hack to ensure that we prefer we disregard any new browser state
|
||||||
|
// that could have been saved in other tabs while we were collaborating
|
||||||
|
resetBrowserStateVersions();
|
||||||
|
|
||||||
window.history.pushState({}, APP_NAME, window.location.origin);
|
window.history.pushState({}, APP_NAME, window.location.origin);
|
||||||
this.destroySocketClient();
|
this.destroySocketClient();
|
||||||
trackEvent("share", "room closed");
|
trackEvent("share", "room closed");
|
||||||
@@ -677,8 +683,12 @@ class CollabWrapper extends PureComponent<Props, CollabState> {
|
|||||||
this.setState({ modalIsShown: false });
|
this.setState({ modalIsShown: false });
|
||||||
};
|
};
|
||||||
|
|
||||||
onUsernameChange = (username: string) => {
|
setUsername = (username: string) => {
|
||||||
this.setState({ username });
|
this.setState({ username });
|
||||||
|
};
|
||||||
|
|
||||||
|
onUsernameChange = (username: string) => {
|
||||||
|
this.setUsername(username);
|
||||||
saveUsernameToLocalStorage(username);
|
saveUsernameToLocalStorage(username);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -712,6 +722,7 @@ class CollabWrapper extends PureComponent<Props, CollabState> {
|
|||||||
this.contextValue.broadcastElements = this.broadcastElements;
|
this.contextValue.broadcastElements = this.broadcastElements;
|
||||||
this.contextValue.fetchImageFilesFromFirebase =
|
this.contextValue.fetchImageFilesFromFirebase =
|
||||||
this.fetchImageFilesFromFirebase;
|
this.fetchImageFilesFromFirebase;
|
||||||
|
this.contextValue.setUsername = this.setUsername;
|
||||||
return this.contextValue;
|
return this.contextValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,8 @@ import {
|
|||||||
getDefaultAppState,
|
getDefaultAppState,
|
||||||
} from "../../appState";
|
} from "../../appState";
|
||||||
import { clearElementsForLocalStorage } from "../../element";
|
import { clearElementsForLocalStorage } from "../../element";
|
||||||
|
import { updateBrowserStateVersion } from "./tabSync";
|
||||||
export const STORAGE_KEYS = {
|
import { STORAGE_KEYS } from "../app_constants";
|
||||||
LOCAL_STORAGE_ELEMENTS: "excalidraw",
|
|
||||||
LOCAL_STORAGE_APP_STATE: "excalidraw-state",
|
|
||||||
LOCAL_STORAGE_COLLAB: "excalidraw-collab",
|
|
||||||
LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG: "collabLinkForceLoadFlag",
|
|
||||||
LOCAL_STORAGE_LIBRARY: "excalidraw-library",
|
|
||||||
};
|
|
||||||
|
|
||||||
export const saveUsernameToLocalStorage = (username: string) => {
|
export const saveUsernameToLocalStorage = (username: string) => {
|
||||||
try {
|
try {
|
||||||
@@ -53,6 +47,7 @@ export const saveToLocalStorage = (
|
|||||||
STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
|
STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
|
||||||
JSON.stringify(clearAppStateForLocalStorage(appState)),
|
JSON.stringify(clearAppStateForLocalStorage(appState)),
|
||||||
);
|
);
|
||||||
|
updateBrowserStateVersion(STORAGE_KEYS.VERSION_DATA_STATE);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
// Unable to access window.localStorage
|
// Unable to access window.localStorage
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@@ -125,3 +120,17 @@ export const getTotalStorageSize = () => {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getLibraryItemsFromStorage = () => {
|
||||||
|
try {
|
||||||
|
const libraryItems =
|
||||||
|
JSON.parse(
|
||||||
|
localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY) as string,
|
||||||
|
) || [];
|
||||||
|
|
||||||
|
return libraryItems;
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { STORAGE_KEYS } from "../app_constants";
|
||||||
|
|
||||||
|
// in-memory state (this tab's current state) versions. Currently just
|
||||||
|
// timestamps of the last time the state was saved to browser storage.
|
||||||
|
const LOCAL_STATE_VERSIONS = {
|
||||||
|
[STORAGE_KEYS.VERSION_DATA_STATE]: -1,
|
||||||
|
[STORAGE_KEYS.VERSION_FILES]: -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
type BrowserStateTypes = keyof typeof LOCAL_STATE_VERSIONS;
|
||||||
|
|
||||||
|
export const isBrowserStorageStateNewer = (type: BrowserStateTypes) => {
|
||||||
|
const storageTimestamp = JSON.parse(localStorage.getItem(type) || "-1");
|
||||||
|
return storageTimestamp > LOCAL_STATE_VERSIONS[type];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateBrowserStateVersion = (type: BrowserStateTypes) => {
|
||||||
|
const timestamp = Date.now();
|
||||||
|
localStorage.setItem(type, JSON.stringify(timestamp));
|
||||||
|
LOCAL_STATE_VERSIONS[type] = timestamp;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const resetBrowserStateVersions = () => {
|
||||||
|
for (const key of Object.keys(LOCAL_STATE_VERSIONS) as BrowserStateTypes[]) {
|
||||||
|
const timestamp = -1;
|
||||||
|
localStorage.setItem(key, JSON.stringify(timestamp));
|
||||||
|
LOCAL_STATE_VERSIONS[key] = timestamp;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -34,6 +34,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
debounce,
|
debounce,
|
||||||
getVersion,
|
getVersion,
|
||||||
|
isTestEnv,
|
||||||
preventUnload,
|
preventUnload,
|
||||||
ResolvablePromise,
|
ResolvablePromise,
|
||||||
resolvablePromise,
|
resolvablePromise,
|
||||||
@@ -41,6 +42,8 @@ import {
|
|||||||
import {
|
import {
|
||||||
FIREBASE_STORAGE_PREFIXES,
|
FIREBASE_STORAGE_PREFIXES,
|
||||||
SAVE_TO_LOCAL_STORAGE_TIMEOUT,
|
SAVE_TO_LOCAL_STORAGE_TIMEOUT,
|
||||||
|
STORAGE_KEYS,
|
||||||
|
SYNC_BROWSER_TABS_TIMEOUT,
|
||||||
} from "./app_constants";
|
} from "./app_constants";
|
||||||
import CollabWrapper, {
|
import CollabWrapper, {
|
||||||
CollabAPI,
|
CollabAPI,
|
||||||
@@ -50,9 +53,10 @@ import CollabWrapper, {
|
|||||||
import { LanguageList } from "./components/LanguageList";
|
import { LanguageList } from "./components/LanguageList";
|
||||||
import { exportToBackend, getCollaborationLinkData, loadScene } from "./data";
|
import { exportToBackend, getCollaborationLinkData, loadScene } from "./data";
|
||||||
import {
|
import {
|
||||||
|
getLibraryItemsFromStorage,
|
||||||
importFromLocalStorage,
|
importFromLocalStorage,
|
||||||
|
importUsernameFromLocalStorage,
|
||||||
saveToLocalStorage,
|
saveToLocalStorage,
|
||||||
STORAGE_KEYS,
|
|
||||||
} from "./data/localStorage";
|
} from "./data/localStorage";
|
||||||
import CustomStats from "./CustomStats";
|
import CustomStats from "./CustomStats";
|
||||||
import { restoreAppState, RestoredDataState } from "../data/restore";
|
import { restoreAppState, RestoredDataState } from "../data/restore";
|
||||||
@@ -67,6 +71,10 @@ import { FileManager, updateStaleImageStatuses } from "./data/FileManager";
|
|||||||
import { newElementWith } from "../element/mutateElement";
|
import { newElementWith } from "../element/mutateElement";
|
||||||
import { isInitializedImageElement } from "../element/typeChecks";
|
import { isInitializedImageElement } from "../element/typeChecks";
|
||||||
import { loadFilesFromFirebase } from "./data/firebase";
|
import { loadFilesFromFirebase } from "./data/firebase";
|
||||||
|
import {
|
||||||
|
isBrowserStorageStateNewer,
|
||||||
|
updateBrowserStateVersion,
|
||||||
|
} from "./data/tabSync";
|
||||||
|
|
||||||
const filesStore = createStore("files-db", "files-store");
|
const filesStore = createStore("files-db", "files-store");
|
||||||
|
|
||||||
@@ -104,6 +112,11 @@ const localFileStorage = new FileManager({
|
|||||||
const savedFiles = new Map<FileId, true>();
|
const savedFiles = new Map<FileId, true>();
|
||||||
const erroredFiles = new Map<FileId, true>();
|
const erroredFiles = new Map<FileId, true>();
|
||||||
|
|
||||||
|
// before we use `storage` event synchronization, let's update the flag
|
||||||
|
// optimistically. Hopefully nothing fails, and an IDB read executed
|
||||||
|
// before an IDB write finishes will read the latest value.
|
||||||
|
updateBrowserStateVersion(STORAGE_KEYS.VERSION_FILES);
|
||||||
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
[...addedFiles].map(async ([id, fileData]) => {
|
[...addedFiles].map(async ([id, fileData]) => {
|
||||||
try {
|
try {
|
||||||
@@ -142,7 +155,6 @@ const saveDebounced = debounce(
|
|||||||
elements,
|
elements,
|
||||||
files,
|
files,
|
||||||
});
|
});
|
||||||
|
|
||||||
onFilesSaved();
|
onFilesSaved();
|
||||||
},
|
},
|
||||||
SAVE_TO_LOCAL_STORAGE_TIMEOUT,
|
SAVE_TO_LOCAL_STORAGE_TIMEOUT,
|
||||||
@@ -278,7 +290,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
currentLangCode = currentLangCode[0];
|
currentLangCode = currentLangCode[0];
|
||||||
}
|
}
|
||||||
const [langCode, setLangCode] = useState(currentLangCode);
|
const [langCode, setLangCode] = useState(currentLangCode);
|
||||||
|
|
||||||
// initial state
|
// initial state
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -372,14 +383,7 @@ const ExcalidrawWrapper = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
data.scene.libraryItems = getLibraryItemsFromStorage();
|
||||||
data.scene.libraryItems =
|
|
||||||
JSON.parse(
|
|
||||||
localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY) as string,
|
|
||||||
) || [];
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
initializeScene({ collabAPI }).then((data) => {
|
initializeScene({ collabAPI }).then((data) => {
|
||||||
@@ -415,13 +419,71 @@ const ExcalidrawWrapper = () => {
|
|||||||
() => (document.title = APP_NAME),
|
() => (document.title = APP_NAME),
|
||||||
TITLE_TIMEOUT,
|
TITLE_TIMEOUT,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const syncData = debounce(() => {
|
||||||
|
if (isTestEnv()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!document.hidden && !collabAPI.isCollaborating()) {
|
||||||
|
// don't sync if local state is newer or identical to browser state
|
||||||
|
if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_DATA_STATE)) {
|
||||||
|
const localDataState = importFromLocalStorage();
|
||||||
|
const username = importUsernameFromLocalStorage();
|
||||||
|
let langCode = languageDetector.detect() || defaultLang.code;
|
||||||
|
if (Array.isArray(langCode)) {
|
||||||
|
langCode = langCode[0];
|
||||||
|
}
|
||||||
|
setLangCode(langCode);
|
||||||
|
excalidrawAPI.updateScene({
|
||||||
|
...localDataState,
|
||||||
|
libraryItems: getLibraryItemsFromStorage(),
|
||||||
|
});
|
||||||
|
collabAPI.setUsername(username || "");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_FILES)) {
|
||||||
|
const elements = excalidrawAPI.getSceneElementsIncludingDeleted();
|
||||||
|
const currFiles = excalidrawAPI.getFiles();
|
||||||
|
const fileIds =
|
||||||
|
elements?.reduce((acc, element) => {
|
||||||
|
if (
|
||||||
|
isInitializedImageElement(element) &&
|
||||||
|
// only load and update images that aren't already loaded
|
||||||
|
!currFiles[element.fileId]
|
||||||
|
) {
|
||||||
|
return acc.concat(element.fileId);
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, [] as FileId[]) || [];
|
||||||
|
if (fileIds.length) {
|
||||||
|
localFileStorage
|
||||||
|
.getFiles(fileIds)
|
||||||
|
.then(({ loadedFiles, erroredFiles }) => {
|
||||||
|
if (loadedFiles.length) {
|
||||||
|
excalidrawAPI.addFiles(loadedFiles);
|
||||||
|
}
|
||||||
|
updateStaleImageStatuses({
|
||||||
|
excalidrawAPI,
|
||||||
|
erroredFiles,
|
||||||
|
elements: excalidrawAPI.getSceneElementsIncludingDeleted(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, SYNC_BROWSER_TABS_TIMEOUT);
|
||||||
|
|
||||||
window.addEventListener(EVENT.HASHCHANGE, onHashChange, false);
|
window.addEventListener(EVENT.HASHCHANGE, onHashChange, false);
|
||||||
window.addEventListener(EVENT.UNLOAD, onBlur, false);
|
window.addEventListener(EVENT.UNLOAD, onBlur, false);
|
||||||
window.addEventListener(EVENT.BLUR, onBlur, false);
|
window.addEventListener(EVENT.BLUR, onBlur, false);
|
||||||
|
document.addEventListener(EVENT.VISIBILITY_CHANGE, syncData, false);
|
||||||
|
window.addEventListener(EVENT.FOCUS, syncData, false);
|
||||||
return () => {
|
return () => {
|
||||||
window.removeEventListener(EVENT.HASHCHANGE, onHashChange, false);
|
window.removeEventListener(EVENT.HASHCHANGE, onHashChange, false);
|
||||||
window.removeEventListener(EVENT.UNLOAD, onBlur, false);
|
window.removeEventListener(EVENT.UNLOAD, onBlur, false);
|
||||||
window.removeEventListener(EVENT.BLUR, onBlur, false);
|
window.removeEventListener(EVENT.BLUR, onBlur, false);
|
||||||
|
window.removeEventListener(EVENT.FOCUS, syncData, false);
|
||||||
|
document.removeEventListener(EVENT.VISIBILITY_CHANGE, syncData, false);
|
||||||
clearTimeout(titleTimeout);
|
clearTimeout(titleTimeout);
|
||||||
};
|
};
|
||||||
}, [collabAPI, excalidrawAPI]);
|
}, [collabAPI, excalidrawAPI]);
|
||||||
|
|||||||
+5
-3
@@ -16,9 +16,11 @@ const allLanguages: Language[] = [
|
|||||||
{ code: "ar-SA", label: "العربية", rtl: true },
|
{ code: "ar-SA", label: "العربية", rtl: true },
|
||||||
{ code: "bg-BG", label: "Български" },
|
{ code: "bg-BG", label: "Български" },
|
||||||
{ code: "ca-ES", label: "Català" },
|
{ code: "ca-ES", label: "Català" },
|
||||||
|
{ code: "cs-CZ", label: "Česky" },
|
||||||
{ code: "de-DE", label: "Deutsch" },
|
{ code: "de-DE", label: "Deutsch" },
|
||||||
{ code: "el-GR", label: "Ελληνικά" },
|
{ code: "el-GR", label: "Ελληνικά" },
|
||||||
{ code: "es-ES", label: "Español" },
|
{ code: "es-ES", label: "Español" },
|
||||||
|
{ code: "eu-ES", label: "Euskara" },
|
||||||
{ code: "fa-IR", label: "فارسی", rtl: true },
|
{ code: "fa-IR", label: "فارسی", rtl: true },
|
||||||
{ code: "fi-FI", label: "Suomi" },
|
{ code: "fi-FI", label: "Suomi" },
|
||||||
{ code: "fr-FR", label: "Français" },
|
{ code: "fr-FR", label: "Français" },
|
||||||
@@ -29,7 +31,10 @@ const allLanguages: Language[] = [
|
|||||||
{ code: "it-IT", label: "Italiano" },
|
{ code: "it-IT", label: "Italiano" },
|
||||||
{ code: "ja-JP", label: "日本語" },
|
{ code: "ja-JP", label: "日本語" },
|
||||||
{ code: "kab-KAB", label: "Taqbaylit" },
|
{ code: "kab-KAB", label: "Taqbaylit" },
|
||||||
|
{ code: "kk-KZ", label: "Қазақ тілі" },
|
||||||
{ code: "ko-KR", label: "한국어" },
|
{ code: "ko-KR", label: "한국어" },
|
||||||
|
{ code: "lt-LT", label: "Lietuvių" },
|
||||||
|
{ code: "lv-LV", label: "Latviešu" },
|
||||||
{ code: "my-MM", label: "Burmese" },
|
{ code: "my-MM", label: "Burmese" },
|
||||||
{ code: "nb-NO", label: "Norsk bokmål" },
|
{ code: "nb-NO", label: "Norsk bokmål" },
|
||||||
{ code: "nl-NL", label: "Nederlands" },
|
{ code: "nl-NL", label: "Nederlands" },
|
||||||
@@ -47,9 +52,6 @@ const allLanguages: Language[] = [
|
|||||||
{ code: "uk-UA", label: "Українська" },
|
{ code: "uk-UA", label: "Українська" },
|
||||||
{ code: "zh-CN", label: "简体中文" },
|
{ code: "zh-CN", label: "简体中文" },
|
||||||
{ code: "zh-TW", label: "繁體中文" },
|
{ code: "zh-TW", label: "繁體中文" },
|
||||||
{ code: "lv-LV", label: "Latviešu" },
|
|
||||||
{ code: "cs-CZ", label: "Česky" },
|
|
||||||
{ code: "kk-KZ", label: "Қазақ тілі" },
|
|
||||||
].concat([defaultLang]);
|
].concat([defaultLang]);
|
||||||
|
|
||||||
export const languages: Language[] = allLanguages
|
export const languages: Language[] = allLanguages
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export const isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);
|
export const isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);
|
||||||
export const isWindows = /^Win/.test(window.navigator.platform);
|
export const isWindows = /^Win/.test(window.navigator.platform);
|
||||||
|
export const isAndroid = /\b(android)\b/i.test(navigator.userAgent);
|
||||||
|
|
||||||
export const CODES = {
|
export const CODES = {
|
||||||
EQUAL: "Equal",
|
EQUAL: "Equal",
|
||||||
@@ -61,6 +62,7 @@ export const KEYS = {
|
|||||||
X: "x",
|
X: "x",
|
||||||
Y: "y",
|
Y: "y",
|
||||||
Z: "z",
|
Z: "z",
|
||||||
|
K: "k",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export type Key = keyof typeof KEYS;
|
export type Key = keyof typeof KEYS;
|
||||||
|
|||||||
+33
-19
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "إظهار منتقي لون الخط",
|
"showStroke": "إظهار منتقي لون الخط",
|
||||||
"showBackground": "إظهار منتقي لون الخلفية",
|
"showBackground": "إظهار منتقي لون الخلفية",
|
||||||
"toggleTheme": "غير النمط",
|
"toggleTheme": "غير النمط",
|
||||||
"personalLib": "",
|
"personalLib": "المكتبة الشخصية",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "مكتبتنا",
|
||||||
|
"decreaseFontSize": "تصغير حجم الخط",
|
||||||
|
"increaseFontSize": "تكبير حجم الخط",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "إعادة تعيين اللوحة",
|
"clearReset": "إعادة تعيين اللوحة",
|
||||||
@@ -138,10 +146,10 @@
|
|||||||
"exitZenMode": "إلغاء الوضع الليلى",
|
"exitZenMode": "إلغاء الوضع الليلى",
|
||||||
"cancel": "إلغاء",
|
"cancel": "إلغاء",
|
||||||
"clear": "مسح",
|
"clear": "مسح",
|
||||||
"remove": "",
|
"remove": "إزالة",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "انشر",
|
||||||
"submit": "",
|
"submit": "أرسل",
|
||||||
"confirm": ""
|
"confirm": "تأكيد"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟",
|
"clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟",
|
||||||
@@ -171,7 +179,7 @@
|
|||||||
"imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...",
|
"imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...",
|
||||||
"fileTooBig": "الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.",
|
"fileTooBig": "الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.",
|
||||||
"svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.",
|
"svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": "SVG غير صالح."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "تحديد",
|
"selection": "تحديد",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "رسم",
|
"freedraw": "رسم",
|
||||||
"text": "نص",
|
"text": "نص",
|
||||||
"library": "مكتبة",
|
"library": "مكتبة",
|
||||||
"lock": "الحفاظ على أداة التحديد نشطة بعد الرسم"
|
"lock": "الحفاظ على أداة التحديد نشطة بعد الرسم",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "إجراءات اللوحة",
|
"canvasActions": "إجراءات اللوحة",
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
"shapes": "الأشكال"
|
"shapes": "الأشكال"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "",
|
"canvasPanning": "لتحريك لوحة الرسم ، استمر في الضغط على عجلة الماوس أو مفتاح المسافة أثناء السحب",
|
||||||
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
|
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
|
||||||
"freeDraw": "انقر واسحب، افرج عند الانتهاء",
|
"freeDraw": "انقر واسحب، افرج عند الانتهاء",
|
||||||
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
|
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،\nاضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز",
|
"resizeImage": "يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،\nاضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز",
|
||||||
"rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران",
|
"rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران",
|
||||||
"lineEditor_info": "انقر نقراً مزدوجاً أو اضغط Enter لتعديل النقاط",
|
"lineEditor_info": "انقر نقراً مزدوجاً أو اضغط Enter لتعديل النقاط",
|
||||||
"lineEditor_pointSelected": "اضغط على حذف لإزالة النقطة، Ctrl Or Cmd+D للتكرار، أو اسحب للانتقال",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "حدد نقطة لتحريك أو إزالتها، أو اضغط Alt ثم انقر لإضافة نقاط جديدة",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "تعذر عرض المعاينة",
|
"cannotShowPreview": "تعذر عرض المعاينة",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "اقرأ مدونتنا",
|
"blog": "اقرأ مدونتنا",
|
||||||
"click": "انقر",
|
"click": "انقر",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "سهم مائل",
|
"curvedArrow": "سهم مائل",
|
||||||
"curvedLine": "خط مائل",
|
"curvedLine": "خط مائل",
|
||||||
"documentation": "دليل الاستخدام",
|
"documentation": "دليل الاستخدام",
|
||||||
@@ -295,7 +309,7 @@
|
|||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "مطلوب",
|
||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
@@ -317,13 +331,13 @@
|
|||||||
"atleastOneLibItem": ""
|
"atleastOneLibItem": ""
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "تم إرسال المكتبة",
|
||||||
"content": "",
|
"content": "شكرا لك {{authorName}}. لقد تم إرسال مكتبتك للمراجعة. يمكنك تتبع الحالة",
|
||||||
"link": ""
|
"link": "هنا"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "إعادة ضبط المكتبة",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "إزالة العناصر المحددة من المكتبة"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "رسوماتك مشفرة من النهاية إلى النهاية حتى أن خوادم Excalidraw لن تراها أبدا.",
|
"tooltip": "رسوماتك مشفرة من النهاية إلى النهاية حتى أن خوادم Excalidraw لن تراها أبدا.",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "العرض"
|
"width": "العرض"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "تمت الاضافة الى المكتبة!",
|
||||||
"copyStyles": "نسخت الانماط.",
|
"copyStyles": "نسخت الانماط.",
|
||||||
"copyToClipboard": "نسخ إلى الحافظة.",
|
"copyToClipboard": "نسخ إلى الحافظة.",
|
||||||
"copyToClipboardAsPng": "تم نسخ {{exportSelection}} إلى الحافظة بصيغة PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "تم نسخ {{exportSelection}} إلى الحافظة بصيغة PNG\n({{exportColorScheme}})",
|
||||||
|
|||||||
+36
-22
@@ -35,11 +35,11 @@
|
|||||||
"arrowhead_arrow": "Стрелка",
|
"arrowhead_arrow": "Стрелка",
|
||||||
"arrowhead_bar": "Връх на стрелката",
|
"arrowhead_bar": "Връх на стрелката",
|
||||||
"arrowhead_dot": "Точка",
|
"arrowhead_dot": "Точка",
|
||||||
"arrowhead_triangle": "",
|
"arrowhead_triangle": "Триъгълник",
|
||||||
"fontSize": "Размер на шрифта",
|
"fontSize": "Размер на шрифта",
|
||||||
"fontFamily": "Семейство шрифтове",
|
"fontFamily": "Семейство шрифтове",
|
||||||
"onlySelected": "Само избраното",
|
"onlySelected": "Само избраното",
|
||||||
"withBackground": "",
|
"withBackground": "Фон",
|
||||||
"exportEmbedScene": "",
|
"exportEmbedScene": "",
|
||||||
"exportEmbedScene_details": "Данните от сцената ще бъдат екпортирани в PNG/SVG файл, за да може сцената да бъде възстановена от него.\nТова ще увеличи размера на файла.",
|
"exportEmbedScene_details": "Данните от сцената ще бъдат екпортирани в PNG/SVG файл, за да може сцената да бъде възстановена от него.\nТова ще увеличи размера на файла.",
|
||||||
"addWatermark": "Добави \"Направено с Excalidraw\"",
|
"addWatermark": "Добави \"Направено с Excalidraw\"",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"architect": "Архитект",
|
"architect": "Архитект",
|
||||||
"artist": "Художник",
|
"artist": "Художник",
|
||||||
"cartoonist": "Карикатурист",
|
"cartoonist": "Карикатурист",
|
||||||
"fileTitle": "",
|
"fileTitle": "Име на файл",
|
||||||
"colorPicker": "Избор на цвят",
|
"colorPicker": "Избор на цвят",
|
||||||
"canvasBackground": "Фон на платно",
|
"canvasBackground": "Фон на платно",
|
||||||
"drawingCanvas": "Платно за рисуване",
|
"drawingCanvas": "Платно за рисуване",
|
||||||
@@ -93,21 +93,29 @@
|
|||||||
"centerHorizontally": "Центрирай хоризонтално",
|
"centerHorizontally": "Центрирай хоризонтално",
|
||||||
"distributeHorizontally": "Разпредели хоризонтално",
|
"distributeHorizontally": "Разпредели хоризонтално",
|
||||||
"distributeVertically": "Разпредели вертикално",
|
"distributeVertically": "Разпредели вертикално",
|
||||||
"flipHorizontal": "",
|
"flipHorizontal": "Хоризонтално обръщане",
|
||||||
"flipVertical": "",
|
"flipVertical": "Вертикално обръщане",
|
||||||
"viewMode": "Изглед",
|
"viewMode": "Изглед",
|
||||||
"toggleExportColorScheme": "",
|
"toggleExportColorScheme": "",
|
||||||
"share": "",
|
"share": "Сподели",
|
||||||
"showStroke": "",
|
"showStroke": "",
|
||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Нулиране на платно",
|
"clearReset": "Нулиране на платно",
|
||||||
"exportJSON": "",
|
"exportJSON": "",
|
||||||
"exportImage": "",
|
"exportImage": "Запиши като изображение",
|
||||||
"export": "Експортиране",
|
"export": "Експортиране",
|
||||||
"exportToPng": "Изнасяне в PNG",
|
"exportToPng": "Изнасяне в PNG",
|
||||||
"exportToSvg": "Изнасяне в SVG",
|
"exportToSvg": "Изнасяне в SVG",
|
||||||
@@ -129,19 +137,19 @@
|
|||||||
"edit": "Редактиране",
|
"edit": "Редактиране",
|
||||||
"undo": "Отмяна",
|
"undo": "Отмяна",
|
||||||
"redo": "Повтори",
|
"redo": "Повтори",
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Нулиране на библиотеката",
|
||||||
"createNewRoom": "Създай нова стая",
|
"createNewRoom": "Създай нова стая",
|
||||||
"fullScreen": "На цял екран",
|
"fullScreen": "На цял екран",
|
||||||
"darkMode": "Тъмен режим",
|
"darkMode": "Тъмен режим",
|
||||||
"lightMode": "Светъл режим",
|
"lightMode": "Светъл режим",
|
||||||
"zenMode": "Режим Zen",
|
"zenMode": "Режим Zen",
|
||||||
"exitZenMode": "Спиране на Zen режим",
|
"exitZenMode": "Спиране на Zen режим",
|
||||||
"cancel": "",
|
"cancel": "Отмени",
|
||||||
"clear": "",
|
"clear": "Изчисти",
|
||||||
"remove": "",
|
"remove": "Премахване",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "Публикувай",
|
||||||
"submit": "",
|
"submit": "Изпрати",
|
||||||
"confirm": ""
|
"confirm": "Потвърждаване"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?",
|
"clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?",
|
||||||
@@ -167,7 +175,7 @@
|
|||||||
"invalidEncryptionKey": ""
|
"invalidEncryptionKey": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "",
|
"unsupportedFileType": "Този файлов формат не се поддържа.",
|
||||||
"imageInsertError": "",
|
"imageInsertError": "",
|
||||||
"fileTooBig": "",
|
"fileTooBig": "",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "",
|
||||||
@@ -175,16 +183,18 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Селекция",
|
"selection": "Селекция",
|
||||||
"image": "",
|
"image": "Вмъкване на изображение",
|
||||||
"rectangle": "Правоъгълник",
|
"rectangle": "Правоъгълник",
|
||||||
"diamond": "Диамант",
|
"diamond": "Диамант",
|
||||||
"ellipse": "Елипс",
|
"ellipse": "Елипс",
|
||||||
"arrow": "Стрелка",
|
"arrow": "Стрелка",
|
||||||
"line": "Линия",
|
"line": "Линия",
|
||||||
"freedraw": "",
|
"freedraw": "Рисуване",
|
||||||
"text": "Текст",
|
"text": "Текст",
|
||||||
"library": "Библиотека",
|
"library": "Библиотека",
|
||||||
"lock": "Поддържайте избрания инструмент активен след рисуване"
|
"lock": "Поддържайте избрания инструмент активен след рисуване",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Действия по платното",
|
"canvasActions": "Действия по платното",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Можете да ограничите ъглите, като държите SHIFT, докато се въртите",
|
"rotate": "Можете да ограничите ъглите, като държите SHIFT, докато се въртите",
|
||||||
"lineEditor_info": "Кликнете два пъти или натиснете Enter за да промените точките",
|
"lineEditor_info": "Кликнете два пъти или натиснете Enter за да промените точките",
|
||||||
"lineEditor_pointSelected": "Натиснете Delete за да изтриете точка, CtrlOrCmd+D за дуплициране, или извлачете за да преместите",
|
"lineEditor_pointSelected": "Натиснете Delete за да изтриете точка(и), CtrlOrCmd+D за дуплициране, или извлачете за да преместите",
|
||||||
"lineEditor_nothingSelected": "Изберете точка за местене или изтриване, или пък задръжте Alt и натиснете за да добавите нови точки",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "Натиснете Enter, за да добавите",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Невъзможност за показване на preview",
|
"cannotShowPreview": "Невъзможност за показване на preview",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Прочетете нашия блог",
|
"blog": "Прочетете нашия блог",
|
||||||
"click": "клик",
|
"click": "клик",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Извита стрелка",
|
"curvedArrow": "Извита стрелка",
|
||||||
"curvedLine": "Извита линия",
|
"curvedLine": "Извита линия",
|
||||||
"documentation": "Документация",
|
"documentation": "Документация",
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "",
|
"text": "",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+89
-75
@@ -35,7 +35,7 @@
|
|||||||
"arrowhead_arrow": "Fletxa",
|
"arrowhead_arrow": "Fletxa",
|
||||||
"arrowhead_bar": "Barra",
|
"arrowhead_bar": "Barra",
|
||||||
"arrowhead_dot": "Punt",
|
"arrowhead_dot": "Punt",
|
||||||
"arrowhead_triangle": "",
|
"arrowhead_triangle": "Triangle",
|
||||||
"fontSize": "Mida de lletra",
|
"fontSize": "Mida de lletra",
|
||||||
"fontFamily": "Tipus de lletra",
|
"fontFamily": "Tipus de lletra",
|
||||||
"onlySelected": "Només seleccionats",
|
"onlySelected": "Només seleccionats",
|
||||||
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "Mostra el selector de color del traç",
|
"showStroke": "Mostra el selector de color del traç",
|
||||||
"showBackground": "Mostra el selector de color de fons",
|
"showBackground": "Mostra el selector de color de fons",
|
||||||
"toggleTheme": "Activa o desactiva el tema",
|
"toggleTheme": "Activa o desactiva el tema",
|
||||||
"personalLib": "",
|
"personalLib": "Biblioteca personal",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Biblioteca d'Excalidraw",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Neteja el llenç",
|
"clearReset": "Neteja el llenç",
|
||||||
@@ -136,12 +144,12 @@
|
|||||||
"lightMode": "Mode clar",
|
"lightMode": "Mode clar",
|
||||||
"zenMode": "Mode zen",
|
"zenMode": "Mode zen",
|
||||||
"exitZenMode": "Surt de mode zen",
|
"exitZenMode": "Surt de mode zen",
|
||||||
"cancel": "",
|
"cancel": "Cancel·la",
|
||||||
"clear": "",
|
"clear": "Neteja",
|
||||||
"remove": "",
|
"remove": "Suprimeix",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "Publica",
|
||||||
"submit": "",
|
"submit": "Envia",
|
||||||
"confirm": ""
|
"confirm": "Confirma"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "S'esborrarà tot el llenç. N'esteu segur?",
|
"clearReset": "S'esborrarà tot el llenç. N'esteu segur?",
|
||||||
@@ -163,19 +171,19 @@
|
|||||||
"cannotRestoreFromImage": "L’escena no s’ha pogut restaurar des d’aquest fitxer d’imatge",
|
"cannotRestoreFromImage": "L’escena no s’ha pogut restaurar des d’aquest fitxer d’imatge",
|
||||||
"invalidSceneUrl": "No s'ha pogut importar l'escena des de l'adreça URL proporcionada. Està malformada o no conté dades Excalidraw JSON vàlides.",
|
"invalidSceneUrl": "No s'ha pogut importar l'escena des de l'adreça URL proporcionada. Està malformada o no conté dades Excalidraw JSON vàlides.",
|
||||||
"resetLibrary": "Això buidarà la biblioteca. N'esteu segur?",
|
"resetLibrary": "Això buidarà la biblioteca. N'esteu segur?",
|
||||||
"removeItemsFromsLibrary": "",
|
"removeItemsFromsLibrary": "Suprimir {{count}} element(s) de la biblioteca?",
|
||||||
"invalidEncryptionKey": ""
|
"invalidEncryptionKey": "La clau d'encriptació ha de tenir 22 caràcters. La col·laboració en directe està desactivada."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "",
|
"unsupportedFileType": "Tipus de fitxer no suportat.",
|
||||||
"imageInsertError": "",
|
"imageInsertError": "No s'ha pogut insertar la imatge, torneu-ho a provar més tard...",
|
||||||
"fileTooBig": "",
|
"fileTooBig": "El fitxer és massa gros. La mida màxima permesa és {{maxSize}}.",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "No ha estat possible inserir la imatge SVG. Les marques SVG semblen invàlides.",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": "SVG no vàlid."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Selecció",
|
"selection": "Selecció",
|
||||||
"image": "",
|
"image": "Insereix imatge",
|
||||||
"rectangle": "Rectangle",
|
"rectangle": "Rectangle",
|
||||||
"diamond": "Rombe",
|
"diamond": "Rombe",
|
||||||
"ellipse": "El·lipse",
|
"ellipse": "El·lipse",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Dibuix",
|
"freedraw": "Dibuix",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"lock": "Mantenir activa l'eina seleccionada desprès de dibuixar"
|
"lock": "Mantenir activa l'eina seleccionada desprès de dibuixar",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Accions del llenç",
|
"canvasActions": "Accions del llenç",
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
"shapes": "Formes"
|
"shapes": "Formes"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "",
|
"canvasPanning": "Per a moure el llenç, mantingueu premuda la roda del ratolí o la tecla espai mentre l'arrossegueu",
|
||||||
"linearElement": "Feu clic per a dibuixar múltiples punts; arrossegueu per a una sola línia",
|
"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",
|
"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ó",
|
"text": "Consell: també podeu afegir text fent doble clic en qualsevol lloc amb l'eina de selecció",
|
||||||
@@ -201,13 +211,15 @@
|
|||||||
"linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar",
|
"linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar",
|
||||||
"lockAngle": "Per restringir els angles, mantenir premut el majúscul (SHIFT)",
|
"lockAngle": "Per restringir els angles, mantenir premut el majúscul (SHIFT)",
|
||||||
"resize": "Per restringir les proporcions mentres es canvia la mida, mantenir premut el majúscul (SHIFT); per canviar la mida des del centre, mantenir premut ALT",
|
"resize": "Per restringir les proporcions mentres es canvia la mida, mantenir premut el majúscul (SHIFT); per canviar la mida des del centre, mantenir premut ALT",
|
||||||
"resizeImage": "",
|
"resizeImage": "Podeu redimensionar lliurement prement MAJÚSCULA;\nper a redimensionar des del centre, premeu ALT",
|
||||||
"rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)",
|
"rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)",
|
||||||
"lineEditor_info": "Fes doble clic o premi Enter per editar punts",
|
"lineEditor_info": "Fes doble clic o premi Enter per editar punts",
|
||||||
"lineEditor_pointSelected": "Premeu Suprimir per a eliminar el punt, CtrlOrCmd+D per a duplicar-lo, o arrossegueu-lo per a moure'l",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Selecciona un punt per moure o eliminar, o manté premut Alt i fes clic per afegir punts nous",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "Feu clic per a col·locar la imatge o clic i arrossegar per a establir-ne la mida manualment",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "Publiqueu la vostra pròpia llibreria",
|
||||||
|
"bindTextToElement": "Premeu enter per a afegir-hi text",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "No es pot mostrar la previsualització",
|
"cannotShowPreview": "No es pot mostrar la previsualització",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Llegiu el nostre blog",
|
"blog": "Llegiu el nostre blog",
|
||||||
"click": "clic",
|
"click": "clic",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Fletxa corba",
|
"curvedArrow": "Fletxa corba",
|
||||||
"curvedLine": "Línia corba",
|
"curvedLine": "Línia corba",
|
||||||
"documentation": "Documentació",
|
"documentation": "Documentació",
|
||||||
@@ -275,55 +289,55 @@
|
|||||||
"zoomToSelection": "Zoom per veure la selecció"
|
"zoomToSelection": "Zoom per veure la selecció"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": "Neteja el llenç"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "Publica la biblioteca",
|
||||||
"itemName": "",
|
"itemName": "Nom de l'element",
|
||||||
"authorName": "",
|
"authorName": "Nom de l'autor/a",
|
||||||
"githubUsername": "",
|
"githubUsername": "Nom d'usuari de GitHub",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "Nom d'usuari de Twitter",
|
||||||
"libraryName": "",
|
"libraryName": "Nom de la biblioteca",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Descripció de la biblioteca",
|
||||||
"website": "",
|
"website": "Lloc web",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "",
|
"authorName": "Nom o usuari",
|
||||||
"libraryName": "",
|
"libraryName": "Nom de la vostra biblioteca",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Descripció de la biblioteca per a ajudar a la gent a entendre'n el funcionament",
|
||||||
"githubHandle": "",
|
"githubHandle": "",
|
||||||
"twitterHandle": "",
|
"twitterHandle": "",
|
||||||
"website": ""
|
"website": "Enllaç al vostre lloc web personal o a qualsevol altre (opcional)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "Requerit",
|
||||||
"website": ""
|
"website": "Introduïu una URL vàlida"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "",
|
"pre": "Envieu la vostra biblioteca perquè sigui inclosa al ",
|
||||||
"link": "",
|
"link": "repositori públic",
|
||||||
"post": ""
|
"post": "per tal que altres persones puguin fer-ne ús en els seus dibuixos."
|
||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "La biblioteca ha de ser aprovada manualment. Si us plau, llegiu les ",
|
||||||
"link": "",
|
"link": "directrius",
|
||||||
"post": ""
|
"post": " abans d'enviar-hi res. Necessitareu un compte de GitHub per a comunicar i fer-hi canvis si cal, però no és requisit imprescindible."
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "Quan l'envieu, accepteu que la biblioteca sigui publicada sota la ",
|
||||||
"link": "",
|
"link": "llicència MIT, ",
|
||||||
"post": ""
|
"post": "que, en resum, vol dir que qualsevol persona pot fer-ne ús sense restriccions."
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "Cada element de la biblioteca ha de tenir el seu propi nom per tal que sigui filtrable. S'hi inclouran els elements següents:",
|
||||||
"atleastOneLibItem": ""
|
"atleastOneLibItem": "Si us plau, seleccioneu si més no un element de la biblioteca per a començar"
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "Biblioteca enviada",
|
||||||
"content": "",
|
"content": "Gràcies, {{authorName}}. La vostra biblioteca ha estat enviada per a ser revisada. Podeu comprovar-ne l'estat",
|
||||||
"link": ""
|
"link": "aquí"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Restableix la biblioteca",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "Suprimeix els elements seleccionats de la llibreria"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "Els vostres dibuixos estan xifrats de punta a punta de manera que els servidors d’Excalidraw no els veuran mai.",
|
"tooltip": "Els vostres dibuixos estan xifrats de punta a punta de manera que els servidors d’Excalidraw no els veuran mai.",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "Amplada"
|
"width": "Amplada"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "Afegit a la biblioteca",
|
||||||
"copyStyles": "S'han copiat els estils.",
|
"copyStyles": "S'han copiat els estils.",
|
||||||
"copyToClipboard": "S'ha copiat al porta-retalls.",
|
"copyToClipboard": "S'ha copiat al porta-retalls.",
|
||||||
"copyToClipboardAsPng": "S'ha copiat {{exportSelection}} al porta-retalls en format PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "S'ha copiat {{exportSelection}} al porta-retalls en format PNG\n({{exportColorScheme}})",
|
||||||
@@ -360,29 +374,29 @@
|
|||||||
"f1f3f5": "Gris 1",
|
"f1f3f5": "Gris 1",
|
||||||
"fff5f5": "Vermell 0",
|
"fff5f5": "Vermell 0",
|
||||||
"fff0f6": "Rosa 0",
|
"fff0f6": "Rosa 0",
|
||||||
"f8f0fc": "",
|
"f8f0fc": "Malva 0",
|
||||||
"f3f0ff": "",
|
"f3f0ff": "Violat 0",
|
||||||
"edf2ff": "",
|
"edf2ff": "Indi 0",
|
||||||
"e7f5ff": "Blau 0",
|
"e7f5ff": "Blau 0",
|
||||||
"e3fafc": "",
|
"e3fafc": "Cian 0",
|
||||||
"e6fcf5": "",
|
"e6fcf5": "Xarxet 0",
|
||||||
"ebfbee": "Verd 0",
|
"ebfbee": "Verd 0",
|
||||||
"f4fce3": "",
|
"f4fce3": "Llima 0",
|
||||||
"fff9db": "Groc 0",
|
"fff9db": "Groc 0",
|
||||||
"fff4e6": "",
|
"fff4e6": "Taronja 0",
|
||||||
"transparent": "Transparent",
|
"transparent": "Transparent",
|
||||||
"ced4da": "Gris 4",
|
"ced4da": "Gris 4",
|
||||||
"868e96": "Gris 6",
|
"868e96": "Gris 6",
|
||||||
"fa5252": "Vermell 6",
|
"fa5252": "Vermell 6",
|
||||||
"e64980": "Rosa 6",
|
"e64980": "Rosa 6",
|
||||||
"be4bdb": "",
|
"be4bdb": "Malva 6",
|
||||||
"7950f2": "",
|
"7950f2": "Violat 6",
|
||||||
"4c6ef5": "",
|
"4c6ef5": "Indi 6",
|
||||||
"228be6": "Blau 6",
|
"228be6": "Blau 6",
|
||||||
"15aabf": "",
|
"15aabf": "Cian 6",
|
||||||
"12b886": "",
|
"12b886": "Xarxet 6",
|
||||||
"40c057": "Verd 6",
|
"40c057": "Verd 6",
|
||||||
"82c91e": "",
|
"82c91e": "Llima 6",
|
||||||
"fab005": "Groc 6",
|
"fab005": "Groc 6",
|
||||||
"fd7e14": "Taronja 6",
|
"fd7e14": "Taronja 6",
|
||||||
"000000": "Negre",
|
"000000": "Negre",
|
||||||
@@ -390,14 +404,14 @@
|
|||||||
"495057": "Gris 7",
|
"495057": "Gris 7",
|
||||||
"c92a2a": "Vermell 9",
|
"c92a2a": "Vermell 9",
|
||||||
"a61e4d": "Rosa 9",
|
"a61e4d": "Rosa 9",
|
||||||
"862e9c": "",
|
"862e9c": "Malva 9",
|
||||||
"5f3dc4": "",
|
"5f3dc4": "Violat 9",
|
||||||
"364fc7": "",
|
"364fc7": "Indi 9",
|
||||||
"1864ab": "Blau 9",
|
"1864ab": "Blau 9",
|
||||||
"0b7285": "",
|
"0b7285": "Cian 9",
|
||||||
"087f5b": "",
|
"087f5b": "Xarxet 9",
|
||||||
"2b8a3e": "Verd 9",
|
"2b8a3e": "Verd 9",
|
||||||
"5c940d": "",
|
"5c940d": "Llima 9",
|
||||||
"e67700": "Groc 9",
|
"e67700": "Groc 9",
|
||||||
"d9480f": "Taronja 9"
|
"d9480f": "Taronja 9"
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "Přepnout tmavý řežim",
|
"toggleTheme": "Přepnout tmavý řežim",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Kreslení",
|
"freedraw": "Kreslení",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "kliknutí",
|
"click": "kliknutí",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "",
|
"text": "",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Læs vores blog",
|
"blog": "Læs vores blog",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+22
-8
@@ -100,9 +100,17 @@
|
|||||||
"share": "Teilen",
|
"share": "Teilen",
|
||||||
"showStroke": "Auswahl für Strichfarbe anzeigen",
|
"showStroke": "Auswahl für Strichfarbe anzeigen",
|
||||||
"showBackground": "Hintergrundfarbe auswählen",
|
"showBackground": "Hintergrundfarbe auswählen",
|
||||||
"toggleTheme": "Design umschalten",
|
"toggleTheme": "Thema umschalten",
|
||||||
"personalLib": "Persönliche Bibliothek",
|
"personalLib": "Persönliche Bibliothek",
|
||||||
"excalidrawLib": "Excalidraw-Bibliothek"
|
"excalidrawLib": "Excalidraw-Bibliothek",
|
||||||
|
"decreaseFontSize": "Schrift verkleinern",
|
||||||
|
"increaseFontSize": "Schrift vergrößern",
|
||||||
|
"unbindText": "Text lösen",
|
||||||
|
"link": {
|
||||||
|
"edit": "Link bearbeiten",
|
||||||
|
"create": "Link erstellen",
|
||||||
|
"label": "Link"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Zeichnen",
|
"freedraw": "Zeichnen",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Bibliothek",
|
"library": "Bibliothek",
|
||||||
"lock": "Ausgewähltes Werkzeug nach Zeichnen aktiv lassen"
|
"lock": "Ausgewähltes Werkzeug nach Zeichnen aktiv lassen",
|
||||||
|
"penMode": "",
|
||||||
|
"link": "Link für ausgewählte Form hinzufügen / aktualisieren"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Aktionen für Zeichenfläche",
|
"canvasActions": "Aktionen für Zeichenfläche",
|
||||||
@@ -197,17 +207,19 @@
|
|||||||
"freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist",
|
"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",
|
"text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst",
|
||||||
"text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten",
|
"text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten",
|
||||||
"text_editing": "Drücke Escape oder Strg/Cmd+Eingabetaste, um die Bearbeitung abzuschließen",
|
"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",
|
"linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken",
|
||||||
"lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst",
|
"lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst",
|
||||||
"resize": "Du kannst die Proportionen einschränken, indem du SHIFT während der Größenänderung gedrückt hältst. Halte ALT gedrückt, um die Größe vom Zentrum aus zu ändern",
|
"resize": "Du kannst die Proportionen einschränken, indem du SHIFT während der Größenänderung gedrückt hältst. Halte ALT gedrückt, um die Größe vom Zentrum aus zu ändern",
|
||||||
"resizeImage": "Du kannst die Größe frei ändern, indem du SHIFT gedrückt hältst; halte ALT, um die Größe vom Zentrum aus zu ändern",
|
"resizeImage": "Du kannst die Größe frei ändern, indem du SHIFT gedrückt hältst; halte ALT, um die Größe vom Zentrum aus zu ändern",
|
||||||
"rotate": "Du kannst Winkel einschränken, indem du SHIFT während der Drehung gedrückt hältst",
|
"rotate": "Du kannst Winkel einschränken, indem du SHIFT während der Drehung gedrückt hältst",
|
||||||
"lineEditor_info": "Doppelklicken oder Eingabetaste drücken, um Punkte zu bearbeiten",
|
"lineEditor_info": "Doppelklicken oder Eingabetaste drücken, um Punkte zu bearbeiten",
|
||||||
"lineEditor_pointSelected": "Drücke Löschen, um Punkt zu entfernen, Strg+D oder Cmd+D zum Duplizieren oder ziehe zum Verschieben",
|
"lineEditor_pointSelected": "Drücke Löschen, um Punkt(e) zu entfernen, CtrlOrCmd+D zum Duplizieren oder ziehe zum Verschieben",
|
||||||
"lineEditor_nothingSelected": "Wähle einen Punkt zum Verschieben oder Löschen oder halte die Alt-Taste gedrückt und klicke, um neue Punkte hinzuzufügen",
|
"lineEditor_nothingSelected": "Wähle einen zu bearbeitenden Punkt (halte SHIFT gedrückt um mehrere Punkte auszuwählen),\noder halte Alt gedrückt und klicke um neue Punkte hinzuzufügen",
|
||||||
"placeImage": "Klicken, um das Bild zu platzieren oder klicken und ziehen um seine Größe manuell zu setzen",
|
"placeImage": "Klicken, um das Bild zu platzieren oder klicken und ziehen um seine Größe manuell zu setzen",
|
||||||
"publishLibrary": "Veröffentliche deine eigene Bibliothek"
|
"publishLibrary": "Veröffentliche deine eigene Bibliothek",
|
||||||
|
"bindTextToElement": "Zum Hinzufügen Eingabetaste drücken",
|
||||||
|
"deepBoxSelect": "Halte CtrlOrCmd gedrückt, um innerhalb der Gruppe auszuwählen, und um Ziehen zu vermeiden"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
|
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
|
||||||
@@ -243,7 +255,7 @@
|
|||||||
"exportDialog": {
|
"exportDialog": {
|
||||||
"disk_title": "Auf Festplatte speichern",
|
"disk_title": "Auf Festplatte speichern",
|
||||||
"disk_details": "Exportiere die Zeichnungsdaten in eine Datei, die Du später importieren kannst.",
|
"disk_details": "Exportiere die Zeichnungsdaten in eine Datei, die Du später importieren kannst.",
|
||||||
"disk_button": "In Datei speichern",
|
"disk_button": "Als Datei speichern",
|
||||||
"link_title": "Teilbarer Link",
|
"link_title": "Teilbarer Link",
|
||||||
"link_details": "Als schreibgeschützten Link exportieren.",
|
"link_details": "Als schreibgeschützten Link exportieren.",
|
||||||
"link_button": "Als Link exportieren",
|
"link_button": "Als Link exportieren",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lies unseren Blog",
|
"blog": "Lies unseren Blog",
|
||||||
"click": "klicken",
|
"click": "klicken",
|
||||||
|
"deepSelect": "Auswahl innerhalb der Gruppe",
|
||||||
|
"deepBoxSelect": "Auswahl innerhalb der Gruppe, und Ziehen vermeiden",
|
||||||
"curvedArrow": "Gebogener Pfeil",
|
"curvedArrow": "Gebogener Pfeil",
|
||||||
"curvedLine": "Gebogene Linie",
|
"curvedLine": "Gebogene Linie",
|
||||||
"documentation": "Dokumentation",
|
"documentation": "Dokumentation",
|
||||||
|
|||||||
+26
-12
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "Εμφάνιση επιλογέα χρωμάτων πινελιάς",
|
"showStroke": "Εμφάνιση επιλογέα χρωμάτων πινελιάς",
|
||||||
"showBackground": "Εμφάνιση επιλογέα χρώματος φόντου",
|
"showBackground": "Εμφάνιση επιλογέα χρώματος φόντου",
|
||||||
"toggleTheme": "Εναλλαγή θέματος",
|
"toggleTheme": "Εναλλαγή θέματος",
|
||||||
"personalLib": "",
|
"personalLib": "Προσωπική Βιβλιοθήκη",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Βιβλιοθήκη Excalidraw",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Επαναφορά του καμβά",
|
"clearReset": "Επαναφορά του καμβά",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Σχεδίαση",
|
"freedraw": "Σχεδίαση",
|
||||||
"text": "Κείμενο",
|
"text": "Κείμενο",
|
||||||
"library": "Βιβλιοθήκη",
|
"library": "Βιβλιοθήκη",
|
||||||
"lock": "Κράτησε επιλεγμένο το εργαλείο μετά το σχέδιο"
|
"lock": "Κράτησε επιλεγμένο το εργαλείο μετά το σχέδιο",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Ενέργειες καμβά",
|
"canvasActions": "Ενέργειες καμβά",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Μπορείς να περιορίσεις τις γωνίες κρατώντας πατημένο το πλήκτρο SHIFT κατά την περιστροφή",
|
"rotate": "Μπορείς να περιορίσεις τις γωνίες κρατώντας πατημένο το πλήκτρο SHIFT κατά την περιστροφή",
|
||||||
"lineEditor_info": "Διπλό-κλικ ή πιέστε Enter για να επεξεργαστείτε τα σημεία",
|
"lineEditor_info": "Διπλό-κλικ ή πιέστε Enter για να επεξεργαστείτε τα σημεία",
|
||||||
"lineEditor_pointSelected": "Πιέστε Διαγραφή για να αφαιρέσετε το σημείου, CtrlOrCmd+D για να το αντιγράψετε ή σύρτε το για να το μετακινήσετε",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Επιλέξτε ένα σημείο για μετακίνηση ή αφαίρεση, ή κρατήστε παρατεταμένα το Alt και κάντε κλικ για να προσθέσετε νέα σημεία",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": "Δημοσιεύστε τη δική σας βιβλιοθήκη"
|
"publishLibrary": "Δημοσιεύστε τη δική σας βιβλιοθήκη",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης",
|
"cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Διαβάστε το Blog μας",
|
"blog": "Διαβάστε το Blog μας",
|
||||||
"click": "κλικ",
|
"click": "κλικ",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Κυρτό βέλος",
|
"curvedArrow": "Κυρτό βέλος",
|
||||||
"curvedLine": "Κυρτή γραμμή",
|
"curvedLine": "Κυρτή γραμμή",
|
||||||
"documentation": "Εγχειρίδιο",
|
"documentation": "Εγχειρίδιο",
|
||||||
@@ -295,7 +309,7 @@
|
|||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "Απαιτείται",
|
||||||
"website": "Εισάγετε μια έγκυρη διεύθυνση URL"
|
"website": "Εισάγετε μια έγκυρη διεύθυνση URL"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
@@ -305,7 +319,7 @@
|
|||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
"link": "",
|
"link": "οδηγίες",
|
||||||
"post": ""
|
"post": ""
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
@@ -319,11 +333,11 @@
|
|||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"content": "",
|
"content": "",
|
||||||
"link": ""
|
"link": "εδώ"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Καθαρισμός βιβλιοθήκης",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "Αφαίρεση επιλεγμένων αντικειμένων από τη βιβλιοθήκη"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "Τα σχέδιά σου είναι κρυπτογραφημένα από άκρο σε άκρο, έτσι δεν θα είναι ποτέ ορατά μέσα από τους διακομιστές του Excalidraw.",
|
"tooltip": "Τα σχέδιά σου είναι κρυπτογραφημένα από άκρο σε άκρο, έτσι δεν θα είναι ποτέ ορατά μέσα από τους διακομιστές του Excalidraw.",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "Πλάτος"
|
"width": "Πλάτος"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "Προστέθηκε στη βιβλιοθήκη",
|
||||||
"copyStyles": "Αντιγράφηκαν στυλ.",
|
"copyStyles": "Αντιγράφηκαν στυλ.",
|
||||||
"copyToClipboard": "Αντιγράφηκε στο πρόχειρο.",
|
"copyToClipboard": "Αντιγράφηκε στο πρόχειρο.",
|
||||||
"copyToClipboardAsPng": "Αντιγράφηκε {{exportSelection}} στο πρόχειρο ως PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Αντιγράφηκε {{exportSelection}} στο πρόχειρο ως PNG\n({{exportColorScheme}})",
|
||||||
|
|||||||
+10
-2
@@ -104,7 +104,13 @@
|
|||||||
"personalLib": "Personal Library",
|
"personalLib": "Personal Library",
|
||||||
"excalidrawLib": "Excalidraw Library",
|
"excalidrawLib": "Excalidraw Library",
|
||||||
"decreaseFontSize": "Decrease font size",
|
"decreaseFontSize": "Decrease font size",
|
||||||
"increaseFontSize": "Increase font size"
|
"increaseFontSize": "Increase font size",
|
||||||
|
"unbindText": "Unbind text",
|
||||||
|
"link": {
|
||||||
|
"edit": "Edit link",
|
||||||
|
"create": "Create link",
|
||||||
|
"label": "Link"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Reset the canvas",
|
"clearReset": "Reset the canvas",
|
||||||
@@ -186,7 +192,9 @@
|
|||||||
"freedraw": "Draw",
|
"freedraw": "Draw",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Library",
|
"library": "Library",
|
||||||
"lock": "Keep selected tool active after drawing"
|
"lock": "Keep selected tool active after drawing",
|
||||||
|
"penMode": "Prevent pinch-zoom and accept freedraw input only from pen",
|
||||||
|
"link": "Add/ Update link for a selected shape"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Canvas actions",
|
"canvasActions": "Canvas actions",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Mostrar el selector de color de fondo",
|
"showBackground": "Mostrar el selector de color de fondo",
|
||||||
"toggleTheme": "Alternar tema",
|
"toggleTheme": "Alternar tema",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Limpiar lienzo y reiniciar el color de fondo",
|
"clearReset": "Limpiar lienzo y reiniciar el color de fondo",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Dibujar",
|
"freedraw": "Dibujar",
|
||||||
"text": "Texto",
|
"text": "Texto",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"lock": "Mantener la herramienta seleccionada activa después de dibujar"
|
"lock": "Mantener la herramienta seleccionada activa después de dibujar",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Acciones del lienzo",
|
"canvasActions": "Acciones del lienzo",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Puede redimensionar libremente pulsando SHIFT,\npulse ALT para redimensionar desde el centro",
|
"resizeImage": "Puede redimensionar libremente pulsando SHIFT,\npulse ALT para redimensionar desde el centro",
|
||||||
"rotate": "Puedes restringir los ángulos manteniendo presionado SHIFT mientras giras",
|
"rotate": "Puedes restringir los ángulos manteniendo presionado SHIFT mientras giras",
|
||||||
"lineEditor_info": "Doble clic o pulse Enter para editar puntos",
|
"lineEditor_info": "Doble clic o pulse Enter para editar puntos",
|
||||||
"lineEditor_pointSelected": "Presione Suprimir para eliminar el punto, CtrlOrCmd+D para duplicarlo, o arrástrelo para moverlo",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Selecciona un punto sea para mover o eliminar, o mantén pulsado Alt y haz clic para añadir nuevos puntos",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "Haga clic para colocar la imagen o haga clic y arrastre para establecer su tamaño manualmente",
|
"placeImage": "Haga clic para colocar la imagen o haga clic y arrastre para establecer su tamaño manualmente",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "No se puede mostrar la vista previa",
|
"cannotShowPreview": "No se puede mostrar la vista previa",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lea nuestro blog",
|
"blog": "Lea nuestro blog",
|
||||||
"click": "clic",
|
"click": "clic",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Flecha curva",
|
"curvedArrow": "Flecha curva",
|
||||||
"curvedLine": "Línea curva",
|
"curvedLine": "Línea curva",
|
||||||
"documentation": "Documentación",
|
"documentation": "Documentación",
|
||||||
|
|||||||
@@ -0,0 +1,418 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"paste": "Itsatsi",
|
||||||
|
"pasteCharts": "Itsatsi grafikoak",
|
||||||
|
"selectAll": "Hautatu dena",
|
||||||
|
"multiSelect": "Gehitu elementua hautapenera",
|
||||||
|
"moveCanvas": "Mugitu oihala",
|
||||||
|
"cut": "Ebaki",
|
||||||
|
"copy": "Kopiatu",
|
||||||
|
"copyAsPng": "Kopiatu arbelera PNG gisa",
|
||||||
|
"copyAsSvg": "Kopiatu arbelera SVG gisa",
|
||||||
|
"bringForward": "Ekarri aurrerago",
|
||||||
|
"sendToBack": "Eraman atzera",
|
||||||
|
"bringToFront": "Ekarri aurrera",
|
||||||
|
"sendBackward": "Eraman atzerago",
|
||||||
|
"delete": "Ezabatu",
|
||||||
|
"copyStyles": "Kopiatu estiloak",
|
||||||
|
"pasteStyles": "Itsatsi estiloak",
|
||||||
|
"stroke": "Marra",
|
||||||
|
"background": "Atzeko planoa",
|
||||||
|
"fill": "Bete",
|
||||||
|
"strokeWidth": "Marraren zabalera",
|
||||||
|
"strokeStyle": "Marraren estiloa",
|
||||||
|
"strokeStyle_solid": "Solidoa",
|
||||||
|
"strokeStyle_dashed": "Marratua",
|
||||||
|
"strokeStyle_dotted": "Puntukatua",
|
||||||
|
"sloppiness": "Marraren trazoa",
|
||||||
|
"opacity": "Opakotasuna",
|
||||||
|
"textAlign": "Testuaren lerrokapena",
|
||||||
|
"edges": "Ertzak",
|
||||||
|
"sharp": "Ertz bizia",
|
||||||
|
"round": "Borobildua",
|
||||||
|
"arrowheads": "Gezi-puntak",
|
||||||
|
"arrowhead_none": "Bat ere ez",
|
||||||
|
"arrowhead_arrow": "Gezia",
|
||||||
|
"arrowhead_bar": "Barra",
|
||||||
|
"arrowhead_dot": "Puntua",
|
||||||
|
"arrowhead_triangle": "Hirukia",
|
||||||
|
"fontSize": "Letra-tamaina",
|
||||||
|
"fontFamily": "Letra-tipoa",
|
||||||
|
"onlySelected": "Hautapena soilik",
|
||||||
|
"withBackground": "Atzeko planoa",
|
||||||
|
"exportEmbedScene": "Txertatu eszena",
|
||||||
|
"exportEmbedScene_details": "Eszenaren datuak esportatutako PNG/SVG fitxategian gordeko dira, eszena bertatik berrezartzeko.\nEsportatutako fitxategien tamaina handituko da.",
|
||||||
|
"addWatermark": "Gehitu \"Excalidraw bidez egina\"",
|
||||||
|
"handDrawn": "Eskuz marraztua",
|
||||||
|
"normal": "Normala",
|
||||||
|
"code": "Kodea",
|
||||||
|
"small": "Txikia",
|
||||||
|
"medium": "Ertaina",
|
||||||
|
"large": "Handia",
|
||||||
|
"veryLarge": "Oso handia",
|
||||||
|
"solid": "Solidoa",
|
||||||
|
"hachure": "Itzalduna",
|
||||||
|
"crossHatch": "Marraduna",
|
||||||
|
"thin": "Mehea",
|
||||||
|
"bold": "Lodia",
|
||||||
|
"left": "Ezkerrean",
|
||||||
|
"center": "Erdian",
|
||||||
|
"right": "Eskuinean",
|
||||||
|
"extraBold": "Oso lodia",
|
||||||
|
"architect": "Arkitektoa",
|
||||||
|
"artist": "Artista",
|
||||||
|
"cartoonist": "Marrazkilaria",
|
||||||
|
"fileTitle": "Fitxategi izena",
|
||||||
|
"colorPicker": "Kolore-hautatzailea",
|
||||||
|
"canvasBackground": "Oihalaren atzeko planoa",
|
||||||
|
"drawingCanvas": "Marrazteko oihala",
|
||||||
|
"layers": "Geruzak",
|
||||||
|
"actions": "Ekintzak",
|
||||||
|
"language": "Hizkuntza",
|
||||||
|
"liveCollaboration": "Zuzeneko elkarlana",
|
||||||
|
"duplicateSelection": "Bikoiztu",
|
||||||
|
"untitled": "Izengabea",
|
||||||
|
"name": "Izena",
|
||||||
|
"yourName": "Zure izena",
|
||||||
|
"madeWithExcalidraw": "Excalidraw bidez egina",
|
||||||
|
"group": "Hautapena taldea bihurtu",
|
||||||
|
"ungroup": "Desegin hautapenaren taldea",
|
||||||
|
"collaborators": "Kolaboratzaileak",
|
||||||
|
"showGrid": "Erakutsi sareta",
|
||||||
|
"addToLibrary": "Gehitu liburutegira",
|
||||||
|
"removeFromLibrary": "Kendu liburutegitik",
|
||||||
|
"libraryLoadingMessage": "Liburutegia kargatzen…",
|
||||||
|
"libraries": "Arakatu liburutegiak",
|
||||||
|
"loadingScene": "Eszena kargatzen…",
|
||||||
|
"align": "Lerrokatu",
|
||||||
|
"alignTop": "Lerrokatu goian",
|
||||||
|
"alignBottom": "Lerrokatu behean",
|
||||||
|
"alignLeft": "Lerrokatu ezkerrean",
|
||||||
|
"alignRight": "Lerrokatu eskuinean",
|
||||||
|
"centerVertically": "Erdiratu bertikalki",
|
||||||
|
"centerHorizontally": "Erdiratu horizontalki",
|
||||||
|
"distributeHorizontally": "Banandu horizontalki",
|
||||||
|
"distributeVertically": "Banandu bertikalki",
|
||||||
|
"flipHorizontal": "Irauli horizontalki",
|
||||||
|
"flipVertical": "Irauli bertikalki",
|
||||||
|
"viewMode": "Ikuspegia",
|
||||||
|
"toggleExportColorScheme": "Aldatu esportatzeko kolorearen eszena",
|
||||||
|
"share": "Partekatu",
|
||||||
|
"showStroke": "Erakutsi marraren kolore-hautatzailea",
|
||||||
|
"showBackground": "Erakutsi atzeko planoaren kolore-hautatzailea",
|
||||||
|
"toggleTheme": "Aldatu gaia",
|
||||||
|
"personalLib": "Liburutegi pertsonala",
|
||||||
|
"excalidrawLib": "Excalidraw liburutegia",
|
||||||
|
"decreaseFontSize": "Txikitu letra tamaina",
|
||||||
|
"increaseFontSize": "Handitu letra tamaina",
|
||||||
|
"unbindText": "Askatu testua",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"clearReset": "Garbitu oihala",
|
||||||
|
"exportJSON": "Esportatu fitxategira",
|
||||||
|
"exportImage": "Gorde irudi gisa",
|
||||||
|
"export": "Esportatu",
|
||||||
|
"exportToPng": "Esportatu PNG gisa",
|
||||||
|
"exportToSvg": "Esportatu SVG gisa",
|
||||||
|
"copyToClipboard": "Kopiatu arbelera",
|
||||||
|
"copyPngToClipboard": "Kopiatu PNG arbelera",
|
||||||
|
"scale": "Eskala",
|
||||||
|
"save": "Gorde uneko fitxategian",
|
||||||
|
"saveAs": "Gorde honela",
|
||||||
|
"load": "Kargatu",
|
||||||
|
"getShareableLink": "Lortu partekatzeko esteka",
|
||||||
|
"close": "Itxi",
|
||||||
|
"selectLanguage": "Hautatu hizkuntza",
|
||||||
|
"scrollBackToContent": "Joan atzera edukira",
|
||||||
|
"zoomIn": "Handiagotu",
|
||||||
|
"zoomOut": "Txikiagotu",
|
||||||
|
"resetZoom": "Leheneratu zooma",
|
||||||
|
"menu": "Menua",
|
||||||
|
"done": "Egina",
|
||||||
|
"edit": "Editatu",
|
||||||
|
"undo": "Desegin",
|
||||||
|
"redo": "Berregin",
|
||||||
|
"resetLibrary": "Leheneratu liburutegia",
|
||||||
|
"createNewRoom": "Sortu gela berria",
|
||||||
|
"fullScreen": "Pantaila osoa",
|
||||||
|
"darkMode": "Modu iluna",
|
||||||
|
"lightMode": "Modu argia",
|
||||||
|
"zenMode": "Zen modua",
|
||||||
|
"exitZenMode": "Irten Zen modutik",
|
||||||
|
"cancel": "Utzi",
|
||||||
|
"clear": "Garbitu",
|
||||||
|
"remove": "Kendu",
|
||||||
|
"publishLibrary": "Argitaratu",
|
||||||
|
"submit": "Bidali",
|
||||||
|
"confirm": "Baieztatu"
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"clearReset": "Honek oihal osoa garbituko du. Ziur zaude?",
|
||||||
|
"couldNotCreateShareableLink": "Ezin izan da partekatzeko estekarik sortu.",
|
||||||
|
"couldNotCreateShareableLinkTooBig": "Ezin izan da partekatzeko estekarik sortu: eszena handiegia da",
|
||||||
|
"couldNotLoadInvalidFile": "Ezin izan da kargatu, fitxategiak ez du balio",
|
||||||
|
"importBackendFailed": "Inportazioak huts egin du.",
|
||||||
|
"cannotExportEmptyCanvas": "Ezin izan da oihal hutsa esportatu.",
|
||||||
|
"couldNotCopyToClipboard": "Ezin izan da arbelean kopiatu.",
|
||||||
|
"decryptFailed": "Ezin izan da deszifratu.",
|
||||||
|
"uploadedSecurly": "Kargatzea muturretik muturrerako zifratze bidez ziurtatu da, hau da, Excalidraw zerbitzariak eta hirugarrenek ezin dutela edukia irakurri.",
|
||||||
|
"loadSceneOverridePrompt": "Kanpoko marrazkia kargatzeak lehendik duzun edukia ordezkatuko du. Jarraitu nahi duzu?",
|
||||||
|
"collabStopOverridePrompt": "Saioa gelditzeak lokalean gordetako zure aurreko marrazkia gainidatziko du. Ziur zaude?\n\n(Zure marrazki lokala mantendu nahi baduzu, itxi arakatzailearen fitxa.)",
|
||||||
|
"errorLoadingLibrary": "Errore bat gertatu da hirugarrenen liburutegia kargatzean.",
|
||||||
|
"errorAddingToLibrary": "Ezin izan da elementua liburutegian gehitu",
|
||||||
|
"errorRemovingFromLibrary": "Ezin izan da elementua liburutegitik kendu",
|
||||||
|
"confirmAddLibrary": "Honek {{numShapes}} forma gehituko ditu zure liburutegian. Ziur zaude?",
|
||||||
|
"imageDoesNotContainScene": "Irudi honek ez dirudi eszena daturik duenik. Eszena kapsulatzea gaitu al duzu esportazioan?",
|
||||||
|
"cannotRestoreFromImage": "Ezin izan da eszena leheneratu irudi fitxategi honetatik",
|
||||||
|
"invalidSceneUrl": "Ezin izan da eszena inportatu emandako URLtik. Gaizki eratuta dago edo ez du baliozko Excalidraw JSON daturik.",
|
||||||
|
"resetLibrary": "Honek zure liburutegia garbituko du. Ziur zaude?",
|
||||||
|
"removeItemsFromsLibrary": "Liburutegitik {{count}} elementu ezabatu?",
|
||||||
|
"invalidEncryptionKey": "Enkriptazio-gakoak 22 karaktere izan behar ditu. Zuzeneko lankidetza desgaituta dago."
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"unsupportedFileType": "Onartu gabeko fitxategi mota.",
|
||||||
|
"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.",
|
||||||
|
"invalidSVGString": "SVG baliogabea."
|
||||||
|
},
|
||||||
|
"toolBar": {
|
||||||
|
"selection": "Hautapena",
|
||||||
|
"image": "Txertatu irudia",
|
||||||
|
"rectangle": "Laukizuzena",
|
||||||
|
"diamond": "Diamantea",
|
||||||
|
"ellipse": "Elipsea",
|
||||||
|
"arrow": "Gezia",
|
||||||
|
"line": "Lerroa",
|
||||||
|
"freedraw": "Marraztu",
|
||||||
|
"text": "Testua",
|
||||||
|
"library": "Liburutegia",
|
||||||
|
"lock": "Mantendu aktibo hautatutako tresna marraztu ondoren",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"canvasActions": "Canvas ekintzak",
|
||||||
|
"selectedShapeActions": "Hautatutako formaren ekintzak",
|
||||||
|
"shapes": "Formak"
|
||||||
|
},
|
||||||
|
"hints": {
|
||||||
|
"canvasPanning": "Oihala mugitzeko, sakatu saguaren gurpila edo zuriune-barra arrastatzean",
|
||||||
|
"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",
|
||||||
|
"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",
|
||||||
|
"lockAngle": "SHIFT sakatuta angelua mantendu dezakezu",
|
||||||
|
"resize": "Proportzioak mantendu ditzakezu SHIFT sakatuta tamaina aldatzen duzun bitartean.\nsakatu ALT erditik tamaina aldatzeko",
|
||||||
|
"resizeImage": "Tamaina libreki alda dezakezu SHIFT sakatuta,\nsakatu ALT erditik tamaina aldatzeko",
|
||||||
|
"rotate": "Angeluak mantendu ditzakezu SHIFT sakatuta biratzen duzun bitartean",
|
||||||
|
"lineEditor_info": "Egin klik bikoitza edo sakatu Sartu puntuak editatzeko",
|
||||||
|
"lineEditor_pointSelected": "Sakatu Ezabatu puntuak kentzeko,\nKtrl+D bikoizteko, edo arrastatu mugitzeko",
|
||||||
|
"lineEditor_nothingSelected": "Hautatu editatzeko puntu bat (SHIFT sakatuta anitz hautatzeko),\nedo eduki Alt sakatuta eta egin klik puntu berriak gehitzeko",
|
||||||
|
"placeImage": "Egin klik irudia kokatzeko, edo egin klik eta arrastatu bere tamaina eskuz ezartzeko",
|
||||||
|
"publishLibrary": "Argitaratu zure liburutegia",
|
||||||
|
"bindTextToElement": "Sakatu Sartu testua gehitzeko",
|
||||||
|
"deepBoxSelect": ""
|
||||||
|
},
|
||||||
|
"canvasError": {
|
||||||
|
"cannotShowPreview": "",
|
||||||
|
"canvasTooBig": "",
|
||||||
|
"canvasTooBigTip": ""
|
||||||
|
},
|
||||||
|
"errorSplash": {
|
||||||
|
"headingMain_pre": "",
|
||||||
|
"headingMain_button": "orria birkargatzen.",
|
||||||
|
"clearCanvasMessage": "Birkargatzea ez bada burutzen, saiatu ",
|
||||||
|
"clearCanvasMessage_button": "oihala garbitzen.",
|
||||||
|
"clearCanvasCaveat": " Honen ondorioz lana galduko da ",
|
||||||
|
"trackedToSentry_pre": "Identifikatzailearen errorea ",
|
||||||
|
"trackedToSentry_post": " gure sistemak behatu du.",
|
||||||
|
"openIssueMessage_pre": "Oso kontuz ibili gara zure eszenaren informazioa errorean ez sartzeko. Zure eszena pribatua ez bada, kontuan hartu gure ",
|
||||||
|
"openIssueMessage_button": "erroreen jarraipena egitea.",
|
||||||
|
"openIssueMessage_post": " Sartu beheko informazioa kopiatu eta itsatsi bidez GitHub issue-n.",
|
||||||
|
"sceneContent": "Eszenaren edukia:"
|
||||||
|
},
|
||||||
|
"roomDialog": {
|
||||||
|
"desc_intro": "Jendea zure uneko eszenara gonbida dezakezu zurekin elkarlanean aritzeko.",
|
||||||
|
"desc_privacy": "Ez kezkatu, saioak muturretik muturrerako enkriptatzea erabiltzen du, beraz, marrazten duzuna pribatua izango da. Gure zerbitzariak ere ezingo du ikusi zer egiten duzun.",
|
||||||
|
"button_startSession": "Hasi saioa",
|
||||||
|
"button_stopSession": "Itxi saioa",
|
||||||
|
"desc_inProgressIntro": "Zuzeneko lankidetza saioa abian da.",
|
||||||
|
"desc_shareLink": "Partekatu esteka hau elkarlanean aritu nahi duzun edonorekin:",
|
||||||
|
"desc_exitSession": "Saioa ixteak aretotik deskonektatuko zaitu, baina eszenarekin lanean jarraitu ahal izango duzu lokalean. Kontuan izan honek ez diela beste pertsonei eragingo, eta euren bertsioan elkarlanean aritu ahal izango dira.",
|
||||||
|
"shareTitle": "Sartu Excalidraw-en zuzeneko lankidetza-saio batean"
|
||||||
|
},
|
||||||
|
"errorDialog": {
|
||||||
|
"title": "Errorea"
|
||||||
|
},
|
||||||
|
"exportDialog": {
|
||||||
|
"disk_title": "Gorde diskoan",
|
||||||
|
"disk_details": "Esportatu eszenaren datuak geroago inportatu ahal izango duzun fitxategi batan.",
|
||||||
|
"disk_button": "Gorde fitxategian",
|
||||||
|
"link_title": "Partekatzeko esteka",
|
||||||
|
"link_details": "Esportatu irakurtzeko soilik moduko esteka.",
|
||||||
|
"link_button": "Esportatu esteka",
|
||||||
|
"excalidrawplus_description": "Gorde eszena zure Excalidraw+ laneko areara.",
|
||||||
|
"excalidrawplus_button": "Esportatu",
|
||||||
|
"excalidrawplus_exportError": "Une honetan ezin izan da esportatu Excalidraw+era..."
|
||||||
|
},
|
||||||
|
"helpDialog": {
|
||||||
|
"blog": "Irakurri gure bloga",
|
||||||
|
"click": "sakatu",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
|
"curvedArrow": "Gezi kurbatua",
|
||||||
|
"curvedLine": "Lerro kurbatua",
|
||||||
|
"documentation": "Dokumentazioa",
|
||||||
|
"doubleClick": "klik bikoitza",
|
||||||
|
"drag": "arrastatu",
|
||||||
|
"editor": "Editorea",
|
||||||
|
"editSelectedShape": "Editatu hautatutako forma (testua/gezia/lerroa)",
|
||||||
|
"github": "Arazorik izan al duzu? Eman horren berri",
|
||||||
|
"howto": "Jarraitu gure gidak",
|
||||||
|
"or": "edo",
|
||||||
|
"preventBinding": "Saihestu gezien gainjartzea",
|
||||||
|
"shapes": "Formak",
|
||||||
|
"shortcuts": "Laster-teklak",
|
||||||
|
"textFinish": "Bukatu edizioa (testu editorea)",
|
||||||
|
"textNewLine": "Gehitu lerro berri bat (testu editorea)",
|
||||||
|
"title": "Laguntza",
|
||||||
|
"view": "Bistaratu",
|
||||||
|
"zoomToFit": "Egin zoom elementu guztiak ikusteko",
|
||||||
|
"zoomToSelection": "Zooma hautapenera"
|
||||||
|
},
|
||||||
|
"clearCanvasDialog": {
|
||||||
|
"title": "Garbitu oihala"
|
||||||
|
},
|
||||||
|
"publishDialog": {
|
||||||
|
"title": "Argitaratu liburutegia",
|
||||||
|
"itemName": "Elementuaren izena",
|
||||||
|
"authorName": "Egilearen izena",
|
||||||
|
"githubUsername": "GitHub-eko erabiltzaile-izena",
|
||||||
|
"twitterUsername": "Twitter-eko erabiltzaile-izena",
|
||||||
|
"libraryName": "Liburutegiaren izena",
|
||||||
|
"libraryDesc": "Liburutegiaren deskripzioa",
|
||||||
|
"website": "Webgunea",
|
||||||
|
"placeholder": {
|
||||||
|
"authorName": "Zure izena edo erabiltzaile-izena",
|
||||||
|
"libraryName": "Zure liburutegiaren izena",
|
||||||
|
"libraryDesc": "Zure liburutegiaren deskripzioa laguntzeko jendeari ulertzen haren erabilpena",
|
||||||
|
"githubHandle": "GitHub heldulekua (aukerakoa), liburutegia editatu ahal izateko berrikustera bidalitakoan",
|
||||||
|
"twitterHandle": "Twitter-eko erabiltzaile-izena (aukerakoa), badakigu nori kreditatu behar dugun Twitter bidez sustatzeko",
|
||||||
|
"website": "Estekatu zure webgunera edo nahi duzun tokira (aukerakoa)"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"required": "Beharrezkoa",
|
||||||
|
"website": "Sartu baliozko URL bat"
|
||||||
|
},
|
||||||
|
"noteDescription": {
|
||||||
|
"pre": "Bidali zure liburutegira sartu ahal izateko ",
|
||||||
|
"link": "zure liburutegiko biltegian",
|
||||||
|
"post": "beste jendeak bere marrazkietan erabili ahal izateko."
|
||||||
|
},
|
||||||
|
"noteGuidelines": {
|
||||||
|
"pre": "Liburutegia eskuz onartu behar da. Irakurri ",
|
||||||
|
"link": "gidalerroak",
|
||||||
|
"post": " bidali aurretik. GitHub kontu bat edukitzea komeni da komunikatzeko eta aldaketak egin ahal izateko, baina ez da guztiz beharrezkoa."
|
||||||
|
},
|
||||||
|
"noteLicense": {
|
||||||
|
"pre": "Bidaltzen baduzu, onartzen duzu liburutegia ",
|
||||||
|
"link": "MIT lizentziarekin argitaratuko dela, ",
|
||||||
|
"post": "zeinak, laburbilduz, esan nahi du edozeinek erabiltzen ahal duela murrizketarik gabe."
|
||||||
|
},
|
||||||
|
"noteItems": "Liburutegiko elementu bakoitzak bere izena eduki behar du iragazi ahal izateko. Liburutegiko hurrengo elementuak barne daude:",
|
||||||
|
"atleastOneLibItem": "Hautatu gutxienez liburutegiko elementu bat gutxienez hasi ahal izateko"
|
||||||
|
},
|
||||||
|
"publishSuccessDialog": {
|
||||||
|
"title": "Liburutegia bidali da",
|
||||||
|
"content": "Eskerrik asko {{authorName}}. Zure liburutegia bidali da berrikustera. Jarraitu dezakezu haren egoera",
|
||||||
|
"link": "hemen"
|
||||||
|
},
|
||||||
|
"confirmDialog": {
|
||||||
|
"resetLibrary": "Leheneratu liburutegia",
|
||||||
|
"removeItemsFromLib": "Kendu hautatutako elementuak liburutegitik"
|
||||||
|
},
|
||||||
|
"encrypted": {
|
||||||
|
"tooltip": "Zure marrazkiak muturretik muturrera enkriptatu dira, beraz Excalidraw-ren zerbitzariek ezingo dituzte ikusi.",
|
||||||
|
"link": "Excalidraw-ren muturretik muturrerako enkriptatzearen gaineko mezua blogean"
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"angle": "Angelua",
|
||||||
|
"element": "Elementua",
|
||||||
|
"elements": "Elementuak",
|
||||||
|
"height": "Altuera",
|
||||||
|
"scene": "Eszena",
|
||||||
|
"selected": "Hautatua",
|
||||||
|
"storage": "Biltegia",
|
||||||
|
"title": "Datuak",
|
||||||
|
"total": "Guztira",
|
||||||
|
"version": "Bertsioa",
|
||||||
|
"versionCopy": "Klikatu kopiatzeko",
|
||||||
|
"versionNotAvailable": "Bertsio ez eskuragarria",
|
||||||
|
"width": "Zabalera"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"addedToLibrary": "Liburutegira gehitu da",
|
||||||
|
"copyStyles": "Estiloak kopiatu dira.",
|
||||||
|
"copyToClipboard": "Arbelean kopiatu da.",
|
||||||
|
"copyToClipboardAsPng": "{{exportSelection}} kopiatu da arbelean PNG gisa\n({{exportColorScheme}})",
|
||||||
|
"fileSaved": "Fitxategia gorde da.",
|
||||||
|
"fileSavedToFilename": "{filename}-n gorde da",
|
||||||
|
"canvas": "oihala",
|
||||||
|
"selection": "hautapena"
|
||||||
|
},
|
||||||
|
"colors": {
|
||||||
|
"ffffff": "Zuria",
|
||||||
|
"f8f9fa": "Grisa 0",
|
||||||
|
"f1f3f5": "Grisa 1",
|
||||||
|
"fff5f5": "Gorria 0",
|
||||||
|
"fff0f6": "Arrosa 0",
|
||||||
|
"f8f0fc": "Mahats kolorea 0",
|
||||||
|
"f3f0ff": "Bioleta 0",
|
||||||
|
"edf2ff": "Indigoa 0",
|
||||||
|
"e7f5ff": "Urdina 0",
|
||||||
|
"e3fafc": "Ziana 0",
|
||||||
|
"e6fcf5": "Berde urdinxka 0",
|
||||||
|
"ebfbee": "Berdea 0",
|
||||||
|
"f4fce3": "Lima 0",
|
||||||
|
"fff9db": "Horia 0",
|
||||||
|
"fff4e6": "Laranja 0",
|
||||||
|
"transparent": "Gardena",
|
||||||
|
"ced4da": "Grisa 4",
|
||||||
|
"868e96": "Grisa 6",
|
||||||
|
"fa5252": "Gorria 6",
|
||||||
|
"e64980": "Arrosa 6",
|
||||||
|
"be4bdb": "Mahats kolorea 6",
|
||||||
|
"7950f2": "Bioleta 6",
|
||||||
|
"4c6ef5": "Indigoa 6",
|
||||||
|
"228be6": "Urdina 6",
|
||||||
|
"15aabf": "Ziana 6",
|
||||||
|
"12b886": "Berde urdinxka 6",
|
||||||
|
"40c057": "Berdea 6",
|
||||||
|
"82c91e": "Lima 6",
|
||||||
|
"fab005": "Horia 6",
|
||||||
|
"fd7e14": "Laranja 6",
|
||||||
|
"000000": "Beltza",
|
||||||
|
"343a40": "Grisa 8",
|
||||||
|
"495057": "Grisa 7",
|
||||||
|
"c92a2a": "Gorria 9",
|
||||||
|
"a61e4d": "Arrosa 9",
|
||||||
|
"862e9c": "Mahats kolorea 9",
|
||||||
|
"5f3dc4": "Bioleta 9",
|
||||||
|
"364fc7": "Indigoa 9",
|
||||||
|
"1864ab": "Urdina 9",
|
||||||
|
"0b7285": "Ziana 9",
|
||||||
|
"087f5b": "Berde urdinxka 9",
|
||||||
|
"2b8a3e": "Berdea 9",
|
||||||
|
"5c940d": "Lima 9",
|
||||||
|
"e67700": "Horia 9",
|
||||||
|
"d9480f": "Laranja 9"
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "نمایش انتخاب کننده رنگ پس زمینه",
|
"showBackground": "نمایش انتخاب کننده رنگ پس زمینه",
|
||||||
"toggleTheme": "تغییر تم",
|
"toggleTheme": "تغییر تم",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "پاکسازی بوم نقاشی",
|
"clearReset": "پاکسازی بوم نقاشی",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "کشیدن",
|
"freedraw": "کشیدن",
|
||||||
"text": "متن",
|
"text": "متن",
|
||||||
"library": "کتابخانه",
|
"library": "کتابخانه",
|
||||||
"lock": "ابزار انتخاب شده را بعد از کشیدن نگه دار"
|
"lock": "ابزار انتخاب شده را بعد از کشیدن نگه دار",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "عملیات روی بوم",
|
"canvasActions": "عملیات روی بوم",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید",
|
"rotate": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید",
|
||||||
"lineEditor_info": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید",
|
"lineEditor_info": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید",
|
||||||
"lineEditor_pointSelected": "برای حذف نقطه Delete برای کپی زدن Ctrl یا Cmd+D را بزنید و یا برای جابجایی بکشید.",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "یک نقطه را برای جابجایی یا حذف انتخاب کنید یا کلید Alt بگیرید و کلیک کنید تا بتوانید یک نقطه جدید اضافه کنید",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "پیش نمایش نشان داده نمی شود",
|
"cannotShowPreview": "پیش نمایش نشان داده نمی شود",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "بلاگ ما را بخوانید",
|
"blog": "بلاگ ما را بخوانید",
|
||||||
"click": "کلیک",
|
"click": "کلیک",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "فلش خمیده",
|
"curvedArrow": "فلش خمیده",
|
||||||
"curvedLine": "منحنی",
|
"curvedLine": "منحنی",
|
||||||
"documentation": "مستندات",
|
"documentation": "مستندات",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Näytä taustavärin valitsin",
|
"showBackground": "Näytä taustavärin valitsin",
|
||||||
"toggleTheme": "Vaihda teema",
|
"toggleTheme": "Vaihda teema",
|
||||||
"personalLib": "Oma kirjasto",
|
"personalLib": "Oma kirjasto",
|
||||||
"excalidrawLib": "Excalidraw kirjasto"
|
"excalidrawLib": "Excalidraw kirjasto",
|
||||||
|
"decreaseFontSize": "Pienennä kirjasinkokoa",
|
||||||
|
"increaseFontSize": "Kasvata kirjasinkokoa",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "Muokkaa linkkiä",
|
||||||
|
"create": "Luo linkki",
|
||||||
|
"label": "Linkki"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Tyhjennä piirtoalue",
|
"clearReset": "Tyhjennä piirtoalue",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Piirrä",
|
"freedraw": "Piirrä",
|
||||||
"text": "Teksti",
|
"text": "Teksti",
|
||||||
"library": "Kirjasto",
|
"library": "Kirjasto",
|
||||||
"lock": "Pidä valittu työkalu aktiivisena piirron jälkeen"
|
"lock": "Pidä valittu työkalu aktiivisena piirron jälkeen",
|
||||||
|
"penMode": "Estä nipistyszoomaus ja vastaanota ainoastaan kynällä piirretty",
|
||||||
|
"link": "Lisää/päivitä linkki valitulle muodolle"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Piirtoalueen toiminnot",
|
"canvasActions": "Piirtoalueen toiminnot",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Voit muuttaa kokoa vapaasti pitämällä SHIFTiä pohjassa, pidä ALT pohjassa muuttaaksesi kokoa keskipisteen ympäri",
|
"resizeImage": "Voit muuttaa kokoa vapaasti pitämällä SHIFTiä pohjassa, pidä ALT pohjassa muuttaaksesi kokoa keskipisteen ympäri",
|
||||||
"rotate": "Voit rajoittaa kulman pitämällä SHIFT pohjassa pyörittäessäsi",
|
"rotate": "Voit rajoittaa kulman pitämällä SHIFT pohjassa pyörittäessäsi",
|
||||||
"lineEditor_info": "Kaksoisnapauta tai paina Enter muokataksesi pisteitä",
|
"lineEditor_info": "Kaksoisnapauta tai paina Enter muokataksesi pisteitä",
|
||||||
"lineEditor_pointSelected": "Paina Delete poistaaksesi pisteen, Ctrl tai Cmd+D monistaaksesi, tai raahaa liikuttaaksesi",
|
"lineEditor_pointSelected": "Poista piste(et) painamalla delete, monista painamalla CtrlOrCmd+D, tai liikuta raahaamalla",
|
||||||
"lineEditor_nothingSelected": "Valitse liikutettava tai poistettava piste, tai pidä ALT-näppäintä alaspainettuna ja napsauta lisätäksesi uusia pisteitä",
|
"lineEditor_nothingSelected": "Valitse muokattava piste (monivalinta pitämällä SHIFT pohjassa), tai paina Alt ja klikkaa lisätäksesi uusia pisteitä",
|
||||||
"placeImage": "Klikkaa asettaaksesi kuvan, tai klikkaa ja raahaa asettaaksesi sen koon manuaalisesti",
|
"placeImage": "Klikkaa asettaaksesi kuvan, tai klikkaa ja raahaa asettaaksesi sen koon manuaalisesti",
|
||||||
"publishLibrary": "Julkaise oma kirjasto"
|
"publishLibrary": "Julkaise oma kirjasto",
|
||||||
|
"bindTextToElement": "Lisää tekstiä painamalla enter",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Esikatselua ei voitu näyttää",
|
"cannotShowPreview": "Esikatselua ei voitu näyttää",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lue blogiamme",
|
"blog": "Lue blogiamme",
|
||||||
"click": "klikkaa",
|
"click": "klikkaa",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Kaareva nuoli",
|
"curvedArrow": "Kaareva nuoli",
|
||||||
"curvedLine": "Kaareva viiva",
|
"curvedLine": "Kaareva viiva",
|
||||||
"documentation": "Käyttöohjeet",
|
"documentation": "Käyttöohjeet",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Afficher le sélecteur de couleur d'arrière-plan",
|
"showBackground": "Afficher le sélecteur de couleur d'arrière-plan",
|
||||||
"toggleTheme": "Changer le thème",
|
"toggleTheme": "Changer le thème",
|
||||||
"personalLib": "Bibliothèque personnelle",
|
"personalLib": "Bibliothèque personnelle",
|
||||||
"excalidrawLib": "Bibliothèque Excalidraw"
|
"excalidrawLib": "Bibliothèque Excalidraw",
|
||||||
|
"decreaseFontSize": "Réduire la taille de police",
|
||||||
|
"increaseFontSize": "Augmenter la taille de police",
|
||||||
|
"unbindText": "Délier le texte",
|
||||||
|
"link": {
|
||||||
|
"edit": "Modifier le lien",
|
||||||
|
"create": "Créer un lien",
|
||||||
|
"label": "Lien"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Réinitialiser le canevas",
|
"clearReset": "Réinitialiser le canevas",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Dessiner",
|
"freedraw": "Dessiner",
|
||||||
"text": "Texte",
|
"text": "Texte",
|
||||||
"library": "Bibliothèque",
|
"library": "Bibliothèque",
|
||||||
"lock": "Garder l'outil sélectionné actif après le dessin"
|
"lock": "Garder l'outil sélectionné actif après le dessin",
|
||||||
|
"penMode": "Empêcher le zoom tactile et accepter la saisie libre uniquement à partir du stylet",
|
||||||
|
"link": "Ajouter/mettre à jour le lien pour une forme sélectionnée"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Actions du canevas",
|
"canvasActions": "Actions du canevas",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Vous pouvez redimensionner librement en maintenant SHIFT,\nmaintenez ALT pour redimensionner depuis le centre",
|
"resizeImage": "Vous pouvez redimensionner librement en maintenant SHIFT,\nmaintenez ALT pour redimensionner depuis le centre",
|
||||||
"rotate": "Vous pouvez restreindre les angles en maintenant MAJ pendant la rotation",
|
"rotate": "Vous pouvez restreindre les angles en maintenant MAJ pendant la rotation",
|
||||||
"lineEditor_info": "Double-cliquez ou appuyez sur Entrée pour éditer les points",
|
"lineEditor_info": "Double-cliquez ou appuyez sur Entrée pour éditer les points",
|
||||||
"lineEditor_pointSelected": "Appuyez sur Supprimer pour supprimer le point, Ctrl ou Cmd+D pour le dupliquer, ou faites-le glisser pour le déplacer",
|
"lineEditor_pointSelected": "Appuyer sur Suppr. pour supprimer des points, Ctrl ou Cmd+D pour dupliquer, ou faire glisser pour déplacer",
|
||||||
"lineEditor_nothingSelected": "Sélectionnez un point à déplacer ou supprimer, ou maintenez Alt et cliquez pour ajouter de nouveaux points",
|
"lineEditor_nothingSelected": "Sélectionner un point pour éditer (maintenir la touche MAJ pour en sélectionner plusieurs),\nou maintenir la touche Alt enfoncée et cliquer pour ajouter de nouveaux points",
|
||||||
"placeImage": "Cliquez pour placer l'image, ou cliquez et faites glisser pour définir sa taille manuellement",
|
"placeImage": "Cliquez pour placer l'image, ou cliquez et faites glisser pour définir sa taille manuellement",
|
||||||
"publishLibrary": "Publier votre propre bibliothèque"
|
"publishLibrary": "Publier votre propre bibliothèque",
|
||||||
|
"bindTextToElement": "Appuyer sur Entrée pour ajouter du texte",
|
||||||
|
"deepBoxSelect": "Maintenir CtrlOuCmd pour sélectionner dans les groupes, et empêcher le déplacement"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Impossible d’afficher l’aperçu",
|
"cannotShowPreview": "Impossible d’afficher l’aperçu",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lire notre blog",
|
"blog": "Lire notre blog",
|
||||||
"click": "clic",
|
"click": "clic",
|
||||||
|
"deepSelect": "Sélection dans les groupes",
|
||||||
|
"deepBoxSelect": "Sélectionner dans les groupes, et empêcher le déplacement",
|
||||||
"curvedArrow": "Flèche courbée",
|
"curvedArrow": "Flèche courbée",
|
||||||
"curvedLine": "Ligne courbée",
|
"curvedLine": "Ligne courbée",
|
||||||
"documentation": "Documentation",
|
"documentation": "Documentation",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "הצג צבעי רקע",
|
"showBackground": "הצג צבעי רקע",
|
||||||
"toggleTheme": "שינוי ערכת העיצוב",
|
"toggleTheme": "שינוי ערכת העיצוב",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "אפס את הלוח",
|
"clearReset": "אפס את הלוח",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "צייר",
|
"freedraw": "צייר",
|
||||||
"text": "טקסט",
|
"text": "טקסט",
|
||||||
"library": "ספריה",
|
"library": "ספריה",
|
||||||
"lock": "השאר את הכלי הנבחר פעיל גם לאחר סיום הציור"
|
"lock": "השאר את הכלי הנבחר פעיל גם לאחר סיום הציור",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "פעולות הלוח",
|
"canvasActions": "פעולות הלוח",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "ניתן להגביל זוויות על ידי לחיצה על SHIFT תוך כדי סיבוב",
|
"rotate": "ניתן להגביל זוויות על ידי לחיצה על SHIFT תוך כדי סיבוב",
|
||||||
"lineEditor_info": "לחץ לחיצה כפולה או אנטר לעריכת הנקודות",
|
"lineEditor_info": "לחץ לחיצה כפולה או אנטר לעריכת הנקודות",
|
||||||
"lineEditor_pointSelected": "לחץ על Delete להסרת נקודה, CtrlOrCmd+D לשכפל, או גרור להזזה",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "בחר נקודה להזזה או הסרה, או החזק את כפתור Alt והקלק להוספת נקודות חדשות",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "לא הצלחנו להציג את התצוגה המקדימה",
|
"cannotShowPreview": "לא הצלחנו להציג את התצוגה המקדימה",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "קרא את הבלוג שלנו",
|
"blog": "קרא את הבלוג שלנו",
|
||||||
"click": "קליק",
|
"click": "קליק",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "חץ מעוגל",
|
"curvedArrow": "חץ מעוגל",
|
||||||
"curvedLine": "קו מעוגל",
|
"curvedLine": "קו מעוגל",
|
||||||
"documentation": "תיעוד",
|
"documentation": "תיעוד",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "कैनवास रीसेट करें",
|
"clearReset": "कैनवास रीसेट करें",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "पाठ",
|
"text": "पाठ",
|
||||||
"library": "लाइब्रेरी",
|
"library": "लाइब्रेरी",
|
||||||
"lock": "ड्राइंग के बाद चयनित टूल को सक्रिय रखें"
|
"lock": "ड्राइंग के बाद चयनित टूल को सक्रिय रखें",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "कैनवास क्रिया",
|
"canvasActions": "कैनवास क्रिया",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "आप घूर्णन करते समय SHIFT पकड़कर कोणों को विवश कर सकते हैं",
|
"rotate": "आप घूर्णन करते समय SHIFT पकड़कर कोणों को विवश कर सकते हैं",
|
||||||
"lineEditor_info": "बिंदुओं को संपादित करने के लिए Enter पर डबल-क्लिक करें या दबाएँ",
|
"lineEditor_info": "बिंदुओं को संपादित करने के लिए Enter पर डबल-क्लिक करें या दबाएँ",
|
||||||
"lineEditor_pointSelected": "बिंदु हटाने के लिए डिलीट दबाएं, प्रतिरूपित करने के लिए कण्ट्रोल या कमांड डी दबाएं या स्थानांतरित करने के लिए खींचे",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "स्थानांतरित करने या हटाने के लिए एक बिंदु का चयन करें, या Alt दबाए रखें और नए बिंदुओं को जोड़ने के लिए क्लिक करें",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "पूर्वावलोकन नहीं दिखा सकते हैं",
|
"cannotShowPreview": "पूर्वावलोकन नहीं दिखा सकते हैं",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "हमारा ब्लॉग पढे",
|
"blog": "हमारा ब्लॉग पढे",
|
||||||
"click": "क्लिक करें",
|
"click": "क्लिक करें",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "वक्र तीर",
|
"curvedArrow": "वक्र तीर",
|
||||||
"curvedLine": "वक्र रेखा",
|
"curvedLine": "वक्र रेखा",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Vászon törlése",
|
"clearReset": "Vászon törlése",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "Szöveg",
|
"text": "Szöveg",
|
||||||
"library": "Könyvtár",
|
"library": "Könyvtár",
|
||||||
"lock": "Rajzolás után az aktív eszközt tartsa kijelölve"
|
"lock": "Rajzolás után az aktív eszközt tartsa kijelölve",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Vászon műveletek",
|
"canvasActions": "Vászon műveletek",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "A SHIFT billentyű lenyomva tartásával korlátozhatja a szögek illesztését",
|
"rotate": "A SHIFT billentyű lenyomva tartásával korlátozhatja a szögek illesztését",
|
||||||
"lineEditor_info": "Kattints duplán, vagy nyomj entert a pontok szerkesztéséhez",
|
"lineEditor_info": "Kattints duplán, vagy nyomj entert a pontok szerkesztéséhez",
|
||||||
"lineEditor_pointSelected": "Nyomd meg a delete gombot a pont eltávolításához, Ctrl vagy Cmd + D-t a duplikáláshoz, vagy húzva mozgasd",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Válassz ki egy pontot a mozgatáshoz vagy törtléshez, vagy az Alt lenyomása mellett kattintva hozz létre új pontokat",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Előnézet nem jeleníthető meg",
|
"cannotShowPreview": "Előnézet nem jeleníthető meg",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+18
-4
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Tampilkan latar pengambil warna",
|
"showBackground": "Tampilkan latar pengambil warna",
|
||||||
"toggleTheme": "Ubah tema",
|
"toggleTheme": "Ubah tema",
|
||||||
"personalLib": "Pustaka Pribadi",
|
"personalLib": "Pustaka Pribadi",
|
||||||
"excalidrawLib": "Pustaka Excalidraw"
|
"excalidrawLib": "Pustaka Excalidraw",
|
||||||
|
"decreaseFontSize": "Kecilkan ukuran font",
|
||||||
|
"increaseFontSize": "Besarkan ukuran font",
|
||||||
|
"unbindText": "Lepas teks",
|
||||||
|
"link": {
|
||||||
|
"edit": "Edit tautan",
|
||||||
|
"create": "Buat tautan",
|
||||||
|
"label": "Tautan"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Setel Ulang Kanvas",
|
"clearReset": "Setel Ulang Kanvas",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Gambar",
|
"freedraw": "Gambar",
|
||||||
"text": "Teks",
|
"text": "Teks",
|
||||||
"library": "Pustaka",
|
"library": "Pustaka",
|
||||||
"lock": "Biarkan alat yang dipilih aktif setelah menggambar"
|
"lock": "Biarkan alat yang dipilih aktif setelah menggambar",
|
||||||
|
"penMode": "Cegah jepit perbesar dan terima hanya input freedraw dari pena",
|
||||||
|
"link": "Tambah/Perbarui tautan untuk bentuk yang dipilih"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Opsi Kanvas",
|
"canvasActions": "Opsi Kanvas",
|
||||||
@@ -205,9 +215,11 @@
|
|||||||
"rotate": "Anda dapat menjaga sudut dengan menahan SHIFT sambil memutar",
|
"rotate": "Anda dapat menjaga sudut dengan menahan SHIFT sambil memutar",
|
||||||
"lineEditor_info": "Klik ganda atau tekan Enter untuk mengedit titik",
|
"lineEditor_info": "Klik ganda atau tekan Enter untuk mengedit titik",
|
||||||
"lineEditor_pointSelected": "Tekan Delete untuk menghapus titik, Ctrl/Cmd + D untuk menduplikasi, atau seret untuk memindahkan",
|
"lineEditor_pointSelected": "Tekan Delete untuk menghapus titik, Ctrl/Cmd + D untuk menduplikasi, atau seret untuk memindahkan",
|
||||||
"lineEditor_nothingSelected": "Pilih sebuah titik untuk memindah atau menghapus, atau tekan Alt dan klik untuk menambahkan titik baru",
|
"lineEditor_nothingSelected": "Pilih titik untuk mengedit (tekan SHIFT untuk pilih banyak), atau tekan Alt dan klik untuk tambahkan titik baru",
|
||||||
"placeImage": "Klik untuk tempatkan gambar, atau klik dan jatuhkan untuk tetapkan ukuran secara manual",
|
"placeImage": "Klik untuk tempatkan gambar, atau klik dan jatuhkan untuk tetapkan ukuran secara manual",
|
||||||
"publishLibrary": "Terbitkan pustaka Anda"
|
"publishLibrary": "Terbitkan pustaka Anda",
|
||||||
|
"bindTextToElement": "Tekan enter untuk tambahkan teks",
|
||||||
|
"deepBoxSelect": "Tekan Ctrl atau Cmd untuk memilih yang di dalam, dan mencegah penggeseran"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Tidak dapat menampilkan pratinjau",
|
"cannotShowPreview": "Tidak dapat menampilkan pratinjau",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Baca blog kami",
|
"blog": "Baca blog kami",
|
||||||
"click": "klik",
|
"click": "klik",
|
||||||
|
"deepSelect": "Pilih dalam",
|
||||||
|
"deepBoxSelect": "Pilih dalam kotak, dan cegah penggeseran",
|
||||||
"curvedArrow": "Panah lengkung",
|
"curvedArrow": "Panah lengkung",
|
||||||
"curvedLine": "Garis lengkung",
|
"curvedLine": "Garis lengkung",
|
||||||
"documentation": "Dokumentasi",
|
"documentation": "Dokumentasi",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Mostra selettore colore di sfondo",
|
"showBackground": "Mostra selettore colore di sfondo",
|
||||||
"toggleTheme": "Cambia tema",
|
"toggleTheme": "Cambia tema",
|
||||||
"personalLib": "Libreria Personale",
|
"personalLib": "Libreria Personale",
|
||||||
"excalidrawLib": "Libreria di Excalidraw"
|
"excalidrawLib": "Libreria di Excalidraw",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Svuota la tela",
|
"clearReset": "Svuota la tela",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Disegno",
|
"freedraw": "Disegno",
|
||||||
"text": "Testo",
|
"text": "Testo",
|
||||||
"library": "Libreria",
|
"library": "Libreria",
|
||||||
"lock": "Mantieni lo strumento selezionato attivo dopo aver disegnato"
|
"lock": "Mantieni lo strumento selezionato attivo dopo aver disegnato",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Azioni sulla Tela",
|
"canvasActions": "Azioni sulla Tela",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Puoi ridimensionare liberamente tenendo premuto SHIFT,\ntieni premuto ALT per ridimensionare dal centro",
|
"resizeImage": "Puoi ridimensionare liberamente tenendo premuto SHIFT,\ntieni premuto ALT per ridimensionare dal centro",
|
||||||
"rotate": "Puoi mantenere gli angoli tenendo premuto SHIFT durante la rotazione",
|
"rotate": "Puoi mantenere gli angoli tenendo premuto SHIFT durante la rotazione",
|
||||||
"lineEditor_info": "Fai doppio click o premi invio per modificare i punti",
|
"lineEditor_info": "Fai doppio click o premi invio per modificare i punti",
|
||||||
"lineEditor_pointSelected": "Premere Elimina per rimuovere il punto, CtrlOrCmd+D per duplicare o trascinare per spostare",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Seleziona un punto per spostare o rimuovere, oppure tieni premuto Alt e fai clic per aggiungere nuovi punti",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "Fai click per posizionare l'immagine, o click e trascina per impostarne la dimensione manualmente",
|
"placeImage": "Fai click per posizionare l'immagine, o click e trascina per impostarne la dimensione manualmente",
|
||||||
"publishLibrary": "Pubblica la tua libreria"
|
"publishLibrary": "Pubblica la tua libreria",
|
||||||
|
"bindTextToElement": "Premi invio per aggiungere il testo",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Impossibile visualizzare l'anteprima",
|
"cannotShowPreview": "Impossibile visualizzare l'anteprima",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Leggi il nostro blog",
|
"blog": "Leggi il nostro blog",
|
||||||
"click": "click",
|
"click": "click",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Freccia curva",
|
"curvedArrow": "Freccia curva",
|
||||||
"curvedLine": "Linea curva",
|
"curvedLine": "Linea curva",
|
||||||
"documentation": "Documentazione",
|
"documentation": "Documentazione",
|
||||||
|
|||||||
+20
-6
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "背景色ピッカーを表示",
|
"showBackground": "背景色ピッカーを表示",
|
||||||
"toggleTheme": "テーマの切り替え",
|
"toggleTheme": "テーマの切り替え",
|
||||||
"personalLib": "個人ライブラリ",
|
"personalLib": "個人ライブラリ",
|
||||||
"excalidrawLib": "Excalidrawライブラリ"
|
"excalidrawLib": "Excalidrawライブラリ",
|
||||||
|
"decreaseFontSize": "フォントサイズを縮小",
|
||||||
|
"increaseFontSize": "フォントサイズを拡大",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "リンクを編集",
|
||||||
|
"create": "リンクを作成",
|
||||||
|
"label": "リンク"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "キャンバスのリセット",
|
"clearReset": "キャンバスのリセット",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "描画",
|
"freedraw": "描画",
|
||||||
"text": "テキスト",
|
"text": "テキスト",
|
||||||
"library": "ライブラリ",
|
"library": "ライブラリ",
|
||||||
"lock": "描画後も使用中のツールを選択したままにする"
|
"lock": "描画後も使用中のツールを選択したままにする",
|
||||||
|
"penMode": "ピンチとズームを抑止し、ペンからのみ自由な入力を受け付けます",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "キャンバス操作",
|
"canvasActions": "キャンバス操作",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "SHIFTを長押しすると自由にサイズを変更できます。\n中央からサイズを変更するにはALTを長押しします",
|
"resizeImage": "SHIFTを長押しすると自由にサイズを変更できます。\n中央からサイズを変更するにはALTを長押しします",
|
||||||
"rotate": "回転中にSHIFT キーを押すと角度を制限することができます",
|
"rotate": "回転中にSHIFT キーを押すと角度を制限することができます",
|
||||||
"lineEditor_info": "ポイントを編集するには、ダブルクリックまたはEnterキーを押します",
|
"lineEditor_info": "ポイントを編集するには、ダブルクリックまたはEnterキーを押します",
|
||||||
"lineEditor_pointSelected": "削除ボタンを押して点を削除します。Ctrl+D または Cmd+D で複製します。またはドラッグして移動します",
|
"lineEditor_pointSelected": "Deleteキーを押すと点を削除、CtrlOrCmd+Dで複製、マウスドラッグで移動",
|
||||||
"lineEditor_nothingSelected": "移動または削除する点を選択するか、Altキーを押しながらクリックして新しい点を追加します",
|
"lineEditor_nothingSelected": "編集する点を選択(SHIFTを押したままで複数選択)、\nAltキーを押しながらクリックすると新しい点を追加",
|
||||||
"placeImage": "クリックして画像を配置するか、クリックしてドラッグしてサイズを手動で設定します",
|
"placeImage": "クリックして画像を配置するか、クリックしてドラッグしてサイズを手動で設定します",
|
||||||
"publishLibrary": "自分のライブラリを公開"
|
"publishLibrary": "自分のライブラリを公開",
|
||||||
|
"bindTextToElement": "Enterを押してテキストを追加",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "プレビューを表示できません",
|
"cannotShowPreview": "プレビューを表示できません",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "公式ブログを読む",
|
"blog": "公式ブログを読む",
|
||||||
"click": "クリック",
|
"click": "クリック",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "カーブした矢印",
|
"curvedArrow": "カーブした矢印",
|
||||||
"curvedLine": "曲線",
|
"curvedLine": "曲線",
|
||||||
"documentation": "ドキュメント",
|
"documentation": "ドキュメント",
|
||||||
@@ -292,7 +306,7 @@
|
|||||||
"libraryDesc": "ライブラリの使い方を理解するための説明",
|
"libraryDesc": "ライブラリの使い方を理解するための説明",
|
||||||
"githubHandle": "GitHubハンドル(任意)。一度レビューのために送信されると、ライブラリを編集できます",
|
"githubHandle": "GitHubハンドル(任意)。一度レビューのために送信されると、ライブラリを編集できます",
|
||||||
"twitterHandle": "Twitterのユーザー名 (任意)。Twitterでプロモーションする際にクレジットする人を知っておくためのものです",
|
"twitterHandle": "Twitterのユーザー名 (任意)。Twitterでプロモーションする際にクレジットする人を知っておくためのものです",
|
||||||
"website": "個人のウェブサイトまたは他のサイトへのリンク (オプション)"
|
"website": "個人のウェブサイトまたは他のサイトへのリンク (任意)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "必須項目",
|
"required": "必須項目",
|
||||||
|
|||||||
+66
-52
@@ -35,7 +35,7 @@
|
|||||||
"arrowhead_arrow": "Taneccabt",
|
"arrowhead_arrow": "Taneccabt",
|
||||||
"arrowhead_bar": "Afeggag",
|
"arrowhead_bar": "Afeggag",
|
||||||
"arrowhead_dot": "Tanqiḍt",
|
"arrowhead_dot": "Tanqiḍt",
|
||||||
"arrowhead_triangle": "",
|
"arrowhead_triangle": "Akerdis",
|
||||||
"fontSize": "Tiddi n tsefsit",
|
"fontSize": "Tiddi n tsefsit",
|
||||||
"fontFamily": "Tawacult n tsefsiyin",
|
"fontFamily": "Tawacult n tsefsiyin",
|
||||||
"onlySelected": "Tafrayt kan",
|
"onlySelected": "Tafrayt kan",
|
||||||
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "Beqqeḍ amelqaḍ n yini n yizirig",
|
"showStroke": "Beqqeḍ amelqaḍ n yini n yizirig",
|
||||||
"showBackground": "Beqqeḍ amelqaḍ n yini n ugilal",
|
"showBackground": "Beqqeḍ amelqaḍ n yini n ugilal",
|
||||||
"toggleTheme": "Snifel asentel",
|
"toggleTheme": "Snifel asentel",
|
||||||
"personalLib": "",
|
"personalLib": "Tamkarḍit tudmawant",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Tamkarḍit n Excalidraw",
|
||||||
|
"decreaseFontSize": "Senqes tiddi n tsefsit",
|
||||||
|
"increaseFontSize": "Sali tiddi n tsefsit",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "Ẓreg aseɣwen",
|
||||||
|
"create": "Snulfu-d aseɣwen",
|
||||||
|
"label": "Aseɣwen"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Ales awennez n teɣzut n usuneɣ",
|
"clearReset": "Ales awennez n teɣzut n usuneɣ",
|
||||||
@@ -138,10 +146,10 @@
|
|||||||
"exitZenMode": "Ffeɣ seg uskar Zen",
|
"exitZenMode": "Ffeɣ seg uskar Zen",
|
||||||
"cancel": "Sefsex",
|
"cancel": "Sefsex",
|
||||||
"clear": "Sfeḍ",
|
"clear": "Sfeḍ",
|
||||||
"remove": "",
|
"remove": "Kkes",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "Ẓreg",
|
||||||
"submit": "",
|
"submit": "Azen",
|
||||||
"confirm": ""
|
"confirm": "Sentem"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Ayagi ad isfeḍ akk taɣzut n usuneɣ. Tetḥeqqeḍ?",
|
"clearReset": "Ayagi ad isfeḍ akk taɣzut n usuneɣ. Tetḥeqqeḍ?",
|
||||||
@@ -163,7 +171,7 @@
|
|||||||
"cannotRestoreFromImage": "Asayes ulamek ara d-yettwarr seg ufaylu-agi n tugna",
|
"cannotRestoreFromImage": "Asayes ulamek ara d-yettwarr seg ufaylu-agi n tugna",
|
||||||
"invalidSceneUrl": "Ulamek taktert n usayes seg URL i d-ittunefken. Ahat mačči d tameɣtut neɣ ur tegbir ara isefka JSON n Excalidraw.",
|
"invalidSceneUrl": "Ulamek taktert n usayes seg URL i d-ittunefken. Ahat mačči d tameɣtut neɣ ur tegbir ara isefka JSON n Excalidraw.",
|
||||||
"resetLibrary": "Ayagi ad isfeḍ tamkarḍit-inek•m. Tetḥeqqeḍ?",
|
"resetLibrary": "Ayagi ad isfeḍ tamkarḍit-inek•m. Tetḥeqqeḍ?",
|
||||||
"removeItemsFromsLibrary": "",
|
"removeItemsFromsLibrary": "Ad tekkseḍ {{count}} n uferdis (en) si temkarḍit?",
|
||||||
"invalidEncryptionKey": "Tasarut n uwgelhen isefk ad tesɛu 22 n yiekkilen. Amɛiwen srid yensa."
|
"invalidEncryptionKey": "Tasarut n uwgelhen isefk ad tesɛu 22 n yiekkilen. Amɛiwen srid yensa."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
@@ -171,7 +179,7 @@
|
|||||||
"imageInsertError": "D awezɣi tugra n tugna. Eɛreḍ tikkelt-nniḍen ardeqqal...",
|
"imageInsertError": "D awezɣi tugra n tugna. Eɛreḍ tikkelt-nniḍen ardeqqal...",
|
||||||
"fileTooBig": "Afaylu meqqer aṭas. Tiddi tafellayt yurgen d {{maxSize}}.",
|
"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.",
|
"svgImageInsertError": "D awezɣi tugra n tugna SVG. Acraḍ SVG yettban-d d armeɣtu.",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": "SVG armeɣtu."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Tafrayt",
|
"selection": "Tafrayt",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Suneɣ",
|
"freedraw": "Suneɣ",
|
||||||
"text": "Aḍris",
|
"text": "Aḍris",
|
||||||
"library": "Tamkarḍit",
|
"library": "Tamkarḍit",
|
||||||
"lock": "Eǧǧ afecku n tefrayt yermed mbaɛd asuneɣ"
|
"lock": "Eǧǧ afecku n tefrayt yermed mbaɛd asuneɣ",
|
||||||
|
"penMode": "",
|
||||||
|
"link": "Rnu/leqqem aseɣwen i talɣa yettwafernen"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Tigawin n teɣzut n usuneɣ",
|
"canvasActions": "Tigawin n teɣzut n usuneɣ",
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
"shapes": "Talɣiwin"
|
"shapes": "Talɣiwin"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "",
|
"canvasPanning": "Akken ad tesmuttiḍ taɣzut n usuneɣ, ṭṭef ṛṛuda n umumed, neɣ afeggag n tallunt mi ara tzuɣreḍ",
|
||||||
"linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig",
|
"linearElement": "Ssit akken ad tebduḍ aṭas n tenqiḍin, zuɣer i yiwen n yizirig",
|
||||||
"freeDraw": "Ssit yerna zuɣer, serreḥ ticki tfukeḍ",
|
"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",
|
"text": "Tixidest: tzemreḍ daɣen ad ternuḍ aḍris s usiti snat n tikkal anida tebɣiḍ s ufecku n tefrayt",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Tzemreḍ ad talseḍ tiddi s tilelli s tuṭṭfa n SHIFT,\nṭṭef ALT akken ad talseḍ tiddi si tlemmast",
|
"resizeImage": "Tzemreḍ ad talseḍ tiddi s tilelli s tuṭṭfa n SHIFT,\nṭṭef ALT akken ad talseḍ tiddi si tlemmast",
|
||||||
"rotate": "Tzemreḍ ad tḥettemeḍ tiɣemmar s tuṭṭfa n SHIFT di tuzzya",
|
"rotate": "Tzemreḍ ad tḥettemeḍ tiɣemmar s tuṭṭfa n SHIFT di tuzzya",
|
||||||
"lineEditor_info": "Ssit snat n tikkal neɣ ssed taqeffalt Kcem akken ad tẓergeḍ tinqiḍin",
|
"lineEditor_info": "Ssit snat n tikkal neɣ ssed taqeffalt Kcem akken ad tẓergeḍ tinqiḍin",
|
||||||
"lineEditor_pointSelected": "Ssed taqeffalt kkes akken ad tekkseḍ tanqiḍt, CtrlOrCmd+D akken ad tsiselgeḍ, neɣ zuɣer akken ad tesmuttiḍ",
|
"lineEditor_pointSelected": "Ssed taqeffalt kkes akken ad tekkseḍ tanqiḍ (tinqiḍin),\nCtrlOrCmd+D akken ad tsiselgeḍ, neɣ zuɣer akken ad tesmuttiḍ",
|
||||||
"lineEditor_nothingSelected": "Fren tanqiḍt ara tesmuttiḍ neɣ ara tekkseḍ, neɣ ṭṭef taqeffalt Alt akken ad ternuḍ tinqiḍin timaynutin",
|
"lineEditor_nothingSelected": "Fren tanqiḍt akken ad tẓergeḍ (ṭṭef SHIFT akken ad tferneḍ aṭas),\nneɣ ṭṭef Alt akken ad ternuḍ tinqiḍin timaynutin",
|
||||||
"placeImage": "Ssit akken ad tserseḍ tugna, neɣ ssit u zuɣer akken ad tesbaduḍ tiddi-ines s ufus",
|
"placeImage": "Ssit akken ad tserseḍ tugna, neɣ ssit u zuɣer akken ad tesbaduḍ tiddi-ines s ufus",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "Siẓreg tamkarḍit-inek•inem",
|
||||||
|
"bindTextToElement": "Ssed ɣef kcem akken ad ternuḍ aḍris",
|
||||||
|
"deepBoxSelect": "Ṭṭef CtrlOrCmd akken ad tferneḍ s telqey, yerna ad trewleḍ i uzuɣer"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Ulamek abeqqeḍ n teskant",
|
"cannotShowPreview": "Ulamek abeqqeḍ n teskant",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Ɣeṛ ablug-nneɣ",
|
"blog": "Ɣeṛ ablug-nneɣ",
|
||||||
"click": "ssit",
|
"click": "ssit",
|
||||||
|
"deepSelect": "Afran s telqey",
|
||||||
|
"deepBoxSelect": "Afran s telqey s tnaka, yerna ad tyrewleḍ i uzuɣer",
|
||||||
"curvedArrow": "Taneccabt izelgen",
|
"curvedArrow": "Taneccabt izelgen",
|
||||||
"curvedLine": "Izirig izelgen",
|
"curvedLine": "Izirig izelgen",
|
||||||
"documentation": "Tasemlit",
|
"documentation": "Tasemlit",
|
||||||
@@ -275,55 +289,55 @@
|
|||||||
"zoomToSelection": "Simɣur ɣer tefrayt"
|
"zoomToSelection": "Simɣur ɣer tefrayt"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": "Sfeḍ taɣzut n usuneɣ"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "Suffeɣ-d tamkarḍit",
|
||||||
"itemName": "",
|
"itemName": "Isem n uferdis",
|
||||||
"authorName": "",
|
"authorName": "Isem n umeskar",
|
||||||
"githubUsername": "",
|
"githubUsername": "Isem n useqdac n GitHub",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "Isem n useqdac n Twitter",
|
||||||
"libraryName": "",
|
"libraryName": "Isem n temkarḍit",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Aglam n temkarḍit",
|
||||||
"website": "",
|
"website": "Asmel n web",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "",
|
"authorName": "Isem neɣ isem n useqdac inek•inem",
|
||||||
"libraryName": "",
|
"libraryName": "Isem n temkarḍit-inek•inem",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Aglam n temkarḍit-inek•inem akken ad tɛiwneḍ medden ad fehmen aseqdec-inec",
|
||||||
"githubHandle": "",
|
"githubHandle": "Isem n useqdac n GitHub ( d anefrunan) akken ad tizmireḍ ad tisẓrigeḍ tamkarḍit ticki tuzneḍ-tt i uselken",
|
||||||
"twitterHandle": "",
|
"twitterHandle": "Isem n useqdac n Twitter (d anefrunan) akken ad nẓer anwa ara nsenmer deg udellel di Twitter",
|
||||||
"website": ""
|
"website": "Aseɣwen ɣer usmel-inek•inem neɣ wayeḍ (d anefrunan)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "Yettwasra",
|
||||||
"website": ""
|
"website": "Sekcem URL ameɣtu"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "",
|
"pre": "Azen tamkarḍit-inek•inem akken ad teddu di ",
|
||||||
"link": "",
|
"link": "akaram azayez n temkarḍit",
|
||||||
"post": ""
|
"post": "i yimdanen-nniḍen ara isqedcen deg wunuɣen-nnsen."
|
||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "Tamkarḍit teḥwaǧ ad tettwaqbel s ufus qbel. Ma ulac uɣilif ɣer ",
|
||||||
"link": "",
|
"link": "",
|
||||||
"post": ""
|
"post": " send ad tazneḍ. Tesriḍ amiḍan n GitHub akken ad tmmeslayeḍ yerna ad tgeḍ ibeddilen ma yelaq, maca mačči d ayen yettwaḥetmen."
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "Mi tuzneḍ ad tqebleḍ akken tamkarḍit ad d-teffeɣ s ",
|
||||||
"link": "",
|
"link": "Turagt MIT, ",
|
||||||
"post": ""
|
"post": "ayen yebɣan ad d-yini belli yal yiwen izmer ad ten-iseqdec war tilist."
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "Yal aferdis n temkarḍit isefk ad isɛu isem-is i yiman-is akken ad yili wamek ara yettusizdeg. Iferdisen-agi n temkarḍit ad ddun:",
|
||||||
"atleastOneLibItem": ""
|
"atleastOneLibItem": "Ma ulac uɣilif fern ma drus yiwen n uferdis n temkarḍit akken ad tebduḍ"
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "Tamkarḍit tettwazen",
|
||||||
"content": "",
|
"content": "Tanemmirt-ik•im {{authorName}}. Tamkarḍit-inek•inem tettwazen i weselken. Tzemreḍ ad tḍefreḍ aẓayer",
|
||||||
"link": ""
|
"link": "dagi"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Ales awennez n temkarḍit",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "Kkes iferdisen yettafernen si temkarḍit"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "Unuɣen-inek (m) ttuwgelhnen seg yixef s ixef dɣa iqeddacen n Excalidraw werǧin ad ten-walin. ",
|
"tooltip": "Unuɣen-inek (m) ttuwgelhnen seg yixef s ixef dɣa iqeddacen n Excalidraw werǧin ad ten-walin. ",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "Tehri"
|
"width": "Tehri"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "Yettwarna ɣer temkarḍit",
|
||||||
"copyStyles": "Iɣunab yettwaneɣlen.",
|
"copyStyles": "Iɣunab yettwaneɣlen.",
|
||||||
"copyToClipboard": "Yettwaɣel ɣer tecfawit.",
|
"copyToClipboard": "Yettwaɣel ɣer tecfawit.",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} yettwanɣel ɣer tecfawit am PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} yettwanɣel ɣer tecfawit am PNG\n({{exportColorScheme}})",
|
||||||
@@ -360,14 +374,14 @@
|
|||||||
"f1f3f5": "Aɣiɣdi 1",
|
"f1f3f5": "Aɣiɣdi 1",
|
||||||
"fff5f5": "Azeggaɣ",
|
"fff5f5": "Azeggaɣ",
|
||||||
"fff0f6": "Axuxi 0",
|
"fff0f6": "Axuxi 0",
|
||||||
"f8f0fc": "",
|
"f8f0fc": "Tiẓurin 0",
|
||||||
"f3f0ff": "Amidadi 0",
|
"f3f0ff": "Amidadi 0",
|
||||||
"edf2ff": "",
|
"edf2ff": "",
|
||||||
"e7f5ff": "Anili 0",
|
"e7f5ff": "Anili 0",
|
||||||
"e3fafc": "",
|
"e3fafc": "",
|
||||||
"e6fcf5": "",
|
"e6fcf5": "",
|
||||||
"ebfbee": "Azegzaw 0",
|
"ebfbee": "Azegzaw 0",
|
||||||
"f4fce3": "",
|
"f4fce3": "Llim 0",
|
||||||
"fff9db": "Awraɣ 0",
|
"fff9db": "Awraɣ 0",
|
||||||
"fff4e6": "Aččinawi 0",
|
"fff4e6": "Aččinawi 0",
|
||||||
"transparent": "Afrawan",
|
"transparent": "Afrawan",
|
||||||
@@ -382,7 +396,7 @@
|
|||||||
"15aabf": "",
|
"15aabf": "",
|
||||||
"12b886": "",
|
"12b886": "",
|
||||||
"40c057": "Azegzaw 0",
|
"40c057": "Azegzaw 0",
|
||||||
"82c91e": "",
|
"82c91e": "Llim 6",
|
||||||
"fab005": "Awraɣ 6",
|
"fab005": "Awraɣ 6",
|
||||||
"fd7e14": "Aččinawi 6",
|
"fd7e14": "Aččinawi 6",
|
||||||
"000000": "Aberkan",
|
"000000": "Aberkan",
|
||||||
@@ -390,14 +404,14 @@
|
|||||||
"495057": "Aɣiɣdi 7",
|
"495057": "Aɣiɣdi 7",
|
||||||
"c92a2a": "Azeggaɣ 9",
|
"c92a2a": "Azeggaɣ 9",
|
||||||
"a61e4d": "Axuxi 9",
|
"a61e4d": "Axuxi 9",
|
||||||
"862e9c": "",
|
"862e9c": "Tiẓurin 9",
|
||||||
"5f3dc4": "Amidadi 9",
|
"5f3dc4": "Amidadi 9",
|
||||||
"364fc7": "",
|
"364fc7": "",
|
||||||
"1864ab": "Anili 9",
|
"1864ab": "Anili 9",
|
||||||
"0b7285": "",
|
"0b7285": "",
|
||||||
"087f5b": "",
|
"087f5b": "",
|
||||||
"2b8a3e": "Azegzaw 9",
|
"2b8a3e": "Azegzaw 9",
|
||||||
"5c940d": "",
|
"5c940d": "Llim 9",
|
||||||
"e67700": "Awraɣ 9",
|
"e67700": "Awraɣ 9",
|
||||||
"d9480f": "Aččinawi 9"
|
"d9480f": "Aččinawi 9"
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "Мәтін",
|
"text": "Мәтін",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Біздің блогты оқу",
|
"blog": "Біздің блогты оқу",
|
||||||
"click": "шерту",
|
"click": "шерту",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Майысқан нұсқар",
|
"curvedArrow": "Майысқан нұсқар",
|
||||||
"curvedLine": "Майысқан сызық",
|
"curvedLine": "Майысқан сызық",
|
||||||
"documentation": "Құжаттама",
|
"documentation": "Құжаттама",
|
||||||
|
|||||||
+75
-61
@@ -35,11 +35,11 @@
|
|||||||
"arrowhead_arrow": "화살표",
|
"arrowhead_arrow": "화살표",
|
||||||
"arrowhead_bar": "막대",
|
"arrowhead_bar": "막대",
|
||||||
"arrowhead_dot": "점",
|
"arrowhead_dot": "점",
|
||||||
"arrowhead_triangle": "",
|
"arrowhead_triangle": "삼각형",
|
||||||
"fontSize": "글자 크기",
|
"fontSize": "글자 크기",
|
||||||
"fontFamily": "글꼴",
|
"fontFamily": "글꼴",
|
||||||
"onlySelected": "선택한 항목만",
|
"onlySelected": "선택한 항목만",
|
||||||
"withBackground": "",
|
"withBackground": "배경",
|
||||||
"exportEmbedScene": "",
|
"exportEmbedScene": "",
|
||||||
"exportEmbedScene_details": "화면 정보가 내보내는 PNG/SVG 파일에 저장되어 이후에 파일에서 화면을 복구할 수 있습니다. 파일 크기가 증가합니다.",
|
"exportEmbedScene_details": "화면 정보가 내보내는 PNG/SVG 파일에 저장되어 이후에 파일에서 화면을 복구할 수 있습니다. 파일 크기가 증가합니다.",
|
||||||
"addWatermark": "\"Made with Excalidraw\" 추가",
|
"addWatermark": "\"Made with Excalidraw\" 추가",
|
||||||
@@ -62,14 +62,14 @@
|
|||||||
"architect": "건축가",
|
"architect": "건축가",
|
||||||
"artist": "예술가",
|
"artist": "예술가",
|
||||||
"cartoonist": "만화가",
|
"cartoonist": "만화가",
|
||||||
"fileTitle": "",
|
"fileTitle": "파일 이름",
|
||||||
"colorPicker": "색상 선택기",
|
"colorPicker": "색상 선택기",
|
||||||
"canvasBackground": "캔버스 배경",
|
"canvasBackground": "캔버스 배경",
|
||||||
"drawingCanvas": "캔버스 그리기",
|
"drawingCanvas": "캔버스 그리기",
|
||||||
"layers": "레이어",
|
"layers": "레이어",
|
||||||
"actions": "동작",
|
"actions": "동작",
|
||||||
"language": "언어",
|
"language": "언어",
|
||||||
"liveCollaboration": "",
|
"liveCollaboration": "라이브 협력",
|
||||||
"duplicateSelection": "복제",
|
"duplicateSelection": "복제",
|
||||||
"untitled": "제목 없음",
|
"untitled": "제목 없음",
|
||||||
"name": "이름",
|
"name": "이름",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
"group": "그룹 생성",
|
"group": "그룹 생성",
|
||||||
"ungroup": "그룹 해제",
|
"ungroup": "그룹 해제",
|
||||||
"collaborators": "공동 작업자",
|
"collaborators": "공동 작업자",
|
||||||
"showGrid": "",
|
"showGrid": "그리드 보기",
|
||||||
"addToLibrary": "라이브러리에 추가",
|
"addToLibrary": "라이브러리에 추가",
|
||||||
"removeFromLibrary": "라이브러리에서 제거",
|
"removeFromLibrary": "라이브러리에서 제거",
|
||||||
"libraryLoadingMessage": "라이브러리 불러오는 중…",
|
"libraryLoadingMessage": "라이브러리 불러오는 중…",
|
||||||
@@ -93,28 +93,36 @@
|
|||||||
"centerHorizontally": "수평으로 중앙 정렬",
|
"centerHorizontally": "수평으로 중앙 정렬",
|
||||||
"distributeHorizontally": "수평으로 분배",
|
"distributeHorizontally": "수평으로 분배",
|
||||||
"distributeVertically": "수직으로 분배",
|
"distributeVertically": "수직으로 분배",
|
||||||
"flipHorizontal": "",
|
"flipHorizontal": "좌우반전",
|
||||||
"flipVertical": "",
|
"flipVertical": "상하반전",
|
||||||
"viewMode": "보기 모드",
|
"viewMode": "보기 모드",
|
||||||
"toggleExportColorScheme": "",
|
"toggleExportColorScheme": "",
|
||||||
"share": "",
|
"share": "공유",
|
||||||
"showStroke": "",
|
"showStroke": "",
|
||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "개인 라이브러리",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Excalidraw 라이브러리",
|
||||||
|
"decreaseFontSize": "폰트 사이즈 줄이기",
|
||||||
|
"increaseFontSize": "폰트 사이즈 키우기",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "캔버스 초기화",
|
"clearReset": "캔버스 초기화",
|
||||||
"exportJSON": "",
|
"exportJSON": "파일로 익스포트",
|
||||||
"exportImage": "",
|
"exportImage": "이미지로 저장",
|
||||||
"export": "내보내기",
|
"export": "내보내기",
|
||||||
"exportToPng": "PNG로 내보내기",
|
"exportToPng": "PNG로 내보내기",
|
||||||
"exportToSvg": "SVG로 내보내기",
|
"exportToSvg": "SVG로 내보내기",
|
||||||
"copyToClipboard": "클립보드로 복사",
|
"copyToClipboard": "클립보드로 복사",
|
||||||
"copyPngToClipboard": "클립보드로 PNG 이미지 복사",
|
"copyPngToClipboard": "클립보드로 PNG 이미지 복사",
|
||||||
"scale": "크기",
|
"scale": "크기",
|
||||||
"save": "",
|
"save": "현재 파일에 저장",
|
||||||
"saveAs": "다른 이름으로 저장",
|
"saveAs": "다른 이름으로 저장",
|
||||||
"load": "불러오기",
|
"load": "불러오기",
|
||||||
"getShareableLink": "공유 가능한 링크 생성",
|
"getShareableLink": "공유 가능한 링크 생성",
|
||||||
@@ -129,19 +137,19 @@
|
|||||||
"edit": "수정",
|
"edit": "수정",
|
||||||
"undo": "실행 취소",
|
"undo": "실행 취소",
|
||||||
"redo": "다시 실행",
|
"redo": "다시 실행",
|
||||||
"resetLibrary": "",
|
"resetLibrary": "라이브러리 리셋",
|
||||||
"createNewRoom": "방 만들기",
|
"createNewRoom": "방 만들기",
|
||||||
"fullScreen": "전체화면",
|
"fullScreen": "전체화면",
|
||||||
"darkMode": "다크 모드",
|
"darkMode": "다크 모드",
|
||||||
"lightMode": "밝은 모드",
|
"lightMode": "밝은 모드",
|
||||||
"zenMode": "젠 모드",
|
"zenMode": "젠 모드",
|
||||||
"exitZenMode": "젠 모드 종료하기",
|
"exitZenMode": "젠 모드 종료하기",
|
||||||
"cancel": "",
|
"cancel": "취소",
|
||||||
"clear": "",
|
"clear": "지우기",
|
||||||
"remove": "",
|
"remove": "삭제",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "게시하기",
|
||||||
"submit": "",
|
"submit": "제출",
|
||||||
"confirm": ""
|
"confirm": "확인"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "모든 작업 내용이 초기화됩니다. 계속하시겠습니까?",
|
"clearReset": "모든 작업 내용이 초기화됩니다. 계속하시겠습니까?",
|
||||||
@@ -156,8 +164,8 @@
|
|||||||
"loadSceneOverridePrompt": "외부 파일을 불러 오면 기존 콘텐츠가 대체됩니다. 계속 진행할까요?",
|
"loadSceneOverridePrompt": "외부 파일을 불러 오면 기존 콘텐츠가 대체됩니다. 계속 진행할까요?",
|
||||||
"collabStopOverridePrompt": "협업 세션을 종료하면 로컬 저장소에 있는 그림이 협업 세션의 그림으로 대체됩니다. 진행하겠습니까?\n\n(로컬 저장소에 있는 그림을 유지하려면 현재 브라우저 탭을 닫아주세요.)",
|
"collabStopOverridePrompt": "협업 세션을 종료하면 로컬 저장소에 있는 그림이 협업 세션의 그림으로 대체됩니다. 진행하겠습니까?\n\n(로컬 저장소에 있는 그림을 유지하려면 현재 브라우저 탭을 닫아주세요.)",
|
||||||
"errorLoadingLibrary": "외부 라이브러리를 불러오는 중에 문제가 발생했습니다.",
|
"errorLoadingLibrary": "외부 라이브러리를 불러오는 중에 문제가 발생했습니다.",
|
||||||
"errorAddingToLibrary": "",
|
"errorAddingToLibrary": "아이템을 라이브러리에 추가 할수 없습니다",
|
||||||
"errorRemovingFromLibrary": "",
|
"errorRemovingFromLibrary": "라이브러리에서 아이템을 삭제할수 없습니다",
|
||||||
"confirmAddLibrary": "{{numShapes}}개의 모양이 라이브러리에 추가됩니다. 계속하시겠어요?",
|
"confirmAddLibrary": "{{numShapes}}개의 모양이 라이브러리에 추가됩니다. 계속하시겠어요?",
|
||||||
"imageDoesNotContainScene": "",
|
"imageDoesNotContainScene": "",
|
||||||
"cannotRestoreFromImage": "이미지 파일에서 화면을 복구할 수 없었습니다",
|
"cannotRestoreFromImage": "이미지 파일에서 화면을 복구할 수 없었습니다",
|
||||||
@@ -167,24 +175,26 @@
|
|||||||
"invalidEncryptionKey": ""
|
"invalidEncryptionKey": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "",
|
"unsupportedFileType": "지원하지 않는 파일 형식 입니다.",
|
||||||
"imageInsertError": "",
|
"imageInsertError": "이미지를 삽입할 수 없습니다. 나중에 다시 시도 하십시오",
|
||||||
"fileTooBig": "",
|
"fileTooBig": "",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": ""
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "선택",
|
"selection": "선택",
|
||||||
"image": "",
|
"image": "이미지 삽입",
|
||||||
"rectangle": "사각형",
|
"rectangle": "사각형",
|
||||||
"diamond": "다이아몬드",
|
"diamond": "다이아몬드",
|
||||||
"ellipse": "타원",
|
"ellipse": "타원",
|
||||||
"arrow": "화살표",
|
"arrow": "화살표",
|
||||||
"line": "선",
|
"line": "선",
|
||||||
"freedraw": "",
|
"freedraw": "그리기",
|
||||||
"text": "텍스트",
|
"text": "텍스트",
|
||||||
"library": "라이브러리",
|
"library": "라이브러리",
|
||||||
"lock": "선택된 도구 유지하기"
|
"lock": "선택된 도구 유지하기",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "캔버스 동작",
|
"canvasActions": "캔버스 동작",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "SHIFT 키를 누르면서 회전하면 각도를 제한할 수 있습니다.",
|
"rotate": "SHIFT 키를 누르면서 회전하면 각도를 제한할 수 있습니다.",
|
||||||
"lineEditor_info": "지점을 수정하려면 두 번 클릭하거나 Enter 키를 누르세요.",
|
"lineEditor_info": "지점을 수정하려면 두 번 클릭하거나 Enter 키를 누르세요.",
|
||||||
"lineEditor_pointSelected": "제거하려면 Delete 키, 복제하려면 CtrlOrCmd+D, 이동하려면 드래그하세요.",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "옮기거나 지울 지점을 선택하거나, Alt를 누른 상태로 클릭해 새 지점을 만드세요",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "미리보기를 볼 수 없습니다",
|
"cannotShowPreview": "미리보기를 볼 수 없습니다",
|
||||||
@@ -241,51 +253,53 @@
|
|||||||
"title": "오류"
|
"title": "오류"
|
||||||
},
|
},
|
||||||
"exportDialog": {
|
"exportDialog": {
|
||||||
"disk_title": "",
|
"disk_title": "디스크에 저장",
|
||||||
"disk_details": "",
|
"disk_details": "",
|
||||||
"disk_button": "",
|
"disk_button": "파일로 저장",
|
||||||
"link_title": "",
|
"link_title": "공유 가능한 링크 생성",
|
||||||
"link_details": "",
|
"link_details": "",
|
||||||
"link_button": "",
|
"link_button": "링크로 내보내기",
|
||||||
"excalidrawplus_description": "",
|
"excalidrawplus_description": "",
|
||||||
"excalidrawplus_button": "",
|
"excalidrawplus_button": "내보내기",
|
||||||
"excalidrawplus_exportError": ""
|
"excalidrawplus_exportError": ""
|
||||||
},
|
},
|
||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "블로그 읽어보기",
|
"blog": "블로그 읽어보기",
|
||||||
"click": "클릭",
|
"click": "클릭",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "곡선 화살표",
|
"curvedArrow": "곡선 화살표",
|
||||||
"curvedLine": "곡선",
|
"curvedLine": "곡선",
|
||||||
"documentation": "설명서",
|
"documentation": "설명서",
|
||||||
"doubleClick": "",
|
"doubleClick": "더블 클릭",
|
||||||
"drag": "드래그",
|
"drag": "드래그",
|
||||||
"editor": "에디터",
|
"editor": "에디터",
|
||||||
"editSelectedShape": "",
|
"editSelectedShape": "선택한 도형 편집하기(텍스트/화살표/라인)",
|
||||||
"github": "문제 제보하기",
|
"github": "문제 제보하기",
|
||||||
"howto": "가이드 참고하기",
|
"howto": "가이드 참고하기",
|
||||||
"or": "또는",
|
"or": "또는",
|
||||||
"preventBinding": "화살표가 붙지 않게 하기",
|
"preventBinding": "화살표가 붙지 않게 하기",
|
||||||
"shapes": "도형",
|
"shapes": "도형",
|
||||||
"shortcuts": "키보드 단축키",
|
"shortcuts": "키보드 단축키",
|
||||||
"textFinish": "",
|
"textFinish": "편집 완료 (텍스트 에디터)",
|
||||||
"textNewLine": "",
|
"textNewLine": "줄바꿈(텍스트 에디터)",
|
||||||
"title": "도움말",
|
"title": "도움말",
|
||||||
"view": "보기",
|
"view": "보기",
|
||||||
"zoomToFit": "모든 요소가 보이도록 확대/축소",
|
"zoomToFit": "모든 요소가 보이도록 확대/축소",
|
||||||
"zoomToSelection": "선택 영역으로 확대/축소"
|
"zoomToSelection": "선택 영역으로 확대/축소"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": "캔버스 지우기"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"itemName": "",
|
"itemName": "아이템 이름",
|
||||||
"authorName": "",
|
"authorName": "저자명",
|
||||||
"githubUsername": "",
|
"githubUsername": "깃허브 사용자이름",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "트위터 사용자이름",
|
||||||
"libraryName": "",
|
"libraryName": "라이브러리 이름",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "",
|
||||||
"website": "",
|
"website": "웹사이트",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "",
|
"authorName": "",
|
||||||
"libraryName": "",
|
"libraryName": "",
|
||||||
@@ -295,7 +309,7 @@
|
|||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "필수사항",
|
||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
@@ -305,12 +319,12 @@
|
|||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
"link": "",
|
"link": "가이드라인",
|
||||||
"post": ""
|
"post": ""
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
"link": "",
|
"link": "MIT 라이선스, ",
|
||||||
"post": ""
|
"post": ""
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "",
|
||||||
@@ -319,10 +333,10 @@
|
|||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"content": "",
|
"content": "",
|
||||||
"link": ""
|
"link": "여기"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "라이브러리 리셋",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": ""
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
@@ -345,21 +359,21 @@
|
|||||||
"width": "너비"
|
"width": "너비"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "라이브러리에 추가되었습니다",
|
||||||
"copyStyles": "스타일 복사.",
|
"copyStyles": "스타일 복사.",
|
||||||
"copyToClipboard": "클립보드로 복사.",
|
"copyToClipboard": "클립보드로 복사.",
|
||||||
"copyToClipboardAsPng": "",
|
"copyToClipboardAsPng": "",
|
||||||
"fileSaved": "",
|
"fileSaved": "파일이 저장되었습니다.",
|
||||||
"fileSavedToFilename": "",
|
"fileSavedToFilename": "{filename} 로 저장되었습니다",
|
||||||
"canvas": "",
|
"canvas": "캔버스",
|
||||||
"selection": ""
|
"selection": "선택"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"ffffff": "",
|
"ffffff": "화이트",
|
||||||
"f8f9fa": "",
|
"f8f9fa": "그레이 0",
|
||||||
"f1f3f5": "",
|
"f1f3f5": "그레이 1",
|
||||||
"fff5f5": "",
|
"fff5f5": "레드 0",
|
||||||
"fff0f6": "",
|
"fff0f6": "핑크 0",
|
||||||
"f8f0fc": "",
|
"f8f0fc": "",
|
||||||
"f3f0ff": "",
|
"f3f0ff": "",
|
||||||
"edf2ff": "",
|
"edf2ff": "",
|
||||||
|
|||||||
@@ -0,0 +1,418 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"paste": "Įklijuoti",
|
||||||
|
"pasteCharts": "Įklijuoti diagramas",
|
||||||
|
"selectAll": "Pažymėti viską",
|
||||||
|
"multiSelect": "",
|
||||||
|
"moveCanvas": "",
|
||||||
|
"cut": "Iškirpti",
|
||||||
|
"copy": "Kopijuoti",
|
||||||
|
"copyAsPng": "",
|
||||||
|
"copyAsSvg": "",
|
||||||
|
"bringForward": "",
|
||||||
|
"sendToBack": "",
|
||||||
|
"bringToFront": "",
|
||||||
|
"sendBackward": "",
|
||||||
|
"delete": "Ištrinti",
|
||||||
|
"copyStyles": "Kopijuoti stilius",
|
||||||
|
"pasteStyles": "Įklijuoti stilius",
|
||||||
|
"stroke": "Linija",
|
||||||
|
"background": "Fonas",
|
||||||
|
"fill": "Užpildymas",
|
||||||
|
"strokeWidth": "Linijos storis",
|
||||||
|
"strokeStyle": "Linijos stilius",
|
||||||
|
"strokeStyle_solid": "",
|
||||||
|
"strokeStyle_dashed": "",
|
||||||
|
"strokeStyle_dotted": "",
|
||||||
|
"sloppiness": "",
|
||||||
|
"opacity": "",
|
||||||
|
"textAlign": "",
|
||||||
|
"edges": "Kraštai",
|
||||||
|
"sharp": "",
|
||||||
|
"round": "",
|
||||||
|
"arrowheads": "",
|
||||||
|
"arrowhead_none": "",
|
||||||
|
"arrowhead_arrow": "",
|
||||||
|
"arrowhead_bar": "",
|
||||||
|
"arrowhead_dot": "",
|
||||||
|
"arrowhead_triangle": "Trikampis",
|
||||||
|
"fontSize": "",
|
||||||
|
"fontFamily": "",
|
||||||
|
"onlySelected": "",
|
||||||
|
"withBackground": "",
|
||||||
|
"exportEmbedScene": "",
|
||||||
|
"exportEmbedScene_details": "",
|
||||||
|
"addWatermark": "Sukurta su Excalidraw",
|
||||||
|
"handDrawn": "",
|
||||||
|
"normal": "Normalus",
|
||||||
|
"code": "Kodas",
|
||||||
|
"small": "Mažas",
|
||||||
|
"medium": "Vidutinis",
|
||||||
|
"large": "Didelis",
|
||||||
|
"veryLarge": "",
|
||||||
|
"solid": "",
|
||||||
|
"hachure": "",
|
||||||
|
"crossHatch": "",
|
||||||
|
"thin": "",
|
||||||
|
"bold": "",
|
||||||
|
"left": "",
|
||||||
|
"center": "",
|
||||||
|
"right": "",
|
||||||
|
"extraBold": "",
|
||||||
|
"architect": "",
|
||||||
|
"artist": "",
|
||||||
|
"cartoonist": "",
|
||||||
|
"fileTitle": "Failo pavadinimas",
|
||||||
|
"colorPicker": "",
|
||||||
|
"canvasBackground": "",
|
||||||
|
"drawingCanvas": "",
|
||||||
|
"layers": "",
|
||||||
|
"actions": "",
|
||||||
|
"language": "",
|
||||||
|
"liveCollaboration": "",
|
||||||
|
"duplicateSelection": "",
|
||||||
|
"untitled": "",
|
||||||
|
"name": "",
|
||||||
|
"yourName": "Jūsų vardas",
|
||||||
|
"madeWithExcalidraw": "Sukurta su Excalidraw",
|
||||||
|
"group": "Grupuoti pasirinkimą",
|
||||||
|
"ungroup": "Išgrupuoti pasirinkimą",
|
||||||
|
"collaborators": "Bendradarbiautojai",
|
||||||
|
"showGrid": "Rodyti tinklelį",
|
||||||
|
"addToLibrary": "Pridėti į biblioteką",
|
||||||
|
"removeFromLibrary": "Pašalinti iš bibliotekos",
|
||||||
|
"libraryLoadingMessage": "",
|
||||||
|
"libraries": "Naršyti bibliotekas",
|
||||||
|
"loadingScene": "",
|
||||||
|
"align": "Lygiuoti",
|
||||||
|
"alignTop": "Lygiuoti viršuje",
|
||||||
|
"alignBottom": "Lygiuoti apačioje",
|
||||||
|
"alignLeft": "Lygiuoti kairėje",
|
||||||
|
"alignRight": "Lygiuoti dešinėje",
|
||||||
|
"centerVertically": "Centruoti vertikaliai",
|
||||||
|
"centerHorizontally": "Centruoti horizontaliai",
|
||||||
|
"distributeHorizontally": "",
|
||||||
|
"distributeVertically": "",
|
||||||
|
"flipHorizontal": "Apversti horizontaliai",
|
||||||
|
"flipVertical": "Apversti vertikaliai",
|
||||||
|
"viewMode": "",
|
||||||
|
"toggleExportColorScheme": "",
|
||||||
|
"share": "Dalintis",
|
||||||
|
"showStroke": "",
|
||||||
|
"showBackground": "",
|
||||||
|
"toggleTheme": "",
|
||||||
|
"personalLib": "Asmeninė biblioteka",
|
||||||
|
"excalidrawLib": "Exaclidraw biblioteka",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"clearReset": "",
|
||||||
|
"exportJSON": "Eksportuoti į failą",
|
||||||
|
"exportImage": "Išsaugoti kaip paveikslėlį",
|
||||||
|
"export": "Eksportuoti",
|
||||||
|
"exportToPng": "Eksportuoti į PNG",
|
||||||
|
"exportToSvg": "Eksportuoti į SVG",
|
||||||
|
"copyToClipboard": "Kopijuoti į iškarpinę",
|
||||||
|
"copyPngToClipboard": "Kopijuoti PNG į iškarpinę",
|
||||||
|
"scale": "",
|
||||||
|
"save": "",
|
||||||
|
"saveAs": "Išsaugoti kaip",
|
||||||
|
"load": "Įkelti",
|
||||||
|
"getShareableLink": "Gauti nuorodą dalinimuisi",
|
||||||
|
"close": "Uždaryti",
|
||||||
|
"selectLanguage": "Pasirinkite kalbą",
|
||||||
|
"scrollBackToContent": "",
|
||||||
|
"zoomIn": "Priartinti",
|
||||||
|
"zoomOut": "Nutolinti",
|
||||||
|
"resetZoom": "",
|
||||||
|
"menu": "Meniu",
|
||||||
|
"done": "",
|
||||||
|
"edit": "Redaguoti",
|
||||||
|
"undo": "Anuliuoti",
|
||||||
|
"redo": "",
|
||||||
|
"resetLibrary": "Atstatyti biblioteką",
|
||||||
|
"createNewRoom": "Sukurti naują kambarį",
|
||||||
|
"fullScreen": "Visas ekranas",
|
||||||
|
"darkMode": "Tamsus režimas",
|
||||||
|
"lightMode": "Šviesus režimas",
|
||||||
|
"zenMode": "„Zen“ režimas",
|
||||||
|
"exitZenMode": "Išeiti iš „Zen“ režimo",
|
||||||
|
"cancel": "Atšaukti",
|
||||||
|
"clear": "Išvalyti",
|
||||||
|
"remove": "Pašalinti",
|
||||||
|
"publishLibrary": "Paskelbti",
|
||||||
|
"submit": "Pateikti",
|
||||||
|
"confirm": "Patvirtinti"
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"clearReset": "",
|
||||||
|
"couldNotCreateShareableLink": "",
|
||||||
|
"couldNotCreateShareableLinkTooBig": "",
|
||||||
|
"couldNotLoadInvalidFile": "",
|
||||||
|
"importBackendFailed": "",
|
||||||
|
"cannotExportEmptyCanvas": "",
|
||||||
|
"couldNotCopyToClipboard": "",
|
||||||
|
"decryptFailed": "",
|
||||||
|
"uploadedSecurly": "",
|
||||||
|
"loadSceneOverridePrompt": "",
|
||||||
|
"collabStopOverridePrompt": "",
|
||||||
|
"errorLoadingLibrary": "",
|
||||||
|
"errorAddingToLibrary": "",
|
||||||
|
"errorRemovingFromLibrary": "",
|
||||||
|
"confirmAddLibrary": "",
|
||||||
|
"imageDoesNotContainScene": "",
|
||||||
|
"cannotRestoreFromImage": "",
|
||||||
|
"invalidSceneUrl": "",
|
||||||
|
"resetLibrary": "",
|
||||||
|
"removeItemsFromsLibrary": "",
|
||||||
|
"invalidEncryptionKey": ""
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"unsupportedFileType": "",
|
||||||
|
"imageInsertError": "",
|
||||||
|
"fileTooBig": "",
|
||||||
|
"svgImageInsertError": "",
|
||||||
|
"invalidSVGString": ""
|
||||||
|
},
|
||||||
|
"toolBar": {
|
||||||
|
"selection": "",
|
||||||
|
"image": "",
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "Piešti",
|
||||||
|
"text": "Tekstas",
|
||||||
|
"library": "Biblioteka",
|
||||||
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"canvasActions": "",
|
||||||
|
"selectedShapeActions": "",
|
||||||
|
"shapes": "Figūros"
|
||||||
|
},
|
||||||
|
"hints": {
|
||||||
|
"canvasPanning": "",
|
||||||
|
"linearElement": "",
|
||||||
|
"freeDraw": "",
|
||||||
|
"text": "",
|
||||||
|
"text_selected": "",
|
||||||
|
"text_editing": "",
|
||||||
|
"linearElementMulti": "",
|
||||||
|
"lockAngle": "",
|
||||||
|
"resize": "",
|
||||||
|
"resizeImage": "",
|
||||||
|
"rotate": "",
|
||||||
|
"lineEditor_info": "",
|
||||||
|
"lineEditor_pointSelected": "",
|
||||||
|
"lineEditor_nothingSelected": "",
|
||||||
|
"placeImage": "",
|
||||||
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
|
},
|
||||||
|
"canvasError": {
|
||||||
|
"cannotShowPreview": "",
|
||||||
|
"canvasTooBig": "",
|
||||||
|
"canvasTooBigTip": ""
|
||||||
|
},
|
||||||
|
"errorSplash": {
|
||||||
|
"headingMain_pre": "",
|
||||||
|
"headingMain_button": "",
|
||||||
|
"clearCanvasMessage": "",
|
||||||
|
"clearCanvasMessage_button": "",
|
||||||
|
"clearCanvasCaveat": "",
|
||||||
|
"trackedToSentry_pre": "",
|
||||||
|
"trackedToSentry_post": "",
|
||||||
|
"openIssueMessage_pre": "",
|
||||||
|
"openIssueMessage_button": "",
|
||||||
|
"openIssueMessage_post": "",
|
||||||
|
"sceneContent": ""
|
||||||
|
},
|
||||||
|
"roomDialog": {
|
||||||
|
"desc_intro": "",
|
||||||
|
"desc_privacy": "",
|
||||||
|
"button_startSession": "Pradėti seansą",
|
||||||
|
"button_stopSession": "Sustabdyti seansą",
|
||||||
|
"desc_inProgressIntro": "",
|
||||||
|
"desc_shareLink": "",
|
||||||
|
"desc_exitSession": "",
|
||||||
|
"shareTitle": ""
|
||||||
|
},
|
||||||
|
"errorDialog": {
|
||||||
|
"title": "Klaida"
|
||||||
|
},
|
||||||
|
"exportDialog": {
|
||||||
|
"disk_title": "Įrašyti į diską",
|
||||||
|
"disk_details": "",
|
||||||
|
"disk_button": "Įrašyti į failą",
|
||||||
|
"link_title": "Nuoroda dalinimuisi",
|
||||||
|
"link_details": "",
|
||||||
|
"link_button": "",
|
||||||
|
"excalidrawplus_description": "",
|
||||||
|
"excalidrawplus_button": "",
|
||||||
|
"excalidrawplus_exportError": ""
|
||||||
|
},
|
||||||
|
"helpDialog": {
|
||||||
|
"blog": "",
|
||||||
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
|
"curvedArrow": "",
|
||||||
|
"curvedLine": "",
|
||||||
|
"documentation": "",
|
||||||
|
"doubleClick": "",
|
||||||
|
"drag": "vilkti",
|
||||||
|
"editor": "",
|
||||||
|
"editSelectedShape": "",
|
||||||
|
"github": "",
|
||||||
|
"howto": "",
|
||||||
|
"or": "",
|
||||||
|
"preventBinding": "",
|
||||||
|
"shapes": "Figūros",
|
||||||
|
"shortcuts": "",
|
||||||
|
"textFinish": "",
|
||||||
|
"textNewLine": "",
|
||||||
|
"title": "",
|
||||||
|
"view": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"zoomToSelection": ""
|
||||||
|
},
|
||||||
|
"clearCanvasDialog": {
|
||||||
|
"title": ""
|
||||||
|
},
|
||||||
|
"publishDialog": {
|
||||||
|
"title": "",
|
||||||
|
"itemName": "",
|
||||||
|
"authorName": "",
|
||||||
|
"githubUsername": "",
|
||||||
|
"twitterUsername": "",
|
||||||
|
"libraryName": "",
|
||||||
|
"libraryDesc": "",
|
||||||
|
"website": "Tinklalapis",
|
||||||
|
"placeholder": {
|
||||||
|
"authorName": "",
|
||||||
|
"libraryName": "",
|
||||||
|
"libraryDesc": "",
|
||||||
|
"githubHandle": "",
|
||||||
|
"twitterHandle": "",
|
||||||
|
"website": ""
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"required": "",
|
||||||
|
"website": ""
|
||||||
|
},
|
||||||
|
"noteDescription": {
|
||||||
|
"pre": "",
|
||||||
|
"link": "",
|
||||||
|
"post": ""
|
||||||
|
},
|
||||||
|
"noteGuidelines": {
|
||||||
|
"pre": "",
|
||||||
|
"link": "",
|
||||||
|
"post": ""
|
||||||
|
},
|
||||||
|
"noteLicense": {
|
||||||
|
"pre": "",
|
||||||
|
"link": "",
|
||||||
|
"post": ""
|
||||||
|
},
|
||||||
|
"noteItems": "",
|
||||||
|
"atleastOneLibItem": ""
|
||||||
|
},
|
||||||
|
"publishSuccessDialog": {
|
||||||
|
"title": "",
|
||||||
|
"content": "",
|
||||||
|
"link": "čia"
|
||||||
|
},
|
||||||
|
"confirmDialog": {
|
||||||
|
"resetLibrary": "",
|
||||||
|
"removeItemsFromLib": ""
|
||||||
|
},
|
||||||
|
"encrypted": {
|
||||||
|
"tooltip": "",
|
||||||
|
"link": ""
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"angle": "",
|
||||||
|
"element": "",
|
||||||
|
"elements": "",
|
||||||
|
"height": "",
|
||||||
|
"scene": "",
|
||||||
|
"selected": "",
|
||||||
|
"storage": "",
|
||||||
|
"title": "",
|
||||||
|
"total": "",
|
||||||
|
"version": "",
|
||||||
|
"versionCopy": "",
|
||||||
|
"versionNotAvailable": "",
|
||||||
|
"width": ""
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"addedToLibrary": "",
|
||||||
|
"copyStyles": "",
|
||||||
|
"copyToClipboard": "",
|
||||||
|
"copyToClipboardAsPng": "",
|
||||||
|
"fileSaved": "",
|
||||||
|
"fileSavedToFilename": "",
|
||||||
|
"canvas": "",
|
||||||
|
"selection": ""
|
||||||
|
},
|
||||||
|
"colors": {
|
||||||
|
"ffffff": "",
|
||||||
|
"f8f9fa": "",
|
||||||
|
"f1f3f5": "",
|
||||||
|
"fff5f5": "",
|
||||||
|
"fff0f6": "",
|
||||||
|
"f8f0fc": "",
|
||||||
|
"f3f0ff": "",
|
||||||
|
"edf2ff": "",
|
||||||
|
"e7f5ff": "",
|
||||||
|
"e3fafc": "",
|
||||||
|
"e6fcf5": "",
|
||||||
|
"ebfbee": "",
|
||||||
|
"f4fce3": "",
|
||||||
|
"fff9db": "",
|
||||||
|
"fff4e6": "",
|
||||||
|
"transparent": "",
|
||||||
|
"ced4da": "",
|
||||||
|
"868e96": "",
|
||||||
|
"fa5252": "",
|
||||||
|
"e64980": "",
|
||||||
|
"be4bdb": "",
|
||||||
|
"7950f2": "",
|
||||||
|
"4c6ef5": "",
|
||||||
|
"228be6": "",
|
||||||
|
"15aabf": "",
|
||||||
|
"12b886": "",
|
||||||
|
"40c057": "",
|
||||||
|
"82c91e": "",
|
||||||
|
"fab005": "",
|
||||||
|
"fd7e14": "",
|
||||||
|
"000000": "",
|
||||||
|
"343a40": "",
|
||||||
|
"495057": "",
|
||||||
|
"c92a2a": "",
|
||||||
|
"a61e4d": "",
|
||||||
|
"862e9c": "",
|
||||||
|
"5f3dc4": "",
|
||||||
|
"364fc7": "",
|
||||||
|
"1864ab": "",
|
||||||
|
"0b7285": "",
|
||||||
|
"087f5b": "",
|
||||||
|
"2b8a3e": "",
|
||||||
|
"5c940d": "",
|
||||||
|
"e67700": "",
|
||||||
|
"d9480f": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
+40
-26
@@ -16,8 +16,8 @@
|
|||||||
"delete": "Dzēst",
|
"delete": "Dzēst",
|
||||||
"copyStyles": "Kopēt stilus",
|
"copyStyles": "Kopēt stilus",
|
||||||
"pasteStyles": "Ielīmēt stilus",
|
"pasteStyles": "Ielīmēt stilus",
|
||||||
"stroke": "Svītra",
|
"stroke": "Svītras krāsa",
|
||||||
"background": "Fons",
|
"background": "Fona krāsa",
|
||||||
"fill": "Aizpildījums",
|
"fill": "Aizpildījums",
|
||||||
"strokeWidth": "Svītras platums",
|
"strokeWidth": "Svītras platums",
|
||||||
"strokeStyle": "Svītras stils",
|
"strokeStyle": "Svītras stils",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"strokeStyle_dotted": "Punktota līnija",
|
"strokeStyle_dotted": "Punktota līnija",
|
||||||
"sloppiness": "Precizitāte",
|
"sloppiness": "Precizitāte",
|
||||||
"opacity": "Necaurspīdīgums",
|
"opacity": "Necaurspīdīgums",
|
||||||
"textAlign": "Teksta izkārtojums",
|
"textAlign": "Teksta līdzināšana",
|
||||||
"edges": "Malas",
|
"edges": "Malas",
|
||||||
"sharp": "Asas",
|
"sharp": "Asas",
|
||||||
"round": "Apaļas",
|
"round": "Apaļas",
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
"fileTitle": "Datnes nosaukums",
|
"fileTitle": "Datnes nosaukums",
|
||||||
"colorPicker": "Krāsu atlasītājs",
|
"colorPicker": "Krāsu atlasītājs",
|
||||||
"canvasBackground": "Ainas fons",
|
"canvasBackground": "Ainas fons",
|
||||||
"drawingCanvas": "Zīmējuma laukums",
|
"drawingCanvas": "Tāfele",
|
||||||
"layers": "Slāņi",
|
"layers": "Slāņi",
|
||||||
"actions": "Darbības",
|
"actions": "Darbības",
|
||||||
"language": "Valoda",
|
"language": "Valoda",
|
||||||
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Rādīt fona krāsas atlasītāju",
|
"showBackground": "Rādīt fona krāsas atlasītāju",
|
||||||
"toggleTheme": "Pārslēgt krāsu tēmu",
|
"toggleTheme": "Pārslēgt krāsu tēmu",
|
||||||
"personalLib": "Personīgā bibliotēka",
|
"personalLib": "Personīgā bibliotēka",
|
||||||
"excalidrawLib": "Excalidraw bibliotēka"
|
"excalidrawLib": "Excalidraw bibliotēka",
|
||||||
|
"decreaseFontSize": "Samazināt fonta izmēru",
|
||||||
|
"increaseFontSize": "Palielināt fonta izmēru",
|
||||||
|
"unbindText": "Atdalīt tekstu",
|
||||||
|
"link": {
|
||||||
|
"edit": "Rediģēt saiti",
|
||||||
|
"create": "Izveidot saiti",
|
||||||
|
"label": "Saite"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Atiestatīt tāfeli",
|
"clearReset": "Atiestatīt tāfeli",
|
||||||
@@ -114,7 +122,7 @@
|
|||||||
"copyToClipboard": "Kopēt starpliktuvē",
|
"copyToClipboard": "Kopēt starpliktuvē",
|
||||||
"copyPngToClipboard": "Kopēt PNG starpliktuvē",
|
"copyPngToClipboard": "Kopēt PNG starpliktuvē",
|
||||||
"scale": "Mērogs",
|
"scale": "Mērogs",
|
||||||
"save": "Saglabāt pašreizējo failu",
|
"save": "Saglabāt pašreizējo datni",
|
||||||
"saveAs": "Saglabāt kā",
|
"saveAs": "Saglabāt kā",
|
||||||
"load": "Ielādēt",
|
"load": "Ielādēt",
|
||||||
"getShareableLink": "Iegūt kopīgošanas saiti",
|
"getShareableLink": "Iegūt kopīgošanas saiti",
|
||||||
@@ -123,7 +131,7 @@
|
|||||||
"scrollBackToContent": "Atgriezties pie satura",
|
"scrollBackToContent": "Atgriezties pie satura",
|
||||||
"zoomIn": "Tuvināt",
|
"zoomIn": "Tuvināt",
|
||||||
"zoomOut": "Tālināt",
|
"zoomOut": "Tālināt",
|
||||||
"resetZoom": "Atiestatīt mērogu",
|
"resetZoom": "Atiestatīt tuvinājumu",
|
||||||
"menu": "Izvēlne",
|
"menu": "Izvēlne",
|
||||||
"done": "Gatavs",
|
"done": "Gatavs",
|
||||||
"edit": "Rediģēt",
|
"edit": "Rediģēt",
|
||||||
@@ -147,9 +155,9 @@
|
|||||||
"clearReset": "Šī funkcija notīrīs visu tāfeli. Vai turpināt?",
|
"clearReset": "Šī funkcija notīrīs visu tāfeli. Vai turpināt?",
|
||||||
"couldNotCreateShareableLink": "Nevarēja izveidot kopīgojamo saiti.",
|
"couldNotCreateShareableLink": "Nevarēja izveidot kopīgojamo saiti.",
|
||||||
"couldNotCreateShareableLinkTooBig": "Nevarēja izveidot kopīgojamo saiti – aina ir par lielu",
|
"couldNotCreateShareableLinkTooBig": "Nevarēja izveidot kopīgojamo saiti – aina ir par lielu",
|
||||||
"couldNotLoadInvalidFile": "Nevarēja ielādēt nederīgu failu",
|
"couldNotLoadInvalidFile": "Nevarēja ielādēt nederīgu datni",
|
||||||
"importBackendFailed": "Ielāde no krātuves neizdevās.",
|
"importBackendFailed": "Ielāde no krātuves neizdevās.",
|
||||||
"cannotExportEmptyCanvas": "Nevar eksportēt tukšu zīmējumu.",
|
"cannotExportEmptyCanvas": "Nevar eksportēt tukšu tāfeli.",
|
||||||
"couldNotCopyToClipboard": "Neizdevās kopēt starpliktuvē. Mēģiniet vēlreiz, izmantojot pārlūku Chrome.",
|
"couldNotCopyToClipboard": "Neizdevās kopēt starpliktuvē. Mēģiniet vēlreiz, izmantojot pārlūku Chrome.",
|
||||||
"decryptFailed": "Nevarēja atšifrēt datus.",
|
"decryptFailed": "Nevarēja atšifrēt datus.",
|
||||||
"uploadedSecurly": "Augšuplāde nodrošināta ar šifrēšanu no gala līdz galam, kas nozīmē, ka Excalidraw serveri un trešās puses nevar lasīt saturu.",
|
"uploadedSecurly": "Augšuplāde nodrošināta ar šifrēšanu no gala līdz galam, kas nozīmē, ka Excalidraw serveri un trešās puses nevar lasīt saturu.",
|
||||||
@@ -160,16 +168,16 @@
|
|||||||
"errorRemovingFromLibrary": "Nevarēja izņemt vienumu no bibliotēkas",
|
"errorRemovingFromLibrary": "Nevarēja izņemt vienumu no bibliotēkas",
|
||||||
"confirmAddLibrary": "Šī funkcija pievienos {{numShapes}} formu(-as) jūsu bibliotēkai. Vai turpināt?",
|
"confirmAddLibrary": "Šī funkcija pievienos {{numShapes}} formu(-as) jūsu bibliotēkai. Vai turpināt?",
|
||||||
"imageDoesNotContainScene": "Šķiet, ka attēls nesatur ainas datus. Vai iespējojāt ainas iegulšanu, kad eksportējāt?",
|
"imageDoesNotContainScene": "Šķiet, ka attēls nesatur ainas datus. Vai iespējojāt ainas iegulšanu, kad eksportējāt?",
|
||||||
"cannotRestoreFromImage": "Ainu nevarēja atgūt no attēla faila",
|
"cannotRestoreFromImage": "Ainu nevarēja atgūt no attēla datnes",
|
||||||
"invalidSceneUrl": "Nevarēja importēt ainu no norādītā URL. Vai nu tas ir nederīgs, vai nesatur derīgus Excalidraw JSON datus.",
|
"invalidSceneUrl": "Nevarēja importēt ainu no norādītā URL. Vai nu tas ir nederīgs, vai nesatur derīgus Excalidraw JSON datus.",
|
||||||
"resetLibrary": "Šī funkcija iztukšos bibliotēku. Vai turpināt?",
|
"resetLibrary": "Šī funkcija iztukšos bibliotēku. Vai turpināt?",
|
||||||
"removeItemsFromsLibrary": "Vai izņemt {{count}} vienumu(s) no bibliotēkas?",
|
"removeItemsFromsLibrary": "Vai izņemt {{count}} vienumu(s) no bibliotēkas?",
|
||||||
"invalidEncryptionKey": "Šifrēšanas atslēgai jābūt 22 simbolus garai. Tiešsaistes sadarbība ir izslēgta."
|
"invalidEncryptionKey": "Šifrēšanas atslēgai jābūt 22 simbolus garai. Tiešsaistes sadarbība ir izslēgta."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Neatbalstīts faila veids.",
|
"unsupportedFileType": "Neatbalstīts datnes veids.",
|
||||||
"imageInsertError": "Nevarēja ievietot attēlu. Mēģiniet vēlāk...",
|
"imageInsertError": "Nevarēja ievietot attēlu. Mēģiniet vēlāk...",
|
||||||
"fileTooBig": "Fails ir par lielu. Lielākais atļautais izmērs ir {{maxSize}}.",
|
"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.",
|
"svgImageInsertError": "Nevarēja ievietot SVG attēlu. Šķiet, ka SVG marķējums nav derīgs.",
|
||||||
"invalidSVGString": "Nederīgs SVG."
|
"invalidSVGString": "Nederīgs SVG."
|
||||||
},
|
},
|
||||||
@@ -177,14 +185,16 @@
|
|||||||
"selection": "Atlase",
|
"selection": "Atlase",
|
||||||
"image": "Ievietot attēlu",
|
"image": "Ievietot attēlu",
|
||||||
"rectangle": "Taisnstūris",
|
"rectangle": "Taisnstūris",
|
||||||
"diamond": "Dimants",
|
"diamond": "Rombs",
|
||||||
"ellipse": "Elipse",
|
"ellipse": "Elipse",
|
||||||
"arrow": "Bulta",
|
"arrow": "Bulta",
|
||||||
"line": "Līnija",
|
"line": "Līnija",
|
||||||
"freedraw": "Zīmēt",
|
"freedraw": "Zīmēt",
|
||||||
"text": "Teksts",
|
"text": "Teksts",
|
||||||
"library": "Bibliotēka",
|
"library": "Bibliotēka",
|
||||||
"lock": "Paturēt izvēlēto rīku pēc darbības"
|
"lock": "Paturēt izvēlēto rīku pēc darbības",
|
||||||
|
"penMode": "Lietojot pildspalvu, bloķēt tuvināšanu un atļaut tikai zīmēšanu",
|
||||||
|
"link": "Pievienot/rediģēt atlasītās figūras saiti"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Tāfeles darbības",
|
"canvasActions": "Tāfeles darbības",
|
||||||
@@ -199,15 +209,17 @@
|
|||||||
"text_selected": "Dubultklikšķiniet vai spiediet ievades taustiņu, lai rediģētu tekstu",
|
"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",
|
"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",
|
"linearElementMulti": "Klikšķiniet uz pēdējā punkta vai spiediet izejas vai ievades taustiņu, lai pabeigtu",
|
||||||
"lockAngle": "Varat ierobežot leņķi turot nospiestu SHIFT",
|
"lockAngle": "Varat ierobežot leņķi, turot nospiestu SHIFT",
|
||||||
"resize": "Kad maināt izmēru, varat ierobežot proporcijas turot nospiestu SHIFT,\nvai arī ALT, lai mainītu izmēru ap centru",
|
"resize": "Kad maināt izmēru, varat ierobežot proporcijas, turot nospiestu SHIFT,\nvai arī ALT, lai mainītu izmēru ap centru",
|
||||||
"resizeImage": "Varat brīvi mainīt izmēru turot nospiestu SHIFT;\nturiet nospiestu ALT, lai mainītu izmēru ap centru",
|
"resizeImage": "Varat brīvi mainīt izmēru, turot nospiestu SHIFT;\nturiet nospiestu ALT, lai mainītu izmēru ap centru",
|
||||||
"rotate": "Rotējot varat ierobežot leņķi turot nospiestu SHIFT",
|
"rotate": "Rotējot varat ierobežot leņķi, turot nospiestu SHIFT",
|
||||||
"lineEditor_info": "Dubultklikšķiniet vai spiediet ievades taustiņu, lai rediģētu punktus",
|
"lineEditor_info": "Dubultklikšķiniet vai spiediet ievades taustiņu, lai rediģētu punktus",
|
||||||
"lineEditor_pointSelected": "Spiediet dzēšanas taustiņu, lai noņemtu punktu, – CtrlOrCmd+D, lai to kopētu, vai velciet, lai pārvietotu",
|
"lineEditor_pointSelected": "Spiediet dzēšanas taustiņu, lai noņemtu punktus, – CtrlOrCmd+D, lai to kopētu, vai velciet, lai pārvietotu",
|
||||||
"lineEditor_nothingSelected": "Atlasiet punktu, lai to pārvietotu vai noņemtu; lai pievienotu jaunus punktus, turiet nospiestu Alt taustiņu",
|
"lineEditor_nothingSelected": "Atlasiet punktu, lai labotu (turiet nospiestu SHIFT, lai atlasītu vairākus),\nvai turiet Alt un clikšķiniet, lai pievienotu jaunus punktus",
|
||||||
"placeImage": "Klikšķiniet, lai novietotu attēlu, vai spiediet un velciet, lai iestatītu tā izmēru",
|
"placeImage": "Klikšķiniet, lai novietotu attēlu, vai spiediet un velciet, lai iestatītu tā izmēru",
|
||||||
"publishLibrary": "Publicēt savu bibliotēku"
|
"publishLibrary": "Publicēt savu bibliotēku",
|
||||||
|
"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"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Nevar rādīt priekšskatījumu",
|
"cannotShowPreview": "Nevar rādīt priekšskatījumu",
|
||||||
@@ -242,8 +254,8 @@
|
|||||||
},
|
},
|
||||||
"exportDialog": {
|
"exportDialog": {
|
||||||
"disk_title": "Saglabāt diskā",
|
"disk_title": "Saglabāt diskā",
|
||||||
"disk_details": "Eksportēt ainas datus failā, ko vēlāk varēsiet importēt.",
|
"disk_details": "Eksportēt ainas datus datnē, ko vēlāk varēsiet importēt.",
|
||||||
"disk_button": "Saglabāt failā",
|
"disk_button": "Saglabāt datnē",
|
||||||
"link_title": "Kopīgošanas saite",
|
"link_title": "Kopīgošanas saite",
|
||||||
"link_details": "Eksportēt kā tikai lasāmu saiti.",
|
"link_details": "Eksportēt kā tikai lasāmu saiti.",
|
||||||
"link_button": "Eksportēt kā saiti",
|
"link_button": "Eksportēt kā saiti",
|
||||||
@@ -254,18 +266,20 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lasīt mūsu blogu",
|
"blog": "Lasīt mūsu blogu",
|
||||||
"click": "klikšķis",
|
"click": "klikšķis",
|
||||||
|
"deepSelect": "Atlasīt dziļumā",
|
||||||
|
"deepBoxSelect": "Atlasīt dziļumā kastes ietvaros, un nepieļaut pavilkšanu",
|
||||||
"curvedArrow": "Liekta bulta",
|
"curvedArrow": "Liekta bulta",
|
||||||
"curvedLine": "Liekta līnija",
|
"curvedLine": "Liekta līnija",
|
||||||
"documentation": "Dokumentācija",
|
"documentation": "Dokumentācija",
|
||||||
"doubleClick": "dubultklikšķis",
|
"doubleClick": "dubultklikšķis",
|
||||||
"drag": "vilkt",
|
"drag": "vilkt",
|
||||||
"editor": "Redaktors",
|
"editor": "Redaktors",
|
||||||
"editSelectedShape": "Rediģēt atlasīto formu (tekstu/bultu/līniju)",
|
"editSelectedShape": "Rediģēt atlasīto figūru (tekstu/bultu/līniju)",
|
||||||
"github": "Sastapāt kļūdu? Ziņot",
|
"github": "Sastapāt kļūdu? Ziņot",
|
||||||
"howto": "Sekojiet mūsu instrukcijām",
|
"howto": "Sekojiet mūsu instrukcijām",
|
||||||
"or": "vai",
|
"or": "vai",
|
||||||
"preventBinding": "Novērst bultu piesaistīšanos",
|
"preventBinding": "Novērst bultu piesaistīšanos",
|
||||||
"shapes": "Formas",
|
"shapes": "Figūras",
|
||||||
"shortcuts": "Tastatūras saīsnes",
|
"shortcuts": "Tastatūras saīsnes",
|
||||||
"textFinish": "Pabeigt rediģēšanu (teksta redaktorā)",
|
"textFinish": "Pabeigt rediģēšanu (teksta redaktorā)",
|
||||||
"textNewLine": "Nākamā rindiņa (teksta redaktorā)",
|
"textNewLine": "Nākamā rindiņa (teksta redaktorā)",
|
||||||
@@ -349,7 +363,7 @@
|
|||||||
"copyStyles": "Nokopēja stilus.",
|
"copyStyles": "Nokopēja stilus.",
|
||||||
"copyToClipboard": "Nokopēja starpliktuvē.",
|
"copyToClipboard": "Nokopēja starpliktuvē.",
|
||||||
"copyToClipboardAsPng": "Nokopēja {{exportSelection}} starpliktuvē kā PNG ({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Nokopēja {{exportSelection}} starpliktuvē kā PNG ({{exportColorScheme}})",
|
||||||
"fileSaved": "Fails saglabāts.",
|
"fileSaved": "Datne saglabāta.",
|
||||||
"fileSavedToFilename": "Saglabāts kā {filename}",
|
"fileSavedToFilename": "Saglabāts kā {filename}",
|
||||||
"canvas": "tāfeli",
|
"canvas": "tāfeli",
|
||||||
"selection": "atlasi"
|
"selection": "atlasi"
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "ကားချပ်ရှင်းလင်း",
|
"clearReset": "ကားချပ်ရှင်းလင်း",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "စာသား",
|
"text": "စာသား",
|
||||||
"library": "မှတ်တမ်း",
|
"library": "မှတ်တမ်း",
|
||||||
"lock": "ရွေးချယ်ထားသောကိရိယာကိုသာဆက်သုံး"
|
"lock": "ရွေးချယ်ထားသောကိရိယာကိုသာဆက်သုံး",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "ကားချပ်လုပ်ဆောင်ချက်",
|
"canvasActions": "ကားချပ်လုပ်ဆောင်ချက်",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Shift ကိုနှိပ်ထားခြင်းဖြင့် ထောင့်အလိုက်လှည့်နိုင်သည်",
|
"rotate": "Shift ကိုနှိပ်ထားခြင်းဖြင့် ထောင့်အလိုက်လှည့်နိုင်သည်",
|
||||||
"lineEditor_info": "အမှတ်များပြင်ဆင်သတ်မှတ်ရင် ကလစ်နှစ်ချက် (သို့) Enter ကိုနှိပ်ပါ",
|
"lineEditor_info": "အမှတ်များပြင်ဆင်သတ်မှတ်ရင် ကလစ်နှစ်ချက် (သို့) Enter ကိုနှိပ်ပါ",
|
||||||
"lineEditor_pointSelected": "အမှတ်များအား ဖျက်ရန် Delete နှင့် ပွားရန် Ctrl/Cmd + D သုံးပါ၊ ရွှေ့လိုပါက တရွတ်ဆွဲပါ",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "ရွှေ့လို (သို့) ဖယ်ရှားလိုသောအမှတ်ကိုရွေးပါ၊ Alt နှင့် ကလစ်တွဲနှိပ်၍လည်းအမှတ်အသစ်ထပ်ထည့်နိုင်သည်",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "နမူနာမပြသနိုင်ပါ",
|
"cannotShowPreview": "နမူနာမပြသနိုင်ပါ",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+18
-4
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Vis fargevelger for bakgrunnsfarge",
|
"showBackground": "Vis fargevelger for bakgrunnsfarge",
|
||||||
"toggleTheme": "Veksle tema",
|
"toggleTheme": "Veksle tema",
|
||||||
"personalLib": "Personlig bibliotek",
|
"personalLib": "Personlig bibliotek",
|
||||||
"excalidrawLib": "Excalidraw-bibliotek"
|
"excalidrawLib": "Excalidraw-bibliotek",
|
||||||
|
"decreaseFontSize": "Reduser skriftstørrelse",
|
||||||
|
"increaseFontSize": "Øk skriftstørrelse",
|
||||||
|
"unbindText": "Avbind tekst",
|
||||||
|
"link": {
|
||||||
|
"edit": "Rediger lenke",
|
||||||
|
"create": "Opprett lenke",
|
||||||
|
"label": "Lenke"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Tøm lerretet og tilbakestill bakgrunnsfargen",
|
"clearReset": "Tøm lerretet og tilbakestill bakgrunnsfargen",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Tegn",
|
"freedraw": "Tegn",
|
||||||
"text": "Tekst",
|
"text": "Tekst",
|
||||||
"library": "Bibliotek",
|
"library": "Bibliotek",
|
||||||
"lock": "Behold merket verktøy som aktivt"
|
"lock": "Behold merket verktøy som aktivt",
|
||||||
|
"penMode": "Forhindre zoom ved kniping og godta frihåndstegning kun fra penn",
|
||||||
|
"link": "Legg til / oppdater link for en valgt figur"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Handlinger: lerret",
|
"canvasActions": "Handlinger: lerret",
|
||||||
@@ -205,9 +215,11 @@
|
|||||||
"rotate": "Du kan låse vinklene ved å holde SHIFT mens du roterer",
|
"rotate": "Du kan låse vinklene ved å holde SHIFT mens du roterer",
|
||||||
"lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkter",
|
"lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkter",
|
||||||
"lineEditor_pointSelected": "Trykk på Slett for å fjerne punktet, Ctrl / Cmd+D for å duplisere, eller dra for å flytte",
|
"lineEditor_pointSelected": "Trykk på Slett for å fjerne punktet, Ctrl / Cmd+D for å duplisere, eller dra for å flytte",
|
||||||
"lineEditor_nothingSelected": "Velg et punkt å flytte eller fjerne, eller hold Alt og klikk for å legge til nye punkter",
|
"lineEditor_nothingSelected": "Velg et punkt å redigere (hold SHIFT for å velge flere),\neller hold Alt og klikk for å legge til nye punkter",
|
||||||
"placeImage": "Klikk for å plassere bildet, eller klikk og dra for å angi størrelsen manuelt",
|
"placeImage": "Klikk for å plassere bildet, eller klikk og dra for å angi størrelsen manuelt",
|
||||||
"publishLibrary": "Publiser ditt eget bibliotek"
|
"publishLibrary": "Publiser ditt eget bibliotek",
|
||||||
|
"bindTextToElement": "Trykk Enter for å legge til tekst",
|
||||||
|
"deepBoxSelect": "Hold CTRL/CMD for å markere dypt og forhindre flytting"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Kan ikke vise forhåndsvisning",
|
"cannotShowPreview": "Kan ikke vise forhåndsvisning",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Les bloggen vår",
|
"blog": "Les bloggen vår",
|
||||||
"click": "klikk",
|
"click": "klikk",
|
||||||
|
"deepSelect": "Marker dypt",
|
||||||
|
"deepBoxSelect": "Marker dypt innad i boks og forhindre flytting",
|
||||||
"curvedArrow": "Buet pil",
|
"curvedArrow": "Buet pil",
|
||||||
"curvedLine": "Buet linje",
|
"curvedLine": "Buet linje",
|
||||||
"documentation": "Dokumentasjon",
|
"documentation": "Dokumentasjon",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Toon achtergrondkleur kiezer",
|
"showBackground": "Toon achtergrondkleur kiezer",
|
||||||
"toggleTheme": "Thema aan/uit",
|
"toggleTheme": "Thema aan/uit",
|
||||||
"personalLib": "Persoonlijke bibliotheek",
|
"personalLib": "Persoonlijke bibliotheek",
|
||||||
"excalidrawLib": "Excalidraw bibliotheek"
|
"excalidrawLib": "Excalidraw bibliotheek",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "Ontkoppel tekst",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Canvas opnieuw instellen",
|
"clearReset": "Canvas opnieuw instellen",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Tekenen",
|
"freedraw": "Tekenen",
|
||||||
"text": "Tekst",
|
"text": "Tekst",
|
||||||
"library": "Bibliotheek",
|
"library": "Bibliotheek",
|
||||||
"lock": "Geselecteerde tool actief houden na tekenen"
|
"lock": "Geselecteerde tool actief houden na tekenen",
|
||||||
|
"penMode": "Voorkom pinch-zoom en accepteer freedraw invoer alleen van pen",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Canvasacties",
|
"canvasActions": "Canvasacties",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Je kan hoeken beperken door SHIFT ingedrukt te houden wanneer je draait",
|
"rotate": "Je kan hoeken beperken door SHIFT ingedrukt te houden wanneer je draait",
|
||||||
"lineEditor_info": "Dubbelklik of druk op Enter om punten te bewerken",
|
"lineEditor_info": "Dubbelklik of druk op Enter om punten te bewerken",
|
||||||
"lineEditor_pointSelected": "Druk op Delete om een punt te verwijderen, op CtrlOrCmd+D om te kopiëren, of sleeg om te verplaatsen",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Selecteer een punt om te verplaatsen of te verwijderen, of houd Alt ingedrukt en klik om nieuwe punten toe te voegen",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": "Publiceer je eigen bibliotheek"
|
"publishLibrary": "Publiceer je eigen bibliotheek",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Kan voorbeeld niet tonen",
|
"cannotShowPreview": "Kan voorbeeld niet tonen",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lees onze blog",
|
"blog": "Lees onze blog",
|
||||||
"click": "klik",
|
"click": "klik",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Gebogen pijl",
|
"curvedArrow": "Gebogen pijl",
|
||||||
"curvedLine": "Kromme lijn",
|
"curvedLine": "Kromme lijn",
|
||||||
"documentation": "Documentatie",
|
"documentation": "Documentatie",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Vis fargeveljar for bakgrunn",
|
"showBackground": "Vis fargeveljar for bakgrunn",
|
||||||
"toggleTheme": "Veksle tema",
|
"toggleTheme": "Veksle tema",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Tilbakestill lerretet",
|
"clearReset": "Tilbakestill lerretet",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Teikn",
|
"freedraw": "Teikn",
|
||||||
"text": "Tekst",
|
"text": "Tekst",
|
||||||
"library": "Bibliotek",
|
"library": "Bibliotek",
|
||||||
"lock": "Hald fram med valt verktøy"
|
"lock": "Hald fram med valt verktøy",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Handlingar: lerret",
|
"canvasActions": "Handlingar: lerret",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Du kan endre storleiken fritt ved å halde inne SHIFT,\nhald ALT for å endre storleik frå sentrum",
|
"resizeImage": "Du kan endre storleiken fritt ved å halde inne SHIFT,\nhald ALT for å endre storleik frå sentrum",
|
||||||
"rotate": "Du kan låse vinklane ved å halde SHIFT medan du roterer",
|
"rotate": "Du kan låse vinklane ved å halde SHIFT medan du roterer",
|
||||||
"lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkt",
|
"lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkt",
|
||||||
"lineEditor_pointSelected": "Trykk på Slett for å fjerne punktet, CtrlOrCmd+D for å duplisere, eller dra for å flytte",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Vel eit punkt å flytte eller fjerne, eller hald Alt og klikk for å legge til nye punkt",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "Klikk for å plassere biletet, eller klikk og drag for å velje storleik manuelt",
|
"placeImage": "Klikk for å plassere biletet, eller klikk og drag for å velje storleik manuelt",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Kan ikkje vise førehandsvising",
|
"cannotShowPreview": "Kan ikkje vise førehandsvising",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Les bloggen vår",
|
"blog": "Les bloggen vår",
|
||||||
"click": "klikk",
|
"click": "klikk",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Boga pil",
|
"curvedArrow": "Boga pil",
|
||||||
"curvedLine": "Boga linje",
|
"curvedLine": "Boga linje",
|
||||||
"documentation": "Dokumentasjon",
|
"documentation": "Dokumentasjon",
|
||||||
|
|||||||
+20
-6
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Mostrar lo selector de color de fons",
|
"showBackground": "Mostrar lo selector de color de fons",
|
||||||
"toggleTheme": "Alternar tèma",
|
"toggleTheme": "Alternar tèma",
|
||||||
"personalLib": "Bibliotèca personala",
|
"personalLib": "Bibliotèca personala",
|
||||||
"excalidrawLib": "Bibliotèca Excalidraw"
|
"excalidrawLib": "Bibliotèca Excalidraw",
|
||||||
|
"decreaseFontSize": "Reduire talha poliça",
|
||||||
|
"increaseFontSize": "Aumentar talha poliça",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Reïnicializar lo canabàs",
|
"clearReset": "Reïnicializar lo canabàs",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Dessenhar",
|
"freedraw": "Dessenhar",
|
||||||
"text": "Tèxt",
|
"text": "Tèxt",
|
||||||
"library": "Bibliotèca",
|
"library": "Bibliotèca",
|
||||||
"lock": "Mantenir activa l’aisina aprèp dessenhar"
|
"lock": "Mantenir activa l’aisina aprèp dessenhar",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Accions del canabàs",
|
"canvasActions": "Accions del canabàs",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Podètz retalhar liurament en quichant CTRL,\nquichatz ALT per retalhar a partir del centre",
|
"resizeImage": "Podètz retalhar liurament en quichant CTRL,\nquichatz ALT per retalhar a partir del centre",
|
||||||
"rotate": "Podètz restrénger los angles en mantenent MAJ pendent la rotacion",
|
"rotate": "Podètz restrénger los angles en mantenent MAJ pendent la rotacion",
|
||||||
"lineEditor_info": "Doble-clicatz o quichatz Entrada per modificar los punts",
|
"lineEditor_info": "Doble-clicatz o quichatz Entrada per modificar los punts",
|
||||||
"lineEditor_pointSelected": "Quichatz Suprimir per suprimir lo punt, Ctrl o Cmd+D per lo duplicar, o fasètz lisar per lo desplaçar",
|
"lineEditor_pointSelected": "Quichar Suprimir per tirar lo(s) punt(s),\nCtrlOCmd+D per duplicar, o lisatz per desplaçar",
|
||||||
"lineEditor_nothingSelected": "Seleccionatz un punt de desplaçar o suprimir, o mantenètz Alt e clicatz per apondre punts novèls",
|
"lineEditor_nothingSelected": "Seleccionar un punt d’editar (manténer Maj. per ne seleccionar mantun),\no manténer Alt e clicar per n’apondre de novèls",
|
||||||
"placeImage": "Clicatz per plaçar l’imatge, o clicatz e lisatz per definir sa talha manualament",
|
"placeImage": "Clicatz per plaçar l’imatge, o clicatz e lisatz per definir sa talha manualament",
|
||||||
"publishLibrary": "Publicar vòstra pròpria bibliotèca"
|
"publishLibrary": "Publicar vòstra pròpria bibliotèca",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Afichatge impossible de l’apercebut",
|
"cannotShowPreview": "Afichatge impossible de l’apercebut",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Legir nòstre blog",
|
"blog": "Legir nòstre blog",
|
||||||
"click": "clic",
|
"click": "clic",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Sageta corba",
|
"curvedArrow": "Sageta corba",
|
||||||
"curvedLine": "Linha corba",
|
"curvedLine": "Linha corba",
|
||||||
"documentation": "Documentacion",
|
"documentation": "Documentacion",
|
||||||
@@ -296,7 +310,7 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "Requerit",
|
"required": "Requerit",
|
||||||
"website": ""
|
"website": "Picatz una URL valida"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "Enviatz vòstra bibliotèca per èsser compresa al ",
|
"pre": "Enviatz vòstra bibliotèca per èsser compresa al ",
|
||||||
|
|||||||
+41
-27
@@ -35,7 +35,7 @@
|
|||||||
"arrowhead_arrow": "ਤੀਰ",
|
"arrowhead_arrow": "ਤੀਰ",
|
||||||
"arrowhead_bar": "ਡੰਡੀ",
|
"arrowhead_bar": "ਡੰਡੀ",
|
||||||
"arrowhead_dot": "ਬਿੰਦੀ",
|
"arrowhead_dot": "ਬਿੰਦੀ",
|
||||||
"arrowhead_triangle": "",
|
"arrowhead_triangle": "ਤਿਕੋਣ",
|
||||||
"fontSize": "ਫੌਂਟ ਅਕਾਰ",
|
"fontSize": "ਫੌਂਟ ਅਕਾਰ",
|
||||||
"fontFamily": "ਫੌਂਟ ਪਰਿਵਾਰ",
|
"fontFamily": "ਫੌਂਟ ਪਰਿਵਾਰ",
|
||||||
"onlySelected": "ਸਿਰਫ ਚੁਣੇ ਹੋਏ ਹੀ",
|
"onlySelected": "ਸਿਰਫ ਚੁਣੇ ਹੋਏ ਹੀ",
|
||||||
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "ਰੇਖਾ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ",
|
"showStroke": "ਰੇਖਾ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ",
|
||||||
"showBackground": "ਬੈਕਗਰਾਉਂਡ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ",
|
"showBackground": "ਬੈਕਗਰਾਉਂਡ ਦਾ ਰੰਗ ਚੋਣਕਾਰ ਦਿਖਾਓ",
|
||||||
"toggleTheme": "ਥੀਮ ਬਦਲੋ",
|
"toggleTheme": "ਥੀਮ ਬਦਲੋ",
|
||||||
"personalLib": "",
|
"personalLib": "ਨਿੱਜੀ ਲਾਇਬ੍ਰੇਰੀ",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "ਐਕਸਕਲੀਡਰਾਅ ਲਾਇਬ੍ਰੇਰੀ",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "ਕੈਨਵਸ ਰੀਸੈੱਟ ਕਰੋ",
|
"clearReset": "ਕੈਨਵਸ ਰੀਸੈੱਟ ਕਰੋ",
|
||||||
@@ -136,12 +144,12 @@
|
|||||||
"lightMode": "ਲਾਇਟ ਮੋਡ",
|
"lightMode": "ਲਾਇਟ ਮੋਡ",
|
||||||
"zenMode": "ਜ਼ੈੱਨ ਮੋਡ",
|
"zenMode": "ਜ਼ੈੱਨ ਮੋਡ",
|
||||||
"exitZenMode": "ਜ਼ੈੱਨ ਮੋਡ 'ਚੋਂ ਬਾਹਰ ਨਿਕਲੋ",
|
"exitZenMode": "ਜ਼ੈੱਨ ਮੋਡ 'ਚੋਂ ਬਾਹਰ ਨਿਕਲੋ",
|
||||||
"cancel": "",
|
"cancel": "ਰੱਦ ਕਰੋ",
|
||||||
"clear": "",
|
"clear": "ਸਾਫ਼ ਕਰੋ",
|
||||||
"remove": "",
|
"remove": "ਹਟਾਓ",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "ਪ੍ਰਕਾਸ਼ਤ ਕਰੋ",
|
||||||
"submit": "",
|
"submit": "ਜਮ੍ਹਾ ਕਰਵਾਓ",
|
||||||
"confirm": ""
|
"confirm": "ਪੁਸ਼ਟੀ ਕਰੋ"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "ਇਹ ਸਾਰਾ ਕੈਨਵਸ ਸਾਫ ਕਰ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",
|
"clearReset": "ਇਹ ਸਾਰਾ ਕੈਨਵਸ ਸਾਫ ਕਰ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",
|
||||||
@@ -171,11 +179,11 @@
|
|||||||
"imageInsertError": "",
|
"imageInsertError": "",
|
||||||
"fileTooBig": "",
|
"fileTooBig": "",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": "SVG ਨਜਾਇਜ਼ ਹੈ।"
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "ਚੋਣਕਾਰ",
|
"selection": "ਚੋਣਕਾਰ",
|
||||||
"image": "",
|
"image": "ਤਸਵੀਰ ਸ਼ਾਮਲ ਕਰੋ",
|
||||||
"rectangle": "ਆਇਤ",
|
"rectangle": "ਆਇਤ",
|
||||||
"diamond": "ਹੀਰਾ",
|
"diamond": "ਹੀਰਾ",
|
||||||
"ellipse": "ਅੰਡਾਕਾਰ",
|
"ellipse": "ਅੰਡਾਕਾਰ",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "ਵਾਹੋ",
|
"freedraw": "ਵਾਹੋ",
|
||||||
"text": "ਪਾਠ",
|
"text": "ਪਾਠ",
|
||||||
"library": "ਲਾਇਬ੍ਰੇਰੀ",
|
"library": "ਲਾਇਬ੍ਰੇਰੀ",
|
||||||
"lock": "ਡਰਾਇੰਗ ਤੋਂ ਬਾਅਦ ਵੀ ਚੁਣੇ ਹੋਏ ਸੰਦ ਨੂੰ ਸਰਗਰਮ ਰੱਖੋ "
|
"lock": "ਡਰਾਇੰਗ ਤੋਂ ਬਾਅਦ ਵੀ ਚੁਣੇ ਹੋਏ ਸੰਦ ਨੂੰ ਸਰਗਰਮ ਰੱਖੋ ",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "ਕੈਨਵਸ ਦੀਆਂ ਕਾਰਵਾਈਆਂ",
|
"canvasActions": "ਕੈਨਵਸ ਦੀਆਂ ਕਾਰਵਾਈਆਂ",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "ਤੁਸੀਂ ਘੁਮਾਉਂਦੇ ਹੋਏ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਕੋਣਾਂ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ",
|
"rotate": "ਤੁਸੀਂ ਘੁਮਾਉਂਦੇ ਹੋਏ SHIFT ਦਬਾਈ ਰੱਖ ਕੇ ਕੋਣਾਂ ਨੂੰ ਕਾਬੂ ਕਰ ਸਕਦੇ ਹੋ",
|
||||||
"lineEditor_info": "ਬਿੰਦੂਆਂ ਨੂੰ ਸੋਧਣ ਲਈ ਡਬਲ-ਕਲਿੱਕ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
|
"lineEditor_info": "ਬਿੰਦੂਆਂ ਨੂੰ ਸੋਧਣ ਲਈ ਡਬਲ-ਕਲਿੱਕ ਜਾਂ ਐਂਟਰ ਦਬਾਓ",
|
||||||
"lineEditor_pointSelected": "ਬਿੰਦੀ ਹਟਾਉਣ ਲਈ ਡਲੀਟ ਦਬਾਓ, ਡੁਪਲੀਕੇਟ ਬਣਾਉਣ ਲਈ CtrlOrCmd+D, ਜਾਂ ਹਿਲਾਉਣ ਲਈ ਘਸੀਟੋ",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "ਹਿਲਾਉਣ ਜਾਂ ਹਟਾਉਣ ਲਈ ਬਿੰਦੂ ਚੁਣੋ, ਜਾਂ ਨਵਾਂ ਬਿੰਦੂ ਜੋੜਨ ਲਈ Alt ਦਬਾਕੇ ਕਲਿੱਕ ਕਰੋ",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "ਝਲਕ ਨਹੀਂ ਦਿਖਾ ਸਕਦੇ",
|
"cannotShowPreview": "ਝਲਕ ਨਹੀਂ ਦਿਖਾ ਸਕਦੇ",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "ਸਾਡਾ ਬਲੌਗ ਪੜ੍ਹੋ",
|
"blog": "ਸਾਡਾ ਬਲੌਗ ਪੜ੍ਹੋ",
|
||||||
"click": "ਕਲਿੱਕ",
|
"click": "ਕਲਿੱਕ",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "ਵਿੰਗਾ ਤੀਰ",
|
"curvedArrow": "ਵਿੰਗਾ ਤੀਰ",
|
||||||
"curvedLine": "ਵਿੰਗੀ ਲਕੀਰ",
|
"curvedLine": "ਵਿੰਗੀ ਲਕੀਰ",
|
||||||
"documentation": "ਕਾਗਜ਼ਾਤ",
|
"documentation": "ਕਾਗਜ਼ਾਤ",
|
||||||
@@ -275,13 +289,13 @@
|
|||||||
"zoomToSelection": "ਚੋਣ ਤੱਕ ਜ਼ੂਮ ਕਰੋ"
|
"zoomToSelection": "ਚੋਣ ਤੱਕ ਜ਼ੂਮ ਕਰੋ"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": "ਕੈਨਵਸ ਨੂੰ ਸਾਫ਼ ਕਰੋ"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਪ੍ਰਕਾਸ਼ਤ ਕਰੋ",
|
||||||
"itemName": "",
|
"itemName": "",
|
||||||
"authorName": "",
|
"authorName": "ਲੇਖਕ ਦਾ ਨਾਂ",
|
||||||
"githubUsername": "",
|
"githubUsername": "ਗਿੱਟਹੱਬ ਵਰਤੋਂਕਾਰ ਨਾਂ",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "",
|
||||||
"libraryName": "",
|
"libraryName": "",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "",
|
||||||
@@ -295,8 +309,8 @@
|
|||||||
"website": ""
|
"website": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "ਲੋੜੀਂਦਾ",
|
||||||
"website": ""
|
"website": "ਜਾਇਜ਼ URL ਭਰੋ"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
@@ -305,12 +319,12 @@
|
|||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
"link": "",
|
"link": "ਦਿਸ਼ਾ ਨਿਰਦੇਸ਼",
|
||||||
"post": ""
|
"post": ""
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "",
|
||||||
"link": "",
|
"link": "MIT ਲਾਇਸੈਂਸ, ",
|
||||||
"post": ""
|
"post": ""
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "",
|
||||||
@@ -319,11 +333,11 @@
|
|||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"content": "",
|
"content": "",
|
||||||
"link": ""
|
"link": "ਇੱਥੇ"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਰੀਸੈੱਟ ਕਰੋ",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚੋਂ ਚੁਣੀਆਂ ਹੋਈਆਂ ਆਈਟਮਾਂ ਹਟਾਓ"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "ਤੁਹਾਡੀ ਡਰਾਇੰਗਾਂ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇਨਕਰਿਪਟ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ, ਇਸ ਲਈ Excalidraw ਦੇ ਸਰਵਰ ਉਹਨਾਂ ਨੂੰ ਕਦੇ ਵੀ ਨਹੀਂ ਦੇਖਣਗੇ।",
|
"tooltip": "ਤੁਹਾਡੀ ਡਰਾਇੰਗਾਂ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇਨਕਰਿਪਟ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ, ਇਸ ਲਈ Excalidraw ਦੇ ਸਰਵਰ ਉਹਨਾਂ ਨੂੰ ਕਦੇ ਵੀ ਨਹੀਂ ਦੇਖਣਗੇ।",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "ਚੌੜਾਈ"
|
"width": "ਚੌੜਾਈ"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਜੋੜਿਆ",
|
||||||
"copyStyles": "ਕਾਪੀ ਕੀਤੇ ਸਟਾਇਲ।",
|
"copyStyles": "ਕਾਪੀ ਕੀਤੇ ਸਟਾਇਲ।",
|
||||||
"copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ।",
|
"copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ।",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ PNG ਵਜੋਂ ਕਾਪੀ ਕੀਤਾ ({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ PNG ਵਜੋਂ ਕਾਪੀ ਕੀਤਾ ({{exportColorScheme}})",
|
||||||
|
|||||||
@@ -1,45 +1,47 @@
|
|||||||
{
|
{
|
||||||
"ar-SA": 86,
|
"ar-SA": 88,
|
||||||
"bg-BG": 59,
|
"bg-BG": 61,
|
||||||
"bn-BD": 0,
|
"bn-BD": 0,
|
||||||
"ca-ES": 78,
|
"ca-ES": 95,
|
||||||
"cs-CZ": 25,
|
"cs-CZ": 24,
|
||||||
"da-DK": 17,
|
"da-DK": 16,
|
||||||
"de-DE": 100,
|
"de-DE": 99,
|
||||||
"el-GR": 88,
|
"el-GR": 87,
|
||||||
"en": 100,
|
"en": 100,
|
||||||
"es-ES": 88,
|
"es-ES": 84,
|
||||||
"fa-IR": 66,
|
"eu-ES": 96,
|
||||||
"fi-FI": 100,
|
"fa-IR": 63,
|
||||||
|
"fi-FI": 98,
|
||||||
"fr-FR": 100,
|
"fr-FR": 100,
|
||||||
"he-IL": 84,
|
"he-IL": 80,
|
||||||
"hi-IN": 58,
|
"hi-IN": 55,
|
||||||
"hu-HU": 52,
|
"hu-HU": 49,
|
||||||
"id-ID": 100,
|
"id-ID": 100,
|
||||||
"it-IT": 100,
|
"it-IT": 96,
|
||||||
"ja-JP": 99,
|
"ja-JP": 98,
|
||||||
"kab-KAB": 82,
|
"kab-KAB": 95,
|
||||||
"kk-KZ": 24,
|
"kk-KZ": 23,
|
||||||
"ko-KR": 58,
|
"ko-KR": 72,
|
||||||
|
"lt-LT": 24,
|
||||||
"lv-LV": 100,
|
"lv-LV": 100,
|
||||||
"my-MM": 49,
|
"my-MM": 46,
|
||||||
"nb-NO": 100,
|
"nb-NO": 100,
|
||||||
"nl-NL": 93,
|
"nl-NL": 90,
|
||||||
"nn-NO": 87,
|
"nn-NO": 83,
|
||||||
"oc-FR": 99,
|
"oc-FR": 97,
|
||||||
"pa-IN": 84,
|
"pa-IN": 87,
|
||||||
"pl-PL": 97,
|
"pl-PL": 93,
|
||||||
"pt-BR": 99,
|
"pt-BR": 98,
|
||||||
"pt-PT": 87,
|
"pt-PT": 83,
|
||||||
"ro-RO": 100,
|
"ro-RO": 100,
|
||||||
"ru-RU": 86,
|
"ru-RU": 99,
|
||||||
"si-LK": 9,
|
"si-LK": 9,
|
||||||
"sk-SK": 99,
|
"sk-SK": 100,
|
||||||
"sv-SE": 99,
|
"sv-SE": 100,
|
||||||
"ta-IN": 98,
|
"ta-IN": 99,
|
||||||
"tr-TR": 78,
|
"tr-TR": 85,
|
||||||
"uk-UA": 85,
|
"uk-UA": 82,
|
||||||
"zh-CN": 92,
|
"zh-CN": 100,
|
||||||
"zh-HK": 29,
|
"zh-HK": 28,
|
||||||
"zh-TW": 100
|
"zh-TW": 100
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Pokaż próbnik koloru tła",
|
"showBackground": "Pokaż próbnik koloru tła",
|
||||||
"toggleTheme": "Przełącz motyw",
|
"toggleTheme": "Przełącz motyw",
|
||||||
"personalLib": "Biblioteka prywatna",
|
"personalLib": "Biblioteka prywatna",
|
||||||
"excalidrawLib": "Biblioteka Excalidraw"
|
"excalidrawLib": "Biblioteka Excalidraw",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Wyczyść dokument i zresetuj kolor dokumentu",
|
"clearReset": "Wyczyść dokument i zresetuj kolor dokumentu",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Rysuj",
|
"freedraw": "Rysuj",
|
||||||
"text": "Tekst",
|
"text": "Tekst",
|
||||||
"library": "Biblioteka",
|
"library": "Biblioteka",
|
||||||
"lock": "Zablokuj wybrane narzędzie"
|
"lock": "Zablokuj wybrane narzędzie",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Narzędzia",
|
"canvasActions": "Narzędzia",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Możesz zmienić rozmiar swobodnie trzymając SHIFT,\nprzytrzymaj ALT, aby przeskalować względem środka obiektu",
|
"resizeImage": "Możesz zmienić rozmiar swobodnie trzymając SHIFT,\nprzytrzymaj ALT, aby przeskalować względem środka obiektu",
|
||||||
"rotate": "Możesz obracać element w równych odstępach trzymając wciśnięty SHIFT",
|
"rotate": "Możesz obracać element w równych odstępach trzymając wciśnięty SHIFT",
|
||||||
"lineEditor_info": "Kliknij dwukrotnie lub naciśnij Enter, aby edytować punkty",
|
"lineEditor_info": "Kliknij dwukrotnie lub naciśnij Enter, aby edytować punkty",
|
||||||
"lineEditor_pointSelected": "Naciśnij przycisk Usuń, aby usunąć punkt, Ctrl/Cmd+D, aby zduplikować, lub przeciągnij, aby przenieść",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Naciśnij w punkt by go edytować, przytrzymaj Alt i naciśnij by dodać nowy punkt",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "Kliknij, aby umieścić obraz, lub kliknij i przeciągnij, aby ustawić jego rozmiar ręcznie",
|
"placeImage": "Kliknij, aby umieścić obraz, lub kliknij i przeciągnij, aby ustawić jego rozmiar ręcznie",
|
||||||
"publishLibrary": "Opublikuj własną bibliotekę"
|
"publishLibrary": "Opublikuj własną bibliotekę",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Nie można wyświetlić podglądu",
|
"cannotShowPreview": "Nie można wyświetlić podglądu",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Przeczytaj na naszym blogu",
|
"blog": "Przeczytaj na naszym blogu",
|
||||||
"click": "kliknięcie",
|
"click": "kliknięcie",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Zakrzywiona strzałka",
|
"curvedArrow": "Zakrzywiona strzałka",
|
||||||
"curvedLine": "Zakrzywiona linia",
|
"curvedLine": "Zakrzywiona linia",
|
||||||
"documentation": "Dokumentacja",
|
"documentation": "Dokumentacja",
|
||||||
|
|||||||
+21
-7
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Exibir seletor de cores do fundo",
|
"showBackground": "Exibir seletor de cores do fundo",
|
||||||
"toggleTheme": "Alternar tema",
|
"toggleTheme": "Alternar tema",
|
||||||
"personalLib": "Biblioteca Pessoal",
|
"personalLib": "Biblioteca Pessoal",
|
||||||
"excalidrawLib": "Biblioteca do Excalidraw"
|
"excalidrawLib": "Biblioteca do Excalidraw",
|
||||||
|
"decreaseFontSize": "Diminuir o tamanho da fonte",
|
||||||
|
"increaseFontSize": "Aumentar o tamanho da fonte",
|
||||||
|
"unbindText": "Desvincular texto",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Limpar o canvas e redefinir a cor de fundo",
|
"clearReset": "Limpar o canvas e redefinir a cor de fundo",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Desenhar",
|
"freedraw": "Desenhar",
|
||||||
"text": "Texto",
|
"text": "Texto",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"lock": "Manter ativa a ferramenta selecionada após desenhar"
|
"lock": "Manter ativa a ferramenta selecionada após desenhar",
|
||||||
|
"penMode": "Prevenir a ação de tocar-ampliar e permitir apenas interações da caneta",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Ações da tela",
|
"canvasActions": "Ações da tela",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Você pode redimensionar livremente segurando SHIFT,\nsegure ALT para redimensionar a partir do centro",
|
"resizeImage": "Você pode redimensionar livremente segurando SHIFT,\nsegure ALT para redimensionar a partir do centro",
|
||||||
"rotate": "Você pode restringir os ângulos segurando SHIFT enquanto gira",
|
"rotate": "Você pode restringir os ângulos segurando SHIFT enquanto gira",
|
||||||
"lineEditor_info": "Clique duas vezes ou pressione Enter para editar os pontos",
|
"lineEditor_info": "Clique duas vezes ou pressione Enter para editar os pontos",
|
||||||
"lineEditor_pointSelected": "Pressione Deletar para remover o ponto, CtrlOuCmd+D para duplicar ou arraste para mover",
|
"lineEditor_pointSelected": "Pressione Delete para remover o(s) ponto(s),\nCtrl/Cmd+D para duplicar ou arraste para mover",
|
||||||
"lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou segure Alt e clique para adicionar novos pontos",
|
"lineEditor_nothingSelected": "Selecione um ponto para editar (segure SHIFT para selecionar vários) ou segure Alt e clique para adicionar novos pontos",
|
||||||
"placeImage": "Clique para colocar a imagem, ou clique e arraste para definir manualmente o seu tamanho",
|
"placeImage": "Clique para colocar a imagem, ou clique e arraste para definir manualmente o seu tamanho",
|
||||||
"publishLibrary": "Publicar sua própria biblioteca"
|
"publishLibrary": "Publicar sua própria biblioteca",
|
||||||
|
"bindTextToElement": "Pressione Enter para adicionar o texto",
|
||||||
|
"deepBoxSelect": "Segure Ctrl/Cmd para seleção profunda e para evitar arrastar"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Não é possível mostrar pré-visualização",
|
"cannotShowPreview": "Não é possível mostrar pré-visualização",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Leia o nosso blog",
|
"blog": "Leia o nosso blog",
|
||||||
"click": "clicar",
|
"click": "clicar",
|
||||||
|
"deepSelect": "Seleção profunda",
|
||||||
|
"deepBoxSelect": "Use a seleção profunda dentro da caixa para previnir arrastar",
|
||||||
"curvedArrow": "Seta curva",
|
"curvedArrow": "Seta curva",
|
||||||
"curvedLine": "Linha curva",
|
"curvedLine": "Linha curva",
|
||||||
"documentation": "Documentação",
|
"documentation": "Documentação",
|
||||||
@@ -290,13 +304,13 @@
|
|||||||
"authorName": "Seu nome ou nome de usuário",
|
"authorName": "Seu nome ou nome de usuário",
|
||||||
"libraryName": "Nome da sua biblioteca",
|
"libraryName": "Nome da sua biblioteca",
|
||||||
"libraryDesc": "Descrição para ajudar as pessoas a entenderem o uso da sua da sua biblioteca",
|
"libraryDesc": "Descrição para ajudar as pessoas a entenderem o uso da sua da sua biblioteca",
|
||||||
"githubHandle": "",
|
"githubHandle": "Identificador do GitHub (opcional), para que você possa editar a biblioteca depois de enviar para revisão",
|
||||||
"twitterHandle": "Nome de usuário do Twitter (opcional), para que saibamos quem deve ser creditado se promovermos no Twitter",
|
"twitterHandle": "Nome de usuário do Twitter (opcional), para que saibamos quem deve ser creditado se promovermos no Twitter",
|
||||||
"website": "Link para o seu site pessoal ou outro lugar (opcional)"
|
"website": "Link para o seu site pessoal ou outro lugar (opcional)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "Obrigatório",
|
"required": "Obrigatório",
|
||||||
"website": ""
|
"website": "Informe uma URL válida"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "Envie sua biblioteca para ser incluída no ",
|
"pre": "Envie sua biblioteca para ser incluída no ",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Mostrar seletor de cores do fundo",
|
"showBackground": "Mostrar seletor de cores do fundo",
|
||||||
"toggleTheme": "Alternar tema",
|
"toggleTheme": "Alternar tema",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Limpar a área de desenho e redefinir a cor de fundo",
|
"clearReset": "Limpar a área de desenho e redefinir a cor de fundo",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Desenhar",
|
"freedraw": "Desenhar",
|
||||||
"text": "Texto",
|
"text": "Texto",
|
||||||
"library": "Biblioteca",
|
"library": "Biblioteca",
|
||||||
"lock": "Manter a ferramenta selecionada ativa após desenhar"
|
"lock": "Manter a ferramenta selecionada ativa após desenhar",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Ações da área de desenho",
|
"canvasActions": "Ações da área de desenho",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Pode redimensionar livremente mantendo pressionada a tecla SHIFT,\nmantenha pressionada a tecla ALT para redimensionar do centro",
|
"resizeImage": "Pode redimensionar livremente mantendo pressionada a tecla SHIFT,\nmantenha pressionada a tecla ALT para redimensionar do centro",
|
||||||
"rotate": "Pode restringir os ângulos mantendo a tecla SHIFT premida enquanto roda",
|
"rotate": "Pode restringir os ângulos mantendo a tecla SHIFT premida enquanto roda",
|
||||||
"lineEditor_info": "Clique duas vezes ou pressione a tecla Enter para editar os pontos",
|
"lineEditor_info": "Clique duas vezes ou pressione a tecla Enter para editar os pontos",
|
||||||
"lineEditor_pointSelected": "Pressione a tecla Delete para remover o ponto, CtrlOuCmd+D para duplicar ou arraste para mover",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou mantenha premida a tecla Alt e clique para adicionar novos pontos",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "Clique para colocar a imagem ou clique e arraste para definir o seu tamanho manualmente",
|
"placeImage": "Clique para colocar a imagem ou clique e arraste para definir o seu tamanho manualmente",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Não é possível mostrar uma pré-visualização",
|
"cannotShowPreview": "Não é possível mostrar uma pré-visualização",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Leia o nosso blogue",
|
"blog": "Leia o nosso blogue",
|
||||||
"click": "clicar",
|
"click": "clicar",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Seta curva",
|
"curvedArrow": "Seta curva",
|
||||||
"curvedLine": "Linha curva",
|
"curvedLine": "Linha curva",
|
||||||
"documentation": "Documentação",
|
"documentation": "Documentação",
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Afișare selector culoare fundal",
|
"showBackground": "Afișare selector culoare fundal",
|
||||||
"toggleTheme": "Comutare temă",
|
"toggleTheme": "Comutare temă",
|
||||||
"personalLib": "Biblioteca personală",
|
"personalLib": "Biblioteca personală",
|
||||||
"excalidrawLib": "Biblioteca Excalidraw"
|
"excalidrawLib": "Biblioteca Excalidraw",
|
||||||
|
"decreaseFontSize": "Micșorează dimensiunea fontului",
|
||||||
|
"increaseFontSize": "Mărește dimensiunea fontului",
|
||||||
|
"unbindText": "Deconectare text",
|
||||||
|
"link": {
|
||||||
|
"edit": "Editare URL",
|
||||||
|
"create": "Creare URL",
|
||||||
|
"label": "URL"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Resetare pânză",
|
"clearReset": "Resetare pânză",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Desenare",
|
"freedraw": "Desenare",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Bibliotecă",
|
"library": "Bibliotecă",
|
||||||
"lock": "Menține activ instrumentul selectat după desenare"
|
"lock": "Menține activ instrumentul selectat după desenare",
|
||||||
|
"penMode": "Împiedică mărirea prin ciupire și acceptă desenarea liberă doar de la stilou",
|
||||||
|
"link": "Adăugare/actualizare URL pentru forma selectată"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Acțiuni pentru pânză",
|
"canvasActions": "Acțiuni pentru pânză",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Poți redimensiona liber ținând apăsată tasta SHIFT,\nține apăsată tasta ALT pentru a redimensiona din centru",
|
"resizeImage": "Poți redimensiona liber ținând apăsată tasta SHIFT,\nține apăsată tasta ALT pentru a redimensiona din centru",
|
||||||
"rotate": "Poți constrânge unghiurile, ținând apăsată tasta SHIFT în timp ce rotești",
|
"rotate": "Poți constrânge unghiurile, ținând apăsată tasta SHIFT în timp ce rotești",
|
||||||
"lineEditor_info": "Dă dublu clic sau apasă tasta Enter pentru a edita punctele",
|
"lineEditor_info": "Dă dublu clic sau apasă tasta Enter pentru a edita punctele",
|
||||||
"lineEditor_pointSelected": "Apasă tasta Delete pentru a elimina punctul, combinația de taste Ctrl sau Cmd + D pentru a-l duplica sau glisează-l pentru a-i schimba poziția",
|
"lineEditor_pointSelected": "Apasă tasta Delete pentru a elimina punctele,\ncombinația de taste Ctrl sau Cmd + D pentru a le duplica sau glisează-le pentru a le schimba poziția",
|
||||||
"lineEditor_nothingSelected": "Selectează un punct pentru a-l muta sau elimina sau ține apăsată tasta Alt și dă clic pentru a adăuga puncte noi",
|
"lineEditor_nothingSelected": "Selectează un punct pentru a-l edita (ține apăsată tasta SHIFT pentru a selecta mai multe),\nsau ține apăsată tasta Alt și dă clic pentru a adăuga puncte noi",
|
||||||
"placeImage": "Dă clic pentru a poziționa imaginea sau dă clic și glisează pentru a seta manual dimensiunea imaginii",
|
"placeImage": "Dă clic pentru a poziționa imaginea sau dă clic și glisează pentru a seta manual dimensiunea imaginii",
|
||||||
"publishLibrary": "Publică propria bibliotecă"
|
"publishLibrary": "Publică propria bibliotecă",
|
||||||
|
"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"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Nu se poate afișa previzualizarea",
|
"cannotShowPreview": "Nu se poate afișa previzualizarea",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Citește blogul nostru",
|
"blog": "Citește blogul nostru",
|
||||||
"click": "clic",
|
"click": "clic",
|
||||||
|
"deepSelect": "Selectare de adâncime",
|
||||||
|
"deepBoxSelect": "Selectare de adâncime în casetă și prevenire glisare",
|
||||||
"curvedArrow": "Săgeată curbată",
|
"curvedArrow": "Săgeată curbată",
|
||||||
"curvedLine": "Linie curbată",
|
"curvedLine": "Linie curbată",
|
||||||
"documentation": "Documentație",
|
"documentation": "Documentație",
|
||||||
|
|||||||
+68
-54
@@ -2,7 +2,7 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"paste": "Вставить",
|
"paste": "Вставить",
|
||||||
"pasteCharts": "Вставить диаграммы",
|
"pasteCharts": "Вставить диаграммы",
|
||||||
"selectAll": "Выбрать все",
|
"selectAll": "Выбрать всё",
|
||||||
"multiSelect": "Добавить элемент в выделенный фрагмент",
|
"multiSelect": "Добавить элемент в выделенный фрагмент",
|
||||||
"moveCanvas": "Переместить холст",
|
"moveCanvas": "Переместить холст",
|
||||||
"cut": "Вырезать",
|
"cut": "Вырезать",
|
||||||
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "Показать выбор цвета обводки",
|
"showStroke": "Показать выбор цвета обводки",
|
||||||
"showBackground": "Показать выбор цвета фона",
|
"showBackground": "Показать выбор цвета фона",
|
||||||
"toggleTheme": "Переключить тему",
|
"toggleTheme": "Переключить тему",
|
||||||
"personalLib": "",
|
"personalLib": "Личная библиотека",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Библиотека Excalidraw",
|
||||||
|
"decreaseFontSize": "Уменьшить шрифт",
|
||||||
|
"increaseFontSize": "Увеличить шрифт",
|
||||||
|
"unbindText": "Отвязать текст",
|
||||||
|
"link": {
|
||||||
|
"edit": "Редактировать ссылку",
|
||||||
|
"create": "Создать ссылку",
|
||||||
|
"label": "Ссылка"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Очистить холст и сбросить цвет фона",
|
"clearReset": "Очистить холст и сбросить цвет фона",
|
||||||
@@ -138,9 +146,9 @@
|
|||||||
"exitZenMode": "Выключить режим концентрации внимания",
|
"exitZenMode": "Выключить режим концентрации внимания",
|
||||||
"cancel": "Отменить",
|
"cancel": "Отменить",
|
||||||
"clear": "Очистить",
|
"clear": "Очистить",
|
||||||
"remove": "",
|
"remove": "Удалить",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "Опубликовать",
|
||||||
"submit": "",
|
"submit": "Отправить",
|
||||||
"confirm": "Подтвердить"
|
"confirm": "Подтвердить"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
@@ -156,22 +164,22 @@
|
|||||||
"loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?",
|
"loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?",
|
||||||
"collabStopOverridePrompt": "Остановка сессии перезапишет ваш предыдущий, локально сохранённый рисунок. Вы уверены? \n\n(Если вы хотите оставить ваш локальный рисунок, просто закройте вкладку браузера)",
|
"collabStopOverridePrompt": "Остановка сессии перезапишет ваш предыдущий, локально сохранённый рисунок. Вы уверены? \n\n(Если вы хотите оставить ваш локальный рисунок, просто закройте вкладку браузера)",
|
||||||
"errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.",
|
"errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.",
|
||||||
"errorAddingToLibrary": "Не удалось добавить элемент в библиотеку",
|
"errorAddingToLibrary": "Не удалось добавить объект в библиотеку",
|
||||||
"errorRemovingFromLibrary": "Не удалось удалить элемент из библиотеки",
|
"errorRemovingFromLibrary": "Не удалось удалить объект из библиотеки",
|
||||||
"confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?",
|
"confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?",
|
||||||
"imageDoesNotContainScene": "",
|
"imageDoesNotContainScene": "Это изображение не содержит данных сцены. Вы включили встраивание сцены во время экспорта?",
|
||||||
"cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения",
|
"cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения",
|
||||||
"invalidSceneUrl": "Невозможно импортировать сцену с предоставленного URL. Неверный формат, или не содержит верных Excalidraw JSON данных.",
|
"invalidSceneUrl": "Невозможно импортировать сцену с предоставленного URL. Неверный формат, или не содержит верных Excalidraw JSON данных.",
|
||||||
"resetLibrary": "Это очистит вашу библиотеку. Вы уверены?",
|
"resetLibrary": "Это очистит вашу библиотеку. Вы уверены?",
|
||||||
"removeItemsFromsLibrary": "",
|
"removeItemsFromsLibrary": "Удалить {{count}} объект(ов) из библиотеки?",
|
||||||
"invalidEncryptionKey": ""
|
"invalidEncryptionKey": "Ключ шифрования должен состоять из 22 символов. Одновременное редактирование отключено."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Неподдерживаемый тип файла.",
|
"unsupportedFileType": "Неподдерживаемый тип файла.",
|
||||||
"imageInsertError": "",
|
"imageInsertError": "Не удалось вставить изображение. Попробуйте позже...",
|
||||||
"fileTooBig": "Очень большой файл. Максимально разрешенный размер {{maxSize}}.",
|
"fileTooBig": "Очень большой файл. Максимально разрешенный размер {{maxSize}}.",
|
||||||
"svgImageInsertError": "Не удалось вставить изображение SVG. Разметка SVG выглядит недействительной.",
|
"svgImageInsertError": "Не удалось вставить изображение SVG. Разметка SVG выглядит недействительной.",
|
||||||
"invalidSVGString": ""
|
"invalidSVGString": "Некорректный SVG."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Выделение области",
|
"selection": "Выделение области",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Чертить",
|
"freedraw": "Чертить",
|
||||||
"text": "Текст",
|
"text": "Текст",
|
||||||
"library": "Библиотека",
|
"library": "Библиотека",
|
||||||
"lock": "Сохранять выбранный инструмент активным после рисования"
|
"lock": "Сохранять выбранный инструмент активным после рисования",
|
||||||
|
"penMode": "",
|
||||||
|
"link": "Добавить/обновить ссылку для выбранной фигуры"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Операции холста",
|
"canvasActions": "Операции холста",
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
"shapes": "Фигуры"
|
"shapes": "Фигуры"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "",
|
"canvasPanning": "Чтобы перемещать холст, удерживайте колесо мыши или пробел во время перетаскивания",
|
||||||
"linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии",
|
"linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии",
|
||||||
"freeDraw": "Нажмите и перетаскивайте, отпустите по завершении",
|
"freeDraw": "Нажмите и перетаскивайте, отпустите по завершении",
|
||||||
"text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст",
|
"text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст",
|
||||||
@@ -201,13 +211,15 @@
|
|||||||
"linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить",
|
"linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить",
|
||||||
"lockAngle": "Вы можете ограничить угол удерживая SHIFT",
|
"lockAngle": "Вы можете ограничить угол удерживая SHIFT",
|
||||||
"resize": "Вы можете ограничить пропорции, удерживая SHIFT во время изменения размеров,\nудерживайте ALT чтобы изменить размер из центра",
|
"resize": "Вы можете ограничить пропорции, удерживая SHIFT во время изменения размеров,\nудерживайте ALT чтобы изменить размер из центра",
|
||||||
"resizeImage": "",
|
"resizeImage": "Вы можете свободно изменять размеры, удерживая кнопку SHIFT,\nудерживайте кнопку ALT, чтобы изменять размер относительно центра",
|
||||||
"rotate": "Вы можете ограничить углы, удерживая SHIFT во время вращения",
|
"rotate": "Вы можете ограничить углы, удерживая SHIFT во время вращения",
|
||||||
"lineEditor_info": "Дважды кликните или нажмите Enter, чтобы редактировать точки",
|
"lineEditor_info": "Дважды кликните или нажмите Enter, чтобы редактировать точки",
|
||||||
"lineEditor_pointSelected": "Нажмите Delete для удаления точки, Ctrl или Cmd + D для дублирования, перетащите для перемещения",
|
"lineEditor_pointSelected": "Нажмите Delete для удаления точки (точек),\nCtrl+D или Cmd+D для дублирования, перетащите для перемещения",
|
||||||
"lineEditor_nothingSelected": "Выберите точку для перемещения или удаления. Alt + клик чтобы добавить новые точки",
|
"lineEditor_nothingSelected": "Выберите точку для редактирования (удерживайте SHIFT выбора нескольких точек),\nили удерживайте Alt и кликните для добавления новых точек",
|
||||||
"placeImage": "",
|
"placeImage": "Щелкните, чтобы разместить изображение, или нажмите и перетащите, чтобы установить его размер вручную",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "Опубликовать свою собственную библиотеку",
|
||||||
|
"bindTextToElement": "Нажмите Enter для добавления текста",
|
||||||
|
"deepBoxSelect": "Удерживайте Ctrl или Cmd для глубокого выделения, чтобы предотвратить перетаскивание"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Не удается отобразить предпросмотр",
|
"cannotShowPreview": "Не удается отобразить предпросмотр",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Прочитайте наш блог",
|
"blog": "Прочитайте наш блог",
|
||||||
"click": "нажать",
|
"click": "нажать",
|
||||||
|
"deepSelect": "Глубокое выделение",
|
||||||
|
"deepBoxSelect": "Глубокое выделение рамкой, и предотвращение перетаскивания",
|
||||||
"curvedArrow": "Изогнутая стрелка",
|
"curvedArrow": "Изогнутая стрелка",
|
||||||
"curvedLine": "Изогнутая линия",
|
"curvedLine": "Изогнутая линия",
|
||||||
"documentation": "Документация",
|
"documentation": "Документация",
|
||||||
@@ -275,55 +289,55 @@
|
|||||||
"zoomToSelection": "Увеличить до выделенного"
|
"zoomToSelection": "Увеличить до выделенного"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": "Очистить холст"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "Опубликовать библиотеку",
|
||||||
"itemName": "",
|
"itemName": "Название объекта",
|
||||||
"authorName": "",
|
"authorName": "Имя автора",
|
||||||
"githubUsername": "",
|
"githubUsername": "Имя пользователя GitHub",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "Имя пользователя в Twitter",
|
||||||
"libraryName": "",
|
"libraryName": "Название библиотеки",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Описание библиотеки",
|
||||||
"website": "",
|
"website": "Веб-сайт",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "",
|
"authorName": "Ваше имя или имя пользователя",
|
||||||
"libraryName": "",
|
"libraryName": "Название вашей библиотеки",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Описание вашей библиотеки, которое поможет людям понять её назначение",
|
||||||
"githubHandle": "",
|
"githubHandle": "Имя пользователя GitHub (необязательно), чтобы вы смогли редактировать библиотеку после её отправки на проверку",
|
||||||
"twitterHandle": "",
|
"twitterHandle": "Имя пользователя в Twitter (необязательно), чтобы мы знали, кого упомянуть при продвижении в Twitter",
|
||||||
"website": ""
|
"website": "Ссылка на ваш личный или какой-то другой сайт (необязательно)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "Обязательно",
|
||||||
"website": ""
|
"website": "Введите допустимый URL-адрес"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "",
|
"pre": "Отправить вашу библиотеку для включения в ",
|
||||||
"link": "",
|
"link": "хранилище публичных библиотек",
|
||||||
"post": ""
|
"post": ", чтобы другие люди могли использовать объекты из вашей библиотеки в своих рисунках."
|
||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "Библиотека должна быть подтверждена вручную. Пожалуйста, прочтите ",
|
||||||
"link": "",
|
"link": "рекомендации",
|
||||||
"post": ""
|
"post": " перед отправкой. Вам понадобится учетная запись GitHub, чтобы общаться и вносить изменения при необходимости, но это не обязательно."
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "Выполняя отправку, вы соглашаетесь с тем, что библиотека будет опубликована под ",
|
||||||
"link": "",
|
"link": "лицензией MIT, ",
|
||||||
"post": ""
|
"post": ", что, вкратце, означает, что каждый может использовать её без ограничений."
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "Каждый объект в библиотеке должен иметь свое собственное имя, чтобы по нему можно было фильтровать. Следующие объекты библиотеки будут включены:",
|
||||||
"atleastOneLibItem": ""
|
"atleastOneLibItem": "Пожалуйста, выберите хотя бы один объект в библиотеке, чтобы начать"
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "Библиотека отправлена",
|
||||||
"content": "",
|
"content": "Благодарим вас, {{authorName}}. Ваша библиотека была отправлена на проверку. Вы можете отслеживать статус",
|
||||||
"link": ""
|
"link": "здесь"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Сброс библиотеки",
|
||||||
"removeItemsFromLib": ""
|
"removeItemsFromLib": "Удалить выбранные объекты из библиотеки"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "Ваши данные защищены сквозным (End-to-end) шифрованием. Серверы Excalidraw никогда не получат доступ к ним.",
|
"tooltip": "Ваши данные защищены сквозным (End-to-end) шифрованием. Серверы Excalidraw никогда не получат доступ к ним.",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "Ширина"
|
"width": "Ширина"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "Добавлено в библиотеку",
|
||||||
"copyStyles": "Скопированы стили.",
|
"copyStyles": "Скопированы стили.",
|
||||||
"copyToClipboard": "Скопировано в буфер обмена.",
|
"copyToClipboard": "Скопировано в буфер обмена.",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} скопировано как PNG ({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} скопировано как PNG ({{exportColorScheme}})",
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "",
|
"text": "",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+21
-7
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Zobraziť výber farby pre pozadie",
|
"showBackground": "Zobraziť výber farby pre pozadie",
|
||||||
"toggleTheme": "Prepnúť tému",
|
"toggleTheme": "Prepnúť tému",
|
||||||
"personalLib": "Moja knižnica",
|
"personalLib": "Moja knižnica",
|
||||||
"excalidrawLib": "Excalidraw knižnica"
|
"excalidrawLib": "Excalidraw knižnica",
|
||||||
|
"decreaseFontSize": "Zmenšiť veľkosť písma",
|
||||||
|
"increaseFontSize": "Zväčšiť veľkosť písma",
|
||||||
|
"unbindText": "Zrušiť previazanie textu",
|
||||||
|
"link": {
|
||||||
|
"edit": "Upraviť odkaz",
|
||||||
|
"create": "Vytvoriť odkaz",
|
||||||
|
"label": "Odkaz"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Obnoviť plátno",
|
"clearReset": "Obnoviť plátno",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Kresliť",
|
"freedraw": "Kresliť",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Knižnica",
|
"library": "Knižnica",
|
||||||
"lock": "Nechať zvolený nástroj aktívny po skončení kreslenia"
|
"lock": "Nechať zvolený nástroj aktívny po skončení kreslenia",
|
||||||
|
"penMode": "Zabrániť priblíženiu potiahnutím a povoliť vstup voľnou rokou iba z pera",
|
||||||
|
"link": "Pridať/ Upraviť odkaz pre vybraný tvar"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Akcie plátna",
|
"canvasActions": "Akcie plátna",
|
||||||
@@ -192,7 +202,7 @@
|
|||||||
"shapes": "Tvary"
|
"shapes": "Tvary"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Pre pohyb plátna podržte koliesko myši ale medzerník počas ťahania",
|
"canvasPanning": "Pre pohyb plátna podržte koliesko myši alebo medzerník počas ťahania",
|
||||||
"linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky",
|
"linearElement": "Kliknite na vloženie viacerých bodov, potiahnite na vytvorenie jednej priamky",
|
||||||
"freeDraw": "Kliknite a ťahajte, pustite na ukončenie",
|
"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",
|
"text": "Tip: text môžete pridať aj dvojklikom kdekoľvek, ak je zvolený nástroj výber",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Podržte SHIFT pre voľnú zmenu veľkosti, podržte ALT pre zmenu veľkosti od stredu",
|
"resizeImage": "Podržte SHIFT pre voľnú zmenu veľkosti, podržte ALT pre zmenu veľkosti od stredu",
|
||||||
"rotate": "Počas rotácie obmedzíte uhol podržaním SHIFT",
|
"rotate": "Počas rotácie obmedzíte uhol podržaním SHIFT",
|
||||||
"lineEditor_info": "Použite dvojklik alebo stlačte Enter na editáciu bodov",
|
"lineEditor_info": "Použite dvojklik alebo stlačte Enter na editáciu bodov",
|
||||||
"lineEditor_pointSelected": "Stačte Delete na vymazanie bodu, CtrlOrCmd+D na jeho duplikovanie, alebo potiahnite na jeho presunutie",
|
"lineEditor_pointSelected": "Stačte Delete na vymazanie bodu (bodov), CtrlOrCmd+D na duplikovanie, alebo potiahnite na presunutie",
|
||||||
"lineEditor_nothingSelected": "Zvoľte bod na jeho presunutie alebo vymazanie, alebo podržte Alt a kliknite na pridanie nového bodu",
|
"lineEditor_nothingSelected": "Zvoľte bod na upravovanie (podržte SHIFT pre zvolenie viacerých bodov) alebo podržte Alt a kliknite na pridanie nového bodu",
|
||||||
"placeImage": "Kliknite pre umiestnenie obrázka alebo kliknite a ťahajte pre zmenu jeho veľkosti",
|
"placeImage": "Kliknite pre umiestnenie obrázka alebo kliknite a ťahajte pre zmenu jeho veľkosti",
|
||||||
"publishLibrary": "Uverejniť vašu knižnicu"
|
"publishLibrary": "Uverejniť vašu knižnicu",
|
||||||
|
"bindTextToElement": "Stlačte enter na pridanie textu",
|
||||||
|
"deepBoxSelect": "Podržte CtrlOrCmd na výber v skupine alebo zamedzeniu poťiahnutia"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Nie je možné zobraziť náhľad plátna",
|
"cannotShowPreview": "Nie je možné zobraziť náhľad plátna",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Prečítajte si náš blog",
|
"blog": "Prečítajte si náš blog",
|
||||||
"click": "kliknutie",
|
"click": "kliknutie",
|
||||||
|
"deepSelect": "Výber v skupine",
|
||||||
|
"deepBoxSelect": "Výber v skupine alebo zamedzenie poťiahnutia",
|
||||||
"curvedArrow": "Zakrivená šípka",
|
"curvedArrow": "Zakrivená šípka",
|
||||||
"curvedLine": "Zakrivená čiara",
|
"curvedLine": "Zakrivená čiara",
|
||||||
"documentation": "Dokumentácia",
|
"documentation": "Dokumentácia",
|
||||||
@@ -289,7 +303,7 @@
|
|||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "Vaše meno alebo užívateľské meno",
|
"authorName": "Vaše meno alebo užívateľské meno",
|
||||||
"libraryName": "Názov vašej knižnice",
|
"libraryName": "Názov vašej knižnice",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Popis vašej knižnice, ktorý ostatným pomôže porozumieť jej vhodnému použitiu",
|
||||||
"githubHandle": "GitHub užívateľské meno (nepovinné), aby ste mohli robiť úpravy po tom, čo bude knižnica uverejnená na schválenie",
|
"githubHandle": "GitHub užívateľské meno (nepovinné), aby ste mohli robiť úpravy po tom, čo bude knižnica uverejnená na schválenie",
|
||||||
"twitterHandle": "Twitter užívateľské meno (nepovinné), aby sme vedeli komu pripísať zásluhu pri propagovaní cez Twitter",
|
"twitterHandle": "Twitter užívateľské meno (nepovinné), aby sme vedeli komu pripísať zásluhu pri propagovaní cez Twitter",
|
||||||
"website": "Odkaz na vašu osobnú webovú stránku alebo niekam inam (nepovinné)"
|
"website": "Odkaz na vašu osobnú webovú stránku alebo niekam inam (nepovinné)"
|
||||||
|
|||||||
+20
-6
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Visa färgväljare för bakgrundsfärg",
|
"showBackground": "Visa färgväljare för bakgrundsfärg",
|
||||||
"toggleTheme": "Växla tema",
|
"toggleTheme": "Växla tema",
|
||||||
"personalLib": "Personligt bibliotek",
|
"personalLib": "Personligt bibliotek",
|
||||||
"excalidrawLib": "Excalidraw bibliotek"
|
"excalidrawLib": "Excalidraw bibliotek",
|
||||||
|
"decreaseFontSize": "Minska fontstorleken",
|
||||||
|
"increaseFontSize": "Öka fontstorleken",
|
||||||
|
"unbindText": "Koppla bort text",
|
||||||
|
"link": {
|
||||||
|
"edit": "Redigera länk",
|
||||||
|
"create": "Skapa länk",
|
||||||
|
"label": "Länk"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Återställ canvasen",
|
"clearReset": "Återställ canvasen",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Rita",
|
"freedraw": "Rita",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"library": "Bibliotek",
|
"library": "Bibliotek",
|
||||||
"lock": "Håll valt verktyg aktivt efter ritande"
|
"lock": "Håll valt verktyg aktivt efter ritande",
|
||||||
|
"penMode": "Förhindra nypzoom och acceptera endast frihandsteckning från penna",
|
||||||
|
"link": "Lägg till / Uppdatera länk för en vald form"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Canvas-åtgärder",
|
"canvasActions": "Canvas-åtgärder",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "Du kan ändra storlek fritt genom att hålla SHIFT,\nhåll ALT för att ändra storlek från mitten",
|
"resizeImage": "Du kan ändra storlek fritt genom att hålla SHIFT,\nhåll ALT för att ändra storlek från mitten",
|
||||||
"rotate": "Du kan begränsa vinklar genom att hålla SHIFT medan du roterar",
|
"rotate": "Du kan begränsa vinklar genom att hålla SHIFT medan du roterar",
|
||||||
"lineEditor_info": "Dubbelklicka eller tryck på Enter för att redigera punkter",
|
"lineEditor_info": "Dubbelklicka eller tryck på Enter för att redigera punkter",
|
||||||
"lineEditor_pointSelected": "Tryck på Ta bort för att ta bort punkt, Ctrl + D eller Cmd + D för att duplicera, eller dra för att flytta",
|
"lineEditor_pointSelected": "Tryck på Ta bort för att ta bort punkt(er), Ctrl + D eller Cmd + D för att duplicera, eller dra för att flytta",
|
||||||
"lineEditor_nothingSelected": "Välj en punkt att flytta eller ta bort, eller håll ned ALT och klicka för att lägga till nya punkter",
|
"lineEditor_nothingSelected": "Välj en punkt att redigera (håll SHIFT för att välja flera),\neller håll ned Alt och klicka för att lägga till nya punkter",
|
||||||
"placeImage": "Klicka för att placera bilden, eller klicka och dra för att ställa in dess storlek manuellt",
|
"placeImage": "Klicka för att placera bilden, eller klicka och dra för att ställa in dess storlek manuellt",
|
||||||
"publishLibrary": "Publicera ditt eget bibliotek"
|
"publishLibrary": "Publicera ditt eget bibliotek",
|
||||||
|
"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"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Kan inte visa förhandsgranskning",
|
"cannotShowPreview": "Kan inte visa förhandsgranskning",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Läs vår blogg",
|
"blog": "Läs vår blogg",
|
||||||
"click": "klicka",
|
"click": "klicka",
|
||||||
|
"deepSelect": "Djupval",
|
||||||
|
"deepBoxSelect": "Djupval inom boxen, och förhindra att dra",
|
||||||
"curvedArrow": "Böjd pil",
|
"curvedArrow": "Böjd pil",
|
||||||
"curvedLine": "Böjd linje",
|
"curvedLine": "Böjd linje",
|
||||||
"documentation": "Dokumentation",
|
"documentation": "Dokumentation",
|
||||||
@@ -296,7 +310,7 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "Obligatoriskt",
|
"required": "Obligatoriskt",
|
||||||
"website": ""
|
"website": "Ange en giltig URL"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "Skicka ditt bibliotek för att inkluderas i ",
|
"pre": "Skicka ditt bibliotek för att inkluderas i ",
|
||||||
|
|||||||
+25
-11
@@ -40,7 +40,7 @@
|
|||||||
"fontFamily": "எழுத்துரு குடும்பம்",
|
"fontFamily": "எழுத்துரு குடும்பம்",
|
||||||
"onlySelected": "தேர்ந்ததை மட்டும்",
|
"onlySelected": "தேர்ந்ததை மட்டும்",
|
||||||
"withBackground": "பின்புலம்",
|
"withBackground": "பின்புலம்",
|
||||||
"exportEmbedScene": "கட்சியை உட்பொதி",
|
"exportEmbedScene": "காட்சியை உட்பொதி",
|
||||||
"exportEmbedScene_details": "காட்சி தரவு ஏற்றுமதி செய்யப்பட்ட PNG/SVG கோப்பினுள் சேமிக்கப்படும் இதனால் காட்சியை அதிலிருந்து மீட்டெடுக்க முடியும். ஏற்றுமதி செய்யப்பட்ட கோப்பின் அளவை அதிகரிக்கும்.",
|
"exportEmbedScene_details": "காட்சி தரவு ஏற்றுமதி செய்யப்பட்ட PNG/SVG கோப்பினுள் சேமிக்கப்படும் இதனால் காட்சியை அதிலிருந்து மீட்டெடுக்க முடியும். ஏற்றுமதி செய்யப்பட்ட கோப்பின் அளவை அதிகரிக்கும்.",
|
||||||
"addWatermark": "\"எக்ஸ்கேலிட்ரா கொண்டு ஆனது\"-ஐச் சேர்",
|
"addWatermark": "\"எக்ஸ்கேலிட்ரா கொண்டு ஆனது\"-ஐச் சேர்",
|
||||||
"handDrawn": "கையால்-வரைந்த",
|
"handDrawn": "கையால்-வரைந்த",
|
||||||
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "பின்னணி நிற எடுப்பானைக் காட்டு",
|
"showBackground": "பின்னணி நிற எடுப்பானைக் காட்டு",
|
||||||
"toggleTheme": "தோற்றத்தை நிலைமாற்று",
|
"toggleTheme": "தோற்றத்தை நிலைமாற்று",
|
||||||
"personalLib": "தனக்குரிய நூலகம்",
|
"personalLib": "தனக்குரிய நூலகம்",
|
||||||
"excalidrawLib": "எக்ஸ்கேலிட்ரா நூலகம்"
|
"excalidrawLib": "எக்ஸ்கேலிட்ரா நூலகம்",
|
||||||
|
"decreaseFontSize": "எழுத்துரு அளவைக் குறை",
|
||||||
|
"increaseFontSize": "எழுத்துரு அளவை அதிகரி",
|
||||||
|
"unbindText": "உரையைப் பிணைவவிழ்",
|
||||||
|
"link": {
|
||||||
|
"edit": "தொடுப்பைத் திருத்து",
|
||||||
|
"create": "தொடுப்பைப் படை",
|
||||||
|
"label": "தொடுப்பு"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "கித்தானை அகரமாக்கு",
|
"clearReset": "கித்தானை அகரமாக்கு",
|
||||||
@@ -154,7 +162,7 @@
|
|||||||
"decryptFailed": "தரவை மறைநீக்க முடியவில்லை.",
|
"decryptFailed": "தரவை மறைநீக்க முடியவில்லை.",
|
||||||
"uploadedSecurly": "பதிவேற்றம் இருமுனை மறையாகத்தால் பாதுகாக்கப்பட்டுள்ளது, எனவே எக்ஸ்கேலிட்ரா சேவையகமும் மூன்றாம் தரப்பினரும் உள்ளடக்கத்தை வாசிக்கமுடியாது.",
|
"uploadedSecurly": "பதிவேற்றம் இருமுனை மறையாகத்தால் பாதுகாக்கப்பட்டுள்ளது, எனவே எக்ஸ்கேலிட்ரா சேவையகமும் மூன்றாம் தரப்பினரும் உள்ளடக்கத்தை வாசிக்கமுடியாது.",
|
||||||
"loadSceneOverridePrompt": "வெளிப்புறச்சித்திரமேற்றல் இருக்கிற உள்ளடக்கத்தை இடங்கொள்ளும். தொடர விருப்பமா?",
|
"loadSceneOverridePrompt": "வெளிப்புறச்சித்திரமேற்றல் இருக்கிற உள்ளடக்கத்தை இடங்கொள்ளும். தொடர விருப்பமா?",
|
||||||
"collabStopOverridePrompt": "",
|
"collabStopOverridePrompt": "அமர்வை நிறுத்துதல் முன்னர் அகமாக தேக்கிய உம் சித்திரத்தை மேலெழுதும். நீங்கள் உறுதியா?\n\n(உம் அக சித்திரத்தை வைக்கவேண்டுமெனில், சும்மா உலாவி தாவலை மூடுக அதற்குபதிலாக.)",
|
||||||
"errorLoadingLibrary": "மூன்றாம் தரப்பு நூலகத்தை ஏற்றுவதில் பிழை.",
|
"errorLoadingLibrary": "மூன்றாம் தரப்பு நூலகத்தை ஏற்றுவதில் பிழை.",
|
||||||
"errorAddingToLibrary": "உருப்படியை நூலகத்தில் சேர்க்க இயலா",
|
"errorAddingToLibrary": "உருப்படியை நூலகத்தில் சேர்க்க இயலா",
|
||||||
"errorRemovingFromLibrary": "உருப்படியை நூலகத்திலிருந்து நீக்க இயலா",
|
"errorRemovingFromLibrary": "உருப்படியை நூலகத்திலிருந்து நீக்க இயலா",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "வரை",
|
"freedraw": "வரை",
|
||||||
"text": "உரை",
|
"text": "உரை",
|
||||||
"library": "நூலகம்",
|
"library": "நூலகம்",
|
||||||
"lock": "தேர்ந்த கருவியை வரைந்த பின்பும் வைத்திரு"
|
"lock": "தேர்ந்த கருவியை வரைந்த பின்பும் வைத்திரு",
|
||||||
|
"penMode": "கிள்ளிப்பெரிதாக்குவதைத் தவிர் மற்றும் பேனாவிலிருந்து மட்டும் கட்டற்றவரைவை ஏல்",
|
||||||
|
"link": "தேர்தெடுத்த வடிவத்திற்குத் தொடுப்பைச் சேர்/ புதுப்பி"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "கித்தான் செயல்கள்",
|
"canvasActions": "கித்தான் செயல்கள்",
|
||||||
@@ -199,20 +209,22 @@
|
|||||||
"text_selected": "உரையைத் திருத்த இரு-சொடுக்கு அ ENTERஐ அழுத்து",
|
"text_selected": "உரையைத் திருத்த இரு-சொடுக்கு அ ENTERஐ அழுத்து",
|
||||||
"text_editing": "திருத்துவதை முடிக்க Escape அ CtrlOrCmd+ENTERஐ அழுத்து",
|
"text_editing": "திருத்துவதை முடிக்க Escape அ CtrlOrCmd+ENTERஐ அழுத்து",
|
||||||
"linearElementMulti": "கடைசி புள்ளியில் சொடுக்கு அ முடிக்க Escape அ Enter அழுத்து",
|
"linearElementMulti": "கடைசி புள்ளியில் சொடுக்கு அ முடிக்க Escape அ Enter அழுத்து",
|
||||||
"lockAngle": "",
|
"lockAngle": "SHIFTஐ அழுத்திப்பிடித்து கோணத்தை வற்புறுத்தலாம்",
|
||||||
"resize": "",
|
"resize": "மறுஅளவிடுகையில் SHIFTஐ அழுத்திப்பிடித்து விகிதசமத்தை வற்புறுத்தலாம்,\nமையத்திலிருந்து மறுஅளவிட ALTஐ அழுத்திப்பிடி",
|
||||||
"resizeImage": "SHIFTஐ நீண்டழுத்தி கட்டற்று அளவுமாற்றலாம்,\nமையத்திலிருந்து அளவுமாற்ற ALTஐ நீண்டழுத்துக",
|
"resizeImage": "SHIFTஐ நீண்டழுத்தி கட்டற்று அளவுமாற்றலாம்,\nமையத்திலிருந்து அளவுமாற்ற ALTஐ நீண்டழுத்துக",
|
||||||
"rotate": "",
|
"rotate": "சுழற்றுகையில் SHIFTஐ அழுத்திப்பிடித்து கோணங்களை வற்புறுத்தலாம்",
|
||||||
"lineEditor_info": "புள்ளிகளைத் திருத்த இரு-சொடுக்கு அ Enterஐ அழுத்து",
|
"lineEditor_info": "புள்ளிகளைத் திருத்த இரு-சொடுக்கு அ Enterஐ அழுத்து",
|
||||||
"lineEditor_pointSelected": "புள்ளியை நீக்க Deleteஐ அழுத்து, நகலாக்க CtrlOrCmd+D, அ நகர்த்த பிடித்திழு",
|
"lineEditor_pointSelected": "புள்ளி(கள்)ஐ நீக்க Deleteஐ அழுத்து,\nநகலாக்க CtrlOrCmd+D, அ நகர்த்த பிடித்திழு",
|
||||||
"lineEditor_nothingSelected": "நகர்த்தவோ நீக்கவோ புள்ளியைத் தேர், அ புதிய புள்ளிகளைச் சேர்க்க Altஐ அழுத்திப்பிடித்துச் சொடுக்கு",
|
"lineEditor_nothingSelected": "திருத்த புள்ளியைத் தேர்ந்தெடு (பலவற்றை தேர SHIFTஐ அழுத்திப்பிடி),\nஅ புதிய புள்ளிகளைச் சேர்க்க Altஐ அழுத்திப்பிடித்துச் சொடுக்கு",
|
||||||
"placeImage": "படத்தை வைக்கச் சொடுக்கு, அ கைமுறையாக அளவு அமைக்க சொடுக்கி பிடித்திழு",
|
"placeImage": "படத்தை வைக்கச் சொடுக்கு, அ கைமுறையாக அளவு அமைக்க சொடுக்கி பிடித்திழு",
|
||||||
"publishLibrary": "உம் சொந்த நூலகத்தைப் பிரசுரி"
|
"publishLibrary": "உம் சொந்த நூலகத்தைப் பிரசுரி",
|
||||||
|
"bindTextToElement": "உரையைச் சேர்க்க enterஐ அழுத்து",
|
||||||
|
"deepBoxSelect": "ஆழ்ந்துத் தேரவும் பிடித்திழுத்தலைத் தவிர்க்கவும் CtrlOrCmdஐ அழுத்திப்பிடி"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "முன்னோட்டம் காட்ட இயலவில்லை",
|
"cannotShowPreview": "முன்னோட்டம் காட்ட இயலவில்லை",
|
||||||
"canvasTooBig": "கித்தான் மிகப்பெரிதாக இருக்கலாம்.",
|
"canvasTooBig": "கித்தான் மிகப்பெரிதாக இருக்கலாம்.",
|
||||||
"canvasTooBigTip": ""
|
"canvasTooBigTip": "துணுக்குதவி: தூரத்திலுள்ள உறுப்புகளைப் நெருக்கமாக நகர்த்தப்பார்."
|
||||||
},
|
},
|
||||||
"errorSplash": {
|
"errorSplash": {
|
||||||
"headingMain_pre": "பிழையைச் சந்தித்தீரா. முயலவும் ",
|
"headingMain_pre": "பிழையைச் சந்தித்தீரா. முயலவும் ",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "எமது வலைப்பூவை வாசி",
|
"blog": "எமது வலைப்பூவை வாசி",
|
||||||
"click": "சொடுக்கு",
|
"click": "சொடுக்கு",
|
||||||
|
"deepSelect": "ஆழ்ந்துத் தேர்",
|
||||||
|
"deepBoxSelect": "பெட்டியினுள் ஆழ்ந்துத் தேர், மற்றும் பிடித்திழுத்தலைத் தவிர்",
|
||||||
"curvedArrow": "வளைந்த அம்பு",
|
"curvedArrow": "வளைந்த அம்பு",
|
||||||
"curvedLine": "வளைந்த வரி",
|
"curvedLine": "வளைந்த வரி",
|
||||||
"documentation": "ஆவணமாக்கல்",
|
"documentation": "ஆவணமாக்கல்",
|
||||||
|
|||||||
+53
-39
@@ -98,11 +98,19 @@
|
|||||||
"viewMode": "Görünüm modu",
|
"viewMode": "Görünüm modu",
|
||||||
"toggleExportColorScheme": "Renk şemasını dışa aktar/aktarma",
|
"toggleExportColorScheme": "Renk şemasını dışa aktar/aktarma",
|
||||||
"share": "Paylaş",
|
"share": "Paylaş",
|
||||||
"showStroke": "",
|
"showStroke": "Kontur için renk seçiciyi göster",
|
||||||
"showBackground": "",
|
"showBackground": "Arkaplan için renk seçiciyi göster",
|
||||||
"toggleTheme": "Temayı etkinleştir/devre dışı bırak",
|
"toggleTheme": "Temayı etkinleştir/devre dışı bırak",
|
||||||
"personalLib": "",
|
"personalLib": "Kişisel Kitaplık",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Excalidraw Kitaplığı",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Tuvali sıfırla",
|
"clearReset": "Tuvali sıfırla",
|
||||||
@@ -138,10 +146,10 @@
|
|||||||
"exitZenMode": "Zen modundan çık",
|
"exitZenMode": "Zen modundan çık",
|
||||||
"cancel": "İptal",
|
"cancel": "İptal",
|
||||||
"clear": "Temizle",
|
"clear": "Temizle",
|
||||||
"remove": "",
|
"remove": "Kaldır",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "Yayınla",
|
||||||
"submit": "",
|
"submit": "Gönder",
|
||||||
"confirm": ""
|
"confirm": "Onayla"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Tuvalin tamamı temizlenecek. Emin misiniz?",
|
"clearReset": "Tuvalin tamamı temizlenecek. Emin misiniz?",
|
||||||
@@ -159,18 +167,18 @@
|
|||||||
"errorAddingToLibrary": "Öğe kütüphaneye eklenemedi",
|
"errorAddingToLibrary": "Öğe kütüphaneye eklenemedi",
|
||||||
"errorRemovingFromLibrary": "Öğe kütüphaneden silinemedi",
|
"errorRemovingFromLibrary": "Öğe kütüphaneden silinemedi",
|
||||||
"confirmAddLibrary": "Bu, kitaplığınıza {{numShapes}} tane şekil ekleyecek. Emin misiniz?",
|
"confirmAddLibrary": "Bu, kitaplığınıza {{numShapes}} tane şekil ekleyecek. Emin misiniz?",
|
||||||
"imageDoesNotContainScene": "",
|
"imageDoesNotContainScene": "Bu görüntü herhangi bir sahne verisi içermiyor gibi görünüyor. Dışa aktarma sırasında sahne yerleştirmeyi etkinleştirdiniz mi?",
|
||||||
"cannotRestoreFromImage": "Sahne bu dosyadan oluşturulamıyor",
|
"cannotRestoreFromImage": "Sahne bu dosyadan oluşturulamıyor",
|
||||||
"invalidSceneUrl": "Verilen URL'den çalışma alanı yüklenemedi. Dosya bozuk olabilir veya geçerli bir Excalidraw JSON verisi bulundurmuyor olabilir.",
|
"invalidSceneUrl": "Verilen URL'den çalışma alanı yüklenemedi. Dosya bozuk olabilir veya geçerli bir Excalidraw JSON verisi bulundurmuyor olabilir.",
|
||||||
"resetLibrary": "Bu işlem kütüphanenizi sıfırlayacak. Emin misiniz?",
|
"resetLibrary": "Bu işlem kütüphanenizi sıfırlayacak. Emin misiniz?",
|
||||||
"removeItemsFromsLibrary": "",
|
"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ı."
|
"invalidEncryptionKey": "Şifreleme anahtarı 22 karakter olmalı. Canlı işbirliği devre dışı bırakıldı."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Desteklenmeyen dosya türü.",
|
"unsupportedFileType": "Desteklenmeyen dosya türü.",
|
||||||
"imageInsertError": "Görsel eklenemedi. Daha sonra tekrar deneyin...",
|
"imageInsertError": "Görsel eklenemedi. Daha sonra tekrar deneyin...",
|
||||||
"fileTooBig": "",
|
"fileTooBig": "Dosya çok büyük. İzin verilen maksimum boyut {{maxSize}}.",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "SVG resmi eklenemedi. SVG işaretlemesi geçersiz görünüyor.",
|
||||||
"invalidSVGString": "Geçersiz SVG."
|
"invalidSVGString": "Geçersiz SVG."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Çiz",
|
"freedraw": "Çiz",
|
||||||
"text": "Yazı",
|
"text": "Yazı",
|
||||||
"library": "Kütüphane",
|
"library": "Kütüphane",
|
||||||
"lock": "Seçilen aracı çizimden sonra aktif tut"
|
"lock": "Seçilen aracı çizimden sonra aktif tut",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Tuval eylemleri",
|
"canvasActions": "Tuval eylemleri",
|
||||||
@@ -196,18 +206,20 @@
|
|||||||
"linearElement": "Birden fazla nokta için tıklayın, tek çizgi için sürükleyin",
|
"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",
|
"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",
|
"text": "İpucu: seçme aracıyla herhangi bir yere çift tıklayarak da yazı ekleyebilirsin",
|
||||||
"text_selected": "",
|
"text_selected": "Metni düzenlemek için çift tıklayın veya ENTER'a basın",
|
||||||
"text_editing": "",
|
"text_editing": "Düzenlemeyi bitirmek için ESC veya Ctrl/Cmd+ENTER tuşlarına basın",
|
||||||
"linearElementMulti": "Tamamlamak için son noktayı seçin veya Escape ve Enter'dan birine basın",
|
"linearElementMulti": "Tamamlamak için son noktayı seçin veya Escape ve Enter'dan birine basın",
|
||||||
"lockAngle": "SHIFT tuşuna basılı tutarak açıyı koruyabilirsiniz",
|
"lockAngle": "SHIFT tuşuna basılı tutarak açıyı koruyabilirsiniz",
|
||||||
"resize": "Yeniden boyutlandırırken SHIFT'e basılı tutarak oranları kısıtlayabilirsiniz, merkezden yeniden boyutlandırmak için ALT'a basılı tutun",
|
"resize": "Yeniden boyutlandırırken SHIFT'e basılı tutarak oranları kısıtlayabilirsiniz, merkezden yeniden boyutlandırmak için ALT'a basılı tutun",
|
||||||
"resizeImage": "",
|
"resizeImage": "SHIFT'e basılı tutarak serbestçe yeniden boyutlandırabilirsiniz, merkezden yeniden boyutlandırmak için ALT tuşunu basılı tutun",
|
||||||
"rotate": "Döndürürken SHIFT tuşuna basılı tutarak açıları koruyabilirsiniz",
|
"rotate": "Döndürürken SHIFT tuşuna basılı tutarak açıları koruyabilirsiniz",
|
||||||
"lineEditor_info": "Noktaları düzenlemek için çift-tıklayın veya Enter'a basın",
|
"lineEditor_info": "Noktaları düzenlemek için çift-tıklayın veya Enter'a basın",
|
||||||
"lineEditor_pointSelected": "Noktayı silmek için Delete'e, kopyalamak için CtrlVeyaCmd+D'ye, veya hareket ettirmek için sürükleyin",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Kaldırmak veya oynatmak için bir nokta seç, veya yeni noktalar eklemek için Alt'a basılı tut",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "Resmi yerleştirmek için tıklayın ya da boyutunu manuel olarak ayarlamak için tıklayıp sürükleyin",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "Kendi kitaplığınızı yayınlayın",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Önizleme gösterilemiyor",
|
"cannotShowPreview": "Önizleme gösterilemiyor",
|
||||||
@@ -242,33 +254,35 @@
|
|||||||
},
|
},
|
||||||
"exportDialog": {
|
"exportDialog": {
|
||||||
"disk_title": "Belleğe kaydet",
|
"disk_title": "Belleğe kaydet",
|
||||||
"disk_details": "",
|
"disk_details": "Sahne verilerini daha sonra içe aktarabileceğiniz bir dosyaya aktarın.",
|
||||||
"disk_button": "Dosyaya kaydet",
|
"disk_button": "Dosyaya kaydet",
|
||||||
"link_title": "Paylaşılabilir bağlantı",
|
"link_title": "Paylaşılabilir bağlantı",
|
||||||
"link_details": "",
|
"link_details": "Salt okunur bir bağlantı olarak dışa aktarın.",
|
||||||
"link_button": "Bağlantı olarak dışa aktar",
|
"link_button": "Bağlantı olarak dışa aktar",
|
||||||
"excalidrawplus_description": "",
|
"excalidrawplus_description": "Sahneyi Excalidraw+ çalışma alanınıza kaydedin.",
|
||||||
"excalidrawplus_button": "Dışa aktar",
|
"excalidrawplus_button": "Dışa aktar",
|
||||||
"excalidrawplus_exportError": ""
|
"excalidrawplus_exportError": "Şu anda Excalidraw+'a aktarılamadı..."
|
||||||
},
|
},
|
||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Blog'umuzu okuyun",
|
"blog": "Blog'umuzu okuyun",
|
||||||
"click": "tıkla",
|
"click": "tıkla",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Eğri ok",
|
"curvedArrow": "Eğri ok",
|
||||||
"curvedLine": "Eğri çizgi",
|
"curvedLine": "Eğri çizgi",
|
||||||
"documentation": "Dokümantasyon",
|
"documentation": "Dokümantasyon",
|
||||||
"doubleClick": "",
|
"doubleClick": "çift-tıklama",
|
||||||
"drag": "sürükle",
|
"drag": "sürükle",
|
||||||
"editor": "Düzenleyici",
|
"editor": "Düzenleyici",
|
||||||
"editSelectedShape": "",
|
"editSelectedShape": "Seçili şekli düzenle (metin/ok/çizgi)",
|
||||||
"github": "Bir hata mı buldun? Bildir",
|
"github": "Bir hata mı buldun? Bildir",
|
||||||
"howto": "Rehberlerimizi takip edin",
|
"howto": "Rehberlerimizi takip edin",
|
||||||
"or": "veya",
|
"or": "veya",
|
||||||
"preventBinding": "Ok bağlamayı önleyin",
|
"preventBinding": "Ok bağlamayı önleyin",
|
||||||
"shapes": "Şekiller",
|
"shapes": "Şekiller",
|
||||||
"shortcuts": "Klavye kısayolları",
|
"shortcuts": "Klavye kısayolları",
|
||||||
"textFinish": "",
|
"textFinish": "Düzenlemeyi bitir (metin düzenleyici)",
|
||||||
"textNewLine": "",
|
"textNewLine": "Yeni satır ekle (metin düzenleyici)",
|
||||||
"title": "Yardım",
|
"title": "Yardım",
|
||||||
"view": "Görünüm",
|
"view": "Görünüm",
|
||||||
"zoomToFit": "Tüm öğeleri sığdırmak için yakınlaştır",
|
"zoomToFit": "Tüm öğeleri sığdırmak için yakınlaştır",
|
||||||
@@ -278,18 +292,18 @@
|
|||||||
"title": "Tuvali temizle"
|
"title": "Tuvali temizle"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "Kitaplığı yayınla",
|
||||||
"itemName": "",
|
"itemName": "Öğe adı",
|
||||||
"authorName": "",
|
"authorName": "Yazar adı",
|
||||||
"githubUsername": "",
|
"githubUsername": "GıtHub kullanıcı adı",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "Twitter kullanıcı adı",
|
||||||
"libraryName": "",
|
"libraryName": "Kitaplık adı",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "Kitaplık açıklaması",
|
||||||
"website": "",
|
"website": "Web sitesi",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "",
|
"authorName": "Adınız ya da kullanıcı adınız",
|
||||||
"libraryName": "",
|
"libraryName": "Kitaplığınızın adı",
|
||||||
"libraryDesc": "",
|
"libraryDesc": "İnsanların kullanımını anlamasına yardımcı olmak için kitaplığınızın açıklaması",
|
||||||
"githubHandle": "",
|
"githubHandle": "",
|
||||||
"twitterHandle": "",
|
"twitterHandle": "",
|
||||||
"website": ""
|
"website": ""
|
||||||
|
|||||||
+19
-5
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "Показати палітру для фону",
|
"showBackground": "Показати палітру для фону",
|
||||||
"toggleTheme": "Перемкнути тему",
|
"toggleTheme": "Перемкнути тему",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Очистити полотно",
|
"clearReset": "Очистити полотно",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "Малювати",
|
"freedraw": "Малювати",
|
||||||
"text": "Текст",
|
"text": "Текст",
|
||||||
"library": "Бібліотека",
|
"library": "Бібліотека",
|
||||||
"lock": "Залишити обраний інструмент після креслення"
|
"lock": "Залишити обраний інструмент після креслення",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Дії з полотном",
|
"canvasActions": "Дії з полотном",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Ви можете обмежити кути, утримуючи SHIFT під час обертання",
|
"rotate": "Ви можете обмежити кути, утримуючи SHIFT під час обертання",
|
||||||
"lineEditor_info": "Двічі клацніть або натисніть Enter щоб редагувати точки",
|
"lineEditor_info": "Двічі клацніть або натисніть Enter щоб редагувати точки",
|
||||||
"lineEditor_pointSelected": "Натисніть Видалити, щоб видалити точку, CtrlOrCmd+D для дублювання, або перетягніть, щоб переміститися",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "Виберіть точку для переміщення чи видалення, або утримуйте Alt і натисніть, щоб додати нові точки",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Не вдається показати попередній перегляд",
|
"cannotShowPreview": "Не вдається показати попередній перегляд",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Наш блог",
|
"blog": "Наш блог",
|
||||||
"click": "натиснути",
|
"click": "натиснути",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "Крива стрілка",
|
"curvedArrow": "Крива стрілка",
|
||||||
"curvedLine": "Крива лінія",
|
"curvedLine": "Крива лінія",
|
||||||
"documentation": "Документація",
|
"documentation": "Документація",
|
||||||
|
|||||||
+60
-46
@@ -20,7 +20,7 @@
|
|||||||
"background": "背景",
|
"background": "背景",
|
||||||
"fill": "填充",
|
"fill": "填充",
|
||||||
"strokeWidth": "描边宽度",
|
"strokeWidth": "描边宽度",
|
||||||
"strokeStyle": "描边样式",
|
"strokeStyle": "边框样式",
|
||||||
"strokeStyle_solid": "实线",
|
"strokeStyle_solid": "实线",
|
||||||
"strokeStyle_dashed": "虚线",
|
"strokeStyle_dashed": "虚线",
|
||||||
"strokeStyle_dotted": "点虚线",
|
"strokeStyle_dotted": "点虚线",
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
"round": "圆润",
|
"round": "圆润",
|
||||||
"arrowheads": "端点",
|
"arrowheads": "端点",
|
||||||
"arrowhead_none": "无",
|
"arrowhead_none": "无",
|
||||||
"arrowhead_arrow": "线条箭头",
|
"arrowhead_arrow": "箭头",
|
||||||
"arrowhead_bar": "条",
|
"arrowhead_bar": "条",
|
||||||
"arrowhead_dot": "圆点",
|
"arrowhead_dot": "圆点",
|
||||||
"arrowhead_triangle": "三角箭头",
|
"arrowhead_triangle": "三角箭头",
|
||||||
@@ -79,10 +79,10 @@
|
|||||||
"ungroup": "取消组选",
|
"ungroup": "取消组选",
|
||||||
"collaborators": "协作者",
|
"collaborators": "协作者",
|
||||||
"showGrid": "显示网格",
|
"showGrid": "显示网格",
|
||||||
"addToLibrary": "添加到库中",
|
"addToLibrary": "添加到素材库中",
|
||||||
"removeFromLibrary": "从库中移除",
|
"removeFromLibrary": "从素材库中移除",
|
||||||
"libraryLoadingMessage": "正在加载库…",
|
"libraryLoadingMessage": "正在加载素材库…",
|
||||||
"libraries": "浏览库",
|
"libraries": "浏览素材库",
|
||||||
"loadingScene": "正在加载绘图…",
|
"loadingScene": "正在加载绘图…",
|
||||||
"align": "对齐",
|
"align": "对齐",
|
||||||
"alignTop": "顶部对齐",
|
"alignTop": "顶部对齐",
|
||||||
@@ -101,8 +101,16 @@
|
|||||||
"showStroke": "显示描边颜色选择器",
|
"showStroke": "显示描边颜色选择器",
|
||||||
"showBackground": "显示背景颜色选择器",
|
"showBackground": "显示背景颜色选择器",
|
||||||
"toggleTheme": "切换主题",
|
"toggleTheme": "切换主题",
|
||||||
"personalLib": "",
|
"personalLib": "个人素材库",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "Excalidraw 素材库",
|
||||||
|
"decreaseFontSize": "缩小字体大小",
|
||||||
|
"increaseFontSize": "放大字体大小",
|
||||||
|
"unbindText": "取消文本绑定",
|
||||||
|
"link": {
|
||||||
|
"edit": "编辑链接",
|
||||||
|
"create": "新建链接",
|
||||||
|
"label": "链接"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "重置画布",
|
"clearReset": "重置画布",
|
||||||
@@ -129,7 +137,7 @@
|
|||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"undo": "撤销",
|
"undo": "撤销",
|
||||||
"redo": "重做",
|
"redo": "重做",
|
||||||
"resetLibrary": "重置资源库",
|
"resetLibrary": "重置素材库",
|
||||||
"createNewRoom": "新建会议室",
|
"createNewRoom": "新建会议室",
|
||||||
"fullScreen": "全屏",
|
"fullScreen": "全屏",
|
||||||
"darkMode": "深色模式",
|
"darkMode": "深色模式",
|
||||||
@@ -138,7 +146,7 @@
|
|||||||
"exitZenMode": "退出禅模式",
|
"exitZenMode": "退出禅模式",
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
"clear": "清除",
|
"clear": "清除",
|
||||||
"remove": "",
|
"remove": "删除",
|
||||||
"publishLibrary": "发布",
|
"publishLibrary": "发布",
|
||||||
"submit": "提交",
|
"submit": "提交",
|
||||||
"confirm": "确定"
|
"confirm": "确定"
|
||||||
@@ -155,15 +163,15 @@
|
|||||||
"uploadedSecurly": "上传已被端到端加密保护,这意味着 Excalidraw 的服务器和第三方都无法读取内容。",
|
"uploadedSecurly": "上传已被端到端加密保护,这意味着 Excalidraw 的服务器和第三方都无法读取内容。",
|
||||||
"loadSceneOverridePrompt": "加载外部绘图将取代您现有的内容。您想要继续吗?",
|
"loadSceneOverridePrompt": "加载外部绘图将取代您现有的内容。您想要继续吗?",
|
||||||
"collabStopOverridePrompt": "停止会话将覆盖您先前本地存储的绘图。 您确定吗?\n\n(如果您想保持本地绘图,只需关闭浏览器选项卡。)",
|
"collabStopOverridePrompt": "停止会话将覆盖您先前本地存储的绘图。 您确定吗?\n\n(如果您想保持本地绘图,只需关闭浏览器选项卡。)",
|
||||||
"errorLoadingLibrary": "加载第三方库时出错。",
|
"errorLoadingLibrary": "加载第三方素材库时出错。",
|
||||||
"errorAddingToLibrary": "无法将项目添加到库中",
|
"errorAddingToLibrary": "无法将项目添加到素材库中",
|
||||||
"errorRemovingFromLibrary": "无法从库中移除项目",
|
"errorRemovingFromLibrary": "无法从素材库中移除项目",
|
||||||
"confirmAddLibrary": "这将添加 {{numShapes}} 个形状到您的库。您确定吗?",
|
"confirmAddLibrary": "这将添加 {{numShapes}} 个形状到您的素材库中。您确定吗?",
|
||||||
"imageDoesNotContainScene": "此图像似乎不包含任何画布数据。您是否在导出时启用了画布嵌入功能?",
|
"imageDoesNotContainScene": "此图像似乎不包含任何画布数据。您是否在导出时启用了画布嵌入功能?",
|
||||||
"cannotRestoreFromImage": "无法从此图像文件恢复画布",
|
"cannotRestoreFromImage": "无法从此图像文件恢复画布",
|
||||||
"invalidSceneUrl": "无法从提供的 URL 导入场景。它或者格式不正确,或者不包含有效的 Excalidraw JSON 数据。",
|
"invalidSceneUrl": "无法从提供的 URL 导入场景。它或者格式不正确,或者不包含有效的 Excalidraw JSON 数据。",
|
||||||
"resetLibrary": "这将会清除你的资源库。你确定这么做吗?",
|
"resetLibrary": "这将会清除你的素材库。你确定要这么做吗?",
|
||||||
"removeItemsFromsLibrary": "要从库中删除 {{count}} 个项目吗?",
|
"removeItemsFromsLibrary": "确定要从素材库中删除 {{count}} 个项目吗?",
|
||||||
"invalidEncryptionKey": "密钥必须包含22个字符。实时协作已被禁用。"
|
"invalidEncryptionKey": "密钥必须包含22个字符。实时协作已被禁用。"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
@@ -183,8 +191,10 @@
|
|||||||
"line": "线条",
|
"line": "线条",
|
||||||
"freedraw": "自由书写",
|
"freedraw": "自由书写",
|
||||||
"text": "文字",
|
"text": "文字",
|
||||||
"library": "库",
|
"library": "素材库",
|
||||||
"lock": "绘制后保持所选的工具栏状态"
|
"lock": "绘制后保持所选的工具栏状态",
|
||||||
|
"penMode": "禁用手势缩放并只接收来自触控笔的输入",
|
||||||
|
"link": "为选中的形状添加/更新链接"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "画布动作",
|
"canvasActions": "画布动作",
|
||||||
@@ -204,10 +214,12 @@
|
|||||||
"resizeImage": "按住SHIFT可以自由缩放,\n按住ALT可以从中间缩放",
|
"resizeImage": "按住SHIFT可以自由缩放,\n按住ALT可以从中间缩放",
|
||||||
"rotate": "旋转时可以按住 Shift 来约束角度",
|
"rotate": "旋转时可以按住 Shift 来约束角度",
|
||||||
"lineEditor_info": "双击或按回车键编辑",
|
"lineEditor_info": "双击或按回车键编辑",
|
||||||
"lineEditor_pointSelected": "按下 Delete 移除点,Ctrl 或 Cmd+D 以复制,或拖动以移动",
|
"lineEditor_pointSelected": "按下 Delete 移除点,Ctrl 或 Cmd+D 以复制,拖动以移动",
|
||||||
"lineEditor_nothingSelected": "选中要移动或移除的点,或按住 Alt 并点击添加新点",
|
"lineEditor_nothingSelected": "选择要编辑的点 (按住 SHIFT 选择多个),\n或按住 Alt 并点击以添加新点",
|
||||||
"placeImage": "点击放置图像,或者点击并拖动以手动设置图像大小",
|
"placeImage": "点击放置图像,或者点击并拖动以手动设置图像大小",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "发布您自己的素材库",
|
||||||
|
"bindTextToElement": "按下 Enter 以添加文本",
|
||||||
|
"deepBoxSelect": "按住 CtrlOrCmd 以深度选择,并避免拖拽"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "无法显示预览",
|
"cannotShowPreview": "无法显示预览",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "浏览我们的博客",
|
"blog": "浏览我们的博客",
|
||||||
"click": "单击",
|
"click": "单击",
|
||||||
|
"deepSelect": "深度选择",
|
||||||
|
"deepBoxSelect": "在方框内深度选择并避免拖拽",
|
||||||
"curvedArrow": "曲线箭头",
|
"curvedArrow": "曲线箭头",
|
||||||
"curvedLine": "曲线",
|
"curvedLine": "曲线",
|
||||||
"documentation": "文档",
|
"documentation": "文档",
|
||||||
@@ -278,52 +292,52 @@
|
|||||||
"title": "清除画布"
|
"title": "清除画布"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "",
|
"title": "发布素材库",
|
||||||
"itemName": "项目名称",
|
"itemName": "项目名称",
|
||||||
"authorName": "作者名",
|
"authorName": "作者名",
|
||||||
"githubUsername": "GitHub 用户名",
|
"githubUsername": "GitHub 用户名",
|
||||||
"twitterUsername": "",
|
"twitterUsername": "Twitter 用户名",
|
||||||
"libraryName": "名称",
|
"libraryName": "名称",
|
||||||
"libraryDesc": "简介",
|
"libraryDesc": "简介",
|
||||||
"website": "网址",
|
"website": "网址",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "您的名字或用户名",
|
"authorName": "您的名字或用户名",
|
||||||
"libraryName": "库的名称",
|
"libraryName": "素材库名称",
|
||||||
"libraryDesc": "介绍您的库,让人们了解其用途",
|
"libraryDesc": "介绍您的素材库,让人们了解其用途",
|
||||||
"githubHandle": "",
|
"githubHandle": "GitHub 用户名(可选),填写后,您可以编辑已提交待审的素材库",
|
||||||
"twitterHandle": "",
|
"twitterHandle": "Twitter 用户名(可选),填写后,当我们在Twitter发布推广信息时便可提及您",
|
||||||
"website": "您个人网站的或任意的链接(可选)"
|
"website": "您个人网站的或任意的链接(可选)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "",
|
"required": "必填",
|
||||||
"website": ""
|
"website": "输入一个有效的URL"
|
||||||
},
|
},
|
||||||
"noteDescription": {
|
"noteDescription": {
|
||||||
"pre": "",
|
"pre": "提交后,您的素材库将被包含在 ",
|
||||||
"link": "",
|
"link": "公共素材库广场",
|
||||||
"post": ""
|
"post": "以供其他人在绘图中使用。"
|
||||||
},
|
},
|
||||||
"noteGuidelines": {
|
"noteGuidelines": {
|
||||||
"pre": "",
|
"pre": "提交的素材库需先经人工审核。在提交之前,请先阅读 ",
|
||||||
"link": "",
|
"link": "指南",
|
||||||
"post": ""
|
"post": " 。后续沟通和对库的修改需要 GitHub 账号,但这不是必须的。"
|
||||||
},
|
},
|
||||||
"noteLicense": {
|
"noteLicense": {
|
||||||
"pre": "",
|
"pre": "提交即表明您已同意素材库将遵循 ",
|
||||||
"link": "",
|
"link": "MIT 许可证, ",
|
||||||
"post": ""
|
"post": "简而言之,任何人都可以不受限制地使用它们。"
|
||||||
},
|
},
|
||||||
"noteItems": "",
|
"noteItems": "素材库中每个项目都有各自的名称以供筛选。以下项目将被包含:",
|
||||||
"atleastOneLibItem": ""
|
"atleastOneLibItem": "请选择至少一个素材库以开始"
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "",
|
"title": "素材库已提交",
|
||||||
"content": "",
|
"content": "谢谢你 {{authorName}}。您的素材库已被提交审核。跟进此次提交的状态请点击",
|
||||||
"link": ""
|
"link": "此处"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "",
|
"resetLibrary": "重置素材库",
|
||||||
"removeItemsFromLib": "从库中删除选中的项目"
|
"removeItemsFromLib": "从素材库中删除选中的项目"
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "您的绘图采用的端到端加密,其内容对于Excalidraw服务器是不可见的。",
|
"tooltip": "您的绘图采用的端到端加密,其内容对于Excalidraw服务器是不可见的。",
|
||||||
@@ -345,7 +359,7 @@
|
|||||||
"width": "宽度"
|
"width": "宽度"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "",
|
"addedToLibrary": "添加到素材库中",
|
||||||
"copyStyles": "复制样式",
|
"copyStyles": "复制样式",
|
||||||
"copyToClipboard": "已复制到剪切板。",
|
"copyToClipboard": "已复制到剪切板。",
|
||||||
"copyToClipboardAsPng": "已将 {{exportSelection}} 作为 PNG 复制到剪贴板\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "已将 {{exportSelection}} 作为 PNG 复制到剪贴板\n({{exportColorScheme}})",
|
||||||
|
|||||||
+17
-3
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "",
|
"showBackground": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"personalLib": "",
|
||||||
"excalidrawLib": ""
|
"excalidrawLib": "",
|
||||||
|
"decreaseFontSize": "",
|
||||||
|
"increaseFontSize": "",
|
||||||
|
"unbindText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "",
|
||||||
|
"create": "",
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "清空畫布",
|
"clearReset": "清空畫布",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "",
|
"freedraw": "",
|
||||||
"text": "",
|
"text": "",
|
||||||
"library": "",
|
"library": "",
|
||||||
"lock": ""
|
"lock": "",
|
||||||
|
"penMode": "",
|
||||||
|
"link": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "畫布動作",
|
"canvasActions": "畫布動作",
|
||||||
@@ -207,7 +217,9 @@
|
|||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"placeImage": "",
|
||||||
"publishLibrary": ""
|
"publishLibrary": "",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"deepBoxSelect": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "無法顯示預覽",
|
"cannotShowPreview": "無法顯示預覽",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "",
|
"blog": "",
|
||||||
"click": "",
|
"click": "",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
|
|||||||
+18
-4
@@ -102,7 +102,15 @@
|
|||||||
"showBackground": "顯示背景檢色器",
|
"showBackground": "顯示背景檢色器",
|
||||||
"toggleTheme": "切換主題",
|
"toggleTheme": "切換主題",
|
||||||
"personalLib": "個人資料庫",
|
"personalLib": "個人資料庫",
|
||||||
"excalidrawLib": "Excalidraw 資料庫"
|
"excalidrawLib": "Excalidraw 資料庫",
|
||||||
|
"decreaseFontSize": "縮小文字",
|
||||||
|
"increaseFontSize": "放大文字",
|
||||||
|
"unbindText": "取消綁定文字",
|
||||||
|
"link": {
|
||||||
|
"edit": "編輯連結",
|
||||||
|
"create": "建立連結",
|
||||||
|
"label": "連結"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "重置 canvas",
|
"clearReset": "重置 canvas",
|
||||||
@@ -184,7 +192,9 @@
|
|||||||
"freedraw": "繪圖",
|
"freedraw": "繪圖",
|
||||||
"text": "文字",
|
"text": "文字",
|
||||||
"library": "資料庫",
|
"library": "資料庫",
|
||||||
"lock": "可連續使用選取的工具"
|
"lock": "可連續使用選取的工具",
|
||||||
|
"penMode": "停止使用手勢縮放並接受以繪圖筆繪圖輸入",
|
||||||
|
"link": "為所選的形狀增加\b/更新連結"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "canvas 動作",
|
"canvasActions": "canvas 動作",
|
||||||
@@ -205,9 +215,11 @@
|
|||||||
"rotate": "旋轉時按住 Shift 可限制旋轉角度",
|
"rotate": "旋轉時按住 Shift 可限制旋轉角度",
|
||||||
"lineEditor_info": "雙擊滑鼠左鍵或按 Enter 來編輯控制點",
|
"lineEditor_info": "雙擊滑鼠左鍵或按 Enter 來編輯控制點",
|
||||||
"lineEditor_pointSelected": "按下 Delete 可移除錨點;Ctrl 或 Cmd + D 可複製;或可拖曳來移動",
|
"lineEditor_pointSelected": "按下 Delete 可移除錨點;Ctrl 或 Cmd + D 可複製;或可拖曳來移動",
|
||||||
"lineEditor_nothingSelected": "點選想移動或刪除的控制點;或按住 Alt 再點擊以增加新控制點",
|
"lineEditor_nothingSelected": "選擇要編輯的錨點(按住 SHIFT 可多選),\n或按住 Alt 並點擊以增加新錨點。",
|
||||||
"placeImage": "點擊以放置圖片,或點擊並拖曳以手動調整其尺寸。",
|
"placeImage": "點擊以放置圖片,或點擊並拖曳以手動調整其尺寸。",
|
||||||
"publishLibrary": "發布個人資料庫"
|
"publishLibrary": "發布個人資料庫",
|
||||||
|
"bindTextToElement": "按下 Enter 以加入文字。",
|
||||||
|
"deepBoxSelect": "按住 Ctrl 或 Cmd 以深度選取並避免拖曳"
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "無法顯示預覽",
|
"cannotShowPreview": "無法顯示預覽",
|
||||||
@@ -254,6 +266,8 @@
|
|||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "閱讀部落格",
|
"blog": "閱讀部落格",
|
||||||
"click": "點擊",
|
"click": "點擊",
|
||||||
|
"deepSelect": "深度選取",
|
||||||
|
"deepBoxSelect": "在容器內深度選取並避免拖曳",
|
||||||
"curvedArrow": "曲箭頭",
|
"curvedArrow": "曲箭頭",
|
||||||
"curvedLine": "曲線",
|
"curvedLine": "曲線",
|
||||||
"documentation": "文件",
|
"documentation": "文件",
|
||||||
|
|||||||
@@ -15,19 +15,20 @@ Please add the latest change on the top under the correct section.
|
|||||||
|
|
||||||
## Excalidraw API
|
## Excalidraw API
|
||||||
|
|
||||||
- [`exportToBlob`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToBlob) now automatically sets `appState.exportBackground` to `true` if exporting to `image/jpeg` MIME type (to ensure that alpha channel is not compressed to black color).
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
|
- Add `onLinkOpen` prop which will be triggered when clicked on element hyperlink if present [#4694](https://github.com/excalidraw/excalidraw/pull/4694).
|
||||||
- Support updating library using [`updateScene`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#updateScene) API [#4546](https://github.com/excalidraw/excalidraw/pull/4546).
|
- Support updating library using [`updateScene`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#updateScene) API [#4546](https://github.com/excalidraw/excalidraw/pull/4546).
|
||||||
|
|
||||||
- Introduced primary colors to the app. The colors can be overriden. Check [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#customizing-styles) on how to do so.
|
- Introduced primary colors to the app. The colors can be overriden. Check [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#customizing-styles) on how to do so [#4387](https://github.com/excalidraw/excalidraw/pull/4387).
|
||||||
|
|
||||||
- #### BREAKING CHANGE
|
- [`exportToBlob`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToBlob) now automatically sets `appState.exportBackground` to `true` if exporting to `image/jpeg` MIME type (to ensure that alpha channel is not compressed to black color) [#4342](https://github.com/excalidraw/excalidraw/pull/4342).
|
||||||
|
|
||||||
Removed `getElementMap` util method.
|
#### BREAKING CHANGE
|
||||||
|
|
||||||
- Changes to [`exportToCanvas`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToCanvas) util function:
|
Remove `getElementMap` util [#4306](https://github.com/excalidraw/excalidraw/pull/4306).
|
||||||
|
|
||||||
|
- Changes to [`exportToCanvas`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToCanvas) util function [#4321](https://github.com/excalidraw/excalidraw/pull/4321):
|
||||||
|
|
||||||
- Add `maxWidthOrHeight?: number` attribute.
|
- Add `maxWidthOrHeight?: number` attribute.
|
||||||
- `scale` returned from `getDimensions()` is now optional (default to `1`).
|
- `scale` returned from `getDimensions()` is now optional (default to `1`).
|
||||||
@@ -56,11 +57,11 @@ Please add the latest change on the top under the correct section.
|
|||||||
- `.excalidraw` files may now contain top-level `files` key in format of `Record<FileId, BinaryFileData>` when exporting any (image) elements.
|
- `.excalidraw` files may now contain top-level `files` key in format of `Record<FileId, BinaryFileData>` when exporting any (image) elements.
|
||||||
- Changes were made to various export utilityies exported from the package so that they take `files`. For now, TypeScript should help you figure the changes out.
|
- Changes were made to various export utilityies exported from the package so that they take `files`. For now, TypeScript should help you figure the changes out.
|
||||||
|
|
||||||
- Export [`isLinearElement`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#isLinearElement) and [`getNonDeletedElements`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#getNonDeletedElements).
|
- Export [`isLinearElement`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#isLinearElement) and [`getNonDeletedElements`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#getNonDeletedElements) [#4072](https://github.com/excalidraw/excalidraw/pull/4072).
|
||||||
|
|
||||||
- Support [`renderTopRightUI`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#renderTopRightUI) in mobile UI.
|
- Support [`renderTopRightUI`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#renderTopRightUI) in mobile UI [#4065](https://github.com/excalidraw/excalidraw/pull/4065).
|
||||||
|
|
||||||
- Export `THEME` constant from the package so host can use this when passing the theme.
|
- Export `THEME` constant from the package so host can use this when passing the theme [#4055](https://github.com/excalidraw/excalidraw/pull/4055).
|
||||||
|
|
||||||
#### BREAKING CHANGE
|
#### BREAKING CHANGE
|
||||||
|
|
||||||
@@ -68,16 +69,25 @@ Please add the latest change on the top under the correct section.
|
|||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
- Reset `unmounted` state on the component once component mounts to fix the mounting/unmounting repeatedly when used with `useEffect` [#4682](https://github.com/excalidraw/excalidraw/pull/4682).
|
||||||
- Panning the canvas using `mousewheel-drag` and `space-drag` now prevents the browser from scrolling the container/page [#4489](https://github.com/excalidraw/excalidraw/pull/4489).
|
- Panning the canvas using `mousewheel-drag` and `space-drag` now prevents the browser from scrolling the container/page [#4489](https://github.com/excalidraw/excalidraw/pull/4489).
|
||||||
- Scope drag and drop events to Excalidraw container to prevent overriding host application drag and drop events.
|
- Scope drag and drop events to Excalidraw container to prevent overriding host application drag and drop events [#4445](https://github.com/excalidraw/excalidraw/pull/4445).
|
||||||
|
|
||||||
### Build
|
### Build
|
||||||
|
|
||||||
- Added an example to test and develop the package [locally](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#Development) using `yarn start`
|
- Release preview package [@excalidraw/excalidraw-preview](https://www.npmjs.com/package/@excalidraw/excalidraw-preview) when triggered via comment
|
||||||
|
|
||||||
- Remove `file-loader` so font assets are not duplicated by webpack and use webpack asset modules for font generation [#4380](https://github.com/excalidraw/excalidraw/pull/4380)
|
```
|
||||||
|
@excalibot trigger release
|
||||||
|
```
|
||||||
|
|
||||||
- We're now compiling to `es2017` target. Notably, `async/await` is not compiled down to generators. [#4341](https://github.com/excalidraw/excalidraw/pull/4341)
|
[#4750](https://github.com/excalidraw/excalidraw/pull/4750).
|
||||||
|
|
||||||
|
- Added an example to test and develop the package [locally](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#Development) using `yarn start` [#4488](https://github.com/excalidraw/excalidraw/pull/4488)
|
||||||
|
|
||||||
|
- Remove `file-loader` so font assets are not duplicated by webpack and use webpack asset modules for font generation [#4380](https://github.com/excalidraw/excalidraw/pull/4380).
|
||||||
|
|
||||||
|
- We're now compiling to `es2017` target. Notably, `async/await` is not compiled down to generators. [#4341](https://github.com/excalidraw/excalidraw/pull/4341).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -87,7 +97,7 @@ Please add the latest change on the top under the correct section.
|
|||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
- Don't show save file to disk button in export dialog when `saveFileToDisk` passed as `false` in [`UIOptions.canvasActions.export`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportOpts).
|
- Don't show save file to disk button in export dialog when `saveFileToDisk` passed as `false` in [`UIOptions.canvasActions.export`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportOpts) [#4073](https://github.com/excalidraw/excalidraw/pull/4073).
|
||||||
|
|
||||||
- [`onPaste`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#onPaste) prop should return false to prevent the native excalidraw paste action [#3974](https://github.com/excalidraw/excalidraw/pull/3974).
|
- [`onPaste`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#onPaste) prop should return false to prevent the native excalidraw paste action [#3974](https://github.com/excalidraw/excalidraw/pull/3974).
|
||||||
|
|
||||||
|
|||||||
@@ -405,6 +405,7 @@ For a complete list of variables, check [theme.scss](https://github.com/excalidr
|
|||||||
| [`onLibraryChange`](#onLibraryChange) | <pre>(items: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200">LibraryItems</a>) => void | Promise<any> </pre> | | The callback if supplied is triggered when the library is updated and receives the library items. |
|
| [`onLibraryChange`](#onLibraryChange) | <pre>(items: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200">LibraryItems</a>) => void | Promise<any> </pre> | | The callback if supplied is triggered when the library is updated and receives the library items. |
|
||||||
| [`autoFocus`](#autoFocus) | boolean | false | Implies whether to focus the Excalidraw component on page load |
|
| [`autoFocus`](#autoFocus) | boolean | false | Implies whether to focus the Excalidraw component on page load |
|
||||||
| [`generateIdForFile`](#generateIdForFile) | `(file: File) => string | Promise<string>` | Allows you to override `id` generation for files added on canvas |
|
| [`generateIdForFile`](#generateIdForFile) | `(file: File) => string | Promise<string>` | Allows you to override `id` generation for files added on canvas |
|
||||||
|
| [`onLinkOpen`](#onLinkOpen) | <pre>(element: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">NonDeletedExcalidrawElement</a>, event: CustomEvent) </pre> | | This prop if passed will be triggered when link of an element is clicked |
|
||||||
|
|
||||||
### Dimensions of Excalidraw
|
### Dimensions of Excalidraw
|
||||||
|
|
||||||
@@ -704,6 +705,39 @@ Allows you to override `id` generation for files added on canvas (images). By de
|
|||||||
(file: File) => string | Promise<string>
|
(file: File) => string | Promise<string>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### `onLinkOpen`
|
||||||
|
|
||||||
|
This prop if passed will be triggered when clicked on link. To handle the redirect yourself (such as when using your own router for internal links), you must call `event.preventDefault()`.
|
||||||
|
|
||||||
|
```
|
||||||
|
(element: ExcalidrawElement, event: CustomEvent<{ nativeEvent: MouseEvent }>) => void
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const history = useHistory();
|
||||||
|
|
||||||
|
// open internal links using the app's router, but opens external links in
|
||||||
|
// a new tab/window
|
||||||
|
const onLinkOpen: ExcalidrawProps["onLinkOpen"] = useCallback(
|
||||||
|
(element, event) => {
|
||||||
|
const link = element.link;
|
||||||
|
const { nativeEvent } = event.detail;
|
||||||
|
const isNewTab = nativeEvent.ctrlKey || nativeEvent.metaKey;
|
||||||
|
const isNewWindow = nativeEvent.shiftKey;
|
||||||
|
const isInternalLink =
|
||||||
|
link.startsWith("/") || link.includes(window.location.origin);
|
||||||
|
if (isInternalLink && !isNewTab && !isNewWindow) {
|
||||||
|
history.push(link.replace(window.location.origin, ""));
|
||||||
|
// signal that we're handling the redirect ourselves
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[history],
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
### Does it support collaboration ?
|
### Does it support collaboration ?
|
||||||
|
|
||||||
No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx).
|
No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx).
|
||||||
@@ -1027,3 +1061,13 @@ yarn start
|
|||||||
[http://localhost:3001](http://localhost:3001) will open in your default browser.
|
[http://localhost:3001](http://localhost:3001) will open in your default browser.
|
||||||
|
|
||||||
The example is same as the [codesandbox example](https://ehlz3.csb.app/)
|
The example is same as the [codesandbox example](https://ehlz3.csb.app/)
|
||||||
|
|
||||||
|
#### Create a test release
|
||||||
|
|
||||||
|
You can create a test release by posting the below comment in your pull request
|
||||||
|
|
||||||
|
```
|
||||||
|
@excalibot release package
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the version is released `@excalibot` will post a comment with the release version.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useState, useRef } from "react";
|
import { useEffect, useState, useRef, useCallback } from "react";
|
||||||
|
|
||||||
import InitialData from "./initialData";
|
import InitialData from "./initialData";
|
||||||
import Sidebar from "./sidebar/Sidebar";
|
import Sidebar from "./sidebar/Sidebar";
|
||||||
@@ -87,6 +87,21 @@ export default function App() {
|
|||||||
excalidrawRef.current.updateScene(sceneData);
|
excalidrawRef.current.updateScene(sceneData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onLinkOpen = useCallback((element, event) => {
|
||||||
|
const link = element.link;
|
||||||
|
const { nativeEvent } = event.detail;
|
||||||
|
const isNewTab = nativeEvent.ctrlKey || nativeEvent.metaKey;
|
||||||
|
const isNewWindow = nativeEvent.shiftKey;
|
||||||
|
const isInternalLink =
|
||||||
|
link.startsWith("/") || link.includes(window.location.origin);
|
||||||
|
if (isInternalLink && !isNewTab && !isNewWindow) {
|
||||||
|
// signal that we're handling the redirect ourselves
|
||||||
|
event.preventDefault();
|
||||||
|
// do a custom redirect, such as passing to react-router
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="App">
|
||||||
<h1> Excalidraw Example</h1>
|
<h1> Excalidraw Example</h1>
|
||||||
@@ -179,6 +194,7 @@ export default function App() {
|
|||||||
UIOptions={{ canvasActions: { loadScene: false } }}
|
UIOptions={{ canvasActions: { loadScene: false } }}
|
||||||
renderTopRightUI={renderTopRightUI}
|
renderTopRightUI={renderTopRightUI}
|
||||||
renderFooter={renderFooter}
|
renderFooter={renderFooter}
|
||||||
|
onLinkOpen={onLinkOpen}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const Excalidraw = (props: ExcalidrawProps) => {
|
|||||||
initialData,
|
initialData,
|
||||||
excalidrawRef,
|
excalidrawRef,
|
||||||
onCollabButtonClick,
|
onCollabButtonClick,
|
||||||
isCollaborating,
|
isCollaborating = false,
|
||||||
onPointerUpdate,
|
onPointerUpdate,
|
||||||
renderTopRightUI,
|
renderTopRightUI,
|
||||||
renderFooter,
|
renderFooter,
|
||||||
@@ -35,6 +35,7 @@ const Excalidraw = (props: ExcalidrawProps) => {
|
|||||||
onLibraryChange,
|
onLibraryChange,
|
||||||
autoFocus = false,
|
autoFocus = false,
|
||||||
generateIdForFile,
|
generateIdForFile,
|
||||||
|
onLinkOpen,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
const canvasActions = props.UIOptions?.canvasActions;
|
const canvasActions = props.UIOptions?.canvasActions;
|
||||||
@@ -96,6 +97,7 @@ const Excalidraw = (props: ExcalidrawProps) => {
|
|||||||
onLibraryChange={onLibraryChange}
|
onLibraryChange={onLibraryChange}
|
||||||
autoFocus={autoFocus}
|
autoFocus={autoFocus}
|
||||||
generateIdForFile={generateIdForFile}
|
generateIdForFile={generateIdForFile}
|
||||||
|
onLinkOpen={onLinkOpen}
|
||||||
/>
|
/>
|
||||||
</InitializeApp>
|
</InitializeApp>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -44,10 +44,10 @@
|
|||||||
"react-dom": "^17.0.2"
|
"react-dom": "^17.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.16.7",
|
"@babel/core": "7.17.0",
|
||||||
"@babel/plugin-transform-arrow-functions": "7.16.7",
|
"@babel/plugin-transform-arrow-functions": "7.16.7",
|
||||||
"@babel/plugin-transform-async-to-generator": "7.16.0",
|
"@babel/plugin-transform-async-to-generator": "7.16.0",
|
||||||
"@babel/plugin-transform-runtime": "7.16.4",
|
"@babel/plugin-transform-runtime": "7.16.8",
|
||||||
"@babel/plugin-transform-typescript": "7.16.1",
|
"@babel/plugin-transform-typescript": "7.16.1",
|
||||||
"@babel/preset-env": "7.16.7",
|
"@babel/preset-env": "7.16.7",
|
||||||
"@babel/preset-react": "7.16.7",
|
"@babel/preset-react": "7.16.7",
|
||||||
@@ -56,17 +56,17 @@
|
|||||||
"babel-loader": "8.2.3",
|
"babel-loader": "8.2.3",
|
||||||
"babel-plugin-transform-class-properties": "6.24.1",
|
"babel-plugin-transform-class-properties": "6.24.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"css-loader": "6.5.1",
|
"css-loader": "6.6.0",
|
||||||
"mini-css-extract-plugin": "2.4.6",
|
"mini-css-extract-plugin": "2.4.6",
|
||||||
"postcss-loader": "6.2.1",
|
"postcss-loader": "6.2.1",
|
||||||
"sass-loader": "12.4.0",
|
"sass-loader": "12.4.0",
|
||||||
"terser-webpack-plugin": "5.3.0",
|
"terser-webpack-plugin": "5.3.1",
|
||||||
"ts-loader": "9.2.6",
|
"ts-loader": "9.2.6",
|
||||||
"typescript": "4.5.4",
|
"typescript": "4.5.4",
|
||||||
"webpack": "5.65.0",
|
"webpack": "5.65.0",
|
||||||
"webpack-bundle-analyzer": "4.5.0",
|
"webpack-bundle-analyzer": "4.5.0",
|
||||||
"webpack-cli": "4.9.1",
|
"webpack-cli": "4.9.2",
|
||||||
"webpack-dev-server": "4.7.2",
|
"webpack-dev-server": "4.7.4",
|
||||||
"webpack-merge": "5.8.0"
|
"webpack-merge": "5.8.0"
|
||||||
},
|
},
|
||||||
"bugs": "https://github.com/excalidraw/excalidraw/issues",
|
"bugs": "https://github.com/excalidraw/excalidraw/issues",
|
||||||
@@ -76,7 +76,9 @@
|
|||||||
"build:umd": "rm -rf dist && cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types",
|
"build:umd": "rm -rf dist && cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types",
|
||||||
"build:umd:withAnalyzer": "cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js",
|
"build:umd:withAnalyzer": "cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js",
|
||||||
"pack": "yarn build:umd && yarn pack",
|
"pack": "yarn build:umd && yarn pack",
|
||||||
"start": "webpack serve --config webpack.dev-server.config.js "
|
"start": "webpack serve --config webpack.dev-server.config.js",
|
||||||
|
"install:deps": "yarn install --frozen-lockfile && yarn --cwd ../../../",
|
||||||
|
"build:example": "EXAMPLE=true webpack --config webpack.dev-server.config.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "10.0.0"
|
"dotenv": "10.0.0"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user