Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbf4d5a591 | ||
|
|
38d0966227 | ||
|
|
37882c66cb | ||
|
|
7f66e1fe89 | ||
|
|
2b4540225d | ||
|
|
dc2f25c14a | ||
|
|
8fb16669ab | ||
|
|
f2600fe3e8 | ||
|
|
95ddc66339 | ||
|
|
5bcd8280c9 | ||
|
|
c99e81678b | ||
|
|
d1f39823f1 | ||
|
|
47cbb5b6fb | ||
|
|
8fd970320e |
@@ -9,7 +9,7 @@ You will need to import the `Footer` component from the package and wrap your co
|
|||||||
```jsx live
|
```jsx live
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<div style={{ height: "500px"}}>
|
<div style={{ height: "500px" }}>
|
||||||
<Excalidraw>
|
<Excalidraw>
|
||||||
<Footer>
|
<Footer>
|
||||||
<button
|
<button
|
||||||
@@ -27,19 +27,19 @@ function App() {
|
|||||||
|
|
||||||
This will only work for `Desktop` devices.
|
This will only work for `Desktop` devices.
|
||||||
|
|
||||||
For `mobile` you will need to render it inside the [MainMenu](#mainmenu). You can use the [`useDevice`](#useDevice) hook to check the type of device, this will be available only inside the `children` of `Excalidraw` component.
|
For `mobile` you will need to render it inside the [MainMenu](#mainmenu). You can use the [`useEditorInterface`](#useEditorInterface) hook to check the type of device, this will be available only inside the `children` of `Excalidraw` component.
|
||||||
|
|
||||||
Open the `Menu` in the below playground and you will see the `custom footer` rendered.
|
Open the `Menu` in the below playground and you will see the `custom footer` rendered.
|
||||||
|
|
||||||
```jsx live noInline
|
```jsx live noInline
|
||||||
const MobileFooter = ({}) => {
|
const MobileFooter = ({}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
if (device.editor.isMobile) {
|
if (editorInterface.formFactor === "phone") {
|
||||||
return (
|
return (
|
||||||
<Footer>
|
<Footer>
|
||||||
<button
|
<button
|
||||||
className="custom-footer"
|
className="custom-footer"
|
||||||
style= {{ marginLeft: '20px', height: '2rem'}}
|
style={{ marginLeft: "20px", height: "2rem" }}
|
||||||
onClick={() => alert("This is custom footer in mobile menu")}
|
onClick={() => alert("This is custom footer in mobile menu")}
|
||||||
>
|
>
|
||||||
custom footer
|
custom footer
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ viewportCoordsToSceneCoords({ clientX: number, clientY: number },<br/> 
|
|||||||
appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L95">AppState</a><br/>): {x: number, y: number}
|
appState: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L95">AppState</a><br/>): {x: number, y: number}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
### useDevice
|
### useEditorInterface
|
||||||
|
|
||||||
This hook can be used to check the type of device which is being used. It can only be used inside the `children` of `Excalidraw` component.
|
This hook can be used to check the type of device which is being used. It can only be used inside the `children` of `Excalidraw` component.
|
||||||
|
|
||||||
@@ -300,8 +300,8 @@ Open the `main menu` in the below example to view the footer.
|
|||||||
|
|
||||||
```jsx live noInline
|
```jsx live noInline
|
||||||
const MobileFooter = ({}) => {
|
const MobileFooter = ({}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
if (device.editor.isMobile) {
|
if (editorInterface.formFactor === "phone") {
|
||||||
return (
|
return (
|
||||||
<Footer>
|
<Footer>
|
||||||
<button
|
<button
|
||||||
@@ -336,12 +336,20 @@ render(<App />);
|
|||||||
The `device` has the following `attributes`, some grouped into `viewport` and `editor` objects, per context.
|
The `device` has the following `attributes`, some grouped into `viewport` and `editor` objects, per context.
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| --- | --- | --- |
|
| ---- | ---- | ----------- |
|
||||||
| `viewport.isMobile` | `boolean` | Set to `true` when viewport is in `mobile` breakpoint |
|
|
||||||
| `viewport.isLandscape` | `boolean` | Set to `true` when the viewport is in `landscape` mode |
|
The `EditorInterface` object has the following properties:
|
||||||
| `editor.canFitSidebar` | `boolean` | Set to `true` if there's enough space to fit the `sidebar` |
|
|
||||||
| `editor.isMobile` | `boolean` | Set to `true` when editor container is in `mobile` breakpoint |
|
| Name | Type | Description |
|
||||||
| `isTouchScreen` | `boolean` | Set to `true` for `touch` when touch event detected |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| `formFactor` | `'phone' | 'tablet' | 'desktop'` | Indicates the device type based on screen size |
|
||||||
|
| `desktopUIMode` | `'compact' | 'full'` | UI mode for desktop form factor |
|
||||||
|
| `userAgent.raw` | `string` | Raw user agent string |
|
||||||
|
| `userAgent.isMobileDevice` | `boolean` | True if device is mobile |
|
||||||
|
| `userAgent.platform` | `'ios' | 'android' | 'other' | 'unknown'` | Device platform |
|
||||||
|
| `isTouchScreen` | `boolean` | True if touch events are detected |
|
||||||
|
| `canFitSidebar` | `boolean` | True if sidebar can fit in the viewport |
|
||||||
|
| `isLandscape` | `boolean` | True if viewport is in landscape mode |
|
||||||
|
|
||||||
### i18n
|
### i18n
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ const MobileFooter = ({
|
|||||||
excalidrawAPI: ExcalidrawImperativeAPI;
|
excalidrawAPI: ExcalidrawImperativeAPI;
|
||||||
excalidrawLib: typeof TExcalidraw;
|
excalidrawLib: typeof TExcalidraw;
|
||||||
}) => {
|
}) => {
|
||||||
const { useDevice, Footer } = excalidrawLib;
|
const { useEditorInterface, Footer } = excalidrawLib;
|
||||||
|
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
if (device.editor.isMobile) {
|
if (editorInterface.formFactor === "phone") {
|
||||||
return (
|
return (
|
||||||
<Footer>
|
<Footer>
|
||||||
<CustomFooter
|
<CustomFooter
|
||||||
|
|||||||
+18
-3
@@ -4,6 +4,7 @@ import {
|
|||||||
TTDDialogTrigger,
|
TTDDialogTrigger,
|
||||||
CaptureUpdateAction,
|
CaptureUpdateAction,
|
||||||
reconcileElements,
|
reconcileElements,
|
||||||
|
useEditorInterface,
|
||||||
} from "@excalidraw/excalidraw";
|
} from "@excalidraw/excalidraw";
|
||||||
import { trackEvent } from "@excalidraw/excalidraw/analytics";
|
import { trackEvent } from "@excalidraw/excalidraw/analytics";
|
||||||
import { getDefaultAppState } from "@excalidraw/excalidraw/appState";
|
import { getDefaultAppState } from "@excalidraw/excalidraw/appState";
|
||||||
@@ -137,6 +138,9 @@ import { ExcalidrawPlusIframeExport } from "./ExcalidrawPlusIframeExport";
|
|||||||
|
|
||||||
import "./index.scss";
|
import "./index.scss";
|
||||||
|
|
||||||
|
import { ExcalidrawPlusPromoBanner } from "./components/ExcalidrawPlusPromoBanner";
|
||||||
|
import { AppSidebar } from "./components/AppSidebar";
|
||||||
|
|
||||||
import type { CollabAPI } from "./collab/Collab";
|
import type { CollabAPI } from "./collab/Collab";
|
||||||
|
|
||||||
polyfill();
|
polyfill();
|
||||||
@@ -342,6 +346,8 @@ const ExcalidrawWrapper = () => {
|
|||||||
|
|
||||||
const [langCode, setLangCode] = useAppLangCode();
|
const [langCode, setLangCode] = useAppLangCode();
|
||||||
|
|
||||||
|
const editorInterface = useEditorInterface();
|
||||||
|
|
||||||
// initial state
|
// initial state
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -663,8 +669,8 @@ const ExcalidrawWrapper = () => {
|
|||||||
debugRenderer(
|
debugRenderer(
|
||||||
debugCanvasRef.current,
|
debugCanvasRef.current,
|
||||||
appState,
|
appState,
|
||||||
|
elements,
|
||||||
window.devicePixelRatio,
|
window.devicePixelRatio,
|
||||||
() => forceRefresh((prev) => !prev),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -848,14 +854,22 @@ const ExcalidrawWrapper = () => {
|
|||||||
if (isMobile || !collabAPI || isCollabDisabled) {
|
if (isMobile || !collabAPI || isCollabDisabled) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="top-right-ui">
|
<div className="excalidraw-ui-top-right">
|
||||||
|
{excalidrawAPI?.getEditorInterface().formFactor === "desktop" && (
|
||||||
|
<ExcalidrawPlusPromoBanner
|
||||||
|
isSignedIn={isExcalidrawPlusSignedUser}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
{collabError.message && <CollabError collabError={collabError} />}
|
{collabError.message && <CollabError collabError={collabError} />}
|
||||||
<LiveCollaborationTrigger
|
<LiveCollaborationTrigger
|
||||||
isCollaborating={isCollaborating}
|
isCollaborating={isCollaborating}
|
||||||
onSelect={() =>
|
onSelect={() =>
|
||||||
setShareDialogState({ isOpen: true, type: "share" })
|
setShareDialogState({ isOpen: true, type: "share" })
|
||||||
}
|
}
|
||||||
|
editorInterface={editorInterface}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -941,6 +955,8 @@ const ExcalidrawWrapper = () => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<AppSidebar />
|
||||||
|
|
||||||
{errorMessage && (
|
{errorMessage && (
|
||||||
<ErrorDialog onClose={() => setErrorMessage("")}>
|
<ErrorDialog onClose={() => setErrorMessage("")}>
|
||||||
{errorMessage}
|
{errorMessage}
|
||||||
@@ -1143,7 +1159,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
ref={debugCanvasRef}
|
ref={debugCanvasRef}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{/* <FreedrawDebugSliders /> */}
|
|
||||||
</Excalidraw>
|
</Excalidraw>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|||||||
|
|
||||||
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
|
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
|
||||||
import { EncryptedIcon } from "./EncryptedIcon";
|
import { EncryptedIcon } from "./EncryptedIcon";
|
||||||
import { ExcalidrawPlusAppLink } from "./ExcalidrawPlusAppLink";
|
|
||||||
|
|
||||||
export const AppFooter = React.memo(
|
export const AppFooter = React.memo(
|
||||||
({ onChange }: { onChange: () => void }) => {
|
({ onChange }: { onChange: () => void }) => {
|
||||||
@@ -19,11 +18,7 @@ export const AppFooter = React.memo(
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
|
{isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
|
||||||
{isExcalidrawPlusSignedUser ? (
|
{!isExcalidrawPlusSignedUser && <EncryptedIcon />}
|
||||||
<ExcalidrawPlusAppLink />
|
|
||||||
) : (
|
|
||||||
<EncryptedIcon />
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</Footer>
|
</Footer>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
.excalidraw {
|
||||||
|
.app-sidebar-promo-container {
|
||||||
|
padding: 0.75rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
text-align: center;
|
||||||
|
gap: 1rem;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-sidebar-promo-image {
|
||||||
|
margin: 1rem 0;
|
||||||
|
|
||||||
|
height: 16.25rem;
|
||||||
|
background-size: contain;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
|
||||||
|
background-image: radial-gradient(
|
||||||
|
circle,
|
||||||
|
transparent 60%,
|
||||||
|
var(--sidebar-bg-color) 100%
|
||||||
|
),
|
||||||
|
var(--image-source);
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-sidebar-promo-text {
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-button {
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
import { DefaultSidebar, Sidebar, THEME } from "@excalidraw/excalidraw";
|
||||||
|
import {
|
||||||
|
messageCircleIcon,
|
||||||
|
presentationIcon,
|
||||||
|
} from "@excalidraw/excalidraw/components/icons";
|
||||||
|
import { LinkButton } from "@excalidraw/excalidraw/components/LinkButton";
|
||||||
|
import { useUIAppState } from "@excalidraw/excalidraw/context/ui-appState";
|
||||||
|
|
||||||
|
import "./AppSidebar.scss";
|
||||||
|
|
||||||
|
export const AppSidebar = () => {
|
||||||
|
const { theme, openSidebar } = useUIAppState();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DefaultSidebar>
|
||||||
|
<DefaultSidebar.TabTriggers>
|
||||||
|
<Sidebar.TabTrigger
|
||||||
|
tab="comments"
|
||||||
|
style={{ opacity: openSidebar?.tab === "comments" ? 1 : 0.4 }}
|
||||||
|
>
|
||||||
|
{messageCircleIcon}
|
||||||
|
</Sidebar.TabTrigger>
|
||||||
|
<Sidebar.TabTrigger
|
||||||
|
tab="presentation"
|
||||||
|
style={{ opacity: openSidebar?.tab === "presentation" ? 1 : 0.4 }}
|
||||||
|
>
|
||||||
|
{presentationIcon}
|
||||||
|
</Sidebar.TabTrigger>
|
||||||
|
</DefaultSidebar.TabTriggers>
|
||||||
|
<Sidebar.Tab tab="comments">
|
||||||
|
<div className="app-sidebar-promo-container">
|
||||||
|
<div
|
||||||
|
className="app-sidebar-promo-image"
|
||||||
|
style={{
|
||||||
|
["--image-source" as any]: `url(/oss_promo_comments_${
|
||||||
|
theme === THEME.DARK ? "dark" : "light"
|
||||||
|
}.jpg)`,
|
||||||
|
opacity: 0.7,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="app-sidebar-promo-text">
|
||||||
|
Make comments with Excalidraw+
|
||||||
|
</div>
|
||||||
|
<LinkButton
|
||||||
|
href={`${
|
||||||
|
import.meta.env.VITE_APP_PLUS_LP
|
||||||
|
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=comments_promo#excalidraw-redirect`}
|
||||||
|
>
|
||||||
|
Sign up now
|
||||||
|
</LinkButton>
|
||||||
|
</div>
|
||||||
|
</Sidebar.Tab>
|
||||||
|
<Sidebar.Tab tab="presentation" className="px-3">
|
||||||
|
<div className="app-sidebar-promo-container">
|
||||||
|
<div
|
||||||
|
className="app-sidebar-promo-image"
|
||||||
|
style={{
|
||||||
|
["--image-source" as any]: `url(/oss_promo_presentations_${
|
||||||
|
theme === THEME.DARK ? "dark" : "light"
|
||||||
|
}.svg)`,
|
||||||
|
backgroundSize: "60%",
|
||||||
|
opacity: 0.4,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="app-sidebar-promo-text">
|
||||||
|
Create presentations with Excalidraw+
|
||||||
|
</div>
|
||||||
|
<LinkButton
|
||||||
|
href={`${
|
||||||
|
import.meta.env.VITE_APP_PLUS_LP
|
||||||
|
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=presentations_promo#excalidraw-redirect`}
|
||||||
|
>
|
||||||
|
Sign up now
|
||||||
|
</LinkButton>
|
||||||
|
</div>
|
||||||
|
</Sidebar.Tab>
|
||||||
|
</DefaultSidebar>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -8,21 +8,35 @@ import {
|
|||||||
getNormalizedCanvasDimensions,
|
getNormalizedCanvasDimensions,
|
||||||
} from "@excalidraw/excalidraw/renderer/helpers";
|
} from "@excalidraw/excalidraw/renderer/helpers";
|
||||||
import { type AppState } from "@excalidraw/excalidraw/types";
|
import { type AppState } from "@excalidraw/excalidraw/types";
|
||||||
import { throttleRAF } from "@excalidraw/common";
|
import { arrayToMap, throttleRAF } from "@excalidraw/common";
|
||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
|
|
||||||
|
import {
|
||||||
|
getGlobalFixedPointForBindableElement,
|
||||||
|
isArrowElement,
|
||||||
|
isBindableElement,
|
||||||
|
isFixedPointBinding,
|
||||||
|
} from "@excalidraw/element";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
isLineSegment,
|
isLineSegment,
|
||||||
type GlobalPoint,
|
type GlobalPoint,
|
||||||
type LineSegment,
|
type LineSegment,
|
||||||
|
isCurve,
|
||||||
} from "@excalidraw/math";
|
} from "@excalidraw/math";
|
||||||
import { isCurve } from "@excalidraw/math/curve";
|
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import type { Curve } from "@excalidraw/math";
|
import type { Curve } from "@excalidraw/math";
|
||||||
|
import type { DebugElement } from "@excalidraw/common";
|
||||||
import type { DebugElement } from "@excalidraw/utils/visualdebug";
|
import type {
|
||||||
|
ElementsMap,
|
||||||
|
ExcalidrawArrowElement,
|
||||||
|
ExcalidrawBindableElement,
|
||||||
|
FixedPointBinding,
|
||||||
|
OrderedExcalidrawElement,
|
||||||
|
PointBinding,
|
||||||
|
} from "@excalidraw/element/types";
|
||||||
|
|
||||||
import { STORAGE_KEYS } from "../app_constants";
|
import { STORAGE_KEYS } from "../app_constants";
|
||||||
|
|
||||||
@@ -75,6 +89,180 @@ const renderOrigin = (context: CanvasRenderingContext2D, zoom: number) => {
|
|||||||
context.save();
|
context.save();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const _renderBinding = (
|
||||||
|
context: CanvasRenderingContext2D,
|
||||||
|
binding: FixedPointBinding | PointBinding,
|
||||||
|
elementsMap: ElementsMap,
|
||||||
|
zoom: number,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
color: string,
|
||||||
|
) => {
|
||||||
|
if (isFixedPointBinding(binding)) {
|
||||||
|
if (!binding.fixedPoint) {
|
||||||
|
console.warn("Binding must have a fixedPoint");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bindable = elementsMap.get(
|
||||||
|
binding.elementId,
|
||||||
|
) as ExcalidrawBindableElement;
|
||||||
|
const [x, y] = getGlobalFixedPointForBindableElement(
|
||||||
|
binding.fixedPoint,
|
||||||
|
bindable,
|
||||||
|
elementsMap,
|
||||||
|
);
|
||||||
|
|
||||||
|
context.save();
|
||||||
|
context.strokeStyle = color;
|
||||||
|
context.lineWidth = 1;
|
||||||
|
context.beginPath();
|
||||||
|
context.moveTo(x * zoom, y * zoom);
|
||||||
|
context.bezierCurveTo(
|
||||||
|
x * zoom - width,
|
||||||
|
y * zoom - height,
|
||||||
|
x * zoom - width,
|
||||||
|
y * zoom + height,
|
||||||
|
x * zoom,
|
||||||
|
y * zoom,
|
||||||
|
);
|
||||||
|
context.stroke();
|
||||||
|
context.restore();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const _renderBindableBinding = (
|
||||||
|
binding: FixedPointBinding | PointBinding,
|
||||||
|
context: CanvasRenderingContext2D,
|
||||||
|
elementsMap: ElementsMap,
|
||||||
|
zoom: number,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
color: string,
|
||||||
|
) => {
|
||||||
|
if (isFixedPointBinding(binding)) {
|
||||||
|
const bindable = elementsMap.get(
|
||||||
|
binding.elementId,
|
||||||
|
) as ExcalidrawBindableElement;
|
||||||
|
if (!binding.fixedPoint) {
|
||||||
|
console.warn("Binding must have a fixedPoint");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [x, y] = getGlobalFixedPointForBindableElement(
|
||||||
|
binding.fixedPoint,
|
||||||
|
bindable,
|
||||||
|
elementsMap,
|
||||||
|
);
|
||||||
|
|
||||||
|
context.save();
|
||||||
|
context.strokeStyle = color;
|
||||||
|
context.lineWidth = 1;
|
||||||
|
context.beginPath();
|
||||||
|
context.moveTo(x * zoom, y * zoom);
|
||||||
|
context.bezierCurveTo(
|
||||||
|
x * zoom + width,
|
||||||
|
y * zoom + height,
|
||||||
|
x * zoom + width,
|
||||||
|
y * zoom - height,
|
||||||
|
x * zoom,
|
||||||
|
y * zoom,
|
||||||
|
);
|
||||||
|
context.stroke();
|
||||||
|
context.restore();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderBindings = (
|
||||||
|
context: CanvasRenderingContext2D,
|
||||||
|
elements: readonly OrderedExcalidrawElement[],
|
||||||
|
zoom: number,
|
||||||
|
) => {
|
||||||
|
const elementsMap = arrayToMap(elements);
|
||||||
|
const dim = 16;
|
||||||
|
elements.forEach((element) => {
|
||||||
|
if (element.isDeleted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isArrowElement(element)) {
|
||||||
|
if (element.startBinding) {
|
||||||
|
if (
|
||||||
|
!elementsMap
|
||||||
|
.get(element.startBinding.elementId)
|
||||||
|
?.boundElements?.find((e) => e.id === element.id)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_renderBinding(
|
||||||
|
context,
|
||||||
|
element.startBinding as FixedPointBinding,
|
||||||
|
elementsMap,
|
||||||
|
zoom,
|
||||||
|
dim,
|
||||||
|
dim,
|
||||||
|
"red",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.endBinding) {
|
||||||
|
if (
|
||||||
|
!elementsMap
|
||||||
|
.get(element.endBinding.elementId)
|
||||||
|
?.boundElements?.find((e) => e.id === element.id)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_renderBinding(
|
||||||
|
context,
|
||||||
|
element.endBinding,
|
||||||
|
elementsMap,
|
||||||
|
zoom,
|
||||||
|
dim,
|
||||||
|
dim,
|
||||||
|
"red",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isBindableElement(element) && element.boundElements?.length) {
|
||||||
|
element.boundElements.forEach((boundElement) => {
|
||||||
|
if (boundElement.type !== "arrow") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const arrow = elementsMap.get(
|
||||||
|
boundElement.id,
|
||||||
|
) as ExcalidrawArrowElement;
|
||||||
|
|
||||||
|
if (arrow && arrow.startBinding?.elementId === element.id) {
|
||||||
|
_renderBindableBinding(
|
||||||
|
arrow.startBinding,
|
||||||
|
context,
|
||||||
|
elementsMap,
|
||||||
|
zoom,
|
||||||
|
dim,
|
||||||
|
dim,
|
||||||
|
"green",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (arrow && arrow.endBinding?.elementId === element.id) {
|
||||||
|
_renderBindableBinding(
|
||||||
|
arrow.endBinding,
|
||||||
|
context,
|
||||||
|
elementsMap,
|
||||||
|
zoom,
|
||||||
|
dim,
|
||||||
|
dim,
|
||||||
|
"green",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const render = (
|
const render = (
|
||||||
frame: DebugElement[],
|
frame: DebugElement[],
|
||||||
context: CanvasRenderingContext2D,
|
context: CanvasRenderingContext2D,
|
||||||
@@ -107,8 +295,8 @@ const render = (
|
|||||||
const _debugRenderer = (
|
const _debugRenderer = (
|
||||||
canvas: HTMLCanvasElement,
|
canvas: HTMLCanvasElement,
|
||||||
appState: AppState,
|
appState: AppState,
|
||||||
|
elements: readonly OrderedExcalidrawElement[],
|
||||||
scale: number,
|
scale: number,
|
||||||
refresh: () => void,
|
|
||||||
) => {
|
) => {
|
||||||
const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(
|
const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(
|
||||||
canvas,
|
canvas,
|
||||||
@@ -131,6 +319,7 @@ const _debugRenderer = (
|
|||||||
);
|
);
|
||||||
|
|
||||||
renderOrigin(context, appState.zoom.value);
|
renderOrigin(context, appState.zoom.value);
|
||||||
|
renderBindings(context, elements, appState.zoom.value);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
window.visualDebug?.currentFrame &&
|
window.visualDebug?.currentFrame &&
|
||||||
@@ -182,10 +371,10 @@ export const debugRenderer = throttleRAF(
|
|||||||
(
|
(
|
||||||
canvas: HTMLCanvasElement,
|
canvas: HTMLCanvasElement,
|
||||||
appState: AppState,
|
appState: AppState,
|
||||||
|
elements: readonly OrderedExcalidrawElement[],
|
||||||
scale: number,
|
scale: number,
|
||||||
refresh: () => void,
|
|
||||||
) => {
|
) => {
|
||||||
_debugRenderer(canvas, appState, scale, refresh);
|
_debugRenderer(canvas, appState, elements, scale);
|
||||||
},
|
},
|
||||||
{ trailing: true },
|
{ trailing: true },
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|
||||||
|
|
||||||
export const ExcalidrawPlusAppLink = () => {
|
|
||||||
if (!isExcalidrawPlusSignedUser) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
href={`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_APP
|
|
||||||
}?utm_source=excalidraw&utm_medium=app&utm_content=signedInUserRedirectButton#excalidraw-redirect`}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener"
|
|
||||||
className="plus-button"
|
|
||||||
>
|
|
||||||
Go to Excalidraw+
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
export const ExcalidrawPlusPromoBanner = ({
|
||||||
|
isSignedIn,
|
||||||
|
}: {
|
||||||
|
isSignedIn: boolean;
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
href={
|
||||||
|
isSignedIn
|
||||||
|
? import.meta.env.VITE_APP_PLUS_APP
|
||||||
|
: `${
|
||||||
|
import.meta.env.VITE_APP_PLUS_LP
|
||||||
|
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=guestBanner#excalidraw-redirect`
|
||||||
|
}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className="plus-banner"
|
||||||
|
>
|
||||||
|
Excalidraw+
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
import { STROKE_OPTIONS, isFreeDrawElement } from "@excalidraw/element";
|
|
||||||
import { useState, useEffect } from "react";
|
|
||||||
|
|
||||||
import { useUIAppState } from "@excalidraw/excalidraw/context/ui-appState";
|
|
||||||
import { useExcalidrawElements } from "@excalidraw/excalidraw/components/App";
|
|
||||||
|
|
||||||
import { round } from "../../packages/math/src";
|
|
||||||
|
|
||||||
export const FreedrawDebugSliders = () => {
|
|
||||||
const [streamline, setStreamline] = useState<number>(
|
|
||||||
STROKE_OPTIONS.default.streamline,
|
|
||||||
);
|
|
||||||
const [simplify, setSimplify] = useState<number>(
|
|
||||||
STROKE_OPTIONS.default.simplify,
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!window.h) {
|
|
||||||
window.h = {} as any;
|
|
||||||
}
|
|
||||||
if (!window.h.debugFreedraw) {
|
|
||||||
window.h.debugFreedraw = {
|
|
||||||
enabled: true,
|
|
||||||
...STROKE_OPTIONS.default,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
setStreamline(window.h.debugFreedraw.streamline);
|
|
||||||
setSimplify(window.h.debugFreedraw.simplify);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handleStreamlineChange = (value: number) => {
|
|
||||||
setStreamline(value);
|
|
||||||
if (window.h && window.h.debugFreedraw) {
|
|
||||||
window.h.debugFreedraw.streamline = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSimplifyChange = (value: number) => {
|
|
||||||
setSimplify(value);
|
|
||||||
if (window.h && window.h.debugFreedraw) {
|
|
||||||
window.h.debugFreedraw.simplify = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const [enabled, setEnabled] = useState<boolean>(
|
|
||||||
window.h?.debugFreedraw?.enabled ?? true,
|
|
||||||
);
|
|
||||||
|
|
||||||
// counter incrasing each 50ms
|
|
||||||
const [, setCounter] = useState<number>(0);
|
|
||||||
useEffect(() => {
|
|
||||||
const interval = setInterval(() => {
|
|
||||||
setCounter((prev) => prev + 1);
|
|
||||||
}, 50);
|
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const elements = useExcalidrawElements();
|
|
||||||
const appState = useUIAppState();
|
|
||||||
|
|
||||||
const newFreedrawElement =
|
|
||||||
appState.newElement && isFreeDrawElement(appState.newElement)
|
|
||||||
? appState.newElement
|
|
||||||
: null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
position: "absolute",
|
|
||||||
bottom: "70px",
|
|
||||||
left: "50%",
|
|
||||||
transform: "translateX(-50%)",
|
|
||||||
zIndex: 9999,
|
|
||||||
padding: "10px",
|
|
||||||
borderRadius: "8px",
|
|
||||||
border: "1px solid #ccc",
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column",
|
|
||||||
gap: "8px",
|
|
||||||
fontSize: "12px",
|
|
||||||
fontFamily: "monospace",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{newFreedrawElement && (
|
|
||||||
<div>
|
|
||||||
pressures:{" "}
|
|
||||||
{newFreedrawElement.simulatePressure
|
|
||||||
? "simulated"
|
|
||||||
: JSON.stringify(
|
|
||||||
newFreedrawElement.pressures
|
|
||||||
.slice(-4)
|
|
||||||
.map((x) => round(x, 2))
|
|
||||||
.join(" ") || [],
|
|
||||||
)}{" "}
|
|
||||||
({round(window.__lastPressure__ || 0, 2) || "?"})
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div>
|
|
||||||
<label>
|
|
||||||
{" "}
|
|
||||||
enabled
|
|
||||||
<br />
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={enabled}
|
|
||||||
onChange={(e) => {
|
|
||||||
if (window.h.debugFreedraw) {
|
|
||||||
window.h.debugFreedraw.enabled = e.target.checked;
|
|
||||||
setEnabled(e.target.checked);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>
|
|
||||||
Streamline: {streamline.toFixed(2)}
|
|
||||||
<br />
|
|
||||||
<input
|
|
||||||
type="range"
|
|
||||||
min="0"
|
|
||||||
max="1"
|
|
||||||
step="0.01"
|
|
||||||
value={streamline}
|
|
||||||
onChange={(e) => handleStreamlineChange(parseFloat(e.target.value))}
|
|
||||||
style={{ width: "150px" }}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>
|
|
||||||
Simplify: {simplify.toFixed(2)}
|
|
||||||
<br />
|
|
||||||
<input
|
|
||||||
type="range"
|
|
||||||
min="0"
|
|
||||||
max="1"
|
|
||||||
step="0.01"
|
|
||||||
value={simplify}
|
|
||||||
onChange={(e) => handleSimplifyChange(parseFloat(e.target.value))}
|
|
||||||
style={{ width: "150px" }}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
+16
-11
@@ -1,3 +1,5 @@
|
|||||||
|
@import "../packages/excalidraw/css/variables.module.scss";
|
||||||
|
|
||||||
.excalidraw {
|
.excalidraw {
|
||||||
--color-primary-contrast-offset: #625ee0; // to offset Chubb illusion
|
--color-primary-contrast-offset: #625ee0; // to offset Chubb illusion
|
||||||
|
|
||||||
@@ -5,12 +7,6 @@
|
|||||||
--color-primary-contrast-offset: #726dff; // to offset Chubb illusion
|
--color-primary-contrast-offset: #726dff; // to offset Chubb illusion
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-right-ui {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-center {
|
.footer-center {
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
@@ -90,22 +86,31 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.plus-button {
|
.plus-banner {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border: 1px solid var(--color-primary);
|
border: 1px solid var(--color-primary);
|
||||||
padding: 0.5rem 0.75rem;
|
padding: 0.5rem 0.875rem;
|
||||||
border-radius: var(--border-radius-lg);
|
border-radius: var(--border-radius-lg);
|
||||||
background-color: var(--island-bg-color);
|
background-color: var(--island-bg-color);
|
||||||
color: var(--color-primary) !important;
|
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
|
|
||||||
font-size: 0.75rem;
|
font-family: var(--ui-font);
|
||||||
|
font-size: 0.8333rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: var(--lg-button-size);
|
height: var(--lg-button-size);
|
||||||
|
|
||||||
|
border: none;
|
||||||
|
box-shadow: 0 0 0 1px var(--color-surface-lowest);
|
||||||
|
background-color: var(--color-surface-low);
|
||||||
|
color: var(--button-color, var(--color-on-surface)) !important;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
box-shadow: 0 0 0 1px var(--color-brand-active);
|
||||||
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: var(--color-primary);
|
background-color: var(--color-primary);
|
||||||
color: white !important;
|
color: white !important;
|
||||||
@@ -117,7 +122,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.theme--dark {
|
.theme--dark {
|
||||||
.plus-button {
|
.plus-banner {
|
||||||
&:hover {
|
&:hover {
|
||||||
color: black !important;
|
color: black !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "18.0.0 - 22.x.x"
|
"node": ">=18.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@excalidraw/random-username": "1.0.0",
|
"@excalidraw/random-username": "1.0.0",
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import { defaultLang } from "@excalidraw/excalidraw/i18n";
|
||||||
|
import { UI } from "@excalidraw/excalidraw/tests/helpers/ui";
|
||||||
|
import {
|
||||||
|
screen,
|
||||||
|
fireEvent,
|
||||||
|
waitFor,
|
||||||
|
render,
|
||||||
|
} from "@excalidraw/excalidraw/tests/test-utils";
|
||||||
|
|
||||||
|
import ExcalidrawApp from "../App";
|
||||||
|
|
||||||
|
describe("Test LanguageList", () => {
|
||||||
|
it("rerenders UI on language change", async () => {
|
||||||
|
await render(<ExcalidrawApp />);
|
||||||
|
|
||||||
|
// select rectangle tool to show properties menu
|
||||||
|
UI.clickTool("rectangle");
|
||||||
|
// english lang should display `thin` label
|
||||||
|
expect(screen.queryByTitle(/thin/i)).not.toBeNull();
|
||||||
|
fireEvent.click(document.querySelector(".dropdown-menu-button")!);
|
||||||
|
|
||||||
|
fireEvent.change(document.querySelector(".dropdown-select__language")!, {
|
||||||
|
target: { value: "de-DE" },
|
||||||
|
});
|
||||||
|
// switching to german, `thin` label should no longer exist
|
||||||
|
await waitFor(() => expect(screen.queryByTitle(/thin/i)).toBeNull());
|
||||||
|
// reset language
|
||||||
|
fireEvent.change(document.querySelector(".dropdown-select__language")!, {
|
||||||
|
target: { value: defaultLang.code },
|
||||||
|
});
|
||||||
|
// switching back to English
|
||||||
|
await waitFor(() => expect(screen.queryByTitle(/thin/i)).not.toBeNull());
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -17,30 +17,15 @@ describe("Test MobileMenu", () => {
|
|||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await render(<ExcalidrawApp />);
|
await render(<ExcalidrawApp />);
|
||||||
// @ts-ignore
|
h.app.refreshEditorInterface();
|
||||||
h.app.refreshViewportBreakpoints();
|
|
||||||
// @ts-ignore
|
|
||||||
h.app.refreshEditorBreakpoints();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
restoreOriginalGetBoundingClientRect();
|
restoreOriginalGetBoundingClientRect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should set device correctly", () => {
|
it("should set editor interface correctly", () => {
|
||||||
expect(h.app.device).toMatchInlineSnapshot(`
|
expect(h.app.editorInterface.formFactor).toBe("phone");
|
||||||
{
|
|
||||||
"editor": {
|
|
||||||
"canFitSidebar": false,
|
|
||||||
"isMobile": true,
|
|
||||||
},
|
|
||||||
"isTouchScreen": false,
|
|
||||||
"viewport": {
|
|
||||||
"isLandscape": true,
|
|
||||||
"isMobile": true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should initialize with welcome screen and hide once user interacts", async () => {
|
it("should initialize with welcome screen and hide once user interacts", async () => {
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@
|
|||||||
"vitest-canvas-mock": "0.3.3"
|
"vitest-canvas-mock": "0.3.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "18.0.0 - 22.x.x"
|
"node": ">=18.0.0"
|
||||||
},
|
},
|
||||||
"homepage": ".",
|
"homepage": ".",
|
||||||
"prettier": "@excalidraw/prettier-config",
|
"prettier": "@excalidraw/prettier-config",
|
||||||
|
|||||||
@@ -6,32 +6,6 @@ import type { AppProps, AppState } from "@excalidraw/excalidraw/types";
|
|||||||
|
|
||||||
import { COLOR_PALETTE } from "./colors";
|
import { COLOR_PALETTE } from "./colors";
|
||||||
|
|
||||||
export const isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
|
|
||||||
export const isWindows = /^Win/.test(navigator.platform);
|
|
||||||
export const isAndroid = /\b(android)\b/i.test(navigator.userAgent);
|
|
||||||
export const isFirefox =
|
|
||||||
typeof window !== "undefined" &&
|
|
||||||
"netscape" in window &&
|
|
||||||
navigator.userAgent.indexOf("rv:") > 1 &&
|
|
||||||
navigator.userAgent.indexOf("Gecko") > 1;
|
|
||||||
export const isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
|
|
||||||
export const isSafari =
|
|
||||||
!isChrome && navigator.userAgent.indexOf("Safari") !== -1;
|
|
||||||
export const isIOS =
|
|
||||||
/iPad|iPhone/i.test(navigator.platform) ||
|
|
||||||
// iPadOS 13+
|
|
||||||
(navigator.userAgent.includes("Mac") && "ontouchend" in document);
|
|
||||||
// keeping function so it can be mocked in test
|
|
||||||
export const isBrave = () =>
|
|
||||||
(navigator as any).brave?.isBrave?.name === "isBrave";
|
|
||||||
|
|
||||||
export const isMobile =
|
|
||||||
isIOS ||
|
|
||||||
/android|webos|ipod|blackberry|iemobile|opera mini/i.test(
|
|
||||||
navigator.userAgent,
|
|
||||||
) ||
|
|
||||||
/android|ios|ipod|blackberry|windows phone/i.test(navigator.platform);
|
|
||||||
|
|
||||||
export const supportsResizeObserver =
|
export const supportsResizeObserver =
|
||||||
typeof window !== "undefined" && "ResizeObserver" in window;
|
typeof window !== "undefined" && "ResizeObserver" in window;
|
||||||
|
|
||||||
@@ -131,6 +105,7 @@ export const CLASSES = {
|
|||||||
SEARCH_MENU_INPUT_WRAPPER: "layer-ui__search-inputWrapper",
|
SEARCH_MENU_INPUT_WRAPPER: "layer-ui__search-inputWrapper",
|
||||||
CONVERT_ELEMENT_TYPE_POPUP: "ConvertElementTypePopup",
|
CONVERT_ELEMENT_TYPE_POPUP: "ConvertElementTypePopup",
|
||||||
SHAPE_ACTIONS_THEME_SCOPE: "shape-actions-theme-scope",
|
SHAPE_ACTIONS_THEME_SCOPE: "shape-actions-theme-scope",
|
||||||
|
FRAME_NAME: "frame-name",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CJK_HAND_DRAWN_FALLBACK_FONT = "Xiaolai";
|
export const CJK_HAND_DRAWN_FALLBACK_FONT = "Xiaolai";
|
||||||
@@ -349,26 +324,6 @@ export const DEFAULT_UI_OPTIONS: AppProps["UIOptions"] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// breakpoints
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// mobile: up to 699px
|
|
||||||
export const MQ_MAX_MOBILE = 599;
|
|
||||||
|
|
||||||
export const MQ_MAX_WIDTH_LANDSCAPE = 1000;
|
|
||||||
export const MQ_MAX_HEIGHT_LANDSCAPE = 500;
|
|
||||||
|
|
||||||
// tablets
|
|
||||||
export const MQ_MIN_TABLET = MQ_MAX_MOBILE + 1; // lower bound (excludes phones)
|
|
||||||
export const MQ_MAX_TABLET = 1400; // upper bound (excludes laptops/desktops)
|
|
||||||
|
|
||||||
// desktop/laptop
|
|
||||||
export const MQ_MIN_WIDTH_DESKTOP = 1440;
|
|
||||||
|
|
||||||
// sidebar
|
|
||||||
export const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
export const MAX_DECIMALS_FOR_SVG_EXPORT = 2;
|
export const MAX_DECIMALS_FOR_SVG_EXPORT = 2;
|
||||||
|
|
||||||
export const EXPORT_SCALES = [1, 2, 3];
|
export const EXPORT_SCALES = [1, 2, 3];
|
||||||
@@ -442,9 +397,8 @@ export const ROUGHNESS = {
|
|||||||
|
|
||||||
export const STROKE_WIDTH = {
|
export const STROKE_WIDTH = {
|
||||||
thin: 1,
|
thin: 1,
|
||||||
medium: 2,
|
bold: 2,
|
||||||
bold: 4,
|
extraBold: 4,
|
||||||
extraBold: 8,
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const DEFAULT_ELEMENT_PROPS: {
|
export const DEFAULT_ELEMENT_PROPS: {
|
||||||
@@ -460,7 +414,7 @@ export const DEFAULT_ELEMENT_PROPS: {
|
|||||||
strokeColor: COLOR_PALETTE.black,
|
strokeColor: COLOR_PALETTE.black,
|
||||||
backgroundColor: COLOR_PALETTE.transparent,
|
backgroundColor: COLOR_PALETTE.transparent,
|
||||||
fillStyle: "solid",
|
fillStyle: "solid",
|
||||||
strokeWidth: STROKE_WIDTH.medium,
|
strokeWidth: 2,
|
||||||
strokeStyle: "solid",
|
strokeStyle: "solid",
|
||||||
roughness: ROUGHNESS.artist,
|
roughness: ROUGHNESS.artist,
|
||||||
opacity: 100,
|
opacity: 100,
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
export type StylesPanelMode = "compact" | "full" | "mobile";
|
||||||
|
|
||||||
|
export type EditorInterface = Readonly<{
|
||||||
|
formFactor: "phone" | "tablet" | "desktop";
|
||||||
|
desktopUIMode: "compact" | "full";
|
||||||
|
userAgent: Readonly<{
|
||||||
|
isMobileDevice: boolean;
|
||||||
|
platform: "ios" | "android" | "other" | "unknown";
|
||||||
|
}>;
|
||||||
|
isTouchScreen: boolean;
|
||||||
|
canFitSidebar: boolean;
|
||||||
|
isLandscape: boolean;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
// storage key
|
||||||
|
const DESKTOP_UI_MODE_STORAGE_KEY = "excalidraw.desktopUIMode";
|
||||||
|
|
||||||
|
// breakpoints
|
||||||
|
// mobile: up to 699px
|
||||||
|
export const MQ_MAX_MOBILE = 599;
|
||||||
|
|
||||||
|
export const MQ_MAX_WIDTH_LANDSCAPE = 1000;
|
||||||
|
export const MQ_MAX_HEIGHT_LANDSCAPE = 500;
|
||||||
|
|
||||||
|
// tablets
|
||||||
|
export const MQ_MIN_TABLET = MQ_MAX_MOBILE + 1; // lower bound (excludes phones)
|
||||||
|
export const MQ_MAX_TABLET = 1400; // upper bound (excludes laptops/desktops)
|
||||||
|
|
||||||
|
// desktop/laptop
|
||||||
|
export const MQ_MIN_WIDTH_DESKTOP = 1440;
|
||||||
|
|
||||||
|
// sidebar
|
||||||
|
export const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// user agent detections
|
||||||
|
export const isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
|
||||||
|
export const isWindows = /^Win/.test(navigator.platform);
|
||||||
|
export const isAndroid = /\b(android)\b/i.test(navigator.userAgent);
|
||||||
|
export const isFirefox =
|
||||||
|
typeof window !== "undefined" &&
|
||||||
|
"netscape" in window &&
|
||||||
|
navigator.userAgent.indexOf("rv:") > 1 &&
|
||||||
|
navigator.userAgent.indexOf("Gecko") > 1;
|
||||||
|
export const isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
|
||||||
|
export const isSafari =
|
||||||
|
!isChrome && navigator.userAgent.indexOf("Safari") !== -1;
|
||||||
|
export const isIOS =
|
||||||
|
/iPad|iPhone/i.test(navigator.platform) ||
|
||||||
|
// iPadOS 13+
|
||||||
|
(navigator.userAgent.includes("Mac") && "ontouchend" in document);
|
||||||
|
// keeping function so it can be mocked in test
|
||||||
|
export const isBrave = () =>
|
||||||
|
(navigator as any).brave?.isBrave?.name === "isBrave";
|
||||||
|
|
||||||
|
// export const isMobile =
|
||||||
|
// isIOS ||
|
||||||
|
// /android|webos|ipod|blackberry|iemobile|opera mini/i.test(
|
||||||
|
// navigator.userAgent,
|
||||||
|
// ) ||
|
||||||
|
// /android|ios|ipod|blackberry|windows phone/i.test(navigator.platform);
|
||||||
|
|
||||||
|
// utilities
|
||||||
|
export const isMobileBreakpoint = (width: number, height: number) => {
|
||||||
|
return (
|
||||||
|
width <= MQ_MAX_MOBILE ||
|
||||||
|
(height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isTabletBreakpoint = (
|
||||||
|
editorWidth: number,
|
||||||
|
editorHeight: number,
|
||||||
|
) => {
|
||||||
|
const minSide = Math.min(editorWidth, editorHeight);
|
||||||
|
const maxSide = Math.max(editorWidth, editorHeight);
|
||||||
|
|
||||||
|
return minSide >= MQ_MIN_TABLET && maxSide <= MQ_MAX_TABLET;
|
||||||
|
};
|
||||||
|
|
||||||
|
const isMobileOrTablet = (): boolean => {
|
||||||
|
const ua = navigator.userAgent || "";
|
||||||
|
const platform = navigator.platform || "";
|
||||||
|
const uaData = (navigator as any).userAgentData as
|
||||||
|
| { mobile?: boolean; platform?: string }
|
||||||
|
| undefined;
|
||||||
|
|
||||||
|
// --- 1) chromium: prefer ua client hints -------------------------------
|
||||||
|
if (uaData) {
|
||||||
|
const plat = (uaData.platform || "").toLowerCase();
|
||||||
|
const isDesktopOS =
|
||||||
|
plat === "windows" ||
|
||||||
|
plat === "macos" ||
|
||||||
|
plat === "linux" ||
|
||||||
|
plat === "chrome os";
|
||||||
|
if (uaData.mobile === true) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (uaData.mobile === false && plat === "android") {
|
||||||
|
const looksTouchTablet =
|
||||||
|
matchMedia?.("(hover: none)").matches &&
|
||||||
|
matchMedia?.("(pointer: coarse)").matches;
|
||||||
|
return looksTouchTablet;
|
||||||
|
}
|
||||||
|
if (isDesktopOS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 2) ios (includes ipad) --------------------------------------------
|
||||||
|
if (isIOS) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 3) android legacy ua fallback -------------------------------------
|
||||||
|
if (isAndroid) {
|
||||||
|
const isAndroidPhone = /Mobile/i.test(ua);
|
||||||
|
const isAndroidTablet = !isAndroidPhone;
|
||||||
|
if (isAndroidPhone || isAndroidTablet) {
|
||||||
|
const looksTouchTablet =
|
||||||
|
matchMedia?.("(hover: none)").matches &&
|
||||||
|
matchMedia?.("(pointer: coarse)").matches;
|
||||||
|
return looksTouchTablet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 4) last resort desktop exclusion ----------------------------------
|
||||||
|
const looksDesktopPlatform =
|
||||||
|
/Win|Linux|CrOS|Mac/.test(platform) ||
|
||||||
|
/Windows NT|X11|CrOS|Macintosh/.test(ua);
|
||||||
|
if (looksDesktopPlatform) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getFormFactor = (
|
||||||
|
editorWidth: number,
|
||||||
|
editorHeight: number,
|
||||||
|
): EditorInterface["formFactor"] => {
|
||||||
|
if (isMobileBreakpoint(editorWidth, editorHeight)) {
|
||||||
|
return "phone";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isTabletBreakpoint(editorWidth, editorHeight)) {
|
||||||
|
return "tablet";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "desktop";
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deriveStylesPanelMode = (
|
||||||
|
editorInterface: EditorInterface,
|
||||||
|
): StylesPanelMode => {
|
||||||
|
if (editorInterface.formFactor === "phone") {
|
||||||
|
return "mobile";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editorInterface.formFactor === "tablet") {
|
||||||
|
return "compact";
|
||||||
|
}
|
||||||
|
|
||||||
|
return editorInterface.desktopUIMode;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createUserAgentDescriptor = (
|
||||||
|
userAgentString: string,
|
||||||
|
): EditorInterface["userAgent"] => {
|
||||||
|
const normalizedUA = userAgentString ?? "";
|
||||||
|
let platform: EditorInterface["userAgent"]["platform"] = "unknown";
|
||||||
|
|
||||||
|
if (isIOS) {
|
||||||
|
platform = "ios";
|
||||||
|
} else if (isAndroid) {
|
||||||
|
platform = "android";
|
||||||
|
} else if (normalizedUA) {
|
||||||
|
platform = "other";
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isMobileDevice: isMobileOrTablet(),
|
||||||
|
platform,
|
||||||
|
} as const;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const loadDesktopUIModePreference = () => {
|
||||||
|
if (typeof window === "undefined") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const stored = window.localStorage.getItem(DESKTOP_UI_MODE_STORAGE_KEY);
|
||||||
|
if (stored === "compact" || stored === "full") {
|
||||||
|
return stored as EditorInterface["desktopUIMode"];
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// ignore storage access issues (e.g., Safari private mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const persistDesktopUIMode = (mode: EditorInterface["desktopUIMode"]) => {
|
||||||
|
if (typeof window === "undefined") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
window.localStorage.setItem(DESKTOP_UI_MODE_STORAGE_KEY, mode);
|
||||||
|
} catch (error) {
|
||||||
|
// ignore storage access issues (e.g., Safari private mode)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setDesktopUIMode = (mode: EditorInterface["desktopUIMode"]) => {
|
||||||
|
if (mode !== "compact" && mode !== "full") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
persistDesktopUIMode(mode);
|
||||||
|
|
||||||
|
return mode;
|
||||||
|
};
|
||||||
@@ -10,3 +10,5 @@ export * from "./random";
|
|||||||
export * from "./url";
|
export * from "./url";
|
||||||
export * from "./utils";
|
export * from "./utils";
|
||||||
export * from "./emitter";
|
export * from "./emitter";
|
||||||
|
export * from "./visualdebug";
|
||||||
|
export * from "./editorInterface";
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { isDarwin } from "./constants";
|
import { isDarwin } from "./editorInterface";
|
||||||
|
|
||||||
import type { ValueOf } from "./utility-types";
|
import type { ValueOf } from "./utility-types";
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ import {
|
|||||||
ENV,
|
ENV,
|
||||||
FONT_FAMILY,
|
FONT_FAMILY,
|
||||||
getFontFamilyFallbacks,
|
getFontFamilyFallbacks,
|
||||||
isAndroid,
|
|
||||||
isIOS,
|
|
||||||
WINDOWS_EMOJI_FALLBACK_FONT,
|
WINDOWS_EMOJI_FALLBACK_FONT,
|
||||||
} from "./constants";
|
} from "./constants";
|
||||||
|
|
||||||
@@ -1272,59 +1270,3 @@ export const reduceToCommonValue = <T, R = T>(
|
|||||||
|
|
||||||
return commonValue;
|
return commonValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const isMobileOrTablet = (): boolean => {
|
|
||||||
const ua = navigator.userAgent || "";
|
|
||||||
const platform = navigator.platform || "";
|
|
||||||
const uaData = (navigator as any).userAgentData as
|
|
||||||
| { mobile?: boolean; platform?: string }
|
|
||||||
| undefined;
|
|
||||||
|
|
||||||
// --- 1) chromium: prefer ua client hints -------------------------------
|
|
||||||
if (uaData) {
|
|
||||||
const plat = (uaData.platform || "").toLowerCase();
|
|
||||||
const isDesktopOS =
|
|
||||||
plat === "windows" ||
|
|
||||||
plat === "macos" ||
|
|
||||||
plat === "linux" ||
|
|
||||||
plat === "chrome os";
|
|
||||||
if (uaData.mobile === true) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (uaData.mobile === false && plat === "android") {
|
|
||||||
const looksTouchTablet =
|
|
||||||
matchMedia?.("(hover: none)").matches &&
|
|
||||||
matchMedia?.("(pointer: coarse)").matches;
|
|
||||||
return looksTouchTablet;
|
|
||||||
}
|
|
||||||
if (isDesktopOS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- 2) ios (includes ipad) --------------------------------------------
|
|
||||||
if (isIOS) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- 3) android legacy ua fallback -------------------------------------
|
|
||||||
if (isAndroid) {
|
|
||||||
const isAndroidPhone = /Mobile/i.test(ua);
|
|
||||||
const isAndroidTablet = !isAndroidPhone;
|
|
||||||
if (isAndroidPhone || isAndroidTablet) {
|
|
||||||
const looksTouchTablet =
|
|
||||||
matchMedia?.("(hover: none)").matches &&
|
|
||||||
matchMedia?.("(pointer: coarse)").matches;
|
|
||||||
return looksTouchTablet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- 4) last resort desktop exclusion ----------------------------------
|
|
||||||
const looksDesktopPlatform =
|
|
||||||
/Win|Linux|CrOS|Mac/.test(platform) ||
|
|
||||||
/Windows NT|X11|CrOS|Macintosh/.test(ua);
|
|
||||||
if (looksDesktopPlatform) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import {
|
|||||||
invariant,
|
invariant,
|
||||||
rescalePoints,
|
rescalePoints,
|
||||||
sizeOf,
|
sizeOf,
|
||||||
STROKE_WIDTH,
|
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -833,15 +832,9 @@ export const getArrowheadPoints = (
|
|||||||
// This value is selected by minimizing a minimum size with the last segment of the arrowhead
|
// This value is selected by minimizing a minimum size with the last segment of the arrowhead
|
||||||
const lengthMultiplier =
|
const lengthMultiplier =
|
||||||
arrowhead === "diamond" || arrowhead === "diamond_outline" ? 0.25 : 0.5;
|
arrowhead === "diamond" || arrowhead === "diamond_outline" ? 0.25 : 0.5;
|
||||||
// make arrowheads bigger for thick strokes
|
const minSize = Math.min(size, length * lengthMultiplier);
|
||||||
const strokeWidthMultiplier =
|
const xs = x2 - nx * minSize;
|
||||||
element.strokeWidth >= STROKE_WIDTH.extraBold ? 1.5 : 1;
|
const ys = y2 - ny * minSize;
|
||||||
|
|
||||||
const adjustedSize =
|
|
||||||
Math.min(size, length * lengthMultiplier) * strokeWidthMultiplier;
|
|
||||||
|
|
||||||
const xs = x2 - nx * adjustedSize;
|
|
||||||
const ys = y2 - ny * adjustedSize;
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
arrowhead === "dot" ||
|
arrowhead === "dot" ||
|
||||||
@@ -890,7 +883,7 @@ export const getArrowheadPoints = (
|
|||||||
const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];
|
const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];
|
||||||
|
|
||||||
[ox, oy] = pointRotateRads(
|
[ox, oy] = pointRotateRads(
|
||||||
pointFrom(x2 + adjustedSize * 2, y2),
|
pointFrom(x2 + minSize * 2, y2),
|
||||||
pointFrom(x2, y2),
|
pointFrom(x2, y2),
|
||||||
Math.atan2(py - y2, px - x2) as Radians,
|
Math.atan2(py - y2, px - x2) as Radians,
|
||||||
);
|
);
|
||||||
@@ -901,7 +894,7 @@ export const getArrowheadPoints = (
|
|||||||
: [0, 0];
|
: [0, 0];
|
||||||
|
|
||||||
[ox, oy] = pointRotateRads(
|
[ox, oy] = pointRotateRads(
|
||||||
pointFrom(x2 - adjustedSize * 2, y2),
|
pointFrom(x2 - minSize * 2, y2),
|
||||||
pointFrom(x2, y2),
|
pointFrom(x2, y2),
|
||||||
Math.atan2(y2 - py, x2 - px) as Radians,
|
Math.atan2(y2 - py, x2 - px) as Radians,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -11,12 +11,9 @@ import {
|
|||||||
vectorFromPoint,
|
vectorFromPoint,
|
||||||
vectorNormalize,
|
vectorNormalize,
|
||||||
vectorScale,
|
vectorScale,
|
||||||
} from "@excalidraw/math";
|
|
||||||
|
|
||||||
import {
|
|
||||||
ellipse,
|
ellipse,
|
||||||
ellipseSegmentInterceptPoints,
|
ellipseSegmentInterceptPoints,
|
||||||
} from "@excalidraw/math/ellipse";
|
} from "@excalidraw/math";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
Curve,
|
Curve,
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ import {
|
|||||||
curvePointDistance,
|
curvePointDistance,
|
||||||
distanceToLineSegment,
|
distanceToLineSegment,
|
||||||
pointRotateRads,
|
pointRotateRads,
|
||||||
|
ellipse,
|
||||||
|
ellipseDistanceFromPoint,
|
||||||
} from "@excalidraw/math";
|
} from "@excalidraw/math";
|
||||||
|
|
||||||
import { ellipse, ellipseDistanceFromPoint } from "@excalidraw/math/ellipse";
|
|
||||||
|
|
||||||
import type { GlobalPoint, Radians } from "@excalidraw/math";
|
import type { GlobalPoint, Radians } from "@excalidraw/math";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,373 +0,0 @@
|
|||||||
import { LaserPointer, type Point } from "@excalidraw/laser-pointer";
|
|
||||||
|
|
||||||
import {
|
|
||||||
clamp,
|
|
||||||
lineSegment,
|
|
||||||
pointFrom,
|
|
||||||
pointRotateRads,
|
|
||||||
round,
|
|
||||||
type LocalPoint,
|
|
||||||
} from "@excalidraw/math";
|
|
||||||
|
|
||||||
import getStroke from "perfect-freehand";
|
|
||||||
|
|
||||||
import { invariant } from "@excalidraw/common";
|
|
||||||
|
|
||||||
import type { GlobalPoint, Radians } from "@excalidraw/math";
|
|
||||||
|
|
||||||
import { getElementBounds } from "./bounds";
|
|
||||||
|
|
||||||
import type { StrokeOptions } from "perfect-freehand";
|
|
||||||
|
|
||||||
import type {
|
|
||||||
ElementsMap,
|
|
||||||
ExcalidrawFreeDrawElement,
|
|
||||||
PointerType,
|
|
||||||
} from "./types";
|
|
||||||
|
|
||||||
export const STROKE_OPTIONS: Record<
|
|
||||||
PointerType | "default",
|
|
||||||
{ streamline: number; simplify: number }
|
|
||||||
> = {
|
|
||||||
default: {
|
|
||||||
streamline: 0.35,
|
|
||||||
simplify: 0.1,
|
|
||||||
},
|
|
||||||
mouse: {
|
|
||||||
streamline: 0.6,
|
|
||||||
simplify: 0.1,
|
|
||||||
},
|
|
||||||
pen: {
|
|
||||||
// for optimal performance, we use a lower streamline and simplify
|
|
||||||
streamline: 0.2,
|
|
||||||
simplify: 0.1,
|
|
||||||
},
|
|
||||||
touch: {
|
|
||||||
streamline: 0.65,
|
|
||||||
simplify: 0.1,
|
|
||||||
},
|
|
||||||
} as const;
|
|
||||||
|
|
||||||
export const getFreedrawConfig = (eventType: string | null | undefined) => {
|
|
||||||
return (
|
|
||||||
STROKE_OPTIONS[(eventType as PointerType | null) || "default"] ||
|
|
||||||
STROKE_OPTIONS.default
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates simulated pressure based on velocity between consecutive points.
|
|
||||||
* Fast movement (large distances) -> lower pressure
|
|
||||||
* Slow movement (small distances) -> higher pressure
|
|
||||||
*/
|
|
||||||
const calculateVelocityBasedPressure = (
|
|
||||||
points: readonly LocalPoint[],
|
|
||||||
index: number,
|
|
||||||
fixedStrokeWidth: boolean | undefined,
|
|
||||||
maxDistance = 8, // Maximum expected distance for normalization
|
|
||||||
): number => {
|
|
||||||
if (fixedStrokeWidth) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// First point gets highest pressure
|
|
||||||
// This avoid "a dot followed by a line" effect, •== when first stroke is "slow"
|
|
||||||
if (index === 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const [x1, y1] = points[index - 1];
|
|
||||||
const [x2, y2] = points[index];
|
|
||||||
|
|
||||||
// Calculate distance between consecutive points
|
|
||||||
const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
|
|
||||||
|
|
||||||
// Normalize distance and invert for pressure (0 = fast/low pressure, 1 = slow/high pressure)
|
|
||||||
const normalizedDistance = Math.min(distance / maxDistance, 1);
|
|
||||||
const basePressure = Math.max(0.1, 1 - normalizedDistance * 0.7); // Range: 0.1 to 1.0
|
|
||||||
|
|
||||||
const constantPressure = 0.5;
|
|
||||||
const pressure = constantPressure + (basePressure - constantPressure);
|
|
||||||
|
|
||||||
return Math.max(0.1, Math.min(1.0, pressure));
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getFreedrawStroke = (element: ExcalidrawFreeDrawElement) => {
|
|
||||||
// Compose points as [x, y, pressure]
|
|
||||||
let points: [number, number, number][];
|
|
||||||
if (element.freedrawOptions?.fixedStrokeWidth) {
|
|
||||||
points = element.points.map(
|
|
||||||
([x, y]: LocalPoint): [number, number, number] => [x, y, 1],
|
|
||||||
);
|
|
||||||
} else if (element.simulatePressure) {
|
|
||||||
// Simulate pressure based on velocity between consecutive points
|
|
||||||
points = element.points.map(([x, y]: LocalPoint, i) => [
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
calculateVelocityBasedPressure(
|
|
||||||
element.points,
|
|
||||||
i,
|
|
||||||
element.freedrawOptions?.fixedStrokeWidth,
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
points = element.points.map(([x, y]: LocalPoint, i) => {
|
|
||||||
const rawPressure = element.pressures?.[i] ?? 0.5;
|
|
||||||
|
|
||||||
const amplifiedPressure = Math.pow(rawPressure, 0.6);
|
|
||||||
const adjustedPressure = amplifiedPressure;
|
|
||||||
|
|
||||||
return [x, y, clamp(adjustedPressure, 0.1, 1.0)];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const streamline =
|
|
||||||
element.freedrawOptions?.streamline ?? STROKE_OPTIONS.default.streamline;
|
|
||||||
const simplify =
|
|
||||||
element.freedrawOptions?.simplify ?? STROKE_OPTIONS.default.simplify;
|
|
||||||
|
|
||||||
const laser = new LaserPointer({
|
|
||||||
size: element.strokeWidth,
|
|
||||||
streamline,
|
|
||||||
simplify,
|
|
||||||
sizeMapping: ({ pressure: t }) => {
|
|
||||||
if (element.freedrawOptions?.fixedStrokeWidth) {
|
|
||||||
return 0.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.simulatePressure) {
|
|
||||||
return 0.2 + t * 0.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0.2 + t * 0.8;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const pt of points) {
|
|
||||||
laser.addPoint(pt);
|
|
||||||
}
|
|
||||||
laser.close();
|
|
||||||
|
|
||||||
return laser.getStrokeOutline();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates an SVG path for a freedraw element using LaserPointer logic.
|
|
||||||
* Uses actual pressure data if available, otherwise simulates pressure based on velocity.
|
|
||||||
* No streamline, smoothing, or simulation is performed.
|
|
||||||
*/
|
|
||||||
export const getFreeDrawSvgPath = (
|
|
||||||
element: ExcalidrawFreeDrawElement,
|
|
||||||
): string => {
|
|
||||||
// legacy, for backwards compatibility
|
|
||||||
if (element.freedrawOptions === null) {
|
|
||||||
return _legacy_getFreeDrawSvgPath(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _transition_getFreeDrawSvgPath(element);
|
|
||||||
|
|
||||||
// return getSvgPathFromStroke(getFreedrawStroke(element));
|
|
||||||
};
|
|
||||||
|
|
||||||
const roundPoint = (A: Point): string => {
|
|
||||||
return `${round(A[0], 4, "round")},${round(A[1], 4, "round")} `;
|
|
||||||
};
|
|
||||||
|
|
||||||
const average = (A: Point, B: Point): string => {
|
|
||||||
return `${round((A[0] + B[0]) / 2, 4, "round")},${round(
|
|
||||||
(A[1] + B[1]) / 2,
|
|
||||||
4,
|
|
||||||
"round",
|
|
||||||
)} `;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getSvgPathFromStroke = (points: Point[]): string => {
|
|
||||||
const len = points.length;
|
|
||||||
|
|
||||||
if (len < 2) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
let a = points[0];
|
|
||||||
let b = points[1];
|
|
||||||
|
|
||||||
if (len === 2) {
|
|
||||||
return `M${roundPoint(a)}L${roundPoint(b)}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = "";
|
|
||||||
|
|
||||||
for (let i = 2, max = len - 1; i < max; i++) {
|
|
||||||
a = points[i];
|
|
||||||
b = points[i + 1];
|
|
||||||
result += average(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
return `M${roundPoint(points[0])}Q${roundPoint(points[1])}${average(
|
|
||||||
points[1],
|
|
||||||
points[2],
|
|
||||||
)}${points.length > 3 ? "T" : ""}${result}L${roundPoint(points[len - 1])}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _transition_getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {
|
|
||||||
const inputPoints = element.simulatePressure
|
|
||||||
? element.points
|
|
||||||
: element.points.length
|
|
||||||
? element.points.map(([x, y], i) => [x, y, element.pressures[i]])
|
|
||||||
: [[0, 0, 0.5]];
|
|
||||||
|
|
||||||
// Consider changing the options for simulated pressure vs real pressure
|
|
||||||
const options: StrokeOptions = {
|
|
||||||
simulatePressure: element.simulatePressure,
|
|
||||||
size: element.strokeWidth,
|
|
||||||
thinning: 0.6,
|
|
||||||
smoothing: 0.5,
|
|
||||||
streamline: 0.5,
|
|
||||||
easing: (t) => {
|
|
||||||
if (element.freedrawOptions?.fixedStrokeWidth) {
|
|
||||||
return 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Math.sin((t * Math.PI) / 2) * 0.65;
|
|
||||||
}, // https://easings.net/#easeOutSine
|
|
||||||
last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup
|
|
||||||
};
|
|
||||||
|
|
||||||
return _legacy_getSvgPathFromStroke(
|
|
||||||
getStroke(inputPoints as number[][], options),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _legacy_getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {
|
|
||||||
// If input points are empty (should they ever be?) return a dot
|
|
||||||
const inputPoints = element.simulatePressure
|
|
||||||
? element.points
|
|
||||||
: element.points.length
|
|
||||||
? element.points.map(([x, y], i) => [x, y, element.pressures[i]])
|
|
||||||
: [[0, 0, 0.5]];
|
|
||||||
|
|
||||||
// Consider changing the options for simulated pressure vs real pressure
|
|
||||||
const options: StrokeOptions = {
|
|
||||||
simulatePressure: element.simulatePressure,
|
|
||||||
size: element.strokeWidth * 4.25,
|
|
||||||
thinning: 0.6,
|
|
||||||
smoothing: 0.5,
|
|
||||||
streamline: 0.5,
|
|
||||||
easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine
|
|
||||||
last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup
|
|
||||||
};
|
|
||||||
|
|
||||||
return _legacy_getSvgPathFromStroke(
|
|
||||||
getStroke(inputPoints as number[][], options),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const med = (A: number[], B: number[]) => {
|
|
||||||
return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Trim SVG path data so number are each two decimal points. This
|
|
||||||
// improves SVG exports, and prevents rendering errors on points
|
|
||||||
// with long decimals.
|
|
||||||
const TO_FIXED_PRECISION = /(\s?[A-Z]?,?-?[0-9]*\.[0-9]{0,2})(([0-9]|e|-)*)/g;
|
|
||||||
|
|
||||||
const _legacy_getSvgPathFromStroke = (points: number[][]): string => {
|
|
||||||
if (!points.length) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
const max = points.length - 1;
|
|
||||||
|
|
||||||
return points
|
|
||||||
.reduce(
|
|
||||||
(acc, point, i, arr) => {
|
|
||||||
if (i === max) {
|
|
||||||
acc.push(point, med(point, arr[0]), "L", arr[0], "Z");
|
|
||||||
} else {
|
|
||||||
acc.push(point, med(point, arr[i + 1]));
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
["M", points[0], "Q"],
|
|
||||||
)
|
|
||||||
.join(" ")
|
|
||||||
.replace(TO_FIXED_PRECISION, "$1");
|
|
||||||
};
|
|
||||||
|
|
||||||
export function getFreedrawOutlineAsSegments(
|
|
||||||
element: ExcalidrawFreeDrawElement,
|
|
||||||
points: [number, number][],
|
|
||||||
elementsMap: ElementsMap,
|
|
||||||
) {
|
|
||||||
const bounds = getElementBounds(
|
|
||||||
{
|
|
||||||
...element,
|
|
||||||
angle: 0 as Radians,
|
|
||||||
},
|
|
||||||
elementsMap,
|
|
||||||
);
|
|
||||||
const center = pointFrom<GlobalPoint>(
|
|
||||||
(bounds[0] + bounds[2]) / 2,
|
|
||||||
(bounds[1] + bounds[3]) / 2,
|
|
||||||
);
|
|
||||||
|
|
||||||
invariant(points.length >= 2, "Freepath outline must have at least 2 points");
|
|
||||||
|
|
||||||
return points.slice(2).reduce(
|
|
||||||
(acc, curr) => {
|
|
||||||
acc.push(
|
|
||||||
lineSegment<GlobalPoint>(
|
|
||||||
acc[acc.length - 1][1],
|
|
||||||
pointRotateRads(
|
|
||||||
pointFrom<GlobalPoint>(curr[0] + element.x, curr[1] + element.y),
|
|
||||||
center,
|
|
||||||
element.angle,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
[
|
|
||||||
lineSegment<GlobalPoint>(
|
|
||||||
pointRotateRads(
|
|
||||||
pointFrom<GlobalPoint>(
|
|
||||||
points[0][0] + element.x,
|
|
||||||
points[0][1] + element.y,
|
|
||||||
),
|
|
||||||
center,
|
|
||||||
element.angle,
|
|
||||||
),
|
|
||||||
pointRotateRads(
|
|
||||||
pointFrom<GlobalPoint>(
|
|
||||||
points[1][0] + element.x,
|
|
||||||
points[1][1] + element.y,
|
|
||||||
),
|
|
||||||
center,
|
|
||||||
element.angle,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getFreedrawOutlinePoints(element: ExcalidrawFreeDrawElement) {
|
|
||||||
// If input points are empty (should they ever be?) return a dot
|
|
||||||
const inputPoints = element.simulatePressure
|
|
||||||
? element.points
|
|
||||||
: element.points.length
|
|
||||||
? element.points.map(([x, y], i) => [x, y, element.pressures[i]])
|
|
||||||
: [[0, 0, 0.5]];
|
|
||||||
|
|
||||||
// Consider changing the options for simulated pressure vs real pressure
|
|
||||||
const options: StrokeOptions = {
|
|
||||||
simulatePressure: element.simulatePressure,
|
|
||||||
size: element.strokeWidth * 4.25,
|
|
||||||
thinning: 0.6,
|
|
||||||
smoothing: 0.5,
|
|
||||||
streamline: 0.5,
|
|
||||||
easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine
|
|
||||||
last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup
|
|
||||||
};
|
|
||||||
|
|
||||||
return getStroke(inputPoints as number[][], options) as [number, number][];
|
|
||||||
}
|
|
||||||
@@ -94,7 +94,6 @@ export * from "./embeddable";
|
|||||||
export * from "./flowchart";
|
export * from "./flowchart";
|
||||||
export * from "./fractionalIndex";
|
export * from "./fractionalIndex";
|
||||||
export * from "./frame";
|
export * from "./frame";
|
||||||
export * from "./freedraw";
|
|
||||||
export * from "./groups";
|
export * from "./groups";
|
||||||
export * from "./heading";
|
export * from "./heading";
|
||||||
export * from "./image";
|
export * from "./image";
|
||||||
|
|||||||
@@ -445,7 +445,6 @@ export const newFreeDrawElement = (
|
|||||||
points?: ExcalidrawFreeDrawElement["points"];
|
points?: ExcalidrawFreeDrawElement["points"];
|
||||||
simulatePressure: boolean;
|
simulatePressure: boolean;
|
||||||
pressures?: ExcalidrawFreeDrawElement["pressures"];
|
pressures?: ExcalidrawFreeDrawElement["pressures"];
|
||||||
strokeOptions?: ExcalidrawFreeDrawElement["freedrawOptions"];
|
|
||||||
} & ElementConstructorOpts,
|
} & ElementConstructorOpts,
|
||||||
): NonDeleted<ExcalidrawFreeDrawElement> => {
|
): NonDeleted<ExcalidrawFreeDrawElement> => {
|
||||||
return {
|
return {
|
||||||
@@ -454,11 +453,6 @@ export const newFreeDrawElement = (
|
|||||||
pressures: opts.pressures || [],
|
pressures: opts.pressures || [],
|
||||||
simulatePressure: opts.simulatePressure,
|
simulatePressure: opts.simulatePressure,
|
||||||
lastCommittedPoint: null,
|
lastCommittedPoint: null,
|
||||||
freedrawOptions: opts.strokeOptions || {
|
|
||||||
fixedStrokeWidth: true,
|
|
||||||
streamline: 0.25,
|
|
||||||
simplify: 0.1,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
import rough from "roughjs/bin/rough";
|
import rough from "roughjs/bin/rough";
|
||||||
|
import { getStroke } from "perfect-freehand";
|
||||||
|
|
||||||
import { isRightAngleRads } from "@excalidraw/math";
|
import {
|
||||||
|
type GlobalPoint,
|
||||||
|
isRightAngleRads,
|
||||||
|
lineSegment,
|
||||||
|
pointFrom,
|
||||||
|
pointRotateRads,
|
||||||
|
type Radians,
|
||||||
|
} from "@excalidraw/math";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
BOUND_TEXT_PADDING,
|
BOUND_TEXT_PADDING,
|
||||||
@@ -13,6 +21,7 @@ import {
|
|||||||
getFontString,
|
getFontString,
|
||||||
isRTL,
|
isRTL,
|
||||||
getVerticalOffset,
|
getVerticalOffset,
|
||||||
|
invariant,
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
@@ -31,7 +40,7 @@ import type {
|
|||||||
InteractiveCanvasRenderConfig,
|
InteractiveCanvasRenderConfig,
|
||||||
} from "@excalidraw/excalidraw/scene/types";
|
} from "@excalidraw/excalidraw/scene/types";
|
||||||
|
|
||||||
import { getElementAbsoluteCoords } from "./bounds";
|
import { getElementAbsoluteCoords, getElementBounds } from "./bounds";
|
||||||
import { getUncroppedImageElement } from "./cropElement";
|
import { getUncroppedImageElement } from "./cropElement";
|
||||||
import { LinearElementEditor } from "./linearElementEditor";
|
import { LinearElementEditor } from "./linearElementEditor";
|
||||||
import {
|
import {
|
||||||
@@ -57,8 +66,6 @@ import { getCornerRadius } from "./utils";
|
|||||||
|
|
||||||
import { ShapeCache } from "./shape";
|
import { ShapeCache } from "./shape";
|
||||||
|
|
||||||
import { getFreeDrawSvgPath } from "./freedraw";
|
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
ExcalidrawElement,
|
ExcalidrawElement,
|
||||||
ExcalidrawTextElement,
|
ExcalidrawTextElement,
|
||||||
@@ -71,6 +78,7 @@ import type {
|
|||||||
ElementsMap,
|
ElementsMap,
|
||||||
} from "./types";
|
} from "./types";
|
||||||
|
|
||||||
|
import type { StrokeOptions } from "perfect-freehand";
|
||||||
import type { RoughCanvas } from "roughjs/bin/canvas";
|
import type { RoughCanvas } from "roughjs/bin/canvas";
|
||||||
|
|
||||||
// using a stronger invert (100% vs our regular 93%) and saturate
|
// using a stronger invert (100% vs our regular 93%) and saturate
|
||||||
@@ -1037,3 +1045,117 @@ export function generateFreeDrawShape(element: ExcalidrawFreeDrawElement) {
|
|||||||
export function getFreeDrawPath2D(element: ExcalidrawFreeDrawElement) {
|
export function getFreeDrawPath2D(element: ExcalidrawFreeDrawElement) {
|
||||||
return pathsCache.get(element);
|
return pathsCache.get(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {
|
||||||
|
return getSvgPathFromStroke(getFreedrawOutlinePoints(element));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFreedrawOutlineAsSegments(
|
||||||
|
element: ExcalidrawFreeDrawElement,
|
||||||
|
points: [number, number][],
|
||||||
|
elementsMap: ElementsMap,
|
||||||
|
) {
|
||||||
|
const bounds = getElementBounds(
|
||||||
|
{
|
||||||
|
...element,
|
||||||
|
angle: 0 as Radians,
|
||||||
|
},
|
||||||
|
elementsMap,
|
||||||
|
);
|
||||||
|
const center = pointFrom<GlobalPoint>(
|
||||||
|
(bounds[0] + bounds[2]) / 2,
|
||||||
|
(bounds[1] + bounds[3]) / 2,
|
||||||
|
);
|
||||||
|
|
||||||
|
invariant(points.length >= 2, "Freepath outline must have at least 2 points");
|
||||||
|
|
||||||
|
return points.slice(2).reduce(
|
||||||
|
(acc, curr) => {
|
||||||
|
acc.push(
|
||||||
|
lineSegment<GlobalPoint>(
|
||||||
|
acc[acc.length - 1][1],
|
||||||
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(curr[0] + element.x, curr[1] + element.y),
|
||||||
|
center,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
[
|
||||||
|
lineSegment<GlobalPoint>(
|
||||||
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(
|
||||||
|
points[0][0] + element.x,
|
||||||
|
points[0][1] + element.y,
|
||||||
|
),
|
||||||
|
center,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(
|
||||||
|
points[1][0] + element.x,
|
||||||
|
points[1][1] + element.y,
|
||||||
|
),
|
||||||
|
center,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFreedrawOutlinePoints(element: ExcalidrawFreeDrawElement) {
|
||||||
|
// If input points are empty (should they ever be?) return a dot
|
||||||
|
const inputPoints = element.simulatePressure
|
||||||
|
? element.points
|
||||||
|
: element.points.length
|
||||||
|
? element.points.map(([x, y], i) => [x, y, element.pressures[i]])
|
||||||
|
: [[0, 0, 0.5]];
|
||||||
|
|
||||||
|
// Consider changing the options for simulated pressure vs real pressure
|
||||||
|
const options: StrokeOptions = {
|
||||||
|
simulatePressure: element.simulatePressure,
|
||||||
|
size: element.strokeWidth * 4.25,
|
||||||
|
thinning: 0.6,
|
||||||
|
smoothing: 0.5,
|
||||||
|
streamline: 0.5,
|
||||||
|
easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine
|
||||||
|
last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup
|
||||||
|
};
|
||||||
|
|
||||||
|
return getStroke(inputPoints as number[][], options) as [number, number][];
|
||||||
|
}
|
||||||
|
|
||||||
|
function med(A: number[], B: number[]) {
|
||||||
|
return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim SVG path data so number are each two decimal points. This
|
||||||
|
// improves SVG exports, and prevents rendering errors on points
|
||||||
|
// with long decimals.
|
||||||
|
const TO_FIXED_PRECISION = /(\s?[A-Z]?,?-?[0-9]*\.[0-9]{0,2})(([0-9]|e|-)*)/g;
|
||||||
|
|
||||||
|
function getSvgPathFromStroke(points: number[][]): string {
|
||||||
|
if (!points.length) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const max = points.length - 1;
|
||||||
|
|
||||||
|
return points
|
||||||
|
.reduce(
|
||||||
|
(acc, point, i, arr) => {
|
||||||
|
if (i === max) {
|
||||||
|
acc.push(point, med(point, arr[0]), "L", arr[0], "Z");
|
||||||
|
} else {
|
||||||
|
acc.push(point, med(point, arr[i + 1]));
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
["M", points[0], "Q"],
|
||||||
|
)
|
||||||
|
.join(" ")
|
||||||
|
.replace(TO_FIXED_PRECISION, "$1");
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,17 +5,20 @@ import {
|
|||||||
type Radians,
|
type Radians,
|
||||||
} from "@excalidraw/math";
|
} from "@excalidraw/math";
|
||||||
|
|
||||||
import { SIDE_RESIZING_THRESHOLD } from "@excalidraw/common";
|
import {
|
||||||
|
SIDE_RESIZING_THRESHOLD,
|
||||||
|
type EditorInterface,
|
||||||
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import type { GlobalPoint, LineSegment, LocalPoint } from "@excalidraw/math";
|
import type { GlobalPoint, LineSegment, LocalPoint } from "@excalidraw/math";
|
||||||
|
|
||||||
import type { AppState, Device, Zoom } from "@excalidraw/excalidraw/types";
|
import type { AppState, Zoom } from "@excalidraw/excalidraw/types";
|
||||||
|
|
||||||
import { getElementAbsoluteCoords } from "./bounds";
|
import { getElementAbsoluteCoords } from "./bounds";
|
||||||
import {
|
import {
|
||||||
getTransformHandlesFromCoords,
|
getTransformHandlesFromCoords,
|
||||||
getTransformHandles,
|
getTransformHandles,
|
||||||
getOmitSidesForDevice,
|
getOmitSidesForEditorInterface,
|
||||||
canResizeFromSides,
|
canResizeFromSides,
|
||||||
} from "./transformHandles";
|
} from "./transformHandles";
|
||||||
import { isImageElement, isLinearElement } from "./typeChecks";
|
import { isImageElement, isLinearElement } from "./typeChecks";
|
||||||
@@ -51,7 +54,7 @@ export const resizeTest = <Point extends GlobalPoint | LocalPoint>(
|
|||||||
y: number,
|
y: number,
|
||||||
zoom: Zoom,
|
zoom: Zoom,
|
||||||
pointerType: PointerType,
|
pointerType: PointerType,
|
||||||
device: Device,
|
editorInterface: EditorInterface,
|
||||||
): MaybeTransformHandleType => {
|
): MaybeTransformHandleType => {
|
||||||
if (!appState.selectedElementIds[element.id]) {
|
if (!appState.selectedElementIds[element.id]) {
|
||||||
return false;
|
return false;
|
||||||
@@ -63,7 +66,7 @@ export const resizeTest = <Point extends GlobalPoint | LocalPoint>(
|
|||||||
zoom,
|
zoom,
|
||||||
elementsMap,
|
elementsMap,
|
||||||
pointerType,
|
pointerType,
|
||||||
getOmitSidesForDevice(device),
|
getOmitSidesForEditorInterface(editorInterface),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -86,7 +89,7 @@ export const resizeTest = <Point extends GlobalPoint | LocalPoint>(
|
|||||||
return filter[0] as TransformHandleType;
|
return filter[0] as TransformHandleType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canResizeFromSides(device)) {
|
if (canResizeFromSides(editorInterface)) {
|
||||||
const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(
|
const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(
|
||||||
element,
|
element,
|
||||||
elementsMap,
|
elementsMap,
|
||||||
@@ -132,7 +135,7 @@ export const getElementWithTransformHandleType = (
|
|||||||
zoom: Zoom,
|
zoom: Zoom,
|
||||||
pointerType: PointerType,
|
pointerType: PointerType,
|
||||||
elementsMap: ElementsMap,
|
elementsMap: ElementsMap,
|
||||||
device: Device,
|
editorInterface: EditorInterface,
|
||||||
) => {
|
) => {
|
||||||
return elements.reduce((result, element) => {
|
return elements.reduce((result, element) => {
|
||||||
if (result) {
|
if (result) {
|
||||||
@@ -146,7 +149,7 @@ export const getElementWithTransformHandleType = (
|
|||||||
scenePointerY,
|
scenePointerY,
|
||||||
zoom,
|
zoom,
|
||||||
pointerType,
|
pointerType,
|
||||||
device,
|
editorInterface,
|
||||||
);
|
);
|
||||||
return transformHandleType ? { element, transformHandleType } : null;
|
return transformHandleType ? { element, transformHandleType } : null;
|
||||||
}, null as { element: NonDeletedExcalidrawElement; transformHandleType: MaybeTransformHandleType } | null);
|
}, null as { element: NonDeletedExcalidrawElement; transformHandleType: MaybeTransformHandleType } | null);
|
||||||
@@ -160,14 +163,14 @@ export const getTransformHandleTypeFromCoords = <
|
|||||||
scenePointerY: number,
|
scenePointerY: number,
|
||||||
zoom: Zoom,
|
zoom: Zoom,
|
||||||
pointerType: PointerType,
|
pointerType: PointerType,
|
||||||
device: Device,
|
editorInterface: EditorInterface,
|
||||||
): MaybeTransformHandleType => {
|
): MaybeTransformHandleType => {
|
||||||
const transformHandles = getTransformHandlesFromCoords(
|
const transformHandles = getTransformHandlesFromCoords(
|
||||||
[x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],
|
[x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],
|
||||||
0 as Radians,
|
0 as Radians,
|
||||||
zoom,
|
zoom,
|
||||||
pointerType,
|
pointerType,
|
||||||
getOmitSidesForDevice(device),
|
getOmitSidesForEditorInterface(editorInterface),
|
||||||
);
|
);
|
||||||
|
|
||||||
const found = Object.keys(transformHandles).find((key) => {
|
const found = Object.keys(transformHandles).find((key) => {
|
||||||
@@ -183,7 +186,7 @@ export const getTransformHandleTypeFromCoords = <
|
|||||||
return found as MaybeTransformHandleType;
|
return found as MaybeTransformHandleType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canResizeFromSides(device)) {
|
if (canResizeFromSides(editorInterface)) {
|
||||||
const cx = (x1 + x2) / 2;
|
const cx = (x1 + x2) / 2;
|
||||||
const cy = (y1 + y2) / 2;
|
const cy = (y1 + y2) / 2;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import {
|
|||||||
assertNever,
|
assertNever,
|
||||||
COLOR_PALETTE,
|
COLOR_PALETTE,
|
||||||
LINE_POLYGON_POINT_MERGE_DISTANCE,
|
LINE_POLYGON_POINT_MERGE_DISTANCE,
|
||||||
STROKE_WIDTH,
|
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import { RoughGenerator } from "roughjs/bin/generator";
|
import { RoughGenerator } from "roughjs/bin/generator";
|
||||||
@@ -203,7 +202,7 @@ export const generateRoughOptions = (
|
|||||||
// hachureGap because if not specified, roughjs uses strokeWidth to
|
// hachureGap because if not specified, roughjs uses strokeWidth to
|
||||||
// calculate them (and we don't want the fills to be modified)
|
// calculate them (and we don't want the fills to be modified)
|
||||||
fillWeight: element.strokeWidth / 2,
|
fillWeight: element.strokeWidth / 2,
|
||||||
hachureGap: Math.min(element.strokeWidth, STROKE_WIDTH.bold) * 4,
|
hachureGap: element.strokeWidth * 4,
|
||||||
roughness: adjustRoughness(element),
|
roughness: adjustRoughness(element),
|
||||||
stroke: element.strokeColor,
|
stroke: element.strokeColor,
|
||||||
preserveVertices:
|
preserveVertices:
|
||||||
@@ -807,21 +806,15 @@ const generateElementShape = (
|
|||||||
generateFreeDrawShape(element);
|
generateFreeDrawShape(element);
|
||||||
|
|
||||||
if (isPathALoop(element.points)) {
|
if (isPathALoop(element.points)) {
|
||||||
const points =
|
// generate rough polygon to fill freedraw shape
|
||||||
element.freedrawOptions === null
|
const simplifiedPoints = simplify(
|
||||||
? simplify(element.points as LocalPoint[], 0.75)
|
element.points as Mutable<LocalPoint[]>,
|
||||||
: simplify(element.points as LocalPoint[], 1.5);
|
0.75,
|
||||||
|
);
|
||||||
shape =
|
shape = generator.curve(simplifiedPoints as [number, number][], {
|
||||||
element.freedrawOptions === null
|
...generateRoughOptions(element),
|
||||||
? generator.curve(points, {
|
stroke: "none",
|
||||||
...generateRoughOptions(element),
|
});
|
||||||
stroke: "none",
|
|
||||||
})
|
|
||||||
: generator.polygon(points, {
|
|
||||||
...generateRoughOptions(element),
|
|
||||||
stroke: "none",
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
shape = null;
|
shape = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
DEFAULT_TRANSFORM_HANDLE_SPACING,
|
DEFAULT_TRANSFORM_HANDLE_SPACING,
|
||||||
isAndroid,
|
type EditorInterface,
|
||||||
isIOS,
|
|
||||||
isMobileOrTablet,
|
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import { pointFrom, pointRotateRads } from "@excalidraw/math";
|
import { pointFrom, pointRotateRads } from "@excalidraw/math";
|
||||||
@@ -10,7 +8,6 @@ import { pointFrom, pointRotateRads } from "@excalidraw/math";
|
|||||||
import type { Radians } from "@excalidraw/math";
|
import type { Radians } from "@excalidraw/math";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
Device,
|
|
||||||
InteractiveCanvasAppState,
|
InteractiveCanvasAppState,
|
||||||
Zoom,
|
Zoom,
|
||||||
} from "@excalidraw/excalidraw/types";
|
} from "@excalidraw/excalidraw/types";
|
||||||
@@ -112,20 +109,21 @@ const generateTransformHandle = (
|
|||||||
return [xx - width / 2, yy - height / 2, width, height];
|
return [xx - width / 2, yy - height / 2, width, height];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const canResizeFromSides = (device: Device) => {
|
export const canResizeFromSides = (editorInterface: EditorInterface) => {
|
||||||
if (device.viewport.isMobile) {
|
if (
|
||||||
return false;
|
editorInterface.formFactor === "phone" &&
|
||||||
}
|
editorInterface.userAgent.isMobileDevice
|
||||||
|
) {
|
||||||
if (device.isTouchScreen && (isAndroid || isIOS)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getOmitSidesForDevice = (device: Device) => {
|
export const getOmitSidesForEditorInterface = (
|
||||||
if (canResizeFromSides(device)) {
|
editorInterface: EditorInterface,
|
||||||
|
) => {
|
||||||
|
if (canResizeFromSides(editorInterface)) {
|
||||||
return DEFAULT_OMIT_SIDES;
|
return DEFAULT_OMIT_SIDES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,6 +328,7 @@ export const getTransformHandles = (
|
|||||||
export const hasBoundingBox = (
|
export const hasBoundingBox = (
|
||||||
elements: readonly NonDeletedExcalidrawElement[],
|
elements: readonly NonDeletedExcalidrawElement[],
|
||||||
appState: InteractiveCanvasAppState,
|
appState: InteractiveCanvasAppState,
|
||||||
|
editorInterface: EditorInterface,
|
||||||
) => {
|
) => {
|
||||||
if (appState.selectedLinearElement?.isEditing) {
|
if (appState.selectedLinearElement?.isEditing) {
|
||||||
return false;
|
return false;
|
||||||
@@ -348,5 +347,5 @@ export const hasBoundingBox = (
|
|||||||
|
|
||||||
// on mobile/tablet we currently don't show bbox because of resize issues
|
// on mobile/tablet we currently don't show bbox because of resize issues
|
||||||
// (also prob best for simplicity's sake)
|
// (also prob best for simplicity's sake)
|
||||||
return element.points.length > 2 && !isMobileOrTablet();
|
return element.points.length > 2 && !editorInterface.userAgent.isMobileDevice;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -380,11 +380,6 @@ export type ExcalidrawFreeDrawElement = _ExcalidrawElementBase &
|
|||||||
pressures: readonly number[];
|
pressures: readonly number[];
|
||||||
simulatePressure: boolean;
|
simulatePressure: boolean;
|
||||||
lastCommittedPoint: LocalPoint | null;
|
lastCommittedPoint: LocalPoint | null;
|
||||||
freedrawOptions: {
|
|
||||||
streamline?: number;
|
|
||||||
simplify?: number;
|
|
||||||
fixedStrokeWidth?: boolean;
|
|
||||||
} | null;
|
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type FileId = string & { _brand: "FileId" };
|
export type FileId = string & { _brand: "FileId" };
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ export const actionChangeViewBackgroundColor = register({
|
|||||||
elements={elements}
|
elements={elements}
|
||||||
appState={appState}
|
appState={appState}
|
||||||
updateData={updateData}
|
updateData={updateData}
|
||||||
compactMode={appState.stylesPanelMode === "compact"}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ import { getSelectedElements, isSomeElementSelected } from "../scene";
|
|||||||
import { TrashIcon } from "../components/icons";
|
import { TrashIcon } from "../components/icons";
|
||||||
import { ToolButton } from "../components/ToolButton";
|
import { ToolButton } from "../components/ToolButton";
|
||||||
|
|
||||||
|
import { useStylesPanelMode } from "..";
|
||||||
|
|
||||||
import { register } from "./register";
|
import { register } from "./register";
|
||||||
|
|
||||||
import type { AppClassProperties, AppState } from "../types";
|
import type { AppClassProperties, AppState } from "../types";
|
||||||
@@ -320,22 +322,25 @@ export const actionDeleteSelected = register({
|
|||||||
keyTest: (event, appState, elements) =>
|
keyTest: (event, appState, elements) =>
|
||||||
(event.key === KEYS.BACKSPACE || event.key === KEYS.DELETE) &&
|
(event.key === KEYS.BACKSPACE || event.key === KEYS.DELETE) &&
|
||||||
!event[KEYS.CTRL_OR_CMD],
|
!event[KEYS.CTRL_OR_CMD],
|
||||||
PanelComponent: ({ elements, appState, updateData }) => (
|
PanelComponent: ({ elements, appState, updateData, app }) => {
|
||||||
<ToolButton
|
const isMobile = useStylesPanelMode() === "mobile";
|
||||||
type="button"
|
|
||||||
icon={TrashIcon}
|
return (
|
||||||
title={t("labels.delete")}
|
<ToolButton
|
||||||
aria-label={t("labels.delete")}
|
type="button"
|
||||||
onClick={() => updateData(null)}
|
icon={TrashIcon}
|
||||||
disabled={
|
title={t("labels.delete")}
|
||||||
!isSomeElementSelected(getNonDeletedElements(elements), appState)
|
aria-label={t("labels.delete")}
|
||||||
}
|
onClick={() => updateData(null)}
|
||||||
style={{
|
disabled={
|
||||||
...(appState.stylesPanelMode === "mobile" &&
|
!isSomeElementSelected(getNonDeletedElements(elements), appState)
|
||||||
appState.openPopup !== "compactOtherProperties"
|
}
|
||||||
? MOBILE_ACTION_BUTTON_BG
|
style={{
|
||||||
: {}),
|
...(isMobile && appState.openPopup !== "compactOtherProperties"
|
||||||
}}
|
? MOBILE_ACTION_BUTTON_BG
|
||||||
/>
|
: {}),
|
||||||
),
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import { t } from "../i18n";
|
|||||||
import { isSomeElementSelected } from "../scene";
|
import { isSomeElementSelected } from "../scene";
|
||||||
import { getShortcutKey } from "../shortcut";
|
import { getShortcutKey } from "../shortcut";
|
||||||
|
|
||||||
|
import { useStylesPanelMode } from "..";
|
||||||
|
|
||||||
import { register } from "./register";
|
import { register } from "./register";
|
||||||
|
|
||||||
export const actionDuplicateSelection = register({
|
export const actionDuplicateSelection = register({
|
||||||
@@ -107,24 +109,27 @@ export const actionDuplicateSelection = register({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.D,
|
keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.D,
|
||||||
PanelComponent: ({ elements, appState, updateData }) => (
|
PanelComponent: ({ elements, appState, updateData, app }) => {
|
||||||
<ToolButton
|
const isMobile = useStylesPanelMode() === "mobile";
|
||||||
type="button"
|
|
||||||
icon={DuplicateIcon}
|
return (
|
||||||
title={`${t("labels.duplicateSelection")} — ${getShortcutKey(
|
<ToolButton
|
||||||
"CtrlOrCmd+D",
|
type="button"
|
||||||
)}`}
|
icon={DuplicateIcon}
|
||||||
aria-label={t("labels.duplicateSelection")}
|
title={`${t("labels.duplicateSelection")} — ${getShortcutKey(
|
||||||
onClick={() => updateData(null)}
|
"CtrlOrCmd+D",
|
||||||
disabled={
|
)}`}
|
||||||
!isSomeElementSelected(getNonDeletedElements(elements), appState)
|
aria-label={t("labels.duplicateSelection")}
|
||||||
}
|
onClick={() => updateData(null)}
|
||||||
style={{
|
disabled={
|
||||||
...(appState.stylesPanelMode === "mobile" &&
|
!isSomeElementSelected(getNonDeletedElements(elements), appState)
|
||||||
appState.openPopup !== "compactOtherProperties"
|
}
|
||||||
? MOBILE_ACTION_BUTTON_BG
|
style={{
|
||||||
: {}),
|
...(isMobile && appState.openPopup !== "compactOtherProperties"
|
||||||
}}
|
? MOBILE_ACTION_BUTTON_BG
|
||||||
/>
|
: {}),
|
||||||
),
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { CaptureUpdateAction } from "@excalidraw/element";
|
|||||||
|
|
||||||
import type { Theme } from "@excalidraw/element/types";
|
import type { Theme } from "@excalidraw/element/types";
|
||||||
|
|
||||||
import { useDevice } from "../components/App";
|
import { useEditorInterface } from "../components/App";
|
||||||
import { CheckboxItem } from "../components/CheckboxItem";
|
import { CheckboxItem } from "../components/CheckboxItem";
|
||||||
import { DarkModeToggle } from "../components/DarkModeToggle";
|
import { DarkModeToggle } from "../components/DarkModeToggle";
|
||||||
import { ProjectName } from "../components/ProjectName";
|
import { ProjectName } from "../components/ProjectName";
|
||||||
@@ -242,7 +242,7 @@ export const actionSaveFileToDisk = register({
|
|||||||
icon={saveAs}
|
icon={saveAs}
|
||||||
title={t("buttons.saveAs")}
|
title={t("buttons.saveAs")}
|
||||||
aria-label={t("buttons.saveAs")}
|
aria-label={t("buttons.saveAs")}
|
||||||
showAriaLabel={useDevice().editor.isMobile}
|
showAriaLabel={useEditorInterface().formFactor === "phone"}
|
||||||
hidden={!nativeFileSystemSupported}
|
hidden={!nativeFileSystemSupported}
|
||||||
onClick={() => updateData(null)}
|
onClick={() => updateData(null)}
|
||||||
data-testid="save-as-button"
|
data-testid="save-as-button"
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ import { HistoryChangedEvent } from "../history";
|
|||||||
import { useEmitter } from "../hooks/useEmitter";
|
import { useEmitter } from "../hooks/useEmitter";
|
||||||
import { t } from "../i18n";
|
import { t } from "../i18n";
|
||||||
|
|
||||||
|
import { useStylesPanelMode } from "..";
|
||||||
|
|
||||||
import type { History } from "../history";
|
import type { History } from "../history";
|
||||||
import type { AppClassProperties, AppState } from "../types";
|
import type { AppClassProperties, AppState } from "../types";
|
||||||
import type { Action, ActionResult } from "./types";
|
import type { Action, ActionResult } from "./types";
|
||||||
@@ -73,7 +75,7 @@ export const createUndoAction: ActionCreator = (history) => ({
|
|||||||
),
|
),
|
||||||
keyTest: (event) =>
|
keyTest: (event) =>
|
||||||
event[KEYS.CTRL_OR_CMD] && matchKey(event, KEYS.Z) && !event.shiftKey,
|
event[KEYS.CTRL_OR_CMD] && matchKey(event, KEYS.Z) && !event.shiftKey,
|
||||||
PanelComponent: ({ appState, updateData, data }) => {
|
PanelComponent: ({ appState, updateData, data, app }) => {
|
||||||
const { isUndoStackEmpty } = useEmitter<HistoryChangedEvent>(
|
const { isUndoStackEmpty } = useEmitter<HistoryChangedEvent>(
|
||||||
history.onHistoryChangedEmitter,
|
history.onHistoryChangedEmitter,
|
||||||
new HistoryChangedEvent(
|
new HistoryChangedEvent(
|
||||||
@@ -81,6 +83,7 @@ export const createUndoAction: ActionCreator = (history) => ({
|
|||||||
history.isRedoStackEmpty,
|
history.isRedoStackEmpty,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
const isMobile = useStylesPanelMode() === "mobile";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ToolButton
|
<ToolButton
|
||||||
@@ -92,9 +95,7 @@ export const createUndoAction: ActionCreator = (history) => ({
|
|||||||
disabled={isUndoStackEmpty}
|
disabled={isUndoStackEmpty}
|
||||||
data-testid="button-undo"
|
data-testid="button-undo"
|
||||||
style={{
|
style={{
|
||||||
...(appState.stylesPanelMode === "mobile"
|
...(isMobile ? MOBILE_ACTION_BUTTON_BG : {}),
|
||||||
? MOBILE_ACTION_BUTTON_BG
|
|
||||||
: {}),
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@@ -114,7 +115,7 @@ export const createRedoAction: ActionCreator = (history) => ({
|
|||||||
keyTest: (event) =>
|
keyTest: (event) =>
|
||||||
(event[KEYS.CTRL_OR_CMD] && event.shiftKey && matchKey(event, KEYS.Z)) ||
|
(event[KEYS.CTRL_OR_CMD] && event.shiftKey && matchKey(event, KEYS.Z)) ||
|
||||||
(isWindows && event.ctrlKey && !event.shiftKey && matchKey(event, KEYS.Y)),
|
(isWindows && event.ctrlKey && !event.shiftKey && matchKey(event, KEYS.Y)),
|
||||||
PanelComponent: ({ appState, updateData, data }) => {
|
PanelComponent: ({ appState, updateData, data, app }) => {
|
||||||
const { isRedoStackEmpty } = useEmitter(
|
const { isRedoStackEmpty } = useEmitter(
|
||||||
history.onHistoryChangedEmitter,
|
history.onHistoryChangedEmitter,
|
||||||
new HistoryChangedEvent(
|
new HistoryChangedEvent(
|
||||||
@@ -122,6 +123,7 @@ export const createRedoAction: ActionCreator = (history) => ({
|
|||||||
history.isRedoStackEmpty,
|
history.isRedoStackEmpty,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
const isMobile = useStylesPanelMode() === "mobile";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ToolButton
|
<ToolButton
|
||||||
@@ -133,9 +135,7 @@ export const createRedoAction: ActionCreator = (history) => ({
|
|||||||
disabled={isRedoStackEmpty}
|
disabled={isRedoStackEmpty}
|
||||||
data-testid="button-redo"
|
data-testid="button-redo"
|
||||||
style={{
|
style={{
|
||||||
...(appState.stylesPanelMode === "mobile"
|
...(isMobile ? MOBILE_ACTION_BUTTON_BG : {}),
|
||||||
? MOBILE_ACTION_BUTTON_BG
|
|
||||||
: {}),
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -145,27 +145,26 @@ describe("element locking", () => {
|
|||||||
queryByTestId(document.body, `strokeWidth-thin`),
|
queryByTestId(document.body, `strokeWidth-thin`),
|
||||||
).not.toBeChecked();
|
).not.toBeChecked();
|
||||||
expect(
|
expect(
|
||||||
queryByTestId(document.body, `strokeWidth-medium`),
|
queryByTestId(document.body, `strokeWidth-bold`),
|
||||||
).not.toBeChecked();
|
).not.toBeChecked();
|
||||||
expect(
|
expect(
|
||||||
queryByTestId(document.body, `strokeWidth-bold`),
|
queryByTestId(document.body, `strokeWidth-extraBold`),
|
||||||
).not.toBeChecked();
|
).not.toBeChecked();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should show properties of different element types when selected", () => {
|
it("should show properties of different element types when selected", () => {
|
||||||
const rect = API.createElement({
|
const rect = API.createElement({
|
||||||
type: "rectangle",
|
type: "rectangle",
|
||||||
strokeWidth: STROKE_WIDTH.medium,
|
strokeWidth: STROKE_WIDTH.bold,
|
||||||
});
|
});
|
||||||
const text = API.createElement({
|
const text = API.createElement({
|
||||||
type: "text",
|
type: "text",
|
||||||
fontFamily: FONT_FAMILY["Comic Shanns"],
|
fontFamily: FONT_FAMILY["Comic Shanns"],
|
||||||
strokeWidth: undefined,
|
|
||||||
});
|
});
|
||||||
API.setElements([rect, text]);
|
API.setElements([rect, text]);
|
||||||
API.setSelectedElements([rect, text]);
|
API.setSelectedElements([rect, text]);
|
||||||
|
|
||||||
expect(queryByTestId(document.body, `strokeWidth-medium`)).toBeChecked();
|
expect(queryByTestId(document.body, `strokeWidth-bold`)).toBeChecked();
|
||||||
expect(queryByTestId(document.body, `font-family-code`)).toHaveClass(
|
expect(queryByTestId(document.body, `font-family-code`)).toHaveClass(
|
||||||
"active",
|
"active",
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ import {
|
|||||||
isArrowElement,
|
isArrowElement,
|
||||||
isBoundToContainer,
|
isBoundToContainer,
|
||||||
isElbowArrow,
|
isElbowArrow,
|
||||||
isFreeDrawElement,
|
|
||||||
isLinearElement,
|
isLinearElement,
|
||||||
isLineElement,
|
isLineElement,
|
||||||
isTextElement,
|
isTextElement,
|
||||||
@@ -58,6 +57,8 @@ import {
|
|||||||
toggleLinePolygonState,
|
toggleLinePolygonState,
|
||||||
} from "@excalidraw/element";
|
} from "@excalidraw/element";
|
||||||
|
|
||||||
|
import { deriveStylesPanelMode } from "@excalidraw/common";
|
||||||
|
|
||||||
import type { LocalPoint } from "@excalidraw/math";
|
import type { LocalPoint } from "@excalidraw/math";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
@@ -81,9 +82,6 @@ import { RadioSelection } from "../components/RadioSelection";
|
|||||||
import { ColorPicker } from "../components/ColorPicker/ColorPicker";
|
import { ColorPicker } from "../components/ColorPicker/ColorPicker";
|
||||||
import { FontPicker } from "../components/FontPicker/FontPicker";
|
import { FontPicker } from "../components/FontPicker/FontPicker";
|
||||||
import { IconPicker } from "../components/IconPicker";
|
import { IconPicker } from "../components/IconPicker";
|
||||||
// TODO barnabasmolnar/editor-redesign
|
|
||||||
// TextAlignTopIcon, TextAlignBottomIcon,TextAlignMiddleIcon,
|
|
||||||
// ArrowHead icons
|
|
||||||
import { Range } from "../components/Range";
|
import { Range } from "../components/Range";
|
||||||
import {
|
import {
|
||||||
ArrowheadArrowIcon,
|
ArrowheadArrowIcon,
|
||||||
@@ -126,9 +124,6 @@ import {
|
|||||||
ArrowheadCrowfootIcon,
|
ArrowheadCrowfootIcon,
|
||||||
ArrowheadCrowfootOneIcon,
|
ArrowheadCrowfootOneIcon,
|
||||||
ArrowheadCrowfootOneOrManyIcon,
|
ArrowheadCrowfootOneOrManyIcon,
|
||||||
strokeWidthFixedIcon,
|
|
||||||
strokeWidthVariableIcon,
|
|
||||||
StrokeWidthMediumIcon,
|
|
||||||
} from "../components/icons";
|
} from "../components/icons";
|
||||||
|
|
||||||
import { Fonts } from "../fonts";
|
import { Fonts } from "../fonts";
|
||||||
@@ -153,6 +148,15 @@ import type { AppClassProperties, AppState, Primitive } from "../types";
|
|||||||
|
|
||||||
const FONT_SIZE_RELATIVE_INCREASE_STEP = 0.1;
|
const FONT_SIZE_RELATIVE_INCREASE_STEP = 0.1;
|
||||||
|
|
||||||
|
const getStylesPanelInfo = (app: AppClassProperties) => {
|
||||||
|
const stylesPanelMode = deriveStylesPanelMode(app.editorInterface);
|
||||||
|
return {
|
||||||
|
stylesPanelMode,
|
||||||
|
isCompact: stylesPanelMode !== "full",
|
||||||
|
isMobile: stylesPanelMode === "mobile",
|
||||||
|
} as const;
|
||||||
|
};
|
||||||
|
|
||||||
export const changeProperty = (
|
export const changeProperty = (
|
||||||
elements: readonly ExcalidrawElement[],
|
elements: readonly ExcalidrawElement[],
|
||||||
appState: AppState,
|
appState: AppState,
|
||||||
@@ -331,35 +335,35 @@ export const actionChangeStrokeColor = register({
|
|||||||
: CaptureUpdateAction.EVENTUALLY,
|
: CaptureUpdateAction.EVENTUALLY,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData, app, data }) => (
|
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
||||||
<>
|
const { stylesPanelMode } = getStylesPanelInfo(app);
|
||||||
{appState.stylesPanelMode === "full" && (
|
|
||||||
<h3 aria-hidden="true">{t("labels.stroke")}</h3>
|
return (
|
||||||
)}
|
<>
|
||||||
<ColorPicker
|
{stylesPanelMode === "full" && (
|
||||||
topPicks={DEFAULT_ELEMENT_STROKE_PICKS}
|
<h3 aria-hidden="true">{t("labels.stroke")}</h3>
|
||||||
palette={DEFAULT_ELEMENT_STROKE_COLOR_PALETTE}
|
|
||||||
type="elementStroke"
|
|
||||||
label={t("labels.stroke")}
|
|
||||||
color={getFormValue(
|
|
||||||
elements,
|
|
||||||
app,
|
|
||||||
(element) => element.strokeColor,
|
|
||||||
true,
|
|
||||||
(hasSelection) =>
|
|
||||||
!hasSelection ? appState.currentItemStrokeColor : null,
|
|
||||||
)}
|
)}
|
||||||
onChange={(color) => updateData({ currentItemStrokeColor: color })}
|
<ColorPicker
|
||||||
elements={elements}
|
topPicks={DEFAULT_ELEMENT_STROKE_PICKS}
|
||||||
appState={appState}
|
palette={DEFAULT_ELEMENT_STROKE_COLOR_PALETTE}
|
||||||
updateData={updateData}
|
type="elementStroke"
|
||||||
compactMode={
|
label={t("labels.stroke")}
|
||||||
appState.stylesPanelMode === "compact" ||
|
color={getFormValue(
|
||||||
appState.stylesPanelMode === "mobile"
|
elements,
|
||||||
}
|
app,
|
||||||
/>
|
(element) => element.strokeColor,
|
||||||
</>
|
true,
|
||||||
),
|
(hasSelection) =>
|
||||||
|
!hasSelection ? appState.currentItemStrokeColor : null,
|
||||||
|
)}
|
||||||
|
onChange={(color) => updateData({ currentItemStrokeColor: color })}
|
||||||
|
elements={elements}
|
||||||
|
appState={appState}
|
||||||
|
updateData={updateData}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export const actionChangeBackgroundColor = register({
|
export const actionChangeBackgroundColor = register({
|
||||||
@@ -414,35 +418,37 @@ export const actionChangeBackgroundColor = register({
|
|||||||
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
|
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData, app, data }) => (
|
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
||||||
<>
|
const { stylesPanelMode } = getStylesPanelInfo(app);
|
||||||
{appState.stylesPanelMode === "full" && (
|
|
||||||
<h3 aria-hidden="true">{t("labels.background")}</h3>
|
return (
|
||||||
)}
|
<>
|
||||||
<ColorPicker
|
{stylesPanelMode === "full" && (
|
||||||
topPicks={DEFAULT_ELEMENT_BACKGROUND_PICKS}
|
<h3 aria-hidden="true">{t("labels.background")}</h3>
|
||||||
palette={DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE}
|
|
||||||
type="elementBackground"
|
|
||||||
label={t("labels.background")}
|
|
||||||
color={getFormValue(
|
|
||||||
elements,
|
|
||||||
app,
|
|
||||||
(element) => element.backgroundColor,
|
|
||||||
true,
|
|
||||||
(hasSelection) =>
|
|
||||||
!hasSelection ? appState.currentItemBackgroundColor : null,
|
|
||||||
)}
|
)}
|
||||||
onChange={(color) => updateData({ currentItemBackgroundColor: color })}
|
<ColorPicker
|
||||||
elements={elements}
|
topPicks={DEFAULT_ELEMENT_BACKGROUND_PICKS}
|
||||||
appState={appState}
|
palette={DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE}
|
||||||
updateData={updateData}
|
type="elementBackground"
|
||||||
compactMode={
|
label={t("labels.background")}
|
||||||
appState.stylesPanelMode === "compact" ||
|
color={getFormValue(
|
||||||
appState.stylesPanelMode === "mobile"
|
elements,
|
||||||
}
|
app,
|
||||||
/>
|
(element) => element.backgroundColor,
|
||||||
</>
|
true,
|
||||||
),
|
(hasSelection) =>
|
||||||
|
!hasSelection ? appState.currentItemBackgroundColor : null,
|
||||||
|
)}
|
||||||
|
onChange={(color) =>
|
||||||
|
updateData({ currentItemBackgroundColor: color })
|
||||||
|
}
|
||||||
|
elements={elements}
|
||||||
|
appState={appState}
|
||||||
|
updateData={updateData}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export const actionChangeFillStyle = register({
|
export const actionChangeFillStyle = register({
|
||||||
@@ -453,7 +459,9 @@ export const actionChangeFillStyle = register({
|
|||||||
trackEvent(
|
trackEvent(
|
||||||
"element",
|
"element",
|
||||||
"changeFillStyle",
|
"changeFillStyle",
|
||||||
`${value} (${app.device.editor.isMobile ? "mobile" : "desktop"})`,
|
`${value} (${
|
||||||
|
app.editorInterface.formFactor === "phone" ? "mobile" : "desktop"
|
||||||
|
})`,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
elements: changeProperty(elements, appState, (el) =>
|
elements: changeProperty(elements, appState, (el) =>
|
||||||
@@ -525,33 +533,6 @@ export const actionChangeFillStyle = register({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const WIDTHS = [
|
|
||||||
{
|
|
||||||
value: STROKE_WIDTH.thin,
|
|
||||||
text: t("labels.thin"),
|
|
||||||
icon: StrokeWidthBaseIcon,
|
|
||||||
testId: "strokeWidth-thin",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: STROKE_WIDTH.medium,
|
|
||||||
text: t("labels.medium"),
|
|
||||||
icon: StrokeWidthMediumIcon,
|
|
||||||
testId: "strokeWidth-medium",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: STROKE_WIDTH.bold,
|
|
||||||
text: t("labels.bold"),
|
|
||||||
icon: StrokeWidthBoldIcon,
|
|
||||||
testId: "strokeWidth-bold",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: STROKE_WIDTH.extraBold,
|
|
||||||
text: t("labels.extraBold"),
|
|
||||||
icon: StrokeWidthExtraBoldIcon,
|
|
||||||
testId: "strokeWidth-extraBold",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export const actionChangeStrokeWidth = register({
|
export const actionChangeStrokeWidth = register({
|
||||||
name: "changeStrokeWidth",
|
name: "changeStrokeWidth",
|
||||||
label: "labels.strokeWidth",
|
label: "labels.strokeWidth",
|
||||||
@@ -573,7 +554,26 @@ export const actionChangeStrokeWidth = register({
|
|||||||
<div className="buttonList">
|
<div className="buttonList">
|
||||||
<RadioSelection
|
<RadioSelection
|
||||||
group="stroke-width"
|
group="stroke-width"
|
||||||
options={WIDTHS}
|
options={[
|
||||||
|
{
|
||||||
|
value: STROKE_WIDTH.thin,
|
||||||
|
text: t("labels.thin"),
|
||||||
|
icon: StrokeWidthBaseIcon,
|
||||||
|
testId: "strokeWidth-thin",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: STROKE_WIDTH.bold,
|
||||||
|
text: t("labels.bold"),
|
||||||
|
icon: StrokeWidthBoldIcon,
|
||||||
|
testId: "strokeWidth-bold",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: STROKE_WIDTH.extraBold,
|
||||||
|
text: t("labels.extraBold"),
|
||||||
|
icon: StrokeWidthExtraBoldIcon,
|
||||||
|
testId: "strokeWidth-extraBold",
|
||||||
|
},
|
||||||
|
]}
|
||||||
value={getFormValue(
|
value={getFormValue(
|
||||||
elements,
|
elements,
|
||||||
app,
|
app,
|
||||||
@@ -696,70 +696,6 @@ export const actionChangeStrokeStyle = register({
|
|||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const actionChangePressureSensitivity = register({
|
|
||||||
name: "changeStrokeType",
|
|
||||||
label: "labels.strokeType",
|
|
||||||
trackEvent: false,
|
|
||||||
perform: (elements, appState, value) => {
|
|
||||||
const updatedElements = changeProperty(elements, appState, (el) => {
|
|
||||||
if (isFreeDrawElement(el)) {
|
|
||||||
return newElementWith(el, {
|
|
||||||
freedrawOptions: {
|
|
||||||
...el.freedrawOptions,
|
|
||||||
fixedStrokeWidth: value,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return el;
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
elements: updatedElements,
|
|
||||||
appState: { ...appState, currentItemFixedStrokeWidth: value },
|
|
||||||
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
PanelComponent: ({ app, appState, updateData }) => {
|
|
||||||
const selectedElements = app.scene.getSelectedElements(app.state);
|
|
||||||
const freedraws = selectedElements.filter(isFreeDrawElement);
|
|
||||||
|
|
||||||
const currentValue =
|
|
||||||
freedraws.length > 0
|
|
||||||
? reduceToCommonValue(
|
|
||||||
freedraws,
|
|
||||||
(element) => element.freedrawOptions?.fixedStrokeWidth,
|
|
||||||
) ?? null
|
|
||||||
: appState.currentItemFixedStrokeWidth;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<fieldset>
|
|
||||||
<legend>{t("labels.strokeType")}</legend>
|
|
||||||
<div className="buttonList">
|
|
||||||
<RadioSelection
|
|
||||||
group="pressure-sensitivity"
|
|
||||||
options={[
|
|
||||||
{
|
|
||||||
value: true,
|
|
||||||
text: t("labels.strokeWidthFixed"),
|
|
||||||
icon: strokeWidthFixedIcon,
|
|
||||||
testId: "pressure-fixed",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: false,
|
|
||||||
text: t("labels.strokeWidthVariable"),
|
|
||||||
icon: strokeWidthVariableIcon,
|
|
||||||
testId: "pressure-variable",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
value={currentValue}
|
|
||||||
onChange={(value) => updateData(value)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
export const actionChangeOpacity = register({
|
export const actionChangeOpacity = register({
|
||||||
name: "changeOpacity",
|
name: "changeOpacity",
|
||||||
label: "labels.opacity",
|
label: "labels.opacity",
|
||||||
@@ -791,78 +727,81 @@ export const actionChangeFontSize = register({
|
|||||||
perform: (elements, appState, value, app) => {
|
perform: (elements, appState, value, app) => {
|
||||||
return changeFontSize(elements, appState, app, () => value, value);
|
return changeFontSize(elements, appState, app, () => value, value);
|
||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData, app, data }) => (
|
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
||||||
<fieldset>
|
const { isCompact } = getStylesPanelInfo(app);
|
||||||
<legend>{t("labels.fontSize")}</legend>
|
|
||||||
<div className="buttonList">
|
return (
|
||||||
<RadioSelection
|
<fieldset>
|
||||||
group="font-size"
|
<legend>{t("labels.fontSize")}</legend>
|
||||||
options={[
|
<div className="buttonList">
|
||||||
{
|
<RadioSelection
|
||||||
value: 16,
|
group="font-size"
|
||||||
text: t("labels.small"),
|
options={[
|
||||||
icon: FontSizeSmallIcon,
|
{
|
||||||
testId: "fontSize-small",
|
value: 16,
|
||||||
},
|
text: t("labels.small"),
|
||||||
{
|
icon: FontSizeSmallIcon,
|
||||||
value: 20,
|
testId: "fontSize-small",
|
||||||
text: t("labels.medium"),
|
},
|
||||||
icon: FontSizeMediumIcon,
|
{
|
||||||
testId: "fontSize-medium",
|
value: 20,
|
||||||
},
|
text: t("labels.medium"),
|
||||||
{
|
icon: FontSizeMediumIcon,
|
||||||
value: 28,
|
testId: "fontSize-medium",
|
||||||
text: t("labels.large"),
|
},
|
||||||
icon: FontSizeLargeIcon,
|
{
|
||||||
testId: "fontSize-large",
|
value: 28,
|
||||||
},
|
text: t("labels.large"),
|
||||||
{
|
icon: FontSizeLargeIcon,
|
||||||
value: 36,
|
testId: "fontSize-large",
|
||||||
text: t("labels.veryLarge"),
|
},
|
||||||
icon: FontSizeExtraLargeIcon,
|
{
|
||||||
testId: "fontSize-veryLarge",
|
value: 36,
|
||||||
},
|
text: t("labels.veryLarge"),
|
||||||
]}
|
icon: FontSizeExtraLargeIcon,
|
||||||
value={getFormValue(
|
testId: "fontSize-veryLarge",
|
||||||
elements,
|
},
|
||||||
app,
|
]}
|
||||||
(element) => {
|
value={getFormValue(
|
||||||
if (isTextElement(element)) {
|
elements,
|
||||||
return element.fontSize;
|
app,
|
||||||
}
|
(element) => {
|
||||||
const boundTextElement = getBoundTextElement(
|
if (isTextElement(element)) {
|
||||||
element,
|
return element.fontSize;
|
||||||
app.scene.getNonDeletedElementsMap(),
|
}
|
||||||
|
const boundTextElement = getBoundTextElement(
|
||||||
|
element,
|
||||||
|
app.scene.getNonDeletedElementsMap(),
|
||||||
|
);
|
||||||
|
if (boundTextElement) {
|
||||||
|
return boundTextElement.fontSize;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
(element) =>
|
||||||
|
isTextElement(element) ||
|
||||||
|
getBoundTextElement(
|
||||||
|
element,
|
||||||
|
app.scene.getNonDeletedElementsMap(),
|
||||||
|
) !== null,
|
||||||
|
(hasSelection) =>
|
||||||
|
hasSelection
|
||||||
|
? null
|
||||||
|
: appState.currentItemFontSize || DEFAULT_FONT_SIZE,
|
||||||
|
)}
|
||||||
|
onChange={(value) => {
|
||||||
|
withCaretPositionPreservation(
|
||||||
|
() => updateData(value),
|
||||||
|
isCompact,
|
||||||
|
!!appState.editingTextElement,
|
||||||
|
data?.onPreventClose,
|
||||||
);
|
);
|
||||||
if (boundTextElement) {
|
}}
|
||||||
return boundTextElement.fontSize;
|
/>
|
||||||
}
|
</div>
|
||||||
return null;
|
</fieldset>
|
||||||
},
|
);
|
||||||
(element) =>
|
},
|
||||||
isTextElement(element) ||
|
|
||||||
getBoundTextElement(
|
|
||||||
element,
|
|
||||||
app.scene.getNonDeletedElementsMap(),
|
|
||||||
) !== null,
|
|
||||||
(hasSelection) =>
|
|
||||||
hasSelection
|
|
||||||
? null
|
|
||||||
: appState.currentItemFontSize || DEFAULT_FONT_SIZE,
|
|
||||||
)}
|
|
||||||
onChange={(value) => {
|
|
||||||
withCaretPositionPreservation(
|
|
||||||
() => updateData(value),
|
|
||||||
appState.stylesPanelMode === "compact" ||
|
|
||||||
appState.stylesPanelMode === "mobile",
|
|
||||||
!!appState.editingTextElement,
|
|
||||||
data?.onPreventClose,
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const actionDecreaseFontSize = register({
|
export const actionDecreaseFontSize = register({
|
||||||
@@ -1124,6 +1063,7 @@ export const actionChangeFontFamily = register({
|
|||||||
// relying on state batching as multiple `FontPicker` handlers could be called in rapid succession and we want to combine them
|
// relying on state batching as multiple `FontPicker` handlers could be called in rapid succession and we want to combine them
|
||||||
const [batchedData, setBatchedData] = useState<ChangeFontFamilyData>({});
|
const [batchedData, setBatchedData] = useState<ChangeFontFamilyData>({});
|
||||||
const isUnmounted = useRef(true);
|
const isUnmounted = useRef(true);
|
||||||
|
const { stylesPanelMode, isCompact } = getStylesPanelInfo(app);
|
||||||
|
|
||||||
const selectedFontFamily = useMemo(() => {
|
const selectedFontFamily = useMemo(() => {
|
||||||
const getFontFamily = (
|
const getFontFamily = (
|
||||||
@@ -1196,14 +1136,14 @@ export const actionChangeFontFamily = register({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{appState.stylesPanelMode === "full" && (
|
{stylesPanelMode === "full" && (
|
||||||
<legend>{t("labels.fontFamily")}</legend>
|
<legend>{t("labels.fontFamily")}</legend>
|
||||||
)}
|
)}
|
||||||
<FontPicker
|
<FontPicker
|
||||||
isOpened={appState.openPopup === "fontFamily"}
|
isOpened={appState.openPopup === "fontFamily"}
|
||||||
selectedFontFamily={selectedFontFamily}
|
selectedFontFamily={selectedFontFamily}
|
||||||
hoveredFontFamily={appState.currentHoveredFontFamily}
|
hoveredFontFamily={appState.currentHoveredFontFamily}
|
||||||
compactMode={appState.stylesPanelMode !== "full"}
|
compactMode={stylesPanelMode !== "full"}
|
||||||
onSelect={(fontFamily) => {
|
onSelect={(fontFamily) => {
|
||||||
withCaretPositionPreservation(
|
withCaretPositionPreservation(
|
||||||
() => {
|
() => {
|
||||||
@@ -1215,8 +1155,7 @@ export const actionChangeFontFamily = register({
|
|||||||
// defensive clear so immediate close won't abuse the cached elements
|
// defensive clear so immediate close won't abuse the cached elements
|
||||||
cachedElementsRef.current.clear();
|
cachedElementsRef.current.clear();
|
||||||
},
|
},
|
||||||
appState.stylesPanelMode === "compact" ||
|
isCompact,
|
||||||
appState.stylesPanelMode === "mobile",
|
|
||||||
!!appState.editingTextElement,
|
!!appState.editingTextElement,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
@@ -1291,11 +1230,7 @@ export const actionChangeFontFamily = register({
|
|||||||
cachedElementsRef.current.clear();
|
cachedElementsRef.current.clear();
|
||||||
|
|
||||||
// Refocus text editor when font picker closes if we were editing text
|
// Refocus text editor when font picker closes if we were editing text
|
||||||
if (
|
if (isCompact && appState.editingTextElement) {
|
||||||
(appState.stylesPanelMode === "compact" ||
|
|
||||||
appState.stylesPanelMode === "mobile") &&
|
|
||||||
appState.editingTextElement
|
|
||||||
) {
|
|
||||||
restoreCaretPosition(null); // Just refocus without saved position
|
restoreCaretPosition(null); // Just refocus without saved position
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1342,6 +1277,7 @@ export const actionChangeTextAlign = register({
|
|||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
||||||
const elementsMap = app.scene.getNonDeletedElementsMap();
|
const elementsMap = app.scene.getNonDeletedElementsMap();
|
||||||
|
const { isCompact } = getStylesPanelInfo(app);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@@ -1394,8 +1330,7 @@ export const actionChangeTextAlign = register({
|
|||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
withCaretPositionPreservation(
|
withCaretPositionPreservation(
|
||||||
() => updateData(value),
|
() => updateData(value),
|
||||||
appState.stylesPanelMode === "compact" ||
|
isCompact,
|
||||||
appState.stylesPanelMode === "mobile",
|
|
||||||
!!appState.editingTextElement,
|
!!appState.editingTextElement,
|
||||||
data?.onPreventClose,
|
data?.onPreventClose,
|
||||||
);
|
);
|
||||||
@@ -1442,6 +1377,7 @@ export const actionChangeVerticalAlign = register({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
PanelComponent: ({ elements, appState, updateData, app, data }) => {
|
||||||
|
const { isCompact } = getStylesPanelInfo(app);
|
||||||
return (
|
return (
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<div className="buttonList">
|
<div className="buttonList">
|
||||||
@@ -1494,8 +1430,7 @@ export const actionChangeVerticalAlign = register({
|
|||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
withCaretPositionPreservation(
|
withCaretPositionPreservation(
|
||||||
() => updateData(value),
|
() => updateData(value),
|
||||||
appState.stylesPanelMode === "compact" ||
|
isCompact,
|
||||||
appState.stylesPanelMode === "mobile",
|
|
||||||
!!appState.editingTextElement,
|
!!appState.editingTextElement,
|
||||||
data?.onPreventClose,
|
data?.onPreventClose,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -25,8 +25,11 @@ export const actionToggleZenMode = register({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
checked: (appState) => appState.zenModeEnabled,
|
checked: (appState) => appState.zenModeEnabled,
|
||||||
predicate: (elements, appState, appProps) => {
|
predicate: (elements, appState, appProps, app) => {
|
||||||
return typeof appProps.zenModeEnabled === "undefined";
|
return (
|
||||||
|
app.editorInterface.formFactor !== "phone" &&
|
||||||
|
typeof appProps.zenModeEnabled === "undefined"
|
||||||
|
);
|
||||||
},
|
},
|
||||||
keyTest: (event) =>
|
keyTest: (event) =>
|
||||||
!event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.Z,
|
!event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.Z,
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ export {
|
|||||||
actionChangeStrokeWidth,
|
actionChangeStrokeWidth,
|
||||||
actionChangeFillStyle,
|
actionChangeFillStyle,
|
||||||
actionChangeSloppiness,
|
actionChangeSloppiness,
|
||||||
actionChangePressureSensitivity,
|
|
||||||
actionChangeOpacity,
|
actionChangeOpacity,
|
||||||
actionChangeFontSize,
|
actionChangeFontSize,
|
||||||
actionChangeFontFamily,
|
actionChangeFontFamily,
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ const trackAction = (
|
|||||||
trackEvent(
|
trackEvent(
|
||||||
action.trackEvent.category,
|
action.trackEvent.category,
|
||||||
action.trackEvent.action || action.name,
|
action.trackEvent.action || action.name,
|
||||||
`${source} (${app.device.editor.isMobile ? "mobile" : "desktop"})`,
|
`${source} (${
|
||||||
|
app.editorInterface.formFactor === "phone" ? "mobile" : "desktop"
|
||||||
|
})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ export type ActionName =
|
|||||||
| "changeStrokeStyle"
|
| "changeStrokeStyle"
|
||||||
| "changeArrowhead"
|
| "changeArrowhead"
|
||||||
| "changeArrowType"
|
| "changeArrowType"
|
||||||
| "changeStrokeType"
|
|
||||||
| "changeArrowProperties"
|
| "changeArrowProperties"
|
||||||
| "changeOpacity"
|
| "changeOpacity"
|
||||||
| "changeFontSize"
|
| "changeFontSize"
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ export const getDefaultAppState = (): Omit<
|
|||||||
currentItemFontFamily: DEFAULT_FONT_FAMILY,
|
currentItemFontFamily: DEFAULT_FONT_FAMILY,
|
||||||
currentItemFontSize: DEFAULT_FONT_SIZE,
|
currentItemFontSize: DEFAULT_FONT_SIZE,
|
||||||
currentItemOpacity: DEFAULT_ELEMENT_PROPS.opacity,
|
currentItemOpacity: DEFAULT_ELEMENT_PROPS.opacity,
|
||||||
currentItemFixedStrokeWidth: true,
|
|
||||||
currentItemRoughness: DEFAULT_ELEMENT_PROPS.roughness,
|
currentItemRoughness: DEFAULT_ELEMENT_PROPS.roughness,
|
||||||
currentItemStartArrowhead: null,
|
currentItemStartArrowhead: null,
|
||||||
currentItemStrokeColor: DEFAULT_ELEMENT_PROPS.strokeColor,
|
currentItemStrokeColor: DEFAULT_ELEMENT_PROPS.strokeColor,
|
||||||
@@ -128,7 +127,6 @@ export const getDefaultAppState = (): Omit<
|
|||||||
searchMatches: null,
|
searchMatches: null,
|
||||||
lockedMultiSelections: {},
|
lockedMultiSelections: {},
|
||||||
activeLockedId: null,
|
activeLockedId: null,
|
||||||
stylesPanelMode: "full",
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -168,11 +166,6 @@ const APP_STATE_STORAGE_CONF = (<
|
|||||||
server: false,
|
server: false,
|
||||||
},
|
},
|
||||||
currentItemOpacity: { browser: true, export: false, server: false },
|
currentItemOpacity: { browser: true, export: false, server: false },
|
||||||
currentItemFixedStrokeWidth: {
|
|
||||||
browser: true,
|
|
||||||
export: false,
|
|
||||||
server: false,
|
|
||||||
},
|
|
||||||
currentItemRoughness: { browser: true, export: false, server: false },
|
currentItemRoughness: { browser: true, export: false, server: false },
|
||||||
currentItemStartArrowhead: { browser: true, export: false, server: false },
|
currentItemStartArrowhead: { browser: true, export: false, server: false },
|
||||||
currentItemStrokeColor: { browser: true, export: false, server: false },
|
currentItemStrokeColor: { browser: true, export: false, server: false },
|
||||||
@@ -259,7 +252,6 @@ const APP_STATE_STORAGE_CONF = (<
|
|||||||
searchMatches: { browser: false, export: false, server: false },
|
searchMatches: { browser: false, export: false, server: false },
|
||||||
lockedMultiSelections: { browser: true, export: true, server: true },
|
lockedMultiSelections: { browser: true, export: true, server: true },
|
||||||
activeLockedId: { browser: false, export: false, server: false },
|
activeLockedId: { browser: false, export: false, server: false },
|
||||||
stylesPanelMode: { browser: false, export: false, server: false },
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const _clearAppStateForStorage = <
|
const _clearAppStateForStorage = <
|
||||||
|
|||||||
@@ -49,11 +49,17 @@ import { getFormValue } from "../actions/actionProperties";
|
|||||||
|
|
||||||
import { useTextEditorFocus } from "../hooks/useTextEditorFocus";
|
import { useTextEditorFocus } from "../hooks/useTextEditorFocus";
|
||||||
|
|
||||||
|
import { actionToggleViewMode } from "../actions/actionToggleViewMode";
|
||||||
|
|
||||||
import { getToolbarTools } from "./shapes";
|
import { getToolbarTools } from "./shapes";
|
||||||
|
|
||||||
import "./Actions.scss";
|
import "./Actions.scss";
|
||||||
|
|
||||||
import { useDevice, useExcalidrawContainer } from "./App";
|
import {
|
||||||
|
useEditorInterface,
|
||||||
|
useStylesPanelMode,
|
||||||
|
useExcalidrawContainer,
|
||||||
|
} from "./App";
|
||||||
import Stack from "./Stack";
|
import Stack from "./Stack";
|
||||||
import { ToolButton } from "./ToolButton";
|
import { ToolButton } from "./ToolButton";
|
||||||
import { ToolPopover } from "./ToolPopover";
|
import { ToolPopover } from "./ToolPopover";
|
||||||
@@ -75,6 +81,7 @@ import {
|
|||||||
adjustmentsIcon,
|
adjustmentsIcon,
|
||||||
DotsHorizontalIcon,
|
DotsHorizontalIcon,
|
||||||
SelectionIcon,
|
SelectionIcon,
|
||||||
|
pencilIcon,
|
||||||
} from "./icons";
|
} from "./icons";
|
||||||
|
|
||||||
import { Island } from "./Island";
|
import { Island } from "./Island";
|
||||||
@@ -151,7 +158,7 @@ export const SelectedShapeActions = ({
|
|||||||
const isEditingTextOrNewElement = Boolean(
|
const isEditingTextOrNewElement = Boolean(
|
||||||
appState.editingTextElement || appState.newElement,
|
appState.editingTextElement || appState.newElement,
|
||||||
);
|
);
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const isRTL = document.documentElement.getAttribute("dir") === "rtl";
|
const isRTL = document.documentElement.getAttribute("dir") === "rtl";
|
||||||
|
|
||||||
const showFillIcons =
|
const showFillIcons =
|
||||||
@@ -195,12 +202,8 @@ export const SelectedShapeActions = ({
|
|||||||
renderAction("changeStrokeWidth")}
|
renderAction("changeStrokeWidth")}
|
||||||
|
|
||||||
{(appState.activeTool.type === "freedraw" ||
|
{(appState.activeTool.type === "freedraw" ||
|
||||||
targetElements.some((element) => element.type === "freedraw")) && (
|
targetElements.some((element) => element.type === "freedraw")) &&
|
||||||
<>
|
renderAction("changeStrokeShape")}
|
||||||
{renderAction("changeStrokeShape")}
|
|
||||||
{renderAction("changeStrokeType")}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{(hasStrokeStyle(appState.activeTool.type) ||
|
{(hasStrokeStyle(appState.activeTool.type) ||
|
||||||
targetElements.some((element) => hasStrokeStyle(element.type))) && (
|
targetElements.some((element) => hasStrokeStyle(element.type))) && (
|
||||||
@@ -296,8 +299,10 @@ export const SelectedShapeActions = ({
|
|||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>{t("labels.actions")}</legend>
|
<legend>{t("labels.actions")}</legend>
|
||||||
<div className="buttonList">
|
<div className="buttonList">
|
||||||
{!device.editor.isMobile && renderAction("duplicateSelection")}
|
{editorInterface.formFactor !== "phone" &&
|
||||||
{!device.editor.isMobile && renderAction("deleteSelectedElements")}
|
renderAction("duplicateSelection")}
|
||||||
|
{editorInterface.formFactor !== "phone" &&
|
||||||
|
renderAction("deleteSelectedElements")}
|
||||||
{renderAction("group")}
|
{renderAction("group")}
|
||||||
{renderAction("ungroup")}
|
{renderAction("ungroup")}
|
||||||
{showLinkIcon && renderAction("hyperlink")}
|
{showLinkIcon && renderAction("hyperlink")}
|
||||||
@@ -1045,6 +1050,9 @@ export const ShapesSwitcher = ({
|
|||||||
UIOptions: AppProps["UIOptions"];
|
UIOptions: AppProps["UIOptions"];
|
||||||
}) => {
|
}) => {
|
||||||
const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = useState(false);
|
const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = useState(false);
|
||||||
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
|
const isFullStylesPanel = stylesPanelMode === "full";
|
||||||
|
const isCompactStylesPanel = stylesPanelMode === "compact";
|
||||||
|
|
||||||
const SELECTION_TOOLS = [
|
const SELECTION_TOOLS = [
|
||||||
{
|
{
|
||||||
@@ -1062,7 +1070,7 @@ export const ShapesSwitcher = ({
|
|||||||
const frameToolSelected = activeTool.type === "frame";
|
const frameToolSelected = activeTool.type === "frame";
|
||||||
const laserToolSelected = activeTool.type === "laser";
|
const laserToolSelected = activeTool.type === "laser";
|
||||||
const lassoToolSelected =
|
const lassoToolSelected =
|
||||||
app.state.stylesPanelMode === "full" &&
|
isFullStylesPanel &&
|
||||||
activeTool.type === "lasso" &&
|
activeTool.type === "lasso" &&
|
||||||
app.state.preferredSelectionTool.type !== "lasso";
|
app.state.preferredSelectionTool.type !== "lasso";
|
||||||
|
|
||||||
@@ -1095,7 +1103,7 @@ export const ShapesSwitcher = ({
|
|||||||
// use a ToolPopover for selection/lasso toggle as well
|
// use a ToolPopover for selection/lasso toggle as well
|
||||||
if (
|
if (
|
||||||
(value === "selection" || value === "lasso") &&
|
(value === "selection" || value === "lasso") &&
|
||||||
app.state.stylesPanelMode === "compact"
|
isCompactStylesPanel
|
||||||
) {
|
) {
|
||||||
return (
|
return (
|
||||||
<ToolPopover
|
<ToolPopover
|
||||||
@@ -1229,7 +1237,7 @@ export const ShapesSwitcher = ({
|
|||||||
>
|
>
|
||||||
{t("toolBar.laser")}
|
{t("toolBar.laser")}
|
||||||
</DropdownMenu.Item>
|
</DropdownMenu.Item>
|
||||||
{app.state.stylesPanelMode === "full" && (
|
{isFullStylesPanel && (
|
||||||
<DropdownMenu.Item
|
<DropdownMenu.Item
|
||||||
onSelect={() => app.setActiveTool({ type: "lasso" })}
|
onSelect={() => app.setActiveTool({ type: "lasso" })}
|
||||||
icon={LassoIcon}
|
icon={LassoIcon}
|
||||||
@@ -1299,7 +1307,7 @@ export const UndoRedoActions = ({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
export const ExitZenModeAction = ({
|
export const ExitZenModeButton = ({
|
||||||
actionManager,
|
actionManager,
|
||||||
showExitZenModeBtn,
|
showExitZenModeBtn,
|
||||||
}: {
|
}: {
|
||||||
@@ -1316,3 +1324,17 @@ export const ExitZenModeAction = ({
|
|||||||
{t("buttons.exitZenMode")}
|
{t("buttons.exitZenMode")}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const ExitViewModeButton = ({
|
||||||
|
actionManager,
|
||||||
|
}: {
|
||||||
|
actionManager: ActionManager;
|
||||||
|
}) => (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="disable-view-mode"
|
||||||
|
onClick={() => actionManager.executeAction(actionToggleViewMode)}
|
||||||
|
>
|
||||||
|
{pencilIcon}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ import {
|
|||||||
FRAME_STYLE,
|
FRAME_STYLE,
|
||||||
IMAGE_MIME_TYPES,
|
IMAGE_MIME_TYPES,
|
||||||
IMAGE_RENDER_TIMEOUT,
|
IMAGE_RENDER_TIMEOUT,
|
||||||
isBrave,
|
|
||||||
LINE_CONFIRM_THRESHOLD,
|
LINE_CONFIRM_THRESHOLD,
|
||||||
MAX_ALLOWED_FILE_BYTES,
|
MAX_ALLOWED_FILE_BYTES,
|
||||||
MIME_TYPES,
|
MIME_TYPES,
|
||||||
@@ -55,13 +54,11 @@ import {
|
|||||||
ZOOM_STEP,
|
ZOOM_STEP,
|
||||||
POINTER_EVENTS,
|
POINTER_EVENTS,
|
||||||
TOOL_TYPE,
|
TOOL_TYPE,
|
||||||
isIOS,
|
|
||||||
supportsResizeObserver,
|
supportsResizeObserver,
|
||||||
DEFAULT_COLLISION_THRESHOLD,
|
DEFAULT_COLLISION_THRESHOLD,
|
||||||
DEFAULT_TEXT_ALIGN,
|
DEFAULT_TEXT_ALIGN,
|
||||||
ARROW_TYPE,
|
ARROW_TYPE,
|
||||||
DEFAULT_REDUCED_GLOBAL_ALPHA,
|
DEFAULT_REDUCED_GLOBAL_ALPHA,
|
||||||
isSafari,
|
|
||||||
isLocalLink,
|
isLocalLink,
|
||||||
normalizeLink,
|
normalizeLink,
|
||||||
toValidURL,
|
toValidURL,
|
||||||
@@ -98,12 +95,16 @@ import {
|
|||||||
Emitter,
|
Emitter,
|
||||||
MINIMUM_ARROW_SIZE,
|
MINIMUM_ARROW_SIZE,
|
||||||
DOUBLE_TAP_POSITION_THRESHOLD,
|
DOUBLE_TAP_POSITION_THRESHOLD,
|
||||||
isMobileOrTablet,
|
createUserAgentDescriptor,
|
||||||
MQ_MAX_MOBILE,
|
getFormFactor,
|
||||||
MQ_MIN_TABLET,
|
deriveStylesPanelMode,
|
||||||
MQ_MAX_TABLET,
|
isIOS,
|
||||||
MQ_MAX_HEIGHT_LANDSCAPE,
|
isBrave,
|
||||||
MQ_MAX_WIDTH_LANDSCAPE,
|
isSafari,
|
||||||
|
type EditorInterface,
|
||||||
|
type StylesPanelMode,
|
||||||
|
loadDesktopUIModePreference,
|
||||||
|
setDesktopUIMode,
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -236,8 +237,6 @@ import {
|
|||||||
hitElementBoundingBox,
|
hitElementBoundingBox,
|
||||||
isLineElement,
|
isLineElement,
|
||||||
isSimpleArrow,
|
isSimpleArrow,
|
||||||
STROKE_OPTIONS,
|
|
||||||
getFreedrawConfig,
|
|
||||||
StoreDelta,
|
StoreDelta,
|
||||||
type ApplyToOptions,
|
type ApplyToOptions,
|
||||||
positionElementsOnGrid,
|
positionElementsOnGrid,
|
||||||
@@ -462,7 +461,6 @@ import type {
|
|||||||
LibraryItems,
|
LibraryItems,
|
||||||
PointerDownState,
|
PointerDownState,
|
||||||
SceneData,
|
SceneData,
|
||||||
Device,
|
|
||||||
FrameNameBoundsCache,
|
FrameNameBoundsCache,
|
||||||
SidebarName,
|
SidebarName,
|
||||||
SidebarTabName,
|
SidebarTabName,
|
||||||
@@ -483,19 +481,20 @@ import type { Action, ActionResult } from "../actions/types";
|
|||||||
const AppContext = React.createContext<AppClassProperties>(null!);
|
const AppContext = React.createContext<AppClassProperties>(null!);
|
||||||
const AppPropsContext = React.createContext<AppProps>(null!);
|
const AppPropsContext = React.createContext<AppProps>(null!);
|
||||||
|
|
||||||
const deviceContextInitialValue = {
|
const editorInterfaceContextInitialValue: EditorInterface = {
|
||||||
viewport: {
|
formFactor: "desktop",
|
||||||
isMobile: false,
|
desktopUIMode: "full",
|
||||||
isLandscape: false,
|
userAgent: createUserAgentDescriptor(
|
||||||
},
|
typeof navigator !== "undefined" ? navigator.userAgent : "",
|
||||||
editor: {
|
),
|
||||||
isMobile: false,
|
|
||||||
canFitSidebar: false,
|
|
||||||
},
|
|
||||||
isTouchScreen: false,
|
isTouchScreen: false,
|
||||||
|
canFitSidebar: false,
|
||||||
|
isLandscape: true,
|
||||||
};
|
};
|
||||||
const DeviceContext = React.createContext<Device>(deviceContextInitialValue);
|
const EditorInterfaceContext = React.createContext<EditorInterface>(
|
||||||
DeviceContext.displayName = "DeviceContext";
|
editorInterfaceContextInitialValue,
|
||||||
|
);
|
||||||
|
EditorInterfaceContext.displayName = "EditorInterfaceContext";
|
||||||
|
|
||||||
export const ExcalidrawContainerContext = React.createContext<{
|
export const ExcalidrawContainerContext = React.createContext<{
|
||||||
container: HTMLDivElement | null;
|
container: HTMLDivElement | null;
|
||||||
@@ -531,7 +530,10 @@ ExcalidrawActionManagerContext.displayName = "ExcalidrawActionManagerContext";
|
|||||||
|
|
||||||
export const useApp = () => useContext(AppContext);
|
export const useApp = () => useContext(AppContext);
|
||||||
export const useAppProps = () => useContext(AppPropsContext);
|
export const useAppProps = () => useContext(AppPropsContext);
|
||||||
export const useDevice = () => useContext<Device>(DeviceContext);
|
export const useEditorInterface = () =>
|
||||||
|
useContext<EditorInterface>(EditorInterfaceContext);
|
||||||
|
export const useStylesPanelMode = () =>
|
||||||
|
deriveStylesPanelMode(useEditorInterface());
|
||||||
export const useExcalidrawContainer = () =>
|
export const useExcalidrawContainer = () =>
|
||||||
useContext(ExcalidrawContainerContext);
|
useContext(ExcalidrawContainerContext);
|
||||||
export const useExcalidrawElements = () =>
|
export const useExcalidrawElements = () =>
|
||||||
@@ -579,7 +581,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
rc: RoughCanvas;
|
rc: RoughCanvas;
|
||||||
unmounted: boolean = false;
|
unmounted: boolean = false;
|
||||||
actionManager: ActionManager;
|
actionManager: ActionManager;
|
||||||
device: Device = deviceContextInitialValue;
|
editorInterface: EditorInterface = editorInterfaceContextInitialValue;
|
||||||
|
private stylesPanelMode: StylesPanelMode = deriveStylesPanelMode(
|
||||||
|
editorInterfaceContextInitialValue,
|
||||||
|
);
|
||||||
|
|
||||||
private excalidrawContainerRef = React.createRef<HTMLDivElement>();
|
private excalidrawContainerRef = React.createRef<HTMLDivElement>();
|
||||||
|
|
||||||
@@ -695,6 +700,9 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.refreshEditorInterface();
|
||||||
|
this.stylesPanelMode = deriveStylesPanelMode(this.editorInterface);
|
||||||
|
|
||||||
this.id = nanoid();
|
this.id = nanoid();
|
||||||
this.library = new Library(this);
|
this.library = new Library(this);
|
||||||
this.actionManager = new ActionManager(
|
this.actionManager = new ActionManager(
|
||||||
@@ -741,6 +749,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
setActiveTool: this.setActiveTool,
|
setActiveTool: this.setActiveTool,
|
||||||
setCursor: this.setCursor,
|
setCursor: this.setCursor,
|
||||||
resetCursor: this.resetCursor,
|
resetCursor: this.resetCursor,
|
||||||
|
getEditorInterface: () => this.editorInterface,
|
||||||
updateFrameRendering: this.updateFrameRendering,
|
updateFrameRendering: this.updateFrameRendering,
|
||||||
toggleSidebar: this.toggleSidebar,
|
toggleSidebar: this.toggleSidebar,
|
||||||
onChange: (cb) => this.onChangeEmitter.on(cb),
|
onChange: (cb) => this.onChangeEmitter.on(cb),
|
||||||
@@ -1467,6 +1476,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
id={this.getFrameNameDOMId(f)}
|
id={this.getFrameNameDOMId(f)}
|
||||||
|
className={CLASSES.FRAME_NAME}
|
||||||
key={f.id}
|
key={f.id}
|
||||||
style={{
|
style={{
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
@@ -1569,7 +1579,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
"excalidraw--view-mode":
|
"excalidraw--view-mode":
|
||||||
this.state.viewModeEnabled ||
|
this.state.viewModeEnabled ||
|
||||||
this.state.openDialog?.name === "elementLinkSelector",
|
this.state.openDialog?.name === "elementLinkSelector",
|
||||||
"excalidraw--mobile": this.device.editor.isMobile,
|
"excalidraw--mobile": this.editorInterface.formFactor === "phone",
|
||||||
})}
|
})}
|
||||||
style={{
|
style={{
|
||||||
["--ui-pointerEvents" as any]: shouldBlockPointerEvents
|
["--ui-pointerEvents" as any]: shouldBlockPointerEvents
|
||||||
@@ -1591,7 +1601,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
<ExcalidrawContainerContext.Provider
|
<ExcalidrawContainerContext.Provider
|
||||||
value={this.excalidrawContainerValue}
|
value={this.excalidrawContainerValue}
|
||||||
>
|
>
|
||||||
<DeviceContext.Provider value={this.device}>
|
<EditorInterfaceContext.Provider value={this.editorInterface}>
|
||||||
<ExcalidrawSetAppStateContext.Provider value={this.setAppState}>
|
<ExcalidrawSetAppStateContext.Provider value={this.setAppState}>
|
||||||
<ExcalidrawAppStateContext.Provider value={this.state}>
|
<ExcalidrawAppStateContext.Provider value={this.state}>
|
||||||
<ExcalidrawElementsContext.Provider
|
<ExcalidrawElementsContext.Provider
|
||||||
@@ -1804,6 +1814,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<InteractiveCanvas
|
<InteractiveCanvas
|
||||||
|
app={this}
|
||||||
containerRef={this.excalidrawContainerRef}
|
containerRef={this.excalidrawContainerRef}
|
||||||
canvas={this.interactiveCanvas}
|
canvas={this.interactiveCanvas}
|
||||||
elementsMap={elementsMap}
|
elementsMap={elementsMap}
|
||||||
@@ -1819,7 +1830,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
renderScrollbars={
|
renderScrollbars={
|
||||||
this.props.renderScrollbars === true
|
this.props.renderScrollbars === true
|
||||||
}
|
}
|
||||||
device={this.device}
|
editorInterface={this.editorInterface}
|
||||||
renderInteractiveSceneCallback={
|
renderInteractiveSceneCallback={
|
||||||
this.renderInteractiveSceneCallback
|
this.renderInteractiveSceneCallback
|
||||||
}
|
}
|
||||||
@@ -1855,7 +1866,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
</ExcalidrawElementsContext.Provider>
|
</ExcalidrawElementsContext.Provider>
|
||||||
</ExcalidrawAppStateContext.Provider>
|
</ExcalidrawAppStateContext.Provider>
|
||||||
</ExcalidrawSetAppStateContext.Provider>
|
</ExcalidrawSetAppStateContext.Provider>
|
||||||
</DeviceContext.Provider>
|
</EditorInterfaceContext.Provider>
|
||||||
</ExcalidrawContainerContext.Provider>
|
</ExcalidrawContainerContext.Provider>
|
||||||
</AppPropsContext.Provider>
|
</AppPropsContext.Provider>
|
||||||
</AppContext.Provider>
|
</AppContext.Provider>
|
||||||
@@ -2372,7 +2383,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
if (!scene.appState.preferredSelectionTool.initialized) {
|
if (!scene.appState.preferredSelectionTool.initialized) {
|
||||||
scene.appState.preferredSelectionTool = {
|
scene.appState.preferredSelectionTool = {
|
||||||
type: this.device.editor.isMobile ? "lasso" : "selection",
|
type:
|
||||||
|
this.editorInterface.formFactor === "phone" ? "lasso" : "selection",
|
||||||
initialized: true,
|
initialized: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -2432,44 +2444,14 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private isMobileBreakpoint = (width: number, height: number) => {
|
private getFormFactor = (editorWidth: number, editorHeight: number) => {
|
||||||
return (
|
return (
|
||||||
width <= MQ_MAX_MOBILE ||
|
this.props.UIOptions.formFactor ??
|
||||||
(height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE)
|
getFormFactor(editorWidth, editorHeight)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
private isTabletBreakpoint = (editorWidth: number, editorHeight: number) => {
|
public refreshEditorInterface = () => {
|
||||||
const minSide = Math.min(editorWidth, editorHeight);
|
|
||||||
const maxSide = Math.max(editorWidth, editorHeight);
|
|
||||||
|
|
||||||
return minSide >= MQ_MIN_TABLET && maxSide <= MQ_MAX_TABLET;
|
|
||||||
};
|
|
||||||
|
|
||||||
private refreshViewportBreakpoints = () => {
|
|
||||||
const container = this.excalidrawContainerRef.current;
|
|
||||||
if (!container) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { width: editorWidth, height: editorHeight } =
|
|
||||||
container.getBoundingClientRect();
|
|
||||||
|
|
||||||
const prevViewportState = this.device.viewport;
|
|
||||||
|
|
||||||
const nextViewportState = updateObject(prevViewportState, {
|
|
||||||
isLandscape: editorWidth > editorHeight,
|
|
||||||
isMobile: this.isMobileBreakpoint(editorWidth, editorHeight),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (prevViewportState !== nextViewportState) {
|
|
||||||
this.device = { ...this.device, viewport: nextViewportState };
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
private refreshEditorBreakpoints = () => {
|
|
||||||
const container = this.excalidrawContainerRef.current;
|
const container = this.excalidrawContainerRef.current;
|
||||||
if (!container) {
|
if (!container) {
|
||||||
return;
|
return;
|
||||||
@@ -2478,47 +2460,56 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
const { width: editorWidth, height: editorHeight } =
|
const { width: editorWidth, height: editorHeight } =
|
||||||
container.getBoundingClientRect();
|
container.getBoundingClientRect();
|
||||||
|
|
||||||
|
const storedDesktopUIMode = loadDesktopUIModePreference();
|
||||||
|
const userAgentDescriptor = createUserAgentDescriptor(
|
||||||
|
typeof navigator !== "undefined" ? navigator.userAgent : "",
|
||||||
|
);
|
||||||
|
// allow host app to control formFactor and desktopUIMode via props
|
||||||
const sidebarBreakpoint =
|
const sidebarBreakpoint =
|
||||||
this.props.UIOptions.dockedSidebarBreakpoint != null
|
this.props.UIOptions.dockedSidebarBreakpoint != null
|
||||||
? this.props.UIOptions.dockedSidebarBreakpoint
|
? this.props.UIOptions.dockedSidebarBreakpoint
|
||||||
: MQ_RIGHT_SIDEBAR_MIN_WIDTH;
|
: MQ_RIGHT_SIDEBAR_MIN_WIDTH;
|
||||||
|
const nextEditorInterface = updateObject(this.editorInterface, {
|
||||||
const prevEditorState = this.device.editor;
|
desktopUIMode:
|
||||||
|
this.props.UIOptions.desktopUIMode ??
|
||||||
const nextEditorState = updateObject(prevEditorState, {
|
storedDesktopUIMode ??
|
||||||
isMobile: this.isMobileBreakpoint(editorWidth, editorHeight),
|
this.editorInterface.desktopUIMode,
|
||||||
|
formFactor: this.getFormFactor(editorWidth, editorHeight),
|
||||||
|
userAgent: userAgentDescriptor,
|
||||||
canFitSidebar: editorWidth > sidebarBreakpoint,
|
canFitSidebar: editorWidth > sidebarBreakpoint,
|
||||||
|
isLandscape: editorWidth > editorHeight,
|
||||||
});
|
});
|
||||||
|
|
||||||
const stylesPanelMode =
|
this.editorInterface = nextEditorInterface;
|
||||||
// NOTE: we could also remove the isMobileOrTablet check here and
|
this.reconcileStylesPanelMode(nextEditorInterface);
|
||||||
// always switch to compact mode when the editor is narrow (e.g. < MQ_MIN_WIDTH_DESKTOP)
|
};
|
||||||
// but not too narrow (> MQ_MAX_WIDTH_MOBILE)
|
|
||||||
this.isTabletBreakpoint(editorWidth, editorHeight) && isMobileOrTablet()
|
|
||||||
? "compact"
|
|
||||||
: this.isMobileBreakpoint(editorWidth, editorHeight)
|
|
||||||
? "mobile"
|
|
||||||
: "full";
|
|
||||||
|
|
||||||
// also check if we need to update the app state
|
private reconcileStylesPanelMode = (nextEditorInterface: EditorInterface) => {
|
||||||
this.setState((prevState) => ({
|
const nextStylesPanelMode = deriveStylesPanelMode(nextEditorInterface);
|
||||||
stylesPanelMode,
|
if (nextStylesPanelMode === this.stylesPanelMode) {
|
||||||
// reset to box selection mode if the UI changes to full
|
return;
|
||||||
// where you'd not be able to change the mode yourself currently
|
|
||||||
preferredSelectionTool:
|
|
||||||
stylesPanelMode === "full"
|
|
||||||
? {
|
|
||||||
type: "selection",
|
|
||||||
initialized: true,
|
|
||||||
}
|
|
||||||
: prevState.preferredSelectionTool,
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (prevEditorState !== nextEditorState) {
|
|
||||||
this.device = { ...this.device, editor: nextEditorState };
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
const prevStylesPanelMode = this.stylesPanelMode;
|
||||||
|
this.stylesPanelMode = nextStylesPanelMode;
|
||||||
|
|
||||||
|
if (prevStylesPanelMode !== "full" && nextStylesPanelMode === "full") {
|
||||||
|
this.setState((prevState) => ({
|
||||||
|
preferredSelectionTool: {
|
||||||
|
type: "selection",
|
||||||
|
initialized: true,
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** TO BE USED LATER */
|
||||||
|
private setDesktopUIMode = (mode: EditorInterface["desktopUIMode"]) => {
|
||||||
|
const nextMode = setDesktopUIMode(mode);
|
||||||
|
this.editorInterface = updateObject(this.editorInterface, {
|
||||||
|
desktopUIMode: nextMode,
|
||||||
|
});
|
||||||
|
this.reconcileStylesPanelMode(this.editorInterface);
|
||||||
};
|
};
|
||||||
|
|
||||||
private clearImageShapeCache(filesMap?: BinaryFiles) {
|
private clearImageShapeCache(filesMap?: BinaryFiles) {
|
||||||
@@ -2590,19 +2581,9 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.focusContainer();
|
this.focusContainer();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
// bounding rects don't work in tests so updating
|
|
||||||
// the state on init would result in making the test enviro run
|
|
||||||
// in mobile breakpoint (0 width/height), making everything fail
|
|
||||||
!isTestEnv()
|
|
||||||
) {
|
|
||||||
this.refreshViewportBreakpoints();
|
|
||||||
this.refreshEditorBreakpoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (supportsResizeObserver && this.excalidrawContainerRef.current) {
|
if (supportsResizeObserver && this.excalidrawContainerRef.current) {
|
||||||
this.resizeObserver = new ResizeObserver(() => {
|
this.resizeObserver = new ResizeObserver(() => {
|
||||||
this.refreshEditorBreakpoints();
|
this.refreshEditorInterface();
|
||||||
this.updateDOMRect();
|
this.updateDOMRect();
|
||||||
});
|
});
|
||||||
this.resizeObserver?.observe(this.excalidrawContainerRef.current);
|
this.resizeObserver?.observe(this.excalidrawContainerRef.current);
|
||||||
@@ -2656,11 +2637,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.scene
|
this.scene
|
||||||
.getElementsIncludingDeleted()
|
.getElementsIncludingDeleted()
|
||||||
.forEach((element) => ShapeCache.delete(element));
|
.forEach((element) => ShapeCache.delete(element));
|
||||||
this.refreshViewportBreakpoints();
|
this.refreshEditorInterface();
|
||||||
this.updateDOMRect();
|
this.updateDOMRect();
|
||||||
if (!supportsResizeObserver) {
|
|
||||||
this.refreshEditorBreakpoints();
|
|
||||||
}
|
|
||||||
this.setState({});
|
this.setState({});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -2819,13 +2797,6 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.setState({ showWelcomeScreen: true });
|
this.setState({ showWelcomeScreen: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
prevProps.UIOptions.dockedSidebarBreakpoint !==
|
|
||||||
this.props.UIOptions.dockedSidebarBreakpoint
|
|
||||||
) {
|
|
||||||
this.refreshEditorBreakpoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
const hasFollowedPersonLeft =
|
const hasFollowedPersonLeft =
|
||||||
prevState.userToFollow &&
|
prevState.userToFollow &&
|
||||||
!this.state.collaborators.has(prevState.userToFollow.socketId);
|
!this.state.collaborators.has(prevState.userToFollow.socketId);
|
||||||
@@ -3180,7 +3151,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.addElementsFromPasteOrLibrary({
|
this.addElementsFromPasteOrLibrary({
|
||||||
elements,
|
elements,
|
||||||
files: data.files || null,
|
files: data.files || null,
|
||||||
position: isMobileOrTablet() ? "center" : "cursor",
|
position:
|
||||||
|
this.editorInterface.formFactor === "desktop" ? "cursor" : "center",
|
||||||
retainSeed: isPlainPaste,
|
retainSeed: isPlainPaste,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -3205,7 +3177,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.addElementsFromPasteOrLibrary({
|
this.addElementsFromPasteOrLibrary({
|
||||||
elements,
|
elements,
|
||||||
files,
|
files,
|
||||||
position: isMobileOrTablet() ? "center" : "cursor",
|
position:
|
||||||
|
this.editorInterface.formFactor === "desktop" ? "cursor" : "center",
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -3431,7 +3404,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// from library, not when pasting from clipboard. Alas.
|
// from library, not when pasting from clipboard. Alas.
|
||||||
openSidebar:
|
openSidebar:
|
||||||
this.state.openSidebar &&
|
this.state.openSidebar &&
|
||||||
this.device.editor.canFitSidebar &&
|
this.editorInterface.canFitSidebar &&
|
||||||
editorJotaiStore.get(isSidebarDockedAtom)
|
editorJotaiStore.get(isSidebarDockedAtom)
|
||||||
? this.state.openSidebar
|
? this.state.openSidebar
|
||||||
: null,
|
: null,
|
||||||
@@ -3629,7 +3602,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
!isPlainPaste &&
|
!isPlainPaste &&
|
||||||
textElements.length > 1 &&
|
textElements.length > 1 &&
|
||||||
PLAIN_PASTE_TOAST_SHOWN === false &&
|
PLAIN_PASTE_TOAST_SHOWN === false &&
|
||||||
!this.device.editor.isMobile
|
this.editorInterface.formFactor !== "phone"
|
||||||
) {
|
) {
|
||||||
this.setToast({
|
this.setToast({
|
||||||
message: t("toast.pasteAsSingleElement", {
|
message: t("toast.pasteAsSingleElement", {
|
||||||
@@ -3661,7 +3634,9 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
trackEvent(
|
trackEvent(
|
||||||
"toolbar",
|
"toolbar",
|
||||||
"toggleLock",
|
"toggleLock",
|
||||||
`${source} (${this.device.editor.isMobile ? "mobile" : "desktop"})`,
|
`${source} (${
|
||||||
|
this.editorInterface.formFactor === "phone" ? "mobile" : "desktop"
|
||||||
|
})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.setState((prevState) => {
|
this.setState((prevState) => {
|
||||||
@@ -4013,12 +3988,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (appState) {
|
if (appState) {
|
||||||
this.setState({
|
this.setState(appState as Pick<AppState, K> | null);
|
||||||
...appState,
|
|
||||||
// keep existing stylesPanelMode as it needs to be preserved
|
|
||||||
// or set at startup
|
|
||||||
stylesPanelMode: this.state.stylesPanelMode,
|
|
||||||
} as Pick<AppState, K> | null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elements) {
|
if (elements) {
|
||||||
@@ -4596,7 +4566,9 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
"toolbar",
|
"toolbar",
|
||||||
shape,
|
shape,
|
||||||
`keyboard (${
|
`keyboard (${
|
||||||
this.device.editor.isMobile ? "mobile" : "desktop"
|
this.editorInterface.formFactor === "phone"
|
||||||
|
? "mobile"
|
||||||
|
: "desktop"
|
||||||
})`,
|
})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -5102,7 +5074,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// caret (i.e. deselect). There's not much use for always selecting
|
// caret (i.e. deselect). There's not much use for always selecting
|
||||||
// the text on edit anyway (and users can select-all from contextmenu
|
// the text on edit anyway (and users can select-all from contextmenu
|
||||||
// if needed)
|
// if needed)
|
||||||
autoSelect: !this.device.isTouchScreen,
|
autoSelect: !this.editorInterface.isTouchScreen,
|
||||||
});
|
});
|
||||||
// deselect all other elements when inserting text
|
// deselect all other elements when inserting text
|
||||||
this.deselectElements();
|
this.deselectElements();
|
||||||
@@ -5265,7 +5237,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
if (
|
if (
|
||||||
considerBoundingBox &&
|
considerBoundingBox &&
|
||||||
this.state.selectedElementIds[element.id] &&
|
this.state.selectedElementIds[element.id] &&
|
||||||
hasBoundingBox([element], this.state)
|
hasBoundingBox([element], this.state, this.editorInterface)
|
||||||
) {
|
) {
|
||||||
// if hitting the bounding box, return early
|
// if hitting the bounding box, return early
|
||||||
// but if not, we should check for other cases as well (e.g. frame name)
|
// but if not, we should check for other cases as well (e.g. frame name)
|
||||||
@@ -5735,7 +5707,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.scene.getNonDeletedElementsMap(),
|
this.scene.getNonDeletedElementsMap(),
|
||||||
this.state,
|
this.state,
|
||||||
pointFrom(scenePointer.x, scenePointer.y),
|
pointFrom(scenePointer.x, scenePointer.y),
|
||||||
this.device.editor.isMobile,
|
this.editorInterface.formFactor === "phone",
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return element;
|
return element;
|
||||||
@@ -5770,7 +5742,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
elementsMap,
|
elementsMap,
|
||||||
this.state,
|
this.state,
|
||||||
pointFrom(lastPointerDownCoords.x, lastPointerDownCoords.y),
|
pointFrom(lastPointerDownCoords.x, lastPointerDownCoords.y),
|
||||||
this.device.editor.isMobile,
|
this.editorInterface.formFactor === "phone",
|
||||||
);
|
);
|
||||||
const lastPointerUpCoords = viewportCoordsToSceneCoords(
|
const lastPointerUpCoords = viewportCoordsToSceneCoords(
|
||||||
this.lastPointerUpEvent!,
|
this.lastPointerUpEvent!,
|
||||||
@@ -5781,7 +5753,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
elementsMap,
|
elementsMap,
|
||||||
this.state,
|
this.state,
|
||||||
pointFrom(lastPointerUpCoords.x, lastPointerUpCoords.y),
|
pointFrom(lastPointerUpCoords.x, lastPointerUpCoords.y),
|
||||||
this.device.editor.isMobile,
|
this.editorInterface.formFactor === "phone",
|
||||||
);
|
);
|
||||||
if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {
|
if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {
|
||||||
hideHyperlinkToolip();
|
hideHyperlinkToolip();
|
||||||
@@ -6173,7 +6145,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// better way of showing them is found
|
// better way of showing them is found
|
||||||
!(
|
!(
|
||||||
isLinearElement(selectedElements[0]) &&
|
isLinearElement(selectedElements[0]) &&
|
||||||
(isMobileOrTablet() || selectedElements[0].points.length === 2)
|
(this.editorInterface.userAgent.isMobileDevice ||
|
||||||
|
selectedElements[0].points.length === 2)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
const elementWithTransformHandleType =
|
const elementWithTransformHandleType =
|
||||||
@@ -6185,7 +6158,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.state.zoom,
|
this.state.zoom,
|
||||||
event.pointerType,
|
event.pointerType,
|
||||||
this.scene.getNonDeletedElementsMap(),
|
this.scene.getNonDeletedElementsMap(),
|
||||||
this.device,
|
this.editorInterface,
|
||||||
);
|
);
|
||||||
if (
|
if (
|
||||||
elementWithTransformHandleType &&
|
elementWithTransformHandleType &&
|
||||||
@@ -6209,7 +6182,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
scenePointerY,
|
scenePointerY,
|
||||||
this.state.zoom,
|
this.state.zoom,
|
||||||
event.pointerType,
|
event.pointerType,
|
||||||
this.device,
|
this.editorInterface,
|
||||||
);
|
);
|
||||||
if (transformHandleType) {
|
if (transformHandleType) {
|
||||||
setCursor(
|
setCursor(
|
||||||
@@ -6595,10 +6568,12 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!this.device.isTouchScreen &&
|
!this.editorInterface.isTouchScreen &&
|
||||||
["pen", "touch"].includes(event.pointerType)
|
["pen", "touch"].includes(event.pointerType)
|
||||||
) {
|
) {
|
||||||
this.device = updateObject(this.device, { isTouchScreen: true });
|
this.editorInterface = updateObject(this.editorInterface, {
|
||||||
|
isTouchScreen: true,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPanning) {
|
if (isPanning) {
|
||||||
@@ -6732,12 +6707,13 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
|
|
||||||
// block dragging after lasso selection on PCs until the next pointer down
|
// block dragging after lasso selection on PCs until the next pointer down
|
||||||
// (on mobile or tablet, we want to allow user to drag immediately)
|
// (on mobile or tablet, we want to allow user to drag immediately)
|
||||||
pointerDownState.drag.blockDragging = !isMobileOrTablet();
|
pointerDownState.drag.blockDragging =
|
||||||
|
this.editorInterface.formFactor === "desktop";
|
||||||
}
|
}
|
||||||
|
|
||||||
// only for mobile or tablet, if we hit an element, select it immediately like normal selection
|
// only for mobile or tablet, if we hit an element, select it immediately like normal selection
|
||||||
if (
|
if (
|
||||||
isMobileOrTablet() &&
|
this.editorInterface.formFactor !== "desktop" &&
|
||||||
pointerDownState.hit.element &&
|
pointerDownState.hit.element &&
|
||||||
!hitSelectedElement
|
!hitSelectedElement
|
||||||
) {
|
) {
|
||||||
@@ -6921,7 +6897,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
const clicklength =
|
const clicklength =
|
||||||
event.timeStamp - (this.lastPointerDownEvent?.timeStamp ?? 0);
|
event.timeStamp - (this.lastPointerDownEvent?.timeStamp ?? 0);
|
||||||
|
|
||||||
if (this.device.editor.isMobile && clicklength < 300) {
|
if (this.editorInterface.formFactor === "phone" && clicklength < 300) {
|
||||||
const hitElement = this.getElementAtPosition(
|
const hitElement = this.getElementAtPosition(
|
||||||
scenePointer.x,
|
scenePointer.x,
|
||||||
scenePointer.y,
|
scenePointer.y,
|
||||||
@@ -6940,7 +6916,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.device.isTouchScreen) {
|
if (this.editorInterface.isTouchScreen) {
|
||||||
const hitElement = this.getElementAtPosition(
|
const hitElement = this.getElementAtPosition(
|
||||||
scenePointer.x,
|
scenePointer.x,
|
||||||
scenePointer.y,
|
scenePointer.y,
|
||||||
@@ -6970,7 +6946,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
) {
|
) {
|
||||||
this.handleEmbeddableCenterClick(this.hitLinkElement);
|
this.handleEmbeddableCenterClick(this.hitLinkElement);
|
||||||
} else {
|
} else {
|
||||||
this.redirectToLink(event, this.device.isTouchScreen);
|
this.redirectToLink(event, this.editorInterface.isTouchScreen);
|
||||||
}
|
}
|
||||||
} else if (this.state.viewModeEnabled) {
|
} else if (this.state.viewModeEnabled) {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -7295,7 +7271,8 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
!isElbowArrow(selectedElements[0]) &&
|
!isElbowArrow(selectedElements[0]) &&
|
||||||
!(
|
!(
|
||||||
isLinearElement(selectedElements[0]) &&
|
isLinearElement(selectedElements[0]) &&
|
||||||
(isMobileOrTablet() || selectedElements[0].points.length === 2)
|
(this.editorInterface.userAgent.isMobileDevice ||
|
||||||
|
selectedElements[0].points.length === 2)
|
||||||
) &&
|
) &&
|
||||||
!(
|
!(
|
||||||
this.state.selectedLinearElement &&
|
this.state.selectedLinearElement &&
|
||||||
@@ -7311,7 +7288,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
this.state.zoom,
|
this.state.zoom,
|
||||||
event.pointerType,
|
event.pointerType,
|
||||||
this.scene.getNonDeletedElementsMap(),
|
this.scene.getNonDeletedElementsMap(),
|
||||||
this.device,
|
this.editorInterface,
|
||||||
);
|
);
|
||||||
if (elementWithTransformHandleType != null) {
|
if (elementWithTransformHandleType != null) {
|
||||||
if (
|
if (
|
||||||
@@ -7340,7 +7317,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
pointerDownState.origin.y,
|
pointerDownState.origin.y,
|
||||||
this.state.zoom,
|
this.state.zoom,
|
||||||
event.pointerType,
|
event.pointerType,
|
||||||
this.device,
|
this.editorInterface,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (pointerDownState.resize.handleType) {
|
if (pointerDownState.resize.handleType) {
|
||||||
@@ -7751,12 +7728,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
y: gridY,
|
y: gridY,
|
||||||
});
|
});
|
||||||
|
|
||||||
const simulatePressure =
|
const simulatePressure = event.pressure === 0.5;
|
||||||
event.pressure === 0.5 || event.pressure === 0 || event.pressure === 1;
|
|
||||||
|
|
||||||
window.__lastPressure__ = event.pressure;
|
|
||||||
|
|
||||||
const freedrawConfig = getFreedrawConfig(event.pointerType);
|
|
||||||
|
|
||||||
const element = newFreeDrawElement({
|
const element = newFreeDrawElement({
|
||||||
type: elementType,
|
type: elementType,
|
||||||
@@ -7771,17 +7743,6 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
opacity: this.state.currentItemOpacity,
|
opacity: this.state.currentItemOpacity,
|
||||||
roundness: null,
|
roundness: null,
|
||||||
simulatePressure,
|
simulatePressure,
|
||||||
strokeOptions: {
|
|
||||||
fixedStrokeWidth: this.state.currentItemFixedStrokeWidth,
|
|
||||||
streamline:
|
|
||||||
(window.h?.debugFreedraw?.enabled
|
|
||||||
? window.h?.debugFreedraw?.streamline
|
|
||||||
: null) ?? freedrawConfig.streamline,
|
|
||||||
simplify:
|
|
||||||
(window.h?.debugFreedraw?.enabled
|
|
||||||
? window.h?.debugFreedraw?.simplify
|
|
||||||
: null) ?? freedrawConfig.simplify,
|
|
||||||
},
|
|
||||||
locked: false,
|
locked: false,
|
||||||
frameId: topLayerFrame ? topLayerFrame.id : null,
|
frameId: topLayerFrame ? topLayerFrame.id : null,
|
||||||
points: [pointFrom<LocalPoint>(0, 0)],
|
points: [pointFrom<LocalPoint>(0, 0)],
|
||||||
@@ -8558,7 +8519,10 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
if (
|
if (
|
||||||
this.state.activeTool.type === "lasso" &&
|
this.state.activeTool.type === "lasso" &&
|
||||||
this.lassoTrail.hasCurrentTrail &&
|
this.lassoTrail.hasCurrentTrail &&
|
||||||
!(isMobileOrTablet() && pointerDownState.hit.element) &&
|
!(
|
||||||
|
this.editorInterface.formFactor !== "desktop" &&
|
||||||
|
pointerDownState.hit.element
|
||||||
|
) &&
|
||||||
!this.state.activeTool.fromSelection
|
!this.state.activeTool.fromSelection
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
@@ -8884,6 +8848,15 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
this.scene.replaceAllElements(elementsWithIndices);
|
this.scene.replaceAllElements(elementsWithIndices);
|
||||||
|
selectedElements.forEach((element) => {
|
||||||
|
if (
|
||||||
|
isBindableElement(element) &&
|
||||||
|
element.boundElements?.some((other) => other.type === "arrow")
|
||||||
|
) {
|
||||||
|
updateBoundElements(element, this.scene);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.maybeCacheVisibleGaps(event, selectedElements, true);
|
this.maybeCacheVisibleGaps(event, selectedElements, true);
|
||||||
this.maybeCacheReferenceSnapPoints(event, selectedElements, true);
|
this.maybeCacheReferenceSnapPoints(event, selectedElements, true);
|
||||||
});
|
});
|
||||||
@@ -9406,7 +9379,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
newElement &&
|
newElement &&
|
||||||
!multiElement
|
!multiElement
|
||||||
) {
|
) {
|
||||||
if (this.device.isTouchScreen) {
|
if (this.editorInterface.isTouchScreen) {
|
||||||
const FIXED_DELTA_X = Math.min(
|
const FIXED_DELTA_X = Math.min(
|
||||||
(this.state.width * 0.7) / this.state.zoom.value,
|
(this.state.width * 0.7) / this.state.zoom.value,
|
||||||
100,
|
100,
|
||||||
@@ -11224,7 +11197,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const zIndexActions: ContextMenuItems =
|
const zIndexActions: ContextMenuItems =
|
||||||
this.state.stylesPanelMode === "full"
|
this.editorInterface.formFactor === "desktop"
|
||||||
? [
|
? [
|
||||||
CONTEXT_MENU_SEPARATOR,
|
CONTEXT_MENU_SEPARATOR,
|
||||||
actionSendBackward,
|
actionSendBackward,
|
||||||
@@ -11280,12 +11253,13 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
(
|
(
|
||||||
event: WheelEvent | React.WheelEvent<HTMLDivElement | HTMLCanvasElement>,
|
event: WheelEvent | React.WheelEvent<HTMLDivElement | HTMLCanvasElement>,
|
||||||
) => {
|
) => {
|
||||||
// if not scrolling on canvas/wysiwyg, ignore
|
|
||||||
if (
|
if (
|
||||||
!(
|
!(
|
||||||
event.target instanceof HTMLCanvasElement ||
|
event.target instanceof HTMLCanvasElement ||
|
||||||
event.target instanceof HTMLTextAreaElement ||
|
event.target instanceof HTMLTextAreaElement ||
|
||||||
event.target instanceof HTMLIFrameElement
|
event.target instanceof HTMLIFrameElement ||
|
||||||
|
(event.target instanceof HTMLElement &&
|
||||||
|
event.target.classList.contains(CLASSES.FRAME_NAME))
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
// prevent zooming the browser (but allow scrolling DOM)
|
// prevent zooming the browser (but allow scrolling DOM)
|
||||||
@@ -11494,7 +11468,6 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
__lastPressure__?: number;
|
|
||||||
h: {
|
h: {
|
||||||
scene: Scene;
|
scene: Scene;
|
||||||
elements: readonly ExcalidrawElement[];
|
elements: readonly ExcalidrawElement[];
|
||||||
@@ -11503,11 +11476,6 @@ declare global {
|
|||||||
app: InstanceType<typeof App>;
|
app: InstanceType<typeof App>;
|
||||||
history: History;
|
history: History;
|
||||||
store: Store;
|
store: Store;
|
||||||
debugFreedraw?: {
|
|
||||||
streamline: number;
|
|
||||||
simplify: number;
|
|
||||||
enabled: boolean;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11516,12 +11484,6 @@ export const createTestHook = () => {
|
|||||||
if (isTestEnv() || isDevEnv()) {
|
if (isTestEnv() || isDevEnv()) {
|
||||||
window.h = window.h || ({} as Window["h"]);
|
window.h = window.h || ({} as Window["h"]);
|
||||||
|
|
||||||
// Initialize debug freedraw parameters
|
|
||||||
window.h.debugFreedraw = {
|
|
||||||
enabled: true,
|
|
||||||
...(window.h.debugFreedraw || STROKE_OPTIONS.default),
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.defineProperties(window.h, {
|
Object.defineProperties(window.h, {
|
||||||
elements: {
|
elements: {
|
||||||
configurable: true,
|
configurable: true,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { KEYS } from "@excalidraw/common";
|
|||||||
import { getShortcutKey } from "../..//shortcut";
|
import { getShortcutKey } from "../..//shortcut";
|
||||||
import { useAtom } from "../../editor-jotai";
|
import { useAtom } from "../../editor-jotai";
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
import { activeEyeDropperAtom } from "../EyeDropper";
|
import { activeEyeDropperAtom } from "../EyeDropper";
|
||||||
import { eyeDropperIcon } from "../icons";
|
import { eyeDropperIcon } from "../icons";
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ export const ColorInput = ({
|
|||||||
colorPickerType,
|
colorPickerType,
|
||||||
placeholder,
|
placeholder,
|
||||||
}: ColorInputProps) => {
|
}: ColorInputProps) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const [innerValue, setInnerValue] = useState(color);
|
const [innerValue, setInnerValue] = useState(color);
|
||||||
const [activeSection, setActiveColorPickerSection] = useAtom(
|
const [activeSection, setActiveColorPickerSection] = useAtom(
|
||||||
activeColorPickerSectionAtom,
|
activeColorPickerSectionAtom,
|
||||||
@@ -99,7 +99,7 @@ export const ColorInput = ({
|
|||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
/>
|
/>
|
||||||
{/* TODO reenable on mobile with a better UX */}
|
{/* TODO reenable on mobile with a better UX */}
|
||||||
{!device.editor.isMobile && (
|
{editorInterface.formFactor !== "phone" && (
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import type { ExcalidrawElement } from "@excalidraw/element/types";
|
|||||||
|
|
||||||
import { useAtom } from "../../editor-jotai";
|
import { useAtom } from "../../editor-jotai";
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { useExcalidrawContainer } from "../App";
|
import { useExcalidrawContainer, useStylesPanelMode } from "../App";
|
||||||
import { ButtonSeparator } from "../ButtonSeparator";
|
import { ButtonSeparator } from "../ButtonSeparator";
|
||||||
import { activeEyeDropperAtom } from "../EyeDropper";
|
import { activeEyeDropperAtom } from "../EyeDropper";
|
||||||
import { PropertiesPopover } from "../PropertiesPopover";
|
import { PropertiesPopover } from "../PropertiesPopover";
|
||||||
@@ -73,7 +73,6 @@ interface ColorPickerProps {
|
|||||||
palette?: ColorPaletteCustom | null;
|
palette?: ColorPaletteCustom | null;
|
||||||
topPicks?: ColorTuple;
|
topPicks?: ColorTuple;
|
||||||
updateData: (formData?: any) => void;
|
updateData: (formData?: any) => void;
|
||||||
compactMode?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ColorPickerPopupContent = ({
|
const ColorPickerPopupContent = ({
|
||||||
@@ -100,6 +99,9 @@ const ColorPickerPopupContent = ({
|
|||||||
getOpenPopup: () => AppState["openPopup"];
|
getOpenPopup: () => AppState["openPopup"];
|
||||||
}) => {
|
}) => {
|
||||||
const { container } = useExcalidrawContainer();
|
const { container } = useExcalidrawContainer();
|
||||||
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
|
const isCompactMode = stylesPanelMode !== "full";
|
||||||
|
const isMobileMode = stylesPanelMode === "mobile";
|
||||||
const [, setActiveColorPickerSection] = useAtom(activeColorPickerSectionAtom);
|
const [, setActiveColorPickerSection] = useAtom(activeColorPickerSectionAtom);
|
||||||
|
|
||||||
const [eyeDropperState, setEyeDropperState] = useAtom(activeEyeDropperAtom);
|
const [eyeDropperState, setEyeDropperState] = useAtom(activeEyeDropperAtom);
|
||||||
@@ -216,11 +218,8 @@ const ColorPickerPopupContent = ({
|
|||||||
type={type}
|
type={type}
|
||||||
elements={elements}
|
elements={elements}
|
||||||
updateData={updateData}
|
updateData={updateData}
|
||||||
showTitle={
|
showTitle={isCompactMode}
|
||||||
appState.stylesPanelMode === "compact" ||
|
showHotKey={!isMobileMode}
|
||||||
appState.stylesPanelMode === "mobile"
|
|
||||||
}
|
|
||||||
showHotKey={appState.stylesPanelMode !== "mobile"}
|
|
||||||
>
|
>
|
||||||
{colorInputJSX}
|
{colorInputJSX}
|
||||||
</Picker>
|
</Picker>
|
||||||
@@ -235,7 +234,6 @@ const ColorPickerTrigger = ({
|
|||||||
label,
|
label,
|
||||||
color,
|
color,
|
||||||
type,
|
type,
|
||||||
stylesPanelMode,
|
|
||||||
mode = "background",
|
mode = "background",
|
||||||
onToggle,
|
onToggle,
|
||||||
editingTextElement,
|
editingTextElement,
|
||||||
@@ -243,11 +241,13 @@ const ColorPickerTrigger = ({
|
|||||||
color: string | null;
|
color: string | null;
|
||||||
label: string;
|
label: string;
|
||||||
type: ColorPickerType;
|
type: ColorPickerType;
|
||||||
stylesPanelMode?: AppState["stylesPanelMode"];
|
|
||||||
mode?: "background" | "stroke";
|
mode?: "background" | "stroke";
|
||||||
onToggle: () => void;
|
onToggle: () => void;
|
||||||
editingTextElement?: boolean;
|
editingTextElement?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
|
const isCompactMode = stylesPanelMode !== "full";
|
||||||
|
const isMobileMode = stylesPanelMode === "mobile";
|
||||||
const handleClick = (e: React.MouseEvent) => {
|
const handleClick = (e: React.MouseEvent) => {
|
||||||
// use pointerdown so we run before outside-close logic
|
// use pointerdown so we run before outside-close logic
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -268,9 +268,8 @@ const ColorPickerTrigger = ({
|
|||||||
"is-transparent": !color || color === "transparent",
|
"is-transparent": !color || color === "transparent",
|
||||||
"has-outline":
|
"has-outline":
|
||||||
!color || !isColorDark(color, COLOR_OUTLINE_CONTRAST_THRESHOLD),
|
!color || !isColorDark(color, COLOR_OUTLINE_CONTRAST_THRESHOLD),
|
||||||
"compact-sizing":
|
"compact-sizing": isCompactMode,
|
||||||
stylesPanelMode === "compact" || stylesPanelMode === "mobile",
|
"mobile-border": isMobileMode,
|
||||||
"mobile-border": stylesPanelMode === "mobile",
|
|
||||||
})}
|
})}
|
||||||
aria-label={label}
|
aria-label={label}
|
||||||
style={color ? { "--swatch-color": color } : undefined}
|
style={color ? { "--swatch-color": color } : undefined}
|
||||||
@@ -283,22 +282,20 @@ const ColorPickerTrigger = ({
|
|||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
>
|
>
|
||||||
<div className="color-picker__button-outline">{!color && slashIcon}</div>
|
<div className="color-picker__button-outline">{!color && slashIcon}</div>
|
||||||
{(stylesPanelMode === "compact" || stylesPanelMode === "mobile") &&
|
{isCompactMode && color && mode === "stroke" && (
|
||||||
color &&
|
<div className="color-picker__button-background">
|
||||||
mode === "stroke" && (
|
<span
|
||||||
<div className="color-picker__button-background">
|
style={{
|
||||||
<span
|
color:
|
||||||
style={{
|
color && isColorDark(color, COLOR_OUTLINE_CONTRAST_THRESHOLD)
|
||||||
color:
|
? "#fff"
|
||||||
color && isColorDark(color, COLOR_OUTLINE_CONTRAST_THRESHOLD)
|
: "#111",
|
||||||
? "#fff"
|
}}
|
||||||
: "#111",
|
>
|
||||||
}}
|
{strokeIcon}
|
||||||
>
|
</span>
|
||||||
{strokeIcon}
|
</div>
|
||||||
</span>
|
)}
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</Popover.Trigger>
|
</Popover.Trigger>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -318,10 +315,8 @@ export const ColorPicker = ({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
openRef.current = appState.openPopup;
|
openRef.current = appState.openPopup;
|
||||||
}, [appState.openPopup]);
|
}, [appState.openPopup]);
|
||||||
const compactMode =
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
type !== "canvasBackground" &&
|
const isCompactMode = stylesPanelMode !== "full";
|
||||||
(appState.stylesPanelMode === "compact" ||
|
|
||||||
appState.stylesPanelMode === "mobile");
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@@ -329,10 +324,10 @@ export const ColorPicker = ({
|
|||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
className={clsx("color-picker-container", {
|
className={clsx("color-picker-container", {
|
||||||
"color-picker-container--no-top-picks": compactMode,
|
"color-picker-container--no-top-picks": isCompactMode,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
{!compactMode && (
|
{!isCompactMode && (
|
||||||
<TopPicks
|
<TopPicks
|
||||||
activeColor={color}
|
activeColor={color}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
@@ -340,7 +335,7 @@ export const ColorPicker = ({
|
|||||||
topPicks={topPicks}
|
topPicks={topPicks}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{!compactMode && <ButtonSeparator />}
|
{!isCompactMode && <ButtonSeparator />}
|
||||||
<Popover.Root
|
<Popover.Root
|
||||||
open={appState.openPopup === type}
|
open={appState.openPopup === type}
|
||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
@@ -354,7 +349,6 @@ export const ColorPicker = ({
|
|||||||
color={color}
|
color={color}
|
||||||
label={label}
|
label={label}
|
||||||
type={type}
|
type={type}
|
||||||
stylesPanelMode={appState.stylesPanelMode}
|
|
||||||
mode={type === "elementStroke" ? "stroke" : "background"}
|
mode={type === "elementStroke" ? "stroke" : "background"}
|
||||||
editingTextElement={!!appState.editingTextElement}
|
editingTextElement={!!appState.editingTextElement}
|
||||||
onToggle={() => {
|
onToggle={() => {
|
||||||
|
|||||||
@@ -903,7 +903,7 @@ function CommandPaletteInner({
|
|||||||
ref={inputRef}
|
ref={inputRef}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{!app.device.viewport.isMobile && (
|
{app.editorInterface.formFactor !== "phone" && (
|
||||||
<div className="shortcuts-wrapper">
|
<div className="shortcuts-wrapper">
|
||||||
<CommandShortcutHint shortcut="↑↓">
|
<CommandShortcutHint shortcut="↑↓">
|
||||||
{t("commandPalette.shortcuts.select")}
|
{t("commandPalette.shortcuts.select")}
|
||||||
@@ -937,7 +937,7 @@ function CommandPaletteInner({
|
|||||||
onClick={(event) => executeCommand(lastUsed, event)}
|
onClick={(event) => executeCommand(lastUsed, event)}
|
||||||
disabled={!isCommandAvailable(lastUsed)}
|
disabled={!isCommandAvailable(lastUsed)}
|
||||||
onMouseMove={() => setCurrentCommand(lastUsed)}
|
onMouseMove={() => setCurrentCommand(lastUsed)}
|
||||||
showShortcut={!app.device.viewport.isMobile}
|
showShortcut={app.editorInterface.formFactor !== "phone"}
|
||||||
appState={uiAppState}
|
appState={uiAppState}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -955,7 +955,7 @@ function CommandPaletteInner({
|
|||||||
isSelected={command.label === currentCommand?.label}
|
isSelected={command.label === currentCommand?.label}
|
||||||
onClick={(event) => executeCommand(command, event)}
|
onClick={(event) => executeCommand(command, event)}
|
||||||
onMouseMove={() => setCurrentCommand(command)}
|
onMouseMove={() => setCurrentCommand(command)}
|
||||||
showShortcut={!app.device.viewport.isMobile}
|
showShortcut={app.editorInterface.formFactor !== "phone"}
|
||||||
appState={uiAppState}
|
appState={uiAppState}
|
||||||
size={category === "Library" ? "large" : "small"}
|
size={category === "Library" ? "large" : "small"}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { t } from "../i18n";
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
useExcalidrawContainer,
|
useExcalidrawContainer,
|
||||||
useDevice,
|
useEditorInterface,
|
||||||
useExcalidrawSetAppState,
|
useExcalidrawSetAppState,
|
||||||
} from "./App";
|
} from "./App";
|
||||||
import { Island } from "./Island";
|
import { Island } from "./Island";
|
||||||
@@ -51,7 +51,7 @@ export const Dialog = (props: DialogProps) => {
|
|||||||
const [islandNode, setIslandNode] = useCallbackRefState<HTMLDivElement>();
|
const [islandNode, setIslandNode] = useCallbackRefState<HTMLDivElement>();
|
||||||
const [lastActiveElement] = useState(document.activeElement);
|
const [lastActiveElement] = useState(document.activeElement);
|
||||||
const { id } = useExcalidrawContainer();
|
const { id } = useExcalidrawContainer();
|
||||||
const isFullscreen = useDevice().viewport.isMobile;
|
const isFullscreen = useEditorInterface().formFactor === "phone";
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!islandNode) {
|
if (!islandNode) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export type ButtonColor =
|
|||||||
export type ButtonSize = "medium" | "large";
|
export type ButtonSize = "medium" | "large";
|
||||||
|
|
||||||
export type FilledButtonProps = {
|
export type FilledButtonProps = {
|
||||||
label: string;
|
label?: string;
|
||||||
|
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
onClick?: (event: React.MouseEvent) => void;
|
onClick?: (event: React.MouseEvent) => void;
|
||||||
|
|||||||
@@ -20,7 +20,12 @@ import type { ValueOf } from "@excalidraw/common/utility-types";
|
|||||||
|
|
||||||
import { Fonts } from "../../fonts";
|
import { Fonts } from "../../fonts";
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { useApp, useAppProps, useExcalidrawContainer } from "../App";
|
import {
|
||||||
|
useApp,
|
||||||
|
useAppProps,
|
||||||
|
useExcalidrawContainer,
|
||||||
|
useStylesPanelMode,
|
||||||
|
} from "../App";
|
||||||
import { PropertiesPopover } from "../PropertiesPopover";
|
import { PropertiesPopover } from "../PropertiesPopover";
|
||||||
import { QuickSearch } from "../QuickSearch";
|
import { QuickSearch } from "../QuickSearch";
|
||||||
import { ScrollableList } from "../ScrollableList";
|
import { ScrollableList } from "../ScrollableList";
|
||||||
@@ -93,6 +98,7 @@ export const FontPickerList = React.memo(
|
|||||||
const app = useApp();
|
const app = useApp();
|
||||||
const { fonts } = app;
|
const { fonts } = app;
|
||||||
const { showDeprecatedFonts } = useAppProps();
|
const { showDeprecatedFonts } = useAppProps();
|
||||||
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
|
|
||||||
const [searchTerm, setSearchTerm] = useState("");
|
const [searchTerm, setSearchTerm] = useState("");
|
||||||
const inputRef = useRef<HTMLInputElement>(null);
|
const inputRef = useRef<HTMLInputElement>(null);
|
||||||
@@ -338,7 +344,7 @@ export const FontPickerList = React.memo(
|
|||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
preventAutoFocusOnTouch={!!app.state.editingTextElement}
|
preventAutoFocusOnTouch={!!app.state.editingTextElement}
|
||||||
>
|
>
|
||||||
{app.state.stylesPanelMode === "full" && (
|
{stylesPanelMode === "full" && (
|
||||||
<QuickSearch
|
<QuickSearch
|
||||||
ref={inputRef}
|
ref={inputRef}
|
||||||
placeholder={t("quickSearch.placeholder")}
|
placeholder={t("quickSearch.placeholder")}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import {
|
|||||||
|
|
||||||
import { isNodeInFlowchart } from "@excalidraw/element";
|
import { isNodeInFlowchart } from "@excalidraw/element";
|
||||||
|
|
||||||
|
import type { EditorInterface } from "@excalidraw/common";
|
||||||
|
|
||||||
import { t } from "../i18n";
|
import { t } from "../i18n";
|
||||||
import { getShortcutKey } from "../shortcut";
|
import { getShortcutKey } from "../shortcut";
|
||||||
import { isEraserActive } from "../appState";
|
import { isEraserActive } from "../appState";
|
||||||
@@ -18,12 +20,12 @@ import { isGridModeEnabled } from "../snapping";
|
|||||||
|
|
||||||
import "./HintViewer.scss";
|
import "./HintViewer.scss";
|
||||||
|
|
||||||
import type { AppClassProperties, Device, UIAppState } from "../types";
|
import type { AppClassProperties, UIAppState } from "../types";
|
||||||
|
|
||||||
interface HintViewerProps {
|
interface HintViewerProps {
|
||||||
appState: UIAppState;
|
appState: UIAppState;
|
||||||
isMobile: boolean;
|
isMobile: boolean;
|
||||||
device: Device;
|
editorInterface: EditorInterface;
|
||||||
app: AppClassProperties;
|
app: AppClassProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +37,7 @@ const getTaggedShortcutKey = (key: string | string[]) =>
|
|||||||
const getHints = ({
|
const getHints = ({
|
||||||
appState,
|
appState,
|
||||||
isMobile,
|
isMobile,
|
||||||
device,
|
editorInterface,
|
||||||
app,
|
app,
|
||||||
}: HintViewerProps): null | string | string[] => {
|
}: HintViewerProps): null | string | string[] => {
|
||||||
const { activeTool, isResizing, isRotating, lastPointerDownWith } = appState;
|
const { activeTool, isResizing, isRotating, lastPointerDownWith } = appState;
|
||||||
@@ -51,7 +53,7 @@ const getHints = ({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (appState.openSidebar && !device.editor.canFitSidebar) {
|
if (appState.openSidebar && !editorInterface.canFitSidebar) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,13 +227,13 @@ const getHints = ({
|
|||||||
export const HintViewer = ({
|
export const HintViewer = ({
|
||||||
appState,
|
appState,
|
||||||
isMobile,
|
isMobile,
|
||||||
device,
|
editorInterface,
|
||||||
app,
|
app,
|
||||||
}: HintViewerProps) => {
|
}: HintViewerProps) => {
|
||||||
const hints = getHints({
|
const hints = getHints({
|
||||||
appState,
|
appState,
|
||||||
isMobile,
|
isMobile,
|
||||||
device,
|
editorInterface,
|
||||||
app,
|
app,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { atom, useAtom } from "../editor-jotai";
|
|||||||
import { getLanguage, t } from "../i18n";
|
import { getLanguage, t } from "../i18n";
|
||||||
|
|
||||||
import Collapsible from "./Stats/Collapsible";
|
import Collapsible from "./Stats/Collapsible";
|
||||||
import { useDevice, useExcalidrawContainer } from "./App";
|
import { useEditorInterface, useExcalidrawContainer } from "./App";
|
||||||
|
|
||||||
import "./IconPicker.scss";
|
import "./IconPicker.scss";
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ function Picker<T>({
|
|||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
numberOfOptionsToAlwaysShow?: number;
|
numberOfOptionsToAlwaysShow?: number;
|
||||||
}) {
|
}) {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const { container } = useExcalidrawContainer();
|
const { container } = useExcalidrawContainer();
|
||||||
|
|
||||||
const handleKeyDown = (event: React.KeyboardEvent) => {
|
const handleKeyDown = (event: React.KeyboardEvent) => {
|
||||||
@@ -153,7 +153,7 @@ function Picker<T>({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isMobile = device.editor.isMobile;
|
const isMobile = editorInterface.formFactor === "phone";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover.Content
|
<Popover.Content
|
||||||
|
|||||||
@@ -120,4 +120,53 @@
|
|||||||
margin-bottom: auto;
|
margin-bottom: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.disable-view-mode {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid var(--color-primary);
|
||||||
|
padding: 0.5rem;
|
||||||
|
border-radius: var(--border-radius-lg);
|
||||||
|
background-color: var(--island-bg-color);
|
||||||
|
text-decoration: none !important;
|
||||||
|
|
||||||
|
font-family: var(--ui-font);
|
||||||
|
font-size: 0.8333rem;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
width: var(--mobile-action-button-size, var(--default-button-size));
|
||||||
|
height: var(--mobile-action-button-size, var(--default-button-size));
|
||||||
|
|
||||||
|
border: none;
|
||||||
|
box-shadow: 0 0 0 1px var(--color-surface-lowest);
|
||||||
|
background-color: var(--color-surface-low);
|
||||||
|
color: var(--button-color, var(--color-on-surface)) !important;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
box-shadow: 0 0 0 1px var(--color-brand-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-primary);
|
||||||
|
color: white !important;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
background-color: var(--color-primary-darker);
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme--dark {
|
||||||
|
.plus-banner {
|
||||||
|
&:hover {
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import React from "react";
|
|||||||
import {
|
import {
|
||||||
CLASSES,
|
CLASSES,
|
||||||
DEFAULT_SIDEBAR,
|
DEFAULT_SIDEBAR,
|
||||||
MQ_MIN_WIDTH_DESKTOP,
|
|
||||||
TOOL_TYPE,
|
TOOL_TYPE,
|
||||||
arrayToMap,
|
arrayToMap,
|
||||||
capitalizeString,
|
capitalizeString,
|
||||||
@@ -46,9 +45,9 @@ import Footer from "./footer/Footer";
|
|||||||
import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
|
import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
|
||||||
import MainMenu from "./main-menu/MainMenu";
|
import MainMenu from "./main-menu/MainMenu";
|
||||||
import { ActiveConfirmDialog } from "./ActiveConfirmDialog";
|
import { ActiveConfirmDialog } from "./ActiveConfirmDialog";
|
||||||
import { useDevice } from "./App";
|
import { useEditorInterface, useStylesPanelMode } from "./App";
|
||||||
import { OverwriteConfirmDialog } from "./OverwriteConfirm/OverwriteConfirm";
|
import { OverwriteConfirmDialog } from "./OverwriteConfirm/OverwriteConfirm";
|
||||||
import { LibraryIcon } from "./icons";
|
import { sidebarRightIcon } from "./icons";
|
||||||
import { DefaultSidebar } from "./DefaultSidebar";
|
import { DefaultSidebar } from "./DefaultSidebar";
|
||||||
import { TTDDialog } from "./TTDDialog/TTDDialog";
|
import { TTDDialog } from "./TTDDialog/TTDDialog";
|
||||||
import { Stats } from "./Stats";
|
import { Stats } from "./Stats";
|
||||||
@@ -161,27 +160,28 @@ const LayerUI = ({
|
|||||||
isCollaborating,
|
isCollaborating,
|
||||||
generateLinkForSelection,
|
generateLinkForSelection,
|
||||||
}: LayerUIProps) => {
|
}: LayerUIProps) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
|
const stylesPanelMode = useStylesPanelMode();
|
||||||
|
const isCompactStylesPanel = stylesPanelMode === "compact";
|
||||||
const tunnels = useInitializeTunnels();
|
const tunnels = useInitializeTunnels();
|
||||||
|
|
||||||
const spacing =
|
const spacing = isCompactStylesPanel
|
||||||
appState.stylesPanelMode === "compact"
|
? {
|
||||||
? {
|
menuTopGap: 4,
|
||||||
menuTopGap: 4,
|
toolbarColGap: 4,
|
||||||
toolbarColGap: 4,
|
toolbarRowGap: 1,
|
||||||
toolbarRowGap: 1,
|
toolbarInnerRowGap: 0.5,
|
||||||
toolbarInnerRowGap: 0.5,
|
islandPadding: 1,
|
||||||
islandPadding: 1,
|
collabMarginLeft: 8,
|
||||||
collabMarginLeft: 8,
|
}
|
||||||
}
|
: {
|
||||||
: {
|
menuTopGap: 6,
|
||||||
menuTopGap: 6,
|
toolbarColGap: 4,
|
||||||
toolbarColGap: 4,
|
toolbarRowGap: 1,
|
||||||
toolbarRowGap: 1,
|
toolbarInnerRowGap: 1,
|
||||||
toolbarInnerRowGap: 1,
|
islandPadding: 1,
|
||||||
islandPadding: 1,
|
collabMarginLeft: 8,
|
||||||
collabMarginLeft: 8,
|
};
|
||||||
};
|
|
||||||
|
|
||||||
const TunnelsJotaiProvider = tunnels.tunnelsJotai.Provider;
|
const TunnelsJotaiProvider = tunnels.tunnelsJotai.Provider;
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ const LayerUI = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const renderSelectedShapeActions = () => {
|
const renderSelectedShapeActions = () => {
|
||||||
const isCompactMode = appState.stylesPanelMode === "compact";
|
const isCompactMode = isCompactStylesPanel;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Section
|
<Section
|
||||||
@@ -308,7 +308,7 @@ const LayerUI = ({
|
|||||||
<div
|
<div
|
||||||
className={clsx("selected-shape-actions-container", {
|
className={clsx("selected-shape-actions-container", {
|
||||||
"selected-shape-actions-container--compact":
|
"selected-shape-actions-container--compact":
|
||||||
appState.stylesPanelMode === "compact",
|
isCompactStylesPanel,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
{shouldRenderSelectedShapeActions && renderSelectedShapeActions()}
|
{shouldRenderSelectedShapeActions && renderSelectedShapeActions()}
|
||||||
@@ -333,14 +333,13 @@ const LayerUI = ({
|
|||||||
padding={spacing.islandPadding}
|
padding={spacing.islandPadding}
|
||||||
className={clsx("App-toolbar", {
|
className={clsx("App-toolbar", {
|
||||||
"zen-mode": appState.zenModeEnabled,
|
"zen-mode": appState.zenModeEnabled,
|
||||||
"App-toolbar--compact":
|
"App-toolbar--compact": isCompactStylesPanel,
|
||||||
appState.stylesPanelMode === "compact",
|
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<HintViewer
|
<HintViewer
|
||||||
appState={appState}
|
appState={appState}
|
||||||
isMobile={device.editor.isMobile}
|
isMobile={editorInterface.formFactor === "phone"}
|
||||||
device={device}
|
editorInterface={editorInterface}
|
||||||
app={app}
|
app={app}
|
||||||
/>
|
/>
|
||||||
{heading}
|
{heading}
|
||||||
@@ -406,8 +405,7 @@ const LayerUI = ({
|
|||||||
"layer-ui__wrapper__top-right zen-mode-transition",
|
"layer-ui__wrapper__top-right zen-mode-transition",
|
||||||
{
|
{
|
||||||
"transition-right": appState.zenModeEnabled,
|
"transition-right": appState.zenModeEnabled,
|
||||||
"layer-ui__wrapper__top-right--compact":
|
"layer-ui__wrapper__top-right--compact": isCompactStylesPanel,
|
||||||
appState.stylesPanelMode === "compact",
|
|
||||||
},
|
},
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
@@ -417,7 +415,10 @@ const LayerUI = ({
|
|||||||
userToFollow={appState.userToFollow?.socketId || null}
|
userToFollow={appState.userToFollow?.socketId || null}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{renderTopRightUI?.(device.editor.isMobile, appState)}
|
{renderTopRightUI?.(
|
||||||
|
editorInterface.formFactor === "phone",
|
||||||
|
appState,
|
||||||
|
)}
|
||||||
{!appState.viewModeEnabled &&
|
{!appState.viewModeEnabled &&
|
||||||
appState.openDialog?.name !== "elementLinkSelector" &&
|
appState.openDialog?.name !== "elementLinkSelector" &&
|
||||||
// hide button when sidebar docked
|
// hide button when sidebar docked
|
||||||
@@ -448,7 +449,9 @@ const LayerUI = ({
|
|||||||
trackEvent(
|
trackEvent(
|
||||||
"sidebar",
|
"sidebar",
|
||||||
`toggleDock (${docked ? "dock" : "undock"})`,
|
`toggleDock (${docked ? "dock" : "undock"})`,
|
||||||
`(${device.editor.isMobile ? "mobile" : "desktop"})`,
|
`(${
|
||||||
|
editorInterface.formFactor === "phone" ? "mobile" : "desktop"
|
||||||
|
})`,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -469,23 +472,21 @@ const LayerUI = ({
|
|||||||
<DefaultMainMenu UIOptions={UIOptions} />
|
<DefaultMainMenu UIOptions={UIOptions} />
|
||||||
<DefaultSidebar.Trigger
|
<DefaultSidebar.Trigger
|
||||||
__fallback
|
__fallback
|
||||||
icon={LibraryIcon}
|
icon={sidebarRightIcon}
|
||||||
title={capitalizeString(t("toolBar.library"))}
|
title={capitalizeString(t("toolBar.library"))}
|
||||||
onToggle={(open) => {
|
onToggle={(open) => {
|
||||||
if (open) {
|
if (open) {
|
||||||
trackEvent(
|
trackEvent(
|
||||||
"sidebar",
|
"sidebar",
|
||||||
`${DEFAULT_SIDEBAR.name} (open)`,
|
`${DEFAULT_SIDEBAR.name} (open)`,
|
||||||
`button (${device.editor.isMobile ? "mobile" : "desktop"})`,
|
`button (${
|
||||||
|
editorInterface.formFactor === "phone" ? "mobile" : "desktop"
|
||||||
|
})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
tab={DEFAULT_SIDEBAR.defaultTab}
|
tab={DEFAULT_SIDEBAR.defaultTab}
|
||||||
>
|
/>
|
||||||
{appState.stylesPanelMode === "full" &&
|
|
||||||
appState.width >= MQ_MIN_WIDTH_DESKTOP &&
|
|
||||||
t("toolBar.library")}
|
|
||||||
</DefaultSidebar.Trigger>
|
|
||||||
<DefaultOverwriteConfirmDialog />
|
<DefaultOverwriteConfirmDialog />
|
||||||
{appState.openDialog?.name === "ttd" && <TTDDialog __fallback />}
|
{appState.openDialog?.name === "ttd" && <TTDDialog __fallback />}
|
||||||
{/* ------------------------------------------------------------------ */}
|
{/* ------------------------------------------------------------------ */}
|
||||||
@@ -496,7 +497,7 @@ const LayerUI = ({
|
|||||||
{appState.errorMessage}
|
{appState.errorMessage}
|
||||||
</ErrorDialog>
|
</ErrorDialog>
|
||||||
)}
|
)}
|
||||||
{eyeDropperState && !device.editor.isMobile && (
|
{eyeDropperState && editorInterface.formFactor !== "phone" && (
|
||||||
<EyeDropper
|
<EyeDropper
|
||||||
colorPickerType={eyeDropperState.colorPickerType}
|
colorPickerType={eyeDropperState.colorPickerType}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
@@ -575,7 +576,7 @@ const LayerUI = ({
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{device.editor.isMobile && (
|
{editorInterface.formFactor === "phone" && (
|
||||||
<MobileMenu
|
<MobileMenu
|
||||||
app={app}
|
app={app}
|
||||||
appState={appState}
|
appState={appState}
|
||||||
@@ -593,14 +594,14 @@ const LayerUI = ({
|
|||||||
UIOptions={UIOptions}
|
UIOptions={UIOptions}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{!device.editor.isMobile && (
|
{editorInterface.formFactor !== "phone" && (
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
className="layer-ui__wrapper"
|
className="layer-ui__wrapper"
|
||||||
style={
|
style={
|
||||||
appState.openSidebar &&
|
appState.openSidebar &&
|
||||||
isSidebarDocked &&
|
isSidebarDocked &&
|
||||||
device.editor.canFitSidebar
|
editorInterface.canFitSidebar
|
||||||
? { width: `calc(100% - var(--right-sidebar-width))` }
|
? { width: `calc(100% - var(--right-sidebar-width))` }
|
||||||
: {}
|
: {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import "./LibraryMenuItems.scss";
|
|||||||
|
|
||||||
import { TextField } from "./TextField";
|
import { TextField } from "./TextField";
|
||||||
|
|
||||||
import { useDevice } from "./App";
|
import { useEditorInterface } from "./App";
|
||||||
|
|
||||||
import { Button } from "./Button";
|
import { Button } from "./Button";
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ export default function LibraryMenuItems({
|
|||||||
selectedItems: LibraryItem["id"][];
|
selectedItems: LibraryItem["id"][];
|
||||||
onSelectItems: (id: LibraryItem["id"][]) => void;
|
onSelectItems: (id: LibraryItem["id"][]) => void;
|
||||||
}) {
|
}) {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const libraryContainerRef = useRef<HTMLDivElement>(null);
|
const libraryContainerRef = useRef<HTMLDivElement>(null);
|
||||||
const scrollPosition = useScrollPosition<HTMLDivElement>(libraryContainerRef);
|
const scrollPosition = useScrollPosition<HTMLDivElement>(libraryContainerRef);
|
||||||
|
|
||||||
@@ -392,7 +392,7 @@ export default function LibraryMenuItems({
|
|||||||
ref={searchInputRef}
|
ref={searchInputRef}
|
||||||
type="search"
|
type="search"
|
||||||
className={clsx("library-menu-items-container__search", {
|
className={clsx("library-menu-items-container__search", {
|
||||||
hideCancelButton: !device.editor.isMobile,
|
hideCancelButton: editorInterface.formFactor !== "phone",
|
||||||
})}
|
})}
|
||||||
placeholder={t("library.search.inputPlaceholder")}
|
placeholder={t("library.search.inputPlaceholder")}
|
||||||
value={searchInputValue}
|
value={searchInputValue}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { memo, useRef, useState } from "react";
|
|||||||
|
|
||||||
import { useLibraryItemSvg } from "../hooks/useLibraryItemSvg";
|
import { useLibraryItemSvg } from "../hooks/useLibraryItemSvg";
|
||||||
|
|
||||||
import { useDevice } from "./App";
|
import { useEditorInterface } from "./App";
|
||||||
import { CheckboxItem } from "./CheckboxItem";
|
import { CheckboxItem } from "./CheckboxItem";
|
||||||
import { PlusIcon } from "./icons";
|
import { PlusIcon } from "./icons";
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ export const LibraryUnit = memo(
|
|||||||
const svg = useLibraryItemSvg(id, elements, svgCache, ref);
|
const svg = useLibraryItemSvg(id, elements, svgCache, ref);
|
||||||
|
|
||||||
const [isHovered, setIsHovered] = useState(false);
|
const [isHovered, setIsHovered] = useState(false);
|
||||||
const isMobile = useDevice().editor.isMobile;
|
const isMobile = useEditorInterface().formFactor === "phone";
|
||||||
const adder = isPending && (
|
const adder = isPending && (
|
||||||
<div className="library-unit__adder">{PlusIcon}</div>
|
<div className="library-unit__adder">{PlusIcon}</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { FilledButton } from "./FilledButton";
|
||||||
|
|
||||||
|
export const LinkButton = ({
|
||||||
|
children,
|
||||||
|
href,
|
||||||
|
}: {
|
||||||
|
href: string;
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<a href={href} target="_blank" rel="noopener" className="link-button">
|
||||||
|
<FilledButton>{children}</FilledButton>
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -7,12 +7,14 @@ import { t } from "../i18n";
|
|||||||
import { calculateScrollCenter } from "../scene";
|
import { calculateScrollCenter } from "../scene";
|
||||||
import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars";
|
import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars";
|
||||||
|
|
||||||
import { MobileShapeActions } from "./Actions";
|
import { ExitViewModeButton, MobileShapeActions } from "./Actions";
|
||||||
import { MobileToolBar } from "./MobileToolBar";
|
import { MobileToolBar } from "./MobileToolBar";
|
||||||
import { FixedSideContainer } from "./FixedSideContainer";
|
import { FixedSideContainer } from "./FixedSideContainer";
|
||||||
|
|
||||||
import { Island } from "./Island";
|
import { Island } from "./Island";
|
||||||
|
|
||||||
|
import { PenModeButton } from "./PenModeButton";
|
||||||
|
|
||||||
import type { ActionManager } from "../actions/manager";
|
import type { ActionManager } from "../actions/manager";
|
||||||
import type {
|
import type {
|
||||||
AppClassProperties,
|
AppClassProperties,
|
||||||
@@ -58,6 +60,7 @@ export const MobileMenu = ({
|
|||||||
renderWelcomeScreen,
|
renderWelcomeScreen,
|
||||||
UIOptions,
|
UIOptions,
|
||||||
app,
|
app,
|
||||||
|
onPenModeToggle,
|
||||||
}: MobileMenuProps) => {
|
}: MobileMenuProps) => {
|
||||||
const {
|
const {
|
||||||
WelcomeScreenCenterTunnel,
|
WelcomeScreenCenterTunnel,
|
||||||
@@ -65,8 +68,29 @@ export const MobileMenu = ({
|
|||||||
DefaultSidebarTriggerTunnel,
|
DefaultSidebarTriggerTunnel,
|
||||||
} = useTunnels();
|
} = useTunnels();
|
||||||
const renderAppTopBar = () => {
|
const renderAppTopBar = () => {
|
||||||
const topRightUI = renderTopRightUI?.(true, appState) ?? (
|
if (appState.openDialog?.name === "elementLinkSelector") {
|
||||||
<DefaultSidebarTriggerTunnel.Out />
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const topRightUI = (
|
||||||
|
<div className="excalidraw-ui-top-right">
|
||||||
|
{renderTopRightUI?.(true, appState) ??
|
||||||
|
(!appState.viewModeEnabled && (
|
||||||
|
<>
|
||||||
|
<PenModeButton
|
||||||
|
checked={appState.penMode}
|
||||||
|
onChange={() => onPenModeToggle(null)}
|
||||||
|
title={t("toolBar.penMode")}
|
||||||
|
isMobile
|
||||||
|
penDetected={appState.penDetected}
|
||||||
|
/>
|
||||||
|
<DefaultSidebarTriggerTunnel.Out />
|
||||||
|
</>
|
||||||
|
))}
|
||||||
|
{appState.viewModeEnabled && (
|
||||||
|
<ExitViewModeButton actionManager={actionManager} />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
const topLeftUI = (
|
const topLeftUI = (
|
||||||
@@ -76,13 +100,6 @@ export const MobileMenu = ({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
|
||||||
appState.viewModeEnabled ||
|
|
||||||
appState.openDialog?.name === "elementLinkSelector"
|
|
||||||
) {
|
|
||||||
return <div className="App-toolbar-content">{topLeftUI}</div>;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="App-toolbar-content"
|
className="App-toolbar-content"
|
||||||
@@ -117,41 +134,43 @@ export const MobileMenu = ({
|
|||||||
{renderWelcomeScreen && <WelcomeScreenCenterTunnel.Out />}
|
{renderWelcomeScreen && <WelcomeScreenCenterTunnel.Out />}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
{!appState.viewModeEnabled && (
|
||||||
className="App-bottom-bar"
|
<div
|
||||||
style={{
|
className="App-bottom-bar"
|
||||||
marginBottom: SCROLLBAR_WIDTH + SCROLLBAR_MARGIN,
|
style={{
|
||||||
}}
|
marginBottom: SCROLLBAR_WIDTH + SCROLLBAR_MARGIN,
|
||||||
>
|
}}
|
||||||
<MobileShapeActions
|
>
|
||||||
appState={appState}
|
<MobileShapeActions
|
||||||
elementsMap={app.scene.getNonDeletedElementsMap()}
|
appState={appState}
|
||||||
renderAction={actionManager.renderAction}
|
elementsMap={app.scene.getNonDeletedElementsMap()}
|
||||||
app={app}
|
renderAction={actionManager.renderAction}
|
||||||
setAppState={setAppState}
|
app={app}
|
||||||
/>
|
setAppState={setAppState}
|
||||||
|
/>
|
||||||
|
|
||||||
<Island className="App-toolbar">
|
<Island className="App-toolbar">
|
||||||
{!appState.viewModeEnabled &&
|
{!appState.viewModeEnabled &&
|
||||||
appState.openDialog?.name !== "elementLinkSelector" &&
|
appState.openDialog?.name !== "elementLinkSelector" &&
|
||||||
renderToolbar()}
|
renderToolbar()}
|
||||||
{appState.scrolledOutside &&
|
{appState.scrolledOutside &&
|
||||||
!appState.openMenu &&
|
!appState.openMenu &&
|
||||||
!appState.openSidebar && (
|
!appState.openSidebar && (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="scroll-back-to-content"
|
className="scroll-back-to-content"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setAppState((appState) => ({
|
setAppState((appState) => ({
|
||||||
...calculateScrollCenter(elements, appState),
|
...calculateScrollCenter(elements, appState),
|
||||||
}));
|
}));
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{t("buttons.scrollBackToContent")}
|
{t("buttons.scrollBackToContent")}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</Island>
|
</Island>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
<FixedSideContainer side="top" className="App-top-bar">
|
<FixedSideContainer side="top" className="App-top-bar">
|
||||||
{renderAppTopBar()}
|
{renderAppTopBar()}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useState, useEffect, useRef } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
import { KEYS, capitalizeString } from "@excalidraw/common";
|
import { KEYS, capitalizeString } from "@excalidraw/common";
|
||||||
@@ -101,8 +101,6 @@ export const MobileToolBar = ({
|
|||||||
"arrow" | "line"
|
"arrow" | "line"
|
||||||
>("arrow");
|
>("arrow");
|
||||||
|
|
||||||
const toolbarRef = useRef<HTMLDivElement>(null);
|
|
||||||
|
|
||||||
// keep lastActiveGenericShape in sync with active tool if user switches via other UI
|
// keep lastActiveGenericShape in sync with active tool if user switches via other UI
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (
|
if (
|
||||||
@@ -143,8 +141,8 @@ export const MobileToolBar = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const toolbarWidth =
|
const [toolbarWidth, setToolbarWidth] = useState(0);
|
||||||
toolbarRef.current?.getBoundingClientRect()?.width ?? 0 - 8;
|
|
||||||
const WIDTH = 36;
|
const WIDTH = 36;
|
||||||
const GAP = 4;
|
const GAP = 4;
|
||||||
|
|
||||||
@@ -164,6 +162,9 @@ export const MobileToolBar = ({
|
|||||||
"laser",
|
"laser",
|
||||||
"magicframe",
|
"magicframe",
|
||||||
].filter((tool) => {
|
].filter((tool) => {
|
||||||
|
if (showTextToolOutside && tool === "text") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (showImageToolOutside && tool === "image") {
|
if (showImageToolOutside && tool === "image") {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -174,21 +175,30 @@ export const MobileToolBar = ({
|
|||||||
});
|
});
|
||||||
const extraToolSelected = extraTools.includes(activeTool.type);
|
const extraToolSelected = extraTools.includes(activeTool.type);
|
||||||
const extraIcon = extraToolSelected
|
const extraIcon = extraToolSelected
|
||||||
? activeTool.type === "frame"
|
? activeTool.type === "text"
|
||||||
|
? TextIcon
|
||||||
|
: activeTool.type === "image"
|
||||||
|
? ImageIcon
|
||||||
|
: activeTool.type === "frame"
|
||||||
? frameToolIcon
|
? frameToolIcon
|
||||||
: activeTool.type === "embeddable"
|
: activeTool.type === "embeddable"
|
||||||
? EmbedIcon
|
? EmbedIcon
|
||||||
: activeTool.type === "laser"
|
: activeTool.type === "laser"
|
||||||
? laserPointerToolIcon
|
? laserPointerToolIcon
|
||||||
: activeTool.type === "text"
|
|
||||||
? TextIcon
|
|
||||||
: activeTool.type === "magicframe"
|
: activeTool.type === "magicframe"
|
||||||
? MagicIcon
|
? MagicIcon
|
||||||
: extraToolsIcon
|
: extraToolsIcon
|
||||||
: extraToolsIcon;
|
: extraToolsIcon;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mobile-toolbar" ref={toolbarRef}>
|
<div
|
||||||
|
className="mobile-toolbar"
|
||||||
|
ref={(div) => {
|
||||||
|
if (div) {
|
||||||
|
setToolbarWidth(div.getBoundingClientRect().width);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
{/* Hand Tool */}
|
{/* Hand Tool */}
|
||||||
<HandButton
|
<HandButton
|
||||||
checked={isHandToolActive(app.state)}
|
checked={isHandToolActive(app.state)}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import React, { type ReactNode } from "react";
|
|||||||
|
|
||||||
import { isInteractive } from "@excalidraw/common";
|
import { isInteractive } from "@excalidraw/common";
|
||||||
|
|
||||||
import { useDevice } from "./App";
|
import { useEditorInterface } from "./App";
|
||||||
import { Island } from "./Island";
|
import { Island } from "./Island";
|
||||||
|
|
||||||
interface PropertiesPopoverProps {
|
interface PropertiesPopoverProps {
|
||||||
@@ -39,9 +39,9 @@ export const PropertiesPopover = React.forwardRef<
|
|||||||
},
|
},
|
||||||
ref,
|
ref,
|
||||||
) => {
|
) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const isMobilePortrait =
|
const isMobilePortrait =
|
||||||
device.editor.isMobile && !device.viewport.isLandscape;
|
editorInterface.formFactor === "phone" && !editorInterface.isLandscape;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover.Portal container={container}>
|
<Popover.Portal container={container}>
|
||||||
@@ -56,7 +56,8 @@ export const PropertiesPopover = React.forwardRef<
|
|||||||
collisionBoundary={container ?? undefined}
|
collisionBoundary={container ?? undefined}
|
||||||
style={{
|
style={{
|
||||||
zIndex: "var(--zIndex-ui-styles-popup)",
|
zIndex: "var(--zIndex-ui-styles-popup)",
|
||||||
marginLeft: device.editor.isMobile ? "0.5rem" : undefined,
|
marginLeft:
|
||||||
|
editorInterface.formFactor === "phone" ? "0.5rem" : undefined,
|
||||||
}}
|
}}
|
||||||
onPointerLeave={onPointerLeave}
|
onPointerLeave={onPointerLeave}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
@@ -64,7 +65,7 @@ export const PropertiesPopover = React.forwardRef<
|
|||||||
onPointerDownOutside={onPointerDownOutside}
|
onPointerDownOutside={onPointerDownOutside}
|
||||||
onOpenAutoFocus={(e) => {
|
onOpenAutoFocus={(e) => {
|
||||||
// prevent auto-focus on touch devices to avoid keyboard popup
|
// prevent auto-focus on touch devices to avoid keyboard popup
|
||||||
if (preventAutoFocusOnTouch && device.isTouchScreen) {
|
if (preventAutoFocusOnTouch && editorInterface.isTouchScreen) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
import { useUIAppState } from "../../context/ui-appState";
|
import { useUIAppState } from "../../context/ui-appState";
|
||||||
import { atom, useSetAtom } from "../../editor-jotai";
|
import { atom, useSetAtom } from "../../editor-jotai";
|
||||||
import { useOutsideClick } from "../../hooks/useOutsideClick";
|
import { useOutsideClick } from "../../hooks/useOutsideClick";
|
||||||
import { useDevice, useExcalidrawSetAppState } from "../App";
|
import { useEditorInterface, useExcalidrawSetAppState } from "../App";
|
||||||
import { Island } from "../Island";
|
import { Island } from "../Island";
|
||||||
|
|
||||||
import { SidebarHeader } from "./SidebarHeader";
|
import { SidebarHeader } from "./SidebarHeader";
|
||||||
@@ -96,7 +96,7 @@ export const SidebarInner = forwardRef(
|
|||||||
return islandRef.current!;
|
return islandRef.current!;
|
||||||
});
|
});
|
||||||
|
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
|
|
||||||
const closeLibrary = useCallback(() => {
|
const closeLibrary = useCallback(() => {
|
||||||
const isDialogOpen = !!document.querySelector(".Dialog");
|
const isDialogOpen = !!document.querySelector(".Dialog");
|
||||||
@@ -117,11 +117,11 @@ export const SidebarInner = forwardRef(
|
|||||||
if ((event.target as Element).closest(".sidebar-trigger")) {
|
if ((event.target as Element).closest(".sidebar-trigger")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!docked || !device.editor.canFitSidebar) {
|
if (!docked || !editorInterface.canFitSidebar) {
|
||||||
closeLibrary();
|
closeLibrary();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[closeLibrary, docked, device.editor.canFitSidebar],
|
[closeLibrary, docked, editorInterface.canFitSidebar],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ export const SidebarInner = forwardRef(
|
|||||||
const handleKeyDown = (event: KeyboardEvent) => {
|
const handleKeyDown = (event: KeyboardEvent) => {
|
||||||
if (
|
if (
|
||||||
event.key === KEYS.ESCAPE &&
|
event.key === KEYS.ESCAPE &&
|
||||||
(!docked || !device.editor.canFitSidebar)
|
(!docked || !editorInterface.canFitSidebar)
|
||||||
) {
|
) {
|
||||||
closeLibrary();
|
closeLibrary();
|
||||||
}
|
}
|
||||||
@@ -138,7 +138,7 @@ export const SidebarInner = forwardRef(
|
|||||||
return () => {
|
return () => {
|
||||||
document.removeEventListener(EVENT.KEYDOWN, handleKeyDown);
|
document.removeEventListener(EVENT.KEYDOWN, handleKeyDown);
|
||||||
};
|
};
|
||||||
}, [closeLibrary, docked, device.editor.canFitSidebar]);
|
}, [closeLibrary, docked, editorInterface.canFitSidebar]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Island
|
<Island
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import clsx from "clsx";
|
|||||||
import { useContext } from "react";
|
import { useContext } from "react";
|
||||||
|
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
import { Button } from "../Button";
|
import { Button } from "../Button";
|
||||||
import { Tooltip } from "../Tooltip";
|
import { Tooltip } from "../Tooltip";
|
||||||
import { CloseIcon, PinIcon } from "../icons";
|
import { CloseIcon, PinIcon } from "../icons";
|
||||||
@@ -16,11 +16,11 @@ export const SidebarHeader = ({
|
|||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
className?: string;
|
className?: string;
|
||||||
}) => {
|
}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const props = useContext(SidebarPropsContext);
|
const props = useContext(SidebarPropsContext);
|
||||||
|
|
||||||
const renderDockButton = !!(
|
const renderDockButton = !!(
|
||||||
device.editor.canFitSidebar && props.shouldRenderDockButton
|
editorInterface.canFitSidebar && props.shouldRenderDockButton
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -4,7 +4,17 @@ import {
|
|||||||
CURSOR_TYPE,
|
CURSOR_TYPE,
|
||||||
isShallowEqual,
|
isShallowEqual,
|
||||||
sceneCoordsToViewportCoords,
|
sceneCoordsToViewportCoords,
|
||||||
|
type EditorInterface,
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
import { AnimationController } from "@excalidraw/excalidraw/renderer/animation";
|
||||||
|
|
||||||
|
import type {
|
||||||
|
InteractiveCanvasRenderConfig,
|
||||||
|
InteractiveSceneRenderAnimationState,
|
||||||
|
InteractiveSceneRenderConfig,
|
||||||
|
RenderableElementsMap,
|
||||||
|
RenderInteractiveSceneCallback,
|
||||||
|
} from "@excalidraw/excalidraw/scene/types";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
NonDeletedExcalidrawElement,
|
NonDeletedExcalidrawElement,
|
||||||
@@ -12,15 +22,13 @@ import type {
|
|||||||
} from "@excalidraw/element/types";
|
} from "@excalidraw/element/types";
|
||||||
|
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { isRenderThrottlingEnabled } from "../../reactUtils";
|
|
||||||
import { renderInteractiveScene } from "../../renderer/interactiveScene";
|
import { renderInteractiveScene } from "../../renderer/interactiveScene";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
InteractiveCanvasRenderConfig,
|
AppClassProperties,
|
||||||
RenderableElementsMap,
|
AppState,
|
||||||
RenderInteractiveSceneCallback,
|
InteractiveCanvasAppState,
|
||||||
} from "../../scene/types";
|
} from "../../types";
|
||||||
import type { AppState, Device, InteractiveCanvasAppState } from "../../types";
|
|
||||||
import type { DOMAttributes } from "react";
|
import type { DOMAttributes } from "react";
|
||||||
|
|
||||||
type InteractiveCanvasProps = {
|
type InteractiveCanvasProps = {
|
||||||
@@ -35,7 +43,8 @@ type InteractiveCanvasProps = {
|
|||||||
scale: number;
|
scale: number;
|
||||||
appState: InteractiveCanvasAppState;
|
appState: InteractiveCanvasAppState;
|
||||||
renderScrollbars: boolean;
|
renderScrollbars: boolean;
|
||||||
device: Device;
|
editorInterface: EditorInterface;
|
||||||
|
app: AppClassProperties;
|
||||||
renderInteractiveSceneCallback: (
|
renderInteractiveSceneCallback: (
|
||||||
data: RenderInteractiveSceneCallback,
|
data: RenderInteractiveSceneCallback,
|
||||||
) => void;
|
) => void;
|
||||||
@@ -70,8 +79,11 @@ type InteractiveCanvasProps = {
|
|||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const INTERACTIVE_SCENE_ANIMATION_KEY = "animateInteractiveScene";
|
||||||
|
|
||||||
const InteractiveCanvas = (props: InteractiveCanvasProps) => {
|
const InteractiveCanvas = (props: InteractiveCanvasProps) => {
|
||||||
const isComponentMounted = useRef(false);
|
const isComponentMounted = useRef(false);
|
||||||
|
const rendererParams = useRef(null as InteractiveSceneRenderConfig | null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isComponentMounted.current) {
|
if (!isComponentMounted.current) {
|
||||||
@@ -128,29 +140,58 @@ const InteractiveCanvas = (props: InteractiveCanvasProps) => {
|
|||||||
)) ||
|
)) ||
|
||||||
"#6965db";
|
"#6965db";
|
||||||
|
|
||||||
renderInteractiveScene(
|
rendererParams.current = {
|
||||||
{
|
app: props.app,
|
||||||
canvas: props.canvas,
|
canvas: props.canvas,
|
||||||
elementsMap: props.elementsMap,
|
elementsMap: props.elementsMap,
|
||||||
visibleElements: props.visibleElements,
|
visibleElements: props.visibleElements,
|
||||||
selectedElements: props.selectedElements,
|
selectedElements: props.selectedElements,
|
||||||
allElementsMap: props.allElementsMap,
|
allElementsMap: props.allElementsMap,
|
||||||
scale: window.devicePixelRatio,
|
scale: window.devicePixelRatio,
|
||||||
appState: props.appState,
|
appState: props.appState,
|
||||||
renderConfig: {
|
renderConfig: {
|
||||||
remotePointerViewportCoords,
|
remotePointerViewportCoords,
|
||||||
remotePointerButton,
|
remotePointerButton,
|
||||||
remoteSelectedElementIds,
|
remoteSelectedElementIds,
|
||||||
remotePointerUsernames,
|
remotePointerUsernames,
|
||||||
remotePointerUserStates,
|
remotePointerUserStates,
|
||||||
selectionColor,
|
selectionColor,
|
||||||
renderScrollbars: props.renderScrollbars,
|
renderScrollbars: props.renderScrollbars,
|
||||||
},
|
|
||||||
device: props.device,
|
|
||||||
callback: props.renderInteractiveSceneCallback,
|
|
||||||
},
|
},
|
||||||
isRenderThrottlingEnabled(),
|
editorInterface: props.editorInterface,
|
||||||
);
|
callback: props.renderInteractiveSceneCallback,
|
||||||
|
animationState: {
|
||||||
|
bindingHighlight: undefined,
|
||||||
|
},
|
||||||
|
deltaTime: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!AnimationController.running(INTERACTIVE_SCENE_ANIMATION_KEY)) {
|
||||||
|
AnimationController.start<InteractiveSceneRenderAnimationState>(
|
||||||
|
INTERACTIVE_SCENE_ANIMATION_KEY,
|
||||||
|
({ deltaTime, state }) => {
|
||||||
|
const nextAnimationState = renderInteractiveScene({
|
||||||
|
...rendererParams.current!,
|
||||||
|
deltaTime,
|
||||||
|
animationState: state,
|
||||||
|
}).animationState;
|
||||||
|
|
||||||
|
if (nextAnimationState) {
|
||||||
|
for (const key in nextAnimationState) {
|
||||||
|
if (
|
||||||
|
nextAnimationState[
|
||||||
|
key as keyof InteractiveSceneRenderAnimationState
|
||||||
|
] !== undefined
|
||||||
|
) {
|
||||||
|
return nextAnimationState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -35,10 +35,16 @@ const DropdownMenu = ({
|
|||||||
: MenuContentComp;
|
: MenuContentComp;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div
|
||||||
|
className="dropdown-menu-container"
|
||||||
|
style={{
|
||||||
|
// remove this div from box layout
|
||||||
|
display: "contents",
|
||||||
|
}}
|
||||||
|
>
|
||||||
{MenuTriggerComp}
|
{MenuTriggerComp}
|
||||||
{open && MenuContentCompWithPlacement}
|
{open && MenuContentCompWithPlacement}
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { EVENT, KEYS } from "@excalidraw/common";
|
|||||||
|
|
||||||
import { useOutsideClick } from "../../hooks/useOutsideClick";
|
import { useOutsideClick } from "../../hooks/useOutsideClick";
|
||||||
import { useStable } from "../../hooks/useStable";
|
import { useStable } from "../../hooks/useStable";
|
||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
import { Island } from "../Island";
|
import { Island } from "../Island";
|
||||||
import Stack from "../Stack";
|
import Stack from "../Stack";
|
||||||
|
|
||||||
@@ -29,13 +29,20 @@ const MenuContent = ({
|
|||||||
style?: React.CSSProperties;
|
style?: React.CSSProperties;
|
||||||
placement?: "top" | "bottom";
|
placement?: "top" | "bottom";
|
||||||
}) => {
|
}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const menuRef = useRef<HTMLDivElement>(null);
|
const menuRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
const callbacksRef = useStable({ onClickOutside });
|
const callbacksRef = useStable({ onClickOutside });
|
||||||
|
|
||||||
useOutsideClick(menuRef, () => {
|
useOutsideClick(menuRef, (event) => {
|
||||||
callbacksRef.onClickOutside?.();
|
// prevents closing if clicking on the trigger button
|
||||||
|
if (
|
||||||
|
!menuRef.current
|
||||||
|
?.closest(".dropdown-menu-container")
|
||||||
|
?.contains(event.target)
|
||||||
|
) {
|
||||||
|
callbacksRef.onClickOutside?.();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -59,7 +66,7 @@ const MenuContent = ({
|
|||||||
}, [callbacksRef]);
|
}, [callbacksRef]);
|
||||||
|
|
||||||
const classNames = clsx(`dropdown-menu ${className}`, {
|
const classNames = clsx(`dropdown-menu ${className}`, {
|
||||||
"dropdown-menu--mobile": device.editor.isMobile,
|
"dropdown-menu--mobile": editorInterface.formFactor === "phone",
|
||||||
"dropdown-menu--placement-top": placement === "top",
|
"dropdown-menu--placement-top": placement === "top",
|
||||||
}).trim();
|
}).trim();
|
||||||
|
|
||||||
@@ -73,13 +80,8 @@ const MenuContent = ({
|
|||||||
>
|
>
|
||||||
{/* the zIndex ensures this menu has higher stacking order,
|
{/* the zIndex ensures this menu has higher stacking order,
|
||||||
see https://github.com/excalidraw/excalidraw/pull/1445 */}
|
see https://github.com/excalidraw/excalidraw/pull/1445 */}
|
||||||
{device.editor.isMobile ? (
|
{editorInterface.formFactor === "phone" ? (
|
||||||
<Stack.Col
|
<Stack.Col className="dropdown-menu-container">{children}</Stack.Col>
|
||||||
className="dropdown-menu-container"
|
|
||||||
style={{ ["--gap" as any]: 1.25 }}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</Stack.Col>
|
|
||||||
) : (
|
) : (
|
||||||
<Island
|
<Island
|
||||||
className="dropdown-menu-container"
|
className="dropdown-menu-container"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
|
|
||||||
import { Ellipsify } from "../Ellipsify";
|
import { Ellipsify } from "../Ellipsify";
|
||||||
|
|
||||||
@@ -15,14 +15,14 @@ const MenuItemContent = ({
|
|||||||
textStyle?: React.CSSProperties;
|
textStyle?: React.CSSProperties;
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) => {
|
}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{icon && <div className="dropdown-menu-item__icon">{icon}</div>}
|
{icon && <div className="dropdown-menu-item__icon">{icon}</div>}
|
||||||
<div style={textStyle} className="dropdown-menu-item__text">
|
<div style={textStyle} className="dropdown-menu-item__text">
|
||||||
<Ellipsify>{children}</Ellipsify>
|
<Ellipsify>{children}</Ellipsify>
|
||||||
</div>
|
</div>
|
||||||
{shortcut && !device.editor.isMobile && (
|
{shortcut && editorInterface.formFactor !== "phone" && (
|
||||||
<div className="dropdown-menu-item__shortcut">{shortcut}</div>
|
<div className="dropdown-menu-item__shortcut">{shortcut}</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
import { RadioGroup } from "../RadioGroup";
|
import { RadioGroup } from "../RadioGroup";
|
||||||
|
|
||||||
type Props<T> = {
|
type Props<T> = {
|
||||||
@@ -22,7 +22,7 @@ const DropdownMenuItemContentRadio = <T,>({
|
|||||||
children,
|
children,
|
||||||
name,
|
name,
|
||||||
}: Props<T>) => {
|
}: Props<T>) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -37,7 +37,7 @@ const DropdownMenuItemContentRadio = <T,>({
|
|||||||
choices={choices}
|
choices={choices}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{shortcut && !device.editor.isMobile && (
|
{shortcut && editorInterface.formFactor !== "phone" && (
|
||||||
<div className="dropdown-menu-item__shortcut dropdown-menu-item__shortcut--orphaned">
|
<div className="dropdown-menu-item__shortcut dropdown-menu-item__shortcut--orphaned">
|
||||||
{shortcut}
|
{shortcut}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
import { useDevice } from "../App";
|
import { useEditorInterface } from "../App";
|
||||||
|
|
||||||
const MenuTrigger = ({
|
const MenuTrigger = ({
|
||||||
className = "",
|
className = "",
|
||||||
@@ -14,17 +14,16 @@ const MenuTrigger = ({
|
|||||||
onToggle: () => void;
|
onToggle: () => void;
|
||||||
title?: string;
|
title?: string;
|
||||||
} & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect">) => {
|
} & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect">) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const classNames = clsx(
|
const classNames = clsx(
|
||||||
`dropdown-menu-button ${className}`,
|
`dropdown-menu-button ${className}`,
|
||||||
"zen-mode-transition",
|
"zen-mode-transition",
|
||||||
{
|
{
|
||||||
"dropdown-menu-button--mobile": device.editor.isMobile,
|
"dropdown-menu-button--mobile": editorInterface.formFactor === "phone",
|
||||||
},
|
},
|
||||||
).trim();
|
).trim();
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
data-prevent-outside-click
|
|
||||||
className={classNames}
|
className={classNames}
|
||||||
onClick={onToggle}
|
onClick={onToggle}
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import clsx from "clsx";
|
|||||||
|
|
||||||
import { actionShortcuts } from "../../actions";
|
import { actionShortcuts } from "../../actions";
|
||||||
import { useTunnels } from "../../context/tunnels";
|
import { useTunnels } from "../../context/tunnels";
|
||||||
import { ExitZenModeAction, UndoRedoActions, ZoomActions } from "../Actions";
|
import { ExitZenModeButton, UndoRedoActions, ZoomActions } from "../Actions";
|
||||||
import { HelpButton } from "../HelpButton";
|
import { HelpButton } from "../HelpButton";
|
||||||
import { Section } from "../Section";
|
import { Section } from "../Section";
|
||||||
import Stack from "../Stack";
|
import Stack from "../Stack";
|
||||||
@@ -66,7 +66,7 @@ const Footer = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ExitZenModeAction
|
<ExitZenModeButton
|
||||||
actionManager={actionManager}
|
actionManager={actionManager}
|
||||||
showExitZenModeBtn={showExitZenModeBtn}
|
showExitZenModeBtn={showExitZenModeBtn}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import { getTooltipDiv, updateTooltipPosition } from "../../components/Tooltip";
|
|||||||
|
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
|
|
||||||
import { useAppProps, useDevice, useExcalidrawAppState } from "../App";
|
import { useAppProps, useEditorInterface, useExcalidrawAppState } from "../App";
|
||||||
import { ToolButton } from "../ToolButton";
|
import { ToolButton } from "../ToolButton";
|
||||||
import { FreedrawIcon, TrashIcon, elementLinkIcon } from "../icons";
|
import { FreedrawIcon, TrashIcon, elementLinkIcon } from "../icons";
|
||||||
import { getSelectedElements } from "../../scene";
|
import { getSelectedElements } from "../../scene";
|
||||||
@@ -88,7 +88,7 @@ export const Hyperlink = ({
|
|||||||
const elementsMap = scene.getNonDeletedElementsMap();
|
const elementsMap = scene.getNonDeletedElementsMap();
|
||||||
const appState = useExcalidrawAppState();
|
const appState = useExcalidrawAppState();
|
||||||
const appProps = useAppProps();
|
const appProps = useAppProps();
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
|
|
||||||
const linkVal = element.link || "";
|
const linkVal = element.link || "";
|
||||||
|
|
||||||
@@ -189,11 +189,11 @@ export const Hyperlink = ({
|
|||||||
if (
|
if (
|
||||||
isEditing &&
|
isEditing &&
|
||||||
inputRef?.current &&
|
inputRef?.current &&
|
||||||
!(device.viewport.isMobile || device.isTouchScreen)
|
!(editorInterface.formFactor === "phone" || editorInterface.isTouchScreen)
|
||||||
) {
|
) {
|
||||||
inputRef.current.select();
|
inputRef.current.select();
|
||||||
}
|
}
|
||||||
}, [isEditing, device.viewport.isMobile, device.isTouchScreen]);
|
}, [isEditing, editorInterface.formFactor, editorInterface.isTouchScreen]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let timeoutId: number | null = null;
|
let timeoutId: number | null = null;
|
||||||
|
|||||||
@@ -1160,7 +1160,7 @@ export const StrokeWidthBaseIcon = createIcon(
|
|||||||
modifiedTablerIconProps,
|
modifiedTablerIconProps,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const StrokeWidthMediumIcon = createIcon(
|
export const StrokeWidthBoldIcon = createIcon(
|
||||||
<path
|
<path
|
||||||
d="M5 10h10"
|
d="M5 10h10"
|
||||||
stroke="currentColor"
|
stroke="currentColor"
|
||||||
@@ -1171,22 +1171,11 @@ export const StrokeWidthMediumIcon = createIcon(
|
|||||||
modifiedTablerIconProps,
|
modifiedTablerIconProps,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const StrokeWidthBoldIcon = createIcon(
|
|
||||||
<path
|
|
||||||
d="M5 10h10"
|
|
||||||
stroke="currentColor"
|
|
||||||
strokeWidth="3.75"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>,
|
|
||||||
modifiedTablerIconProps,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const StrokeWidthExtraBoldIcon = createIcon(
|
export const StrokeWidthExtraBoldIcon = createIcon(
|
||||||
<path
|
<path
|
||||||
d="M5 10h10"
|
d="M5 10h10"
|
||||||
stroke="currentColor"
|
stroke="currentColor"
|
||||||
strokeWidth="5"
|
strokeWidth="3.75"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>,
|
/>,
|
||||||
@@ -2305,40 +2294,6 @@ export const elementLinkIcon = createIcon(
|
|||||||
tablerIconProps,
|
tablerIconProps,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const strokeWidthFixedIcon = createIcon(
|
|
||||||
<g>
|
|
||||||
<path
|
|
||||||
d="M4 12 C 5 8, 6 8, 8 12"
|
|
||||||
fill="none"
|
|
||||||
strokeWidth="1"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M8 12 C 9 16, 10 16, 12 12"
|
|
||||||
fill="none"
|
|
||||||
strokeWidth="1"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M12 12 C 14 8, 15 8, 16 12"
|
|
||||||
fill="none"
|
|
||||||
strokeWidth="1"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M16 12 C 17 16, 18 16, 19 12"
|
|
||||||
fill="none"
|
|
||||||
strokeWidth="1"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
</g>,
|
|
||||||
tablerIconProps,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const resizeIcon = createIcon(
|
export const resizeIcon = createIcon(
|
||||||
<g strokeWidth={1.5}>
|
<g strokeWidth={1.5}>
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
@@ -2348,40 +2303,6 @@ export const resizeIcon = createIcon(
|
|||||||
tablerIconProps,
|
tablerIconProps,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const strokeWidthVariableIcon = createIcon(
|
|
||||||
<g>
|
|
||||||
<path
|
|
||||||
d="M4 12 C 5 8, 6 8, 8 12"
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1.5"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M8 12 C 9 16, 10 16, 12 12"
|
|
||||||
fill="none"
|
|
||||||
stroke-width="2"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M12 12 C 14 8, 15 8, 16 12"
|
|
||||||
fill="none"
|
|
||||||
stroke-width="2.75"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M16 12 C 17 16, 18 16, 19 12"
|
|
||||||
fill="none"
|
|
||||||
stroke-width="3.25"
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
/>
|
|
||||||
</g>,
|
|
||||||
tablerIconProps,
|
|
||||||
);
|
|
||||||
|
|
||||||
export const adjustmentsIcon = createIcon(
|
export const adjustmentsIcon = createIcon(
|
||||||
<g strokeWidth={1.5}>
|
<g strokeWidth={1.5}>
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
@@ -2405,3 +2326,50 @@ export const strokeIcon = createIcon(
|
|||||||
</g>,
|
</g>,
|
||||||
tablerIconProps,
|
tablerIconProps,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const pencilIcon = createIcon(
|
||||||
|
<g strokeWidth={1.25}>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
|
||||||
|
<path d="M13.5 6.5l4 4" />
|
||||||
|
</g>,
|
||||||
|
tablerIconProps,
|
||||||
|
);
|
||||||
|
|
||||||
|
export const chevronLeftIcon = createIcon(
|
||||||
|
<g strokeWidth={1}>
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M11 7l-5 5l5 5" />
|
||||||
|
<path d="M17 7l-5 5l5 5" />
|
||||||
|
</g>,
|
||||||
|
tablerIconProps,
|
||||||
|
);
|
||||||
|
|
||||||
|
export const sidebarRightIcon = createIcon(
|
||||||
|
<g strokeWidth="1.75">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z" />
|
||||||
|
<path d="M15 4l0 16" />
|
||||||
|
</g>,
|
||||||
|
tablerIconProps,
|
||||||
|
);
|
||||||
|
|
||||||
|
export const messageCircleIcon = createIcon(
|
||||||
|
<g strokeWidth="1.25">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1" />
|
||||||
|
</g>,
|
||||||
|
tablerIconProps,
|
||||||
|
);
|
||||||
|
|
||||||
|
export const presentationIcon = createIcon(
|
||||||
|
<g strokeWidth="1.25">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M3 4l18 0" />
|
||||||
|
<path d="M4 4v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-10" />
|
||||||
|
<path d="M12 16l0 4" />
|
||||||
|
<path d="M9 20l6 0" />
|
||||||
|
<path d="M8 12l3 -3l2 2l3 -3" />
|
||||||
|
</g>,
|
||||||
|
tablerIconProps,
|
||||||
|
);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
import { isMobileOrTablet, MQ_MIN_WIDTH_DESKTOP } from "@excalidraw/common";
|
import { MQ_MIN_WIDTH_DESKTOP, type EditorInterface } from "@excalidraw/common";
|
||||||
|
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { Button } from "../Button";
|
import { Button } from "../Button";
|
||||||
@@ -12,15 +12,18 @@ import "./LiveCollaborationTrigger.scss";
|
|||||||
const LiveCollaborationTrigger = ({
|
const LiveCollaborationTrigger = ({
|
||||||
isCollaborating,
|
isCollaborating,
|
||||||
onSelect,
|
onSelect,
|
||||||
|
editorInterface,
|
||||||
...rest
|
...rest
|
||||||
}: {
|
}: {
|
||||||
isCollaborating: boolean;
|
isCollaborating: boolean;
|
||||||
onSelect: () => void;
|
onSelect: () => void;
|
||||||
|
editorInterface?: EditorInterface;
|
||||||
} & React.ButtonHTMLAttributes<HTMLButtonElement>) => {
|
} & React.ButtonHTMLAttributes<HTMLButtonElement>) => {
|
||||||
const appState = useUIAppState();
|
const appState = useUIAppState();
|
||||||
|
|
||||||
const showIconOnly =
|
const showIconOnly =
|
||||||
isMobileOrTablet() || appState.width < MQ_MIN_WIDTH_DESKTOP;
|
editorInterface?.formFactor !== "desktop" ||
|
||||||
|
appState.width < MQ_MIN_WIDTH_DESKTOP;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { composeEventHandlers } from "@excalidraw/common";
|
|||||||
import { useTunnels } from "../../context/tunnels";
|
import { useTunnels } from "../../context/tunnels";
|
||||||
import { useUIAppState } from "../../context/ui-appState";
|
import { useUIAppState } from "../../context/ui-appState";
|
||||||
import { t } from "../../i18n";
|
import { t } from "../../i18n";
|
||||||
import { useDevice, useExcalidrawSetAppState } from "../App";
|
import { useEditorInterface, useExcalidrawSetAppState } from "../App";
|
||||||
import { UserList } from "../UserList";
|
import { UserList } from "../UserList";
|
||||||
import DropdownMenu from "../dropdownMenu/DropdownMenu";
|
import DropdownMenu from "../dropdownMenu/DropdownMenu";
|
||||||
import { withInternalFallback } from "../hoc/withInternalFallback";
|
import { withInternalFallback } from "../hoc/withInternalFallback";
|
||||||
@@ -27,7 +27,7 @@ const MainMenu = Object.assign(
|
|||||||
onSelect?: (event: Event) => void;
|
onSelect?: (event: Event) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const { MainMenuTunnel } = useTunnels();
|
const { MainMenuTunnel } = useTunnels();
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const appState = useUIAppState();
|
const appState = useUIAppState();
|
||||||
const setAppState = useExcalidrawSetAppState();
|
const setAppState = useExcalidrawSetAppState();
|
||||||
|
|
||||||
@@ -53,19 +53,24 @@ const MainMenu = Object.assign(
|
|||||||
setAppState({ openMenu: null });
|
setAppState({ openMenu: null });
|
||||||
})}
|
})}
|
||||||
placement="bottom"
|
placement="bottom"
|
||||||
className={device.editor.isMobile ? "main-menu-dropdown" : ""}
|
className={
|
||||||
|
editorInterface.formFactor === "phone"
|
||||||
|
? "main-menu-dropdown"
|
||||||
|
: ""
|
||||||
|
}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
{device.editor.isMobile && appState.collaborators.size > 0 && (
|
{editorInterface.formFactor === "phone" &&
|
||||||
<fieldset className="UserList-Wrapper">
|
appState.collaborators.size > 0 && (
|
||||||
<legend>{t("labels.collaborators")}</legend>
|
<fieldset className="UserList-Wrapper">
|
||||||
<UserList
|
<legend>{t("labels.collaborators")}</legend>
|
||||||
mobile={true}
|
<UserList
|
||||||
collaborators={appState.collaborators}
|
mobile={true}
|
||||||
userToFollow={appState.userToFollow?.socketId || null}
|
collaborators={appState.collaborators}
|
||||||
/>
|
userToFollow={appState.userToFollow?.socketId || null}
|
||||||
</fieldset>
|
/>
|
||||||
)}
|
</fieldset>
|
||||||
|
)}
|
||||||
</DropdownMenu.Content>
|
</DropdownMenu.Content>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</MainMenuTunnel.In>
|
</MainMenuTunnel.In>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { getShortcutFromShortcutName } from "../../actions/shortcuts";
|
|||||||
import { useTunnels } from "../../context/tunnels";
|
import { useTunnels } from "../../context/tunnels";
|
||||||
import { useUIAppState } from "../../context/ui-appState";
|
import { useUIAppState } from "../../context/ui-appState";
|
||||||
import { t, useI18n } from "../../i18n";
|
import { t, useI18n } from "../../i18n";
|
||||||
import { useDevice, useExcalidrawActionManager } from "../App";
|
import { useEditorInterface, useExcalidrawActionManager } from "../App";
|
||||||
import { ExcalidrawLogo } from "../ExcalidrawLogo";
|
import { ExcalidrawLogo } from "../ExcalidrawLogo";
|
||||||
import { HelpIcon, LoadIcon, usersIcon } from "../icons";
|
import { HelpIcon, LoadIcon, usersIcon } from "../icons";
|
||||||
|
|
||||||
@@ -18,12 +18,12 @@ const WelcomeScreenMenuItemContent = ({
|
|||||||
shortcut?: string | null;
|
shortcut?: string | null;
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) => {
|
}) => {
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="welcome-screen-menu-item__icon">{icon}</div>
|
<div className="welcome-screen-menu-item__icon">{icon}</div>
|
||||||
<div className="welcome-screen-menu-item__text">{children}</div>
|
<div className="welcome-screen-menu-item__text">{children}</div>
|
||||||
{shortcut && !device.editor.isMobile && (
|
{shortcut && editorInterface.formFactor !== "phone" && (
|
||||||
<div className="welcome-screen-menu-item__shortcut">{shortcut}</div>
|
<div className="welcome-screen-menu-item__shortcut">{shortcut}</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -13,10 +13,10 @@
|
|||||||
--zIndex-hyperlinkContainer: 7;
|
--zIndex-hyperlinkContainer: 7;
|
||||||
|
|
||||||
--zIndex-ui-bottom: 60;
|
--zIndex-ui-bottom: 60;
|
||||||
--zIndex-ui-library: 80;
|
|
||||||
--zIndex-ui-context-menu: 90;
|
--zIndex-ui-context-menu: 90;
|
||||||
--zIndex-ui-styles-popup: 100;
|
--zIndex-ui-styles-popup: 100;
|
||||||
--zIndex-ui-top: 100;
|
--zIndex-ui-top: 100;
|
||||||
|
--zIndex-ui-library: 120;
|
||||||
|
|
||||||
--zIndex-modal: 1000;
|
--zIndex-modal: 1000;
|
||||||
--zIndex-popup: 1001;
|
--zIndex-popup: 1001;
|
||||||
@@ -50,6 +50,11 @@ body.excalidraw-cursor-resize * {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
button {
|
||||||
|
// browser default. Looks kinda good on low-dpi.
|
||||||
|
font-size: 0.8333rem;
|
||||||
|
}
|
||||||
|
|
||||||
button,
|
button,
|
||||||
label {
|
label {
|
||||||
@include buttonNoHighlight;
|
@include buttonNoHighlight;
|
||||||
@@ -293,7 +298,8 @@ body.excalidraw-cursor-resize * {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.excalidraw-ui-top-left {
|
.excalidraw-ui-top-left,
|
||||||
|
.excalidraw-ui-top-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
@@ -707,6 +713,11 @@ body.excalidraw-cursor-resize * {
|
|||||||
margin-top: 0rem;
|
margin-top: 0rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.link-button {
|
||||||
|
display: flex;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.ErrorSplash.excalidraw {
|
.ErrorSplash.excalidraw {
|
||||||
|
|||||||
@@ -304,8 +304,6 @@ export const restoreElement = (
|
|||||||
lastCommittedPoint: null,
|
lastCommittedPoint: null,
|
||||||
simulatePressure: element.simulatePressure,
|
simulatePressure: element.simulatePressure,
|
||||||
pressures: element.pressures,
|
pressures: element.pressures,
|
||||||
// legacy, for backwards compatibility
|
|
||||||
freedrawOptions: element.freedrawOptions ?? null,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
case "image":
|
case "image":
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import { getBoundTextElementId } from "@excalidraw/element";
|
|||||||
|
|
||||||
import type { Bounds } from "@excalidraw/element";
|
import type { Bounds } from "@excalidraw/element";
|
||||||
|
|
||||||
import type { GlobalPoint, LineSegment } from "@excalidraw/math/types";
|
import type { GlobalPoint, LineSegment } from "@excalidraw/math";
|
||||||
import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
|
import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
|
||||||
|
|
||||||
import { AnimatedTrail } from "../animated-trail";
|
import { AnimatedTrail } from "../animated-trail";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { useState, useLayoutEffect } from "react";
|
|||||||
|
|
||||||
import { THEME } from "@excalidraw/common";
|
import { THEME } from "@excalidraw/common";
|
||||||
|
|
||||||
import { useDevice, useExcalidrawContainer } from "../components/App";
|
import { useEditorInterface, useExcalidrawContainer } from "../components/App";
|
||||||
import { useUIAppState } from "../context/ui-appState";
|
import { useUIAppState } from "../context/ui-appState";
|
||||||
|
|
||||||
export const useCreatePortalContainer = (opts?: {
|
export const useCreatePortalContainer = (opts?: {
|
||||||
@@ -11,7 +11,7 @@ export const useCreatePortalContainer = (opts?: {
|
|||||||
}) => {
|
}) => {
|
||||||
const [div, setDiv] = useState<HTMLDivElement | null>(null);
|
const [div, setDiv] = useState<HTMLDivElement | null>(null);
|
||||||
|
|
||||||
const device = useDevice();
|
const editorInterface = useEditorInterface();
|
||||||
const { theme } = useUIAppState();
|
const { theme } = useUIAppState();
|
||||||
|
|
||||||
const { container: excalidrawContainer } = useExcalidrawContainer();
|
const { container: excalidrawContainer } = useExcalidrawContainer();
|
||||||
@@ -20,10 +20,13 @@ export const useCreatePortalContainer = (opts?: {
|
|||||||
if (div) {
|
if (div) {
|
||||||
div.className = "";
|
div.className = "";
|
||||||
div.classList.add("excalidraw", ...(opts?.className?.split(/\s+/) || []));
|
div.classList.add("excalidraw", ...(opts?.className?.split(/\s+/) || []));
|
||||||
div.classList.toggle("excalidraw--mobile", device.editor.isMobile);
|
div.classList.toggle(
|
||||||
|
"excalidraw--mobile",
|
||||||
|
editorInterface.formFactor === "phone",
|
||||||
|
);
|
||||||
div.classList.toggle("theme--dark", theme === THEME.DARK);
|
div.classList.toggle("theme--dark", theme === THEME.DARK);
|
||||||
}
|
}
|
||||||
}, [div, theme, device.editor.isMobile, opts?.className]);
|
}, [div, theme, editorInterface.formFactor, opts?.className]);
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
const container = opts?.parentSelector
|
const container = opts?.parentSelector
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { EVENT } from "@excalidraw/common";
|
|||||||
export function useOutsideClick<T extends HTMLElement>(
|
export function useOutsideClick<T extends HTMLElement>(
|
||||||
ref: React.RefObject<T | null>,
|
ref: React.RefObject<T | null>,
|
||||||
/** if performance is of concern, memoize the callback */
|
/** if performance is of concern, memoize the callback */
|
||||||
callback: (event: Event) => void,
|
callback: (event: Event & { target: T }) => void,
|
||||||
/**
|
/**
|
||||||
* Optional callback which is called on every click.
|
* Optional callback which is called on every click.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ export {
|
|||||||
loadSceneOrLibraryFromBlob,
|
loadSceneOrLibraryFromBlob,
|
||||||
loadLibraryFromBlob,
|
loadLibraryFromBlob,
|
||||||
} from "./data/blob";
|
} from "./data/blob";
|
||||||
export { getFreeDrawSvgPath } from "@excalidraw/element/freedraw";
|
export { getFreeDrawSvgPath } from "@excalidraw/element";
|
||||||
export { mergeLibraryItems, getLibraryItemsHash } from "./data/library";
|
export { mergeLibraryItems, getLibraryItemsHash } from "./data/library";
|
||||||
export { isLinearElement } from "@excalidraw/element";
|
export { isLinearElement } from "@excalidraw/element";
|
||||||
|
|
||||||
@@ -263,6 +263,9 @@ export {
|
|||||||
DEFAULT_LASER_COLOR,
|
DEFAULT_LASER_COLOR,
|
||||||
UserIdleState,
|
UserIdleState,
|
||||||
normalizeLink,
|
normalizeLink,
|
||||||
|
sceneCoordsToViewportCoords,
|
||||||
|
viewportCoordsToSceneCoords,
|
||||||
|
getFormFactor,
|
||||||
} from "@excalidraw/common";
|
} from "@excalidraw/common";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
@@ -275,17 +278,12 @@ export { CaptureUpdateAction } from "@excalidraw/element";
|
|||||||
|
|
||||||
export { parseLibraryTokensFromUrl, useHandleLibrary } from "./data/library";
|
export { parseLibraryTokensFromUrl, useHandleLibrary } from "./data/library";
|
||||||
|
|
||||||
export {
|
|
||||||
sceneCoordsToViewportCoords,
|
|
||||||
viewportCoordsToSceneCoords,
|
|
||||||
} from "@excalidraw/common";
|
|
||||||
|
|
||||||
export { Sidebar } from "./components/Sidebar/Sidebar";
|
export { Sidebar } from "./components/Sidebar/Sidebar";
|
||||||
export { Button } from "./components/Button";
|
export { Button } from "./components/Button";
|
||||||
export { Footer };
|
export { Footer };
|
||||||
export { MainMenu };
|
export { MainMenu };
|
||||||
export { Ellipsify } from "./components/Ellipsify";
|
export { Ellipsify } from "./components/Ellipsify";
|
||||||
export { useDevice } from "./components/App";
|
export { useEditorInterface, useStylesPanelMode } from "./components/App";
|
||||||
export { WelcomeScreen };
|
export { WelcomeScreen };
|
||||||
export { LiveCollaborationTrigger };
|
export { LiveCollaborationTrigger };
|
||||||
export { Stats } from "./components/Stats";
|
export { Stats } from "./components/Stats";
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {
|
|||||||
intersectElementWithLineSegment,
|
intersectElementWithLineSegment,
|
||||||
} from "@excalidraw/element";
|
} from "@excalidraw/element";
|
||||||
|
|
||||||
import type { ElementsSegmentsMap, GlobalPoint } from "@excalidraw/math/types";
|
import type { ElementsSegmentsMap, GlobalPoint } from "@excalidraw/math";
|
||||||
import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
|
import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types";
|
||||||
|
|
||||||
export const getLassoSelectedElementIds = (input: {
|
export const getLassoSelectedElementIds = (input: {
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "نسخ إلى الحافظة بصيغة PNG",
|
"copyAsPng": "نسخ إلى الحافظة بصيغة PNG",
|
||||||
"copyAsSvg": "نسخ إلى الحافظة بصيغة SVG",
|
"copyAsSvg": "نسخ إلى الحافظة بصيغة SVG",
|
||||||
"copyText": "نسخ إلى الحافظة كنص",
|
"copyText": "نسخ إلى الحافظة كنص",
|
||||||
"copySource": "",
|
"copySource": "نسخ المصدر إلى الحافظة",
|
||||||
"convertToCode": "",
|
"convertToCode": "تحويل إلى كود",
|
||||||
"bringForward": "جلب للأمام",
|
"bringForward": "جلب للأمام",
|
||||||
"sendToBack": "أرسل للخلف",
|
"sendToBack": "أرسل للخلف",
|
||||||
"bringToFront": "أحضر للأمام",
|
"bringToFront": "أحضر للأمام",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "نسخ الأنماط",
|
"copyStyles": "نسخ الأنماط",
|
||||||
"pasteStyles": "لصق الأنماط",
|
"pasteStyles": "لصق الأنماط",
|
||||||
"stroke": "الخط",
|
"stroke": "الخط",
|
||||||
|
"changeStroke": "تغيير لون القلم",
|
||||||
"background": "الخلفية",
|
"background": "الخلفية",
|
||||||
|
"changeBackground": "تغيير لون الخلفية",
|
||||||
"fill": "التعبئة",
|
"fill": "التعبئة",
|
||||||
"strokeWidth": "سُمك الخط",
|
"strokeWidth": "سُمك الخط",
|
||||||
"strokeStyle": "نمط الخط",
|
"strokeStyle": "نمط الخط",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "لا شيء",
|
"arrowhead_none": "لا شيء",
|
||||||
"arrowhead_arrow": "سهم",
|
"arrowhead_arrow": "سهم",
|
||||||
"arrowhead_bar": "شريط",
|
"arrowhead_bar": "شريط",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "دائرة",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "دائرة (مخططة)",
|
||||||
"arrowhead_triangle": "مثلث",
|
"arrowhead_triangle": "مثلث",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "مثلث (مخطط)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "ألماسة",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "ألماسة (مخططة)",
|
||||||
|
"arrowhead_crowfoot_many": "Crow's foot (many)",
|
||||||
|
"arrowhead_crowfoot_one": "Crow's foot (one)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Crow's foot (one or many)",
|
||||||
|
"more_options": "خيارات إضافية",
|
||||||
|
"arrowtypes": "نوع السهم",
|
||||||
|
"arrowtype_sharp": "سهم حاد",
|
||||||
|
"arrowtype_round": "سهم منحني",
|
||||||
|
"arrowtype_elbowed": "سهم زاوي",
|
||||||
"fontSize": "حجم الخط",
|
"fontSize": "حجم الخط",
|
||||||
"fontFamily": "نوع الخط",
|
"fontFamily": "نوع الخط",
|
||||||
"addWatermark": "إضافة \"مصنوعة بواسطة Excalidraw\"",
|
"addWatermark": "إضافة \"مصنوعة بواسطة Excalidraw\"",
|
||||||
@@ -53,7 +63,7 @@
|
|||||||
"small": "صغير",
|
"small": "صغير",
|
||||||
"medium": "متوسط",
|
"medium": "متوسط",
|
||||||
"large": "كبير",
|
"large": "كبير",
|
||||||
"veryLarge": "كبير جدا",
|
"veryLarge": "كبير جدًا",
|
||||||
"solid": "كامل",
|
"solid": "كامل",
|
||||||
"hachure": "خطوط",
|
"hachure": "خطوط",
|
||||||
"zigzag": "متعرج",
|
"zigzag": "متعرج",
|
||||||
@@ -67,11 +77,12 @@
|
|||||||
"architect": "معماري",
|
"architect": "معماري",
|
||||||
"artist": "رسام",
|
"artist": "رسام",
|
||||||
"cartoonist": "كرتوني",
|
"cartoonist": "كرتوني",
|
||||||
"fileTitle": "إسم الملف",
|
"fileTitle": "اسم الملف",
|
||||||
"colorPicker": "منتقي اللون",
|
"colorPicker": "منتقي اللون",
|
||||||
"canvasColors": "تستخدم على القماش",
|
"canvasColors": "تستخدم على القماش",
|
||||||
"canvasBackground": "خلفية اللوحة",
|
"canvasBackground": "خلفية اللوحة",
|
||||||
"drawingCanvas": "لوحة الرسم",
|
"drawingCanvas": "لوحة الرسم",
|
||||||
|
"clearCanvas": "مسح اللوحة",
|
||||||
"layers": "الطبقات",
|
"layers": "الطبقات",
|
||||||
"actions": "الإجراءات",
|
"actions": "الإجراءات",
|
||||||
"language": "اللغة",
|
"language": "اللغة",
|
||||||
@@ -84,28 +95,31 @@
|
|||||||
"group": "تحديد مجموعة",
|
"group": "تحديد مجموعة",
|
||||||
"ungroup": "إلغاء تحديد مجموعة",
|
"ungroup": "إلغاء تحديد مجموعة",
|
||||||
"collaborators": "المتعاونون",
|
"collaborators": "المتعاونون",
|
||||||
"showGrid": "إظهار الشبكة",
|
"toggleGrid": "تبديل الشبكة",
|
||||||
"addToLibrary": "أضف إلى المكتبة",
|
"addToLibrary": "أضف إلى المكتبة",
|
||||||
"removeFromLibrary": "حذف من المكتبة",
|
"removeFromLibrary": "حذف من المكتبة",
|
||||||
"libraryLoadingMessage": "جارٍ تحميل المكتبة…",
|
"libraryLoadingMessage": "جارٍ تحميل المكتبة...",
|
||||||
"libraries": "تصفح المكتبات",
|
"libraries": "تصفح المكتبات",
|
||||||
"loadingScene": "جاري تحميل المشهد…",
|
"loadingScene": "جارٍ تحميل المشهد…",
|
||||||
|
"loadScene": "تحميل المشهد من ملف",
|
||||||
"align": "محاذاة",
|
"align": "محاذاة",
|
||||||
"alignTop": "محاذاة إلى اﻷعلى",
|
"alignTop": "محاذاة إلى الأعلى",
|
||||||
"alignBottom": "محاذاة إلى اﻷسفل",
|
"alignBottom": "محاذاة إلى الأسفل",
|
||||||
"alignLeft": "محاذاة إلى اليسار",
|
"alignLeft": "محاذاة إلى اليسار",
|
||||||
"alignRight": "محاذاة إلى اليمين",
|
"alignRight": "محاذاة إلى اليمين",
|
||||||
"centerVertically": "توسيط عمودي",
|
"centerVertically": "توسيط عمودي",
|
||||||
"centerHorizontally": "توسيط أفقي",
|
"centerHorizontally": "توسيط أفقي",
|
||||||
"distributeHorizontally": "التوزيع الأفقي",
|
"distributeHorizontally": "التوزيع الأفقي",
|
||||||
"distributeVertically": "التوزيع عمودياً",
|
"distributeVertically": "التوزيع عموديًا",
|
||||||
"flipHorizontal": "قلب عامودي",
|
"flipHorizontal": "قلب أفقي",
|
||||||
"flipVertical": "قلب أفقي",
|
"flipVertical": "قلب عمودي",
|
||||||
"viewMode": "نمط العرض",
|
"viewMode": "نمط العرض",
|
||||||
"share": "مشاركة",
|
"share": "مشاركة",
|
||||||
"showStroke": "إظهار منتقي لون الخط",
|
"showStroke": "إظهار منتقي لون الخط",
|
||||||
"showBackground": "إظهار منتقي لون الخلفية",
|
"showBackground": "إظهار منتقي لون الخلفية",
|
||||||
"toggleTheme": "غير النمط",
|
"showFonts": "إظهار منتقي الخط",
|
||||||
|
"toggleTheme": "تبديل الوضع الفاتح/الداكن",
|
||||||
|
"theme": "السمة",
|
||||||
"personalLib": "المكتبة الشخصية",
|
"personalLib": "المكتبة الشخصية",
|
||||||
"excalidrawLib": "مكتبتنا",
|
"excalidrawLib": "مكتبتنا",
|
||||||
"decreaseFontSize": "تصغير حجم الخط",
|
"decreaseFontSize": "تصغير حجم الخط",
|
||||||
@@ -115,16 +129,21 @@
|
|||||||
"createContainerFromText": "نص مغلف في حاوية",
|
"createContainerFromText": "نص مغلف في حاوية",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "تعديل الرابط",
|
"edit": "تعديل الرابط",
|
||||||
"editEmbed": "تحرير الرابط وإدراجه",
|
"editEmbed": "تعديل الرابط القابل للتضمين",
|
||||||
"create": "إنشاء رابط",
|
"create": "إضافة رابط",
|
||||||
"createEmbed": "إنشاء رابط و إدراجه",
|
|
||||||
"label": "رابط",
|
"label": "رابط",
|
||||||
"labelEmbed": "رابط و إدراج",
|
"labelEmbed": "رابط وإدراج",
|
||||||
"empty": "لم يتم تعيين رابط"
|
"empty": "لم يتم تعيين رابط",
|
||||||
|
"hint": "اكتب أو الصق الرابط هنا",
|
||||||
|
"goToElement": "الانتقال إلى العنصر المستهدف"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "تحرير السطر",
|
"edit": "تحرير السطر",
|
||||||
"exit": "الخروج من المُحرر"
|
"editArrow": "تحرير السهم"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "قفل",
|
"lock": "قفل",
|
||||||
@@ -137,13 +156,47 @@
|
|||||||
"selectAllElementsInFrame": "تحديد جميع العناصر في الإطار",
|
"selectAllElementsInFrame": "تحديد جميع العناصر في الإطار",
|
||||||
"removeAllElementsFromFrame": "إزالة جميع العناصر من الإطار",
|
"removeAllElementsFromFrame": "إزالة جميع العناصر من الإطار",
|
||||||
"eyeDropper": "اختيار اللون من القماش",
|
"eyeDropper": "اختيار اللون من القماش",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "نص إلى رسم بياني",
|
||||||
"prompt": ""
|
"prompt": "تعليمات",
|
||||||
|
"followUs": "تابعنا",
|
||||||
|
"discordChat": "دردشة ديسكورد",
|
||||||
|
"zoomToFitViewport": "التكبير لتناسب العرض",
|
||||||
|
"zoomToFitSelection": "تكبير للعنصر المحدد",
|
||||||
|
"zoomToFit": "تكبير لتلائم جميع العناصر",
|
||||||
|
"installPWA": "تثبيت Excalidraw محليًا (PWA)",
|
||||||
|
"autoResize": "تمكين تغيير حجم النص تلقائيًا",
|
||||||
|
"imageCropping": "قص الصورة",
|
||||||
|
"unCroppedDimension": "الأبعاد غير المقصوصة",
|
||||||
|
"copyElementLink": "نسخ رابط الكائن",
|
||||||
|
"linkToElement": "رابط إلى الكائن",
|
||||||
|
"wrapSelectionInFrame": "تغليف التحديد في إطار",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "رابط إلى الكائن",
|
||||||
|
"desc": "انقر على شكل على اللوحة أو الصق رابطًا.",
|
||||||
|
"notFound": "لم يتم العثور على الكائن المرتبط على اللوحة."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "لا توجد عناصر أضيفت بعد...",
|
"noItems": "لا توجد عناصر أضيفت بعد...",
|
||||||
"hint_emptyLibrary": "حدد عنصر على القماش لإضافته هنا، أو تثبيت مكتبة من المستودع العام أدناه.",
|
"hint_emptyLibrary": "حدد عنصر على القماش لإضافته هنا، أو تثبيت مكتبة من المستودع العام أدناه.",
|
||||||
"hint_emptyPrivateLibrary": "حدد عنصر على القماش لإضافته هنا."
|
"hint_emptyPrivateLibrary": "حدد عنصر على القماش لإضافته هنا.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "البحث على اللوحة",
|
||||||
|
"noMatch": "لم يتم العثور على تطابقات...",
|
||||||
|
"singleResult": "نتيجة",
|
||||||
|
"multipleResults": "نتائج",
|
||||||
|
"placeholder": "ابحث عن نص على اللوحة...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "إعادة تعيين اللوحة",
|
"clearReset": "إعادة تعيين اللوحة",
|
||||||
@@ -151,16 +204,17 @@
|
|||||||
"exportImage": "تصدير الصورة...",
|
"exportImage": "تصدير الصورة...",
|
||||||
"export": "حفظ إلى...",
|
"export": "حفظ إلى...",
|
||||||
"copyToClipboard": "نسخ إلى الحافظة",
|
"copyToClipboard": "نسخ إلى الحافظة",
|
||||||
|
"copyLink": "نسخ الرابط",
|
||||||
"save": "احفظ للملف الحالي",
|
"save": "احفظ للملف الحالي",
|
||||||
"saveAs": "حفظ كـ",
|
"saveAs": "حفظ كـ",
|
||||||
"load": "فتح",
|
"load": "فتح",
|
||||||
"getShareableLink": "احصل على رابط المشاركة",
|
"getShareableLink": "احصل على رابط المشاركة",
|
||||||
"close": "غلق",
|
"close": "إغلاق",
|
||||||
"selectLanguage": "اختر اللغة",
|
"selectLanguage": "اختر اللغة",
|
||||||
"scrollBackToContent": "الرجوع إلى المحتوى",
|
"scrollBackToContent": "الرجوع إلى المحتوى",
|
||||||
"zoomIn": "تكبير",
|
"zoomIn": "تكبير",
|
||||||
"zoomOut": "تصغير",
|
"zoomOut": "تصغير",
|
||||||
"resetZoom": "إعادة تعيين الشاشة",
|
"resetZoom": "إعادة تعيين التكبير",
|
||||||
"menu": "القائمة",
|
"menu": "القائمة",
|
||||||
"done": "تم",
|
"done": "تم",
|
||||||
"edit": "تعديل",
|
"edit": "تعديل",
|
||||||
@@ -171,53 +225,56 @@
|
|||||||
"fullScreen": "شاشة كاملة",
|
"fullScreen": "شاشة كاملة",
|
||||||
"darkMode": "الوضع المظلم",
|
"darkMode": "الوضع المظلم",
|
||||||
"lightMode": "الوضع المضيء",
|
"lightMode": "الوضع المضيء",
|
||||||
|
"systemMode": "وضع النظام",
|
||||||
"zenMode": "وضع التأمل",
|
"zenMode": "وضع التأمل",
|
||||||
"objectsSnapMode": "التقط إلى العناصر",
|
"objectsSnapMode": "التقاط إلى العناصر",
|
||||||
"exitZenMode": "إلغاء الوضع الليلى",
|
"exitZenMode": "إلغاء وضع التأمل",
|
||||||
"cancel": "إلغاء",
|
"cancel": "إلغاء",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "مسح",
|
"clear": "مسح",
|
||||||
"remove": "إزالة",
|
"remove": "إزالة",
|
||||||
"embed": "تبديل الإدراج",
|
"embed": "تبديل الإدراج",
|
||||||
"publishLibrary": "انشر",
|
"publishLibrary": "",
|
||||||
"submit": "أرسل",
|
"submit": "إرسال",
|
||||||
"confirm": "تأكيد",
|
"confirm": "تأكيد",
|
||||||
"embeddableInteractionButton": "اضغط للتفاعل"
|
"embeddableInteractionButton": "اضغط للتفاعل"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟",
|
"clearReset": "هذا سيُزيل كامل اللوحة. هل أنت متأكد؟",
|
||||||
"couldNotCreateShareableLink": "تعذر إنشاء رابطة المشاركة.",
|
"couldNotCreateShareableLink": "تعذر إنشاء رابط المشاركة.",
|
||||||
"couldNotCreateShareableLinkTooBig": "تعذر إنشاء رابط قابل للمشاركة: المشهد كبير جدًا",
|
"couldNotCreateShareableLinkTooBig": "تعذر إنشاء رابط قابل للمشاركة: المشهد كبير جدًا",
|
||||||
"couldNotLoadInvalidFile": "تعذر التحميل، الملف غير صالح",
|
"couldNotLoadInvalidFile": "تعذر التحميل، الملف غير صالح",
|
||||||
"importBackendFailed": "فشل الاستيراد من الخادوم.",
|
"importBackendFailed": "فشل الاستيراد من الخادم.",
|
||||||
"cannotExportEmptyCanvas": "لا يمكن تصدير لوحة فارغة.",
|
"cannotExportEmptyCanvas": "لا يمكن تصدير لوحة فارغة.",
|
||||||
"couldNotCopyToClipboard": "تعذر النسخ إلى الحافظة.",
|
"couldNotCopyToClipboard": "تعذر النسخ إلى الحافظة.",
|
||||||
"decryptFailed": "تعذر فك تشفير البيانات.",
|
"decryptFailed": "تعذر فك تشفير البيانات.",
|
||||||
"uploadedSecurly": "تم تأمين التحميل بتشفير النهاية إلى النهاية، مما يعني أن خادوم Excalidraw والأطراف الثالثة لا يمكنها قراءة المحتوى.",
|
"uploadedSecurly": "تم تأمين التحميل بتشفير النهاية إلى النهاية، مما يعني أن خادم Excalidraw والأطراف الثالثة لا يمكنها قراءة المحتوى.",
|
||||||
"loadSceneOverridePrompt": "تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟",
|
"loadSceneOverridePrompt": "تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟",
|
||||||
"collabStopOverridePrompt": "إيقاف الجلسة سيؤدي إلى الكتابة فوق رسومك السابقة المخزنة داخليا. هل أنت متأكد؟\n\n(إذا كنت ترغب في الاحتفاظ برسمك المخزن داخليا، ببساطة أغلق علامة تبويب المتصفح بدلاً من ذلك.)",
|
"collabStopOverridePrompt": "إيقاف الجلسة سيؤدي إلى الكتابة فوق رسومك السابقة المخزنة داخليًا. هل أنت متأكد؟\n\n(إذا كنت ترغب في الاحتفاظ برسمك المخزن داخليًا، أغلق علامة تبويب المتصفح بدلاً من ذلك.)",
|
||||||
"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 حرفًا. التعاون المباشر معطل.",
|
||||||
"collabOfflineWarning": "لا يوجد اتصال بالانترنت.\nلن يتم حفظ التغييرات التي قمت بها!"
|
"collabOfflineWarning": "لا يوجد اتصال بالإنترنت.\nلن يتم حفظ التغييرات التي قمت بها!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "نوع الملف غير مدعوم.",
|
"unsupportedFileType": "نوع الملف غير مدعوم.",
|
||||||
"imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...",
|
"imageInsertError": "تعذر إدراج الصورة. حاول مرة أخرى لاحقًا...",
|
||||||
"fileTooBig": "الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.",
|
"fileTooBig": "الملف كبير جدًا. الحد الأقصى المسموح به للحجم هو {{maxSize}}.",
|
||||||
"svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.",
|
"svgImageInsertError": "تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "فشل تحميل الصورة.",
|
||||||
"invalidSVGString": "SVG غير صالح.",
|
|
||||||
"cannotResolveCollabServer": "تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.",
|
"cannotResolveCollabServer": "تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.",
|
||||||
"importLibraryError": "تعذر تحميل المكتبة",
|
"importLibraryError": "تعذر تحميل المكتبة",
|
||||||
"collabSaveFailed": "تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يفضل أن تحفظ ملفك محليا كي لا تفقد عملك.",
|
"saveLibraryError": "تعذر حفظ المكتبة. الرجاء حفظ المكتبة الخاصة بك في ملف محلي للتأكد من أنك لا تفقد التغييرات.",
|
||||||
"collabSaveFailed_sizeExceeded": "تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يفضّل حفظ الملف محليا كي لا تفقد عملك.",
|
"collabSaveFailed": "تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يُفضل حفظ ملفك محليًا كي لا تفقد عملك.",
|
||||||
"imageToolNotSupported": "",
|
"collabSaveFailed_sizeExceeded": "تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يُفضل حفظ الملف محليًا كي لا تفقد عملك.",
|
||||||
|
"imageToolNotSupported": "تم تعطيل الصور.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "يبدو أنك تستخدم متصفح Brave مع إعداد <bold>حظر صارم لتتبع البصمة</bold>.",
|
"line1": "يبدو أنك تستخدم متصفح Brave مع إعداد <bold>حظر صارم لتتبع البصمة</bold>.",
|
||||||
"line2": "قد يؤدي هذا إلى كسر <bold>عناصر النص</bold> في الرسومات الخاصة بك.",
|
"line2": "قد يؤدي هذا إلى كسر <bold>عناصر النص</bold> في الرسومات الخاصة بك.",
|
||||||
@@ -226,15 +283,16 @@
|
|||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.",
|
"embeddable": "لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.",
|
||||||
"iframe": "",
|
"iframe": "لا يمكن إضافة عناصر IFrame إلى المكتبة.",
|
||||||
"image": "سوف يتم دعم إضافة صور إلى المكتبة قريباً!"
|
"image": "سيتم دعم إضافة صور إلى المكتبة قريبًا!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "",
|
"asyncPasteFailedOnRead": "تعذر اللصق (تعذر القراءة من حافظة النظام).",
|
||||||
"asyncPasteFailedOnParse": "",
|
"asyncPasteFailedOnParse": "تعذر اللصق.",
|
||||||
"copyToSystemClipboardFailed": ""
|
"copyToSystemClipboardFailed": "تعذر النسخ إلى الحافظة."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "تحديد",
|
"selection": "تحديد",
|
||||||
|
"lasso": "",
|
||||||
"image": "إدراج صورة",
|
"image": "إدراج صورة",
|
||||||
"rectangle": "مستطيل",
|
"rectangle": "مستطيل",
|
||||||
"diamond": "مضلع",
|
"diamond": "مضلع",
|
||||||
@@ -245,17 +303,33 @@
|
|||||||
"text": "نص",
|
"text": "نص",
|
||||||
"library": "مكتبة",
|
"library": "مكتبة",
|
||||||
"lock": "الحفاظ على أداة التحديد نشطة بعد الرسم",
|
"lock": "الحفاظ على أداة التحديد نشطة بعد الرسم",
|
||||||
"penMode": "وضع القلم - امنع اللمس",
|
"penMode": "وضع القلم - منع اللمس",
|
||||||
"link": "إضافة/تحديث الرابط للشكل المحدد",
|
"link": "إضافة/تحديث الرابط للشكل المحدد",
|
||||||
"eraser": "ممحاة",
|
"eraser": "ممحاة",
|
||||||
"frame": "أداة الإطار",
|
"frame": "أداة الإطار",
|
||||||
"magicframe": "",
|
"magicframe": "Wireframe إلى كود",
|
||||||
"embeddable": "تضمين ويب",
|
"embeddable": "تضمين ويب",
|
||||||
"laser": "مؤشر ليزر",
|
"laser": "مؤشر ليزر",
|
||||||
"hand": "يد (أداة الإزاحة)",
|
"hand": "يد (أداة الإزاحة)",
|
||||||
"extraTools": "المزيد من أﻷدوات",
|
"extraTools": "المزيد من الأدوات",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "من Mermaid إلى Excalidraw",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "مستطيل",
|
||||||
|
"diamond": "مضلع",
|
||||||
|
"ellipse": "دائرة",
|
||||||
|
"arrow": "سهم",
|
||||||
|
"line": "خط",
|
||||||
|
"freedraw": "رسم حر",
|
||||||
|
"text": "نص",
|
||||||
|
"image": "صورة",
|
||||||
|
"group": "مجموعة",
|
||||||
|
"frame": "إطار",
|
||||||
|
"magicframe": "Wireframe إلى كود",
|
||||||
|
"embeddable": "تضمين ويب",
|
||||||
|
"selection": "تحديد",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "إجراءات اللوحة",
|
"canvasActions": "إجراءات اللوحة",
|
||||||
@@ -263,103 +337,115 @@
|
|||||||
"shapes": "الأشكال"
|
"shapes": "الأشكال"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "لتحريك القماش، اضغط على عجلة الفأرة أو مفتاح المسافة أثناء السحب، أو استخدم أداة اليد",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
|
"linearElement": "انقر لبدء نقاط متعددة، اسحب لخط واحد",
|
||||||
"freeDraw": "انقر واسحب، افرج عند الانتهاء",
|
"arrowTool": "",
|
||||||
|
"freeDraw": "انقر واسحب، أفرج عند الانتهاء",
|
||||||
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
|
"text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار",
|
||||||
"embeddable": "اضغط مع السحب لإنشاء موقع ويب مضمّن",
|
"embeddable": "اضغط مع السحب لإنشاء موقع ويب مضمّن",
|
||||||
"text_selected": "انقر نقراً مزدوجاً أو اضغط ادخال لتعديل النص",
|
"text_selected": "",
|
||||||
"text_editing": "اضغط على Esc أو (Ctrl أو Cmd) + Enter لإنهاء التعديل",
|
"text_editing": "",
|
||||||
"linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "يمكنك تقييد الزاوية بالضغط على SHIFT",
|
"lockAngle": "",
|
||||||
"resize": "يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،\nاضغط على ALT لتغيير الحجم من المركز",
|
"resize": "",
|
||||||
"resizeImage": "يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،\nاضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز",
|
"resizeImage": "",
|
||||||
"rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران",
|
"rotate": "",
|
||||||
"lineEditor_info": "اضغط على مفتاح (Ctrl أو Cmd) و انقر بشكل مزدوج، أو اضغط على مفتاحي (Ctrl أو Cmd) و (Enter) لتعديل النقاط",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "اضغط على حذف لإزالة النقطة (النِّقَاط)، Ctrl/Cmd+D للتكرار، أو اسحب للانتقال",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "اختر نقطة لتعديلها (اضغط على SHIFT لتحديد عدة نِقَاط),\nأو اضغط على ALT و انقر بالفأرة لإضافة نِقَاط جديدة",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "انقر لوضع الصورة، أو انقر واسحب لتعيين حجمها يدوياً",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "نشر مكتبتك",
|
"publishLibrary": "نشر مكتبتك",
|
||||||
"bindTextToElement": "اضغط على إدخال لإضافة نص",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "اضغط على Ctrl\\Cmd للاختيار العميق، ولمنع السحب",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "اضغط على Alt لاستعادة العناصر المعلَّمة للحذف",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "يمكن على الأرجح تمكين هذه الميزة عن طريق تعيين علم \"dom.events.asyncClipboard.clipboardItem\" إلى \"true\". لتغيير أعلام المتصفح في Firefox، قم بزيارة صفحة \"about:config\".",
|
"firefox_clipboard_write": "يمكن على الأرجح تمكين هذه الميزة عن طريق تعيين علم \"dom.events.asyncClipboard.clipboardItem\" إلى \"true\". لتغيير أعلام المتصفح في Firefox، قم بزيارة صفحة \"about:config\".",
|
||||||
"disableSnapping": "اضغط على Ctrl أو Cmd لتعطيل الالتقاط"
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "تعذر عرض المعاينة",
|
"cannotShowPreview": "تعذر عرض المعاينة",
|
||||||
"canvasTooBig": "قد تكون اللوحة كبيرة جداً.",
|
"canvasTooBig": "قد تكون اللوحة كبيرة جدًا.",
|
||||||
"canvasTooBigTip": "نصيحة: حاول تحريك العناصر البعيدة بشكل أقرب قليلاً."
|
"canvasTooBigTip": "نصيحة: حاول تحريك العناصر البعيدة بشكل أقرب قليلاً."
|
||||||
},
|
},
|
||||||
"errorSplash": {
|
"errorSplash": {
|
||||||
"headingMain": "حدث خطأ. حاول <button>تحديث الصفحة</button>.",
|
"headingMain": "حدث خطأ. حاول <button>تحديث الصفحة</button>.",
|
||||||
"clearCanvasMessage": "إذا لم تعمل إعادة التحميل، حاول مرة أخرى ",
|
"clearCanvasMessage": "إذا لم تعمل إعادة التحميل، حاول مرة أخرى ",
|
||||||
"clearCanvasCaveat": " هذا سيؤدي إلى فقدان العمل ",
|
"clearCanvasCaveat": "هذا سيؤدي إلى فقدان العمل",
|
||||||
"trackedToSentry": "تم تتبع الخطأ في المعرف {{eventId}} على نظامنا.",
|
"trackedToSentry": "تم تتبع الخطأ في المعرف {{eventId}} على نظامنا.",
|
||||||
"openIssueMessage": "حرصنا على عدم إضافة معلومات المشهد في بلاغ الخطأ. في حال كون مشهدك لا يحمل أي معلومات خاصة نرجو المتابعة على <button>نظام تتبع الأخطاء</button>. نرجو إضافة المعلومات أدناه بنسخها ولصقها في محتوى البلاغ على GitHub.",
|
"openIssueMessage": "حرصنا على عدم إضافة معلومات المشهد في بلاغ الخطأ. في حال كون مشهدك لا يحمل أي معلومات خاصة، نرجو المتابعة على <button>نظام تتبع الأخطاء</button>. نرجو إضافة المعلومات أدناه بنسخها ولصقها في محتوى البلاغ على GitHub.",
|
||||||
"sceneContent": "محتوى المشهد:"
|
"sceneContent": "محتوى المشهد:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "أو"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "يمكنك دعوة الآخرين لمشاركتك نفس الجلسة التي تعمل عليها.",
|
"desc_intro": "ادعُ الأشخاص للتعاون في الرسم الخاص بك.",
|
||||||
"desc_privacy": "لا تقلق، الجلسة تستخدم التشفير من النهاية إلى النهاية، لذلك فإن أي شيء ترسمه سيبقى خاصاً. لن يتمكن حتى الخادوم الخاص بنا من رؤية ما توصلت إليه.",
|
"desc_privacy": "لا تقلق، الجلسة مشفرة من النهاية إلى النهاية وخصوصية تمامًا. حتى خادمنا لا يستطيع رؤية ما ترسمه.",
|
||||||
"button_startSession": "بدء الجلسة",
|
"button_startSession": "بدء الجلسة",
|
||||||
"button_stopSession": "إيقاف الجلسة",
|
"button_stopSession": "إيقاف الجلسة",
|
||||||
"desc_inProgressIntro": "تجري الآن المشاركة الحية.",
|
"desc_inProgressIntro": "تجري الآن جلسة تعاون مباشرة.",
|
||||||
"desc_shareLink": "شارك هذا الرابط مع أي شخص تريده أن يشاركك الجلسة:",
|
"desc_shareLink": "شارك هذا الرابط مع أي شخص تريده أن يشاركك الجلسة:",
|
||||||
"desc_exitSession": "إيقاف الجلسة سيؤدي إلى قطع الاتصال الخاص بك من الغرفة، ولكن ستتمكن من مواصلة العمل مع المشهد، محليا. لاحظ أن هذا لن يؤثر على الأشخاص الآخرين، و سيظلون قادرين على التعاون في إصدارهم.",
|
"desc_exitSession": "إيقاف الجلسة سيؤدي إلى قطع الاتصال الخاص بك من الغرفة، ولكن ستتمكن من مواصلة العمل مع المشهد محليًا. لاحظ أن هذا لن يؤثر على الأشخاص الآخرين، وسيظلون قادرين على التعاون في إصدارهم.",
|
||||||
"shareTitle": "الانضمام إلى جلسة تعاون حية على Excalidraw"
|
"shareTitle": "الانضمام إلى جلسة تعاون مباشرة على Excalidraw"
|
||||||
},
|
},
|
||||||
"errorDialog": {
|
"errorDialog": {
|
||||||
"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": "حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك.",
|
"excalidrawplus_description": "حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك.",
|
||||||
"excalidrawplus_button": "تصدير",
|
"excalidrawplus_button": "تصدير",
|
||||||
"excalidrawplus_exportError": "تعذر التصدير إلى +Excalidraw في الوقت الحالي..."
|
"excalidrawplus_exportError": "تعذر التص несп في الوقت الحالي إلى +Excalidraw..."
|
||||||
},
|
},
|
||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "اقرأ مدونتنا",
|
"blog": "اقرأ مدونتنا",
|
||||||
"click": "انقر",
|
"click": "انقر",
|
||||||
"deepSelect": "تحديد عميق",
|
"deepSelect": "تحديد عميق",
|
||||||
"deepBoxSelect": "تحديد عميق داخل المربع، ومنع السحب",
|
"deepBoxSelect": "تحديد عميق داخل المربع، ومنع السحب",
|
||||||
"curvedArrow": "سهم مائل",
|
"createFlowchart": "إنشاء مخطط تدفق من عنصر عام",
|
||||||
"curvedLine": "خط مائل",
|
"navigateFlowchart": "التنقل في مخطط تدفق",
|
||||||
|
"curvedArrow": "سهم منحني",
|
||||||
|
"curvedLine": "خط منحني",
|
||||||
"documentation": "دليل الاستخدام",
|
"documentation": "دليل الاستخدام",
|
||||||
"doubleClick": "انقر مرتين",
|
"doubleClick": "انقر مرتين",
|
||||||
"drag": "اسحب",
|
"drag": "اسحب",
|
||||||
"editor": "المحرر",
|
"editor": "المحرر",
|
||||||
"editLineArrowPoints": "تحرير سطر/نقاط سهم",
|
"editLineArrowPoints": "تحرير نقاط السطر/السهم",
|
||||||
"editText": "تعديل النص / إضافة تسمية",
|
"editText": "تعديل النص / إضافة تسمية",
|
||||||
"github": "عثرت على مشكلة؟ إرسال",
|
"github": "عثرت على مشكلة؟ أرسل",
|
||||||
"howto": "اتبع التعليمات",
|
"howto": "اتبع التعليمات",
|
||||||
"or": "أو",
|
"or": "أو",
|
||||||
"preventBinding": "منع ارتبط السهم",
|
"preventBinding": "منع ارتباط السهم",
|
||||||
"tools": "الأدوات",
|
"tools": "الأدوات",
|
||||||
"shortcuts": "اختصارات لوحة المفاتيح",
|
"shortcuts": "اختصارات لوحة المفاتيح",
|
||||||
"textFinish": "إنهاء التعديل (محرر النص)",
|
"textFinish": "إنهاء التعديل (محرر النص)",
|
||||||
"textNewLine": "أضف سطر جديد (محرر نص)",
|
"textNewLine": "إضافة سطر جديد (محرر النص)",
|
||||||
"title": "المساعدة",
|
"title": "المساعدة",
|
||||||
"view": "عرض",
|
"view": "عرض",
|
||||||
"zoomToFit": "تكبير للملائمة",
|
"zoomToFit": "تكبير للملائمة",
|
||||||
"zoomToSelection": "تكبير للعنصر المحدد",
|
"zoomToSelection": "تكبير للعنصر المحدد",
|
||||||
"toggleElementLock": "إغلاق/فتح المحدد",
|
"toggleElementLock": "قفل/فتح المحدد",
|
||||||
"movePageUpDown": "نقل الصفحة أعلى/أسفل",
|
"movePageUpDown": "نقل الصفحة أعلى/أسفل",
|
||||||
"movePageLeftRight": "نقل الصفحة يسار/يمين"
|
"movePageLeftRight": "نقل الصفحة يسار/يمين",
|
||||||
|
"cropStart": "بدء قص الصورة",
|
||||||
|
"cropFinish": "إنهاء قص الصورة"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "مسح اللوحة"
|
"title": "مسح اللوحة"
|
||||||
},
|
},
|
||||||
"publishDialog": {
|
"publishDialog": {
|
||||||
"title": "نشر المكتبة",
|
"title": "نشر المكتبة",
|
||||||
"itemName": "إسم العنصر",
|
"itemName": "اسم العنصر",
|
||||||
"authorName": "إسم المؤلف",
|
"authorName": "اسم المؤلف",
|
||||||
"githubUsername": "اسم المستخدم في جيت هب",
|
"githubUsername": "اسم المستخدم في GitHub",
|
||||||
"twitterUsername": "اسم المستخدم في تويتر",
|
"twitterUsername": "اسم المستخدم في تويتر",
|
||||||
"libraryName": "اسم المكتبة",
|
"libraryName": "اسم المكتبة",
|
||||||
"libraryDesc": "وصف المكتبة",
|
"libraryDesc": "وصف المكتبة",
|
||||||
@@ -368,24 +454,24 @@
|
|||||||
"authorName": "اسمك أو اسم المستخدم",
|
"authorName": "اسمك أو اسم المستخدم",
|
||||||
"libraryName": "اسم مكتبتك",
|
"libraryName": "اسم مكتبتك",
|
||||||
"libraryDesc": "وصف مكتبتك لمساعدة الناس على فهم استخدامها",
|
"libraryDesc": "وصف مكتبتك لمساعدة الناس على فهم استخدامها",
|
||||||
"githubHandle": "معالج GitHub (اختياري)، حتى تتمكن من تحرير المكتبة عند إرسالها للمراجعة",
|
"githubHandle": "معرف GitHub (اختياري)، حتى تتمكن من تحرير المكتبة عند إرسالها للمراجعة",
|
||||||
"twitterHandle": "اسم مستخدم تويتر (اختياري)، حتى نعرف من الذي سيتم الإشارة إليه عند الترويج عبر تويتر",
|
"twitterHandle": "اسم مستخدم تويتر (اختياري)، حتى نعرف من الذي سيتم الإشارة إليه عند الترويج عبر تويتر",
|
||||||
"website": "رابط إلى موقعك الشخصي أو في مكان آخر (اختياري)"
|
"website": "رابط إلى موقعك الشخصي أو مكان آخر (اختياري)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "مطلوب",
|
"required": "مطلوب",
|
||||||
"website": "أدخل عنوان URL صالح"
|
"website": "أدخل عنوان URL صالح"
|
||||||
},
|
},
|
||||||
"noteDescription": "تقديم مكتبتك لتضمينها في مستودع المكتبة العامة <link></link> لأشخاص آخرين لاستخدامها في رسومهم.",
|
"noteDescription": "تقديم مكتبتك لتضمينها في مستودع المكتبة العامة <link></link> ليستخدمها الآخرون في رسوماتهم.",
|
||||||
"noteGuidelines": "تحتاج المكتبة إلى الموافقة أولا. يرجى قراءة <link>المعايير</link> قبل تقديمها. سوف تحتاج إلى حساب GitHub للتواصل وإجراء التغييرات عند الطلب، ولكن ليس مطلوبا بشكل صارم.",
|
"noteGuidelines": "تحتاج المكتبة إلى الموافقة أولاً. يرجى قراءة <link>المعايير</link> قبل تقديمها. ستحتاج إلى حساب GitHub للتواصل وإجراء التغييرات عند الطلب، ولكنه ليس مطلوبًا بشكل صارم.",
|
||||||
"noteLicense": "تقديمك يعني موافقتك على نشر المكتبة المقدمة تحت <link>MIT ترخيص</link>، ما يعني أن لأي أحد الحق في استخدامها دون قيود.",
|
"noteLicense": "تقديمك يعني موافقتك على نشر المكتبة المقدمة تحت <link>ترخيص MIT</link>، مما يعني أن لأي شخص الحق في استخدامها دون قيود.",
|
||||||
"noteItems": "يجب أن يكون لكل عنصر مكتبة اسمه الخاص حتى يكون قابلاً للتصفية. سيتم تضمين عناصر المكتبة التالية:",
|
"noteItems": "يجب أن يكون لكل عنصر مكتبة اسم خاص به ليكون قابلًا للتصفية. سيتم تضمين عناصر المكتبة التالية:",
|
||||||
"atleastOneLibItem": "يرجى تحديد عنصر مكتبة واحد على الأقل للبدء",
|
"atleastOneLibItem": "يرجى تحديد عنصر مكتبة واحد على الأقل للبدء",
|
||||||
"republishWarning": "ملاحظة: بعض العناصر المحددة معينة على أنه نشرها أو تقديمها من قبل. يجب عليك فقط إعادة إرسال العناصر عند تحديث مكتبة موجودة أو إرسالها."
|
"republishWarning": "ملاحظة: بعض العناصر المحددة معينة على أنها نُشرت أو قُدمت من قبل. يجب عليك فقط إعادة إرسال العناصر عند تحديث مكتبة موجودة أو إرسالها."
|
||||||
},
|
},
|
||||||
"publishSuccessDialog": {
|
"publishSuccessDialog": {
|
||||||
"title": "تم إرسال المكتبة",
|
"title": "تم إرسال المكتبة",
|
||||||
"content": "شكرا لك {{authorName}}. لقد تم إرسال مكتبتك للمراجعة. يمكنك تتبع الحالة"
|
"content": "شكرًا لك {{authorName}}. لقد تم إرسال مكتبتك للمراجعة. يمكنك تتبع الحالة"
|
||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "إعادة ضبط المكتبة",
|
"resetLibrary": "إعادة ضبط المكتبة",
|
||||||
@@ -394,15 +480,15 @@
|
|||||||
"imageExportDialog": {
|
"imageExportDialog": {
|
||||||
"header": "تصدير الصورة",
|
"header": "تصدير الصورة",
|
||||||
"label": {
|
"label": {
|
||||||
"withBackground": "الخلفية",
|
"withBackground": "مع الخلفية",
|
||||||
"onlySelected": "المحدد فقط",
|
"onlySelected": "المحدد فقط",
|
||||||
"darkMode": "الوضع الداكن",
|
"darkMode": "الوضع الداكن",
|
||||||
"embedScene": "تضمين المشهد",
|
"embedScene": "تضمين المشهد",
|
||||||
"scale": "الحجم",
|
"scale": "المقياس",
|
||||||
"padding": "الهوامش"
|
"padding": "الهوامش"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"embedScene": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.\nسيزيد حجم الملف المصدر."
|
"embedScene": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدر بحيث يمكن استعادة المشهد منه.\nسيزيد هذا من حجم الملف المصدر."
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"exportToPng": "تصدير بصيغة PNG",
|
"exportToPng": "تصدير بصيغة PNG",
|
||||||
@@ -416,18 +502,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
"tooltip": "رسوماتك مشفرة من النهاية إلى النهاية حتى أن خوادم Excalidraw لن تراها أبدا.",
|
"tooltip": "رسوماتك مشفرة من النهاية إلى النهاية، لذا لا يمكن لخوادم Excalidraw رؤيتها أبدًا.",
|
||||||
"link": "مشاركة المدونة في التشفير من النهاية إلى النهاية في Excalidraw"
|
"link": "مشاركة المدونة حول التشفير من النهاية إلى النهاية في Excalidraw"
|
||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "الزاوية",
|
"angle": "الزاوية",
|
||||||
"element": "عنصر",
|
"shapes": "الأشكال",
|
||||||
"elements": "العناصر",
|
|
||||||
"height": "الارتفاع",
|
"height": "الارتفاع",
|
||||||
"scene": "المشهد",
|
"scene": "المشهد",
|
||||||
"selected": "المحدد",
|
"selected": "المحدد",
|
||||||
"storage": "التخزين",
|
"storage": "التخزين",
|
||||||
"title": "إحصائيات للمهووسين",
|
"fullTitle": "خصائص اللوحة والأشكال",
|
||||||
|
"title": "الخصائص",
|
||||||
|
"generalStats": "عام",
|
||||||
|
"elementProperties": "خصائص الشكل",
|
||||||
"total": "المجموع",
|
"total": "المجموع",
|
||||||
"version": "الإصدار",
|
"version": "الإصدار",
|
||||||
"versionCopy": "انقر للنسخ",
|
"versionCopy": "انقر للنسخ",
|
||||||
@@ -435,17 +523,19 @@
|
|||||||
"width": "العرض"
|
"width": "العرض"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "تمت الاضافة الى المكتبة!",
|
"addedToLibrary": "تمت الإضافة إلى المكتبة!",
|
||||||
"copyStyles": "نسخت الانماط.",
|
"copyStyles": "تم نسخ الأنماط.",
|
||||||
"copyToClipboard": "نسخ إلى الحافظة.",
|
"copyToClipboard": "تم النسخ إلى الحافظة.",
|
||||||
"copyToClipboardAsPng": "تم نسخ {{exportSelection}} إلى الحافظة بصيغة PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "تم نسخ {{exportSelection}} إلى الحافظة بصيغة PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "تم نسخ {{exportSelection}} إلى الحافظة بصيغة SVG\n({{exportColorScheme}})",
|
||||||
"fileSaved": "تم حفظ الملف.",
|
"fileSaved": "تم حفظ الملف.",
|
||||||
"fileSavedToFilename": "حفظ باسم {filename}",
|
"fileSavedToFilename": "تم الحفظ باسم {filename}",
|
||||||
"canvas": "لوحة الرسم",
|
"canvas": "لوحة الرسم",
|
||||||
"selection": "العنصر المحدد",
|
"selection": "العنصر المحدد",
|
||||||
"pasteAsSingleElement": "استخدم {{shortcut}} للصق كعنصر واحد،\nأو لصق في محرر نص موجود",
|
"pasteAsSingleElement": "استخدم {{shortcut}} للصق كعنصر واحد،\nأو لصق في محرر نص موجود",
|
||||||
"unableToEmbed": "تضمين هذا الرابط غير مسموح حاليًا. افتح بلاغاً على GitHub لطلب عنوان Url القائمة البيضاء",
|
"unableToEmbed": "تضمين هذا الرابط غير مسموح حاليًا. افتح بلاغًا على GitHub لطلب إدراج عنوان URL في القائمة البيضاء",
|
||||||
"unrecognizedLinkFormat": "الرابط الذي ضمنته لا يتطابق مع التنسيق المتوقع. الرجاء محاولة لصق النص 'المضمن' المُزوَد من موقع المصدر"
|
"unrecognizedLinkFormat": "الرابط الذي أدرجته لا يتطابق مع التنسيق المتوقع. الرجاء محاولة لصق النص 'المضمن' المُزوَد من موقع المصدر",
|
||||||
|
"elementLinkCopied": "تم نسخ الرابط إلى الحافظة"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "شفاف",
|
"transparent": "شفاف",
|
||||||
@@ -466,19 +556,20 @@
|
|||||||
},
|
},
|
||||||
"welcomeScreen": {
|
"welcomeScreen": {
|
||||||
"app": {
|
"app": {
|
||||||
"center_heading": "جميع بياناتك محفوظة محليا في المتصفح الخاص بك.",
|
"center_heading": "جميع بياناتك محفوظة محليًا في المتصفح الخاص بك.",
|
||||||
"center_heading_plus": "هل تريد الذهاب إلى Excalidraw+ بدلاً من ذلك؟",
|
"center_heading_plus": "هل تريد الانتقال إلى Excalidraw+ بدلاً من ذلك؟",
|
||||||
"menuHint": "التصدير والتفضيلات واللغات ..."
|
"menuHint": "التصدير، التفضيلات، اللغات..."
|
||||||
},
|
},
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"menuHint": "التصدير والتفضيلات وغيرها...",
|
"menuHint": "التصدير، التفضيلات، وغيرها...",
|
||||||
"center_heading": "الرسم البياني التصويري. بشكل مبسط.",
|
"center_heading": "الرسم البياني التصويري، ببساطة.",
|
||||||
"toolbarHint": "اختر أداة و ابدأ الرسم!",
|
"toolbarHint": "اختر أداة وابدأ الرسم!",
|
||||||
"helpHint": "الاختصارات و المساعدة"
|
"helpHint": "الاختصارات والمساعدة"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
"mostUsedCustomColors": "الألوان المخصصة الأكثر استخداما",
|
"color": "",
|
||||||
|
"mostUsedCustomColors": "الألوان المخصصة الأكثر استخدامًا",
|
||||||
"colors": "الألوان",
|
"colors": "الألوان",
|
||||||
"shades": "الدرجات",
|
"shades": "الدرجات",
|
||||||
"hexCode": "رمز Hex",
|
"hexCode": "رمز Hex",
|
||||||
@@ -489,12 +580,12 @@
|
|||||||
"exportToImage": {
|
"exportToImage": {
|
||||||
"title": "تصدير كصورة",
|
"title": "تصدير كصورة",
|
||||||
"button": "تصدير كصورة",
|
"button": "تصدير كصورة",
|
||||||
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً."
|
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقًا."
|
||||||
},
|
},
|
||||||
"saveToDisk": {
|
"saveToDisk": {
|
||||||
"title": "حفظ الملف للجهاز",
|
"title": "حفظ الملف على الجهاز",
|
||||||
"button": "حفظ الملف للجهاز",
|
"button": "حفظ الملف على الجهاز",
|
||||||
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً."
|
"description": "تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقًا."
|
||||||
},
|
},
|
||||||
"excalidrawPlus": {
|
"excalidrawPlus": {
|
||||||
"title": "Excalidraw+",
|
"title": "Excalidraw+",
|
||||||
@@ -511,15 +602,63 @@
|
|||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "تحميل من رابط",
|
"title": "تحميل من رابط",
|
||||||
"button": "استبدال محتواي",
|
"button": "استبدال محتواي",
|
||||||
"description": "سيتسبب تحميل رسمة خارجية <bold>باستبدال محتواك الموجود حالياً</bold>.<br></br>بإمكانك إجراء النسخ الاحتياطي لرسمتك الحالية باستخدام أحد الخيارات أدناه."
|
"description": "سيتسبب تحميل رسمة خارجية <bold>باستبدال محتواك الموجود حاليًا</bold>.<br></br>بإمكانك إجراء النسخ الاحتياطي لرسمتك الحالية باستخدام أحد الخيارات أدناه."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "Mermaid إلى Excalidraw",
|
||||||
"button": "",
|
"button": "إدراج",
|
||||||
"description": "",
|
"description": "حاليًا، يتم دعم <flowchartLink>مخططات التدفق</flowchartLink>، <sequenceLink>التسلسلات</sequenceLink>، و<classLink>الفئات</classLink> فقط. سيتم عرض الأنواع الأخرى كصورة في Excalidraw.",
|
||||||
"syntax": "",
|
"syntax": "صيغة Mermaid",
|
||||||
"preview": ""
|
"preview": "معاينة"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "بحث سريع"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "قديم"
|
||||||
|
},
|
||||||
|
"sceneFonts": "في هذا المشهد",
|
||||||
|
"availableFonts": "الخطوط المتوفرة",
|
||||||
|
"empty": "لم يتم العثور على خطوط"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "لم يتم العثور على مستخدمين",
|
||||||
|
"hint": {
|
||||||
|
"text": "انقر على المستخدم للمتابعة",
|
||||||
|
"followStatus": "أنت حاليًا تتابع هذا المستخدم",
|
||||||
|
"inCall": "المستخدم في مكالمة صوتية",
|
||||||
|
"micMuted": "ميكروفون المستخدم مكتم",
|
||||||
|
"isSpeaking": "المستخدم يتحدث"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "لوحة الأوامر",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "اختر",
|
||||||
|
"confirm": "تأكيد",
|
||||||
|
"close": "إغلاق"
|
||||||
|
},
|
||||||
|
"recents": "المستخدمة مؤخرًا",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "ابحث في القوائم، الأوامر، واكتشف الجواهر المخفية",
|
||||||
|
"noMatch": "لا توجد أوامر مطابقة..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "الأمر غير متوفر...",
|
||||||
|
"shortcutHint": "للحصول على لوحة الأوامر، استخدم {{shortcut}}"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "PNG olaraq panoya kopyala",
|
"copyAsPng": "PNG olaraq panoya kopyala",
|
||||||
"copyAsSvg": "SVG olaraq panoya kopyala",
|
"copyAsSvg": "SVG olaraq panoya kopyala",
|
||||||
"copyText": "Mətn olaraq panoya kopyala",
|
"copyText": "Mətn olaraq panoya kopyala",
|
||||||
"copySource": "",
|
"copySource": "Mənbəni kopyala",
|
||||||
"convertToCode": "",
|
"convertToCode": "Koda çevir",
|
||||||
"bringForward": "Önə daşı",
|
"bringForward": "Önə daşı",
|
||||||
"sendToBack": "Geriyə göndərin",
|
"sendToBack": "Geriyə göndərin",
|
||||||
"bringToFront": "Önə gətirin",
|
"bringToFront": "Önə gətirin",
|
||||||
@@ -21,11 +21,13 @@
|
|||||||
"copyStyles": "Stilləri kopyalayın",
|
"copyStyles": "Stilləri kopyalayın",
|
||||||
"pasteStyles": "Stilləri yapışdırın",
|
"pasteStyles": "Stilləri yapışdırın",
|
||||||
"stroke": "Strok rəngi",
|
"stroke": "Strok rəngi",
|
||||||
|
"changeStroke": "Ştrix rəngini dəyişdir",
|
||||||
"background": "Arxa fon",
|
"background": "Arxa fon",
|
||||||
|
"changeBackground": "Fon rəngini dəyişdir",
|
||||||
"fill": "Doldur",
|
"fill": "Doldur",
|
||||||
"strokeWidth": "Strok eni",
|
"strokeWidth": "Strok eni",
|
||||||
"strokeStyle": "Strok stili",
|
"strokeStyle": "Strok stili",
|
||||||
"strokeStyle_solid": "Solid",
|
"strokeStyle_solid": "Qatı",
|
||||||
"strokeStyle_dashed": "Kəsik",
|
"strokeStyle_dashed": "Kəsik",
|
||||||
"strokeStyle_dotted": "Nöqtəli",
|
"strokeStyle_dotted": "Nöqtəli",
|
||||||
"sloppiness": "Səliqəsizlik",
|
"sloppiness": "Səliqəsizlik",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Heç biri",
|
"arrowhead_none": "Heç biri",
|
||||||
"arrowhead_arrow": "Ox",
|
"arrowhead_arrow": "Ox",
|
||||||
"arrowhead_bar": "Çubuq",
|
"arrowhead_bar": "Çubuq",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Dairə",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Çevrə (Kontur)",
|
||||||
"arrowhead_triangle": "Üçbucaq",
|
"arrowhead_triangle": "Üçbucaq",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Üçbucaq (kontur)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Almaz",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Almaz (kontur)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "",
|
||||||
|
"arrowtype_sharp": "",
|
||||||
|
"arrowtype_round": "",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
"fontSize": "Şrift ölçüsü",
|
"fontSize": "Şrift ölçüsü",
|
||||||
"fontFamily": "Şrift qrupu",
|
"fontFamily": "Şrift qrupu",
|
||||||
"addWatermark": "\"Made with Excalidraw\" əlavə et",
|
"addWatermark": "\"Made with Excalidraw\" əlavə et",
|
||||||
@@ -54,7 +64,7 @@
|
|||||||
"medium": "Orta",
|
"medium": "Orta",
|
||||||
"large": "Böyük",
|
"large": "Böyük",
|
||||||
"veryLarge": "Çox böyük",
|
"veryLarge": "Çox böyük",
|
||||||
"solid": "Solid",
|
"solid": "Qatı",
|
||||||
"hachure": "Ştrix",
|
"hachure": "Ştrix",
|
||||||
"zigzag": "Ziqzaq",
|
"zigzag": "Ziqzaq",
|
||||||
"crossHatch": "Çarpaz dəlik",
|
"crossHatch": "Çarpaz dəlik",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Kanvas üzərində istifadə olunur",
|
"canvasColors": "Kanvas üzərində istifadə olunur",
|
||||||
"canvasBackground": "Kanvas arxa fonu",
|
"canvasBackground": "Kanvas arxa fonu",
|
||||||
"drawingCanvas": "Kanvas çəkmək",
|
"drawingCanvas": "Kanvas çəkmək",
|
||||||
|
"clearCanvas": "Lövhəni təmizlə",
|
||||||
"layers": "Qatlar",
|
"layers": "Qatlar",
|
||||||
"actions": "Hərəkətlər",
|
"actions": "Hərəkətlər",
|
||||||
"language": "Dil",
|
"language": "Dil",
|
||||||
@@ -83,48 +94,56 @@
|
|||||||
"madeWithExcalidraw": "Excalidraw ilə hazırlanmışdır",
|
"madeWithExcalidraw": "Excalidraw ilə hazırlanmışdır",
|
||||||
"group": "Qrup şəklində seçim",
|
"group": "Qrup şəklində seçim",
|
||||||
"ungroup": "Qrupsuz seçim",
|
"ungroup": "Qrupsuz seçim",
|
||||||
"collaborators": "",
|
"collaborators": "Əməkdaşlar",
|
||||||
"showGrid": "",
|
"toggleGrid": "Toru dəyiş",
|
||||||
"addToLibrary": "",
|
"addToLibrary": "Kitabxanaya əlavə et",
|
||||||
"removeFromLibrary": "",
|
"removeFromLibrary": "Kitabxanadan sil",
|
||||||
"libraryLoadingMessage": "",
|
"libraryLoadingMessage": "Kitabxana yüklənir...",
|
||||||
"libraries": "",
|
"libraries": "Kitabxanalara bax",
|
||||||
"loadingScene": "",
|
"loadingScene": "Səhnə yüklənir...",
|
||||||
"align": "",
|
"loadScene": "Səhnəni fayldan yüklə",
|
||||||
"alignTop": "",
|
"align": "Hizala",
|
||||||
"alignBottom": "",
|
"alignTop": "Yuxarı hizala",
|
||||||
"alignLeft": "",
|
"alignBottom": "Aşağı hizala",
|
||||||
"alignRight": "",
|
"alignLeft": "Sola hizala",
|
||||||
"centerVertically": "",
|
"alignRight": "Sağa hizala",
|
||||||
"centerHorizontally": "",
|
"centerVertically": "Şaquli ortala",
|
||||||
"distributeHorizontally": "",
|
"centerHorizontally": "Üfüqi ortala",
|
||||||
"distributeVertically": "",
|
"distributeHorizontally": "Üfüqi payla",
|
||||||
"flipHorizontal": "",
|
"distributeVertically": "Şaquli payla",
|
||||||
"flipVertical": "",
|
"flipHorizontal": "Üfüqi çevir",
|
||||||
"viewMode": "",
|
"flipVertical": "Şaquli çevir",
|
||||||
"share": "",
|
"viewMode": "Görünüş Rejimi",
|
||||||
"showStroke": "",
|
"share": "Paylaş",
|
||||||
"showBackground": "",
|
"showStroke": "Çevrə rəng seçimini göstər",
|
||||||
"toggleTheme": "",
|
"showBackground": "Fon rəng seçimini göstər",
|
||||||
"personalLib": "",
|
"showFonts": "",
|
||||||
"excalidrawLib": "",
|
"toggleTheme": "Gecə/Güzdüz rejiminə dəyiş",
|
||||||
"decreaseFontSize": "",
|
"theme": "Fon",
|
||||||
"increaseFontSize": "",
|
"personalLib": "Şəxsi kitabxana",
|
||||||
"unbindText": "",
|
"excalidrawLib": "Excalidraw kitabxanası",
|
||||||
"bindText": "",
|
"decreaseFontSize": "Şrift ölçüsünü azalt",
|
||||||
"createContainerFromText": "",
|
"increaseFontSize": "Şrift ölçüsünü artır",
|
||||||
|
"unbindText": "Mətni çıxar",
|
||||||
|
"bindText": "Mətni konteynerə qoş",
|
||||||
|
"createContainerFromText": "Mətni konteynerə bük",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "",
|
"edit": "Keçidi düzəliş et",
|
||||||
"editEmbed": "",
|
"editEmbed": "",
|
||||||
"create": "",
|
"create": "",
|
||||||
"createEmbed": "",
|
"label": "Keçid",
|
||||||
"label": "",
|
|
||||||
"labelEmbed": "",
|
"labelEmbed": "",
|
||||||
"empty": ""
|
"empty": "",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "",
|
"edit": "",
|
||||||
"exit": ""
|
"editArrow": ""
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "",
|
"lock": "",
|
||||||
@@ -138,12 +157,46 @@
|
|||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "",
|
||||||
"eyeDropper": "",
|
"eyeDropper": "",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "",
|
||||||
"prompt": ""
|
"prompt": "",
|
||||||
|
"followUs": "",
|
||||||
|
"discordChat": "",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"installPWA": "",
|
||||||
|
"autoResize": "",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "",
|
"noItems": "",
|
||||||
"hint_emptyLibrary": "",
|
"hint_emptyLibrary": "",
|
||||||
"hint_emptyPrivateLibrary": ""
|
"hint_emptyPrivateLibrary": "",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "",
|
"clearReset": "",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "",
|
"exportImage": "",
|
||||||
"export": "",
|
"export": "",
|
||||||
"copyToClipboard": "",
|
"copyToClipboard": "",
|
||||||
|
"copyLink": "",
|
||||||
"save": "",
|
"save": "",
|
||||||
"saveAs": "",
|
"saveAs": "",
|
||||||
"load": "",
|
"load": "",
|
||||||
@@ -171,40 +225,43 @@
|
|||||||
"fullScreen": "",
|
"fullScreen": "",
|
||||||
"darkMode": "",
|
"darkMode": "",
|
||||||
"lightMode": "",
|
"lightMode": "",
|
||||||
"zenMode": "",
|
"systemMode": "Sistem rejimi",
|
||||||
"objectsSnapMode": "",
|
"zenMode": "Zen rejimi",
|
||||||
"exitZenMode": "",
|
"objectsSnapMode": "Obyektlərə bərkidin",
|
||||||
"cancel": "",
|
"exitZenMode": "Zen rejimindən çıxış",
|
||||||
"clear": "",
|
"cancel": "Ləğv et",
|
||||||
"remove": "",
|
"saveLibNames": "",
|
||||||
"embed": "",
|
"clear": "Təmizlə",
|
||||||
|
"remove": "Sil",
|
||||||
|
"embed": "Yerləşdirməni aktiv et",
|
||||||
"publishLibrary": "",
|
"publishLibrary": "",
|
||||||
"submit": "",
|
"submit": "Göndər",
|
||||||
"confirm": "",
|
"confirm": "Təsdiqlə",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": "Əlaqə üçün kliklə"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "",
|
"clearReset": "Bu, bütün lövhəni təmizləyəcək. Sən əminsiniz?",
|
||||||
"couldNotCreateShareableLink": "",
|
"couldNotCreateShareableLink": "Paylaşıla bilən keçid yaratmaq mümkün olmadı.",
|
||||||
"couldNotCreateShareableLinkTooBig": "",
|
"couldNotCreateShareableLinkTooBig": "Paylaşıla bilən link yaratmaq mümkün olmadı. Səhnə çox böyükdür",
|
||||||
"couldNotLoadInvalidFile": "",
|
"couldNotLoadInvalidFile": "Faylı açmaq müknü olmadı",
|
||||||
"importBackendFailed": "",
|
"importBackendFailed": "İdxal zamanı xəta baş verdi.",
|
||||||
"cannotExportEmptyCanvas": "",
|
"cannotExportEmptyCanvas": "Boş lövhəni ixrac etmək mümkün deyil.",
|
||||||
"couldNotCopyToClipboard": "",
|
"couldNotCopyToClipboard": "Kopyalana bilmədi.",
|
||||||
"decryptFailed": "",
|
"decryptFailed": "Məlumatın şifrəsini açmaq mümkün olmadı.",
|
||||||
"uploadedSecurly": "",
|
"uploadedSecurly": "Yükləmə end-to-end şifrələmə texnologiyası ilə qorunub, yəni Excalidraw serveri və üçüncü tərəflər məzmunu oxuya bilməz.",
|
||||||
"loadSceneOverridePrompt": "",
|
"loadSceneOverridePrompt": "Xarici rəsmin yüklənməsi mövcud məzmununuzu əvəz edəcək. Davam etmək istəyirsiniz?",
|
||||||
"collabStopOverridePrompt": "",
|
"collabStopOverridePrompt": "Sessiyanın dayandırılması əvvəlki, yerli olaraq saxlanılan çertyojunuzun üzərinə yazılacaq. Əminsiniz?",
|
||||||
"errorAddingToLibrary": "",
|
"errorAddingToLibrary": "Kitabxanaya əlavə etmək mümkün olmadı",
|
||||||
"errorRemovingFromLibrary": "",
|
"errorRemovingFromLibrary": "Kitabxanadan silmək mümkün olmadı",
|
||||||
"confirmAddLibrary": "",
|
"confirmAddLibrary": "Bu, kitabxananıza {{numShapes}} forma əlavə edəcək. Əminsiniz?",
|
||||||
"imageDoesNotContainScene": "",
|
"imageDoesNotContainScene": "Bu təsvirdə heç bir səhnə məlumatı yoxdur. İxrac zamanı səhnə yerləşdirməni aktiv etmisiniz?",
|
||||||
"cannotRestoreFromImage": "",
|
"cannotRestoreFromImage": "Səhnəni bu şəkil faylından bərpa etmək mümkün olmadı",
|
||||||
"invalidSceneUrl": "",
|
"invalidSceneUrl": "",
|
||||||
"resetLibrary": "",
|
"resetLibrary": "",
|
||||||
"removeItemsFromsLibrary": "",
|
"removeItemsFromsLibrary": "",
|
||||||
"invalidEncryptionKey": "",
|
"invalidEncryptionKey": "",
|
||||||
"collabOfflineWarning": ""
|
"collabOfflineWarning": "",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "",
|
"unsupportedFileType": "",
|
||||||
@@ -212,9 +269,9 @@
|
|||||||
"fileTooBig": "",
|
"fileTooBig": "",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "",
|
||||||
"invalidSVGString": "",
|
|
||||||
"cannotResolveCollabServer": "",
|
"cannotResolveCollabServer": "",
|
||||||
"importLibraryError": "",
|
"importLibraryError": "",
|
||||||
|
"saveLibraryError": "",
|
||||||
"collabSaveFailed": "",
|
"collabSaveFailed": "",
|
||||||
"collabSaveFailed_sizeExceeded": "",
|
"collabSaveFailed_sizeExceeded": "",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "",
|
"selection": "",
|
||||||
|
"lasso": "",
|
||||||
"image": "",
|
"image": "",
|
||||||
"rectangle": "",
|
"rectangle": "",
|
||||||
"diamond": "",
|
"diamond": "",
|
||||||
@@ -255,7 +313,23 @@
|
|||||||
"hand": "",
|
"hand": "",
|
||||||
"extraTools": "",
|
"extraTools": "",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "",
|
||||||
|
"text": "",
|
||||||
|
"image": "",
|
||||||
|
"group": "",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "",
|
"canvasActions": "",
|
||||||
@@ -263,8 +337,10 @@
|
|||||||
"shapes": ""
|
"shapes": ""
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
"canvasPanning": "",
|
"canvasPanning": "",
|
||||||
"linearElement": "",
|
"linearElement": "",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "",
|
"freeDraw": "",
|
||||||
"text": "",
|
"text": "",
|
||||||
"embeddable": "",
|
"embeddable": "",
|
||||||
@@ -276,15 +352,18 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "",
|
"rotate": "",
|
||||||
"lineEditor_info": "",
|
"lineEditor_info": "",
|
||||||
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
|
||||||
"publishLibrary": "",
|
"publishLibrary": "",
|
||||||
"bindTextToElement": "",
|
"bindTextToElement": "",
|
||||||
|
"createFlowchart": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
"eraserRevert": "",
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "",
|
"firefox_clipboard_write": "",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "",
|
"cannotShowPreview": "",
|
||||||
@@ -299,6 +378,9 @@
|
|||||||
"openIssueMessage": "",
|
"openIssueMessage": "",
|
||||||
"sceneContent": ""
|
"sceneContent": ""
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": ""
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "",
|
"desc_intro": "",
|
||||||
"desc_privacy": "",
|
"desc_privacy": "",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "",
|
"click": "",
|
||||||
"deepSelect": "",
|
"deepSelect": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "",
|
"zoomToSelection": "",
|
||||||
"toggleElementLock": "",
|
"toggleElementLock": "",
|
||||||
"movePageUpDown": "",
|
"movePageUpDown": "",
|
||||||
"movePageLeftRight": ""
|
"movePageLeftRight": "",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "",
|
"angle": "",
|
||||||
"element": "",
|
"shapes": "",
|
||||||
"elements": "",
|
|
||||||
"height": "",
|
"height": "",
|
||||||
"scene": "",
|
"scene": "",
|
||||||
"selected": "",
|
"selected": "",
|
||||||
"storage": "",
|
"storage": "",
|
||||||
|
"fullTitle": "",
|
||||||
"title": "",
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
"total": "",
|
"total": "",
|
||||||
"version": "",
|
"version": "",
|
||||||
"versionCopy": "",
|
"versionCopy": "",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "",
|
"copyStyles": "",
|
||||||
"copyToClipboard": "",
|
"copyToClipboard": "",
|
||||||
"copyToClipboardAsPng": "",
|
"copyToClipboardAsPng": "",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "",
|
"fileSaved": "",
|
||||||
"fileSavedToFilename": "",
|
"fileSavedToFilename": "",
|
||||||
"canvas": "",
|
"canvas": "",
|
||||||
"selection": "",
|
"selection": "",
|
||||||
"pasteAsSingleElement": "",
|
"pasteAsSingleElement": "",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "",
|
"transparent": "",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "",
|
"mostUsedCustomColors": "",
|
||||||
"colors": "",
|
"colors": "",
|
||||||
"shades": "",
|
"shades": "",
|
||||||
@@ -521,5 +612,53 @@
|
|||||||
"description": "",
|
"description": "",
|
||||||
"syntax": "",
|
"syntax": "",
|
||||||
"preview": ""
|
"preview": ""
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "",
|
||||||
|
"followStatus": "",
|
||||||
|
"inCall": "",
|
||||||
|
"micMuted": "",
|
||||||
|
"isSpeaking": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "",
|
||||||
|
"confirm": "",
|
||||||
|
"close": ""
|
||||||
|
},
|
||||||
|
"recents": "",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
"copy": "Копирай",
|
"copy": "Копирай",
|
||||||
"copyAsPng": "Копиране в клипборда",
|
"copyAsPng": "Копиране в клипборда",
|
||||||
"copyAsSvg": "Копирано в клипборда като SVG",
|
"copyAsSvg": "Копирано в клипборда като SVG",
|
||||||
"copyText": "",
|
"copyText": "Копирай в клипборда като текст",
|
||||||
"copySource": "",
|
"copySource": "Копирай източника в клипборда",
|
||||||
"convertToCode": "",
|
"convertToCode": "Конвертирай в код",
|
||||||
"bringForward": "Преместване напред",
|
"bringForward": "Преместване напред",
|
||||||
"sendToBack": "Изнасяне назад",
|
"sendToBack": "Изнасяне назад",
|
||||||
"bringToFront": "Изнасяне отпред",
|
"bringToFront": "Изнасяне отпред",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Копирайте стилове",
|
"copyStyles": "Копирайте стилове",
|
||||||
"pasteStyles": "Постави стилове",
|
"pasteStyles": "Постави стилове",
|
||||||
"stroke": "Щрих",
|
"stroke": "Щрих",
|
||||||
|
"changeStroke": "Смени цвета на щрих",
|
||||||
"background": "Фон",
|
"background": "Фон",
|
||||||
|
"changeBackground": "Смени цвета на фон",
|
||||||
"fill": "Наситеност",
|
"fill": "Наситеност",
|
||||||
"strokeWidth": "Ширина на щриха",
|
"strokeWidth": "Ширина на щриха",
|
||||||
"strokeStyle": "Стил на линия",
|
"strokeStyle": "Стил на линия",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Без",
|
"arrowhead_none": "Без",
|
||||||
"arrowhead_arrow": "Стрелка",
|
"arrowhead_arrow": "Стрелка",
|
||||||
"arrowhead_bar": "Връх на стрелката",
|
"arrowhead_bar": "Връх на стрелката",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Кръг",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Окръжност",
|
||||||
"arrowhead_triangle": "Триъгълник",
|
"arrowhead_triangle": "Триъгълник",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Триъгълник (очертание)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Диамант",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Диамант (очертание)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "Вид стрелка",
|
||||||
|
"arrowtype_sharp": "Остра стрелка",
|
||||||
|
"arrowtype_round": "Извита стрелка",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
"fontSize": "Размер на шрифта",
|
"fontSize": "Размер на шрифта",
|
||||||
"fontFamily": "Семейство шрифтове",
|
"fontFamily": "Семейство шрифтове",
|
||||||
"addWatermark": "Добави \"Направено с Excalidraw\"",
|
"addWatermark": "Добави \"Направено с Excalidraw\"",
|
||||||
@@ -72,10 +82,11 @@
|
|||||||
"canvasColors": "Използван на платно",
|
"canvasColors": "Използван на платно",
|
||||||
"canvasBackground": "Фон на платно",
|
"canvasBackground": "Фон на платно",
|
||||||
"drawingCanvas": "Платно за рисуване",
|
"drawingCanvas": "Платно за рисуване",
|
||||||
|
"clearCanvas": "Изчисти платното",
|
||||||
"layers": "Слоеве",
|
"layers": "Слоеве",
|
||||||
"actions": "Действия",
|
"actions": "Действия",
|
||||||
"language": "Език",
|
"language": "Език",
|
||||||
"liveCollaboration": "",
|
"liveCollaboration": "Сътрудничество на живо...",
|
||||||
"duplicateSelection": "Дублирай",
|
"duplicateSelection": "Дублирай",
|
||||||
"untitled": "Неозаглавено",
|
"untitled": "Неозаглавено",
|
||||||
"name": "Име",
|
"name": "Име",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Групирай селекцията",
|
"group": "Групирай селекцията",
|
||||||
"ungroup": "Спри групирането на селекцията",
|
"ungroup": "Спри групирането на селекцията",
|
||||||
"collaborators": "Сътрудници",
|
"collaborators": "Сътрудници",
|
||||||
"showGrid": "Показване на мрежа",
|
"toggleGrid": "Превключване на мрежа",
|
||||||
"addToLibrary": "Добавяне към библиотеката",
|
"addToLibrary": "Добавяне към библиотеката",
|
||||||
"removeFromLibrary": "Премахване от библиотеката",
|
"removeFromLibrary": "Премахване от библиотеката",
|
||||||
"libraryLoadingMessage": "Зареждане на библиотеката…",
|
"libraryLoadingMessage": "Зареждане на библиотеката…",
|
||||||
"libraries": "Разглеждане на библиотеките",
|
"libraries": "Разглеждане на библиотеките",
|
||||||
"loadingScene": "Зареждане на сцена…",
|
"loadingScene": "Зареждане на сцена…",
|
||||||
|
"loadScene": "Зареди сцена от файл",
|
||||||
"align": "Подравняване",
|
"align": "Подравняване",
|
||||||
"alignTop": "Подравняване отгоре",
|
"alignTop": "Подравняване отгоре",
|
||||||
"alignBottom": "Подравняване отдолу",
|
"alignBottom": "Подравняване отдолу",
|
||||||
@@ -103,9 +115,11 @@
|
|||||||
"flipVertical": "Вертикално обръщане",
|
"flipVertical": "Вертикално обръщане",
|
||||||
"viewMode": "Изглед",
|
"viewMode": "Изглед",
|
||||||
"share": "Сподели",
|
"share": "Сподели",
|
||||||
"showStroke": "",
|
"showStroke": "Покажи избора на цвят за щрих",
|
||||||
"showBackground": "",
|
"showBackground": "Покажи избора на цвят за фон",
|
||||||
"toggleTheme": "Включи тема",
|
"showFonts": "",
|
||||||
|
"toggleTheme": "Превключване на светла/тъмна тема",
|
||||||
|
"theme": "Тема",
|
||||||
"personalLib": "Лична Библиотека",
|
"personalLib": "Лична Библиотека",
|
||||||
"excalidrawLib": "Excalidraw Библиотека",
|
"excalidrawLib": "Excalidraw Библиотека",
|
||||||
"decreaseFontSize": "Намали размера на шрифта",
|
"decreaseFontSize": "Намали размера на шрифта",
|
||||||
@@ -116,15 +130,20 @@
|
|||||||
"link": {
|
"link": {
|
||||||
"edit": "Редактирай линк",
|
"edit": "Редактирай линк",
|
||||||
"editEmbed": "",
|
"editEmbed": "",
|
||||||
"create": "",
|
"create": "Добавяне на връзка",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "Линк",
|
"label": "Линк",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "",
|
||||||
"empty": ""
|
"empty": "Няма зададен линк",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "",
|
"edit": "Редактирай линия",
|
||||||
"exit": ""
|
"editArrow": "Редактирай стрелка"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Заключи",
|
"lock": "Заключи",
|
||||||
@@ -134,23 +153,58 @@
|
|||||||
},
|
},
|
||||||
"statusPublished": "Публикувани",
|
"statusPublished": "Публикувани",
|
||||||
"sidebarLock": "",
|
"sidebarLock": "",
|
||||||
"selectAllElementsInFrame": "",
|
"selectAllElementsInFrame": "Избери всички елементи в рамка",
|
||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "Премахни всички елементи от рамка",
|
||||||
"eyeDropper": "Избери цвят от платното",
|
"eyeDropper": "Избери цвят от платното",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "Текст към диаграма",
|
||||||
"prompt": ""
|
"prompt": "",
|
||||||
|
"followUs": "Последвайте ни",
|
||||||
|
"discordChat": "Дискорд чат",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "Приближи селекцията",
|
||||||
|
"zoomToFit": "Приближи всички елементи",
|
||||||
|
"installPWA": "",
|
||||||
|
"autoResize": "",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Няма добавени неща все още...",
|
"noItems": "Няма добавени неща все още...",
|
||||||
"hint_emptyLibrary": "",
|
"hint_emptyLibrary": "Избери предмет от платното, за да го добавиш тук или инсталирай библиотека от публичното хранилище по-долу.",
|
||||||
"hint_emptyPrivateLibrary": ""
|
"hint_emptyPrivateLibrary": "Избери предмет от платното, за да го добавиш тук.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "резултат",
|
||||||
|
"multipleResults": "резултати",
|
||||||
|
"placeholder": "Търсене на текст по платното...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Нулиране на платно",
|
"clearReset": "Нулиране на платно",
|
||||||
"exportJSON": "",
|
"exportJSON": "Изнасяна към файл",
|
||||||
"exportImage": "",
|
"exportImage": "Изнеси изображение...",
|
||||||
"export": "Запази на...",
|
"export": "Запази на...",
|
||||||
"copyToClipboard": "Копиране в клипборда",
|
"copyToClipboard": "Копиране в клипборда",
|
||||||
|
"copyLink": "",
|
||||||
"save": "Запази към текущ файл",
|
"save": "Запази към текущ файл",
|
||||||
"saveAs": "Запиши като",
|
"saveAs": "Запиши като",
|
||||||
"load": "Отвори",
|
"load": "Отвори",
|
||||||
@@ -171,17 +225,19 @@
|
|||||||
"fullScreen": "На цял екран",
|
"fullScreen": "На цял екран",
|
||||||
"darkMode": "Тъмен режим",
|
"darkMode": "Тъмен режим",
|
||||||
"lightMode": "Светъл режим",
|
"lightMode": "Светъл режим",
|
||||||
|
"systemMode": "Системен режим",
|
||||||
"zenMode": "Режим Zen",
|
"zenMode": "Режим Zen",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "Прилепване към обекти",
|
||||||
"exitZenMode": "Спиране на Zen режим",
|
"exitZenMode": "Спиране на режим Зен",
|
||||||
"cancel": "Отмени",
|
"cancel": "Отмени",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Изчисти",
|
"clear": "Изчисти",
|
||||||
"remove": "Премахване",
|
"remove": "Премахване",
|
||||||
"embed": "",
|
"embed": "Включи вмъкване",
|
||||||
"publishLibrary": "Публикувай",
|
"publishLibrary": "",
|
||||||
"submit": "Изпрати",
|
"submit": "Изпрати",
|
||||||
"confirm": "Потвърждаване",
|
"confirm": "Потвърждаване",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": "Натисни, за да взаимодействаш"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?",
|
"clearReset": "Това ще изчисти цялото платно. Сигурни ли сте?",
|
||||||
@@ -198,31 +254,32 @@
|
|||||||
"errorAddingToLibrary": "Не можем да заредим от библиотеката",
|
"errorAddingToLibrary": "Не можем да заредим от библиотеката",
|
||||||
"errorRemovingFromLibrary": "Не можем да премахнем елемент от библиотеката",
|
"errorRemovingFromLibrary": "Не можем да премахнем елемент от библиотеката",
|
||||||
"confirmAddLibrary": "Ще се добавят {{numShapes}} фигура(и) във вашата библиотека. Сигурни ли сте?",
|
"confirmAddLibrary": "Ще се добавят {{numShapes}} фигура(и) във вашата библиотека. Сигурни ли сте?",
|
||||||
"imageDoesNotContainScene": "",
|
"imageDoesNotContainScene": "Това изображение не изглежда да съдържа каквито и да е данни за сцена. Искате ли да включите вмъкване на сцени при изнасяне?",
|
||||||
"cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл",
|
"cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл",
|
||||||
"invalidSceneUrl": "",
|
"invalidSceneUrl": "Неуспешно поставяне на сцена от предоставения линк. Той е или неправилно оформен, или не съдържа валидни Excalidraw JSON данни.",
|
||||||
"resetLibrary": "",
|
"resetLibrary": "Това ще изчисти библиотеката ви. Сигурни ли сте?",
|
||||||
"removeItemsFromsLibrary": "Изтрий {{count}} елемент(а) от библиотеката?",
|
"removeItemsFromsLibrary": "Изтрий {{count}} елемент(а) от библиотеката?",
|
||||||
"invalidEncryptionKey": "",
|
"invalidEncryptionKey": "Ключът за енкрипция трябва да е от 22 знака. Сътрудничеството на живо е изключено.",
|
||||||
"collabOfflineWarning": ""
|
"collabOfflineWarning": "Няма налична интернет връзка.\nВашите промени няма да бъдат запазени!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Този файлов формат не се поддържа.",
|
"unsupportedFileType": "Този файлов формат не се поддържа.",
|
||||||
"imageInsertError": "",
|
"imageInsertError": "Неуспешно поставяне на изображение. Опитайте по-късно...",
|
||||||
"fileTooBig": "Файлът е твърде голям. Максималния допустим размер е {{maxSize}}.",
|
"fileTooBig": "Файлът е твърде голям. Максималния допустим размер е {{maxSize}}.",
|
||||||
"svgImageInsertError": "",
|
"svgImageInsertError": "Неуспешно поставяне на SVG изборажение. SVG данните изглеждат невалидни.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "Неуспешно получаване на изборажение.",
|
||||||
"invalidSVGString": "Невалиден SVG.",
|
|
||||||
"cannotResolveCollabServer": "",
|
"cannotResolveCollabServer": "",
|
||||||
"importLibraryError": "Не можем да заредим библиотеката",
|
"importLibraryError": "Не можем да заредим библиотеката",
|
||||||
|
"saveLibraryError": "",
|
||||||
"collabSaveFailed": "",
|
"collabSaveFailed": "",
|
||||||
"collabSaveFailed_sizeExceeded": "",
|
"collabSaveFailed_sizeExceeded": "",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "Изображенията са изключени.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "",
|
"line1": "",
|
||||||
"line2": "",
|
"line2": "",
|
||||||
"line3": "Силно препоръчваме да изключите тази настройка. Можете да следвате <link>тези стъпки</link> за това как да го направите.",
|
"line3": "Силно препоръчваме да изключите тази настройка. Можете да следвате <link>тези стъпки</link> за това как да го направите.",
|
||||||
"line4": ""
|
"line4": "Ако изключването на тази настройка не оправи изобразяването на текстови елементи, моля отворете <issueLink>проблем</issueLink> на нашия GitHub или ни пишете на <discordLink>Дискорд</discordLink>"
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "",
|
"embeddable": "",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Селекция",
|
"selection": "Селекция",
|
||||||
|
"lasso": "",
|
||||||
"image": "Вмъкване на изображение",
|
"image": "Вмъкване на изображение",
|
||||||
"rectangle": "Правоъгълник",
|
"rectangle": "Правоъгълник",
|
||||||
"diamond": "Диамант",
|
"diamond": "Диамант",
|
||||||
@@ -248,14 +306,30 @@
|
|||||||
"penMode": "",
|
"penMode": "",
|
||||||
"link": "",
|
"link": "",
|
||||||
"eraser": "Гума",
|
"eraser": "Гума",
|
||||||
"frame": "",
|
"frame": "Инструмент за рамки",
|
||||||
"magicframe": "",
|
"magicframe": "",
|
||||||
"embeddable": "",
|
"embeddable": "",
|
||||||
"laser": "",
|
"laser": "Лазерна показалка",
|
||||||
"hand": "",
|
"hand": "",
|
||||||
"extraTools": "Още инструменти",
|
"extraTools": "Още инструменти",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "Mermaid към Excalidraw",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Правоъгълник",
|
||||||
|
"diamond": "Диамант",
|
||||||
|
"ellipse": "Елипса",
|
||||||
|
"arrow": "Стрелка",
|
||||||
|
"line": "Линия",
|
||||||
|
"freedraw": "Свободно рисуване",
|
||||||
|
"text": "Текст",
|
||||||
|
"image": "Изображение",
|
||||||
|
"group": "Група",
|
||||||
|
"frame": "Рамка",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Действия по платното",
|
"canvasActions": "Действия по платното",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Фигури"
|
"shapes": "Фигури"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
"canvasPanning": "",
|
"canvasPanning": "",
|
||||||
"linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия",
|
"linearElement": "Кликнете, за да стартирате няколко точки, плъзнете за една линия",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Натиснете и влачете, пуснете като сте готови",
|
"freeDraw": "Натиснете и влачете, пуснете като сте готови",
|
||||||
"text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция",
|
"text": "Подсказка: Можете също да добавите текст като натиснете някъде два път с инструмента за селекция",
|
||||||
"embeddable": "",
|
"embeddable": "Натисни-премести, за да създадеш вметка за уебсайт",
|
||||||
"text_selected": "",
|
"text_selected": "",
|
||||||
"text_editing": "",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Можете да ограничите ъгъла, като задържите SHIFT",
|
"lockAngle": "",
|
||||||
"resize": "Може да ограничите при преоразмеряване като задържите SHIFT,\nзадръжте ALT за преоразмерите през центъра",
|
"resize": "",
|
||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "Можете да ограничите ъглите, като държите SHIFT, докато се въртите",
|
"rotate": "",
|
||||||
"lineEditor_info": "",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Натиснете Delete за да изтриете точка(и), CtrlOrCmd+D за дуплициране, или извлачете за да преместите",
|
"lineEditor_line_info": "",
|
||||||
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
"publishLibrary": "Публикувайте собствена библиотека",
|
||||||
"publishLibrary": "",
|
"bindTextToElement": "",
|
||||||
"bindTextToElement": "Натиснете Enter, за да добавите",
|
"createFlowchart": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
"eraserRevert": "",
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "",
|
"firefox_clipboard_write": "",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Невъзможност за показване на preview",
|
"cannotShowPreview": "Невъзможност за показване на preview",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Бяхме много предпазливи да не включите информацията за вашата сцена при грешката. Ако сцената ви не е частна, моля, помислете за последващи действия на нашата <button>тракер за грешки.</button> Моля, включете информация по-долу, като я копирате и добавите в GitHub.",
|
"openIssueMessage": "Бяхме много предпазливи да не включите информацията за вашата сцена при грешката. Ако сцената ви не е частна, моля, помислете за последващи действия на нашата <button>тракер за грешки.</button> Моля, включете информация по-долу, като я копирате и добавите в GitHub.",
|
||||||
"sceneContent": "Съдържание на сцената:"
|
"sceneContent": "Съдържание на сцената:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "Или"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Можете да поканите хора на текущата си сцена да си сътрудничат с вас.",
|
"desc_intro": "Поканете хора да работят съвместно на рисунката.",
|
||||||
"desc_privacy": "Не се притеснявайте, сесията използва криптиране от край до край, така че каквото нарисувате ще остане частно. Дори нашият сървър няма да може да види какво предлагате.",
|
"desc_privacy": "",
|
||||||
"button_startSession": "Стартирайте сесията",
|
"button_startSession": "Стартирайте сесията",
|
||||||
"button_stopSession": "Стоп на сесията",
|
"button_stopSession": "Стоп на сесията",
|
||||||
"desc_inProgressIntro": "Сесията за сътрудничество на живо е в ход.",
|
"desc_inProgressIntro": "Сесията за сътрудничество на живо е в ход.",
|
||||||
@@ -313,10 +395,10 @@
|
|||||||
"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": "",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "клик",
|
"click": "клик",
|
||||||
"deepSelect": "",
|
"deepSelect": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "Извита стрелка",
|
"curvedArrow": "Извита стрелка",
|
||||||
"curvedLine": "Извита линия",
|
"curvedLine": "Извита линия",
|
||||||
"documentation": "Документация",
|
"documentation": "Документация",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Приближи селекцията",
|
"zoomToSelection": "Приближи селекцията",
|
||||||
"toggleElementLock": "Заключи/Отключи селекция",
|
"toggleElementLock": "Заключи/Отключи селекция",
|
||||||
"movePageUpDown": "Премести страница нагоре/надолу",
|
"movePageUpDown": "Премести страница нагоре/надолу",
|
||||||
"movePageLeftRight": "Премести страница наляво/надясно"
|
"movePageLeftRight": "Премести страница наляво/надясно",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Изчисти платното"
|
"title": "Изчисти платното"
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Ъгъл",
|
"angle": "Ъгъл",
|
||||||
"element": "Елемент",
|
"shapes": "",
|
||||||
"elements": "Елементи",
|
|
||||||
"height": "Височина",
|
"height": "Височина",
|
||||||
"scene": "Сцена",
|
"scene": "Сцена",
|
||||||
"selected": "Селектирано",
|
"selected": "Селектирано",
|
||||||
"storage": "Съхранение на данни",
|
"storage": "Съхранение на данни",
|
||||||
"title": "Статистика за хакери",
|
"fullTitle": "",
|
||||||
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
"total": "Общо",
|
"total": "Общо",
|
||||||
"version": "Версия",
|
"version": "Версия",
|
||||||
"versionCopy": "Настисни за да копираш",
|
"versionCopy": "Настисни за да копираш",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Копирани стилове.",
|
"copyStyles": "Копирани стилове.",
|
||||||
"copyToClipboard": "Копирано в клипборда.",
|
"copyToClipboard": "Копирано в клипборда.",
|
||||||
"copyToClipboardAsPng": "Копира {{exportSelection}} в клипборда като PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Копира {{exportSelection}} в клипборда като PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "Файлът е запазен.",
|
"fileSaved": "Файлът е запазен.",
|
||||||
"fileSavedToFilename": "Запазен към {filename}",
|
"fileSavedToFilename": "Запазен към {filename}",
|
||||||
"canvas": "платно",
|
"canvas": "платно",
|
||||||
"selection": "селекция",
|
"selection": "селекция",
|
||||||
"pasteAsSingleElement": "",
|
"pasteAsSingleElement": "",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Прозрачен",
|
"transparent": "Прозрачен",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Най-често използвани цветове",
|
"mostUsedCustomColors": "Най-често използвани цветове",
|
||||||
"colors": "Цветове",
|
"colors": "Цветове",
|
||||||
"shades": "Нюанси",
|
"shades": "Нюанси",
|
||||||
@@ -517,9 +608,57 @@
|
|||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"button": "",
|
"button": "Вмъкни",
|
||||||
"description": "",
|
"description": "",
|
||||||
"syntax": "",
|
"syntax": "Mermaid Синтаксис",
|
||||||
"preview": ""
|
"preview": "Преглед"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "Натиснете потребител, за да го следвате",
|
||||||
|
"followStatus": "В момента следвате този потребител",
|
||||||
|
"inCall": "",
|
||||||
|
"micMuted": "Микрофона на потребителят е заглушен",
|
||||||
|
"isSpeaking": "Потребителят говори"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Палитра команди",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Избери",
|
||||||
|
"confirm": "Потвърди",
|
||||||
|
"close": "Затвори"
|
||||||
|
},
|
||||||
|
"recents": "Наскоро използвани",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "পীএনজী ছবির মতন কপি করুন",
|
"copyAsPng": "পীএনজী ছবির মতন কপি করুন",
|
||||||
"copyAsSvg": "এসভীজী ছবির মতন কপি করুন",
|
"copyAsSvg": "এসভীজী ছবির মতন কপি করুন",
|
||||||
"copyText": "লিখিত তথ্যের মতন কপি করুন",
|
"copyText": "লিখিত তথ্যের মতন কপি করুন",
|
||||||
"copySource": "",
|
"copySource": "পিএনজি ছবি ক্লিপবোর্ডে কপি করুন",
|
||||||
"convertToCode": "",
|
"convertToCode": "কোডে রূপান্তর করুন",
|
||||||
"bringForward": "অধিকতর সামনে আনুন",
|
"bringForward": "অধিকতর সামনে আনুন",
|
||||||
"sendToBack": "অধিকতর পিছনে নিয়ে যান",
|
"sendToBack": "অধিকতর পিছনে নিয়ে যান",
|
||||||
"bringToFront": "সবার সামনে আনুন",
|
"bringToFront": "সবার সামনে আনুন",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "ডিজাইন কপি করুন",
|
"copyStyles": "ডিজাইন কপি করুন",
|
||||||
"pasteStyles": "ডিজাইন পেস্ট করুন",
|
"pasteStyles": "ডিজাইন পেস্ট করুন",
|
||||||
"stroke": "রেখাংশ",
|
"stroke": "রেখাংশ",
|
||||||
|
"changeStroke": "Hi",
|
||||||
"background": "পটভূমি",
|
"background": "পটভূমি",
|
||||||
|
"changeBackground": "পটভূমির রঙ পরিবর্তন করুন",
|
||||||
"fill": "রং",
|
"fill": "রং",
|
||||||
"strokeWidth": "রেখাংশের বেধ",
|
"strokeWidth": "রেখাংশের বেধ",
|
||||||
"strokeStyle": "রেখাংশের ডিজাইন",
|
"strokeStyle": "রেখাংশের ডিজাইন",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "কিছু না",
|
"arrowhead_none": "কিছু না",
|
||||||
"arrowhead_arrow": "তীর",
|
"arrowhead_arrow": "তীর",
|
||||||
"arrowhead_bar": "রেখাংশ",
|
"arrowhead_bar": "রেখাংশ",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "বৃত্ত",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "বৃত্তীয় (প্রান্তরেখা) প্রান্তরেখা",
|
||||||
"arrowhead_triangle": "ত্রিভূজ",
|
"arrowhead_triangle": "ত্রিভূজ",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "ত্রিভুজ (প্রান্তরেখা) প্রান্তরেখা",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "হীরক",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "হীরক (প্রান্তরেখা)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "",
|
||||||
|
"arrowtype_sharp": "",
|
||||||
|
"arrowtype_round": "",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
"fontSize": "লেখনীর মাত্রা",
|
"fontSize": "লেখনীর মাত্রা",
|
||||||
"fontFamily": "লেখনীর হরফ",
|
"fontFamily": "লেখনীর হরফ",
|
||||||
"addWatermark": "এক্সক্যালিড্র দ্বারা প্রস্তুত",
|
"addWatermark": "এক্সক্যালিড্র দ্বারা প্রস্তুত",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "ক্যানভাসের রং",
|
"canvasColors": "ক্যানভাসের রং",
|
||||||
"canvasBackground": "ক্যানভাসের পটভূমি",
|
"canvasBackground": "ক্যানভাসের পটভূমি",
|
||||||
"drawingCanvas": "ব্যবহৃত ক্যানভাস",
|
"drawingCanvas": "ব্যবহৃত ক্যানভাস",
|
||||||
|
"clearCanvas": "পরিষ্কার ক্যানভাস",
|
||||||
"layers": "মাত্রা",
|
"layers": "মাত্রা",
|
||||||
"actions": "ক্রিয়া",
|
"actions": "ক্রিয়া",
|
||||||
"language": "ভাষা",
|
"language": "ভাষা",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "দল গঠন করুন",
|
"group": "দল গঠন করুন",
|
||||||
"ungroup": "দল বিভেদ করুন",
|
"ungroup": "দল বিভেদ করুন",
|
||||||
"collaborators": "সহযোগী",
|
"collaborators": "সহযোগী",
|
||||||
"showGrid": "গ্রিড দেখান",
|
"toggleGrid": "",
|
||||||
"addToLibrary": "সংগ্রহে যোগ করুন",
|
"addToLibrary": "সংগ্রহে যোগ করুন",
|
||||||
"removeFromLibrary": "সংগ্রহ থেকে বের করুন",
|
"removeFromLibrary": "সংগ্রহ থেকে বের করুন",
|
||||||
"libraryLoadingMessage": "সংগ্রহ তৈরি হচ্ছে",
|
"libraryLoadingMessage": "সংগ্রহ তৈরি হচ্ছে",
|
||||||
"libraries": "সংগ্রহ দেখুন",
|
"libraries": "সংগ্রহ দেখুন",
|
||||||
"loadingScene": "দৃশ্য তৈরি হচ্ছে",
|
"loadingScene": "দৃশ্য তৈরি হচ্ছে",
|
||||||
|
"loadScene": "",
|
||||||
"align": "পংক্তিবিন্যাস",
|
"align": "পংক্তিবিন্যাস",
|
||||||
"alignTop": "উপর পংক্তি",
|
"alignTop": "উপর পংক্তি",
|
||||||
"alignBottom": "নিম্ন পংক্তি",
|
"alignBottom": "নিম্ন পংক্তি",
|
||||||
@@ -104,27 +116,34 @@
|
|||||||
"viewMode": "দৃশ্য",
|
"viewMode": "দৃশ্য",
|
||||||
"share": "ভাগ করুন",
|
"share": "ভাগ করুন",
|
||||||
"showStroke": "",
|
"showStroke": "",
|
||||||
"showBackground": "",
|
"showBackground": "পটভূমির রঙ নির্বাচনকারী অপশন দেখান",
|
||||||
|
"showFonts": "",
|
||||||
"toggleTheme": "",
|
"toggleTheme": "",
|
||||||
"personalLib": "",
|
"theme": "",
|
||||||
"excalidrawLib": "",
|
"personalLib": "ব্যক্তিগত লাইব্রেরি",
|
||||||
|
"excalidrawLib": "এক্সক্যালিড্র লাইব্রেরি",
|
||||||
"decreaseFontSize": "লেখনীর মাত্রা কমান",
|
"decreaseFontSize": "লেখনীর মাত্রা কমান",
|
||||||
"increaseFontSize": "লেখনীর মাত্রা বাড়ান",
|
"increaseFontSize": "লেখনীর মাত্রা বাড়ান",
|
||||||
"unbindText": "",
|
"unbindText": "লেখার জোড় খুলুন",
|
||||||
"bindText": "",
|
"bindText": "কন্টেইনারের সাথে লেখা জোড়া লাগান",
|
||||||
"createContainerFromText": "",
|
"createContainerFromText": "",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "লিঙ্ক সংশোধন",
|
"edit": "লিঙ্ক সংশোধন",
|
||||||
"editEmbed": "",
|
"editEmbed": "",
|
||||||
"create": "লিঙ্ক তৈরী",
|
"create": "",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "লিঙ্ক নামকরণ",
|
"label": "লিঙ্ক নামকরণ",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "লিংক ও এম্বেড",
|
||||||
"empty": ""
|
"empty": "কোন লিংক সেট করা নেই",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "",
|
"edit": "লাইন সম্পাদনা করুন",
|
||||||
"exit": ""
|
"editArrow": ""
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "আবদ্ধ করুন",
|
"lock": "আবদ্ধ করুন",
|
||||||
@@ -134,16 +153,50 @@
|
|||||||
},
|
},
|
||||||
"statusPublished": "প্রকাশিত",
|
"statusPublished": "প্রকাশিত",
|
||||||
"sidebarLock": "লক",
|
"sidebarLock": "লক",
|
||||||
"selectAllElementsInFrame": "",
|
"selectAllElementsInFrame": "ফ্রেমের ভিতরের সব উপকরণ বাছাই করুন",
|
||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "ফ্রেম থেকে সব উপকরণ মুছুন",
|
||||||
"eyeDropper": "",
|
"eyeDropper": "ক্যানভাস থেকে রঙ বাছাই করুন",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "লেখা থেকে ডায়াগ্রাম",
|
||||||
"prompt": ""
|
"prompt": "",
|
||||||
|
"followUs": "",
|
||||||
|
"discordChat": "",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"installPWA": "",
|
||||||
|
"autoResize": "",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "সংগ্রহে কিছু যোগ করা হয়নি",
|
"noItems": "সংগ্রহে কিছু যোগ করা হয়নি",
|
||||||
"hint_emptyLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন, অথবা নীচে, প্রকাশ্য সংগ্রহশালা থেকে একটি সংগ্রহ ইনস্টল করুন৷",
|
"hint_emptyLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন, অথবা নীচে, প্রকাশ্য সংগ্রহশালা থেকে একটি সংগ্রহ ইনস্টল করুন৷",
|
||||||
"hint_emptyPrivateLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন"
|
"hint_emptyPrivateLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "ক্যানভাস সাফ করুন",
|
"clearReset": "ক্যানভাস সাফ করুন",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "",
|
"exportImage": "",
|
||||||
"export": "",
|
"export": "",
|
||||||
"copyToClipboard": "ক্লিপবোর্ডে কপি করুন",
|
"copyToClipboard": "ক্লিপবোর্ডে কপি করুন",
|
||||||
|
"copyLink": "",
|
||||||
"save": "জমা করুন",
|
"save": "জমা করুন",
|
||||||
"saveAs": "অন্যভাবে জমা করুন",
|
"saveAs": "অন্যভাবে জমা করুন",
|
||||||
"load": "",
|
"load": "",
|
||||||
@@ -171,14 +225,16 @@
|
|||||||
"fullScreen": "পূর্ণস্ক্রীন",
|
"fullScreen": "পূর্ণস্ক্রীন",
|
||||||
"darkMode": "ডার্ক মোড",
|
"darkMode": "ডার্ক মোড",
|
||||||
"lightMode": "লাইট মোড",
|
"lightMode": "লাইট মোড",
|
||||||
|
"systemMode": "",
|
||||||
"zenMode": "জেন মোড",
|
"zenMode": "জেন মোড",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "",
|
||||||
"exitZenMode": "জেন মোড বন্ধ করুন",
|
"exitZenMode": "জেন মোড বন্ধ করুন",
|
||||||
"cancel": "বাতিল",
|
"cancel": "বাতিল",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "সাফ",
|
"clear": "সাফ",
|
||||||
"remove": "বিয়োগ",
|
"remove": "বিয়োগ",
|
||||||
"embed": "",
|
"embed": "",
|
||||||
"publishLibrary": "সংগ্রহ প্রকাশ করুন",
|
"publishLibrary": "",
|
||||||
"submit": "জমা করুন",
|
"submit": "জমা করুন",
|
||||||
"confirm": "নিশ্চিত করুন",
|
"confirm": "নিশ্চিত করুন",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": ""
|
||||||
@@ -204,7 +260,8 @@
|
|||||||
"resetLibrary": "এটি আপনার সংগ্রহ পরিষ্কার করবে। আপনি কি নিশ্চিত?",
|
"resetLibrary": "এটি আপনার সংগ্রহ পরিষ্কার করবে। আপনি কি নিশ্চিত?",
|
||||||
"removeItemsFromsLibrary": "সংগ্রহ থেকে {{count}} বস্তু বিয়োগ করা হবে। আপনি কি নিশ্চিত?",
|
"removeItemsFromsLibrary": "সংগ্রহ থেকে {{count}} বস্তু বিয়োগ করা হবে। আপনি কি নিশ্চিত?",
|
||||||
"invalidEncryptionKey": "অবৈধ এনক্রীপশন কী।",
|
"invalidEncryptionKey": "অবৈধ এনক্রীপশন কী।",
|
||||||
"collabOfflineWarning": ""
|
"collabOfflineWarning": "",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "অসমর্থিত ফাইল।",
|
"unsupportedFileType": "অসমর্থিত ফাইল।",
|
||||||
@@ -212,9 +269,9 @@
|
|||||||
"fileTooBig": "ফাইলটি খুব বড়। সর্বাধিক অনুমোদিত আকার হল {{maxSize}}৷",
|
"fileTooBig": "ফাইলটি খুব বড়। সর্বাধিক অনুমোদিত আকার হল {{maxSize}}৷",
|
||||||
"svgImageInsertError": "এসভীজী ছবি সন্নিবেশ করা যায়নি। এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
|
"svgImageInsertError": "এসভীজী ছবি সন্নিবেশ করা যায়নি। এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "",
|
||||||
"invalidSVGString": "এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
|
|
||||||
"cannotResolveCollabServer": "কোল্যাব সার্ভারের সাথে সংযোগ করা যায়নি। পৃষ্ঠাটি পুনরায় লোড করে আবার চেষ্টা করুন।",
|
"cannotResolveCollabServer": "কোল্যাব সার্ভারের সাথে সংযোগ করা যায়নি। পৃষ্ঠাটি পুনরায় লোড করে আবার চেষ্টা করুন।",
|
||||||
"importLibraryError": "সংগ্রহ লোড করা যায়নি",
|
"importLibraryError": "সংগ্রহ লোড করা যায়নি",
|
||||||
|
"saveLibraryError": "",
|
||||||
"collabSaveFailed": "",
|
"collabSaveFailed": "",
|
||||||
"collabSaveFailed_sizeExceeded": "",
|
"collabSaveFailed_sizeExceeded": "",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "বাছাই",
|
"selection": "বাছাই",
|
||||||
|
"lasso": "",
|
||||||
"image": "চিত্র সন্নিবেশ",
|
"image": "চিত্র সন্নিবেশ",
|
||||||
"rectangle": "আয়তক্ষেত্র",
|
"rectangle": "আয়তক্ষেত্র",
|
||||||
"diamond": "রুহিতন",
|
"diamond": "রুহিতন",
|
||||||
@@ -246,7 +304,7 @@
|
|||||||
"library": "সংগ্রহ",
|
"library": "সংগ্রহ",
|
||||||
"lock": "আঁকার পরে নির্বাচিত টুল সক্রিয় রাখুন",
|
"lock": "আঁকার পরে নির্বাচিত টুল সক্রিয় রাখুন",
|
||||||
"penMode": "",
|
"penMode": "",
|
||||||
"link": "একটি নির্বাচিত আকৃতির জন্য লিঙ্ক যোগ বা আপডেট করুন",
|
"link": "",
|
||||||
"eraser": "ঝাড়ন",
|
"eraser": "ঝাড়ন",
|
||||||
"frame": "",
|
"frame": "",
|
||||||
"magicframe": "",
|
"magicframe": "",
|
||||||
@@ -255,7 +313,23 @@
|
|||||||
"hand": "",
|
"hand": "",
|
||||||
"extraTools": "",
|
"extraTools": "",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "",
|
||||||
|
"text": "",
|
||||||
|
"image": "",
|
||||||
|
"group": "",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "ক্যানভাস কার্যকলাপ",
|
"canvasActions": "ক্যানভাস কার্যকলাপ",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "আকার(গুলি)"
|
"shapes": "আকার(গুলি)"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
"canvasPanning": "",
|
"canvasPanning": "",
|
||||||
"linearElement": "একাধিক বিন্দু শুরু করতে ক্লিক করুন, একক লাইনের জন্য টেনে আনুন",
|
"linearElement": "একাধিক বিন্দু শুরু করতে ক্লিক করুন, একক লাইনের জন্য টেনে আনুন",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "ক্লিক করুন এবং টেনে আনুন, আপনার কাজ শেষ হলে ছেড়ে দিন",
|
"freeDraw": "ক্লিক করুন এবং টেনে আনুন, আপনার কাজ শেষ হলে ছেড়ে দিন",
|
||||||
"text": "বিশেষ্য: আপনি নির্বাচন টুলের সাথে যে কোনো জায়গায় ডাবল-ক্লিক করে পাঠ্য যোগ করতে পারেন",
|
"text": "বিশেষ্য: আপনি নির্বাচন টুলের সাথে যে কোনো জায়গায় ডাবল-ক্লিক করে পাঠ্য যোগ করতে পারেন",
|
||||||
"embeddable": "",
|
"embeddable": "",
|
||||||
"text_selected": "লেখা সম্পাদনা করতে ডাবল-ক্লিক করুন বা এন্টার টিপুন",
|
"text_selected": "",
|
||||||
"text_editing": "লেখা সম্পাদনা শেষ করতে এসকেপ বা কন্ট্রোল/কম্যান্ড যোগে এন্টার টিপুন",
|
"text_editing": "",
|
||||||
"linearElementMulti": "শেষ বিন্দুতে ক্লিক করুন অথবা শেষ করতে এসকেপ বা এন্টার টিপুন",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "ঘোরানোর সময় আপনি শিফ্ট ধরে রেখে কোণ সীমাবদ্ধ করতে পারেন",
|
"lockAngle": "",
|
||||||
"resize": "আপনি আকার পরিবর্তন করার সময় শিফ্ট ধরে রেখে অনুপাতকে সীমাবদ্ধ করতে পারেন,\nকেন্দ্র থেকে আকার পরিবর্তন করতে অল্ট ধরে রাখুন",
|
"resize": "",
|
||||||
"resizeImage": "আপনি শিফ্ট ধরে রেখে অবাধে আকার পরিবর্তন করতে পারেন, কেন্দ্র থেকে আকার পরিবর্তন করতে অল্ট ধরুন",
|
"resizeImage": "",
|
||||||
"rotate": "আপনি ঘোরানোর সময় শিফ্ট ধরে রেখে কোণগুলিকে সীমাবদ্ধ করতে পারেন",
|
"rotate": "",
|
||||||
"lineEditor_info": "",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "বিন্দু(গুলি) মুছতে ডিলিট টিপুন, কন্ট্রোল/কম্যান্ড যোগে ডি টিপুন নকল করতে অথবা সরানোর জন্য টানুন",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "সম্পাদনা করার জন্য একটি বিন্দু নির্বাচন করুন (একাধিক নির্বাচন করতে শিফ্ট ধরে রাখুন),\nঅথবা অল্ট ধরে রাখুন এবং নতুন বিন্দু যোগ করতে ক্লিক করুন",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "ছবিটি স্থাপন করতে ক্লিক করুন, অথবা নিজে আকার সেট করতে ক্লিক করুন এবং টেনে আনুন",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "আপনার নিজস্ব সংগ্রহ প্রকাশ করুন",
|
"publishLibrary": "আপনার নিজস্ব সংগ্রহ প্রকাশ করুন",
|
||||||
"bindTextToElement": "লেখা যোগ করতে এন্টার টিপুন",
|
"bindTextToElement": "",
|
||||||
|
"createFlowchart": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
"eraserRevert": "মুছে ফেলার জন্য চিহ্নিত উপাদানগুলিকে ফিরিয়ে আনতে অল্ট ধরে রাখুন",
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "",
|
"firefox_clipboard_write": "",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "প্রিভিউ দেখাতে অপারগ",
|
"cannotShowPreview": "প্রিভিউ দেখাতে অপারগ",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "আমরা ত্রুটিতে আপনার দৃশ্যের তথ্য অন্তর্ভুক্ত না করার জন্য খুব সতর্ক ছিলাম। আপনার দৃশ্য ব্যক্তিগত না হলে, আমাদের অনুসরণ করার কথা বিবেচনা করুন <button>ত্রুটি ইতিবৃত্ত।</button> অনুগ্রহ করে GitHub ইস্যুতে অনুলিপি এবং পেস্ট করে নীচের তথ্য অন্তর্ভুক্ত করুন।",
|
"openIssueMessage": "আমরা ত্রুটিতে আপনার দৃশ্যের তথ্য অন্তর্ভুক্ত না করার জন্য খুব সতর্ক ছিলাম। আপনার দৃশ্য ব্যক্তিগত না হলে, আমাদের অনুসরণ করার কথা বিবেচনা করুন <button>ত্রুটি ইতিবৃত্ত।</button> অনুগ্রহ করে GitHub ইস্যুতে অনুলিপি এবং পেস্ট করে নীচের তথ্য অন্তর্ভুক্ত করুন।",
|
||||||
"sceneContent": "দৃশ্য বিষয়বস্তু:"
|
"sceneContent": "দৃশ্য বিষয়বস্তু:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": ""
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "আপনি আপনার সাথে সহযোগিতা করার জন্য আপনার বর্তমান দৃশ্যে লোকেদের আমন্ত্রণ জানাতে পারেন৷",
|
"desc_intro": "",
|
||||||
"desc_privacy": "চিন্তা করবেন না, সেশনটি এন্ড-টু-এন্ড এনক্রিপশন ব্যবহার করে, তাই আপনি যা আঁকবেন তা গোপন থাকবে। এমনকি আমাদের সার্ভার আপনি যা নিয়ে এসেছেন তা দেখতে সক্ষম হবে না।",
|
"desc_privacy": "",
|
||||||
"button_startSession": "সেশন শুরু করুন",
|
"button_startSession": "সেশন শুরু করুন",
|
||||||
"button_stopSession": "সেশন বন্ধ করুন",
|
"button_stopSession": "সেশন বন্ধ করুন",
|
||||||
"desc_inProgressIntro": "লাইভ-সহযোগীতার সেশন এখন চলছে।",
|
"desc_inProgressIntro": "লাইভ-সহযোগীতার সেশন এখন চলছে।",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "ক্লিক",
|
"click": "ক্লিক",
|
||||||
"deepSelect": "",
|
"deepSelect": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "",
|
"zoomToSelection": "",
|
||||||
"toggleElementLock": "",
|
"toggleElementLock": "",
|
||||||
"movePageUpDown": "",
|
"movePageUpDown": "",
|
||||||
"movePageLeftRight": ""
|
"movePageLeftRight": "",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "কোণ",
|
"angle": "কোণ",
|
||||||
"element": "",
|
"shapes": "",
|
||||||
"elements": "",
|
|
||||||
"height": "",
|
"height": "",
|
||||||
"scene": "",
|
"scene": "",
|
||||||
"selected": "",
|
"selected": "",
|
||||||
"storage": "",
|
"storage": "",
|
||||||
|
"fullTitle": "",
|
||||||
"title": "",
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
"total": "",
|
"total": "",
|
||||||
"version": "",
|
"version": "",
|
||||||
"versionCopy": "",
|
"versionCopy": "",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "",
|
"copyStyles": "",
|
||||||
"copyToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে।",
|
"copyToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে।",
|
||||||
"copyToClipboardAsPng": "",
|
"copyToClipboardAsPng": "",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "",
|
"fileSaved": "",
|
||||||
"fileSavedToFilename": "",
|
"fileSavedToFilename": "",
|
||||||
"canvas": "",
|
"canvas": "",
|
||||||
"selection": "বাছাই",
|
"selection": "বাছাই",
|
||||||
"pasteAsSingleElement": "",
|
"pasteAsSingleElement": "",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "",
|
"transparent": "",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "",
|
"mostUsedCustomColors": "",
|
||||||
"colors": "",
|
"colors": "",
|
||||||
"shades": "",
|
"shades": "",
|
||||||
@@ -521,5 +612,53 @@
|
|||||||
"description": "",
|
"description": "",
|
||||||
"syntax": "",
|
"syntax": "",
|
||||||
"preview": ""
|
"preview": ""
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "",
|
||||||
|
"followStatus": "",
|
||||||
|
"inCall": "",
|
||||||
|
"micMuted": "",
|
||||||
|
"isSpeaking": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "",
|
||||||
|
"confirm": "",
|
||||||
|
"close": ""
|
||||||
|
},
|
||||||
|
"recents": "",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,664 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"paste": "পেস্ট করুন",
|
||||||
|
"pasteAsPlaintext": "প্লেইনটেক্সট হিসাবে পেস্ট করুন",
|
||||||
|
"pasteCharts": "চার্ট পেস্ট করুন",
|
||||||
|
"selectAll": "সবটা সিলেক্ট করুন",
|
||||||
|
"multiSelect": "একাধিক সিলেক্ট করুন",
|
||||||
|
"moveCanvas": "ক্যানভাস সরান",
|
||||||
|
"cut": "কাট করুন",
|
||||||
|
"copy": "কপি করুন",
|
||||||
|
"copyAsPng": "পীএনজী ছবির মতন কপি করুন",
|
||||||
|
"copyAsSvg": "এসভীজী ছবির মতন কপি করুন",
|
||||||
|
"copyText": "লিখিত তথ্যের মতন কপি করুন",
|
||||||
|
"copySource": "পিএনজি ছবি ক্লিপবোর্ডে কপি করুন",
|
||||||
|
"convertToCode": "কোডে রূপান্তর করুন",
|
||||||
|
"bringForward": "অধিকতর সামনে আনুন",
|
||||||
|
"sendToBack": "অধিকতর পিছনে নিয়ে যান",
|
||||||
|
"bringToFront": "সবার সামনে আনুন",
|
||||||
|
"sendBackward": "সবার পিছনে নিয়ে যান",
|
||||||
|
"delete": "মুছা",
|
||||||
|
"copyStyles": "ডিজাইন কপি করুন",
|
||||||
|
"pasteStyles": "ডিজাইন পেস্ট করুন",
|
||||||
|
"stroke": "রেখাংশ",
|
||||||
|
"changeStroke": "Hi",
|
||||||
|
"background": "পটভূমি",
|
||||||
|
"changeBackground": "পটভূমির রঙ পরিবর্তন করুন",
|
||||||
|
"fill": "রং",
|
||||||
|
"strokeWidth": "রেখাংশের বেধ",
|
||||||
|
"strokeStyle": "রেখাংশের ডিজাইন",
|
||||||
|
"strokeStyle_solid": "পুরু",
|
||||||
|
"strokeStyle_dashed": "পাতলা",
|
||||||
|
"strokeStyle_dotted": "বিন্দুবিন্দু",
|
||||||
|
"sloppiness": "ভ্রান্তি",
|
||||||
|
"opacity": "দৃশ্যমানতা",
|
||||||
|
"textAlign": "লেখ অনুভূমি",
|
||||||
|
"edges": "কোণ",
|
||||||
|
"sharp": "তীক্ষ্ণ",
|
||||||
|
"round": "গোল",
|
||||||
|
"arrowheads": "তীরের শীর্ষভাগ",
|
||||||
|
"arrowhead_none": "কিছু না",
|
||||||
|
"arrowhead_arrow": "তীর",
|
||||||
|
"arrowhead_bar": "রেখাংশ",
|
||||||
|
"arrowhead_circle": "বৃত্ত",
|
||||||
|
"arrowhead_circle_outline": "বৃত্তীয় (প্রান্তরেখা) প্রান্তরেখা",
|
||||||
|
"arrowhead_triangle": "ত্রিভূজ",
|
||||||
|
"arrowhead_triangle_outline": "ত্রিভুজ (প্রান্তরেখা) প্রান্তরেখা",
|
||||||
|
"arrowhead_diamond": "হীরক",
|
||||||
|
"arrowhead_diamond_outline": "হীরক (প্রান্তরেখা)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "",
|
||||||
|
"arrowtype_sharp": "",
|
||||||
|
"arrowtype_round": "",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
|
"fontSize": "লেখনীর মাত্রা",
|
||||||
|
"fontFamily": "লেখনীর হরফ",
|
||||||
|
"addWatermark": "এক্সক্যালিড্র দ্বারা প্রস্তুত",
|
||||||
|
"handDrawn": "হাতে আঁকা",
|
||||||
|
"normal": "স্বাভাবিক",
|
||||||
|
"code": "কোড",
|
||||||
|
"small": "ছোট",
|
||||||
|
"medium": "মাঝারি",
|
||||||
|
"large": "বড়",
|
||||||
|
"veryLarge": "অনেক বড়",
|
||||||
|
"solid": "দৃঢ়",
|
||||||
|
"hachure": "ভ্রুলেখা",
|
||||||
|
"zigzag": "আঁকাবাঁকা",
|
||||||
|
"crossHatch": "ক্রস হ্যাচ",
|
||||||
|
"thin": "পাতলা",
|
||||||
|
"bold": "পুরু",
|
||||||
|
"left": "বাম",
|
||||||
|
"center": "কেন্দ্র",
|
||||||
|
"right": "ডান",
|
||||||
|
"extraBold": "অতি পুরু",
|
||||||
|
"architect": "স্থপতি",
|
||||||
|
"artist": "শিল্পী",
|
||||||
|
"cartoonist": "চিত্রকার",
|
||||||
|
"fileTitle": "ফাইলের নাম",
|
||||||
|
"colorPicker": "রং পছন্দ করুন",
|
||||||
|
"canvasColors": "ক্যানভাসের রং",
|
||||||
|
"canvasBackground": "ক্যানভাসের পটভূমি",
|
||||||
|
"drawingCanvas": "ব্যবহৃত ক্যানভাস",
|
||||||
|
"clearCanvas": "পরিষ্কার ক্যানভাস",
|
||||||
|
"layers": "মাত্রা",
|
||||||
|
"actions": "ক্রিয়া",
|
||||||
|
"language": "ভাষা",
|
||||||
|
"liveCollaboration": "সরাসরি পারস্পরিক সহযোগিতা...",
|
||||||
|
"duplicateSelection": "সদৃশ সিলেক্ট",
|
||||||
|
"untitled": "অনামী",
|
||||||
|
"name": "নাম",
|
||||||
|
"yourName": "আপনার নাম",
|
||||||
|
"madeWithExcalidraw": "এক্সক্যালিড্র দ্বারা তৈরি",
|
||||||
|
"group": "দল গঠন করুন",
|
||||||
|
"ungroup": "দল বিভেদ করুন",
|
||||||
|
"collaborators": "সহযোগী",
|
||||||
|
"toggleGrid": "",
|
||||||
|
"addToLibrary": "সংগ্রহে যোগ করুন",
|
||||||
|
"removeFromLibrary": "সংগ্রহ থেকে বের করুন",
|
||||||
|
"libraryLoadingMessage": "সংগ্রহ তৈরি হচ্ছে",
|
||||||
|
"libraries": "সংগ্রহ দেখুন",
|
||||||
|
"loadingScene": "দৃশ্য তৈরি হচ্ছে",
|
||||||
|
"loadScene": "",
|
||||||
|
"align": "পংক্তিবিন্যাস",
|
||||||
|
"alignTop": "উপর পংক্তি",
|
||||||
|
"alignBottom": "নিম্ন পংক্তি",
|
||||||
|
"alignLeft": "বাম পংক্তি",
|
||||||
|
"alignRight": "ডান পংক্তি",
|
||||||
|
"centerVertically": "উলম্ব কেন্দ্রিত",
|
||||||
|
"centerHorizontally": "অনুভূমিক কেন্দ্রিত",
|
||||||
|
"distributeHorizontally": "অনুভূমিকভাবে বিতরণ করুন",
|
||||||
|
"distributeVertically": "উল্লম্বভাবে বিতরণ করুন",
|
||||||
|
"flipHorizontal": "অনুভূমিক আবর্তন",
|
||||||
|
"flipVertical": "উলম্ব আবর্তন",
|
||||||
|
"viewMode": "দৃশ্য",
|
||||||
|
"share": "ভাগ করুন",
|
||||||
|
"showStroke": "",
|
||||||
|
"showBackground": "পটভূমির রঙ নির্বাচনকারী অপশন দেখান",
|
||||||
|
"showFonts": "",
|
||||||
|
"toggleTheme": "",
|
||||||
|
"theme": "",
|
||||||
|
"personalLib": "ব্যক্তিগত লাইব্রেরি",
|
||||||
|
"excalidrawLib": "এক্সক্যালিড্র লাইব্রেরি",
|
||||||
|
"decreaseFontSize": "লেখনীর মাত্রা কমান",
|
||||||
|
"increaseFontSize": "লেখনীর মাত্রা বাড়ান",
|
||||||
|
"unbindText": "লেখার জোড় খুলুন",
|
||||||
|
"bindText": "কন্টেইনারের সাথে লেখা জোড়া লাগান",
|
||||||
|
"createContainerFromText": "",
|
||||||
|
"link": {
|
||||||
|
"edit": "লিঙ্ক সংশোধন",
|
||||||
|
"editEmbed": "",
|
||||||
|
"create": "",
|
||||||
|
"label": "লিঙ্ক নামকরণ",
|
||||||
|
"labelEmbed": "লিংক ও এম্বেড",
|
||||||
|
"empty": "কোন লিংক সেট করা নেই",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
|
},
|
||||||
|
"lineEditor": {
|
||||||
|
"edit": "লাইন সম্পাদনা করুন",
|
||||||
|
"editArrow": ""
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
|
},
|
||||||
|
"elementLock": {
|
||||||
|
"lock": "আবদ্ধ করুন",
|
||||||
|
"unlock": "বিচ্ছিন্ন করুন",
|
||||||
|
"lockAll": "সব আবদ্ধ করুন",
|
||||||
|
"unlockAll": "সব বিচ্ছিন্ন করুন"
|
||||||
|
},
|
||||||
|
"statusPublished": "প্রকাশিত",
|
||||||
|
"sidebarLock": "লক",
|
||||||
|
"selectAllElementsInFrame": "ফ্রেমের ভিতরের সব উপকরণ বাছাই করুন",
|
||||||
|
"removeAllElementsFromFrame": "ফ্রেম থেকে সব উপকরণ মুছুন",
|
||||||
|
"eyeDropper": "ক্যানভাস থেকে রঙ বাছাই করুন",
|
||||||
|
"textToDiagram": "লেখা থেকে ডায়াগ্রাম",
|
||||||
|
"prompt": "",
|
||||||
|
"followUs": "",
|
||||||
|
"discordChat": "",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"installPWA": "",
|
||||||
|
"autoResize": "",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
|
},
|
||||||
|
"library": {
|
||||||
|
"noItems": "সংগ্রহে কিছু যোগ করা হয়নি",
|
||||||
|
"hint_emptyLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন, অথবা নীচে, প্রকাশ্য সংগ্রহশালা থেকে একটি সংগ্রহ ইনস্টল করুন৷",
|
||||||
|
"hint_emptyPrivateLibrary": "এখানে যোগ করার জন্য ক্যানভাসে একটি বস্তু নির্বাচন করুন",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"clearReset": "ক্যানভাস সাফ করুন",
|
||||||
|
"exportJSON": "জেসন নিবদ্ধ করুন",
|
||||||
|
"exportImage": "",
|
||||||
|
"export": "",
|
||||||
|
"copyToClipboard": "ক্লিপবোর্ডে কপি করুন",
|
||||||
|
"copyLink": "",
|
||||||
|
"save": "জমা করুন",
|
||||||
|
"saveAs": "অন্যভাবে জমা করুন",
|
||||||
|
"load": "",
|
||||||
|
"getShareableLink": "ভাগযোগ্য লিঙ্ক পান",
|
||||||
|
"close": "বন্ধ করুন",
|
||||||
|
"selectLanguage": "ভাষা চিহ্নিত করুন",
|
||||||
|
"scrollBackToContent": "বিষয়বস্তুতে ফেরত যান",
|
||||||
|
"zoomIn": "বড় করুন",
|
||||||
|
"zoomOut": "ছোট করুন",
|
||||||
|
"resetZoom": "স্বাভাবিক করুন",
|
||||||
|
"menu": "তালিকা",
|
||||||
|
"done": "সম্পন্ন",
|
||||||
|
"edit": "সংশোধন করুন",
|
||||||
|
"undo": "ফেরত যান",
|
||||||
|
"redo": "পুনরায় করুন",
|
||||||
|
"resetLibrary": "সংগ্রহ সাফ করুন",
|
||||||
|
"createNewRoom": "নতুন রুম বানান",
|
||||||
|
"fullScreen": "পূর্ণস্ক্রীন",
|
||||||
|
"darkMode": "ডার্ক মোড",
|
||||||
|
"lightMode": "লাইট মোড",
|
||||||
|
"systemMode": "",
|
||||||
|
"zenMode": "জেন মোড",
|
||||||
|
"objectsSnapMode": "",
|
||||||
|
"exitZenMode": "জেন মোড বন্ধ করুন",
|
||||||
|
"cancel": "বাতিল",
|
||||||
|
"saveLibNames": "",
|
||||||
|
"clear": "সাফ",
|
||||||
|
"remove": "বিয়োগ",
|
||||||
|
"embed": "",
|
||||||
|
"publishLibrary": "",
|
||||||
|
"submit": "জমা করুন",
|
||||||
|
"confirm": "নিশ্চিত করুন",
|
||||||
|
"embeddableInteractionButton": ""
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"clearReset": "এটি পুরো ক্যানভাস সাফ করবে। আপনি কি নিশ্চিত?",
|
||||||
|
"couldNotCreateShareableLink": "ভাগ করা যায় এমন লিঙ্ক তৈরি করা যায়নি।",
|
||||||
|
"couldNotCreateShareableLinkTooBig": "ভাগ করা যায় এমন লিঙ্ক তৈরি করা যায়নি: দৃশ্যটি খুব বড়",
|
||||||
|
"couldNotLoadInvalidFile": "অবৈধ ফাইল লোড করা যায়নি",
|
||||||
|
"importBackendFailed": "ব্যাকেন্ড থেকে আপলোড ব্যর্থ হয়েছে।",
|
||||||
|
"cannotExportEmptyCanvas": "খালি ক্যানভাস নিবদ্ধ করা যাবে না।",
|
||||||
|
"couldNotCopyToClipboard": "ক্লিপবোর্ডে কপি করা যায়নি।",
|
||||||
|
"decryptFailed": "তথ্য ডিক্রিপ্ট করা যায়নি।",
|
||||||
|
"uploadedSecurly": "আপলোডটি এন্ড-টু-এন্ড এনক্রিপশনের মাধ্যমে সুরক্ষিত করা হয়েছে, যার অর্থ হল এক্সক্যালিড্র সার্ভার এবং তৃতীয় পক্ষের দ্বারা পড়তে পারা সম্ভব নয়।",
|
||||||
|
"loadSceneOverridePrompt": "বাহ্যিক অঙ্কন লোড করা আপনার বিদ্যমান দৃশ্য প্রতিস্থাপন করবে। আপনি কি অবিরত করতে চান?",
|
||||||
|
"collabStopOverridePrompt": "অধিবেশন বন্ধ করা আপনার পূর্ববর্তী, স্থানীয়ভাবে সঞ্চিত অঙ্কন ওভাররাইট করবে। আপনি কি নিশ্চিত?\n\n(যদি আপনি আপনার স্থানীয় অঙ্কন রাখতে চান, তাহলে শুধু ব্রাউজার ট্যাবটি বন্ধ করুন।)",
|
||||||
|
"errorAddingToLibrary": "বস্তুটি সংগ্রহে যোগ করা যায়নি",
|
||||||
|
"errorRemovingFromLibrary": "বস্তুটি সংগ্রহ থেকে বিয়োগ করা যায়নি",
|
||||||
|
"confirmAddLibrary": "এটি আপনার সংগ্রহে {{numShapes}} আকার(গুলি) যোগ করবে। আপনি কি নিশ্চিত?",
|
||||||
|
"imageDoesNotContainScene": "এই ছবিতে কোনো দৃশ্যের তথ্য আছে বলে মনে হয় না৷ আপনি কি নিবদ্ধ করার সময় দৃশ্য এমবেডিং করতে সক্ষম?",
|
||||||
|
"cannotRestoreFromImage": "এই ফাইল থেকে দৃশ্য পুনরুদ্ধার করা যায়নি",
|
||||||
|
"invalidSceneUrl": "সরবরাহ করা লিঙ্ক থেকে দৃশ্য লোড করা যায়নি৷ এটি হয় বিকৃত, অথবা বৈধ এক্সক্যালিড্র জেসন তথ্য নেই৷",
|
||||||
|
"resetLibrary": "এটি আপনার সংগ্রহ পরিষ্কার করবে। আপনি কি নিশ্চিত?",
|
||||||
|
"removeItemsFromsLibrary": "সংগ্রহ থেকে {{count}} বস্তু বিয়োগ করা হবে। আপনি কি নিশ্চিত?",
|
||||||
|
"invalidEncryptionKey": "অবৈধ এনক্রীপশন কী।",
|
||||||
|
"collabOfflineWarning": "",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"unsupportedFileType": "অসমর্থিত ফাইল।",
|
||||||
|
"imageInsertError": "ছবি সন্নিবেশ করা যায়নি। পরে আবার চেষ্টা করুন...",
|
||||||
|
"fileTooBig": "ফাইলটি খুব বড়। সর্বাধিক অনুমোদিত আকার হল {{maxSize}}৷",
|
||||||
|
"svgImageInsertError": "এসভীজী ছবি সন্নিবেশ করা যায়নি। এসভীজী মার্কআপটি অবৈধ মনে হচ্ছে৷",
|
||||||
|
"failedToFetchImage": "",
|
||||||
|
"cannotResolveCollabServer": "কোল্যাব সার্ভারের সাথে সংযোগ করা যায়নি। পৃষ্ঠাটি পুনরায় লোড করে আবার চেষ্টা করুন।",
|
||||||
|
"importLibraryError": "সংগ্রহ লোড করা যায়নি",
|
||||||
|
"saveLibraryError": "",
|
||||||
|
"collabSaveFailed": "",
|
||||||
|
"collabSaveFailed_sizeExceeded": "",
|
||||||
|
"imageToolNotSupported": "",
|
||||||
|
"brave_measure_text_error": {
|
||||||
|
"line1": "",
|
||||||
|
"line2": "",
|
||||||
|
"line3": "",
|
||||||
|
"line4": ""
|
||||||
|
},
|
||||||
|
"libraryElementTypeError": {
|
||||||
|
"embeddable": "",
|
||||||
|
"iframe": "",
|
||||||
|
"image": ""
|
||||||
|
},
|
||||||
|
"asyncPasteFailedOnRead": "",
|
||||||
|
"asyncPasteFailedOnParse": "",
|
||||||
|
"copyToSystemClipboardFailed": ""
|
||||||
|
},
|
||||||
|
"toolBar": {
|
||||||
|
"selection": "বাছাই",
|
||||||
|
"lasso": "",
|
||||||
|
"image": "চিত্র সন্নিবেশ",
|
||||||
|
"rectangle": "আয়তক্ষেত্র",
|
||||||
|
"diamond": "রুহিতন",
|
||||||
|
"ellipse": "উপবৃত্ত",
|
||||||
|
"arrow": "তীর",
|
||||||
|
"line": "রেখা",
|
||||||
|
"freedraw": "কলম",
|
||||||
|
"text": "লেখা",
|
||||||
|
"library": "সংগ্রহ",
|
||||||
|
"lock": "আঁকার পরে নির্বাচিত টুল সক্রিয় রাখুন",
|
||||||
|
"penMode": "",
|
||||||
|
"link": "",
|
||||||
|
"eraser": "ঝাড়ন",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"laser": "",
|
||||||
|
"hand": "",
|
||||||
|
"extraTools": "",
|
||||||
|
"mermaidToExcalidraw": "",
|
||||||
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "",
|
||||||
|
"text": "",
|
||||||
|
"image": "",
|
||||||
|
"group": "",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": ""
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"canvasActions": "ক্যানভাস কার্যকলাপ",
|
||||||
|
"selectedShapeActions": "বাছাই করা আকার(গুলি)র কার্যকলাপ",
|
||||||
|
"shapes": "আকার(গুলি)"
|
||||||
|
},
|
||||||
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
|
"linearElement": "একাধিক বিন্দু শুরু করতে ক্লিক করুন, একক লাইনের জন্য টেনে আনুন",
|
||||||
|
"arrowTool": "",
|
||||||
|
"freeDraw": "ক্লিক করুন এবং টেনে আনুন, আপনার কাজ শেষ হলে ছেড়ে দিন",
|
||||||
|
"text": "বিশেষ্য: আপনি নির্বাচন টুলের সাথে যে কোনো জায়গায় ডাবল-ক্লিক করে পাঠ্য যোগ করতে পারেন",
|
||||||
|
"embeddable": "",
|
||||||
|
"text_selected": "",
|
||||||
|
"text_editing": "",
|
||||||
|
"linearElementMulti": "",
|
||||||
|
"lockAngle": "",
|
||||||
|
"resize": "",
|
||||||
|
"resizeImage": "",
|
||||||
|
"rotate": "",
|
||||||
|
"lineEditor_info": "",
|
||||||
|
"lineEditor_line_info": "",
|
||||||
|
"lineEditor_pointSelected": "",
|
||||||
|
"lineEditor_nothingSelected": "",
|
||||||
|
"publishLibrary": "আপনার নিজস্ব সংগ্রহ প্রকাশ করুন",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
|
"firefox_clipboard_write": "",
|
||||||
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
|
},
|
||||||
|
"canvasError": {
|
||||||
|
"cannotShowPreview": "প্রিভিউ দেখাতে অপারগ",
|
||||||
|
"canvasTooBig": "ক্যানভাস অনেক বড়।",
|
||||||
|
"canvasTooBigTip": "বিশেষ্য: দূরতম উপাদানগুলোকে একটু কাছাকাছি নিয়ে যাওয়ার চেষ্টা করুন।"
|
||||||
|
},
|
||||||
|
"errorSplash": {
|
||||||
|
"headingMain": "একটি ত্রুটির সম্মুখীন হয়েছে৷ চেষ্টা করুন <button>পৃষ্ঠাটি পুনরায় লোড করার।</button>",
|
||||||
|
"clearCanvasMessage": "যদি পুনরায় লোড করা কাজ না করে, চেষ্টা করুন <button>ক্যানভাস পরিষ্কার করার।</button>",
|
||||||
|
"clearCanvasCaveat": " এর ফলে কাজের ক্ষতি হবে ",
|
||||||
|
"trackedToSentry": "ত্রুটি {{eventId}} আমাদের সিস্টেমে ট্র্যাক করা হয়েছিল।",
|
||||||
|
"openIssueMessage": "আমরা ত্রুটিতে আপনার দৃশ্যের তথ্য অন্তর্ভুক্ত না করার জন্য খুব সতর্ক ছিলাম। আপনার দৃশ্য ব্যক্তিগত না হলে, আমাদের অনুসরণ করার কথা বিবেচনা করুন <button>ত্রুটি ইতিবৃত্ত।</button> অনুগ্রহ করে GitHub ইস্যুতে অনুলিপি এবং পেস্ট করে নীচের তথ্য অন্তর্ভুক্ত করুন।",
|
||||||
|
"sceneContent": "দৃশ্য বিষয়বস্তু:"
|
||||||
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": ""
|
||||||
|
},
|
||||||
|
"roomDialog": {
|
||||||
|
"desc_intro": "",
|
||||||
|
"desc_privacy": "",
|
||||||
|
"button_startSession": "সেশন শুরু করুন",
|
||||||
|
"button_stopSession": "সেশন বন্ধ করুন",
|
||||||
|
"desc_inProgressIntro": "লাইভ-সহযোগীতার সেশন এখন চলছে।",
|
||||||
|
"desc_shareLink": "আপনি যার সাথে সহযোগিতা করতে চান তাদের সাথে এই লিঙ্কটি ভাগ করুন: ",
|
||||||
|
"desc_exitSession": "অধিবেশন বন্ধ করা আপনাকে রুম থেকে সংযোগ বিচ্ছিন্ন করবে, কিন্তু আপনি স্থানীয়ভাবে দৃশ্যের সাথে কাজ চালিয়ে যেতে সক্ষম হবেন। মনে রাখবেন যে এটি অন্য লোকেদের প্রভাবিত করবে না এবং তারা এখনও তাদের সংস্করণে সহযোগিতা করতে সক্ষম হবে।",
|
||||||
|
"shareTitle": "এক্সক্যালিড্র লাইভ সহযোগিতা সেশনে যোগ দিন"
|
||||||
|
},
|
||||||
|
"errorDialog": {
|
||||||
|
"title": "ত্রুটি"
|
||||||
|
},
|
||||||
|
"exportDialog": {
|
||||||
|
"disk_title": "",
|
||||||
|
"disk_details": "",
|
||||||
|
"disk_button": "",
|
||||||
|
"link_title": "",
|
||||||
|
"link_details": "",
|
||||||
|
"link_button": "",
|
||||||
|
"excalidrawplus_description": "",
|
||||||
|
"excalidrawplus_button": "নিবদ্ধ",
|
||||||
|
"excalidrawplus_exportError": ""
|
||||||
|
},
|
||||||
|
"helpDialog": {
|
||||||
|
"blog": "",
|
||||||
|
"click": "ক্লিক",
|
||||||
|
"deepSelect": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
|
"curvedArrow": "",
|
||||||
|
"curvedLine": "",
|
||||||
|
"documentation": "",
|
||||||
|
"doubleClick": "",
|
||||||
|
"drag": "",
|
||||||
|
"editor": "",
|
||||||
|
"editLineArrowPoints": "",
|
||||||
|
"editText": "",
|
||||||
|
"github": "",
|
||||||
|
"howto": "",
|
||||||
|
"or": "অথবা",
|
||||||
|
"preventBinding": "",
|
||||||
|
"tools": "",
|
||||||
|
"shortcuts": "",
|
||||||
|
"textFinish": "",
|
||||||
|
"textNewLine": "",
|
||||||
|
"title": "",
|
||||||
|
"view": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"zoomToSelection": "",
|
||||||
|
"toggleElementLock": "",
|
||||||
|
"movePageUpDown": "",
|
||||||
|
"movePageLeftRight": "",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
|
},
|
||||||
|
"clearCanvasDialog": {
|
||||||
|
"title": ""
|
||||||
|
},
|
||||||
|
"publishDialog": {
|
||||||
|
"title": "",
|
||||||
|
"itemName": "",
|
||||||
|
"authorName": "",
|
||||||
|
"githubUsername": "",
|
||||||
|
"twitterUsername": "",
|
||||||
|
"libraryName": "",
|
||||||
|
"libraryDesc": "",
|
||||||
|
"website": "",
|
||||||
|
"placeholder": {
|
||||||
|
"authorName": "",
|
||||||
|
"libraryName": "",
|
||||||
|
"libraryDesc": "",
|
||||||
|
"githubHandle": "",
|
||||||
|
"twitterHandle": "",
|
||||||
|
"website": ""
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"required": "",
|
||||||
|
"website": ""
|
||||||
|
},
|
||||||
|
"noteDescription": "",
|
||||||
|
"noteGuidelines": "",
|
||||||
|
"noteLicense": "",
|
||||||
|
"noteItems": "",
|
||||||
|
"atleastOneLibItem": "",
|
||||||
|
"republishWarning": ""
|
||||||
|
},
|
||||||
|
"publishSuccessDialog": {
|
||||||
|
"title": "",
|
||||||
|
"content": ""
|
||||||
|
},
|
||||||
|
"confirmDialog": {
|
||||||
|
"resetLibrary": "",
|
||||||
|
"removeItemsFromLib": ""
|
||||||
|
},
|
||||||
|
"imageExportDialog": {
|
||||||
|
"header": "",
|
||||||
|
"label": {
|
||||||
|
"withBackground": "",
|
||||||
|
"onlySelected": "",
|
||||||
|
"darkMode": "",
|
||||||
|
"embedScene": "",
|
||||||
|
"scale": "",
|
||||||
|
"padding": ""
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"embedScene": ""
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"exportToPng": "",
|
||||||
|
"exportToSvg": "",
|
||||||
|
"copyPngToClipboard": ""
|
||||||
|
},
|
||||||
|
"button": {
|
||||||
|
"exportToPng": "",
|
||||||
|
"exportToSvg": "",
|
||||||
|
"copyPngToClipboard": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"encrypted": {
|
||||||
|
"tooltip": "",
|
||||||
|
"link": ""
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"angle": "কোণ",
|
||||||
|
"shapes": "",
|
||||||
|
"height": "",
|
||||||
|
"scene": "",
|
||||||
|
"selected": "",
|
||||||
|
"storage": "",
|
||||||
|
"fullTitle": "",
|
||||||
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
|
"total": "",
|
||||||
|
"version": "",
|
||||||
|
"versionCopy": "",
|
||||||
|
"versionNotAvailable": "",
|
||||||
|
"width": "প্রস্থ"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"addedToLibrary": "সংগ্রহশালায় যুক্ত হয়েছে",
|
||||||
|
"copyStyles": "",
|
||||||
|
"copyToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে।",
|
||||||
|
"copyToClipboardAsPng": "",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
|
"fileSaved": "",
|
||||||
|
"fileSavedToFilename": "",
|
||||||
|
"canvas": "",
|
||||||
|
"selection": "বাছাই",
|
||||||
|
"pasteAsSingleElement": "",
|
||||||
|
"unableToEmbed": "",
|
||||||
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
|
},
|
||||||
|
"colors": {
|
||||||
|
"transparent": "",
|
||||||
|
"black": "",
|
||||||
|
"white": "",
|
||||||
|
"red": "",
|
||||||
|
"pink": "",
|
||||||
|
"grape": "",
|
||||||
|
"violet": "",
|
||||||
|
"gray": "",
|
||||||
|
"blue": "",
|
||||||
|
"cyan": "",
|
||||||
|
"teal": "",
|
||||||
|
"green": "",
|
||||||
|
"yellow": "",
|
||||||
|
"orange": "",
|
||||||
|
"bronze": ""
|
||||||
|
},
|
||||||
|
"welcomeScreen": {
|
||||||
|
"app": {
|
||||||
|
"center_heading": "",
|
||||||
|
"center_heading_plus": "",
|
||||||
|
"menuHint": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"menuHint": "",
|
||||||
|
"center_heading": "",
|
||||||
|
"toolbarHint": "",
|
||||||
|
"helpHint": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
|
"mostUsedCustomColors": "",
|
||||||
|
"colors": "",
|
||||||
|
"shades": "",
|
||||||
|
"hexCode": "",
|
||||||
|
"noShades": ""
|
||||||
|
},
|
||||||
|
"overwriteConfirm": {
|
||||||
|
"action": {
|
||||||
|
"exportToImage": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"saveToDisk": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"excalidrawPlus": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"loadFromFile": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"shareableLink": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mermaid": {
|
||||||
|
"title": "",
|
||||||
|
"button": "",
|
||||||
|
"description": "",
|
||||||
|
"syntax": "",
|
||||||
|
"preview": ""
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "",
|
||||||
|
"followStatus": "",
|
||||||
|
"inCall": "",
|
||||||
|
"micMuted": "",
|
||||||
|
"isSpeaking": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "",
|
||||||
|
"confirm": "",
|
||||||
|
"close": ""
|
||||||
|
},
|
||||||
|
"recents": "",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "Copia al porta-retalls com a PNG",
|
"copyAsPng": "Copia al porta-retalls com a PNG",
|
||||||
"copyAsSvg": "Copia al porta-retalls com a SVG",
|
"copyAsSvg": "Copia al porta-retalls com a SVG",
|
||||||
"copyText": "Copia al porta-retalls com a text",
|
"copyText": "Copia al porta-retalls com a text",
|
||||||
"copySource": "Copia l'origen al porta-retalls",
|
"copySource": "Copia al porta-retalls",
|
||||||
"convertToCode": "",
|
"convertToCode": "Converteix a codi",
|
||||||
"bringForward": "Porta endavant",
|
"bringForward": "Porta endavant",
|
||||||
"sendToBack": "Envia enrere",
|
"sendToBack": "Envia enrere",
|
||||||
"bringToFront": "Porta al davant",
|
"bringToFront": "Porta al davant",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Copia els estils",
|
"copyStyles": "Copia els estils",
|
||||||
"pasteStyles": "Enganxa els estils",
|
"pasteStyles": "Enganxa els estils",
|
||||||
"stroke": "Color del traç",
|
"stroke": "Color del traç",
|
||||||
|
"changeStroke": "Canvia el color del traç",
|
||||||
"background": "Color del fons",
|
"background": "Color del fons",
|
||||||
|
"changeBackground": "Canvia el color de fons",
|
||||||
"fill": "Estil del fons",
|
"fill": "Estil del fons",
|
||||||
"strokeWidth": "Amplada del traç",
|
"strokeWidth": "Amplada del traç",
|
||||||
"strokeStyle": "Estil del traç",
|
"strokeStyle": "Estil del traç",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Cap",
|
"arrowhead_none": "Cap",
|
||||||
"arrowhead_arrow": "Fletxa",
|
"arrowhead_arrow": "Fletxa",
|
||||||
"arrowhead_bar": "Barra",
|
"arrowhead_bar": "Barra",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Cercle",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Circumferència",
|
||||||
"arrowhead_triangle": "Triangle",
|
"arrowhead_triangle": "Triangle",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Triangle (vora)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Rombe",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Rombe (vora)",
|
||||||
|
"arrowhead_crowfoot_many": "Potes de gall (moltes)",
|
||||||
|
"arrowhead_crowfoot_one": "Potes de gall (una)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Potes de gall (una o moltes)",
|
||||||
|
"more_options": "Més opcions",
|
||||||
|
"arrowtypes": "Tipus de fletxa",
|
||||||
|
"arrowtype_sharp": "Fletxa Esmolada",
|
||||||
|
"arrowtype_round": "Fletxa corba",
|
||||||
|
"arrowtype_elbowed": "Fletxa de colzes",
|
||||||
"fontSize": "Mida de lletra",
|
"fontSize": "Mida de lletra",
|
||||||
"fontFamily": "Tipus de lletra",
|
"fontFamily": "Tipus de lletra",
|
||||||
"addWatermark": "Afegeix-hi «Fet amb Excalidraw»",
|
"addWatermark": "Afegeix-hi «Fet amb Excalidraw»",
|
||||||
@@ -56,7 +66,7 @@
|
|||||||
"veryLarge": "Molt gran",
|
"veryLarge": "Molt gran",
|
||||||
"solid": "Sòlid",
|
"solid": "Sòlid",
|
||||||
"hachure": "Ratlletes",
|
"hachure": "Ratlletes",
|
||||||
"zigzag": "",
|
"zigzag": "Ziga-zaga",
|
||||||
"crossHatch": "Ratlletes creuades",
|
"crossHatch": "Ratlletes creuades",
|
||||||
"thin": "Fi",
|
"thin": "Fi",
|
||||||
"bold": "Negreta",
|
"bold": "Negreta",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Usat al llenç",
|
"canvasColors": "Usat al llenç",
|
||||||
"canvasBackground": "Fons del llenç",
|
"canvasBackground": "Fons del llenç",
|
||||||
"drawingCanvas": "Llenç de dibuix",
|
"drawingCanvas": "Llenç de dibuix",
|
||||||
|
"clearCanvas": "Neteja el llenç",
|
||||||
"layers": "Capes",
|
"layers": "Capes",
|
||||||
"actions": "Accions",
|
"actions": "Accions",
|
||||||
"language": "Llengua",
|
"language": "Llengua",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Agrupa la selecció",
|
"group": "Agrupa la selecció",
|
||||||
"ungroup": "Desagrupa la selecció",
|
"ungroup": "Desagrupa la selecció",
|
||||||
"collaborators": "Col·laboradors",
|
"collaborators": "Col·laboradors",
|
||||||
"showGrid": "Mostra la graella",
|
"toggleGrid": "Alterna la quadrícula",
|
||||||
"addToLibrary": "Afegir a la biblioteca",
|
"addToLibrary": "Afegir a la biblioteca",
|
||||||
"removeFromLibrary": "Eliminar de la biblioteca",
|
"removeFromLibrary": "Eliminar de la biblioteca",
|
||||||
"libraryLoadingMessage": "S'està carregant la biblioteca…",
|
"libraryLoadingMessage": "S'està carregant la biblioteca…",
|
||||||
"libraries": "Explora les biblioteques",
|
"libraries": "Explora les biblioteques",
|
||||||
"loadingScene": "S'està carregant l'escena…",
|
"loadingScene": "S'està carregant l'escena…",
|
||||||
|
"loadScene": "Carrega una escena des d'un fitxer",
|
||||||
"align": "Alinea",
|
"align": "Alinea",
|
||||||
"alignTop": "Alinea a la part superior",
|
"alignTop": "Alinea a la part superior",
|
||||||
"alignBottom": "Alinea a la part inferior",
|
"alignBottom": "Alinea a la part inferior",
|
||||||
@@ -105,26 +117,33 @@
|
|||||||
"share": "Comparteix",
|
"share": "Comparteix",
|
||||||
"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",
|
"showFonts": "Mostra el selector tipogràfic",
|
||||||
|
"toggleTheme": "Alternar tema clar i fosc",
|
||||||
|
"theme": "Tema",
|
||||||
"personalLib": "Biblioteca personal",
|
"personalLib": "Biblioteca personal",
|
||||||
"excalidrawLib": "Biblioteca d'Excalidraw",
|
"excalidrawLib": "Biblioteca d'Excalidraw",
|
||||||
"decreaseFontSize": "Redueix la mida de la lletra",
|
"decreaseFontSize": "Redueix la mida de la lletra",
|
||||||
"increaseFontSize": "Augmenta la mida de la lletra",
|
"increaseFontSize": "Augmenta la mida de la lletra",
|
||||||
"unbindText": "Desvincular el text",
|
"unbindText": "Desvincular el text",
|
||||||
"bindText": "Ajusta el text al contenidor",
|
"bindText": "Ajusta el text al contenidor",
|
||||||
"createContainerFromText": "",
|
"createContainerFromText": "Ajusta el text al contenidor",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Edita l'enllaç",
|
"edit": "Edita l'enllaç",
|
||||||
"editEmbed": "Edita l'enllaç i incrusta-ho",
|
"editEmbed": "Editar enllaç incrustable",
|
||||||
"create": "Crea un enllaç",
|
"create": "Afegir un enllaç",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "Enllaç",
|
"label": "Enllaç",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "Enllaça i encasta",
|
||||||
"empty": "No s'ha definit cap enllaç"
|
"empty": "No s'ha definit cap enllaç",
|
||||||
|
"hint": "Escriu o enganxa un enllaç aquí",
|
||||||
|
"goToElement": "Anar a l'element objectiu"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Editar línia",
|
"edit": "Editar línia",
|
||||||
"exit": "Sortir de l'editor de línia"
|
"editArrow": "Edita la fletxa"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Bloca",
|
"lock": "Bloca",
|
||||||
@@ -135,15 +154,49 @@
|
|||||||
"statusPublished": "Publicat",
|
"statusPublished": "Publicat",
|
||||||
"sidebarLock": "Manté la barra lateral oberta",
|
"sidebarLock": "Manté la barra lateral oberta",
|
||||||
"selectAllElementsInFrame": "Selecciona tots els elements del marc",
|
"selectAllElementsInFrame": "Selecciona tots els elements del marc",
|
||||||
"removeAllElementsFromFrame": "Eliminat tots els elements del marc",
|
"removeAllElementsFromFrame": "Elimina tots els elements del marc",
|
||||||
"eyeDropper": "",
|
"eyeDropper": "Tria un color del llenç",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "Text a diagrama",
|
||||||
"prompt": ""
|
"prompt": "Prompt",
|
||||||
|
"followUs": "Seguiu-nos",
|
||||||
|
"discordChat": "Xat de Discord",
|
||||||
|
"zoomToFitViewport": "Amplia per adaptar-se a la finestra",
|
||||||
|
"zoomToFitSelection": "Zoom per veure la selecció",
|
||||||
|
"zoomToFit": "Zoom per veure tots els elements",
|
||||||
|
"installPWA": "Instal·la Excalidraw localment (PWA)",
|
||||||
|
"autoResize": "Activa la redimensió de text automàtica",
|
||||||
|
"imageCropping": "Retallar la imatge",
|
||||||
|
"unCroppedDimension": "Dimensió sense retallar",
|
||||||
|
"copyElementLink": "Copiar enllaç a objecte",
|
||||||
|
"linkToElement": "Enllaç a l'objecte",
|
||||||
|
"wrapSelectionInFrame": "Embolica la selecció en un marc",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "Enllaç a l'objecte",
|
||||||
|
"desc": "Fes clic en una forma al llenç o enganxa un enllaç.",
|
||||||
|
"notFound": "L'objecte enllaçat no s'ha trobat al llenç."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Encara no s'hi han afegit elements...",
|
"noItems": "Encara no s'hi han afegit elements...",
|
||||||
"hint_emptyLibrary": "Trieu un element o un llenç per a afegir-lo aquí, o instal·leu una biblioteca del repositori públic, més avall.",
|
"hint_emptyLibrary": "Trieu un element o un llenç per a afegir-lo aquí, o instal·leu una biblioteca del repositori públic, més avall.",
|
||||||
"hint_emptyPrivateLibrary": "Trieu un element o un llenç per a afegir-lo aquí."
|
"hint_emptyPrivateLibrary": "Trieu un element o un llenç per a afegir-lo aquí.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "Troba al llenç",
|
||||||
|
"noMatch": "No hem trobat coincidències...",
|
||||||
|
"singleResult": "resultat",
|
||||||
|
"multipleResults": "resultats",
|
||||||
|
"placeholder": "Troba al llenç...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Neteja el llenç",
|
"clearReset": "Neteja el llenç",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Exporta la imatge...",
|
"exportImage": "Exporta la imatge...",
|
||||||
"export": "Guardar a...",
|
"export": "Guardar a...",
|
||||||
"copyToClipboard": "Copia al porta-retalls",
|
"copyToClipboard": "Copia al porta-retalls",
|
||||||
|
"copyLink": "Copia l'enllaç",
|
||||||
"save": "Desa al fitxer actual",
|
"save": "Desa al fitxer actual",
|
||||||
"saveAs": "Anomena i desa",
|
"saveAs": "Anomena i desa",
|
||||||
"load": "Obrir",
|
"load": "Obrir",
|
||||||
@@ -171,14 +225,16 @@
|
|||||||
"fullScreen": "Pantalla completa",
|
"fullScreen": "Pantalla completa",
|
||||||
"darkMode": "Mode fosc",
|
"darkMode": "Mode fosc",
|
||||||
"lightMode": "Mode clar",
|
"lightMode": "Mode clar",
|
||||||
|
"systemMode": "Mode del sistema",
|
||||||
"zenMode": "Mode zen",
|
"zenMode": "Mode zen",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "Ajusta als objectes",
|
||||||
"exitZenMode": "Surt de mode zen",
|
"exitZenMode": "Surt de mode zen",
|
||||||
"cancel": "Cancel·la",
|
"cancel": "Cancel·la",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Neteja",
|
"clear": "Neteja",
|
||||||
"remove": "Suprimeix",
|
"remove": "Suprimeix",
|
||||||
"embed": "",
|
"embed": "Commuta incrustació",
|
||||||
"publishLibrary": "Publica",
|
"publishLibrary": "",
|
||||||
"submit": "Envia",
|
"submit": "Envia",
|
||||||
"confirm": "Confirma",
|
"confirm": "Confirma",
|
||||||
"embeddableInteractionButton": "Feu clic per interactuar"
|
"embeddableInteractionButton": "Feu clic per interactuar"
|
||||||
@@ -204,37 +260,39 @@
|
|||||||
"resetLibrary": "Això buidarà la biblioteca. N'esteu segur?",
|
"resetLibrary": "Això buidarà la biblioteca. N'esteu segur?",
|
||||||
"removeItemsFromsLibrary": "Suprimir {{count}} element(s) de la biblioteca?",
|
"removeItemsFromsLibrary": "Suprimir {{count}} element(s) de la biblioteca?",
|
||||||
"invalidEncryptionKey": "La clau d'encriptació ha de tenir 22 caràcters. La col·laboració en directe està desactivada.",
|
"invalidEncryptionKey": "La clau d'encriptació ha de tenir 22 caràcters. La col·laboració en directe està desactivada.",
|
||||||
"collabOfflineWarning": "Sense connexió a internet disponible.\nEls vostres canvis no seran guardats!"
|
"collabOfflineWarning": "Sense connexió a internet disponible.\nEls vostres canvis no seran guardats!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Tipus de fitxer no suportat.",
|
"unsupportedFileType": "Tipus de fitxer no suportat.",
|
||||||
"imageInsertError": "No s'ha pogut insertar la imatge, torneu-ho a provar més tard...",
|
"imageInsertError": "No s'ha pogut insertar la imatge, torneu-ho a provar més tard...",
|
||||||
"fileTooBig": "El fitxer és massa gros. La mida màxima permesa és {{maxSize}}.",
|
"fileTooBig": "El fitxer és massa gros. La mida màxima permesa és {{maxSize}}.",
|
||||||
"svgImageInsertError": "No ha estat possible inserir la imatge SVG. Les marques SVG semblen invàlides.",
|
"svgImageInsertError": "No ha estat possible inserir la imatge SVG. Les marques SVG semblen invàlides.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "No s'ha pogut obtenir la imatge.",
|
||||||
"invalidSVGString": "SVG no vàlid.",
|
|
||||||
"cannotResolveCollabServer": "No ha estat possible connectar amb el servidor collab. Si us plau recarregueu la pàgina i torneu a provar.",
|
"cannotResolveCollabServer": "No ha estat possible connectar amb el servidor collab. Si us plau recarregueu la pàgina i torneu a provar.",
|
||||||
"importLibraryError": "No s'ha pogut carregar la biblioteca",
|
"importLibraryError": "No s'ha pogut carregar la biblioteca",
|
||||||
|
"saveLibraryError": "No hem pogut desar la llibreria a l'emmagatzematge. Si us plau, deseu la vostra llibreria a un fitxer local per assegurar que no perds els canvis.",
|
||||||
"collabSaveFailed": "No s'ha pogut desar a la base de dades de fons. Si els problemes persisteixen, hauríeu de desar el fitxer localment per assegurar-vos que no perdeu el vostre treball.",
|
"collabSaveFailed": "No s'ha pogut desar a la base de dades de fons. Si els problemes persisteixen, hauríeu de desar el fitxer localment per assegurar-vos que no perdeu el vostre treball.",
|
||||||
"collabSaveFailed_sizeExceeded": "No s'ha pogut desar a la base de dades de fons, sembla que el llenç és massa gran. Hauríeu de desar el fitxer localment per assegurar-vos que no perdeu el vostre treball.",
|
"collabSaveFailed_sizeExceeded": "No s'ha pogut desar a la base de dades de fons, sembla que el llenç és massa gran. Hauríeu de desar el fitxer localment per assegurar-vos que no perdeu el vostre treball.",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "Les imatges no estan habilitades.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "",
|
"line1": "Sembla que feu servir el navegador Brave amb el <bold>blocatge agressiu d'indentificació única</bold> activat.",
|
||||||
"line2": "",
|
"line2": "Això podria provocar problemes amb els <bold>elements de text</bold> en els vostres dissenys.",
|
||||||
"line3": "",
|
"line3": "Us recomanem encaridament que desactiveu aquesta característica. Podeu seguir <link>aquests passos</link> per a fer-ho.",
|
||||||
"line4": ""
|
"line4": "Si els elements de text no es mostren correctament malgrat haver desactivat aquesta opció, si us plau, obriu una <issueLink>incidència</issueLink> a la nostra pàgina de GitHub o escriviu-nos a <discordLink>Discord</discordLink>"
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "",
|
"embeddable": "Els elements incrustables no poden afegir-se a la biblioteca.",
|
||||||
"iframe": "",
|
"iframe": "Elements IFrame no es poden afegir a la biblioteca.",
|
||||||
"image": ""
|
"image": "Suport per a afegir imatges a la biblioteca aviat!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "",
|
"asyncPasteFailedOnRead": "No s'ha pogut enganxar (no s'ha pogut llegir del porta-retalls del sistema).",
|
||||||
"asyncPasteFailedOnParse": "No s'ha pogut enganxar.",
|
"asyncPasteFailedOnParse": "No s'ha pogut enganxar.",
|
||||||
"copyToSystemClipboardFailed": ""
|
"copyToSystemClipboardFailed": "No s'ha pogut copiar al porta-retalls."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Selecció",
|
"selection": "Selecció",
|
||||||
|
"lasso": "",
|
||||||
"image": "Insereix imatge",
|
"image": "Insereix imatge",
|
||||||
"rectangle": "Rectangle",
|
"rectangle": "Rectangle",
|
||||||
"diamond": "Rombe",
|
"diamond": "Rombe",
|
||||||
@@ -246,16 +304,32 @@
|
|||||||
"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": "Mode de llapis - evita tocar",
|
"penMode": "Mode de llapis - evita tocar",
|
||||||
"link": "Afegeix / actualitza l'enllaç per a la forma seleccionada",
|
"link": "Afegeix/actualitza l'enllaç per a una forma seleccionada",
|
||||||
"eraser": "Esborrador",
|
"eraser": "Esborrador",
|
||||||
"frame": "",
|
"frame": "Eina de marc",
|
||||||
"magicframe": "",
|
"magicframe": "De Wireframe a codi",
|
||||||
"embeddable": "",
|
"embeddable": "Incrustació Web",
|
||||||
"laser": "",
|
"laser": "Punter làser",
|
||||||
"hand": "Mà (eina de desplaçament)",
|
"hand": "Mà (eina de desplaçament)",
|
||||||
"extraTools": "",
|
"extraTools": "Més eines",
|
||||||
"mermaidToExcalidraw": "De Mermaid a Excalidraw",
|
"mermaidToExcalidraw": "Mermaid a Excalidraw",
|
||||||
"magicSettings": "Preferències d'IA"
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Rectangle",
|
||||||
|
"diamond": "Rombe",
|
||||||
|
"ellipse": "El·lipse",
|
||||||
|
"arrow": "Fletxa",
|
||||||
|
"line": "Línia",
|
||||||
|
"freedraw": "Dibuix a mà alçada",
|
||||||
|
"text": "Text",
|
||||||
|
"image": "Imatge",
|
||||||
|
"group": "Grup",
|
||||||
|
"frame": "Marc",
|
||||||
|
"magicframe": "De Wireframe a codi",
|
||||||
|
"embeddable": "Incrustació Web",
|
||||||
|
"selection": "Selecció",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Accions del llenç",
|
"canvasActions": "Accions del llenç",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Formes"
|
"shapes": "Formes"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Per moure el llenç, manteniu premuda la roda del ratolí o la barra espaiadora mentre arrossegueu o utilitzeu l'eina manual",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"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",
|
||||||
|
"arrowTool": "",
|
||||||
"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ó",
|
||||||
"embeddable": "",
|
"embeddable": "Feu clic i arrossegueu per crear una Incrustació Web",
|
||||||
"text_selected": "Feu doble clic o premeu Retorn per a editar el text",
|
"text_selected": "",
|
||||||
"text_editing": "Premeu Escapada o Ctrl+Retorn (o Ordre+Retorn) per a finalitzar l'edició",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Feu clic a l'ultim punt, o pitgeu Esc o Retorn per a finalitzar",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Per restringir els angles, mantenir premut el majúscul (SHIFT)",
|
"lockAngle": "",
|
||||||
"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": "",
|
||||||
"resizeImage": "Podeu redimensionar lliurement prement MAJÚSCULA;\nper a redimensionar des del centre, premeu ALT",
|
"resizeImage": "",
|
||||||
"rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)",
|
"rotate": "",
|
||||||
"lineEditor_info": "Mantingueu premut Ctrl o Cmd i feu doble clic o premeu Ctrl o Cmd + Retorn per editar els punts",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Premeu Suprimir per a eliminar el(s) punt(s), CtrlOrCmd+D per a duplicar-lo, o arrossegueu-lo per a moure'l",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "Seleccioneu un punt per a editar-lo (premeu SHIFT si voleu\nselecció múltiple), o manteniu Alt i feu clic per a afegir més punts",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Feu clic per a col·locar la imatge o clic i arrossegar per a establir-ne la mida manualment",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Publiqueu la vostra pròpia llibreria",
|
"publishLibrary": "Publiqueu la vostra pròpia llibreria",
|
||||||
"bindTextToElement": "Premeu enter per a afegir-hi text",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Manteniu CtrlOrCmd per a selecció profunda, i per a evitar l'arrossegament",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Mantingueu premuda Alt per a revertir els elements seleccionats per a esborrar",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\".",
|
"firefox_clipboard_write": "És probable que aquesta funció es pugui activar posant la marca \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Per canviar les marques del navegador al Firefox, visiteu la pàgina \"about:config\".",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "No es pot mostrar la previsualització",
|
"cannotShowPreview": "No es pot mostrar la previsualització",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Anàvem amb molta cura de no incloure la informació de la vostra escena en l'error. Si l'escena no és privada, podeu fer-ne el seguiment al nostre <button>rastrejador d'errors.</button> Incloeu la informació a continuació copiant i enganxant a GitHub Issues.",
|
"openIssueMessage": "Anàvem amb molta cura de no incloure la informació de la vostra escena en l'error. Si l'escena no és privada, podeu fer-ne el seguiment al nostre <button>rastrejador d'errors.</button> Incloeu la informació a continuació copiant i enganxant a GitHub Issues.",
|
||||||
"sceneContent": "Contingut de l'escena:"
|
"sceneContent": "Contingut de l'escena:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "O"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Podeu convidar persones a la vostra escena actual a col·laborar amb vós.",
|
"desc_intro": "Convideu gent a col·laborar en el vostre disseny.",
|
||||||
"desc_privacy": "No us preocupeu, la sessió utilitza el xifratge de punta a punta, de manera que qualsevol cosa que dibuixeu romandrà privada. Ni tan sols el nostre servidor podrà veure què feu.",
|
"desc_privacy": "No us amoïneu, la sessió està encriptada d'extrem a extrem i és totalment privada. Ni tan sols el nostre servidor pot veure què dibuixeu.",
|
||||||
"button_startSession": "Inicia la sessió",
|
"button_startSession": "Inicia la sessió",
|
||||||
"button_stopSession": "Atura la sessió",
|
"button_stopSession": "Atura la sessió",
|
||||||
"desc_inProgressIntro": "La sessió de col·laboració en directe està en marxa.",
|
"desc_inProgressIntro": "La sessió de col·laboració en directe està en marxa.",
|
||||||
@@ -328,14 +410,16 @@
|
|||||||
"click": "clic",
|
"click": "clic",
|
||||||
"deepSelect": "Selecció profunda",
|
"deepSelect": "Selecció profunda",
|
||||||
"deepBoxSelect": "Seleccioneu profundament dins del quadre i eviteu arrossegar",
|
"deepBoxSelect": "Seleccioneu profundament dins del quadre i eviteu arrossegar",
|
||||||
|
"createFlowchart": "Crear un diagrama de flux a partir d'un element genèric",
|
||||||
|
"navigateFlowchart": "Navegar per un diagrama de flux",
|
||||||
"curvedArrow": "Fletxa corba",
|
"curvedArrow": "Fletxa corba",
|
||||||
"curvedLine": "Línia corba",
|
"curvedLine": "Línia corba",
|
||||||
"documentation": "Documentació",
|
"documentation": "Documentació",
|
||||||
"doubleClick": "doble clic",
|
"doubleClick": "doble clic",
|
||||||
"drag": "arrossega",
|
"drag": "arrossega",
|
||||||
"editor": "Editor",
|
"editor": "Editor",
|
||||||
"editLineArrowPoints": "",
|
"editLineArrowPoints": "Edita els punts de la línia/fletxa",
|
||||||
"editText": "",
|
"editText": "Edita text / afegeix etiqueta",
|
||||||
"github": "Hi heu trobat un problema? Informeu-ne",
|
"github": "Hi heu trobat un problema? Informeu-ne",
|
||||||
"howto": "Seguiu les nostres guies",
|
"howto": "Seguiu les nostres guies",
|
||||||
"or": "o",
|
"or": "o",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Zoom per veure la selecció",
|
"zoomToSelection": "Zoom per veure la selecció",
|
||||||
"toggleElementLock": "Blocar/desblocar la selecció",
|
"toggleElementLock": "Blocar/desblocar la selecció",
|
||||||
"movePageUpDown": "Mou la pàgina cap amunt/a baix",
|
"movePageUpDown": "Mou la pàgina cap amunt/a baix",
|
||||||
"movePageLeftRight": "Mou la pàgina cap a l'esquerra/dreta"
|
"movePageLeftRight": "Mou la pàgina cap a l'esquerra/dreta",
|
||||||
|
"cropStart": "Retallar l'imatge",
|
||||||
|
"cropFinish": "Finalitza el retall d'imatge"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Neteja el llenç"
|
"title": "Neteja el llenç"
|
||||||
@@ -392,27 +478,27 @@
|
|||||||
"removeItemsFromLib": "Suprimeix els elements seleccionats de la llibreria"
|
"removeItemsFromLib": "Suprimeix els elements seleccionats de la llibreria"
|
||||||
},
|
},
|
||||||
"imageExportDialog": {
|
"imageExportDialog": {
|
||||||
"header": "",
|
"header": "Exporteu la imatge",
|
||||||
"label": {
|
"label": {
|
||||||
"withBackground": "",
|
"withBackground": "Fons",
|
||||||
"onlySelected": "Només els seleccionats",
|
"onlySelected": "Només seleccionat",
|
||||||
"darkMode": "Mode fosc",
|
"darkMode": "Mode fosc",
|
||||||
"embedScene": "",
|
"embedScene": "Incrusta escena",
|
||||||
"scale": "",
|
"scale": "Escala",
|
||||||
"padding": ""
|
"padding": "Marge intern (padding)"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"embedScene": ""
|
"embedScene": "Les dades de l’escena es desaran al fitxer PNG/SVG de manera que es pugui restaurar l’escena.\nAixò farà augmentar la mida del fitxer exportat."
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"exportToPng": "Exporta a PNG",
|
"exportToPng": "Exporteu a PNG",
|
||||||
"exportToSvg": "Exporta a SVG",
|
"exportToSvg": "Exporteu a SVG",
|
||||||
"copyPngToClipboard": "Copia el PNG al porta-retalls"
|
"copyPngToClipboard": "Copieu el PNG al porta-retalls"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"exportToPng": "PNG",
|
"exportToPng": "PNG",
|
||||||
"exportToSvg": "",
|
"exportToSvg": "SVG",
|
||||||
"copyPngToClipboard": ""
|
"copyPngToClipboard": "Copieu al porta-retalls"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Angle",
|
"angle": "Angle",
|
||||||
"element": "Element",
|
"shapes": "Formes",
|
||||||
"elements": "Elements",
|
|
||||||
"height": "Altura",
|
"height": "Altura",
|
||||||
"scene": "Escena",
|
"scene": "Escena",
|
||||||
"selected": "Seleccionat",
|
"selected": "Seleccionat",
|
||||||
"storage": "Emmagatzematge",
|
"storage": "Emmagatzematge",
|
||||||
"title": "Estadístiques per nerds",
|
"fullTitle": "Propietats del Llenç i de la Forma",
|
||||||
|
"title": "Propietats",
|
||||||
|
"generalStats": "General",
|
||||||
|
"elementProperties": "Propietats de la forma",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"version": "Versió",
|
"version": "Versió",
|
||||||
"versionCopy": "Feu clic per a copiar",
|
"versionCopy": "Feu clic per a copiar",
|
||||||
@@ -439,26 +527,28 @@
|
|||||||
"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}})",
|
||||||
|
"copyToClipboardAsSvg": "S'ha copiat {{exportSelection}} al porta-retalls com a SVG\n({{exportColorScheme}})",
|
||||||
"fileSaved": "S'ha desat el fitxer.",
|
"fileSaved": "S'ha desat el fitxer.",
|
||||||
"fileSavedToFilename": "S'ha desat a {filename}",
|
"fileSavedToFilename": "S'ha desat a {filename}",
|
||||||
"canvas": "el llenç",
|
"canvas": "el llenç",
|
||||||
"selection": "la selecció",
|
"selection": "la selecció",
|
||||||
"pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent",
|
"pasteAsSingleElement": "Fer servir {{shortcut}} per enganxar com un sol element,\no enganxeu-lo en un editor de text existent",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "Actualment no es permet incrustar aquesta URL. Planteja un problema a GitHub per sol·licitar que l'URL estigui a la llista blanca",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "L'enllaç que has incrustat no coincideix amb el format esperat. Si us plau, intenta enganxar l'enllaç 'embed' proporcionada pel lloc web d'origen",
|
||||||
|
"elementLinkCopied": "Enllaç copiat al porta-retalls"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Transparent",
|
"transparent": "Transparent",
|
||||||
"black": "",
|
"black": "Negre",
|
||||||
"white": "",
|
"white": "Blanc",
|
||||||
"red": "",
|
"red": "Vermell",
|
||||||
"pink": "",
|
"pink": "Rosa",
|
||||||
"grape": "",
|
"grape": "Violat (raïm)",
|
||||||
"violet": "",
|
"violet": "Violat",
|
||||||
"gray": "",
|
"gray": "Gris",
|
||||||
"blue": "",
|
"blue": "Blau",
|
||||||
"cyan": "",
|
"cyan": "Cian",
|
||||||
"teal": "",
|
"teal": "Xarxet",
|
||||||
"green": "Verd",
|
"green": "Verd",
|
||||||
"yellow": "Groc",
|
"yellow": "Groc",
|
||||||
"orange": "Taronja",
|
"orange": "Taronja",
|
||||||
@@ -478,48 +568,97 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
"mostUsedCustomColors": "",
|
"color": "",
|
||||||
"colors": "",
|
"mostUsedCustomColors": "Colors personalitzats més usats",
|
||||||
"shades": "",
|
"colors": "Colors",
|
||||||
"hexCode": "",
|
"shades": "Ombres",
|
||||||
"noShades": ""
|
"hexCode": "Codi hexadecimal",
|
||||||
|
"noShades": "No hi ha ombres disponibles per a aquest color"
|
||||||
},
|
},
|
||||||
"overwriteConfirm": {
|
"overwriteConfirm": {
|
||||||
"action": {
|
"action": {
|
||||||
"exportToImage": {
|
"exportToImage": {
|
||||||
"title": "Exporta com a imatge",
|
"title": "Exporteu com a imatge",
|
||||||
"button": "Exporta com a imatge",
|
"button": "Exporteu com a imatge",
|
||||||
"description": ""
|
"description": "Exporta les dades de l'escena com una imatge des de la qual podràs importar-les més tard."
|
||||||
},
|
},
|
||||||
"saveToDisk": {
|
"saveToDisk": {
|
||||||
"title": "Desa al disc",
|
"title": "Deseu al disc",
|
||||||
"button": "Desa al disc",
|
"button": "Deseu al disc",
|
||||||
"description": ""
|
"description": "Exporta les dades de l'escena a un fitxer des del qual podràs importar-les més tard."
|
||||||
},
|
},
|
||||||
"excalidrawPlus": {
|
"excalidrawPlus": {
|
||||||
"title": "",
|
"title": "Excalidraw+",
|
||||||
"button": "",
|
"button": "Exporta a Excalidraw+",
|
||||||
"description": ""
|
"description": "Desa l'escena al teu espai de treball d'Excalidraw+."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"loadFromFile": {
|
"loadFromFile": {
|
||||||
"title": "Carrega des d'un fitxer",
|
"title": "Carrega des d'un fitxer",
|
||||||
"button": "Carrega des d'un fitxer",
|
"button": "Carrega des d'un fitxer",
|
||||||
"description": ""
|
"description": "Carregar des d'un fitxer <bold>substituirà el contingut actual</bold>.<br></br>Podeu desar el vostre disseny abans fent servir una de les opcions més avall."
|
||||||
},
|
},
|
||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "Carrega des d'un enllaç",
|
"title": "Carrega des d'un enllaç",
|
||||||
"button": "",
|
"button": "Substitueix el contingut",
|
||||||
"description": ""
|
"description": "Carregar un disseny extern <bold>substituirà el contingut actual</bold>.<br></br>Podeu desar el vostre disseny abans fent servir una de les opcions més avall."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "De Mermaid a Excalidraw",
|
"title": "Mermaid a Excalidraw",
|
||||||
"button": "Insereix",
|
"button": "Inseriu",
|
||||||
"description": "",
|
"description": "Actualment només s'admeten els diagrames <flowchartLink>Flowchart</flowchartLink>, <sequenceLink> Sequence, </sequenceLink> i <classLink> Class </classLink>. Els altres tipus es representaran com a imatge a Excalidraw.",
|
||||||
"syntax": "Sintaxi de Mermaid",
|
"syntax": "Sintaxi de Mermaid",
|
||||||
"preview": "Previsualització"
|
"preview": "Previsualització"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Cerca ràpida"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "antic"
|
||||||
|
},
|
||||||
|
"sceneFonts": "En aquesta escena",
|
||||||
|
"availableFonts": "Lletres tipogràfiques disponibles",
|
||||||
|
"empty": "No s'ha trobat cap lletra tipogràfica"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "No s'ha trobat cap usuari",
|
||||||
|
"hint": {
|
||||||
|
"text": "Feu clic sobre un usuari per seguir-lo",
|
||||||
|
"followStatus": "Ara per ara seguiu aquest usuari",
|
||||||
|
"inCall": "L'usuari es troba en una trucada de veu",
|
||||||
|
"micMuted": "El micròfon de l'usuari és silenciat",
|
||||||
|
"isSpeaking": "L'usuari parla ara"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Paleta d'ordres",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Selecciona",
|
||||||
|
"confirm": "Confirma",
|
||||||
|
"close": "Tanca"
|
||||||
|
},
|
||||||
|
"recents": "Usats recentment",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Cerca menús, ordres i descobreix joies amagades",
|
||||||
|
"noMatch": "No hi ha ordres coincidents..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Ordre no disponible...",
|
||||||
|
"shortcutHint": "Per obrir la paleta d'ordres, utilitza {{shortcut}}"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "Zkopírovat do schránky jako PNG",
|
"copyAsPng": "Zkopírovat do schránky jako PNG",
|
||||||
"copyAsSvg": "Zkopírovat do schránky jako SVG",
|
"copyAsSvg": "Zkopírovat do schránky jako SVG",
|
||||||
"copyText": "Zkopírovat do schránky jako text",
|
"copyText": "Zkopírovat do schránky jako text",
|
||||||
"copySource": "",
|
"copySource": "Kopírovat zdroj do schránky",
|
||||||
"convertToCode": "",
|
"convertToCode": "Převést na kód",
|
||||||
"bringForward": "Přenést blíž",
|
"bringForward": "Přenést blíž",
|
||||||
"sendToBack": "Přenést do pozadí",
|
"sendToBack": "Přenést do pozadí",
|
||||||
"bringToFront": "Přenést do popředí",
|
"bringToFront": "Přenést do popředí",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Kopírovat styly",
|
"copyStyles": "Kopírovat styly",
|
||||||
"pasteStyles": "Vložit styly",
|
"pasteStyles": "Vložit styly",
|
||||||
"stroke": "Obrys",
|
"stroke": "Obrys",
|
||||||
|
"changeStroke": "Změnit barvu ohraničení",
|
||||||
"background": "Pozadí",
|
"background": "Pozadí",
|
||||||
|
"changeBackground": "Změnit barvu pozadí",
|
||||||
"fill": "Výplň",
|
"fill": "Výplň",
|
||||||
"strokeWidth": "Tloušťka tahu",
|
"strokeWidth": "Tloušťka tahu",
|
||||||
"strokeStyle": "Styl tahu",
|
"strokeStyle": "Styl tahu",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Žádný",
|
"arrowhead_none": "Žádný",
|
||||||
"arrowhead_arrow": "Šipka",
|
"arrowhead_arrow": "Šipka",
|
||||||
"arrowhead_bar": "Kóta",
|
"arrowhead_bar": "Kóta",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Kruh",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Kružnice",
|
||||||
"arrowhead_triangle": "Trojúhelník",
|
"arrowhead_triangle": "Trojúhelník",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Trojúhelník (obrys)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Kosočtverec",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Kosočtverec (obrys)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "Typ šipky",
|
||||||
|
"arrowtype_sharp": "Ostrá šipka",
|
||||||
|
"arrowtype_round": "Zakřivená šipka",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
"fontSize": "Velikost písma",
|
"fontSize": "Velikost písma",
|
||||||
"fontFamily": "Písmo",
|
"fontFamily": "Písmo",
|
||||||
"addWatermark": "Přidat \"Vyrobeno s Excalidraw\"",
|
"addWatermark": "Přidat \"Vyrobeno s Excalidraw\"",
|
||||||
@@ -55,7 +65,7 @@
|
|||||||
"large": "Velké",
|
"large": "Velké",
|
||||||
"veryLarge": "Velmi velké",
|
"veryLarge": "Velmi velké",
|
||||||
"solid": "Plný",
|
"solid": "Plný",
|
||||||
"hachure": "Hachure",
|
"hachure": "Šrafování",
|
||||||
"zigzag": "Klikatě",
|
"zigzag": "Klikatě",
|
||||||
"crossHatch": "Křížový šrafování",
|
"crossHatch": "Křížový šrafování",
|
||||||
"thin": "Tenký",
|
"thin": "Tenký",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Použito na plátně",
|
"canvasColors": "Použito na plátně",
|
||||||
"canvasBackground": "Pozadí plátna",
|
"canvasBackground": "Pozadí plátna",
|
||||||
"drawingCanvas": "Kreslicí plátno",
|
"drawingCanvas": "Kreslicí plátno",
|
||||||
|
"clearCanvas": "Vyčistit plátno",
|
||||||
"layers": "Vrstvy",
|
"layers": "Vrstvy",
|
||||||
"actions": "Akce",
|
"actions": "Akce",
|
||||||
"language": "Jazyk",
|
"language": "Jazyk",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Sloučit výběr do skupiny",
|
"group": "Sloučit výběr do skupiny",
|
||||||
"ungroup": "Zrušit sloučení skupiny",
|
"ungroup": "Zrušit sloučení skupiny",
|
||||||
"collaborators": "Spolupracovníci",
|
"collaborators": "Spolupracovníci",
|
||||||
"showGrid": "Zobrazit mřížku",
|
"toggleGrid": "Přepínač mřížky",
|
||||||
"addToLibrary": "Přidat do knihovny",
|
"addToLibrary": "Přidat do knihovny",
|
||||||
"removeFromLibrary": "Odebrat z knihovny",
|
"removeFromLibrary": "Odebrat z knihovny",
|
||||||
"libraryLoadingMessage": "Načítání knihovny…",
|
"libraryLoadingMessage": "Načítání knihovny…",
|
||||||
"libraries": "Procházet knihovny",
|
"libraries": "Procházet knihovny",
|
||||||
"loadingScene": "Načítání scény…",
|
"loadingScene": "Načítání scény…",
|
||||||
|
"loadScene": "Načíst scénu ze souboru",
|
||||||
"align": "Zarovnání",
|
"align": "Zarovnání",
|
||||||
"alignTop": "Zarovnat nahoru",
|
"alignTop": "Zarovnat nahoru",
|
||||||
"alignBottom": "Zarovnat dolů",
|
"alignBottom": "Zarovnat dolů",
|
||||||
@@ -105,7 +117,9 @@
|
|||||||
"share": "Sdílet",
|
"share": "Sdílet",
|
||||||
"showStroke": "Zobrazit výběr barvy",
|
"showStroke": "Zobrazit výběr barvy",
|
||||||
"showBackground": "Zobrazit výběr barev pozadí",
|
"showBackground": "Zobrazit výběr barev pozadí",
|
||||||
"toggleTheme": "Přepnout tmavý řežim",
|
"showFonts": "Zobrazit výběr písma",
|
||||||
|
"toggleTheme": "Přepnout světlý/tmavý motiv",
|
||||||
|
"theme": "Motiv",
|
||||||
"personalLib": "Osobní knihovna",
|
"personalLib": "Osobní knihovna",
|
||||||
"excalidrawLib": "Exkalidraw knihovna",
|
"excalidrawLib": "Exkalidraw knihovna",
|
||||||
"decreaseFontSize": "Zmenšit písmo",
|
"decreaseFontSize": "Zmenšit písmo",
|
||||||
@@ -115,16 +129,21 @@
|
|||||||
"createContainerFromText": "Zabalit text do kontejneru",
|
"createContainerFromText": "Zabalit text do kontejneru",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Upravit odkaz",
|
"edit": "Upravit odkaz",
|
||||||
"editEmbed": "",
|
"editEmbed": "Upravit odkaz pro vložení",
|
||||||
"create": "Vytvořit odkaz",
|
"create": "Přidat odkaz",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "Odkaz",
|
"label": "Odkaz",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "Odkaz & vložit",
|
||||||
"empty": ""
|
"empty": "Není nastaven žádný odkaz",
|
||||||
|
"hint": "Napište nebo vložte svůj odkaz zde",
|
||||||
|
"goToElement": "Přejít na cílový prvek"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Upravit čáru",
|
"edit": "Upravit čáru",
|
||||||
"exit": "Ukončit editor řádků"
|
"editArrow": "Upravit šipku"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Uzamknout",
|
"lock": "Uzamknout",
|
||||||
@@ -134,16 +153,50 @@
|
|||||||
},
|
},
|
||||||
"statusPublished": "Zveřejněno",
|
"statusPublished": "Zveřejněno",
|
||||||
"sidebarLock": "Ponechat postranní panel otevřený",
|
"sidebarLock": "Ponechat postranní panel otevřený",
|
||||||
"selectAllElementsInFrame": "",
|
"selectAllElementsInFrame": "Vybrat všechny prvky v orámování",
|
||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "Odstranit všechny prvky z orámování",
|
||||||
"eyeDropper": "Vyberte barvu z plátna",
|
"eyeDropper": "Vyberte barvu z plátna",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "Z textu na diagram",
|
||||||
"prompt": ""
|
"prompt": "Výzva",
|
||||||
|
"followUs": "Sledujte nás",
|
||||||
|
"discordChat": "Discord chat",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "Přiblížit na výběr",
|
||||||
|
"zoomToFit": "Přiblížit na zobrazení všech prvků",
|
||||||
|
"installPWA": "Instalovat Excalidraw lokálně (PWA)",
|
||||||
|
"autoResize": "Povolit automatickou změnu velikosti textu",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "Kopírovat odkaz na objekt",
|
||||||
|
"linkToElement": "Odkaz na objekt",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "Odkaz na objekt",
|
||||||
|
"desc": "Klikněte na tvar na plátně nebo vložte odkaz.",
|
||||||
|
"notFound": "Propojený objekt nebyl na plátně nalezen."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Dosud neexistují žádné položky...",
|
"noItems": "Dosud neexistují žádné položky...",
|
||||||
"hint_emptyLibrary": "Vyberte položku na plátně a přidejte ji sem nebo nainstalujte knihovnu z veřejného úložiště níže.",
|
"hint_emptyLibrary": "Vyberte položku na plátně a přidejte ji sem nebo nainstalujte knihovnu z veřejného úložiště níže.",
|
||||||
"hint_emptyPrivateLibrary": "Vyberte položku na plátně a přidejte ji sem."
|
"hint_emptyPrivateLibrary": "Vyberte položku na plátně a přidejte ji sem.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "Najít na plátně",
|
||||||
|
"noMatch": "Nebyla nalezena žádná shoda...",
|
||||||
|
"singleResult": "výsledek",
|
||||||
|
"multipleResults": "výsledky",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Resetovat plátno",
|
"clearReset": "Resetovat plátno",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Exportovat obrázek...",
|
"exportImage": "Exportovat obrázek...",
|
||||||
"export": "Uložit jako...",
|
"export": "Uložit jako...",
|
||||||
"copyToClipboard": "Kopírovat do schránky",
|
"copyToClipboard": "Kopírovat do schránky",
|
||||||
|
"copyLink": "Kopírovat odkaz",
|
||||||
"save": "Uložit do aktuálního souboru",
|
"save": "Uložit do aktuálního souboru",
|
||||||
"saveAs": "Uložit jako",
|
"saveAs": "Uložit jako",
|
||||||
"load": "Otevřít",
|
"load": "Otevřít",
|
||||||
@@ -161,7 +215,7 @@
|
|||||||
"zoomIn": "Přiblížit",
|
"zoomIn": "Přiblížit",
|
||||||
"zoomOut": "Oddálit",
|
"zoomOut": "Oddálit",
|
||||||
"resetZoom": "Resetovat přiblížení",
|
"resetZoom": "Resetovat přiblížení",
|
||||||
"menu": "Menu",
|
"menu": "Hlavní nabídka",
|
||||||
"done": "Hotovo",
|
"done": "Hotovo",
|
||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"undo": "Zpět",
|
"undo": "Zpět",
|
||||||
@@ -171,17 +225,19 @@
|
|||||||
"fullScreen": "Celá obrazovka",
|
"fullScreen": "Celá obrazovka",
|
||||||
"darkMode": "Tmavý režim",
|
"darkMode": "Tmavý režim",
|
||||||
"lightMode": "Světlý režim",
|
"lightMode": "Světlý režim",
|
||||||
|
"systemMode": "Nastavení systému",
|
||||||
"zenMode": "Zen mód",
|
"zenMode": "Zen mód",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "Přichytávat k objektům",
|
||||||
"exitZenMode": "Opustit zen mód",
|
"exitZenMode": "Opustit zen mód",
|
||||||
"cancel": "Zrušit",
|
"cancel": "Zrušit",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Vyčistit",
|
"clear": "Vyčistit",
|
||||||
"remove": "Odstranit",
|
"remove": "Odstranit",
|
||||||
"embed": "",
|
"embed": "Přepínač vkládání",
|
||||||
"publishLibrary": "Zveřejnit",
|
"publishLibrary": "",
|
||||||
"submit": "Odeslat",
|
"submit": "Odeslat",
|
||||||
"confirm": "Potvrdit",
|
"confirm": "Potvrdit",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": "Klikněte pro interakci"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Toto vymaže celé plátno. Jste si jisti?",
|
"clearReset": "Toto vymaže celé plátno. Jste si jisti?",
|
||||||
@@ -204,20 +260,21 @@
|
|||||||
"resetLibrary": "Tímto vymažete vaši knihovnu. Jste si jisti?",
|
"resetLibrary": "Tímto vymažete vaši knihovnu. Jste si jisti?",
|
||||||
"removeItemsFromsLibrary": "Smazat {{count}} položek z knihovny?",
|
"removeItemsFromsLibrary": "Smazat {{count}} položek z knihovny?",
|
||||||
"invalidEncryptionKey": "Šifrovací klíč musí mít 22 znaků. Live spolupráce je zakázána.",
|
"invalidEncryptionKey": "Šifrovací klíč musí mít 22 znaků. Live spolupráce je zakázána.",
|
||||||
"collabOfflineWarning": "Není k dispozici žádné internetové připojení.\nVaše změny nebudou uloženy!"
|
"collabOfflineWarning": "Není k dispozici žádné internetové připojení.\nVaše změny nebudou uloženy!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Nepodporovaný typ souboru.",
|
"unsupportedFileType": "Nepodporovaný typ souboru.",
|
||||||
"imageInsertError": "Nelze vložit obrázek. Zkuste to později...",
|
"imageInsertError": "Nelze vložit obrázek. Zkuste to později...",
|
||||||
"fileTooBig": "Soubor je příliš velký. Maximální povolená velikost je {{maxSize}}.",
|
"fileTooBig": "Soubor je příliš velký. Maximální povolená velikost je {{maxSize}}.",
|
||||||
"svgImageInsertError": "Nelze vložit SVG obrázek. Značení SVG je neplatné.",
|
"svgImageInsertError": "Nelze vložit SVG obrázek. Značení SVG je neplatné.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "Nepodařilo se načíst obrázek.",
|
||||||
"invalidSVGString": "Neplatný SVG.",
|
|
||||||
"cannotResolveCollabServer": "Nelze se připojit ke sdílenému serveru. Prosím obnovte stránku a zkuste to znovu.",
|
"cannotResolveCollabServer": "Nelze se připojit ke sdílenému serveru. Prosím obnovte stránku a zkuste to znovu.",
|
||||||
"importLibraryError": "Nelze načíst knihovnu",
|
"importLibraryError": "Nelze načíst knihovnu",
|
||||||
|
"saveLibraryError": "",
|
||||||
"collabSaveFailed": "Nelze uložit do databáze na serveru. Pokud problémy přetrvávají, měli byste uložit soubor lokálně, abyste se ujistili, že neztratíte svou práci.",
|
"collabSaveFailed": "Nelze uložit do databáze na serveru. Pokud problémy přetrvávají, měli byste uložit soubor lokálně, abyste se ujistili, že neztratíte svou práci.",
|
||||||
"collabSaveFailed_sizeExceeded": "Nelze uložit do databáze na serveru, plátno se zdá být příliš velké. Měli byste uložit soubor lokálně, abyste se ujistili, že neztratíte svou práci.",
|
"collabSaveFailed_sizeExceeded": "Nelze uložit do databáze na serveru, plátno se zdá být příliš velké. Měli byste uložit soubor lokálně, abyste se ujistili, že neztratíte svou práci.",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "Obrázky jsou vypnuty.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "Vypadá to, že používáte Brave prohlížeč s povoleným nastavením <bold>Aggressively Block Fingerprinting</bold>.",
|
"line1": "Vypadá to, že používáte Brave prohlížeč s povoleným nastavením <bold>Aggressively Block Fingerprinting</bold>.",
|
||||||
"line2": "To by mohlo vést k narušení <bold>Textových elementů</bold> ve vašich výkresech.",
|
"line2": "To by mohlo vést k narušení <bold>Textových elementů</bold> ve vašich výkresech.",
|
||||||
@@ -230,11 +287,12 @@
|
|||||||
"image": ""
|
"image": ""
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "",
|
"asyncPasteFailedOnRead": "",
|
||||||
"asyncPasteFailedOnParse": "",
|
"asyncPasteFailedOnParse": "Nepodařilo se vložit.",
|
||||||
"copyToSystemClipboardFailed": ""
|
"copyToSystemClipboardFailed": ""
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Výběr",
|
"selection": "Výběr",
|
||||||
|
"lasso": "",
|
||||||
"image": "Vložit obrázek",
|
"image": "Vložit obrázek",
|
||||||
"rectangle": "Obdélník",
|
"rectangle": "Obdélník",
|
||||||
"diamond": "Diamant",
|
"diamond": "Diamant",
|
||||||
@@ -246,16 +304,32 @@
|
|||||||
"library": "Knihovna",
|
"library": "Knihovna",
|
||||||
"lock": "Po kreslení ponechat vybraný nástroj aktivní",
|
"lock": "Po kreslení ponechat vybraný nástroj aktivní",
|
||||||
"penMode": "Režim Pera - zabránit dotyku",
|
"penMode": "Režim Pera - zabránit dotyku",
|
||||||
"link": "Přidat/aktualizovat odkaz pro vybraný tvar",
|
"link": "",
|
||||||
"eraser": "Guma",
|
"eraser": "Guma",
|
||||||
"frame": "",
|
"frame": "Orámování",
|
||||||
"magicframe": "",
|
"magicframe": "Z wireframu na kód",
|
||||||
"embeddable": "",
|
"embeddable": "Web Embed",
|
||||||
"laser": "",
|
"laser": "Laserové ukazovátko",
|
||||||
"hand": "Ruka (nástroj pro posouvání)",
|
"hand": "Ruka (nástroj pro posouvání)",
|
||||||
"extraTools": "",
|
"extraTools": "Více nástrojů",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Obdélník",
|
||||||
|
"diamond": "Kosočtverec",
|
||||||
|
"ellipse": "Elipsa",
|
||||||
|
"arrow": "Šipka",
|
||||||
|
"line": "Čára",
|
||||||
|
"freedraw": "Volné kreslení",
|
||||||
|
"text": "Text",
|
||||||
|
"image": "Obrázek",
|
||||||
|
"group": "Skupina",
|
||||||
|
"frame": "Rám",
|
||||||
|
"magicframe": "Z wireframu na kód",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "Výběr",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Akce plátna",
|
"canvasActions": "Akce plátna",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Tvary"
|
"shapes": "Tvary"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Chcete-li přesunout plátno, podržte kolečko nebo mezerník při tažení nebo použijte nástroj Ruka",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "Kliknutím pro více bodů, táhnutím pro jednu čáru",
|
"linearElement": "Kliknutím pro více bodů, táhnutím pro jednu čáru",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Klikněte a táhněte, pro ukončení pusťte",
|
"freeDraw": "Klikněte a táhněte, pro ukončení pusťte",
|
||||||
"text": "Tip: Text můžete také přidat dvojitým kliknutím kdekoli pomocí nástroje pro výběr",
|
"text": "Tip: Text můžete také přidat dvojitým kliknutím kdekoli pomocí nástroje pro výběr",
|
||||||
"embeddable": "",
|
"embeddable": "",
|
||||||
"text_selected": "Dvojklikem nebo stisknutím klávesy ENTER upravíte text",
|
"text_selected": "",
|
||||||
"text_editing": "Stiskněte Escape nebo Ctrl/Cmd+ENTER pro dokončení úprav",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Klikněte na poslední bod nebo stiskněte Escape anebo Enter pro dokončení",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Úhel můžete omezit podržením SHIFT",
|
"lockAngle": "",
|
||||||
"resize": "Můžete omezit proporce podržením SHIFT při změně velikosti,\npodržte ALT pro změnu velikosti od středu",
|
"resize": "",
|
||||||
"resizeImage": "Můžete volně změnit velikost podržením SHIFT,\npodržením klávesy ALT změníte velikosti od středu",
|
"resizeImage": "",
|
||||||
"rotate": "Úhly můžete omezit podržením SHIFT při otáčení",
|
"rotate": "",
|
||||||
"lineEditor_info": "Podržte Ctrl/Cmd a dvakrát klikněte nebo stiskněte Ctrl/Cmd + Enter pro úpravu bodů",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Stisknutím tlačítka Delete odstraňte bod(y),\nCtrl/Cmd+D pro duplicitu nebo táhnutím pro přesun",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "Vyberte bod, který chcete upravit (podržením klávesy SHIFT vyberete více položek),\nnebo podržením klávesy Alt a kliknutím přidáte nové body",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Kliknutím umístěte obrázek, nebo klepnutím a přetažením ručně nastavíte jeho velikost",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Publikovat vlastní knihovnu",
|
"publishLibrary": "Publikovat vlastní knihovnu",
|
||||||
"bindTextToElement": "Stiskněte Enter pro přidání textu",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Podržte Ctrl/Cmd pro hluboký výběr a pro zabránění táhnutí",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Podržením klávesy Alt vrátíte prvky označené pro smazání",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\".",
|
"firefox_clipboard_write": "Tato funkce může být povolena nastavením vlajky \"dom.events.asyncClipboard.clipboardItem\" na \"true\". Chcete-li změnit vlajky prohlížeče ve Firefoxu, navštivte stránku \"about:config\".",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Náhled nelze zobrazit",
|
"cannotShowPreview": "Náhled nelze zobrazit",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Byli jsme velmi opatrní, abychom neuváděli informace o Vaší scéně. Pokud vaše scéna není soukromá, zvažte prosím sledování na našem <button>bug trackeru</button>. Uveďte prosím níže uvedené informace kopírováním a vložením do problému na GitHubu.",
|
"openIssueMessage": "Byli jsme velmi opatrní, abychom neuváděli informace o Vaší scéně. Pokud vaše scéna není soukromá, zvažte prosím sledování na našem <button>bug trackeru</button>. Uveďte prosím níže uvedené informace kopírováním a vložením do problému na GitHubu.",
|
||||||
"sceneContent": "Obsah scény:"
|
"sceneContent": "Obsah scény:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": ""
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Můžete pozvat lidi na vaši aktuální scénu ke spolupráci s vámi.",
|
"desc_intro": "",
|
||||||
"desc_privacy": "Nebojte se, relace používá end-to-end šifrování, takže cokoliv nakreslíte zůstane soukromé. Ani náš server nebude schopen vidět, s čím budete pracovat.",
|
"desc_privacy": "",
|
||||||
"button_startSession": "Zahájit relaci",
|
"button_startSession": "Zahájit relaci",
|
||||||
"button_stopSession": "Ukončit relaci",
|
"button_stopSession": "Ukončit relaci",
|
||||||
"desc_inProgressIntro": "Živá spolupráce právě probíhá.",
|
"desc_inProgressIntro": "Živá spolupráce právě probíhá.",
|
||||||
@@ -328,12 +410,14 @@
|
|||||||
"click": "kliknutí",
|
"click": "kliknutí",
|
||||||
"deepSelect": "Hluboký výběr",
|
"deepSelect": "Hluboký výběr",
|
||||||
"deepBoxSelect": "Hluboký výběr uvnitř boxu a zabránění táhnnutí",
|
"deepBoxSelect": "Hluboký výběr uvnitř boxu a zabránění táhnnutí",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "Zakřivená šipka",
|
"curvedArrow": "Zakřivená šipka",
|
||||||
"curvedLine": "Zakřivená čára",
|
"curvedLine": "Zakřivená čára",
|
||||||
"documentation": "Dokumentace",
|
"documentation": "Dokumentace",
|
||||||
"doubleClick": "dvojklik",
|
"doubleClick": "dvojklik",
|
||||||
"drag": "tažení",
|
"drag": "tažení",
|
||||||
"editor": "Editor",
|
"editor": "",
|
||||||
"editLineArrowPoints": "Upravit body linií/šipek",
|
"editLineArrowPoints": "Upravit body linií/šipek",
|
||||||
"editText": "Upravit text / přidat popis",
|
"editText": "Upravit text / přidat popis",
|
||||||
"github": "Našel jsi problém? Nahlaš ho",
|
"github": "Našel jsi problém? Nahlaš ho",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Přiblížit na výběr",
|
"zoomToSelection": "Přiblížit na výběr",
|
||||||
"toggleElementLock": "Zamknout/odemknout výběr",
|
"toggleElementLock": "Zamknout/odemknout výběr",
|
||||||
"movePageUpDown": "Posunout stránku nahoru/dolů",
|
"movePageUpDown": "Posunout stránku nahoru/dolů",
|
||||||
"movePageLeftRight": "Přesunout stránku doleva/doprava"
|
"movePageLeftRight": "Přesunout stránku doleva/doprava",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Vymazat plátno"
|
"title": "Vymazat plátno"
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Úhel",
|
"angle": "Úhel",
|
||||||
"element": "Prvek",
|
"shapes": "Tvary",
|
||||||
"elements": "Prvky",
|
|
||||||
"height": "Výška",
|
"height": "Výška",
|
||||||
"scene": "Scéna",
|
"scene": "Scéna",
|
||||||
"selected": "Vybráno",
|
"selected": "Vybráno",
|
||||||
"storage": "Úložiště",
|
"storage": "Úložiště",
|
||||||
"title": "Statistika pro nerdy",
|
"fullTitle": "Vlastnosti plátna a tvarů",
|
||||||
|
"title": "Vlastnosti",
|
||||||
|
"generalStats": "Obecné",
|
||||||
|
"elementProperties": "Vlastnosti tvaru",
|
||||||
"total": "Celkem",
|
"total": "Celkem",
|
||||||
"version": "Verze",
|
"version": "Verze",
|
||||||
"versionCopy": "Kliknutím zkopírujete",
|
"versionCopy": "Kliknutím zkopírujete",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Styly byly zkopírovány.",
|
"copyStyles": "Styly byly zkopírovány.",
|
||||||
"copyToClipboard": "Zkopírováno do schránky.",
|
"copyToClipboard": "Zkopírováno do schránky.",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} zkopírován do schránky jako PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} zkopírován do schránky jako PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "Soubor byl uložen.",
|
"fileSaved": "Soubor byl uložen.",
|
||||||
"fileSavedToFilename": "Uloženo do {filename}",
|
"fileSavedToFilename": "Uloženo do {filename}",
|
||||||
"canvas": "plátno",
|
"canvas": "plátno",
|
||||||
"selection": "výběr",
|
"selection": "výběr",
|
||||||
"pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru",
|
"pasteAsSingleElement": "Pomocí {{shortcut}} vložte jako jeden prvek,\nnebo vložte do existujícího textového editoru",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Průhledná",
|
"transparent": "Průhledná",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Nejpoužívanější vlastní barvy",
|
"mostUsedCustomColors": "Nejpoužívanější vlastní barvy",
|
||||||
"colors": "Barvy",
|
"colors": "Barvy",
|
||||||
"shades": "Stíny",
|
"shades": "Stíny",
|
||||||
@@ -504,22 +595,70 @@
|
|||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"loadFromFile": {
|
"loadFromFile": {
|
||||||
"title": "",
|
"title": "Načíst ze souboru",
|
||||||
"button": "",
|
"button": "Načíst ze souboru",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "",
|
"title": "Načíst z odkazu",
|
||||||
"button": "",
|
"button": "Nahradit můj obsah",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "",
|
||||||
"button": "",
|
"button": "Vložit",
|
||||||
"description": "",
|
"description": "",
|
||||||
"syntax": "",
|
"syntax": "Mermaid syntaxe",
|
||||||
"preview": ""
|
"preview": "Náhled"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Rychlé vyhledávání"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "staré"
|
||||||
|
},
|
||||||
|
"sceneFonts": "V této scéně",
|
||||||
|
"availableFonts": "Dostupná písma",
|
||||||
|
"empty": "Nebyla nalezena žádná písma"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "Nebyli nalezeni žádní uživatelé",
|
||||||
|
"hint": {
|
||||||
|
"text": "Klikněte na uživatele pro sledování",
|
||||||
|
"followStatus": "Právě sledujete tohoto uživatele",
|
||||||
|
"inCall": "Uživatel je v hovoru",
|
||||||
|
"micMuted": "Mikrofon uživatele je ztlumen",
|
||||||
|
"isSpeaking": "Uživatel hovoří"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Paleta příkazů",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Vybrat",
|
||||||
|
"confirm": "Potvrdit",
|
||||||
|
"close": "Zavřít"
|
||||||
|
},
|
||||||
|
"recents": "Naposledy použito",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": "Žádné odpovídající příkazy..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Příkaz není k dispozici...",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Kopier stil",
|
"copyStyles": "Kopier stil",
|
||||||
"pasteStyles": "Indsæt stil",
|
"pasteStyles": "Indsæt stil",
|
||||||
"stroke": "Linje",
|
"stroke": "Linje",
|
||||||
|
"changeStroke": "Ændr stregfarve",
|
||||||
"background": "Baggrund",
|
"background": "Baggrund",
|
||||||
|
"changeBackground": "Ændr baggrundsfarve",
|
||||||
"fill": "Udfyld",
|
"fill": "Udfyld",
|
||||||
"strokeWidth": "Linjebredde",
|
"strokeWidth": "Linjebredde",
|
||||||
"strokeStyle": "Linjeform",
|
"strokeStyle": "Linjeform",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Ingen",
|
"arrowhead_none": "Ingen",
|
||||||
"arrowhead_arrow": "Pil",
|
"arrowhead_arrow": "Pil",
|
||||||
"arrowhead_bar": "Bjælke",
|
"arrowhead_bar": "Bjælke",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Cirkel",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Cirkel (omrids)",
|
||||||
"arrowhead_triangle": "Trekant",
|
"arrowhead_triangle": "Trekant",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Trekant (omrids)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Diamant",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Diamant (omrids)",
|
||||||
|
"arrowhead_crowfoot_many": "Kragefod (mange)",
|
||||||
|
"arrowhead_crowfoot_one": "Kragefod (én)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Kragefod (én eller mange)",
|
||||||
|
"more_options": "Flere muligheder",
|
||||||
|
"arrowtypes": "Pile type",
|
||||||
|
"arrowtype_sharp": "Skarp pil",
|
||||||
|
"arrowtype_round": "Buet pil",
|
||||||
|
"arrowtype_elbowed": "Albuepil",
|
||||||
"fontSize": "Skriftstørrelse",
|
"fontSize": "Skriftstørrelse",
|
||||||
"fontFamily": "Skrifttypefamilie",
|
"fontFamily": "Skrifttypefamilie",
|
||||||
"addWatermark": "Tilføj \"Lavet med Excalidraw\"",
|
"addWatermark": "Tilføj \"Lavet med Excalidraw\"",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Brugt på lærred",
|
"canvasColors": "Brugt på lærred",
|
||||||
"canvasBackground": "Lærredsbaggrund",
|
"canvasBackground": "Lærredsbaggrund",
|
||||||
"drawingCanvas": "Tegnelærred",
|
"drawingCanvas": "Tegnelærred",
|
||||||
|
"clearCanvas": "Ryd lærred",
|
||||||
"layers": "Lag",
|
"layers": "Lag",
|
||||||
"actions": "Handlinger",
|
"actions": "Handlinger",
|
||||||
"language": "Sprog",
|
"language": "Sprog",
|
||||||
@@ -81,79 +92,122 @@
|
|||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
"yourName": "Dit navn",
|
"yourName": "Dit navn",
|
||||||
"madeWithExcalidraw": "Fremstillet med Excalidraw",
|
"madeWithExcalidraw": "Fremstillet med Excalidraw",
|
||||||
"group": "Grupper valgte",
|
"group": "Gruppér valgte",
|
||||||
"ungroup": "Opløs gruppe",
|
"ungroup": "Afgruppér valgte",
|
||||||
"collaborators": "Deltagere",
|
"collaborators": "Samarbejdspartnere",
|
||||||
"showGrid": "Vis gitter",
|
"toggleGrid": "Slå gitter til/fra",
|
||||||
"addToLibrary": "Føj til Bibliotek",
|
"addToLibrary": "Føj til bibliotek",
|
||||||
"removeFromLibrary": "Fjern fra biblioteket",
|
"removeFromLibrary": "Fjern fra biblioteket",
|
||||||
"libraryLoadingMessage": "Indlæser bibliotek…",
|
"libraryLoadingMessage": "Indlæser bibliotek…",
|
||||||
"libraries": "Gennemse biblioteker",
|
"libraries": "Gennemse biblioteker",
|
||||||
"loadingScene": "Indlæser scene…",
|
"loadingScene": "Indlæser scene…",
|
||||||
|
"loadScene": "Indlæs scene fra fil",
|
||||||
"align": "Justér",
|
"align": "Justér",
|
||||||
"alignTop": "Juster til top",
|
"alignTop": "Juster til top",
|
||||||
"alignBottom": "Juster til bund",
|
"alignBottom": "Juster til bund",
|
||||||
"alignLeft": "Venstrejusteret",
|
"alignLeft": "Venstrejusteret",
|
||||||
"alignRight": "Juster højre",
|
"alignRight": "Højrejustér",
|
||||||
"centerVertically": "Center vertikalt",
|
"centerVertically": "Centrér vertikalt",
|
||||||
"centerHorizontally": "Vandret centreret",
|
"centerHorizontally": "Centrér horisontalt",
|
||||||
"distributeHorizontally": "Distribuer vandret",
|
"distributeHorizontally": "Distribuer vandret",
|
||||||
"distributeVertically": "Distribuer lodret",
|
"distributeVertically": "Distribuer lodret",
|
||||||
"flipHorizontal": "Spejlvend horisontalt",
|
"flipHorizontal": "Vend horisontalt",
|
||||||
"flipVertical": "Vend lodret",
|
"flipVertical": "Vend vertikalt",
|
||||||
"viewMode": "Visningstilstand",
|
"viewMode": "Visningstilstand",
|
||||||
"share": "Del",
|
"share": "Del",
|
||||||
"showStroke": "Vis stregfarve-vælger",
|
"showStroke": "Vis stregfarve-vælger",
|
||||||
"showBackground": "Vis baggrundsfarve-vælger",
|
"showBackground": "Vis baggrundsfarve-vælger",
|
||||||
"toggleTheme": "Skift tema",
|
"showFonts": "Vis skrifttypevælger",
|
||||||
|
"toggleTheme": "Slå lys/mørkt tema til/fra",
|
||||||
|
"theme": "Tema",
|
||||||
"personalLib": "Personligt bibliotek",
|
"personalLib": "Personligt bibliotek",
|
||||||
"excalidrawLib": "Excalidraw Bibliotek",
|
"excalidrawLib": "",
|
||||||
"decreaseFontSize": "Gør skriften mindre",
|
"decreaseFontSize": "",
|
||||||
"increaseFontSize": "Gør skriften større",
|
"increaseFontSize": "",
|
||||||
"unbindText": "Frigør tekst",
|
"unbindText": "",
|
||||||
"bindText": "Bind tekst til beholderen",
|
"bindText": "",
|
||||||
"createContainerFromText": "Ombryd tekst i en beholder",
|
"createContainerFromText": "",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Redigér link",
|
"edit": "",
|
||||||
"editEmbed": "Redigér link & indlejret",
|
"editEmbed": "",
|
||||||
"create": "Link oprettet",
|
"create": "",
|
||||||
"createEmbed": "Opret link & indlejret",
|
"label": "",
|
||||||
"label": "Links",
|
"labelEmbed": "",
|
||||||
"labelEmbed": "Link & indlejret",
|
"empty": "",
|
||||||
"empty": "Intet link angivet"
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Rediger Linje",
|
"edit": "",
|
||||||
"exit": "Afslut linjeeditor"
|
"editArrow": ""
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Lås",
|
"lock": "",
|
||||||
"unlock": "Lås op",
|
"unlock": "",
|
||||||
"lockAll": "Lås alle",
|
"lockAll": "",
|
||||||
"unlockAll": "Lås alle op"
|
"unlockAll": ""
|
||||||
},
|
},
|
||||||
"statusPublished": "Udgiver",
|
"statusPublished": "",
|
||||||
"sidebarLock": "Hold sidepanel åben",
|
"sidebarLock": "",
|
||||||
"selectAllElementsInFrame": "Vælg alle elementer i rammen",
|
"selectAllElementsInFrame": "",
|
||||||
"removeAllElementsFromFrame": "Fjern alle elementer fra ramme",
|
"removeAllElementsFromFrame": "",
|
||||||
"eyeDropper": "Vælg farve fra lærred",
|
"eyeDropper": "",
|
||||||
"textToDiagram": "Tekst til diagram",
|
"textToDiagram": "",
|
||||||
"prompt": "Prompt"
|
"prompt": "",
|
||||||
|
"followUs": "",
|
||||||
|
"discordChat": "",
|
||||||
|
"zoomToFitViewport": "",
|
||||||
|
"zoomToFitSelection": "",
|
||||||
|
"zoomToFit": "",
|
||||||
|
"installPWA": "",
|
||||||
|
"autoResize": "",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Ingen varer tilføjet endnu...",
|
"noItems": "",
|
||||||
"hint_emptyLibrary": "Vælg et element på lærred for at tilføje det her, eller installer et bibliotek fra det offentlige arkiv, nedenfor.",
|
"hint_emptyLibrary": "",
|
||||||
"hint_emptyPrivateLibrary": "Vælg et element på lærred for at tilføje det her."
|
"hint_emptyPrivateLibrary": "",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Nulstil lærredet",
|
"clearReset": "",
|
||||||
"exportJSON": "Eksportér til fil",
|
"exportJSON": "",
|
||||||
"exportImage": "Eksporter billede...",
|
"exportImage": "",
|
||||||
"export": "Gem til...",
|
"export": "",
|
||||||
"copyToClipboard": "Kopier til klippebord",
|
"copyToClipboard": "Kopier til klippebord",
|
||||||
"save": "Gem til nuværende fil",
|
"copyLink": "",
|
||||||
|
"save": "",
|
||||||
"saveAs": "Gem som",
|
"saveAs": "Gem som",
|
||||||
"load": "Åbn",
|
"load": "",
|
||||||
"getShareableLink": "Lav et delbart link",
|
"getShareableLink": "Lav et delbart link",
|
||||||
"close": "Luk",
|
"close": "Luk",
|
||||||
"selectLanguage": "Vælg sprog",
|
"selectLanguage": "Vælg sprog",
|
||||||
@@ -161,7 +215,7 @@
|
|||||||
"zoomIn": "Zoom ind",
|
"zoomIn": "Zoom ind",
|
||||||
"zoomOut": "Zoom ud",
|
"zoomOut": "Zoom ud",
|
||||||
"resetZoom": "Nulstil zoom",
|
"resetZoom": "Nulstil zoom",
|
||||||
"menu": "Menu",
|
"menu": "",
|
||||||
"done": "Færdig",
|
"done": "Færdig",
|
||||||
"edit": "Rediger",
|
"edit": "Rediger",
|
||||||
"undo": "Fortryd",
|
"undo": "Fortryd",
|
||||||
@@ -171,17 +225,19 @@
|
|||||||
"fullScreen": "Fuld skærm",
|
"fullScreen": "Fuld skærm",
|
||||||
"darkMode": "Mørk tilstand",
|
"darkMode": "Mørk tilstand",
|
||||||
"lightMode": "Lys baggrund",
|
"lightMode": "Lys baggrund",
|
||||||
|
"systemMode": "",
|
||||||
"zenMode": "Zentilstand",
|
"zenMode": "Zentilstand",
|
||||||
"objectsSnapMode": "Fastgør til objekter",
|
"objectsSnapMode": "",
|
||||||
"exitZenMode": "Stop zentilstand",
|
"exitZenMode": "Stop zentilstand",
|
||||||
"cancel": "Annuller",
|
"cancel": "Annuller",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Ryd",
|
"clear": "Ryd",
|
||||||
"remove": "Fjern",
|
"remove": "Fjern",
|
||||||
"embed": "Slå indlejring til/fra",
|
"embed": "",
|
||||||
"publishLibrary": "Publicér",
|
"publishLibrary": "",
|
||||||
"submit": "Gem",
|
"submit": "Gem",
|
||||||
"confirm": "Bekræft",
|
"confirm": "Bekræft",
|
||||||
"embeddableInteractionButton": "Klik for at interagere"
|
"embeddableInteractionButton": ""
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Dette vil rydde hele lærredet. Er du sikker?",
|
"clearReset": "Dette vil rydde hele lærredet. Er du sikker?",
|
||||||
@@ -189,85 +245,105 @@
|
|||||||
"couldNotCreateShareableLinkTooBig": "Kunne ikke oprette delbart link: scenen er for stor",
|
"couldNotCreateShareableLinkTooBig": "Kunne ikke oprette delbart link: scenen er for stor",
|
||||||
"couldNotLoadInvalidFile": "Kunne ikke indlæse ugyldig fil",
|
"couldNotLoadInvalidFile": "Kunne ikke indlæse ugyldig fil",
|
||||||
"importBackendFailed": "Import fra backend mislykkedes.",
|
"importBackendFailed": "Import fra backend mislykkedes.",
|
||||||
"cannotExportEmptyCanvas": "Kan ikke eksportere tomt lærred.",
|
"cannotExportEmptyCanvas": "",
|
||||||
"couldNotCopyToClipboard": "Kunne ikke kopiere til udklipsholderen.",
|
"couldNotCopyToClipboard": "",
|
||||||
"decryptFailed": "Kunne ikke dekryptere data.",
|
"decryptFailed": "",
|
||||||
"uploadedSecurly": "Upload er blevet sikret med ende-til-ende kryptering, hvilket betyder, at Excalidraw server og tredjeparter ikke kan læse indholdet.",
|
"uploadedSecurly": "",
|
||||||
"loadSceneOverridePrompt": "Indlæsning af ekstern tegning erstatter dit eksisterende indhold. Ønsker du at fortsætte?",
|
"loadSceneOverridePrompt": "",
|
||||||
"collabStopOverridePrompt": "Stopper sessionen vil overskrive din tidligere, lokalt gemte tegning. Er du sikker?\n\n(Hvis du ønsker at beholde din lokale tegning, skal du blot lukke browserfanen i stedet.)",
|
"collabStopOverridePrompt": "",
|
||||||
"errorAddingToLibrary": "Kunne ikke tilføje element til biblioteket",
|
"errorAddingToLibrary": "",
|
||||||
"errorRemovingFromLibrary": "Kunne ikke fjerne element fra biblioteket",
|
"errorRemovingFromLibrary": "",
|
||||||
"confirmAddLibrary": "Dette vil tilføje {{numShapes}} form(er) til dit bibliotek. Er du sikker?",
|
"confirmAddLibrary": "",
|
||||||
"imageDoesNotContainScene": "Dette billede synes ikke at indeholde scene data. Har du aktiveret scene indlejring under eksport?",
|
"imageDoesNotContainScene": "",
|
||||||
"cannotRestoreFromImage": "Scene kunne ikke gendannes fra denne billedfil",
|
"cannotRestoreFromImage": "",
|
||||||
"invalidSceneUrl": "Kunne ikke importere scene fra den angivne URL. Det er enten misdannet eller indeholder ikke gyldige Excalidraw JSON data.",
|
"invalidSceneUrl": "",
|
||||||
"resetLibrary": "Dette vil rydde hele lærredet. Er du sikker?",
|
"resetLibrary": "",
|
||||||
"removeItemsFromsLibrary": "Slet {{count}} vare(r) fra biblioteket?",
|
"removeItemsFromsLibrary": "",
|
||||||
"invalidEncryptionKey": "Krypteringsnøglen skal være på 22 tegn. Live-samarbejde er deaktiveret.",
|
"invalidEncryptionKey": "",
|
||||||
"collabOfflineWarning": "Ingen internetforbindelse tilgængelig.\nDine ændringer vil ikke blive gemt!"
|
"collabOfflineWarning": "",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Filtypen er ikke understøttet.",
|
"unsupportedFileType": "",
|
||||||
"imageInsertError": "Billedet kunne ikke indsættes. Prøv igen senere...",
|
"imageInsertError": "",
|
||||||
"fileTooBig": "Filen er for stor. Maksimal tilladt størrelse er {{maxSize}}.",
|
"fileTooBig": "",
|
||||||
"svgImageInsertError": "Kunne ikke indsætte SVG-billede. SVG-markup'en ser ugyldig ud.",
|
"svgImageInsertError": "",
|
||||||
"failedToFetchImage": "Dataene blev ikke hentet.",
|
"failedToFetchImage": "",
|
||||||
"invalidSVGString": "Ugyldig SVG.",
|
"cannotResolveCollabServer": "",
|
||||||
"cannotResolveCollabServer": "Kunne ikke oprette forbindelse til samarbejdsserveren. Genindlæs siden og prøv igen.",
|
"importLibraryError": "",
|
||||||
"importLibraryError": "Biblioteket kunne ikke indlæses",
|
"saveLibraryError": "",
|
||||||
"collabSaveFailed": "Kunne ikke gemme i databasen. Hvis problemerne fortsætter, bør du gemme din fil lokalt for at sikre, at du ikke mister dit arbejde.",
|
"collabSaveFailed": "",
|
||||||
"collabSaveFailed_sizeExceeded": "Kunne ikke gemme i databasen, lærredet lader til at være for stort. Du bør gemme filen lokalt for at sikre, at du ikke mister dit arbejde.",
|
"collabSaveFailed_sizeExceeded": "",
|
||||||
"imageToolNotSupported": "Billeder er deaktiveret.",
|
"imageToolNotSupported": "",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "Det ser ud til, at du bruger Brave browser med indstillingen <bold>Aggressively Block Fingerprinting</bold> aktiveret.",
|
"line1": "",
|
||||||
"line2": "Dette kan resultere i brud på <bold>tekstelementerne</bold> i dine tegninger.",
|
"line2": "",
|
||||||
"line3": "Vi anbefaler kraftigt at deaktivere denne indstilling. Du kan følge <link>disse trin</link> om, hvordan du gør det.",
|
"line3": "",
|
||||||
"line4": "Hvis deaktivering af denne indstilling ikke løser visning af tekstelementer, åbn venligst et <issueLink>issue</issueLink> på vores GitHub, eller skriv os på <discordLink>Discord</discordLink>"
|
"line4": ""
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "Indlejringselementer kan ikke tilføjes til biblioteket.",
|
"embeddable": "",
|
||||||
"iframe": "IFrame elementer kan ikke tilføjes til biblioteket.",
|
"iframe": "",
|
||||||
"image": "Understøttelse af at tilføje billeder til biblioteket kommer snart!"
|
"image": ""
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "Kunne ikke indsætte (kan ikke læse fra systemets udklipsholder).",
|
"asyncPasteFailedOnRead": "",
|
||||||
"asyncPasteFailedOnParse": "Kunne ikke indsætte.",
|
"asyncPasteFailedOnParse": "",
|
||||||
"copyToSystemClipboardFailed": "Kunne ikke kopiere til udklipsholderen."
|
"copyToSystemClipboardFailed": ""
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "&Udvalg",
|
"selection": "",
|
||||||
"image": "Indsæt billeder",
|
"lasso": "",
|
||||||
"rectangle": "Rektangler",
|
"image": "",
|
||||||
"diamond": "Diamanter",
|
"rectangle": "",
|
||||||
"ellipse": "Ellipser",
|
"diamond": "",
|
||||||
"arrow": "Pile",
|
"ellipse": "",
|
||||||
"line": "Linje",
|
"arrow": "",
|
||||||
"freedraw": "Tegn",
|
"line": "",
|
||||||
"text": "Tekster",
|
"freedraw": "",
|
||||||
"library": "~Bibliotek",
|
"text": "",
|
||||||
"lock": "Behold valgte værktøj aktiv efter tegning",
|
"library": "",
|
||||||
"penMode": "Pen-tilstand - forhindrer berøring",
|
"lock": "",
|
||||||
"link": "Tilføj/ Opdater link for en valgt form",
|
"penMode": "",
|
||||||
"eraser": "Slet",
|
"link": "",
|
||||||
"frame": "Rammeværktøj",
|
"eraser": "",
|
||||||
"magicframe": "Wireframe til kode",
|
"frame": "",
|
||||||
"embeddable": "Web-indlejring",
|
"magicframe": "",
|
||||||
"laser": "Lasermarkør",
|
"embeddable": "",
|
||||||
"hand": "Hånd (panorering værktøj)",
|
"laser": "",
|
||||||
"extraTools": "Flere værktøjer",
|
"hand": "",
|
||||||
"mermaidToExcalidraw": "Mermaid til Excalidraw",
|
"extraTools": "",
|
||||||
"magicSettings": "AI indstillinger"
|
"mermaidToExcalidraw": "",
|
||||||
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "",
|
||||||
|
"text": "",
|
||||||
|
"image": "",
|
||||||
|
"group": "",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Lærred handlinger",
|
"canvasActions": "",
|
||||||
"selectedShapeActions": "Valgte figurhandlinger",
|
"selectedShapeActions": "",
|
||||||
"shapes": "Former"
|
"shapes": ""
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "For at flytte lærred, hold musehjulet eller mellemrumstasten mens du trækker, eller brug håndværktøjet",
|
"dismissSearch": "",
|
||||||
"linearElement": "Klik for at starte flere punkter, træk for enkelt linje",
|
"canvasPanning": "",
|
||||||
|
"linearElement": "",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Klik og træk, slip når du er færdig",
|
"freeDraw": "Klik og træk, slip når du er færdig",
|
||||||
"text": "Tip: du kan også tilføje tekst ved at dobbeltklikke hvor som helst med det valgte værktøj",
|
"text": "",
|
||||||
"embeddable": "Klik på træk for at oprette en hjemmeside indlejret",
|
"embeddable": "",
|
||||||
"text_selected": "",
|
"text_selected": "",
|
||||||
"text_editing": "",
|
"text_editing": "",
|
||||||
"linearElementMulti": "",
|
"linearElementMulti": "",
|
||||||
@@ -276,34 +352,40 @@
|
|||||||
"resizeImage": "",
|
"resizeImage": "",
|
||||||
"rotate": "",
|
"rotate": "",
|
||||||
"lineEditor_info": "",
|
"lineEditor_info": "",
|
||||||
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_pointSelected": "",
|
"lineEditor_pointSelected": "",
|
||||||
"lineEditor_nothingSelected": "",
|
"lineEditor_nothingSelected": "",
|
||||||
"placeImage": "",
|
|
||||||
"publishLibrary": "",
|
"publishLibrary": "",
|
||||||
"bindTextToElement": "",
|
"bindTextToElement": "",
|
||||||
|
"createFlowchart": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
"eraserRevert": "",
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "",
|
"firefox_clipboard_write": "",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Kan ikke vise forhåndsvisning",
|
"cannotShowPreview": "",
|
||||||
"canvasTooBig": "Lærredet kan være for stort.",
|
"canvasTooBig": "",
|
||||||
"canvasTooBigTip": "Tip: Prøv at flytte de fjerneste elementer lidt tættere sammen."
|
"canvasTooBigTip": ""
|
||||||
},
|
},
|
||||||
"errorSplash": {
|
"errorSplash": {
|
||||||
"headingMain": "Der opstod en fejl. Prøv <button>at genindlæse siden</button>.",
|
"headingMain": "",
|
||||||
"clearCanvasMessage": "",
|
"clearCanvasMessage": "",
|
||||||
"clearCanvasCaveat": "",
|
"clearCanvasCaveat": "",
|
||||||
"trackedToSentry": "",
|
"trackedToSentry": "",
|
||||||
"openIssueMessage": "<button></button> Kopiere og indsæt venligst oplysningerne nedenfor i et GitHub problem.",
|
"openIssueMessage": "<button></button> Kopiere og indsæt venligst oplysningerne nedenfor i et GitHub problem.",
|
||||||
"sceneContent": "Scene indhold:"
|
"sceneContent": "Scene indhold:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": ""
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Du kan invitere folk til din nuværende scene, så de kan samarbejde med dig.",
|
"desc_intro": "",
|
||||||
"desc_privacy": "Bare rolig, sessionen bruger end-to-end kryptering, så uanset hvad du tegner vil det forblive privat. Ikke engang vores server vil kunne se, hvad du kommer op med.",
|
"desc_privacy": "",
|
||||||
"button_startSession": "Start session",
|
"button_startSession": "",
|
||||||
"button_stopSession": "Stop session",
|
"button_stopSession": "",
|
||||||
"desc_inProgressIntro": "Live-samarbejde session er nu begyndt.",
|
"desc_inProgressIntro": "Live-samarbejde session er nu begyndt.",
|
||||||
"desc_shareLink": "Del dette link med enhver, du ønsker at samarbejde med:",
|
"desc_shareLink": "Del dette link med enhver, du ønsker at samarbejde med:",
|
||||||
"desc_exitSession": "",
|
"desc_exitSession": "",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "",
|
"click": "",
|
||||||
"deepSelect": "",
|
"deepSelect": "",
|
||||||
"deepBoxSelect": "",
|
"deepBoxSelect": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "",
|
"curvedArrow": "",
|
||||||
"curvedLine": "",
|
"curvedLine": "",
|
||||||
"documentation": "",
|
"documentation": "",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "",
|
"zoomToSelection": "",
|
||||||
"toggleElementLock": "",
|
"toggleElementLock": "",
|
||||||
"movePageUpDown": "",
|
"movePageUpDown": "",
|
||||||
"movePageLeftRight": ""
|
"movePageLeftRight": "",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "",
|
"angle": "",
|
||||||
"element": "",
|
"shapes": "",
|
||||||
"elements": "",
|
|
||||||
"height": "",
|
"height": "",
|
||||||
"scene": "",
|
"scene": "",
|
||||||
"selected": "",
|
"selected": "",
|
||||||
"storage": "",
|
"storage": "",
|
||||||
"title": "Statistik for nørder",
|
"fullTitle": "",
|
||||||
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
"total": "",
|
"total": "",
|
||||||
"version": "",
|
"version": "",
|
||||||
"versionCopy": "Klik for at kopiere",
|
"versionCopy": "Klik for at kopiere",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Kopieret stilarter.",
|
"copyStyles": "Kopieret stilarter.",
|
||||||
"copyToClipboard": "Kopieret til klippebord.",
|
"copyToClipboard": "Kopieret til klippebord.",
|
||||||
"copyToClipboardAsPng": "Kopieret {{exportSelection}} til klippebord som PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Kopieret {{exportSelection}} til klippebord som PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "Fil gemt.",
|
"fileSaved": "Fil gemt.",
|
||||||
"fileSavedToFilename": "Gemt som {filename}",
|
"fileSavedToFilename": "Gemt som {filename}",
|
||||||
"canvas": "canvas",
|
"canvas": "",
|
||||||
"selection": "markering",
|
"selection": "markering",
|
||||||
"pasteAsSingleElement": "",
|
"pasteAsSingleElement": "",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "",
|
"transparent": "",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "",
|
"mostUsedCustomColors": "",
|
||||||
"colors": "",
|
"colors": "",
|
||||||
"shades": "",
|
"shades": "",
|
||||||
@@ -521,5 +612,53 @@
|
|||||||
"description": "",
|
"description": "",
|
||||||
"syntax": "",
|
"syntax": "",
|
||||||
"preview": ""
|
"preview": ""
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "",
|
||||||
|
"followStatus": "",
|
||||||
|
"inCall": "",
|
||||||
|
"micMuted": "",
|
||||||
|
"isSpeaking": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "",
|
||||||
|
"confirm": "",
|
||||||
|
"close": ""
|
||||||
|
},
|
||||||
|
"recents": "",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,664 @@
|
|||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"paste": "Einfügen",
|
||||||
|
"pasteAsPlaintext": "Als unformatierten Text einfügen",
|
||||||
|
"pasteCharts": "Diagramme einfügen",
|
||||||
|
"selectAll": "Alle auswählen",
|
||||||
|
"multiSelect": "Element zur Auswahl hinzufügen",
|
||||||
|
"moveCanvas": "Leinwand verschieben",
|
||||||
|
"cut": "Ausschneiden",
|
||||||
|
"copy": "Kopieren",
|
||||||
|
"copyAsPng": "In Zwischenablage kopieren (PNG)",
|
||||||
|
"copyAsSvg": "In Zwischenablage kopieren (SVG)",
|
||||||
|
"copyText": "In die Zwischenablage als Text kopieren",
|
||||||
|
"copySource": "Quelle in Zwischenablage kopieren",
|
||||||
|
"convertToCode": "In Code konvertieren",
|
||||||
|
"bringForward": "Nach vorne",
|
||||||
|
"sendToBack": "In den Hintergrund",
|
||||||
|
"bringToFront": "In den Vordergrund",
|
||||||
|
"sendBackward": "Nach hinten",
|
||||||
|
"delete": "Löschen",
|
||||||
|
"copyStyles": "Formatierung kopieren",
|
||||||
|
"pasteStyles": "Formatierung übernehmen",
|
||||||
|
"stroke": "Strich",
|
||||||
|
"changeStroke": "Strichfarbe ändern",
|
||||||
|
"background": "Hintergrund",
|
||||||
|
"changeBackground": "Hintergrundfarbe ändern",
|
||||||
|
"fill": "Füllung",
|
||||||
|
"strokeWidth": "Strichstärke",
|
||||||
|
"strokeStyle": "Konturstil",
|
||||||
|
"strokeStyle_solid": "Durchgezogen",
|
||||||
|
"strokeStyle_dashed": "Gestrichelt",
|
||||||
|
"strokeStyle_dotted": "Gepunktet",
|
||||||
|
"sloppiness": "Sauberkeit",
|
||||||
|
"opacity": "Deckkraft",
|
||||||
|
"textAlign": "Textausrichtung",
|
||||||
|
"edges": "Kanten",
|
||||||
|
"sharp": "Scharf",
|
||||||
|
"round": "Rund",
|
||||||
|
"arrowheads": "Pfeilspitzen",
|
||||||
|
"arrowhead_none": "Keine",
|
||||||
|
"arrowhead_arrow": "Pfeil",
|
||||||
|
"arrowhead_bar": "Balken",
|
||||||
|
"arrowhead_circle": "Kreis",
|
||||||
|
"arrowhead_circle_outline": "Kreis (Umrandung)",
|
||||||
|
"arrowhead_triangle": "Dreieck",
|
||||||
|
"arrowhead_triangle_outline": "Dreieck (Umrandung)",
|
||||||
|
"arrowhead_diamond": "Raute",
|
||||||
|
"arrowhead_diamond_outline": "Raute (Umrandung)",
|
||||||
|
"arrowhead_crowfoot_many": "Krähenfuß (viele)",
|
||||||
|
"arrowhead_crowfoot_one": "Krähenfuß (einer)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Krähenfuß (einer oder viele)",
|
||||||
|
"more_options": "Weitere Optionen",
|
||||||
|
"arrowtypes": "Pfeiltyp",
|
||||||
|
"arrowtype_sharp": "Scharfer Pfeil",
|
||||||
|
"arrowtype_round": "Gebogener Pfeil",
|
||||||
|
"arrowtype_elbowed": "Ellenbogen-Pfeil",
|
||||||
|
"fontSize": "Schriftgröße",
|
||||||
|
"fontFamily": "Schriftfamilie",
|
||||||
|
"addWatermark": "\"Made with Excalidraw\" hinzufügen",
|
||||||
|
"handDrawn": "Handgezeichnet",
|
||||||
|
"normal": "Normal",
|
||||||
|
"code": "Code",
|
||||||
|
"small": "Klein",
|
||||||
|
"medium": "Mittel",
|
||||||
|
"large": "Groß",
|
||||||
|
"veryLarge": "Sehr groß",
|
||||||
|
"solid": "Deckend",
|
||||||
|
"hachure": "Schraffiert",
|
||||||
|
"zigzag": "Zickzack",
|
||||||
|
"crossHatch": "Kreuzschraffiert",
|
||||||
|
"thin": "Dünn",
|
||||||
|
"bold": "Fett",
|
||||||
|
"left": "Links",
|
||||||
|
"center": "Zentriert",
|
||||||
|
"right": "Rechts",
|
||||||
|
"extraBold": "Extra Fett",
|
||||||
|
"architect": "Architekt",
|
||||||
|
"artist": "Künstler",
|
||||||
|
"cartoonist": "Karikaturist",
|
||||||
|
"fileTitle": "Dateiname",
|
||||||
|
"colorPicker": "Farbauswähler",
|
||||||
|
"canvasColors": "Auf Leinwand verwendet",
|
||||||
|
"canvasBackground": "Zeichenflächenhintergrund",
|
||||||
|
"drawingCanvas": "Leinwand",
|
||||||
|
"clearCanvas": "Zeichenfläche löschen",
|
||||||
|
"layers": "Ebenen",
|
||||||
|
"actions": "Aktionen",
|
||||||
|
"language": "Sprache",
|
||||||
|
"liveCollaboration": "Live-Zusammenarbeit...",
|
||||||
|
"duplicateSelection": "Duplizieren",
|
||||||
|
"untitled": "Unbenannt",
|
||||||
|
"name": "Name",
|
||||||
|
"yourName": "Dein Name",
|
||||||
|
"madeWithExcalidraw": "Made with Excalidraw",
|
||||||
|
"group": "Auswahl gruppieren",
|
||||||
|
"ungroup": "Gruppierung aufheben",
|
||||||
|
"collaborators": "Mitarbeitende",
|
||||||
|
"toggleGrid": "Raster umschalten",
|
||||||
|
"addToLibrary": "Zur Bibliothek hinzufügen",
|
||||||
|
"removeFromLibrary": "Aus Bibliothek entfernen",
|
||||||
|
"libraryLoadingMessage": "Lade Bibliothek…",
|
||||||
|
"libraries": "Bibliotheken durchsuchen",
|
||||||
|
"loadingScene": "Lade Zeichnung…",
|
||||||
|
"loadScene": "Szene aus Datei laden",
|
||||||
|
"align": "Ausrichten",
|
||||||
|
"alignTop": "Obere Kanten",
|
||||||
|
"alignBottom": "Untere Kanten",
|
||||||
|
"alignLeft": "Linke Kanten",
|
||||||
|
"alignRight": "Rechte Kanten",
|
||||||
|
"centerVertically": "Vertikal zentrieren",
|
||||||
|
"centerHorizontally": "Horizontal zentrieren",
|
||||||
|
"distributeHorizontally": "Horizontal verteilen",
|
||||||
|
"distributeVertically": "Vertikal verteilen",
|
||||||
|
"flipHorizontal": "Horizontal spiegeln",
|
||||||
|
"flipVertical": "Vertikal spiegeln",
|
||||||
|
"viewMode": "Ansichtsmodus",
|
||||||
|
"share": "Teilen",
|
||||||
|
"showStroke": "Auswahl für Strichfarbe anzeigen",
|
||||||
|
"showBackground": "Hintergrundfarbe auswählen",
|
||||||
|
"showFonts": "Schriftauswahl anzeigen",
|
||||||
|
"toggleTheme": "Helles/dunkles Design umschalten",
|
||||||
|
"theme": "Design",
|
||||||
|
"personalLib": "Persönliche Bibliothek",
|
||||||
|
"excalidrawLib": "Excalidraw Bibliothek",
|
||||||
|
"decreaseFontSize": "Schriftgröße verringern",
|
||||||
|
"increaseFontSize": "Schriftgröße erhöhen",
|
||||||
|
"unbindText": "Text lösen",
|
||||||
|
"bindText": "Text an Container binden",
|
||||||
|
"createContainerFromText": "Text in Container einbetten",
|
||||||
|
"link": {
|
||||||
|
"edit": "Link bearbeiten",
|
||||||
|
"editEmbed": "Einbettbaren Link bearbeiten",
|
||||||
|
"create": "Link hinzufügen",
|
||||||
|
"label": "Link",
|
||||||
|
"labelEmbed": "Verlinken & einbetten",
|
||||||
|
"empty": "Kein Link festgelegt",
|
||||||
|
"hint": "Link hier eingeben oder einfügen",
|
||||||
|
"goToElement": "Gehe zu Zielelement"
|
||||||
|
},
|
||||||
|
"lineEditor": {
|
||||||
|
"edit": "Linie bearbeiten",
|
||||||
|
"editArrow": "Pfeil bearbeiten"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
|
},
|
||||||
|
"elementLock": {
|
||||||
|
"lock": "Sperren",
|
||||||
|
"unlock": "Entsperren",
|
||||||
|
"lockAll": "Alle sperren",
|
||||||
|
"unlockAll": "Alle entsperren"
|
||||||
|
},
|
||||||
|
"statusPublished": "Veröffentlicht",
|
||||||
|
"sidebarLock": "Seitenleiste offen lassen",
|
||||||
|
"selectAllElementsInFrame": "Alle Elemente im Rahmen auswählen",
|
||||||
|
"removeAllElementsFromFrame": "Alle Elemente aus dem Rahmen entfernen",
|
||||||
|
"eyeDropper": "Farbe von der Zeichenfläche auswählen",
|
||||||
|
"textToDiagram": "Text zu Diagramm",
|
||||||
|
"prompt": "Eingabe",
|
||||||
|
"followUs": "Folge uns",
|
||||||
|
"discordChat": "Discord-Chat",
|
||||||
|
"zoomToFitViewport": "Zoom auf Ansicht anpassen",
|
||||||
|
"zoomToFitSelection": "Zoom auf Auswahl anpassen",
|
||||||
|
"zoomToFit": "Zoom auf alle Elemente anpassen",
|
||||||
|
"installPWA": "Excalidraw lokal installieren (PWA)",
|
||||||
|
"autoResize": "Aktiviere automatische Textgrößenanpassung",
|
||||||
|
"imageCropping": "Bild zuschneiden",
|
||||||
|
"unCroppedDimension": "Nicht zugeschnittene Dimension",
|
||||||
|
"copyElementLink": "Link zum Objekt kopieren",
|
||||||
|
"linkToElement": "Link zum Objekt",
|
||||||
|
"wrapSelectionInFrame": "Auswahl in Rahmen einbetten",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "Link zum Objekt",
|
||||||
|
"desc": "Klicke auf eine Form auf der Zeichenfläche oder füge einen Link ein.",
|
||||||
|
"notFound": "Verknüpftes Objekt wurde nicht auf der Zeichenfläche gefunden."
|
||||||
|
},
|
||||||
|
"library": {
|
||||||
|
"noItems": "Noch keine Elemente hinzugefügt...",
|
||||||
|
"hint_emptyLibrary": "Wähle ein Element auf der Zeichenfläche, um es hier hinzuzufügen. Oder installiere eine Bibliothek aus dem öffentlichen Verzeichnis.",
|
||||||
|
"hint_emptyPrivateLibrary": "Wähle ein Element von der Zeichenfläche, um es hier hinzuzufügen.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "Auf Zeichenfläche suchen",
|
||||||
|
"noMatch": "Keine Treffer gefunden...",
|
||||||
|
"singleResult": "Ergebnis",
|
||||||
|
"multipleResults": "Ergebnisse",
|
||||||
|
"placeholder": "Text auf Zeichenfläche suchen...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
||||||
|
"exportJSON": "In Datei exportieren",
|
||||||
|
"exportImage": "Exportiere Bild...",
|
||||||
|
"export": "Speichern als...",
|
||||||
|
"copyToClipboard": "In Zwischenablage kopieren",
|
||||||
|
"copyLink": "Link kopieren",
|
||||||
|
"save": "In aktueller Datei speichern",
|
||||||
|
"saveAs": "Speichern unter",
|
||||||
|
"load": "Öffnen",
|
||||||
|
"getShareableLink": "Teilbaren Link erhalten",
|
||||||
|
"close": "Schließen",
|
||||||
|
"selectLanguage": "Sprache auswählen",
|
||||||
|
"scrollBackToContent": "Zurück zum Inhalt",
|
||||||
|
"zoomIn": "Vergrößern",
|
||||||
|
"zoomOut": "Verkleinern",
|
||||||
|
"resetZoom": "Zoom zurücksetzen",
|
||||||
|
"menu": "Menü",
|
||||||
|
"done": "Fertig",
|
||||||
|
"edit": "Bearbeiten",
|
||||||
|
"undo": "Rückgängig machen",
|
||||||
|
"redo": "Wiederholen",
|
||||||
|
"resetLibrary": "Bibliothek zurücksetzen",
|
||||||
|
"createNewRoom": "Neuen Raum erstellen",
|
||||||
|
"fullScreen": "Vollbildanzeige",
|
||||||
|
"darkMode": "Dunkles Design",
|
||||||
|
"lightMode": "Helles Design",
|
||||||
|
"systemMode": "System-Modus",
|
||||||
|
"zenMode": "Zen-Modus",
|
||||||
|
"objectsSnapMode": "Einrasten an Objekten",
|
||||||
|
"exitZenMode": "Zen-Modus verlassen",
|
||||||
|
"cancel": "Abbrechen",
|
||||||
|
"saveLibNames": "",
|
||||||
|
"clear": "Löschen",
|
||||||
|
"remove": "Entfernen",
|
||||||
|
"embed": "Einbettung umschalten",
|
||||||
|
"publishLibrary": "",
|
||||||
|
"submit": "Absenden",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"embeddableInteractionButton": "Klicken, um zu interagieren"
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"clearReset": "Dies wird die ganze Zeichenfläche löschen. Bist du dir sicher?",
|
||||||
|
"couldNotCreateShareableLink": "Konnte keinen teilbaren Link erstellen.",
|
||||||
|
"couldNotCreateShareableLinkTooBig": "Konnte keinen teilbaren Link erstellen: Die Zeichnung ist zu groß",
|
||||||
|
"couldNotLoadInvalidFile": "Ungültige Datei konnte nicht geladen werden",
|
||||||
|
"importBackendFailed": "Import vom Server ist fehlgeschlagen.",
|
||||||
|
"cannotExportEmptyCanvas": "Leere Zeichenfläche kann nicht exportiert werden.",
|
||||||
|
"couldNotCopyToClipboard": "Kopieren in die Zwischenablage fehlgeschlagen.",
|
||||||
|
"decryptFailed": "Daten konnten nicht entschlüsselt werden.",
|
||||||
|
"uploadedSecurly": "Der Upload wurde mit Ende-zu-Ende-Verschlüsselung gespeichert. Weder Excalidraw noch Dritte können den Inhalt einsehen.",
|
||||||
|
"loadSceneOverridePrompt": "Das Laden einer externen Zeichnung ersetzt den vorhandenen Inhalt. Möchtest du fortfahren?",
|
||||||
|
"collabStopOverridePrompt": "Das Stoppen der Sitzung wird deine vorherige, lokal gespeicherte Zeichnung überschreiben. Bist du dir sicher?\n\n(Wenn du deine lokale Zeichnung behalten möchtest, schließe stattdessen den Browser-Tab.)",
|
||||||
|
"errorAddingToLibrary": "Das Element konnte nicht zur Bibliothek hinzugefügt werden",
|
||||||
|
"errorRemovingFromLibrary": "Das Element konnte nicht aus der Bibliothek entfernt werden",
|
||||||
|
"confirmAddLibrary": "Dies fügt {{numShapes}} Form(en) zu deiner Bibliothek hinzu. Bist du dir sicher?",
|
||||||
|
"imageDoesNotContainScene": "Dieses Bild scheint keine Szenendaten zu enthalten. Hast Du das Einbetten der Szene während des Exports aktiviert?",
|
||||||
|
"cannotRestoreFromImage": "Die Zeichnung konnte aus dieser Bilddatei nicht wiederhergestellt werden",
|
||||||
|
"invalidSceneUrl": "Die Szene konnte nicht von der angegebenen URL importiert werden. Sie ist entweder fehlerhaft oder enthält keine gültigen Excalidraw JSON-Daten.",
|
||||||
|
"resetLibrary": "Dieses löscht deine Bibliothek. Bist du sicher?",
|
||||||
|
"removeItemsFromsLibrary": "{{count}} Element(e) aus der Bibliothek löschen?",
|
||||||
|
"invalidEncryptionKey": "Verschlüsselungsschlüssel muss 22 Zeichen lang sein. Die Live-Zusammenarbeit ist deaktiviert.",
|
||||||
|
"collabOfflineWarning": "Keine Internetverbindung verfügbar.\nDeine Änderungen werden nicht gespeichert!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"unsupportedFileType": "Nicht unterstützter Dateityp.",
|
||||||
|
"imageInsertError": "Das Bild konnte nicht eingefügt werden. Versuche es später erneut...",
|
||||||
|
"fileTooBig": "Die Datei ist zu groß. Die maximal zulässige Größe ist {{maxSize}}.",
|
||||||
|
"svgImageInsertError": "SVG-Bild konnte nicht eingefügt werden. Das SVG-Markup sieht ungültig aus.",
|
||||||
|
"failedToFetchImage": "Bild konnte nicht abgerufen werden.",
|
||||||
|
"cannotResolveCollabServer": "Konnte keine Verbindung zum Collab-Server herstellen. Bitte lade die Seite neu und versuche es erneut.",
|
||||||
|
"importLibraryError": "Bibliothek konnte nicht geladen werden",
|
||||||
|
"saveLibraryError": "Bibliothek konnte nicht gespeichert werden. Bitte speichere deine Bibliothek lokal in einer Datei, um sicherzustellen, dass keine Änderungen verloren gehen.",
|
||||||
|
"collabSaveFailed": "Keine Speicherung in der Backend-Datenbank möglich. Wenn die Probleme weiterhin bestehen, solltest Du Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
||||||
|
"collabSaveFailed_sizeExceeded": "Keine Speicherung in der Backend-Datenbank möglich, die Zeichenfläche scheint zu groß zu sein. Du solltest Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
||||||
|
"imageToolNotSupported": "Bilder sind deaktiviert.",
|
||||||
|
"brave_measure_text_error": {
|
||||||
|
"line1": "Sieht so aus, als ob Du den Brave-Browser verwendest und die <bold>aggressive Blockierung von Fingerabdrücken</bold> aktiviert hast.",
|
||||||
|
"line2": "Dies könnte dazu führen, dass die <bold>Textelemente</bold> in Ihren Zeichnungen zerstört werden.",
|
||||||
|
"line3": "Wir empfehlen dringend, diese Einstellung zu deaktivieren. Dazu kannst Du <link>diesen Schritten</link> folgen.",
|
||||||
|
"line4": "Wenn die Deaktivierung dieser Einstellung die fehlerhafte Anzeige von Textelementen nicht behebt, öffne bitte ein <issueLink>Ticket</issueLink> auf unserem GitHub oder schreibe uns auf <discordLink>Discord</discordLink>"
|
||||||
|
},
|
||||||
|
"libraryElementTypeError": {
|
||||||
|
"embeddable": "Einbettbare Elemente können der Bibliothek nicht hinzugefügt werden.",
|
||||||
|
"iframe": "IFrame-Elemente können nicht zur Bibliothek hinzugefügt werden.",
|
||||||
|
"image": "Unterstützung für das Hinzufügen von Bildern in die Bibliothek kommt bald!"
|
||||||
|
},
|
||||||
|
"asyncPasteFailedOnRead": "Einfügen fehlgeschlagen (konnte aus der Zwischenablage des Systems nicht gelesen werden).",
|
||||||
|
"asyncPasteFailedOnParse": "Einfügen fehlgeschlagen.",
|
||||||
|
"copyToSystemClipboardFailed": "Kopieren in die Zwischenablage fehlgeschlagen."
|
||||||
|
},
|
||||||
|
"toolBar": {
|
||||||
|
"selection": "Auswahl",
|
||||||
|
"lasso": "",
|
||||||
|
"image": "Bild einfügen",
|
||||||
|
"rectangle": "Rechteck",
|
||||||
|
"diamond": "Raute",
|
||||||
|
"ellipse": "Ellipse",
|
||||||
|
"arrow": "Pfeil",
|
||||||
|
"line": "Linie",
|
||||||
|
"freedraw": "Zeichnen",
|
||||||
|
"text": "Text",
|
||||||
|
"library": "Bibliothek",
|
||||||
|
"lock": "Ausgewähltes Werkzeug nach Zeichnen aktiv lassen",
|
||||||
|
"penMode": "Stift-Modus - Berührung verhindern",
|
||||||
|
"link": "Link für ausgewählte Form hinzufügen / aktualisieren",
|
||||||
|
"eraser": "Radierer",
|
||||||
|
"frame": "Rahmenwerkzeug",
|
||||||
|
"magicframe": "Wireframe zu Code",
|
||||||
|
"embeddable": "Web-Einbettung",
|
||||||
|
"laser": "Laserpointer",
|
||||||
|
"hand": "Hand (Schwenkwerkzeug)",
|
||||||
|
"extraTools": "Weitere Werkzeuge",
|
||||||
|
"mermaidToExcalidraw": "Mermaid zu Excalidraw",
|
||||||
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Rechteck",
|
||||||
|
"diamond": "Raute",
|
||||||
|
"ellipse": "Ellipse",
|
||||||
|
"arrow": "Pfeil",
|
||||||
|
"line": "Linie",
|
||||||
|
"freedraw": "Frei zeichnen",
|
||||||
|
"text": "Text",
|
||||||
|
"image": "Bild",
|
||||||
|
"group": "Gruppe",
|
||||||
|
"frame": "Rahmen",
|
||||||
|
"magicframe": "Wireframe zu Code",
|
||||||
|
"embeddable": "Web-Einbettung",
|
||||||
|
"selection": "Auswahl",
|
||||||
|
"iframe": "IFrame"
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"canvasActions": "Aktionen für Zeichenfläche",
|
||||||
|
"selectedShapeActions": "Aktionen für Auswahl",
|
||||||
|
"shapes": "Formen"
|
||||||
|
},
|
||||||
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
|
"linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie",
|
||||||
|
"arrowTool": "",
|
||||||
|
"freeDraw": "Klicke und ziehe. Lass los, wenn du fertig bist",
|
||||||
|
"text": "Tipp: Du kannst auch Text hinzufügen, indem du mit dem Auswahlwerkzeug auf eine beliebige Stelle doppelklickst",
|
||||||
|
"embeddable": "Klicken und ziehen, um eine Webseiten-Einbettung zu erstellen",
|
||||||
|
"text_selected": "",
|
||||||
|
"text_editing": "",
|
||||||
|
"linearElementMulti": "",
|
||||||
|
"lockAngle": "",
|
||||||
|
"resize": "",
|
||||||
|
"resizeImage": "",
|
||||||
|
"rotate": "",
|
||||||
|
"lineEditor_info": "",
|
||||||
|
"lineEditor_line_info": "",
|
||||||
|
"lineEditor_pointSelected": "",
|
||||||
|
"lineEditor_nothingSelected": "",
|
||||||
|
"publishLibrary": "Veröffentliche deine eigene Bibliothek",
|
||||||
|
"bindTextToElement": "",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
|
"firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\".",
|
||||||
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
|
},
|
||||||
|
"canvasError": {
|
||||||
|
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
|
||||||
|
"canvasTooBig": "Die Leinwand ist möglicherweise zu groß.",
|
||||||
|
"canvasTooBigTip": "Tipp: Schiebe die am weitesten entfernten Elemente ein wenig näher zusammen."
|
||||||
|
},
|
||||||
|
"errorSplash": {
|
||||||
|
"headingMain": "Es ist ein Fehler aufgetreten. Versuche <button>die Seite neu zu laden.</button>",
|
||||||
|
"clearCanvasMessage": "Wenn das Neuladen nicht funktioniert, versuche <button>die Zeichenfläche zu löschen.</button>",
|
||||||
|
"clearCanvasCaveat": " Dies wird zum Verlust von Daten führen ",
|
||||||
|
"trackedToSentry": "Der Fehler mit der Kennung {{eventId}} wurde in unserem System registriert.",
|
||||||
|
"openIssueMessage": "Wir waren sehr vorsichtig und haben deine Zeichnungsinformationen nicht in die Fehlerinformationen aufgenommen. Wenn deine Zeichnung nicht privat ist, unterstütze uns bitte über unseren <button>Bug-Tracker</button>. Bitte teile die unten stehenden Informationen mit uns im GitHub Issue (Kopieren und Einfügen).",
|
||||||
|
"sceneContent": "Zeichnungsinhalt:"
|
||||||
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "Oder"
|
||||||
|
},
|
||||||
|
"roomDialog": {
|
||||||
|
"desc_intro": "Lade Leute ein, an deiner Zeichnung mitzuarbeiten.",
|
||||||
|
"desc_privacy": "Keine Sorge, die Sitzung ist Ende-zu-Ende verschlüsselt und vollständig privat. Nicht einmal unser Server kann sehen, was du zeichnest.",
|
||||||
|
"button_startSession": "Sitzung starten",
|
||||||
|
"button_stopSession": "Sitzung beenden",
|
||||||
|
"desc_inProgressIntro": "Die Live-Sitzung wird nun ausgeführt.",
|
||||||
|
"desc_shareLink": "Teile diesen Link mit allen, mit denen du zusammenarbeiten möchtest:",
|
||||||
|
"desc_exitSession": "Wenn du die Sitzung beendest, wird deine Verbindung zum Raum getrennt. Du kannst jedoch lokal weiter an der Zeichnung arbeiten. Beachte, dass dies keine Auswirkungen auf andere hat und diese weiterhin gemeinsam an ihrer Version arbeiten können.",
|
||||||
|
"shareTitle": "An einer Live-Kollaborationssitzung auf Excalidraw teilnehmen"
|
||||||
|
},
|
||||||
|
"errorDialog": {
|
||||||
|
"title": "Fehler"
|
||||||
|
},
|
||||||
|
"exportDialog": {
|
||||||
|
"disk_title": "Auf Festplatte speichern",
|
||||||
|
"disk_details": "Exportiere die Zeichnungsdaten in eine Datei, die Du später importieren kannst.",
|
||||||
|
"disk_button": "Als Datei speichern",
|
||||||
|
"link_title": "Teilbarer Link",
|
||||||
|
"link_details": "Als schreibgeschützten Link exportieren.",
|
||||||
|
"link_button": "Als Link exportieren",
|
||||||
|
"excalidrawplus_description": "Speichere die Szene in deinem Excalidraw+ Arbeitsbereich.",
|
||||||
|
"excalidrawplus_button": "Exportieren",
|
||||||
|
"excalidrawplus_exportError": "Konnte nicht nach Excalidraw+ exportieren..."
|
||||||
|
},
|
||||||
|
"helpDialog": {
|
||||||
|
"blog": "Lies unseren Blog",
|
||||||
|
"click": "klicken",
|
||||||
|
"deepSelect": "Auswahl innerhalb der Gruppe",
|
||||||
|
"deepBoxSelect": "Auswahl innerhalb der Gruppe, und Ziehen vermeiden",
|
||||||
|
"createFlowchart": "Erstelle ein Flussdiagramm aus einem generischen Element",
|
||||||
|
"navigateFlowchart": "Durchsuche ein Flussdiagramm",
|
||||||
|
"curvedArrow": "Gebogener Pfeil",
|
||||||
|
"curvedLine": "Gebogene Linie",
|
||||||
|
"documentation": "Dokumentation",
|
||||||
|
"doubleClick": "doppelklicken",
|
||||||
|
"drag": "ziehen",
|
||||||
|
"editor": "Editor",
|
||||||
|
"editLineArrowPoints": "Linien-/Pfeil-Punkte bearbeiten",
|
||||||
|
"editText": "Text bearbeiten / Label hinzufügen",
|
||||||
|
"github": "Ein Problem gefunden? Informiere uns",
|
||||||
|
"howto": "Folge unseren Anleitungen",
|
||||||
|
"or": "oder",
|
||||||
|
"preventBinding": "Pfeil-Bindung verhindern",
|
||||||
|
"tools": "Werkzeuge",
|
||||||
|
"shortcuts": "Tastaturkürzel",
|
||||||
|
"textFinish": "Bearbeitung beenden (Texteditor)",
|
||||||
|
"textNewLine": "Neue Zeile hinzufügen (Texteditor)",
|
||||||
|
"title": "Hilfe",
|
||||||
|
"view": "Ansicht",
|
||||||
|
"zoomToFit": "Zoomen um alle Elemente einzupassen",
|
||||||
|
"zoomToSelection": "Auf Auswahl zoomen",
|
||||||
|
"toggleElementLock": "Auswahl sperren/entsperren",
|
||||||
|
"movePageUpDown": "Seite nach oben/unten verschieben",
|
||||||
|
"movePageLeftRight": "Seite nach links/rechts verschieben",
|
||||||
|
"cropStart": "Bild zuschneiden",
|
||||||
|
"cropFinish": "Zuschneiden des Bildes beenden"
|
||||||
|
},
|
||||||
|
"clearCanvasDialog": {
|
||||||
|
"title": "Zeichenfläche löschen"
|
||||||
|
},
|
||||||
|
"publishDialog": {
|
||||||
|
"title": "Bibliothek veröffentlichen",
|
||||||
|
"itemName": "Elementname",
|
||||||
|
"authorName": "Name des Autors",
|
||||||
|
"githubUsername": "GitHub-Benutzername",
|
||||||
|
"twitterUsername": "Twitter-Benutzername",
|
||||||
|
"libraryName": "Name der Bibliothek",
|
||||||
|
"libraryDesc": "Beschreibung der Bibliothek",
|
||||||
|
"website": "Webseite",
|
||||||
|
"placeholder": {
|
||||||
|
"authorName": "Dein Name oder Benutzername",
|
||||||
|
"libraryName": "Name deiner Bibliothek",
|
||||||
|
"libraryDesc": "Beschreibung deiner Bibliothek, um anderen Nutzern bei der Verwendung zu helfen",
|
||||||
|
"githubHandle": "GitHub-Handle (optional), damit du die Bibliothek bearbeiten kannst, wenn sie zur Überprüfung eingereicht wurde",
|
||||||
|
"twitterHandle": "Twitter-Benutzername (optional), damit wir wissen, wen wir bei Werbung über Twitter nennen können",
|
||||||
|
"website": "Link zu deiner persönlichen Webseite oder zu anderer Seite (optional)"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"required": "Erforderlich",
|
||||||
|
"website": "Gültige URL eingeben"
|
||||||
|
},
|
||||||
|
"noteDescription": "Sende deine Bibliothek ein, um in die <link>öffentliche Bibliotheks-Repository aufgenommen zu werden</link>damit andere Nutzer sie in ihren Zeichnungen verwenden können.",
|
||||||
|
"noteGuidelines": "Die Bibliothek muss zuerst manuell freigegeben werden. Bitte lies die <link>Richtlinien</link> vor dem Absenden. Du benötigst ein GitHub-Konto, um zu kommunizieren und Änderungen vorzunehmen, falls erforderlich, aber es ist nicht unbedingt erforderlich.",
|
||||||
|
"noteLicense": "Mit dem Absenden stimmst du zu, dass die Bibliothek unter der <link>MIT-Lizenz, </link>die zusammengefasst beinhaltet, dass jeder sie ohne Einschränkungen nutzen kann.",
|
||||||
|
"noteItems": "Jedes Bibliothekselement muss einen eigenen Namen haben, damit es gefiltert werden kann. Die folgenden Bibliothekselemente werden hinzugefügt:",
|
||||||
|
"atleastOneLibItem": "Bitte wähle mindestens ein Bibliothekselement aus, um zu beginnen",
|
||||||
|
"republishWarning": "Hinweis: Einige der ausgewählten Elemente sind bereits als veröffentlicht/eingereicht markiert. Du solltest Elemente nur erneut einreichen, wenn Du eine existierende Bibliothek oder Einreichung aktualisierst."
|
||||||
|
},
|
||||||
|
"publishSuccessDialog": {
|
||||||
|
"title": "Bibliothek übermittelt",
|
||||||
|
"content": "Vielen Dank {{authorName}}. Deine Bibliothek wurde zur Überprüfung eingereicht. Du kannst den Status verfolgen<link>hier</link>"
|
||||||
|
},
|
||||||
|
"confirmDialog": {
|
||||||
|
"resetLibrary": "Bibliothek zurücksetzen",
|
||||||
|
"removeItemsFromLib": "Ausgewählte Elemente aus der Bibliothek entfernen"
|
||||||
|
},
|
||||||
|
"imageExportDialog": {
|
||||||
|
"header": "Bild exportieren",
|
||||||
|
"label": {
|
||||||
|
"withBackground": "Hintergrund",
|
||||||
|
"onlySelected": "Nur ausgewählte",
|
||||||
|
"darkMode": "Dunkler Modus",
|
||||||
|
"embedScene": "Szene einbetten",
|
||||||
|
"scale": "Skalierung",
|
||||||
|
"padding": "Abstand"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"embedScene": "Die Zeichnungsdaten werden in der exportierten PNG/SVG-Datei gespeichert, sodass das Dokument später weiter bearbeitet werden kann. \nDieses wird die exportierte Datei vergrößern."
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"exportToPng": "Als PNG exportieren",
|
||||||
|
"exportToSvg": "Als SVG exportieren",
|
||||||
|
"copyPngToClipboard": "PNG in die Zwischenablage kopieren"
|
||||||
|
},
|
||||||
|
"button": {
|
||||||
|
"exportToPng": "PNG",
|
||||||
|
"exportToSvg": "SVG",
|
||||||
|
"copyPngToClipboard": "In Zwischenablage kopieren"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"encrypted": {
|
||||||
|
"tooltip": "Da deine Zeichnungen Ende-zu-Ende verschlüsselt werden, sehen auch unsere Excalidraw-Server sie niemals.",
|
||||||
|
"link": "Blogbeitrag über Ende-zu-Ende-Verschlüsselung in Excalidraw"
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"angle": "Winkel",
|
||||||
|
"shapes": "Formen",
|
||||||
|
"height": "Höhe",
|
||||||
|
"scene": "Zeichnung",
|
||||||
|
"selected": "Ausgewählt",
|
||||||
|
"storage": "Speicher",
|
||||||
|
"fullTitle": "Zeichenflächen- & Formeigenschaften",
|
||||||
|
"title": "Eigenschaften",
|
||||||
|
"generalStats": "Allgemein",
|
||||||
|
"elementProperties": "Formeigenschaften",
|
||||||
|
"total": "Gesamt",
|
||||||
|
"version": "Version",
|
||||||
|
"versionCopy": "Zum Kopieren klicken",
|
||||||
|
"versionNotAvailable": "Version nicht verfügbar",
|
||||||
|
"width": "Breite"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"addedToLibrary": "Zur Bibliothek hinzugefügt",
|
||||||
|
"copyStyles": "Formatierungen kopiert.",
|
||||||
|
"copyToClipboard": "In die Zwischenablage kopiert.",
|
||||||
|
"copyToClipboardAsPng": "{{exportSelection}} als PNG in die Zwischenablage kopiert\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "{{exportSelection}} als SVG in die Zwischenablage kopiert ({{exportColorScheme}})",
|
||||||
|
"fileSaved": "Datei gespeichert.",
|
||||||
|
"fileSavedToFilename": "Als {filename} gespeichert",
|
||||||
|
"canvas": "Zeichenfläche",
|
||||||
|
"selection": "Auswahl",
|
||||||
|
"pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen",
|
||||||
|
"unableToEmbed": "Einbetten dieser URL ist derzeit nicht zulässig. Erstelle einen Issue auf GitHub, um die URL freigeben zu lassen",
|
||||||
|
"unrecognizedLinkFormat": "Der Link, den Du eingebettet hast, stimmt nicht mit dem erwarteten Format überein. Bitte versuche den 'embed' String einzufügen, der von der Quellseite zur Verfügung gestellt wird",
|
||||||
|
"elementLinkCopied": "Link in Zwischenablage kopiert"
|
||||||
|
},
|
||||||
|
"colors": {
|
||||||
|
"transparent": "Transparent",
|
||||||
|
"black": "Schwarz",
|
||||||
|
"white": "Weiß",
|
||||||
|
"red": "Rot",
|
||||||
|
"pink": "Pink",
|
||||||
|
"grape": "Traube",
|
||||||
|
"violet": "Violett",
|
||||||
|
"gray": "Grau",
|
||||||
|
"blue": "Blau",
|
||||||
|
"cyan": "Cyan",
|
||||||
|
"teal": "Blaugrün",
|
||||||
|
"green": "Grün",
|
||||||
|
"yellow": "Gelb",
|
||||||
|
"orange": "Orange",
|
||||||
|
"bronze": "Bronze"
|
||||||
|
},
|
||||||
|
"welcomeScreen": {
|
||||||
|
"app": {
|
||||||
|
"center_heading": "Alle Daten werden lokal in Deinem Browser gespeichert.",
|
||||||
|
"center_heading_plus": "Möchtest du stattdessen zu Excalidraw+ gehen?",
|
||||||
|
"menuHint": "Exportieren, Einstellungen, Sprachen, ..."
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"menuHint": "Exportieren, Einstellungen und mehr...",
|
||||||
|
"center_heading": "Diagramme. Einfach. Gemacht.",
|
||||||
|
"toolbarHint": "Wähle ein Werkzeug & beginne zu zeichnen!",
|
||||||
|
"helpHint": "Kurzbefehle & Hilfe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
|
"mostUsedCustomColors": "Beliebteste benutzerdefinierte Farben",
|
||||||
|
"colors": "Farben",
|
||||||
|
"shades": "Schattierungen",
|
||||||
|
"hexCode": "Hex-Code",
|
||||||
|
"noShades": "Keine Schattierungen für diese Farbe verfügbar"
|
||||||
|
},
|
||||||
|
"overwriteConfirm": {
|
||||||
|
"action": {
|
||||||
|
"exportToImage": {
|
||||||
|
"title": "Als Bild exportieren",
|
||||||
|
"button": "Als Bild exportieren",
|
||||||
|
"description": "Exportiere die Zeichnungsdaten als ein Bild, von dem Du später importieren kannst."
|
||||||
|
},
|
||||||
|
"saveToDisk": {
|
||||||
|
"title": "Auf Festplatte speichern",
|
||||||
|
"button": "Auf Festplatte speichern",
|
||||||
|
"description": "Exportiere die Zeichnungsdaten in eine Datei, von der Du später importieren kannst."
|
||||||
|
},
|
||||||
|
"excalidrawPlus": {
|
||||||
|
"title": "Excalidraw+",
|
||||||
|
"button": "Export nach Excalidraw+",
|
||||||
|
"description": "Speichere die Szene in deinem Excalidraw+-Arbeitsbereich."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"loadFromFile": {
|
||||||
|
"title": "Aus Datei laden",
|
||||||
|
"button": "Aus Datei laden",
|
||||||
|
"description": "Das Laden aus einer Datei wird <bold>Deinen vorhandenen Inhalt ersetzen</bold>.<br></br>Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern."
|
||||||
|
},
|
||||||
|
"shareableLink": {
|
||||||
|
"title": "Aus Link laden",
|
||||||
|
"button": "Meinen Inhalt ersetzen",
|
||||||
|
"description": "Das Laden einer externen Zeichnung wird <bold>Deinen vorhandenen Inhalt ersetzen</bold>.<br></br>Du kannst Deine Zeichnung zuerst mit einer der folgenden Optionen sichern."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mermaid": {
|
||||||
|
"title": "Mermaid zu Excalidraw",
|
||||||
|
"button": "Einfügen",
|
||||||
|
"description": "Derzeit werden nur <flowchartLink>Flussdiagramme</flowchartLink>, <sequenceLink>Sequenzdiagramme</sequenceLink> und <classLink>Klassendiagramme</classLink> unterstützt. Die anderen Typen werden als Bild in Excalidraw dargestellt.",
|
||||||
|
"syntax": "Mermaid-Syntax",
|
||||||
|
"preview": "Vorschau"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Schnellsuche"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "alt"
|
||||||
|
},
|
||||||
|
"sceneFonts": "In dieser Szene",
|
||||||
|
"availableFonts": "Verfügbare Schriftarten",
|
||||||
|
"empty": "Keine Schriftarten gefunden"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "Keine Benutzer gefunden",
|
||||||
|
"hint": {
|
||||||
|
"text": "Klicke auf Benutzer um zu folgen",
|
||||||
|
"followStatus": "Du folgst derzeit diesem Benutzer",
|
||||||
|
"inCall": "Benutzer ist in einem Sprachanruf",
|
||||||
|
"micMuted": "Mikrofon des Benutzers ist stumm geschaltet",
|
||||||
|
"isSpeaking": "Benutzer spricht"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Befehlspalette",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Auswählen",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"close": "Schließen"
|
||||||
|
},
|
||||||
|
"recents": "Zuletzt verwendet",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Suche in Menüs und Befehlen, entdecke versteckte Funktionen",
|
||||||
|
"noMatch": "Keine passenden Befehle..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Befehl ist nicht verfügbar...",
|
||||||
|
"shortcutHint": "Benutze {{shortcut}} für Befehlspalette"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"labels": {
|
"labels": {
|
||||||
"paste": "Einfügen",
|
"paste": "Einfügen",
|
||||||
"pasteAsPlaintext": "Als reinen Text einfügen",
|
"pasteAsPlaintext": "Als unformatierten Text einfügen",
|
||||||
"pasteCharts": "Diagramme einfügen",
|
"pasteCharts": "Diagramme einfügen",
|
||||||
"selectAll": "Alle auswählen",
|
"selectAll": "Alle auswählen",
|
||||||
"multiSelect": "Element zur Auswahl hinzufügen",
|
"multiSelect": "Element zur Auswahl hinzufügen",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Formatierung kopieren",
|
"copyStyles": "Formatierung kopieren",
|
||||||
"pasteStyles": "Formatierung übernehmen",
|
"pasteStyles": "Formatierung übernehmen",
|
||||||
"stroke": "Strich",
|
"stroke": "Strich",
|
||||||
|
"changeStroke": "Strichfarbe ändern",
|
||||||
"background": "Hintergrund",
|
"background": "Hintergrund",
|
||||||
|
"changeBackground": "Hintergrundfarbe ändern",
|
||||||
"fill": "Füllung",
|
"fill": "Füllung",
|
||||||
"strokeWidth": "Strichstärke",
|
"strokeWidth": "Strichstärke",
|
||||||
"strokeStyle": "Konturstil",
|
"strokeStyle": "Konturstil",
|
||||||
@@ -44,6 +46,14 @@
|
|||||||
"arrowhead_triangle_outline": "Dreieck (Umrandung)",
|
"arrowhead_triangle_outline": "Dreieck (Umrandung)",
|
||||||
"arrowhead_diamond": "Raute",
|
"arrowhead_diamond": "Raute",
|
||||||
"arrowhead_diamond_outline": "Raute (Umrandung)",
|
"arrowhead_diamond_outline": "Raute (Umrandung)",
|
||||||
|
"arrowhead_crowfoot_many": "Krähenfuß (viele)",
|
||||||
|
"arrowhead_crowfoot_one": "Krähenfuß (einer)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Krähenfuß (einer oder viele)",
|
||||||
|
"more_options": "Weitere Optionen",
|
||||||
|
"arrowtypes": "Pfeiltyp",
|
||||||
|
"arrowtype_sharp": "Scharfer Pfeil",
|
||||||
|
"arrowtype_round": "Gebogener Pfeil",
|
||||||
|
"arrowtype_elbowed": "Ellenbogen-Pfeil",
|
||||||
"fontSize": "Schriftgröße",
|
"fontSize": "Schriftgröße",
|
||||||
"fontFamily": "Schriftfamilie",
|
"fontFamily": "Schriftfamilie",
|
||||||
"addWatermark": "\"Made with Excalidraw\" hinzufügen",
|
"addWatermark": "\"Made with Excalidraw\" hinzufügen",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Auf Leinwand verwendet",
|
"canvasColors": "Auf Leinwand verwendet",
|
||||||
"canvasBackground": "Zeichenflächenhintergrund",
|
"canvasBackground": "Zeichenflächenhintergrund",
|
||||||
"drawingCanvas": "Leinwand",
|
"drawingCanvas": "Leinwand",
|
||||||
|
"clearCanvas": "Zeichenfläche löschen",
|
||||||
"layers": "Ebenen",
|
"layers": "Ebenen",
|
||||||
"actions": "Aktionen",
|
"actions": "Aktionen",
|
||||||
"language": "Sprache",
|
"language": "Sprache",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Auswahl gruppieren",
|
"group": "Auswahl gruppieren",
|
||||||
"ungroup": "Gruppierung aufheben",
|
"ungroup": "Gruppierung aufheben",
|
||||||
"collaborators": "Mitarbeitende",
|
"collaborators": "Mitarbeitende",
|
||||||
"showGrid": "Raster anzeigen",
|
"toggleGrid": "Raster umschalten",
|
||||||
"addToLibrary": "Zur Bibliothek hinzufügen",
|
"addToLibrary": "Zur Bibliothek hinzufügen",
|
||||||
"removeFromLibrary": "Aus Bibliothek entfernen",
|
"removeFromLibrary": "Aus Bibliothek entfernen",
|
||||||
"libraryLoadingMessage": "Lade Bibliothek…",
|
"libraryLoadingMessage": "Lade Bibliothek…",
|
||||||
"libraries": "Bibliotheken durchsuchen",
|
"libraries": "Bibliotheken durchsuchen",
|
||||||
"loadingScene": "Lade Zeichnung…",
|
"loadingScene": "Lade Zeichnung…",
|
||||||
|
"loadScene": "Szene aus Datei laden",
|
||||||
"align": "Ausrichten",
|
"align": "Ausrichten",
|
||||||
"alignTop": "Obere Kanten",
|
"alignTop": "Obere Kanten",
|
||||||
"alignBottom": "Untere Kanten",
|
"alignBottom": "Untere Kanten",
|
||||||
@@ -105,26 +117,33 @@
|
|||||||
"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",
|
"showFonts": "Schriftauswahl anzeigen",
|
||||||
|
"toggleTheme": "Helles/dunkles Design umschalten",
|
||||||
|
"theme": "Design",
|
||||||
"personalLib": "Persönliche Bibliothek",
|
"personalLib": "Persönliche Bibliothek",
|
||||||
"excalidrawLib": "Excalidraw Bibliothek",
|
"excalidrawLib": "Excalidraw Bibliothek",
|
||||||
"decreaseFontSize": "Schriftgröße verkleinern",
|
"decreaseFontSize": "Schriftgröße verringern",
|
||||||
"increaseFontSize": "Schrift vergrößern",
|
"increaseFontSize": "Schriftgröße erhöhen",
|
||||||
"unbindText": "Text lösen",
|
"unbindText": "Text lösen",
|
||||||
"bindText": "Text an Container binden",
|
"bindText": "Text an Container binden",
|
||||||
"createContainerFromText": "Text in Container einbetten",
|
"createContainerFromText": "Text in Container einbetten",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Link bearbeiten",
|
"edit": "Link bearbeiten",
|
||||||
"editEmbed": "Link bearbeiten & einbetten",
|
"editEmbed": "Einbettbaren Link bearbeiten",
|
||||||
"create": "Link erstellen",
|
"create": "Link hinzufügen",
|
||||||
"createEmbed": "Link erstellen & einbetten",
|
|
||||||
"label": "Link",
|
"label": "Link",
|
||||||
"labelEmbed": "Verlinken & einbetten",
|
"labelEmbed": "Verlinken & einbetten",
|
||||||
"empty": "Kein Link festgelegt"
|
"empty": "Kein Link festgelegt",
|
||||||
|
"hint": "Link hier eingeben oder einfügen",
|
||||||
|
"goToElement": "Gehe zu Zielelement"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Linie bearbeiten",
|
"edit": "Linie bearbeiten",
|
||||||
"exit": "Linieneditor verlassen"
|
"editArrow": "Pfeil bearbeiten"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Sperren",
|
"lock": "Sperren",
|
||||||
@@ -138,12 +157,46 @@
|
|||||||
"removeAllElementsFromFrame": "Alle Elemente aus dem Rahmen entfernen",
|
"removeAllElementsFromFrame": "Alle Elemente aus dem Rahmen entfernen",
|
||||||
"eyeDropper": "Farbe von der Zeichenfläche auswählen",
|
"eyeDropper": "Farbe von der Zeichenfläche auswählen",
|
||||||
"textToDiagram": "Text zu Diagramm",
|
"textToDiagram": "Text zu Diagramm",
|
||||||
"prompt": "Eingabe"
|
"prompt": "Eingabe",
|
||||||
|
"followUs": "Folge uns",
|
||||||
|
"discordChat": "Discord-Chat",
|
||||||
|
"zoomToFitViewport": "Zoom auf Ansicht anpassen",
|
||||||
|
"zoomToFitSelection": "Zoom auf Auswahl anpassen",
|
||||||
|
"zoomToFit": "Zoom auf alle Elemente anpassen",
|
||||||
|
"installPWA": "Excalidraw lokal installieren (PWA)",
|
||||||
|
"autoResize": "Aktiviere automatische Textgrößenanpassung",
|
||||||
|
"imageCropping": "Bild zuschneiden",
|
||||||
|
"unCroppedDimension": "Nicht zugeschnittene Dimension",
|
||||||
|
"copyElementLink": "Link zum Objekt kopieren",
|
||||||
|
"linkToElement": "Link zum Objekt",
|
||||||
|
"wrapSelectionInFrame": "Auswahl in Rahmen einbetten",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "Link zum Objekt",
|
||||||
|
"desc": "Klicke auf eine Form auf der Zeichenfläche oder füge einen Link ein.",
|
||||||
|
"notFound": "Verknüpftes Objekt wurde nicht auf der Zeichenfläche gefunden."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Noch keine Elemente hinzugefügt...",
|
"noItems": "Noch keine Elemente hinzugefügt...",
|
||||||
"hint_emptyLibrary": "Wähle ein Element auf der Zeichenfläche, um es hier hinzuzufügen. Oder installiere eine Bibliothek aus dem öffentlichen Verzeichnis.",
|
"hint_emptyLibrary": "Wähle ein Element auf der Zeichenfläche, um es hier hinzuzufügen. Oder installiere eine Bibliothek aus dem öffentlichen Verzeichnis.",
|
||||||
"hint_emptyPrivateLibrary": "Wähle ein Element von der Zeichenfläche, um es hier hinzuzufügen."
|
"hint_emptyPrivateLibrary": "Wähle ein Element von der Zeichenfläche, um es hier hinzuzufügen.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "Auf Zeichenfläche suchen",
|
||||||
|
"noMatch": "Keine Treffer gefunden...",
|
||||||
|
"singleResult": "Ergebnis",
|
||||||
|
"multipleResults": "Ergebnisse",
|
||||||
|
"placeholder": "Text auf Zeichenfläche suchen...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
"clearReset": "Zeichenfläche löschen & Hintergrundfarbe zurücksetzen",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Exportiere Bild...",
|
"exportImage": "Exportiere Bild...",
|
||||||
"export": "Speichern als...",
|
"export": "Speichern als...",
|
||||||
"copyToClipboard": "In Zwischenablage kopieren",
|
"copyToClipboard": "In Zwischenablage kopieren",
|
||||||
|
"copyLink": "Link kopieren",
|
||||||
"save": "In aktueller Datei speichern",
|
"save": "In aktueller Datei speichern",
|
||||||
"saveAs": "Speichern unter",
|
"saveAs": "Speichern unter",
|
||||||
"load": "Öffnen",
|
"load": "Öffnen",
|
||||||
@@ -171,14 +225,16 @@
|
|||||||
"fullScreen": "Vollbildanzeige",
|
"fullScreen": "Vollbildanzeige",
|
||||||
"darkMode": "Dunkles Design",
|
"darkMode": "Dunkles Design",
|
||||||
"lightMode": "Helles Design",
|
"lightMode": "Helles Design",
|
||||||
|
"systemMode": "System-Modus",
|
||||||
"zenMode": "Zen-Modus",
|
"zenMode": "Zen-Modus",
|
||||||
"objectsSnapMode": "Einrasten an Objekten",
|
"objectsSnapMode": "Einrasten an Objekten",
|
||||||
"exitZenMode": "Zen-Modus verlassen",
|
"exitZenMode": "Zen-Modus verlassen",
|
||||||
"cancel": "Abbrechen",
|
"cancel": "Abbrechen",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Löschen",
|
"clear": "Löschen",
|
||||||
"remove": "Entfernen",
|
"remove": "Entfernen",
|
||||||
"embed": "Einbettung umschalten",
|
"embed": "Einbettung umschalten",
|
||||||
"publishLibrary": "Veröffentlichen",
|
"publishLibrary": "",
|
||||||
"submit": "Absenden",
|
"submit": "Absenden",
|
||||||
"confirm": "Bestätigen",
|
"confirm": "Bestätigen",
|
||||||
"embeddableInteractionButton": "Klicken, um zu interagieren"
|
"embeddableInteractionButton": "Klicken, um zu interagieren"
|
||||||
@@ -204,7 +260,8 @@
|
|||||||
"resetLibrary": "Dieses löscht deine Bibliothek. Bist du sicher?",
|
"resetLibrary": "Dieses löscht deine Bibliothek. Bist du sicher?",
|
||||||
"removeItemsFromsLibrary": "{{count}} Element(e) aus der Bibliothek löschen?",
|
"removeItemsFromsLibrary": "{{count}} Element(e) aus der Bibliothek löschen?",
|
||||||
"invalidEncryptionKey": "Verschlüsselungsschlüssel muss 22 Zeichen lang sein. Die Live-Zusammenarbeit ist deaktiviert.",
|
"invalidEncryptionKey": "Verschlüsselungsschlüssel muss 22 Zeichen lang sein. Die Live-Zusammenarbeit ist deaktiviert.",
|
||||||
"collabOfflineWarning": "Keine Internetverbindung verfügbar.\nDeine Änderungen werden nicht gespeichert!"
|
"collabOfflineWarning": "Keine Internetverbindung verfügbar.\nDeine Änderungen werden nicht gespeichert!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Nicht unterstützter Dateityp.",
|
"unsupportedFileType": "Nicht unterstützter Dateityp.",
|
||||||
@@ -212,9 +269,9 @@
|
|||||||
"fileTooBig": "Die Datei ist zu groß. Die maximal zulässige Größe ist {{maxSize}}.",
|
"fileTooBig": "Die Datei ist zu groß. Die maximal zulässige Größe ist {{maxSize}}.",
|
||||||
"svgImageInsertError": "SVG-Bild konnte nicht eingefügt werden. Das SVG-Markup sieht ungültig aus.",
|
"svgImageInsertError": "SVG-Bild konnte nicht eingefügt werden. Das SVG-Markup sieht ungültig aus.",
|
||||||
"failedToFetchImage": "Bild konnte nicht abgerufen werden.",
|
"failedToFetchImage": "Bild konnte nicht abgerufen werden.",
|
||||||
"invalidSVGString": "Ungültige SVG.",
|
|
||||||
"cannotResolveCollabServer": "Konnte keine Verbindung zum Collab-Server herstellen. Bitte lade die Seite neu und versuche es erneut.",
|
"cannotResolveCollabServer": "Konnte keine Verbindung zum Collab-Server herstellen. Bitte lade die Seite neu und versuche es erneut.",
|
||||||
"importLibraryError": "Bibliothek konnte nicht geladen werden",
|
"importLibraryError": "Bibliothek konnte nicht geladen werden",
|
||||||
|
"saveLibraryError": "Bibliothek konnte nicht gespeichert werden. Bitte speichere deine Bibliothek lokal in einer Datei, um sicherzustellen, dass keine Änderungen verloren gehen.",
|
||||||
"collabSaveFailed": "Keine Speicherung in der Backend-Datenbank möglich. Wenn die Probleme weiterhin bestehen, solltest Du Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
"collabSaveFailed": "Keine Speicherung in der Backend-Datenbank möglich. Wenn die Probleme weiterhin bestehen, solltest Du Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
||||||
"collabSaveFailed_sizeExceeded": "Keine Speicherung in der Backend-Datenbank möglich, die Zeichenfläche scheint zu groß zu sein. Du solltest Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
"collabSaveFailed_sizeExceeded": "Keine Speicherung in der Backend-Datenbank möglich, die Zeichenfläche scheint zu groß zu sein. Du solltest Deine Datei lokal speichern, um sicherzustellen, dass Du Deine Arbeit nicht verlierst.",
|
||||||
"imageToolNotSupported": "Bilder sind deaktiviert.",
|
"imageToolNotSupported": "Bilder sind deaktiviert.",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Auswahl",
|
"selection": "Auswahl",
|
||||||
|
"lasso": "",
|
||||||
"image": "Bild einfügen",
|
"image": "Bild einfügen",
|
||||||
"rectangle": "Rechteck",
|
"rectangle": "Rechteck",
|
||||||
"diamond": "Raute",
|
"diamond": "Raute",
|
||||||
@@ -255,7 +313,23 @@
|
|||||||
"hand": "Hand (Schwenkwerkzeug)",
|
"hand": "Hand (Schwenkwerkzeug)",
|
||||||
"extraTools": "Weitere Werkzeuge",
|
"extraTools": "Weitere Werkzeuge",
|
||||||
"mermaidToExcalidraw": "Mermaid zu Excalidraw",
|
"mermaidToExcalidraw": "Mermaid zu Excalidraw",
|
||||||
"magicSettings": "KI-Einstellungen"
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Rechteck",
|
||||||
|
"diamond": "Raute",
|
||||||
|
"ellipse": "Ellipse",
|
||||||
|
"arrow": "Pfeil",
|
||||||
|
"line": "Linie",
|
||||||
|
"freedraw": "Frei zeichnen",
|
||||||
|
"text": "Text",
|
||||||
|
"image": "Bild",
|
||||||
|
"group": "Gruppe",
|
||||||
|
"frame": "Rahmen",
|
||||||
|
"magicframe": "Wireframe zu Code",
|
||||||
|
"embeddable": "Web-Einbettung",
|
||||||
|
"selection": "Auswahl",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Aktionen für Zeichenfläche",
|
"canvasActions": "Aktionen für Zeichenfläche",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Formen"
|
"shapes": "Formen"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Um die Zeichenfläche zu verschieben, halte das Mausrad oder die Leertaste während des Ziehens, oder verwende das Hand-Werkzeug",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie",
|
"linearElement": "Klicken für Linie mit mehreren Punkten, Ziehen für einzelne Linie",
|
||||||
|
"arrowTool": "",
|
||||||
"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",
|
||||||
"embeddable": "Klicken und ziehen, um eine Webseiten-Einbettung zu erstellen",
|
"embeddable": "Klicken und ziehen, um eine Webseiten-Einbettung zu erstellen",
|
||||||
"text_selected": "Doppelklicken oder Eingabetaste drücken, um Text zu bearbeiten",
|
"text_selected": "",
|
||||||
"text_editing": "Drücke Escape oder CtrlOrCmd+Eingabetaste, um die Bearbeitung abzuschließen",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst",
|
"lockAngle": "",
|
||||||
"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": "",
|
||||||
"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": "",
|
||||||
"rotate": "Du kannst Winkel einschränken, indem du SHIFT während der Drehung gedrückt hältst",
|
"rotate": "",
|
||||||
"lineEditor_info": "CtrlOrCmd halten und Doppelklick oder CtrlOrCmd + Eingabe drücken, um Punkte zu bearbeiten",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Drücke Löschen, um Punkt(e) zu entfernen, CtrlOrCmd+D zum Duplizieren oder ziehe zum Verschieben",
|
"lineEditor_line_info": "",
|
||||||
"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",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Klicken, um das Bild zu platzieren oder klicken und ziehen um seine Größe manuell zu setzen",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Veröffentliche deine eigene Bibliothek",
|
"publishLibrary": "Veröffentliche deine eigene Bibliothek",
|
||||||
"bindTextToElement": "Zum Hinzufügen Eingabetaste drücken",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Halte CtrlOrCmd gedrückt, um innerhalb der Gruppe auszuwählen, und um Ziehen zu vermeiden",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Halte Alt gedrückt, um die zum Löschen markierten Elemente zurückzusetzen",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\".",
|
"firefox_clipboard_write": "Diese Funktion kann wahrscheinlich aktiviert werden, indem die Einstellung \"dom.events.asyncClipboard.clipboardItem\" auf \"true\" gesetzt wird. Um die Browsereinstellungen in Firefox zu ändern, besuche die Seite \"about:config\".",
|
||||||
"disableSnapping": "Halte CtrlOrCmd gedrückt, um das Einrasten zu deaktivieren"
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
|
"cannotShowPreview": "Vorschau kann nicht angezeigt werden",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Wir waren sehr vorsichtig und haben deine Zeichnungsinformationen nicht in die Fehlerinformationen aufgenommen. Wenn deine Zeichnung nicht privat ist, unterstütze uns bitte über unseren <button>Bug-Tracker</button>. Bitte teile die unten stehenden Informationen mit uns im GitHub Issue (Kopieren und Einfügen).",
|
"openIssueMessage": "Wir waren sehr vorsichtig und haben deine Zeichnungsinformationen nicht in die Fehlerinformationen aufgenommen. Wenn deine Zeichnung nicht privat ist, unterstütze uns bitte über unseren <button>Bug-Tracker</button>. Bitte teile die unten stehenden Informationen mit uns im GitHub Issue (Kopieren und Einfügen).",
|
||||||
"sceneContent": "Zeichnungsinhalt:"
|
"sceneContent": "Zeichnungsinhalt:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "Oder"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Du kannst Leute zu deiner aktuellen Zeichnung einladen um mit ihnen zusammenzuarbeiten.",
|
"desc_intro": "Lade Leute ein, an deiner Zeichnung mitzuarbeiten.",
|
||||||
"desc_privacy": "Keine Sorge, die Sitzung nutzt eine Ende-zu-Ende-Verschlüsselung. Alles was du zeichnest, bleibt privat. Auch unser Server sieht nicht, was du dir einfallen lässt.",
|
"desc_privacy": "Keine Sorge, die Sitzung ist Ende-zu-Ende verschlüsselt und vollständig privat. Nicht einmal unser Server kann sehen, was du zeichnest.",
|
||||||
"button_startSession": "Sitzung starten",
|
"button_startSession": "Sitzung starten",
|
||||||
"button_stopSession": "Sitzung beenden",
|
"button_stopSession": "Sitzung beenden",
|
||||||
"desc_inProgressIntro": "Die Live-Sitzung wird nun ausgeführt.",
|
"desc_inProgressIntro": "Die Live-Sitzung wird nun ausgeführt.",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "klicken",
|
"click": "klicken",
|
||||||
"deepSelect": "Auswahl innerhalb der Gruppe",
|
"deepSelect": "Auswahl innerhalb der Gruppe",
|
||||||
"deepBoxSelect": "Auswahl innerhalb der Gruppe, und Ziehen vermeiden",
|
"deepBoxSelect": "Auswahl innerhalb der Gruppe, und Ziehen vermeiden",
|
||||||
|
"createFlowchart": "Erstelle ein Flussdiagramm aus einem generischen Element",
|
||||||
|
"navigateFlowchart": "Durchsuche ein Flussdiagramm",
|
||||||
"curvedArrow": "Gebogener Pfeil",
|
"curvedArrow": "Gebogener Pfeil",
|
||||||
"curvedLine": "Gebogene Linie",
|
"curvedLine": "Gebogene Linie",
|
||||||
"documentation": "Dokumentation",
|
"documentation": "Dokumentation",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Auf Auswahl zoomen",
|
"zoomToSelection": "Auf Auswahl zoomen",
|
||||||
"toggleElementLock": "Auswahl sperren/entsperren",
|
"toggleElementLock": "Auswahl sperren/entsperren",
|
||||||
"movePageUpDown": "Seite nach oben/unten verschieben",
|
"movePageUpDown": "Seite nach oben/unten verschieben",
|
||||||
"movePageLeftRight": "Seite nach links/rechts verschieben"
|
"movePageLeftRight": "Seite nach links/rechts verschieben",
|
||||||
|
"cropStart": "Bild zuschneiden",
|
||||||
|
"cropFinish": "Zuschneiden des Bildes beenden"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Zeichenfläche löschen"
|
"title": "Zeichenfläche löschen"
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Winkel",
|
"angle": "Winkel",
|
||||||
"element": "Element",
|
"shapes": "Formen",
|
||||||
"elements": "Elemente",
|
|
||||||
"height": "Höhe",
|
"height": "Höhe",
|
||||||
"scene": "Zeichnung",
|
"scene": "Zeichnung",
|
||||||
"selected": "Ausgewählt",
|
"selected": "Ausgewählt",
|
||||||
"storage": "Speicher",
|
"storage": "Speicher",
|
||||||
"title": "Statistiken für Nerds",
|
"fullTitle": "Zeichenflächen- & Formeigenschaften",
|
||||||
|
"title": "Eigenschaften",
|
||||||
|
"generalStats": "Allgemein",
|
||||||
|
"elementProperties": "Formeigenschaften",
|
||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"versionCopy": "Zum Kopieren klicken",
|
"versionCopy": "Zum Kopieren klicken",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Formatierungen kopiert.",
|
"copyStyles": "Formatierungen kopiert.",
|
||||||
"copyToClipboard": "In die Zwischenablage kopiert.",
|
"copyToClipboard": "In die Zwischenablage kopiert.",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} als PNG in die Zwischenablage kopiert\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} als PNG in die Zwischenablage kopiert\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "{{exportSelection}} als SVG in die Zwischenablage kopiert ({{exportColorScheme}})",
|
||||||
"fileSaved": "Datei gespeichert.",
|
"fileSaved": "Datei gespeichert.",
|
||||||
"fileSavedToFilename": "Als {filename} gespeichert",
|
"fileSavedToFilename": "Als {filename} gespeichert",
|
||||||
"canvas": "Zeichenfläche",
|
"canvas": "Zeichenfläche",
|
||||||
"selection": "Auswahl",
|
"selection": "Auswahl",
|
||||||
"pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen",
|
"pasteAsSingleElement": "Verwende {{shortcut}} , um als einzelnes Element\neinzufügen oder in einen existierenden Texteditor einzufügen",
|
||||||
"unableToEmbed": "Einbetten dieser URL ist derzeit nicht zulässig. Erstelle einen Issue auf GitHub, um die URL freigeben zu lassen",
|
"unableToEmbed": "Einbetten dieser URL ist derzeit nicht zulässig. Erstelle einen Issue auf GitHub, um die URL freigeben zu lassen",
|
||||||
"unrecognizedLinkFormat": "Der Link, den Du eingebettet hast, stimmt nicht mit dem erwarteten Format überein. Bitte versuche den 'embed' String einzufügen, der von der Quellseite zur Verfügung gestellt wird"
|
"unrecognizedLinkFormat": "Der Link, den Du eingebettet hast, stimmt nicht mit dem erwarteten Format überein. Bitte versuche den 'embed' String einzufügen, der von der Quellseite zur Verfügung gestellt wird",
|
||||||
|
"elementLinkCopied": "Link in Zwischenablage kopiert"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Transparent",
|
"transparent": "Transparent",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Beliebteste benutzerdefinierte Farben",
|
"mostUsedCustomColors": "Beliebteste benutzerdefinierte Farben",
|
||||||
"colors": "Farben",
|
"colors": "Farben",
|
||||||
"shades": "Schattierungen",
|
"shades": "Schattierungen",
|
||||||
@@ -521,5 +612,53 @@
|
|||||||
"description": "Derzeit werden nur <flowchartLink>Flussdiagramme</flowchartLink>, <sequenceLink>Sequenzdiagramme</sequenceLink> und <classLink>Klassendiagramme</classLink> unterstützt. Die anderen Typen werden als Bild in Excalidraw dargestellt.",
|
"description": "Derzeit werden nur <flowchartLink>Flussdiagramme</flowchartLink>, <sequenceLink>Sequenzdiagramme</sequenceLink> und <classLink>Klassendiagramme</classLink> unterstützt. Die anderen Typen werden als Bild in Excalidraw dargestellt.",
|
||||||
"syntax": "Mermaid-Syntax",
|
"syntax": "Mermaid-Syntax",
|
||||||
"preview": "Vorschau"
|
"preview": "Vorschau"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Schnellsuche"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "alt"
|
||||||
|
},
|
||||||
|
"sceneFonts": "In dieser Szene",
|
||||||
|
"availableFonts": "Verfügbare Schriftarten",
|
||||||
|
"empty": "Keine Schriftarten gefunden"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "Keine Benutzer gefunden",
|
||||||
|
"hint": {
|
||||||
|
"text": "Klicke auf Benutzer um zu folgen",
|
||||||
|
"followStatus": "Du folgst derzeit diesem Benutzer",
|
||||||
|
"inCall": "Benutzer ist in einem Sprachanruf",
|
||||||
|
"micMuted": "Mikrofon des Benutzers ist stumm geschaltet",
|
||||||
|
"isSpeaking": "Benutzer spricht"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Befehlspalette",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Auswählen",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"close": "Schließen"
|
||||||
|
},
|
||||||
|
"recents": "Zuletzt verwendet",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Suche in Menüs und Befehlen, entdecke versteckte Funktionen",
|
||||||
|
"noMatch": "Keine passenden Befehle..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Befehl ist nicht verfügbar...",
|
||||||
|
"shortcutHint": "Benutze {{shortcut}} für Befehlspalette"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,17 +11,19 @@
|
|||||||
"copyAsPng": "Αντιγραφή στο πρόχειρο ως PNG",
|
"copyAsPng": "Αντιγραφή στο πρόχειρο ως PNG",
|
||||||
"copyAsSvg": "Αντιγραφή στο πρόχειρο ως SVG",
|
"copyAsSvg": "Αντιγραφή στο πρόχειρο ως SVG",
|
||||||
"copyText": "Αντιγραφή στο πρόχειρο ως κείμενο",
|
"copyText": "Αντιγραφή στο πρόχειρο ως κείμενο",
|
||||||
"copySource": "",
|
"copySource": "Αντιγραφή προέλευσης στο πρόχειρο",
|
||||||
"convertToCode": "",
|
"convertToCode": "Μετατροπή σε κώδικα",
|
||||||
"bringForward": "Στο προσκήνιο",
|
"bringForward": "Μεταφορά μπροστά",
|
||||||
"sendToBack": "Ένα επίπεδο πίσω",
|
"sendToBack": "Στείλ' το στο τέλος",
|
||||||
"bringToFront": "Ένα επίπεδο μπροστά",
|
"bringToFront": "Φερ' το μπροστά",
|
||||||
"sendBackward": "Στο παρασκήνιο",
|
"sendBackward": "Στο παρασκήνιο",
|
||||||
"delete": "Διαγραφή",
|
"delete": "Διαγραφή",
|
||||||
"copyStyles": "Αντιγραφή εμφάνισης",
|
"copyStyles": "Αντιγραφή εμφάνισης",
|
||||||
"pasteStyles": "Επικόλληση εμφάνισης",
|
"pasteStyles": "Επικόλληση εμφάνισης",
|
||||||
"stroke": "Μολυβιά",
|
"stroke": "Μολυβιά",
|
||||||
|
"changeStroke": "Αλλαγή χρώματος πινελιάς",
|
||||||
"background": "Φόντο",
|
"background": "Φόντο",
|
||||||
|
"changeBackground": "Αλλαγή χρώματος παρασκηνίου",
|
||||||
"fill": "Γέμισμα",
|
"fill": "Γέμισμα",
|
||||||
"strokeWidth": "Πάχος μολυβιάς",
|
"strokeWidth": "Πάχος μολυβιάς",
|
||||||
"strokeStyle": "Στυλ περιγράμματος",
|
"strokeStyle": "Στυλ περιγράμματος",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Κανένα",
|
"arrowhead_none": "Κανένα",
|
||||||
"arrowhead_arrow": "Βέλος",
|
"arrowhead_arrow": "Βέλος",
|
||||||
"arrowhead_bar": "Μπάρα",
|
"arrowhead_bar": "Μπάρα",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Κύκλος",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Κύκλος (περίγραμμα)",
|
||||||
"arrowhead_triangle": "Τρίγωνο",
|
"arrowhead_triangle": "Τρίγωνο",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Τρίγωνο (περίγραμμα)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Ρόμβος",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Ρόμβος (περίγραμμα)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "Τύπος βέλους",
|
||||||
|
"arrowtype_sharp": "Αιχμηρό βέλος",
|
||||||
|
"arrowtype_round": "Κυρτό βέλος",
|
||||||
|
"arrowtype_elbowed": "Γωνιακό βέλος",
|
||||||
"fontSize": "Μέγεθος γραμματοσειράς",
|
"fontSize": "Μέγεθος γραμματοσειράς",
|
||||||
"fontFamily": "Γραμματοσειρά",
|
"fontFamily": "Γραμματοσειρά",
|
||||||
"addWatermark": "Προσθήκη \"Φτιαγμένο με Excalidraw\"",
|
"addWatermark": "Προσθήκη \"Φτιαγμένο με Excalidraw\"",
|
||||||
@@ -56,7 +66,7 @@
|
|||||||
"veryLarge": "Πολύ μεγάλο",
|
"veryLarge": "Πολύ μεγάλο",
|
||||||
"solid": "Συμπαγής",
|
"solid": "Συμπαγής",
|
||||||
"hachure": "Εκκόλαψη",
|
"hachure": "Εκκόλαψη",
|
||||||
"zigzag": "",
|
"zigzag": "Τεθλασμένη γραμμή",
|
||||||
"crossHatch": "Διασταυρούμενη εκκόλαψη",
|
"crossHatch": "Διασταυρούμενη εκκόλαψη",
|
||||||
"thin": "Λεπτή",
|
"thin": "Λεπτή",
|
||||||
"bold": "Έντονη",
|
"bold": "Έντονη",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Χρησιμοποείται στον καμβά",
|
"canvasColors": "Χρησιμοποείται στον καμβά",
|
||||||
"canvasBackground": "Φόντο καμβά",
|
"canvasBackground": "Φόντο καμβά",
|
||||||
"drawingCanvas": "Σχεδίαση καμβά",
|
"drawingCanvas": "Σχεδίαση καμβά",
|
||||||
|
"clearCanvas": "Καθαρισμός καμβά",
|
||||||
"layers": "Στρώματα",
|
"layers": "Στρώματα",
|
||||||
"actions": "Ενέργειες",
|
"actions": "Ενέργειες",
|
||||||
"language": "Γλώσσα",
|
"language": "Γλώσσα",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Δημιουργία ομάδας από επιλογή",
|
"group": "Δημιουργία ομάδας από επιλογή",
|
||||||
"ungroup": "Κατάργηση ομάδας από επιλογή",
|
"ungroup": "Κατάργηση ομάδας από επιλογή",
|
||||||
"collaborators": "Συνεργάτες",
|
"collaborators": "Συνεργάτες",
|
||||||
"showGrid": "Προβολή πλέγματος",
|
"toggleGrid": "Εναλλαγή ορατότητας πλέγματος",
|
||||||
"addToLibrary": "Προσθήκη στη βιβλιοθήκη",
|
"addToLibrary": "Προσθήκη στη βιβλιοθήκη",
|
||||||
"removeFromLibrary": "Αφαίρεση από τη βιβλιοθήκη",
|
"removeFromLibrary": "Αφαίρεση από τη βιβλιοθήκη",
|
||||||
"libraryLoadingMessage": "Φόρτωση βιβλιοθήκης…",
|
"libraryLoadingMessage": "Φόρτωση βιβλιοθήκης…",
|
||||||
"libraries": "Άλλες βιβλιοθήκες",
|
"libraries": "Άλλες βιβλιοθήκες",
|
||||||
"loadingScene": "Φόρτωση σκηνής…",
|
"loadingScene": "Φόρτωση σκηνής…",
|
||||||
|
"loadScene": "Φόρτωση σκηνής από αρχείο",
|
||||||
"align": "Στοίχιση",
|
"align": "Στοίχιση",
|
||||||
"alignTop": "Στοίχιση πάνω",
|
"alignTop": "Στοίχιση πάνω",
|
||||||
"alignBottom": "Στοίχιση κάτω",
|
"alignBottom": "Στοίχιση κάτω",
|
||||||
@@ -105,26 +117,33 @@
|
|||||||
"share": "Κοινοποίηση",
|
"share": "Κοινοποίηση",
|
||||||
"showStroke": "Εμφάνιση επιλογέα χρωμάτων πινελιάς",
|
"showStroke": "Εμφάνιση επιλογέα χρωμάτων πινελιάς",
|
||||||
"showBackground": "Εμφάνιση επιλογέα χρώματος φόντου",
|
"showBackground": "Εμφάνιση επιλογέα χρώματος φόντου",
|
||||||
"toggleTheme": "Εναλλαγή θέματος",
|
"showFonts": "Εμφάνιση επιλογέα γραμματοσειράς",
|
||||||
|
"toggleTheme": "Εναλλαγή φωτεινού/σκοτεινού θέματος",
|
||||||
|
"theme": "Θέμα",
|
||||||
"personalLib": "Προσωπική Βιβλιοθήκη",
|
"personalLib": "Προσωπική Βιβλιοθήκη",
|
||||||
"excalidrawLib": "Βιβλιοθήκη Excalidraw",
|
"excalidrawLib": "Βιβλιοθήκη Excalidraw",
|
||||||
"decreaseFontSize": "Μείωση μεγέθους γραμματοσειράς",
|
"decreaseFontSize": "Μείωση μεγέθους γραμματοσειράς",
|
||||||
"increaseFontSize": "Αύξηση μεγέθους γραμματοσειράς",
|
"increaseFontSize": "Αύξηση μεγέθους γραμματοσειράς",
|
||||||
"unbindText": "Αποσύνδεση κειμένου",
|
"unbindText": "Αποσύνδεση κειμένου",
|
||||||
"bindText": "Δέσμευση κειμένου στο δοχείο",
|
"bindText": "Δέσμευση κειμένου στο δοχείο",
|
||||||
"createContainerFromText": "",
|
"createContainerFromText": "Αναδίπλωση κειμένου σε δοχείο",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Επεξεργασία συνδέσμου",
|
"edit": "Επεξεργασία συνδέσμου",
|
||||||
"editEmbed": "",
|
"editEmbed": "",
|
||||||
"create": "Δημιουργία συνδέσμου",
|
"create": "",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "Σύνδεσμος",
|
"label": "Σύνδεσμος",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "Σύνδεσμος & ενσωμάτωση",
|
||||||
"empty": ""
|
"empty": "Δεν έχει οριστεί σύνδεσμος",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Επεξεργασία γραμμής",
|
"edit": "Επεξεργασία γραμμής",
|
||||||
"exit": "Έξοδος επεξεργαστή κειμένου"
|
"editArrow": "Επεξεργασία βέλους"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Κλείδωμα",
|
"lock": "Κλείδωμα",
|
||||||
@@ -134,16 +153,50 @@
|
|||||||
},
|
},
|
||||||
"statusPublished": "Δημοσιευμένο",
|
"statusPublished": "Δημοσιευμένο",
|
||||||
"sidebarLock": "Κρατήστε την πλαϊνή μπάρα ανοιχτή",
|
"sidebarLock": "Κρατήστε την πλαϊνή μπάρα ανοιχτή",
|
||||||
"selectAllElementsInFrame": "",
|
"selectAllElementsInFrame": "Επιλογή όλων των στοιχείων στο πλαίσιο",
|
||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "Αφαίρεση όλων των στοιχείων από το πλαίσιο",
|
||||||
"eyeDropper": "",
|
"eyeDropper": "Διαλέξτε χρώμα απ' τον καμβά",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "Κείμενο σε διάγραμμα",
|
||||||
"prompt": ""
|
"prompt": "Εντολή",
|
||||||
|
"followUs": "Ακολουθήστε μας",
|
||||||
|
"discordChat": "Συνομιλία Discord",
|
||||||
|
"zoomToFitViewport": "Εστίαση για να χωρέσει στο παράθυρο προβολής",
|
||||||
|
"zoomToFitSelection": "Εστίαση για να χωρέσει στην επιλογή",
|
||||||
|
"zoomToFit": "Εστίαση για να χωρέσει σε όλα τα στοιχεία",
|
||||||
|
"installPWA": "Τοπική εγκατάσταση Excalidraw (PWA)",
|
||||||
|
"autoResize": "Ενεργοποίηση αυτόματης αλλαγής μεγέθους κειμένου",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Δεν έχουν προστεθεί αντικείμενα ακόμη...",
|
"noItems": "Δεν έχουν προστεθεί αντικείμενα ακόμη...",
|
||||||
"hint_emptyLibrary": "Επιλέξτε ένα στοιχείο στον καμβά για να το προσθέσετε εδώ, ή εγκαταστήστε μια βιβλιοθήκη από το δημόσιο αποθετήριο, παρακάτω.",
|
"hint_emptyLibrary": "Επιλέξτε ένα στοιχείο στον καμβά για να το προσθέσετε εδώ, ή εγκαταστήστε μια βιβλιοθήκη από το δημόσιο αποθετήριο, παρακάτω.",
|
||||||
"hint_emptyPrivateLibrary": "Επιλέξτε ένα στοιχείο στον καμβά για να το προσθέσετε εδώ."
|
"hint_emptyPrivateLibrary": "Επιλέξτε ένα στοιχείο στον καμβά για να το προσθέσετε εδώ.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Επαναφορά του καμβά",
|
"clearReset": "Επαναφορά του καμβά",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Εξαγωγή εικόνας...",
|
"exportImage": "Εξαγωγή εικόνας...",
|
||||||
"export": "Αποθήκευση ως...",
|
"export": "Αποθήκευση ως...",
|
||||||
"copyToClipboard": "Αντιγραφή στο πρόχειρο",
|
"copyToClipboard": "Αντιγραφή στο πρόχειρο",
|
||||||
|
"copyLink": "Αντιγραφή συνδέσμου",
|
||||||
"save": "Αποθήκευση στο τρέχον αρχείο",
|
"save": "Αποθήκευση στο τρέχον αρχείο",
|
||||||
"saveAs": "Αποθήκευση ως",
|
"saveAs": "Αποθήκευση ως",
|
||||||
"load": "Άνοιγμα",
|
"load": "Άνοιγμα",
|
||||||
@@ -171,17 +225,19 @@
|
|||||||
"fullScreen": "Πλήρης οθόνη",
|
"fullScreen": "Πλήρης οθόνη",
|
||||||
"darkMode": "Σκοτεινή λειτουργία",
|
"darkMode": "Σκοτεινή λειτουργία",
|
||||||
"lightMode": "Φωτεινή λειτουργία",
|
"lightMode": "Φωτεινή λειτουργία",
|
||||||
|
"systemMode": "Λειτουργία συστήματος",
|
||||||
"zenMode": "Λειτουργία Zεν",
|
"zenMode": "Λειτουργία Zεν",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "Προσκόλληση σε αντικείμενα",
|
||||||
"exitZenMode": "Έξοδος από την λειτουργία Zen",
|
"exitZenMode": "Έξοδος από την λειτουργία Zen",
|
||||||
"cancel": "Ακύρωση",
|
"cancel": "Ακύρωση",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Καθαρισμός",
|
"clear": "Καθαρισμός",
|
||||||
"remove": "Κατάργηση",
|
"remove": "Κατάργηση",
|
||||||
"embed": "",
|
"embed": "Εναλλαγή ενσωμάτωσης",
|
||||||
"publishLibrary": "Δημοσίευση",
|
"publishLibrary": "",
|
||||||
"submit": "Υποβολή",
|
"submit": "Υποβολή",
|
||||||
"confirm": "Επιβεβαίωση",
|
"confirm": "Επιβεβαίωση",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": "Κάντε κλικ για αλληλεπίδραση"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "Αυτό θα σβήσει ολόκληρο τον καμβά. Είσαι σίγουρος;",
|
"clearReset": "Αυτό θα σβήσει ολόκληρο τον καμβά. Είσαι σίγουρος;",
|
||||||
@@ -204,37 +260,39 @@
|
|||||||
"resetLibrary": "Αυτό θα καθαρίσει τη βιβλιοθήκη σας. Είστε σίγουροι;",
|
"resetLibrary": "Αυτό θα καθαρίσει τη βιβλιοθήκη σας. Είστε σίγουροι;",
|
||||||
"removeItemsFromsLibrary": "Διαγραφή {{count}} αντικειμένου(ων) από τη βιβλιοθήκη;",
|
"removeItemsFromsLibrary": "Διαγραφή {{count}} αντικειμένου(ων) από τη βιβλιοθήκη;",
|
||||||
"invalidEncryptionKey": "Το κλειδί κρυπτογράφησης πρέπει να είναι 22 χαρακτήρες. Η ζωντανή συνεργασία είναι απενεργοποιημένη.",
|
"invalidEncryptionKey": "Το κλειδί κρυπτογράφησης πρέπει να είναι 22 χαρακτήρες. Η ζωντανή συνεργασία είναι απενεργοποιημένη.",
|
||||||
"collabOfflineWarning": "Δεν υπάρχει διαθέσιμη σύνδεση στο internet.\nΟι αλλαγές σας δεν θα αποθηκευτούν!"
|
"collabOfflineWarning": "Δεν υπάρχει διαθέσιμη σύνδεση στο internet.\nΟι αλλαγές σας δεν θα αποθηκευτούν!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Μη υποστηριζόμενος τύπος αρχείου.",
|
"unsupportedFileType": "Μη υποστηριζόμενος τύπος αρχείου.",
|
||||||
"imageInsertError": "Αδυναμία εισαγωγής εικόνας. Προσπαθήστε ξανά αργότερα...",
|
"imageInsertError": "Αδυναμία εισαγωγής εικόνας. Προσπαθήστε ξανά αργότερα...",
|
||||||
"fileTooBig": "Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπόμενο μέγεθος είναι {{maxSize}}.",
|
"fileTooBig": "Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπόμενο μέγεθος είναι {{maxSize}}.",
|
||||||
"svgImageInsertError": "Αδυναμία εισαγωγής εικόνας SVG. Η σήμανση της SVG δεν φαίνεται έγκυρη.",
|
"svgImageInsertError": "Αδυναμία εισαγωγής εικόνας SVG. Η σήμανση της SVG δεν φαίνεται έγκυρη.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "Αποτυχία ανάκτησης εικόνας.",
|
||||||
"invalidSVGString": "Μη έγκυρο SVG.",
|
|
||||||
"cannotResolveCollabServer": "Αδυναμία σύνδεσης με τον διακομιστή συνεργασίας. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.",
|
"cannotResolveCollabServer": "Αδυναμία σύνδεσης με τον διακομιστή συνεργασίας. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.",
|
||||||
"importLibraryError": "Αδυναμία φόρτωσης βιβλιοθήκης",
|
"importLibraryError": "Αδυναμία φόρτωσης βιβλιοθήκης",
|
||||||
|
"saveLibraryError": "Αδύνατη η αποθήκευση της βιβλιοθήκης στον δίσκο. Παρακαλώ αποθηκεύστε τη βιβλιοθήκη σας σε ένα αρχείο τοπικά για να βεβαιωθείτε ότι δε θα χάσετε τις αλλαγές.",
|
||||||
"collabSaveFailed": "Η αποθήκευση στη βάση δεδομένων δεν ήταν δυνατή. Αν το προβλήματα παραμείνει, θα πρέπει να αποθηκεύσετε το αρχείο σας τοπικά για να βεβαιωθείτε ότι δεν χάνετε την εργασία σας.",
|
"collabSaveFailed": "Η αποθήκευση στη βάση δεδομένων δεν ήταν δυνατή. Αν το προβλήματα παραμείνει, θα πρέπει να αποθηκεύσετε το αρχείο σας τοπικά για να βεβαιωθείτε ότι δεν χάνετε την εργασία σας.",
|
||||||
"collabSaveFailed_sizeExceeded": "Η αποθήκευση στη βάση δεδομένων δεν ήταν δυνατή, ο καμβάς φαίνεται να είναι πολύ μεγάλος. Θα πρέπει να αποθηκεύσετε το αρχείο τοπικά για να βεβαιωθείτε ότι δεν θα χάσετε την εργασία σας.",
|
"collabSaveFailed_sizeExceeded": "Η αποθήκευση στη βάση δεδομένων δεν ήταν δυνατή, ο καμβάς φαίνεται να είναι πολύ μεγάλος. Θα πρέπει να αποθηκεύσετε το αρχείο τοπικά για να βεβαιωθείτε ότι δεν θα χάσετε την εργασία σας.",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "Οι εικόνες είναι απενεργοποιημένες.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "",
|
"line1": "Φαίνεται ότι χρησιμοποιείτε τον περιηγητή Brave με ενεργοποιημένη τη ρύθμιση <bold>Aggressively Block Fingerprinting</bold>.",
|
||||||
"line2": "",
|
"line2": "Αυτό θα μπορεί να οδηγήσει στη διάλυση των <bold>Στοιχείων Κειμένου</bold> στο σχέδιό σας.",
|
||||||
"line3": "",
|
"line3": "Σας συνιστούμε να απενεργοποιήσετε αυτή τη ρύθμιση. Μπορείτε να ακολουθήσετε <link>αυτά τα βήματα</link> για το πώς να το κάνετε.",
|
||||||
"line4": ""
|
"line4": "Εάν η απενεργοποίηση αυτής της ρύθμισης δε διορθώσει την εμφάνιση των στοιχείων κειμένου, παρακαλώ ανοίξτε ένα <issueLink>θέμα</issueLink> στο GitHub, ή γράψτε μας στο <discordLink>Discord</discordLink>"
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "",
|
"embeddable": "Τα ενσωματώσιμα στοιχεία δεν μπορούν να προστεθούν στη βιβλιοθήκη.",
|
||||||
"iframe": "",
|
"iframe": "Τα στοιχεία IFrame δεν μπορούν να προστεθούν στη βιβλιοθήκη.",
|
||||||
"image": ""
|
"image": "Η υποστήριξη για προσθήκη εικόνων στη βιβλιοθήκη έρχεται σύντομα!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "",
|
"asyncPasteFailedOnRead": "Δεν ήταν δυνατή η επικόλληση (δεν ήταν δυνατή η ανάγνωση από το πρόχειρο του συστήματος).",
|
||||||
"asyncPasteFailedOnParse": "",
|
"asyncPasteFailedOnParse": "Αδυναμία επικόλλησης.",
|
||||||
"copyToSystemClipboardFailed": ""
|
"copyToSystemClipboardFailed": "Αδυναμία αντιγραφής στο πρόχειρο."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Επιλογή",
|
"selection": "Επιλογή",
|
||||||
|
"lasso": "",
|
||||||
"image": "Εισαγωγή εικόνας",
|
"image": "Εισαγωγή εικόνας",
|
||||||
"rectangle": "Ορθογώνιο",
|
"rectangle": "Ορθογώνιο",
|
||||||
"diamond": "Ρόμβος",
|
"diamond": "Ρόμβος",
|
||||||
@@ -246,16 +304,32 @@
|
|||||||
"library": "Βιβλιοθήκη",
|
"library": "Βιβλιοθήκη",
|
||||||
"lock": "Κράτησε επιλεγμένο το εργαλείο μετά το σχέδιο",
|
"lock": "Κράτησε επιλεγμένο το εργαλείο μετά το σχέδιο",
|
||||||
"penMode": "Λειτουργία μολυβιού - αποτροπή αφής",
|
"penMode": "Λειτουργία μολυβιού - αποτροπή αφής",
|
||||||
"link": "Προσθήκη/ Ενημέρωση συνδέσμου για ένα επιλεγμένο σχήμα",
|
"link": "Προσθήκη / Ενημέρωση συνδέσμου για επιλεγμένο σχήμα",
|
||||||
"eraser": "Γόμα",
|
"eraser": "Γόμα",
|
||||||
"frame": "",
|
"frame": "Εργαλείο πλαισίου",
|
||||||
"magicframe": "",
|
"magicframe": "Wireframe σε κώδικα",
|
||||||
"embeddable": "",
|
"embeddable": "Web Embed",
|
||||||
"laser": "",
|
"laser": "Δείκτης λέιζερ",
|
||||||
"hand": "",
|
"hand": "Χέρι (εργαλείο μετακίνησης)",
|
||||||
"extraTools": "",
|
"extraTools": "Περισσότερα εργαλεία",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "Mermaid σε Excalidraw",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Ορθογώνιο",
|
||||||
|
"diamond": "Ρόμβος",
|
||||||
|
"ellipse": "Έλλειψη",
|
||||||
|
"arrow": "Βέλος",
|
||||||
|
"line": "Γραμμή",
|
||||||
|
"freedraw": "Ελεύθερη σχεδίαση",
|
||||||
|
"text": "Κείμενο",
|
||||||
|
"image": "Εικόνα",
|
||||||
|
"group": "Ομάδα",
|
||||||
|
"frame": "Πλαίσιο",
|
||||||
|
"magicframe": "Wireframe σε κώδικα",
|
||||||
|
"embeddable": "Web Embed",
|
||||||
|
"selection": "Επιλογή",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Ενέργειες καμβά",
|
"canvasActions": "Ενέργειες καμβά",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Σχήματα"
|
"shapes": "Σχήματα"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
|
"dismissSearch": "",
|
||||||
"canvasPanning": "",
|
"canvasPanning": "",
|
||||||
"linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή",
|
"linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει",
|
"freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει",
|
||||||
"text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών",
|
"text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών",
|
||||||
"embeddable": "",
|
"embeddable": "Κάντε κλικ και σύρετε για να δημιουργήσετε μια ενσωματωμένη ιστοσελίδα",
|
||||||
"text_selected": "Κάντε διπλό κλικ ή πατήστε ENTER για να επεξεργαστείτε το κείμενο",
|
"text_selected": "",
|
||||||
"text_editing": "Πατήστε Escape ή CtrlOrCmd+ENTER για να ολοκληρώσετε την επεξεργασία",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Μπορείτε να περιορίσετε τη γωνία κρατώντας πατημένο το SHIFT",
|
"lockAngle": "",
|
||||||
"resize": "Μπορείς να περιορίσεις τις αναλογίες κρατώντας το SHIFT ενώ αλλάζεις μέγεθος,\nκράτησε πατημένο το ALT για αλλαγή μεγέθους από το κέντρο",
|
"resize": "",
|
||||||
"resizeImage": "Μπορείτε να αλλάξετε το μέγεθος ελεύθερα κρατώντας πατημένο το SHIFT,\nκρατήστε πατημένο το ALT για να αλλάξετε το μέγεθος από το κέντρο",
|
"resizeImage": "",
|
||||||
"rotate": "Μπορείς να περιορίσεις τις γωνίες κρατώντας πατημένο το πλήκτρο SHIFT κατά την περιστροφή",
|
"rotate": "",
|
||||||
"lineEditor_info": "Κρατήστε πατημένο Ctrl ή Cmd και πατήστε το πλήκτρο Ctrl ή Cmd + Enter για επεξεργασία σημείων",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Πατήστε Διαγραφή για αφαίρεση σημείου(ων),\nCtrlOrCmd+D για αντιγραφή, ή σύρετε για μετακίνηση",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "Επιλέξτε ένα σημείο για να επεξεργαστείτε (κρατήστε πατημένο το SHIFT για να επιλέξετε πολλαπλά),\nή κρατήστε πατημένο το Alt και κάντε κλικ για να προσθέσετε νέα σημεία",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Κάντε κλικ για να τοποθετήσετε την εικόνα ή κάντε κλικ και σύρετε για να ορίσετε το μέγεθός της χειροκίνητα",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Δημοσιεύστε τη δική σας βιβλιοθήκη",
|
"publishLibrary": "Δημοσιεύστε τη δική σας βιβλιοθήκη",
|
||||||
"bindTextToElement": "Πατήστε Enter για προσθήκη κειμένου",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Κρατήστε πατημένο το CtrlOrCmd για να επιλέξετε βαθιά, και να αποτρέψετε τη μεταφορά",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Κρατήστε πατημένο το Alt για να επαναφέρετε τα στοιχεία που σημειώθηκαν για διαγραφή",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\".",
|
"firefox_clipboard_write": "Αυτή η επιλογή μπορεί πιθανώς να ενεργοποιηθεί αλλάζοντας την ρύθμιση \"dom.events.asyncClipboard.clipboardItem\" σε \"true\". Για να αλλάξετε τις ρυθμίσεις του προγράμματος περιήγησης στο Firefox, επισκεφθείτε τη σελίδα \"about:config\".",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης",
|
"cannotShowPreview": "Αδυναμία εμφάνισης προεπισκόπησης",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Ήμασταν πολύ προσεκτικοί για να μην συμπεριλάβουμε τις πληροφορίες της σκηνής σου στο σφάλμα. Αν η σκηνή σου δεν είναι ιδιωτική, παρακαλώ σκέψου να ακολουθήσεις το δικό μας <button>ανιχνευτής σφαλμάτων.</button> Παρακαλώ να συμπεριλάβετε τις παρακάτω πληροφορίες, αντιγράφοντας και επικολλώντας το ζήτημα στο GitHub.",
|
"openIssueMessage": "Ήμασταν πολύ προσεκτικοί για να μην συμπεριλάβουμε τις πληροφορίες της σκηνής σου στο σφάλμα. Αν η σκηνή σου δεν είναι ιδιωτική, παρακαλώ σκέψου να ακολουθήσεις το δικό μας <button>ανιχνευτής σφαλμάτων.</button> Παρακαλώ να συμπεριλάβετε τις παρακάτω πληροφορίες, αντιγράφοντας και επικολλώντας το ζήτημα στο GitHub.",
|
||||||
"sceneContent": "Περιεχόμενο σκηνής:"
|
"sceneContent": "Περιεχόμενο σκηνής:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "Ή"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Μπορείς να προσκαλέσεις άλλους να δουλέψουν μαζί σου.",
|
"desc_intro": "Προσκαλέστε άτομα για να συνεργαστείτε στο σχέδιό σας.",
|
||||||
"desc_privacy": "Μην ανησυχείς, η συνεδρία χρησιμοποιεί κρυπτογράφηση από σημείο σε σημείο, άρα οτιδήποτε κάνεις θα παραμείνει ανοιχτό μόνο σε εσένα. Ούτε οι μηχανές μας μπορούν να δουν τι κάνεις.",
|
"desc_privacy": "Μην ανησυχείτε, η συνεδρία είναι κρυπτογραφημένη από άκρο σε άκρο, και πλήρως ιδιωτική. Ούτε ο διακομιστής μας μπορεί να δει τι σχεδιάζετε.",
|
||||||
"button_startSession": "Έναρξη Συνεδρίας",
|
"button_startSession": "Έναρξη Συνεδρίας",
|
||||||
"button_stopSession": "Τερματισμός Συνεδρίας",
|
"button_stopSession": "Τερματισμός Συνεδρίας",
|
||||||
"desc_inProgressIntro": "Η ζωντανή συνεργασία με άλλους είναι σε ενεργή.",
|
"desc_inProgressIntro": "Η ζωντανή συνεργασία με άλλους είναι σε ενεργή.",
|
||||||
@@ -328,14 +410,16 @@
|
|||||||
"click": "κλικ",
|
"click": "κλικ",
|
||||||
"deepSelect": "Βαθιά επιλογή",
|
"deepSelect": "Βαθιά επιλογή",
|
||||||
"deepBoxSelect": "Βαθιά επιλογή μέσα στο πλαίσιο και αποτροπή συρσίματος",
|
"deepBoxSelect": "Βαθιά επιλογή μέσα στο πλαίσιο και αποτροπή συρσίματος",
|
||||||
|
"createFlowchart": "Δημιουργία διαγράμματος ροής από ένα γενικό στοιχείο",
|
||||||
|
"navigateFlowchart": "Πλοήγηση σε ένα διάγραμμα ροής",
|
||||||
"curvedArrow": "Κυρτό βέλος",
|
"curvedArrow": "Κυρτό βέλος",
|
||||||
"curvedLine": "Κυρτή γραμμή",
|
"curvedLine": "Κυρτή γραμμή",
|
||||||
"documentation": "Εγχειρίδιο",
|
"documentation": "Εγχειρίδιο",
|
||||||
"doubleClick": "διπλό κλικ",
|
"doubleClick": "διπλό κλικ",
|
||||||
"drag": "σύρε",
|
"drag": "σύρε",
|
||||||
"editor": "Επεξεργαστής",
|
"editor": "Επεξεργαστής",
|
||||||
"editLineArrowPoints": "",
|
"editLineArrowPoints": "Επεξεργασία σημείων γραμμής/βέλους",
|
||||||
"editText": "",
|
"editText": "Επεξεργασία κειμένου / προσθήκη ετικέτας",
|
||||||
"github": "Βρήκατε πρόβλημα; Υποβάλετε το",
|
"github": "Βρήκατε πρόβλημα; Υποβάλετε το",
|
||||||
"howto": "Ακολουθήστε τους οδηγούς μας",
|
"howto": "Ακολουθήστε τους οδηγούς μας",
|
||||||
"or": "ή",
|
"or": "ή",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Ζουμ στην επιλογή",
|
"zoomToSelection": "Ζουμ στην επιλογή",
|
||||||
"toggleElementLock": "Κλείδωμα/Ξεκλείδωμα επιλογής",
|
"toggleElementLock": "Κλείδωμα/Ξεκλείδωμα επιλογής",
|
||||||
"movePageUpDown": "Μετακίνηση σελίδας πάνω/κάτω",
|
"movePageUpDown": "Μετακίνηση σελίδας πάνω/κάτω",
|
||||||
"movePageLeftRight": "Μετακίνηση σελίδας αριστερά/δεξιά"
|
"movePageLeftRight": "Μετακίνηση σελίδας αριστερά/δεξιά",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Καθαρισμός καμβά"
|
"title": "Καθαρισμός καμβά"
|
||||||
@@ -359,8 +445,8 @@
|
|||||||
"title": "Δημοσίευση βιβλιοθήκης",
|
"title": "Δημοσίευση βιβλιοθήκης",
|
||||||
"itemName": "Όνομα αντικειμένου",
|
"itemName": "Όνομα αντικειμένου",
|
||||||
"authorName": "Όνομα δημιουργού",
|
"authorName": "Όνομα δημιουργού",
|
||||||
"githubUsername": "GitHub username",
|
"githubUsername": "Όνομα χρήστη GitHub",
|
||||||
"twitterUsername": "Twitter username",
|
"twitterUsername": "Όνομα χρήστη Twitter",
|
||||||
"libraryName": "Όνομα βιβλιοθήκης",
|
"libraryName": "Όνομα βιβλιοθήκης",
|
||||||
"libraryDesc": "Περιγραφή βιβλιοθήκης",
|
"libraryDesc": "Περιγραφή βιβλιοθήκης",
|
||||||
"website": "Ιστοσελίδα",
|
"website": "Ιστοσελίδα",
|
||||||
@@ -392,27 +478,27 @@
|
|||||||
"removeItemsFromLib": "Αφαίρεση επιλεγμένων αντικειμένων από τη βιβλιοθήκη"
|
"removeItemsFromLib": "Αφαίρεση επιλεγμένων αντικειμένων από τη βιβλιοθήκη"
|
||||||
},
|
},
|
||||||
"imageExportDialog": {
|
"imageExportDialog": {
|
||||||
"header": "",
|
"header": "Εξαγωγή εικόνας",
|
||||||
"label": {
|
"label": {
|
||||||
"withBackground": "",
|
"withBackground": "Παρασκήνιο",
|
||||||
"onlySelected": "",
|
"onlySelected": "Μόνο τα επιλεγμένα",
|
||||||
"darkMode": "",
|
"darkMode": "Σκοτεινό θέμα",
|
||||||
"embedScene": "",
|
"embedScene": "Ενσωμάτωση σκηνής",
|
||||||
"scale": "",
|
"scale": "Κλιμάκωση",
|
||||||
"padding": ""
|
"padding": "Περιθώριο"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"embedScene": ""
|
"embedScene": "Τα δεδομένα σκηνής θα αποθηκευτούν στο αρχείο PNG/SVG προς εξαγωγή ώστε η σκηνή να είναι δυνατό να αποκατασταθεί από αυτό.\nΘα αυξήσει το μέγεθος του αρχείου προς εξαγωγή."
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"exportToPng": "",
|
"exportToPng": "Εξαγωγή σε PNG",
|
||||||
"exportToSvg": "",
|
"exportToSvg": "Εξαγωγή σε SVG",
|
||||||
"copyPngToClipboard": ""
|
"copyPngToClipboard": "Αντιγραφή PNG στο πρόχειρο"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"exportToPng": "",
|
"exportToPng": "PNG",
|
||||||
"exportToSvg": "",
|
"exportToSvg": "SVG",
|
||||||
"copyPngToClipboard": ""
|
"copyPngToClipboard": "Αντιγραφή στο πρόχειρο"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Γωνία",
|
"angle": "Γωνία",
|
||||||
"element": "Στοιχείο",
|
"shapes": "Σχήματα",
|
||||||
"elements": "Στοιχεία",
|
|
||||||
"height": "Ύψος",
|
"height": "Ύψος",
|
||||||
"scene": "Σκηνή",
|
"scene": "Σκηνή",
|
||||||
"selected": "Επιλεγμένα",
|
"selected": "Επιλεγμένα",
|
||||||
"storage": "Χώρος",
|
"storage": "Χώρος",
|
||||||
"title": "Στατιστικά για σπασίκλες",
|
"fullTitle": "Ιδιότητες Καμβά & Σχήματος",
|
||||||
|
"title": "Ιδιότητες",
|
||||||
|
"generalStats": "Γενικά",
|
||||||
|
"elementProperties": "Ιδιότητες σχήματος",
|
||||||
"total": "Σύνολο ",
|
"total": "Σύνολο ",
|
||||||
"version": "Έκδοση",
|
"version": "Έκδοση",
|
||||||
"versionCopy": "Κάνε κλικ για αντιγραφή",
|
"versionCopy": "Κάνε κλικ για αντιγραφή",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Αντιγράφηκαν στυλ.",
|
"copyStyles": "Αντιγράφηκαν στυλ.",
|
||||||
"copyToClipboard": "Αντιγράφηκε στο πρόχειρο.",
|
"copyToClipboard": "Αντιγράφηκε στο πρόχειρο.",
|
||||||
"copyToClipboardAsPng": "Αντιγράφηκε {{exportSelection}} στο πρόχειρο ως PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Αντιγράφηκε {{exportSelection}} στο πρόχειρο ως PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "Το αρχείο αποθηκεύτηκε.",
|
"fileSaved": "Το αρχείο αποθηκεύτηκε.",
|
||||||
"fileSavedToFilename": "Αποθηκεύτηκε στο {filename}",
|
"fileSavedToFilename": "Αποθηκεύτηκε στο {filename}",
|
||||||
"canvas": "καμβάς",
|
"canvas": "καμβάς",
|
||||||
"selection": "επιλογή",
|
"selection": "επιλογή",
|
||||||
"pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου",
|
"pasteAsSingleElement": "Χρησιμοποίησε το {{shortcut}} για να επικολλήσεις ως ένα μόνο στοιχείο,\nή να επικολλήσεις σε έναν υπάρχοντα επεξεργαστή κειμένου",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "Η ενσωμάτωση αυτού του url δεν επιτρέπεται αυτήν τη στιγμή. Θέστε ένα πρόβλημα στο GitHub για να ζητήσετε το url να είναι στη λίστα των επιτρεπόμενων.",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "Ο σύνδεσμος που ενσωματώσατε δεν ταιριάζει με την αναμενόμενη μορφή. Παρακαλώ προσπαθήστε να επικολλήσετε τη συμβολοσειρά 'embed' που παρέχεται από τον ιστότοπο προορισμού",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Διαφανές",
|
"transparent": "Διαφανές",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Πιο χρησιμοποιούμενα χρώματα",
|
"mostUsedCustomColors": "Πιο χρησιμοποιούμενα χρώματα",
|
||||||
"colors": "Χρώματα",
|
"colors": "Χρώματα",
|
||||||
"shades": "Αποχρώσεις",
|
"shades": "Αποχρώσεις",
|
||||||
@@ -487,39 +578,87 @@
|
|||||||
"overwriteConfirm": {
|
"overwriteConfirm": {
|
||||||
"action": {
|
"action": {
|
||||||
"exportToImage": {
|
"exportToImage": {
|
||||||
"title": "",
|
"title": "Εξαγωγή ως εικόνα",
|
||||||
"button": "",
|
"button": "Εξαγωγή ως εικόνα",
|
||||||
"description": ""
|
"description": "Εξαγωγή δεδομένων σκηνής σε ένα αρχείο από το οποίο μπορείτε να εισάγετε αργότερα."
|
||||||
},
|
},
|
||||||
"saveToDisk": {
|
"saveToDisk": {
|
||||||
"title": "",
|
"title": "Αποθήκευση στο δίσκο",
|
||||||
"button": "",
|
"button": "Αποθήκευση στο δίσκο",
|
||||||
"description": ""
|
"description": "Εξαγωγή δεδομένων σκηνής σε ένα αρχείο από το οποίο μπορείτε να εισάγετε αργότερα."
|
||||||
},
|
},
|
||||||
"excalidrawPlus": {
|
"excalidrawPlus": {
|
||||||
"title": "",
|
"title": "Excalidraw+",
|
||||||
"button": "",
|
"button": "Εξαγωγή σε Excalidraw+",
|
||||||
"description": ""
|
"description": "Αποθηκεύστε τη σκηνή στο χώρο εργασίας σας Excalidraw+."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"loadFromFile": {
|
"loadFromFile": {
|
||||||
"title": "",
|
"title": "Φόρτωση από αρχείο",
|
||||||
"button": "",
|
"button": "Φόρτωση από αρχείο",
|
||||||
"description": ""
|
"description": "Η φόρτωση από αρχείο θα <bold>αντικαταστήσει το υπάρχον περιεχόμενό σας</bold>.<br></br>Μπορείτε πρώτα να δημιουργήσετε αντίγραφα ασφαλείας του σχεδίου σας χρησιμοποιώντας μία από τις παρακάτω επιλογές."
|
||||||
},
|
},
|
||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "",
|
"title": "Φόρτωση από σύνδεσμο",
|
||||||
"button": "",
|
"button": "Αντικατάσταση του περιεχομένου μου",
|
||||||
"description": ""
|
"description": "Η φόρτωση εξωτερικού σχεδίου θα <bold>αντικαταστήσει το υπάρχον περιεχόμενο</bold>.<br></br>Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας του σχεδίου σας πρώτα χρησιμοποιώντας μία από τις παρακάτω επιλογές."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "Mermaid σε Excalidraw",
|
||||||
"button": "",
|
"button": "Εισαγωγή",
|
||||||
"description": "",
|
"description": "Επί του παρόντος υποστηρίζονται μόνο Διαγράμματα <flowchartLink>Ροής</flowchartLink>,<sequenceLink> Ακολουθίας, </sequenceLink> και <classLink>Κλάσεων</classLink>. Οι άλλοι τύποι θα αποδοθούν ως εικόνα στο Excalidraw.",
|
||||||
"syntax": "",
|
"syntax": "Σύνταξη Mermaid",
|
||||||
"preview": ""
|
"preview": "Προεπισκόπηση"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Γρήγορη αναζήτηση"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "παλιό"
|
||||||
|
},
|
||||||
|
"sceneFonts": "Σε αυτή τη σκηνή",
|
||||||
|
"availableFonts": "Διαθέσιμες γραμματοσειρές",
|
||||||
|
"empty": "Δεν βρέθηκαν γραμματοσειρές"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "Δεν βρέθηκαν χρήστες",
|
||||||
|
"hint": {
|
||||||
|
"text": "Κάντε κλικ στο χρήστη για να τον ακολουθήσετε",
|
||||||
|
"followStatus": "Ακολουθείτε αυτόν τον χρήστη",
|
||||||
|
"inCall": "Ο χρήστης βρίσκεται σε κλήση",
|
||||||
|
"micMuted": "Το μικρόφωνο του χρήστη είναι σε σίγαση",
|
||||||
|
"isSpeaking": "Ο χρήστης μιλάει"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Παλέτα Εντολών",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Επιλογή",
|
||||||
|
"confirm": "Επιβεβαίωση",
|
||||||
|
"close": "Κλείσιμο"
|
||||||
|
},
|
||||||
|
"recents": "Πρόσφατα χρησιμοποιημένα",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Αναζητήστε μενού, εντολές και ανακαλύψτε κρυμμένα διαμάντια",
|
||||||
|
"noMatch": "Δεν υπάρχουν εντολές που ταιριάζουν..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Η εντολή δεν είναι διαθέσιμη...",
|
||||||
|
"shortcutHint": "Για την παλέτα εντολών, χρησιμοποιήστε το {{shortcut}}"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,6 @@
|
|||||||
"strokeStyle_dotted": "Dotted",
|
"strokeStyle_dotted": "Dotted",
|
||||||
"sloppiness": "Sloppiness",
|
"sloppiness": "Sloppiness",
|
||||||
"opacity": "Opacity",
|
"opacity": "Opacity",
|
||||||
"strokeType": "Stroke Type",
|
|
||||||
"strokeWidthFixed": "Fixed width",
|
|
||||||
"strokeWidthVariable": "Variable width",
|
|
||||||
"textAlign": "Text align",
|
"textAlign": "Text align",
|
||||||
"edges": "Edges",
|
"edges": "Edges",
|
||||||
"sharp": "Sharp",
|
"sharp": "Sharp",
|
||||||
|
|||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Copiar estilos",
|
"copyStyles": "Copiar estilos",
|
||||||
"pasteStyles": "Pegar estilos",
|
"pasteStyles": "Pegar estilos",
|
||||||
"stroke": "Trazo",
|
"stroke": "Trazo",
|
||||||
|
"changeStroke": "Cambiar el color del trazo",
|
||||||
"background": "Fondo",
|
"background": "Fondo",
|
||||||
|
"changeBackground": "Cambiar el color de fondo",
|
||||||
"fill": "Rellenar",
|
"fill": "Rellenar",
|
||||||
"strokeWidth": "Grosor del trazo",
|
"strokeWidth": "Grosor del trazo",
|
||||||
"strokeStyle": "Estilo del trazo",
|
"strokeStyle": "Estilo del trazo",
|
||||||
@@ -44,6 +46,14 @@
|
|||||||
"arrowhead_triangle_outline": "Triángulo (contorno)",
|
"arrowhead_triangle_outline": "Triángulo (contorno)",
|
||||||
"arrowhead_diamond": "Diamante",
|
"arrowhead_diamond": "Diamante",
|
||||||
"arrowhead_diamond_outline": "Diamante (contorno)",
|
"arrowhead_diamond_outline": "Diamante (contorno)",
|
||||||
|
"arrowhead_crowfoot_many": "Pie de la corona (varios)",
|
||||||
|
"arrowhead_crowfoot_one": "Pie de la corona (uno)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "Pie de la corona (uno o varios)",
|
||||||
|
"more_options": "Más opciones",
|
||||||
|
"arrowtypes": "Tipo de flecha",
|
||||||
|
"arrowtype_sharp": "Flecha Afilada",
|
||||||
|
"arrowtype_round": "Flecha Curva",
|
||||||
|
"arrowtype_elbowed": "Flecha de codo",
|
||||||
"fontSize": "Tamaño de la fuente",
|
"fontSize": "Tamaño de la fuente",
|
||||||
"fontFamily": "Tipo de fuente",
|
"fontFamily": "Tipo de fuente",
|
||||||
"addWatermark": "Agregar \"Hecho con Excalidraw\"",
|
"addWatermark": "Agregar \"Hecho con Excalidraw\"",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Usado en lienzo",
|
"canvasColors": "Usado en lienzo",
|
||||||
"canvasBackground": "Fondo del lienzo",
|
"canvasBackground": "Fondo del lienzo",
|
||||||
"drawingCanvas": "Lienzo de dibujo",
|
"drawingCanvas": "Lienzo de dibujo",
|
||||||
|
"clearCanvas": "Lona transparente",
|
||||||
"layers": "Capas",
|
"layers": "Capas",
|
||||||
"actions": "Acciones",
|
"actions": "Acciones",
|
||||||
"language": "Idioma",
|
"language": "Idioma",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Agrupar selección",
|
"group": "Agrupar selección",
|
||||||
"ungroup": "Desagrupar selección",
|
"ungroup": "Desagrupar selección",
|
||||||
"collaborators": "Colaboradores",
|
"collaborators": "Colaboradores",
|
||||||
"showGrid": "Mostrar cuadrícula",
|
"toggleGrid": "Alternar rejilla",
|
||||||
"addToLibrary": "Añadir a la biblioteca",
|
"addToLibrary": "Añadir a la biblioteca",
|
||||||
"removeFromLibrary": "Eliminar de la biblioteca",
|
"removeFromLibrary": "Eliminar de la biblioteca",
|
||||||
"libraryLoadingMessage": "Cargando biblioteca…",
|
"libraryLoadingMessage": "Cargando biblioteca…",
|
||||||
"libraries": "Explorar bibliotecas",
|
"libraries": "Explorar bibliotecas",
|
||||||
"loadingScene": "Cargando escena…",
|
"loadingScene": "Cargando escena…",
|
||||||
|
"loadScene": "Cargar escena desde archivo",
|
||||||
"align": "Alinear",
|
"align": "Alinear",
|
||||||
"alignTop": "Alineación superior",
|
"alignTop": "Alineación superior",
|
||||||
"alignBottom": "Alineación inferior",
|
"alignBottom": "Alineación inferior",
|
||||||
@@ -105,7 +117,9 @@
|
|||||||
"share": "Compartir",
|
"share": "Compartir",
|
||||||
"showStroke": "Mostrar selector de color de trazo",
|
"showStroke": "Mostrar selector de color de trazo",
|
||||||
"showBackground": "Mostrar el selector de color de fondo",
|
"showBackground": "Mostrar el selector de color de fondo",
|
||||||
"toggleTheme": "Cambiar tema",
|
"showFonts": "Mostrar selector de fuentes",
|
||||||
|
"toggleTheme": "Cambiar tema claro/oscuro",
|
||||||
|
"theme": "Tema",
|
||||||
"personalLib": "Biblioteca personal",
|
"personalLib": "Biblioteca personal",
|
||||||
"excalidrawLib": "Biblioteca Excalidraw",
|
"excalidrawLib": "Biblioteca Excalidraw",
|
||||||
"decreaseFontSize": "Disminuir tamaño de letra",
|
"decreaseFontSize": "Disminuir tamaño de letra",
|
||||||
@@ -115,16 +129,21 @@
|
|||||||
"createContainerFromText": "Envolver el texto en un contenedor",
|
"createContainerFromText": "Envolver el texto en un contenedor",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Editar enlace",
|
"edit": "Editar enlace",
|
||||||
"editEmbed": "Editar enlace e incrustar",
|
"editEmbed": "Editar enlace incrustable",
|
||||||
"create": "Crear enlace",
|
"create": "Añadir enlace",
|
||||||
"createEmbed": "Crear enlace e incrustar",
|
|
||||||
"label": "Enlace",
|
"label": "Enlace",
|
||||||
"labelEmbed": "Enlazar e incrustar",
|
"labelEmbed": "Enlazar e incrustar",
|
||||||
"empty": "No se ha establecido un enlace"
|
"empty": "No se ha establecido un enlace",
|
||||||
|
"hint": "Escribe o pega tu enlace aquí",
|
||||||
|
"goToElement": "Ir al elemento objetivo"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Editar línea",
|
"edit": "Editar línea",
|
||||||
"exit": "Salir del editor en línea"
|
"editArrow": "Editar flecha"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Bloquear",
|
"lock": "Bloquear",
|
||||||
@@ -138,12 +157,46 @@
|
|||||||
"removeAllElementsFromFrame": "Eliminar todos los elementos del marco",
|
"removeAllElementsFromFrame": "Eliminar todos los elementos del marco",
|
||||||
"eyeDropper": "Seleccionar un color del lienzo",
|
"eyeDropper": "Seleccionar un color del lienzo",
|
||||||
"textToDiagram": "Texto a diagrama",
|
"textToDiagram": "Texto a diagrama",
|
||||||
"prompt": "Sugerencia"
|
"prompt": "Prompt",
|
||||||
|
"followUs": "Síguenos",
|
||||||
|
"discordChat": "Chat de Discord",
|
||||||
|
"zoomToFitViewport": "Zoom para encajar en la ventana",
|
||||||
|
"zoomToFitSelection": "Zoom para ajustar la selección",
|
||||||
|
"zoomToFit": "Zoom para mostrar todos los elementos",
|
||||||
|
"installPWA": "Instalar Excalidraw localmente (PWA)",
|
||||||
|
"autoResize": "Activar redimensionado automático de texto",
|
||||||
|
"imageCropping": "Recortar imagen",
|
||||||
|
"unCroppedDimension": "Dimensión no recortada",
|
||||||
|
"copyElementLink": "Copiar enlace al objeto",
|
||||||
|
"linkToElement": "Enlace al objeto",
|
||||||
|
"wrapSelectionInFrame": "Ajustar la selección en el marco",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "Enlace al objeto",
|
||||||
|
"desc": "Haga clic en una forma en lienzo o pegue un enlace.",
|
||||||
|
"notFound": "El objeto vinculado no se encontró en el lienzo."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "No hay elementos añadidos todavía...",
|
"noItems": "No hay elementos añadidos todavía...",
|
||||||
"hint_emptyLibrary": "Seleccione un elemento en el lienzo para añadirlo aquí, o instale una biblioteca del repositorio público, a continuación.",
|
"hint_emptyLibrary": "Seleccione un elemento en el lienzo para añadirlo aquí, o instale una biblioteca del repositorio público, a continuación.",
|
||||||
"hint_emptyPrivateLibrary": "Seleccione un elemento del lienzo para añadirlo aquí."
|
"hint_emptyPrivateLibrary": "Seleccione un elemento del lienzo para añadirlo aquí.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "Encontrar en lienzo",
|
||||||
|
"noMatch": "No hay coincidencias...",
|
||||||
|
"singleResult": "resultado",
|
||||||
|
"multipleResults": "resultados",
|
||||||
|
"placeholder": "Encontrar texto en lienzo...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Limpiar lienzo y reiniciar el color de fondo",
|
"clearReset": "Limpiar lienzo y reiniciar el color de fondo",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Exportar imagen...",
|
"exportImage": "Exportar imagen...",
|
||||||
"export": "Guardar en...",
|
"export": "Guardar en...",
|
||||||
"copyToClipboard": "Copiar al portapapeles",
|
"copyToClipboard": "Copiar al portapapeles",
|
||||||
|
"copyLink": "Copiar enlace",
|
||||||
"save": "Guardar en archivo actual",
|
"save": "Guardar en archivo actual",
|
||||||
"saveAs": "Guardar como",
|
"saveAs": "Guardar como",
|
||||||
"load": "Abrir",
|
"load": "Abrir",
|
||||||
@@ -171,14 +225,16 @@
|
|||||||
"fullScreen": "Pantalla completa",
|
"fullScreen": "Pantalla completa",
|
||||||
"darkMode": "Modo oscuro",
|
"darkMode": "Modo oscuro",
|
||||||
"lightMode": "Modo claro",
|
"lightMode": "Modo claro",
|
||||||
|
"systemMode": "Modo del sistema",
|
||||||
"zenMode": "Modo Zen",
|
"zenMode": "Modo Zen",
|
||||||
"objectsSnapMode": "Ajustar a los objetos",
|
"objectsSnapMode": "Ajustar a los objetos",
|
||||||
"exitZenMode": "Salir del modo Zen",
|
"exitZenMode": "Salir del modo Zen",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Borrar",
|
"clear": "Borrar",
|
||||||
"remove": "Eliminar",
|
"remove": "Eliminar",
|
||||||
"embed": "",
|
"embed": "Alternar incrustación",
|
||||||
"publishLibrary": "Publicar",
|
"publishLibrary": "",
|
||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"confirm": "Confirmar",
|
"confirm": "Confirmar",
|
||||||
"embeddableInteractionButton": "Pulsa para interactuar"
|
"embeddableInteractionButton": "Pulsa para interactuar"
|
||||||
@@ -204,7 +260,8 @@
|
|||||||
"resetLibrary": "Esto borrará tu biblioteca. ¿Estás seguro?",
|
"resetLibrary": "Esto borrará tu biblioteca. ¿Estás seguro?",
|
||||||
"removeItemsFromsLibrary": "¿Eliminar {{count}} elemento(s) de la biblioteca?",
|
"removeItemsFromsLibrary": "¿Eliminar {{count}} elemento(s) de la biblioteca?",
|
||||||
"invalidEncryptionKey": "La clave de cifrado debe tener 22 caracteres. La colaboración en vivo está deshabilitada.",
|
"invalidEncryptionKey": "La clave de cifrado debe tener 22 caracteres. La colaboración en vivo está deshabilitada.",
|
||||||
"collabOfflineWarning": "No hay conexión a internet disponible.\n¡No se guardarán los cambios!"
|
"collabOfflineWarning": "No hay conexión a internet disponible.\n¡No se guardarán los cambios!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Tipo de archivo no admitido.",
|
"unsupportedFileType": "Tipo de archivo no admitido.",
|
||||||
@@ -212,22 +269,22 @@
|
|||||||
"fileTooBig": "Archivo demasiado grande. El tamaño máximo permitido es {{maxSize}}.",
|
"fileTooBig": "Archivo demasiado grande. El tamaño máximo permitido es {{maxSize}}.",
|
||||||
"svgImageInsertError": "No se pudo insertar la imagen SVG. El código SVG parece inválido.",
|
"svgImageInsertError": "No se pudo insertar la imagen SVG. El código SVG parece inválido.",
|
||||||
"failedToFetchImage": "Error al obtener la imagen.",
|
"failedToFetchImage": "Error al obtener la imagen.",
|
||||||
"invalidSVGString": "SVG no válido.",
|
|
||||||
"cannotResolveCollabServer": "No se pudo conectar al servidor colaborador. Por favor, vuelva a cargar la página y vuelva a intentarlo.",
|
"cannotResolveCollabServer": "No se pudo conectar al servidor colaborador. Por favor, vuelva a cargar la página y vuelva a intentarlo.",
|
||||||
"importLibraryError": "No se pudo cargar la librería",
|
"importLibraryError": "No se pudo cargar la librería",
|
||||||
|
"saveLibraryError": "No se pudo guardar la biblioteca en el almacenamiento. Por favor, guarde su biblioteca en un archivo localmente para asegurarse de que no pierde los cambios.",
|
||||||
"collabSaveFailed": "No se pudo guardar en la base de datos del backend. Si los problemas persisten, debería guardar su archivo localmente para asegurarse de que no pierde su trabajo.",
|
"collabSaveFailed": "No se pudo guardar en la base de datos del backend. Si los problemas persisten, debería guardar su archivo localmente para asegurarse de que no pierde su trabajo.",
|
||||||
"collabSaveFailed_sizeExceeded": "No se pudo guardar en la base de datos del backend, el lienzo parece ser demasiado grande. Debería guardar el archivo localmente para asegurarse de que no pierde su trabajo.",
|
"collabSaveFailed_sizeExceeded": "No se pudo guardar en la base de datos del backend, el lienzo parece ser demasiado grande. Debería guardar el archivo localmente para asegurarse de que no pierde su trabajo.",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "Las imágenes están desactivadas.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "Parece que estás usando el navegador Brave con el ajuste <bold>Forzar el bloqueo de huellas digitales</bold> habilitado.",
|
"line1": "Parece que estás usando el navegador Brave con el ajuste <bold>Forzar el bloqueo de huellas digitales</bold> habilitado.",
|
||||||
"line2": "Esto podría resultar en errores en los <bold>Elementos de Texto</bold> en tus dibujos.",
|
"line2": "Esto podría resultar en errores en los <bold>Elementos de Texto</bold> en tus dibujos.",
|
||||||
"line3": "Recomendamos fuertemente deshabilitar esta configuración. Puedes seguir <link>estos pasos</link> sobre cómo hacerlo.",
|
"line3": "Recomendamos fuertemente deshabilitar esta configuración. Puedes seguir <link>estos pasos</link> sobre cómo hacerlo.",
|
||||||
"line4": ""
|
"line4": "Si deshabilitar esta opción no arregla la visualización de elementos conformados por texto, por favor abre un <issueLink>problema</issueLink> en nuestro GitHub o escríbanos en <discordLink>Discord</discordLink>"
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "",
|
"embeddable": "Los elementos incrustables no pueden ser añadidos a la biblioteca.",
|
||||||
"iframe": "Los elementos IFrame no se pueden agregar a la biblioteca.",
|
"iframe": "Los elementos IFrame no se pueden agregar a la biblioteca.",
|
||||||
"image": ""
|
"image": "¡Soporte para añadir imágenes a la biblioteca muy pronto!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "No se pudo pegar (no se pudo leer desde el portapapeles del sistema).",
|
"asyncPasteFailedOnRead": "No se pudo pegar (no se pudo leer desde el portapapeles del sistema).",
|
||||||
"asyncPasteFailedOnParse": "No se pudo pegar.",
|
"asyncPasteFailedOnParse": "No se pudo pegar.",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Selección",
|
"selection": "Selección",
|
||||||
|
"lasso": "",
|
||||||
"image": "Insertar imagen",
|
"image": "Insertar imagen",
|
||||||
"rectangle": "Rectángulo",
|
"rectangle": "Rectángulo",
|
||||||
"diamond": "Diamante",
|
"diamond": "Diamante",
|
||||||
@@ -248,14 +306,30 @@
|
|||||||
"penMode": "Modo Lápiz - previene toque",
|
"penMode": "Modo Lápiz - previene toque",
|
||||||
"link": "Añadir/Actualizar enlace para una forma seleccionada",
|
"link": "Añadir/Actualizar enlace para una forma seleccionada",
|
||||||
"eraser": "Borrar",
|
"eraser": "Borrar",
|
||||||
"frame": "",
|
"frame": "Herramienta Estructura",
|
||||||
"magicframe": "Esquema a código",
|
"magicframe": "Esquema a código",
|
||||||
"embeddable": "Incrustar Web",
|
"embeddable": "Incrustar Web",
|
||||||
"laser": "Puntero láser",
|
"laser": "Puntero láser",
|
||||||
"hand": "Mano (herramienta de panoramización)",
|
"hand": "Mano (herramienta de panoramización)",
|
||||||
"extraTools": "Más herramientas",
|
"extraTools": "Más herramientas",
|
||||||
"mermaidToExcalidraw": "Mermaid a Excalidraw",
|
"mermaidToExcalidraw": "Mermaid a Excalidraw",
|
||||||
"magicSettings": "Ajustes AI"
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "Rectángulo",
|
||||||
|
"diamond": "Rombo",
|
||||||
|
"ellipse": "Elipse",
|
||||||
|
"arrow": "Flecha",
|
||||||
|
"line": "Línea",
|
||||||
|
"freedraw": "Dibujar a mano",
|
||||||
|
"text": "Texto",
|
||||||
|
"image": "Imagen",
|
||||||
|
"group": "Grupo",
|
||||||
|
"frame": "Marco",
|
||||||
|
"magicframe": "Esquema a código",
|
||||||
|
"embeddable": "Incrustar Web",
|
||||||
|
"selection": "Selección",
|
||||||
|
"iframe": "IFrame"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Acciones del lienzo",
|
"canvasActions": "Acciones del lienzo",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Formas"
|
"shapes": "Formas"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Para mover el lienzo, mantenga la rueda del ratón o la barra espaciadora mientras arrastra o utilice la herramienta de mano",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea",
|
"linearElement": "Haz clic para dibujar múltiples puntos, arrastrar para solo una línea",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Haz clic y arrastra, suelta al terminar",
|
"freeDraw": "Haz clic y arrastra, suelta al terminar",
|
||||||
"text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección",
|
"text": "Consejo: también puedes añadir texto haciendo doble clic en cualquier lugar con la herramienta de selección",
|
||||||
"embeddable": "Haga clic y arrastre para crear un sitio web incrustado",
|
"embeddable": "Haga clic y arrastre para crear un sitio web incrustado",
|
||||||
"text_selected": "Doble clic o pulse ENTER para editar el texto",
|
"text_selected": "",
|
||||||
"text_editing": "Pulse Escape o Ctrl/Cmd + ENTER para terminar de editar",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Haz clic en el último punto o presiona Escape o Enter para finalizar",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "Puedes restringir el ángulo manteniendo presionado el botón SHIFT",
|
"lockAngle": "",
|
||||||
"resize": "Para mantener las proporciones mantén SHIFT presionado mientras modificas el tamaño, \nmantén presionado ALT para modificar el tamaño desde el centro",
|
"resize": "",
|
||||||
"resizeImage": "Puede redimensionar libremente pulsando SHIFT,\npulse ALT para redimensionar desde el centro",
|
"resizeImage": "",
|
||||||
"rotate": "Puedes restringir los ángulos manteniendo presionado SHIFT mientras giras",
|
"rotate": "",
|
||||||
"lineEditor_info": "Mantenga pulsado CtrlOrCmd y haga doble click o presione CtrlOrCmd + Enter para editar puntos",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Presione Suprimir para eliminar el/los punto(s), CtrlOrCmd+D para duplicarlo, o arrástrelo para moverlo",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "Seleccione un punto a editar (mantenga MAYÚSCULAS para seleccionar múltiples),\no mantenga pulsado Alt y haga click para añadir nuevos puntos",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Haga clic para colocar la imagen o haga click y arrastre para establecer su tamaño manualmente",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Publica tu propia biblioteca",
|
"publishLibrary": "Publica tu propia biblioteca",
|
||||||
"bindTextToElement": "Presione Entrar para agregar",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Mantén CtrlOrCmd para seleccionar en profundidad, y para evitar arrastrar",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Mantenga pulsado Alt para revertir los elementos marcados para su eliminación",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\".",
|
"firefox_clipboard_write": "Esta característica puede ser habilitada estableciendo la bandera \"dom.events.asyncClipboard.clipboardItem\" a \"true\". Para cambiar las banderas del navegador en Firefox, visite la página \"about:config\".",
|
||||||
"disableSnapping": "Mantén pulsado CtrlOrCmd para desactivar el ajuste"
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "No se puede mostrar la vista previa",
|
"cannotShowPreview": "No se puede mostrar la vista previa",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Fuimos muy cautelosos de no incluir la información de tu escena en el error. Si tu escena no es privada, por favor considera seguir nuestro <button>rastreador de errores.</button> Por favor, incluya la siguiente información copiándola y pegándola en el issue de GitHub.",
|
"openIssueMessage": "Fuimos muy cautelosos de no incluir la información de tu escena en el error. Si tu escena no es privada, por favor considera seguir nuestro <button>rastreador de errores.</button> Por favor, incluya la siguiente información copiándola y pegándola en el issue de GitHub.",
|
||||||
"sceneContent": "Contenido de la escena:"
|
"sceneContent": "Contenido de la escena:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "O"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Puede invitar a otras personas a tu actual escena para que colaboren contigo.",
|
"desc_intro": "Invita a gente a colaborar en tu dibujo.",
|
||||||
"desc_privacy": "No te preocupes, la sesión usa encriptación de punta a punta, por lo que todo lo que se dibuje se mantendrá privadamente. Ni siquiera nuestro servidor podrá ver lo que haces.",
|
"desc_privacy": "No te preocupes, la sesión está encriptada de extremo a extremo y es totalmente privada. Ni siquiera nuestro servidor puede ver lo que dibujas.",
|
||||||
"button_startSession": "Iniciar sesión",
|
"button_startSession": "Iniciar sesión",
|
||||||
"button_stopSession": "Detener sesión",
|
"button_stopSession": "Detener sesión",
|
||||||
"desc_inProgressIntro": "La sesión de colaboración en vivo está ahora en progreso.",
|
"desc_inProgressIntro": "La sesión de colaboración en vivo está ahora en progreso.",
|
||||||
@@ -325,9 +407,11 @@
|
|||||||
},
|
},
|
||||||
"helpDialog": {
|
"helpDialog": {
|
||||||
"blog": "Lea nuestro blog",
|
"blog": "Lea nuestro blog",
|
||||||
"click": "click",
|
"click": "clic",
|
||||||
"deepSelect": "Selección profunda",
|
"deepSelect": "Selección profunda",
|
||||||
"deepBoxSelect": "Seleccione en profundidad dentro de la caja, y evite arrastrar",
|
"deepBoxSelect": "Seleccione en profundidad dentro de la caja, y evite arrastrar",
|
||||||
|
"createFlowchart": "Crear un diagrama de flujo a partir de un elemento genérico",
|
||||||
|
"navigateFlowchart": "Navegar un diagrama de flujo",
|
||||||
"curvedArrow": "Flecha curva",
|
"curvedArrow": "Flecha curva",
|
||||||
"curvedLine": "Línea curva",
|
"curvedLine": "Línea curva",
|
||||||
"documentation": "Documentación",
|
"documentation": "Documentación",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Ampliar selección",
|
"zoomToSelection": "Ampliar selección",
|
||||||
"toggleElementLock": "Bloquear/desbloquear selección",
|
"toggleElementLock": "Bloquear/desbloquear selección",
|
||||||
"movePageUpDown": "Mover página hacia arriba/abajo",
|
"movePageUpDown": "Mover página hacia arriba/abajo",
|
||||||
"movePageLeftRight": "Mover página hacia la izquierda/derecha"
|
"movePageLeftRight": "Mover página hacia la izquierda/derecha",
|
||||||
|
"cropStart": "Recortar imagen",
|
||||||
|
"cropFinish": "Terminar recorte de imagen"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Borrar lienzo"
|
"title": "Borrar lienzo"
|
||||||
@@ -402,7 +488,7 @@
|
|||||||
"padding": "Espaciado"
|
"padding": "Espaciado"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"embedScene": ""
|
"embedScene": "Los datos de la escena se guardarán en el archivo PNG/SVG exportado, así la escena puede ser restaurada desde la misma. Esto acción aumentará el tamaño del archivo exportado."
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"exportToPng": "Exportar a PNG",
|
"exportToPng": "Exportar a PNG",
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Ángulo",
|
"angle": "Ángulo",
|
||||||
"element": "Elemento",
|
"shapes": "Formas",
|
||||||
"elements": "Elementos",
|
|
||||||
"height": "Alto",
|
"height": "Alto",
|
||||||
"scene": "Escena",
|
"scene": "Escena",
|
||||||
"selected": "Seleccionado",
|
"selected": "Seleccionado",
|
||||||
"storage": "Almacenamiento",
|
"storage": "Almacenamiento",
|
||||||
"title": "Estadísticas para nerds",
|
"fullTitle": "Propiedades del Lienzo y Forma",
|
||||||
|
"title": "Propiedades",
|
||||||
|
"generalStats": "General",
|
||||||
|
"elementProperties": "Propiedades de forma",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"version": "Versión",
|
"version": "Versión",
|
||||||
"versionCopy": "Click para copiar",
|
"versionCopy": "Click para copiar",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Estilos copiados.",
|
"copyStyles": "Estilos copiados.",
|
||||||
"copyToClipboard": "Copiado en el portapapeles.",
|
"copyToClipboard": "Copiado en el portapapeles.",
|
||||||
"copyToClipboardAsPng": "Copiado {{exportSelection}} al portapapeles como PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "Copiado {{exportSelection}} al portapapeles como PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "Copiado {{exportSelection}} al portapapeles como PNG\n({{exportColorScheme}})",
|
||||||
"fileSaved": "Archivo guardado.",
|
"fileSaved": "Archivo guardado.",
|
||||||
"fileSavedToFilename": "Guardado en {filename}",
|
"fileSavedToFilename": "Guardado en {filename}",
|
||||||
"canvas": "lienzo",
|
"canvas": "lienzo",
|
||||||
"selection": "selección",
|
"selection": "selección",
|
||||||
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente",
|
"pasteAsSingleElement": "Usa {{shortcut}} para pegar como un solo elemento,\no pegar en un editor de texto existente",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "Incorporar esta url no está permitido actualmente. Señale esta incidencia en nuestro GitHub para solicitar que esta url esté entre las permitidas",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "El enlace que incrustó no coincide con el formato esperado. Por favor intente pegar la cadena 'embed' proporcionada por el sitio de origen",
|
||||||
|
"elementLinkCopied": "Enlace copiado al portapapeles"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Transparente",
|
"transparent": "Transparente",
|
||||||
@@ -478,18 +568,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Colores personalizados más utilizados",
|
"mostUsedCustomColors": "Colores personalizados más utilizados",
|
||||||
"colors": "Colores",
|
"colors": "Colores",
|
||||||
"shades": "",
|
"shades": "Sombras",
|
||||||
"hexCode": "Código Hexadecimal",
|
"hexCode": "Código Hexadecimal",
|
||||||
"noShades": ""
|
"noShades": "No hay sombras disponibles para este color"
|
||||||
},
|
},
|
||||||
"overwriteConfirm": {
|
"overwriteConfirm": {
|
||||||
"action": {
|
"action": {
|
||||||
"exportToImage": {
|
"exportToImage": {
|
||||||
"title": "Exportar como imagen",
|
"title": "Exportar como imagen",
|
||||||
"button": "Exportar como imagen",
|
"button": "Exportar como imagen",
|
||||||
"description": ""
|
"description": "Exporta los datos de la escena como una imagen desde el cual podrás importarlo más tarde."
|
||||||
},
|
},
|
||||||
"saveToDisk": {
|
"saveToDisk": {
|
||||||
"title": "Guardar en el disco",
|
"title": "Guardar en el disco",
|
||||||
@@ -497,16 +588,16 @@
|
|||||||
"description": "Exporta los datos de la escena a un archivo desde el cual podrás importar más tarde."
|
"description": "Exporta los datos de la escena a un archivo desde el cual podrás importar más tarde."
|
||||||
},
|
},
|
||||||
"excalidrawPlus": {
|
"excalidrawPlus": {
|
||||||
"title": "",
|
"title": "Excalidraw+",
|
||||||
"button": "Exportar a Excalidraw+",
|
"button": "Exportar a Excalidraw+",
|
||||||
"description": ""
|
"description": "Guarda la escena en su espacio de trabajo de Excalidraw+."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"loadFromFile": {
|
"loadFromFile": {
|
||||||
"title": "Cargar desde un archivo",
|
"title": "Cargar desde un archivo",
|
||||||
"button": "Cargar desde un archivo",
|
"button": "Cargar desde un archivo",
|
||||||
"description": ""
|
"description": "Cargando desde un archivo <bold>reemplazará tu contenido actual</bold> <br></br>Puedes primero hacer una copia de seguridad usando una de las siguientes opciones."
|
||||||
},
|
},
|
||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "Cargar desde un enlace",
|
"title": "Cargar desde un enlace",
|
||||||
@@ -518,8 +609,56 @@
|
|||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "Mermaid a Excalidraw",
|
"title": "Mermaid a Excalidraw",
|
||||||
"button": "Insertar",
|
"button": "Insertar",
|
||||||
"description": "Actualmente sólo <flowchartLink>Flowchart</flowchartLink>,<sequenceLink> Secuencia, </sequenceLink> y <classLink>Class </classLink>Diagramas son soportados. Los otros tipos se renderizarán como imagen en Excalidraw.",
|
"description": "Actualmente sólo estos tipos de <flowchartLink>diagrama de flujo</flowchartLink>,<sequenceLink> Secuencia, </sequenceLink> y <classLink>Clase </classLink> son soportados. Los otros tipos de diagramas se renderizarán como imagen en Excalidraw.",
|
||||||
"syntax": "Sintaxis Mermaid",
|
"syntax": "Sintaxis Mermaid",
|
||||||
"preview": "Vista previa"
|
"preview": "Vista previa"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "Búsqueda rápida"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "viejo"
|
||||||
|
},
|
||||||
|
"sceneFonts": "En esta escena",
|
||||||
|
"availableFonts": "Fuentes disponibles",
|
||||||
|
"empty": "No se han encontrado fuentes"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "No se han encontrado usuarios",
|
||||||
|
"hint": {
|
||||||
|
"text": "Haga clic en el usuario para seguir",
|
||||||
|
"followStatus": "Ya estás siguiendo a este usuario",
|
||||||
|
"inCall": "El usuario está en una llamada de voz",
|
||||||
|
"micMuted": "El micrófono del usuario está silenciado",
|
||||||
|
"isSpeaking": "El usuario está hablando"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "Paleta de comandos",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "Seleccionar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"close": "Cerrar"
|
||||||
|
},
|
||||||
|
"recents": "Usado recientemente",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Busca menús, comandos y descubre gemas ocultas",
|
||||||
|
"noMatch": "No hay comandos coincidentes..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "Comando no disponible...",
|
||||||
|
"shortcutHint": "Para la paleta de comandos, utilice {{shortcut}}"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"copyAsPng": "Kopiatu arbelera PNG gisa",
|
"copyAsPng": "Kopiatu arbelera PNG gisa",
|
||||||
"copyAsSvg": "Kopiatu arbelera SVG gisa",
|
"copyAsSvg": "Kopiatu arbelera SVG gisa",
|
||||||
"copyText": "Kopiatu arbelera testu gisa",
|
"copyText": "Kopiatu arbelera testu gisa",
|
||||||
"copySource": "Kopiatu iturria arbelean",
|
"copySource": "Kopiatu jatorria arbelean",
|
||||||
"convertToCode": "Bihurtu kodea",
|
"convertToCode": "Kodera bihurtu",
|
||||||
"bringForward": "Ekarri aurrerago",
|
"bringForward": "Ekarri aurrerago",
|
||||||
"sendToBack": "Eraman atzera",
|
"sendToBack": "Eraman atzera",
|
||||||
"bringToFront": "Ekarri aurrera",
|
"bringToFront": "Ekarri aurrera",
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"copyStyles": "Kopiatu estiloak",
|
"copyStyles": "Kopiatu estiloak",
|
||||||
"pasteStyles": "Itsatsi estiloak",
|
"pasteStyles": "Itsatsi estiloak",
|
||||||
"stroke": "Marra",
|
"stroke": "Marra",
|
||||||
|
"changeStroke": "Marraren kolorea aldatu",
|
||||||
"background": "Atzeko planoa",
|
"background": "Atzeko planoa",
|
||||||
|
"changeBackground": "Atzealdeko kolorea aldatu",
|
||||||
"fill": "Bete",
|
"fill": "Bete",
|
||||||
"strokeWidth": "Marraren zabalera",
|
"strokeWidth": "Marraren zabalera",
|
||||||
"strokeStyle": "Marraren estiloa",
|
"strokeStyle": "Marraren estiloa",
|
||||||
@@ -38,12 +40,20 @@
|
|||||||
"arrowhead_none": "Bat ere ez",
|
"arrowhead_none": "Bat ere ez",
|
||||||
"arrowhead_arrow": "Gezia",
|
"arrowhead_arrow": "Gezia",
|
||||||
"arrowhead_bar": "Barra",
|
"arrowhead_bar": "Barra",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "Zirkulua",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "Zirkulua (eskema)",
|
||||||
"arrowhead_triangle": "Hirukia",
|
"arrowhead_triangle": "Hirukia",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "Triangelua (eskema)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "Erromboa",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "Erromboa (eskema)",
|
||||||
|
"arrowhead_crowfoot_many": "",
|
||||||
|
"arrowhead_crowfoot_one": "",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "",
|
||||||
|
"more_options": "",
|
||||||
|
"arrowtypes": "",
|
||||||
|
"arrowtype_sharp": "",
|
||||||
|
"arrowtype_round": "",
|
||||||
|
"arrowtype_elbowed": "",
|
||||||
"fontSize": "Letra-tamaina",
|
"fontSize": "Letra-tamaina",
|
||||||
"fontFamily": "Letra-tipoa",
|
"fontFamily": "Letra-tipoa",
|
||||||
"addWatermark": "Gehitu \"Excalidraw bidez egina\"",
|
"addWatermark": "Gehitu \"Excalidraw bidez egina\"",
|
||||||
@@ -72,6 +82,7 @@
|
|||||||
"canvasColors": "Oihalean erabilita",
|
"canvasColors": "Oihalean erabilita",
|
||||||
"canvasBackground": "Oihalaren atzeko planoa",
|
"canvasBackground": "Oihalaren atzeko planoa",
|
||||||
"drawingCanvas": "Marrazteko oihala",
|
"drawingCanvas": "Marrazteko oihala",
|
||||||
|
"clearCanvas": "Garbitu",
|
||||||
"layers": "Geruzak",
|
"layers": "Geruzak",
|
||||||
"actions": "Ekintzak",
|
"actions": "Ekintzak",
|
||||||
"language": "Hizkuntza",
|
"language": "Hizkuntza",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "Hautapena taldea bihurtu",
|
"group": "Hautapena taldea bihurtu",
|
||||||
"ungroup": "Desegin hautapenaren taldea",
|
"ungroup": "Desegin hautapenaren taldea",
|
||||||
"collaborators": "Kolaboratzaileak",
|
"collaborators": "Kolaboratzaileak",
|
||||||
"showGrid": "Erakutsi sareta",
|
"toggleGrid": "Txandakatu sareta",
|
||||||
"addToLibrary": "Gehitu liburutegira",
|
"addToLibrary": "Gehitu liburutegira",
|
||||||
"removeFromLibrary": "Kendu liburutegitik",
|
"removeFromLibrary": "Kendu liburutegitik",
|
||||||
"libraryLoadingMessage": "Liburutegia kargatzen…",
|
"libraryLoadingMessage": "Liburutegia kargatzen…",
|
||||||
"libraries": "Arakatu liburutegiak",
|
"libraries": "Arakatu liburutegiak",
|
||||||
"loadingScene": "Eszena kargatzen…",
|
"loadingScene": "Eszena kargatzen…",
|
||||||
|
"loadScene": "Fitxategitik kargatu",
|
||||||
"align": "Lerrokatu",
|
"align": "Lerrokatu",
|
||||||
"alignTop": "Lerrokatu goian",
|
"alignTop": "Lerrokatu goian",
|
||||||
"alignBottom": "Lerrokatu behean",
|
"alignBottom": "Lerrokatu behean",
|
||||||
@@ -105,7 +117,9 @@
|
|||||||
"share": "Partekatu",
|
"share": "Partekatu",
|
||||||
"showStroke": "Erakutsi marraren kolore-hautatzailea",
|
"showStroke": "Erakutsi marraren kolore-hautatzailea",
|
||||||
"showBackground": "Erakutsi atzeko planoaren kolore-hautatzailea",
|
"showBackground": "Erakutsi atzeko planoaren kolore-hautatzailea",
|
||||||
"toggleTheme": "Aldatu gaia",
|
"showFonts": "",
|
||||||
|
"toggleTheme": "Gaia argia/iluna aktibatu",
|
||||||
|
"theme": "Itxura",
|
||||||
"personalLib": "Liburutegi pertsonala",
|
"personalLib": "Liburutegi pertsonala",
|
||||||
"excalidrawLib": "Excalidraw liburutegia",
|
"excalidrawLib": "Excalidraw liburutegia",
|
||||||
"decreaseFontSize": "Txikitu letra tamaina",
|
"decreaseFontSize": "Txikitu letra tamaina",
|
||||||
@@ -115,16 +129,21 @@
|
|||||||
"createContainerFromText": "Bilatu testua edukiontzi batean",
|
"createContainerFromText": "Bilatu testua edukiontzi batean",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "Editatu esteka",
|
"edit": "Editatu esteka",
|
||||||
"editEmbed": "Editatu esteka eta kapsulatu",
|
"editEmbed": "",
|
||||||
"create": "Sortu esteka",
|
"create": "",
|
||||||
"createEmbed": "Sortu esteka eta kapsulatu",
|
|
||||||
"label": "Esteka",
|
"label": "Esteka",
|
||||||
"labelEmbed": "Esteka eta kapsula",
|
"labelEmbed": "Esteka eta kapsula",
|
||||||
"empty": "Ez da estekarik ezarri"
|
"empty": "Ez da estekarik ezarri",
|
||||||
|
"hint": "",
|
||||||
|
"goToElement": ""
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "Editatu lerroa",
|
"edit": "Editatu lerroa",
|
||||||
"exit": "Irten lerro-editoretik"
|
"editArrow": "Gezia aldatu"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "Blokeatu",
|
"lock": "Blokeatu",
|
||||||
@@ -138,12 +157,46 @@
|
|||||||
"removeAllElementsFromFrame": "Kendu markoko elementu guztiak",
|
"removeAllElementsFromFrame": "Kendu markoko elementu guztiak",
|
||||||
"eyeDropper": "Aukeratu kolorea oihaletik",
|
"eyeDropper": "Aukeratu kolorea oihaletik",
|
||||||
"textToDiagram": "Testutik diagramara",
|
"textToDiagram": "Testutik diagramara",
|
||||||
"prompt": ""
|
"prompt": "Galdetu",
|
||||||
|
"followUs": "Jarraitu gaitzazu",
|
||||||
|
"discordChat": "Discord txata",
|
||||||
|
"zoomToFitViewport": "Zoom ikuspegira",
|
||||||
|
"zoomToFitSelection": "Zoom hautapenera",
|
||||||
|
"zoomToFit": "Egin zoom elementu guztiak ikusteko",
|
||||||
|
"installPWA": "Instalatu Excalidraw lokalean (PWA)",
|
||||||
|
"autoResize": "Textu zabalera automatikoa aktibatu",
|
||||||
|
"imageCropping": "",
|
||||||
|
"unCroppedDimension": "",
|
||||||
|
"copyElementLink": "",
|
||||||
|
"linkToElement": "",
|
||||||
|
"wrapSelectionInFrame": "",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "",
|
||||||
|
"desc": "",
|
||||||
|
"notFound": ""
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "Oraindik ez da elementurik gehitu...",
|
"noItems": "Oraindik ez da elementurik gehitu...",
|
||||||
"hint_emptyLibrary": "Hautatu oihaleko elementu bat hemen gehitzeko, edo instalatu liburutegi bat beheko biltegi publikotik.",
|
"hint_emptyLibrary": "Hautatu oihaleko elementu bat hemen gehitzeko, edo instalatu liburutegi bat beheko biltegi publikotik.",
|
||||||
"hint_emptyPrivateLibrary": "Hautatu oihaleko elementu bat hemen gehitzeko."
|
"hint_emptyPrivateLibrary": "Hautatu oihaleko elementu bat hemen gehitzeko.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "",
|
||||||
|
"noMatch": "",
|
||||||
|
"singleResult": "",
|
||||||
|
"multipleResults": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "Garbitu oihala",
|
"clearReset": "Garbitu oihala",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "Esportatu irudia...",
|
"exportImage": "Esportatu irudia...",
|
||||||
"export": "Gorde hemen...",
|
"export": "Gorde hemen...",
|
||||||
"copyToClipboard": "Kopiatu arbelera",
|
"copyToClipboard": "Kopiatu arbelera",
|
||||||
|
"copyLink": "",
|
||||||
"save": "Gorde uneko fitxategian",
|
"save": "Gorde uneko fitxategian",
|
||||||
"saveAs": "Gorde honela",
|
"saveAs": "Gorde honela",
|
||||||
"load": "Ireki",
|
"load": "Ireki",
|
||||||
@@ -171,14 +225,16 @@
|
|||||||
"fullScreen": "Pantaila osoa",
|
"fullScreen": "Pantaila osoa",
|
||||||
"darkMode": "Modu iluna",
|
"darkMode": "Modu iluna",
|
||||||
"lightMode": "Modu argia",
|
"lightMode": "Modu argia",
|
||||||
|
"systemMode": "",
|
||||||
"zenMode": "Zen modua",
|
"zenMode": "Zen modua",
|
||||||
"objectsSnapMode": "Atxiki objektuei",
|
"objectsSnapMode": "Atxiki objektuei",
|
||||||
"exitZenMode": "Irten Zen modutik",
|
"exitZenMode": "Irten Zen modutik",
|
||||||
"cancel": "Utzi",
|
"cancel": "Utzi",
|
||||||
|
"saveLibNames": "",
|
||||||
"clear": "Garbitu",
|
"clear": "Garbitu",
|
||||||
"remove": "Kendu",
|
"remove": "Kendu",
|
||||||
"embed": "Aldatu kapsulatzea",
|
"embed": "Aldatu kapsulatzea",
|
||||||
"publishLibrary": "Argitaratu",
|
"publishLibrary": "",
|
||||||
"submit": "Bidali",
|
"submit": "Bidali",
|
||||||
"confirm": "Bai",
|
"confirm": "Bai",
|
||||||
"embeddableInteractionButton": "Egin klik elkar eragiteko"
|
"embeddableInteractionButton": "Egin klik elkar eragiteko"
|
||||||
@@ -204,7 +260,8 @@
|
|||||||
"resetLibrary": "Honek zure liburutegia garbituko du. Ziur zaude?",
|
"resetLibrary": "Honek zure liburutegia garbituko du. Ziur zaude?",
|
||||||
"removeItemsFromsLibrary": "Liburutegitik {{count}} elementu ezabatu?",
|
"removeItemsFromsLibrary": "Liburutegitik {{count}} elementu ezabatu?",
|
||||||
"invalidEncryptionKey": "Enkriptazio-gakoak 22 karaktere izan behar ditu. Zuzeneko lankidetza desgaituta dago.",
|
"invalidEncryptionKey": "Enkriptazio-gakoak 22 karaktere izan behar ditu. Zuzeneko lankidetza desgaituta dago.",
|
||||||
"collabOfflineWarning": "Ez dago Interneteko konexiorik.\nZure aldaketak ez dira gordeko!"
|
"collabOfflineWarning": "Ez dago Interneteko konexiorik.\nZure aldaketak ez dira gordeko!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "Onartu gabeko fitxategi mota.",
|
"unsupportedFileType": "Onartu gabeko fitxategi mota.",
|
||||||
@@ -212,12 +269,12 @@
|
|||||||
"fileTooBig": "Fitxategia handiegia da. Onartutako gehienezko tamaina {{maxSize}} da.",
|
"fileTooBig": "Fitxategia handiegia da. Onartutako gehienezko tamaina {{maxSize}} da.",
|
||||||
"svgImageInsertError": "Ezin izan da SVG irudia txertatu. SVG markak baliogabea dirudi.",
|
"svgImageInsertError": "Ezin izan da SVG irudia txertatu. SVG markak baliogabea dirudi.",
|
||||||
"failedToFetchImage": "Ezin izan da irudia eskuratu.",
|
"failedToFetchImage": "Ezin izan da irudia eskuratu.",
|
||||||
"invalidSVGString": "SVG baliogabea.",
|
|
||||||
"cannotResolveCollabServer": "Ezin izan da elkarlaneko zerbitzarira konektatu. Mesedez, berriro kargatu orria eta saiatu berriro.",
|
"cannotResolveCollabServer": "Ezin izan da elkarlaneko zerbitzarira konektatu. Mesedez, berriro kargatu orria eta saiatu berriro.",
|
||||||
"importLibraryError": "Ezin izan da liburutegia kargatu",
|
"importLibraryError": "Ezin izan da liburutegia kargatu",
|
||||||
|
"saveLibraryError": "Ezin izan da liburutegian gorde. Mesedez, gorde fitxategi lokal batetara aldaketarik ez galtzeko.",
|
||||||
"collabSaveFailed": "Ezin izan da backend datu-basean gorde. Arazoak jarraitzen badu, zure fitxategia lokalean gorde beharko zenuke zure lana ez duzula galtzen ziurtatzeko.",
|
"collabSaveFailed": "Ezin izan da backend datu-basean gorde. Arazoak jarraitzen badu, zure fitxategia lokalean gorde beharko zenuke zure lana ez duzula galtzen ziurtatzeko.",
|
||||||
"collabSaveFailed_sizeExceeded": "Ezin izan da backend datu-basean gorde, ohiala handiegia dela dirudi. Fitxategia lokalean gorde beharko zenuke zure lana galtzen ez duzula ziurtatzeko.",
|
"collabSaveFailed_sizeExceeded": "Ezin izan da backend datu-basean gorde, ohiala handiegia dela dirudi. Fitxategia lokalean gorde beharko zenuke zure lana galtzen ez duzula ziurtatzeko.",
|
||||||
"imageToolNotSupported": "Irudiak desgaituta daude.",
|
"imageToolNotSupported": "Irudiak desgaituak daude.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "Brave arakatzailea erabiltzen ari zarela dirudi <bold>Blokeatu hatz-markak erasokorki</bold> ezarpena gaituta.",
|
"line1": "Brave arakatzailea erabiltzen ari zarela dirudi <bold>Blokeatu hatz-markak erasokorki</bold> ezarpena gaituta.",
|
||||||
"line2": "Honek zure marrazkietako <bold>Testu-elementuak</bold> hautsi ditzake.",
|
"line2": "Honek zure marrazkietako <bold>Testu-elementuak</bold> hautsi ditzake.",
|
||||||
@@ -226,7 +283,7 @@
|
|||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "Kapsulatutako elementuak ezin dira liburutegira gehitu.",
|
"embeddable": "Kapsulatutako elementuak ezin dira liburutegira gehitu.",
|
||||||
"iframe": "IFrame elementuak ezin dira liburutegira gehitu.",
|
"iframe": "Kapsulatutako elementuak ezin dira liburutegira gehitu.",
|
||||||
"image": "Laster egongo da irudiak liburutegian gehitzeko laguntza!"
|
"image": "Laster egongo da irudiak liburutegian gehitzeko laguntza!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "Ezin izan da itsatsi (ezin izan da sistemaren arbeletik irakurri).",
|
"asyncPasteFailedOnRead": "Ezin izan da itsatsi (ezin izan da sistemaren arbeletik irakurri).",
|
||||||
@@ -235,6 +292,7 @@
|
|||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Hautapena",
|
"selection": "Hautapena",
|
||||||
|
"lasso": "",
|
||||||
"image": "Txertatu irudia",
|
"image": "Txertatu irudia",
|
||||||
"rectangle": "Laukizuzena",
|
"rectangle": "Laukizuzena",
|
||||||
"diamond": "Diamantea",
|
"diamond": "Diamantea",
|
||||||
@@ -249,13 +307,29 @@
|
|||||||
"link": "Gehitu / Eguneratu esteka hautatutako forma baterako",
|
"link": "Gehitu / Eguneratu esteka hautatutako forma baterako",
|
||||||
"eraser": "Borragoma",
|
"eraser": "Borragoma",
|
||||||
"frame": "Marko tresna",
|
"frame": "Marko tresna",
|
||||||
"magicframe": "Wireframe kodetzeko",
|
"magicframe": "Wireframetik kodera",
|
||||||
"embeddable": "Web kapsulatzea",
|
"embeddable": "Web kapsulatzea",
|
||||||
"laser": "Laser punteroa",
|
"laser": "Laser punteroa",
|
||||||
"hand": "Eskua (panoratze tresna)",
|
"hand": "Eskua (panoratze tresna)",
|
||||||
"extraTools": "Tresna gehiago",
|
"extraTools": "Tresna gehiago",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "Mermaid-etik Excalidraw-ra",
|
||||||
"magicSettings": "AI ezarpenak"
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "",
|
||||||
|
"diamond": "",
|
||||||
|
"ellipse": "",
|
||||||
|
"arrow": "",
|
||||||
|
"line": "",
|
||||||
|
"freedraw": "",
|
||||||
|
"text": "",
|
||||||
|
"image": "",
|
||||||
|
"group": "",
|
||||||
|
"frame": "",
|
||||||
|
"magicframe": "",
|
||||||
|
"embeddable": "",
|
||||||
|
"selection": "",
|
||||||
|
"iframe": ""
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "Canvas ekintzak",
|
"canvasActions": "Canvas ekintzak",
|
||||||
@@ -263,28 +337,33 @@
|
|||||||
"shapes": "Formak"
|
"shapes": "Formak"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "Oihala mugitzeko, eutsi saguaren gurpila edo zuriune-barra arrastatzean, edo erabili esku tresna",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "Egin klik hainbat puntu hasteko, arrastatu lerro bakarrerako",
|
"linearElement": "Egin klik hainbat puntu hasteko, arrastatu lerro bakarrerako",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "Egin klik eta arrastatu, askatu amaitutakoan",
|
"freeDraw": "Egin klik eta arrastatu, askatu amaitutakoan",
|
||||||
"text": "Aholkua: testua gehitu dezakezu edozein lekutan klik bikoitza eginez hautapen tresnarekin",
|
"text": "Aholkua: testua gehitu dezakezu edozein lekutan klik bikoitza eginez hautapen tresnarekin",
|
||||||
"embeddable": "Egin klik eta arrastatu webgunea kapsulatzeko",
|
"embeddable": "Egin klik eta arrastatu webgunea kapsulatzeko",
|
||||||
"text_selected": "Egin klik bikoitza edo sakatu SARTU testua editatzeko",
|
"text_selected": "",
|
||||||
"text_editing": "Sakatu Esc edo Ctrl+SARTU editatzen amaitzeko",
|
"text_editing": "",
|
||||||
"linearElementMulti": "Egin klik azken puntuan edo sakatu Esc edo Sartu amaitzeko",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "SHIFT sakatuta angelua mantendu dezakezu",
|
"lockAngle": "",
|
||||||
"resize": "Proportzioak mantendu ditzakezu SHIFT sakatuta tamaina aldatzen duzun bitartean.\nsakatu ALT erditik tamaina aldatzeko",
|
"resize": "",
|
||||||
"resizeImage": "Tamaina libreki alda dezakezu SHIFT sakatuta,\nsakatu ALT erditik tamaina aldatzeko",
|
"resizeImage": "",
|
||||||
"rotate": "Angeluak mantendu ditzakezu SHIFT sakatuta biratzen duzun bitartean",
|
"rotate": "",
|
||||||
"lineEditor_info": "Eutsi sakatuta Ctrl edo Cmd eta egin klik bikoitza edo sakatu Ctrl edo Cmd + Sartu puntuak editatzeko",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "Sakatu Ezabatu puntuak kentzeko,\nKtrl+D bikoizteko, edo arrastatu mugitzeko",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "Hautatu editatzeko puntu bat (SHIFT sakatuta anitz hautatzeko),\nedo eduki Alt sakatuta eta egin klik puntu berriak gehitzeko",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "Egin klik irudia kokatzeko, edo egin klik eta arrastatu bere tamaina eskuz ezartzeko",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "Argitaratu zure liburutegia",
|
"publishLibrary": "Argitaratu zure liburutegia",
|
||||||
"bindTextToElement": "Sakatu Sartu testua gehitzeko",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "Eutsi Ctrl edo Cmd sakatuta aukeraketa sakona egiteko eta arrastatzea saihesteko",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Eduki Alt sakatuta ezabatzeko markatutako elementuak leheneratzeko",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera.",
|
"firefox_clipboard_write": "Ezaugarri hau \"dom.events.asyncClipboard.clipboardItem\" marka \"true\" gisa ezarrita gaitu daiteke. Firefox-en arakatzailearen banderak aldatzeko, bisitatu \"about:config\" orrialdera.",
|
||||||
"disableSnapping": "Eduki sakatuta Ctrl edo Cmd tekla atxikipena desgaitzeko"
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "Ezin da oihala aurreikusi",
|
"cannotShowPreview": "Ezin da oihala aurreikusi",
|
||||||
@@ -299,9 +378,12 @@
|
|||||||
"openIssueMessage": "Oso kontuz ibili gara zure eszenaren informazioa errorean ez sartzeko. Zure eszena pribatua ez bada, kontuan hartu gure <button>erroreen jarraipena egitea.</button> Sartu beheko informazioa kopiatu eta itsatsi bidez GitHub issue-n.",
|
"openIssueMessage": "Oso kontuz ibili gara zure eszenaren informazioa errorean ez sartzeko. Zure eszena pribatua ez bada, kontuan hartu gure <button>erroreen jarraipena egitea.</button> Sartu beheko informazioa kopiatu eta itsatsi bidez GitHub issue-n.",
|
||||||
"sceneContent": "Eszenaren edukia:"
|
"sceneContent": "Eszenaren edukia:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "Edo"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "Jendea zure uneko eszenara gonbida dezakezu zurekin elkarlanean aritzeko.",
|
"desc_intro": "Gonbidatu jendea zure marrazkira.",
|
||||||
"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.",
|
"desc_privacy": "Lasai, sesioa encriptatua dago eta erabat pribatua da. Gure zerbitzarian ere ezin da ikusi zure marrazkia.",
|
||||||
"button_startSession": "Hasi saioa",
|
"button_startSession": "Hasi saioa",
|
||||||
"button_stopSession": "Itxi saioa",
|
"button_stopSession": "Itxi saioa",
|
||||||
"desc_inProgressIntro": "Zuzeneko lankidetza saioa abian da.",
|
"desc_inProgressIntro": "Zuzeneko lankidetza saioa abian da.",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "sakatu",
|
"click": "sakatu",
|
||||||
"deepSelect": "Hautapen sakona",
|
"deepSelect": "Hautapen sakona",
|
||||||
"deepBoxSelect": "Hautapen sakona egin laukizuzen bidez, eta saihestu arrastatzea",
|
"deepBoxSelect": "Hautapen sakona egin laukizuzen bidez, eta saihestu arrastatzea",
|
||||||
|
"createFlowchart": "",
|
||||||
|
"navigateFlowchart": "",
|
||||||
"curvedArrow": "Gezi kurbatua",
|
"curvedArrow": "Gezi kurbatua",
|
||||||
"curvedLine": "Lerro kurbatua",
|
"curvedLine": "Lerro kurbatua",
|
||||||
"documentation": "Dokumentazioa",
|
"documentation": "Dokumentazioa",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "Zooma hautapenera",
|
"zoomToSelection": "Zooma hautapenera",
|
||||||
"toggleElementLock": "Blokeatu/desbloketatu hautapena",
|
"toggleElementLock": "Blokeatu/desbloketatu hautapena",
|
||||||
"movePageUpDown": "Mugitu orria gora/behera",
|
"movePageUpDown": "Mugitu orria gora/behera",
|
||||||
"movePageLeftRight": "Mugitu orria ezker/eskuin"
|
"movePageLeftRight": "Mugitu orria ezker/eskuin",
|
||||||
|
"cropStart": "",
|
||||||
|
"cropFinish": ""
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "Garbitu oihala"
|
"title": "Garbitu oihala"
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "Angelua",
|
"angle": "Angelua",
|
||||||
"element": "Elementua",
|
"shapes": "",
|
||||||
"elements": "Elementuak",
|
|
||||||
"height": "Altuera",
|
"height": "Altuera",
|
||||||
"scene": "Eszena",
|
"scene": "Eszena",
|
||||||
"selected": "Hautatua",
|
"selected": "Hautatua",
|
||||||
"storage": "Biltegia",
|
"storage": "Biltegia",
|
||||||
"title": "Datuak",
|
"fullTitle": "",
|
||||||
|
"title": "",
|
||||||
|
"generalStats": "",
|
||||||
|
"elementProperties": "",
|
||||||
"total": "Guztira",
|
"total": "Guztira",
|
||||||
"version": "Bertsioa",
|
"version": "Bertsioa",
|
||||||
"versionCopy": "Klikatu kopiatzeko",
|
"versionCopy": "Klikatu kopiatzeko",
|
||||||
@@ -439,13 +527,15 @@
|
|||||||
"copyStyles": "Estiloak kopiatu dira.",
|
"copyStyles": "Estiloak kopiatu dira.",
|
||||||
"copyToClipboard": "Arbelean kopiatu da.",
|
"copyToClipboard": "Arbelean kopiatu da.",
|
||||||
"copyToClipboardAsPng": "{{exportSelection}} kopiatu da arbelean PNG gisa\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "{{exportSelection}} kopiatu da arbelean PNG gisa\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "",
|
||||||
"fileSaved": "Fitxategia gorde da.",
|
"fileSaved": "Fitxategia gorde da.",
|
||||||
"fileSavedToFilename": "{filename}-n gorde da",
|
"fileSavedToFilename": "{filename}-n gorde da",
|
||||||
"canvas": "oihala",
|
"canvas": "oihala",
|
||||||
"selection": "hautapena",
|
"selection": "hautapena",
|
||||||
"pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean",
|
"pasteAsSingleElement": "Erabili {{shortcut}} elementu bakar gisa itsasteko,\nedo itsatsi lehendik dagoen testu-editore batean",
|
||||||
"unableToEmbed": "Url hau txertatzea ez da une honetan onartzen. Sortu issue bat GitHub-en Urla zerrenda zurian sartzea eskatzeko",
|
"unableToEmbed": "Url hau txertatzea ez da une honetan onartzen. Sortu issue bat GitHub-en Urla zerrenda zurian sartzea eskatzeko",
|
||||||
"unrecognizedLinkFormat": "Kapsulatu duzun esteka ez dator bat espero den formatuarekin. Mesedez, saiatu iturburu-guneak emandako 'kapsulatu' katea itsasten"
|
"unrecognizedLinkFormat": "Kapsulatu duzun esteka ez dator bat espero den formatuarekin. Mesedez, saiatu iturburu-guneak emandako 'kapsulatu' katea itsasten",
|
||||||
|
"elementLinkCopied": ""
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "Gardena",
|
"transparent": "Gardena",
|
||||||
@@ -478,6 +568,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
|
"color": "",
|
||||||
"mostUsedCustomColors": "Gehien erabilitako kolore pertsonalizatuak",
|
"mostUsedCustomColors": "Gehien erabilitako kolore pertsonalizatuak",
|
||||||
"colors": "Koloreak",
|
"colors": "Koloreak",
|
||||||
"shades": "Ñabardurak",
|
"shades": "Ñabardurak",
|
||||||
@@ -516,10 +607,58 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "Mermaid-etik Excalidraw-ra",
|
||||||
"button": "Txertatu",
|
"button": "Txertatu",
|
||||||
"description": "",
|
"description": "Momentu honetan <flowchartLink>Flowchart</flowchartLink>, <sequenceLink> Sequence, </sequenceLink> eta <classLink>Class </classLink>Diagramak onartzen dira. Beste motak irudi gisa errendatuko dira Excalidrawn.",
|
||||||
"syntax": "",
|
"syntax": "Mermaid sintaxia",
|
||||||
"preview": "Aurrebista"
|
"preview": "Aurrebista"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": ""
|
||||||
|
},
|
||||||
|
"sceneFonts": "",
|
||||||
|
"availableFonts": "",
|
||||||
|
"empty": ""
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "",
|
||||||
|
"hint": {
|
||||||
|
"text": "Klik erabiltzailean jarraitzeko",
|
||||||
|
"followStatus": "Dagoeneko erabiltzaile hau jarraitzen ari zara",
|
||||||
|
"inCall": "Erabiltzailea dei batean dago",
|
||||||
|
"micMuted": "Erabiltzailearen mikronofoa isildua dago",
|
||||||
|
"isSpeaking": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "",
|
||||||
|
"confirm": "",
|
||||||
|
"close": ""
|
||||||
|
},
|
||||||
|
"recents": "",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "",
|
||||||
|
"noMatch": ""
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "",
|
||||||
|
"shortcutHint": ""
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,29 @@
|
|||||||
{
|
{
|
||||||
"labels": {
|
"labels": {
|
||||||
"paste": "جای گذاری",
|
"paste": "جایگذاری",
|
||||||
"pasteAsPlaintext": "جایگذاری به عنوان متن ساده",
|
"pasteAsPlaintext": "جایگذاری به عنوان متن ساده",
|
||||||
"pasteCharts": "قراردادن نمودارها",
|
"pasteCharts": "جایگذاری نمودارها",
|
||||||
"selectAll": "انتخاب همه",
|
"selectAll": "انتخاب همه",
|
||||||
"multiSelect": "یک ایتم به انتخاب شده ها اضافه کنید.",
|
"multiSelect": "یک ایتم به انتخاب شده ها اضافه کنید",
|
||||||
"moveCanvas": "جابجایی بوم",
|
"moveCanvas": "جابجایی بوم",
|
||||||
"cut": "بریدن",
|
"cut": "بریدن",
|
||||||
"copy": "کپی",
|
"copy": "کپی",
|
||||||
"copyAsPng": "کپی در حافطه موقت به صورت PNG",
|
"copyAsPng": "کپی در حافطه موقت به صورت PNG",
|
||||||
"copyAsSvg": "کپی در حافطه موقت به صورت SVG",
|
"copyAsSvg": "کپی در حافطه موقت به صورت SVG",
|
||||||
"copyText": "کپی در حافطه موقت به صورت متن",
|
"copyText": "کپی در حافطه موقت به صورت متن",
|
||||||
"copySource": "",
|
"copySource": "کپی منبع در حافظه موقت",
|
||||||
"convertToCode": "",
|
"convertToCode": "تبدیل به کد",
|
||||||
"bringForward": "جلو آوردن",
|
"bringForward": "جلو آوردن",
|
||||||
"sendToBack": "پس فرستادن",
|
"sendToBack": "ارسال به عقب",
|
||||||
"bringToFront": "جلو آوردن",
|
"bringToFront": "جلو آوردن",
|
||||||
"sendBackward": "پس فرستادن",
|
"sendBackward": "پس فرستادن",
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"copyStyles": "کپی سبک",
|
"copyStyles": "کپی سبک",
|
||||||
"pasteStyles": "جای گذاری سبک",
|
"pasteStyles": "جایگذاری سبک",
|
||||||
"stroke": "حاشیه",
|
"stroke": "حاشیه",
|
||||||
|
"changeStroke": "تغییر رنگ حاشیه",
|
||||||
"background": "پس زمینه",
|
"background": "پس زمینه",
|
||||||
|
"changeBackground": "تغییر رنگ پس زمینه",
|
||||||
"fill": "رنگ آمیزی",
|
"fill": "رنگ آمیزی",
|
||||||
"strokeWidth": "ضخامت حاشیه",
|
"strokeWidth": "ضخامت حاشیه",
|
||||||
"strokeStyle": "استایل حاشیه",
|
"strokeStyle": "استایل حاشیه",
|
||||||
@@ -30,24 +32,32 @@
|
|||||||
"strokeStyle_dotted": "نقطه چین",
|
"strokeStyle_dotted": "نقطه چین",
|
||||||
"sloppiness": "دقت",
|
"sloppiness": "دقت",
|
||||||
"opacity": "شفافیت",
|
"opacity": "شفافیت",
|
||||||
"textAlign": "چیدمان متن",
|
"textAlign": "تراز متن",
|
||||||
"edges": "لبه ها",
|
"edges": "لبه ها",
|
||||||
"sharp": "تیز",
|
"sharp": "تیز",
|
||||||
"round": "دور",
|
"round": "گرد",
|
||||||
"arrowheads": "سر پیکان",
|
"arrowheads": "سر پیکان",
|
||||||
"arrowhead_none": "هیچ کدام",
|
"arrowhead_none": "هیچ کدام",
|
||||||
"arrowhead_arrow": "پیکان",
|
"arrowhead_arrow": "پیکان",
|
||||||
"arrowhead_bar": "میله ای",
|
"arrowhead_bar": "میله ای",
|
||||||
"arrowhead_circle": "",
|
"arrowhead_circle": "دایره",
|
||||||
"arrowhead_circle_outline": "",
|
"arrowhead_circle_outline": "دایره (پیرامون)",
|
||||||
"arrowhead_triangle": "مثلث",
|
"arrowhead_triangle": "مثلث",
|
||||||
"arrowhead_triangle_outline": "",
|
"arrowhead_triangle_outline": "مثلث (پیرامون)",
|
||||||
"arrowhead_diamond": "",
|
"arrowhead_diamond": "الماس",
|
||||||
"arrowhead_diamond_outline": "",
|
"arrowhead_diamond_outline": "الماس (پیرامون)",
|
||||||
|
"arrowhead_crowfoot_many": "پای کلاغی (بسیار)",
|
||||||
|
"arrowhead_crowfoot_one": "پای کلاغی (یک)",
|
||||||
|
"arrowhead_crowfoot_one_or_many": "پای کلاغی (یک یا بسیار)",
|
||||||
|
"more_options": "امکانات بیشتر",
|
||||||
|
"arrowtypes": "نوع پیکان",
|
||||||
|
"arrowtype_sharp": "پیکان تیز",
|
||||||
|
"arrowtype_round": "پیکان منحنی",
|
||||||
|
"arrowtype_elbowed": "پیکان گوشهدار",
|
||||||
"fontSize": "اندازه قلم",
|
"fontSize": "اندازه قلم",
|
||||||
"fontFamily": "نوع قلم",
|
"fontFamily": "نوع قلم",
|
||||||
"addWatermark": "\"ساخته شده با Excalidraw\" را اضافه کن",
|
"addWatermark": "\"ساخته شده با Excalidraw\" را اضافه کن",
|
||||||
"handDrawn": "دست نویس",
|
"handDrawn": "دستنویس",
|
||||||
"normal": "عادی",
|
"normal": "عادی",
|
||||||
"code": "کد",
|
"code": "کد",
|
||||||
"small": "کوچک",
|
"small": "کوچک",
|
||||||
@@ -69,14 +79,15 @@
|
|||||||
"cartoonist": "کارتونیست",
|
"cartoonist": "کارتونیست",
|
||||||
"fileTitle": "نام فایل",
|
"fileTitle": "نام فایل",
|
||||||
"colorPicker": "انتخابگر رنگ",
|
"colorPicker": "انتخابگر رنگ",
|
||||||
"canvasColors": "رنگ های بوم",
|
"canvasColors": "اسنفاده شده در بوم",
|
||||||
"canvasBackground": "بوم",
|
"canvasBackground": "پسزمینه بوم",
|
||||||
"drawingCanvas": "بوم نقاشی",
|
"drawingCanvas": "بوم نقاشی",
|
||||||
|
"clearCanvas": "پاکسازی بوم",
|
||||||
"layers": "لایه ها",
|
"layers": "لایه ها",
|
||||||
"actions": "عملیات",
|
"actions": "عملیات",
|
||||||
"language": "زبان",
|
"language": "زبان",
|
||||||
"liveCollaboration": "همکاری آنلاین...",
|
"liveCollaboration": "همکاری آنلاین...",
|
||||||
"duplicateSelection": "تکرار",
|
"duplicateSelection": "تکراری",
|
||||||
"untitled": "بدون عنوان",
|
"untitled": "بدون عنوان",
|
||||||
"name": "نام",
|
"name": "نام",
|
||||||
"yourName": "نام شما",
|
"yourName": "نام شما",
|
||||||
@@ -84,12 +95,13 @@
|
|||||||
"group": "گروهبندی انتخابها",
|
"group": "گروهبندی انتخابها",
|
||||||
"ungroup": "حذف گروهبندی انتخابها",
|
"ungroup": "حذف گروهبندی انتخابها",
|
||||||
"collaborators": "همکاران",
|
"collaborators": "همکاران",
|
||||||
"showGrid": "نمایش گرید",
|
"toggleGrid": "تغییر وضعیت خطوط شطرنجی",
|
||||||
"addToLibrary": "افزودن به کتابخانه",
|
"addToLibrary": "افزودن به کتابخانه",
|
||||||
"removeFromLibrary": "حذف از کتابخانه",
|
"removeFromLibrary": "حذف از کتابخانه",
|
||||||
"libraryLoadingMessage": "بارگذاری کتابخانه…",
|
"libraryLoadingMessage": "بارگذاری کتابخانه…",
|
||||||
"libraries": "مرور کردن کتابخانه ها",
|
"libraries": "مرور کردن کتابخانه ها",
|
||||||
"loadingScene": "باگذاری صحنه…",
|
"loadingScene": "باگذاری صحنه…",
|
||||||
|
"loadScene": "بارگذاری صحنه از فایل",
|
||||||
"align": "تراز",
|
"align": "تراز",
|
||||||
"alignTop": "تراز به بالا",
|
"alignTop": "تراز به بالا",
|
||||||
"alignBottom": "تراز به پایین",
|
"alignBottom": "تراز به پایین",
|
||||||
@@ -105,9 +117,11 @@
|
|||||||
"share": "اشتراکگذاری",
|
"share": "اشتراکگذاری",
|
||||||
"showStroke": "نمایش انتخاب کننده رنگ حاشیه",
|
"showStroke": "نمایش انتخاب کننده رنگ حاشیه",
|
||||||
"showBackground": "نمایش انتخاب کننده رنگ پس زمینه",
|
"showBackground": "نمایش انتخاب کننده رنگ پس زمینه",
|
||||||
"toggleTheme": "تغییر تم",
|
"showFonts": "نمایش انتخاب فونت",
|
||||||
|
"toggleTheme": "تغییر وضعیت پوسته روشن/تیره",
|
||||||
|
"theme": "پوسته",
|
||||||
"personalLib": "کتابخانه شخصی",
|
"personalLib": "کتابخانه شخصی",
|
||||||
"excalidrawLib": "کتابخانه",
|
"excalidrawLib": "کتابخانه Excalidraw",
|
||||||
"decreaseFontSize": "کاهش اندازه فونت",
|
"decreaseFontSize": "کاهش اندازه فونت",
|
||||||
"increaseFontSize": "افزایش دادن اندازه فونت",
|
"increaseFontSize": "افزایش دادن اندازه فونت",
|
||||||
"unbindText": "بازکردن نوشته",
|
"unbindText": "بازکردن نوشته",
|
||||||
@@ -115,16 +129,21 @@
|
|||||||
"createContainerFromText": "متن را در یک جایگاه بپیچید",
|
"createContainerFromText": "متن را در یک جایگاه بپیچید",
|
||||||
"link": {
|
"link": {
|
||||||
"edit": "ویرایش لینک",
|
"edit": "ویرایش لینک",
|
||||||
"editEmbed": "",
|
"editEmbed": "تغیر لینک",
|
||||||
"create": "ایجاد پیوند",
|
"create": "افزودن لینک",
|
||||||
"createEmbed": "",
|
|
||||||
"label": "لینک",
|
"label": "لینک",
|
||||||
"labelEmbed": "",
|
"labelEmbed": "لینک و افزونه",
|
||||||
"empty": ""
|
"empty": "هیچ لینکی ست نشده",
|
||||||
|
"hint": "لینک خود را بنویسید یا جایگذاری کنید",
|
||||||
|
"goToElement": "رفتن به المان مد نظر"
|
||||||
},
|
},
|
||||||
"lineEditor": {
|
"lineEditor": {
|
||||||
"edit": "ویرایش لینک",
|
"edit": "ویرایش لینک",
|
||||||
"exit": "خروج از ویرایشگر"
|
"editArrow": "ویرایش پیکان"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"breakPolygon": "",
|
||||||
|
"convertToPolygon": ""
|
||||||
},
|
},
|
||||||
"elementLock": {
|
"elementLock": {
|
||||||
"lock": "قفل",
|
"lock": "قفل",
|
||||||
@@ -134,16 +153,50 @@
|
|||||||
},
|
},
|
||||||
"statusPublished": "منتشر شده",
|
"statusPublished": "منتشر شده",
|
||||||
"sidebarLock": "باز نگه داشتن سایدبار",
|
"sidebarLock": "باز نگه داشتن سایدبار",
|
||||||
"selectAllElementsInFrame": "",
|
"selectAllElementsInFrame": "همه آیتم های در فریم را انتخاب کنید",
|
||||||
"removeAllElementsFromFrame": "",
|
"removeAllElementsFromFrame": "حذف همه آیتم های داخل فریم",
|
||||||
"eyeDropper": "انتخاب رنگ از کرباس",
|
"eyeDropper": "انتخاب رنگ از بوم",
|
||||||
"textToDiagram": "",
|
"textToDiagram": "متن به دیاگرام",
|
||||||
"prompt": ""
|
"prompt": "فوری",
|
||||||
|
"followUs": "ما را دنبال کنید",
|
||||||
|
"discordChat": "چت دیسکورد",
|
||||||
|
"zoomToFitViewport": "بزرگنمایی به اندازه نمایشگر",
|
||||||
|
"zoomToFitSelection": "بزرگنمایی به اندازه قسمت انتخاب شده",
|
||||||
|
"zoomToFit": "بزرگنمایی برای دیدن تمام آیتم ها",
|
||||||
|
"installPWA": "نصب Excalidraw روی دستگاه (PWA)",
|
||||||
|
"autoResize": "فعالسازی تنظیم خودکار سایز",
|
||||||
|
"imageCropping": "برش عکس",
|
||||||
|
"unCroppedDimension": "اندازه غیر برشی",
|
||||||
|
"copyElementLink": "کپی لینک به آیتم",
|
||||||
|
"linkToElement": "لینک به آیتم",
|
||||||
|
"wrapSelectionInFrame": "انتخاب را در قاب قرار دهید",
|
||||||
|
"tab": "",
|
||||||
|
"shapeSwitch": ""
|
||||||
|
},
|
||||||
|
"elementLink": {
|
||||||
|
"title": "لینک به آیتم",
|
||||||
|
"desc": "روی شکل یا بوم کلیک کنید، یا لینک را جایگذاری کنید.",
|
||||||
|
"notFound": "آیتم لینک شده در بوم پیدا نشد."
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"noItems": "آیتمی به اینجا اضافه نشده...",
|
"noItems": "آیتمی به اینجا اضافه نشده...",
|
||||||
"hint_emptyLibrary": "یک آیتم روی بوم را برای اضافه شده به اینجا انتخاب کنید، یا یک کتابخانه از مخزن عمومی در بخش پایین را نصب کنید.",
|
"hint_emptyLibrary": "یک آیتم روی بوم را برای اضافه شده به اینجا انتخاب کنید، یا یک کتابخانه از مخزن عمومی در بخش پایین را نصب کنید.",
|
||||||
"hint_emptyPrivateLibrary": "یک آیتم روی بوم را برای اضافه شدن به اینجا انتخاب کنید."
|
"hint_emptyPrivateLibrary": "یک آیتم روی بوم را برای اضافه شدن به اینجا انتخاب کنید.",
|
||||||
|
"search": {
|
||||||
|
"inputPlaceholder": "",
|
||||||
|
"heading": "",
|
||||||
|
"noResults": "",
|
||||||
|
"clearSearch": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"title": "جستجو در بوم",
|
||||||
|
"noMatch": "هیچ موردی یافت نشد...",
|
||||||
|
"singleResult": "نتیجه",
|
||||||
|
"multipleResults": "نتایج",
|
||||||
|
"placeholder": "جستجوی متن در بوم...",
|
||||||
|
"frames": "",
|
||||||
|
"texts": ""
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"clearReset": "پاکسازی بوم نقاشی",
|
"clearReset": "پاکسازی بوم نقاشی",
|
||||||
@@ -151,6 +204,7 @@
|
|||||||
"exportImage": "خروجی گرفتن از تصویر...",
|
"exportImage": "خروجی گرفتن از تصویر...",
|
||||||
"export": "ذخیره در...",
|
"export": "ذخیره در...",
|
||||||
"copyToClipboard": "کپی در حافظه موقت",
|
"copyToClipboard": "کپی در حافظه موقت",
|
||||||
|
"copyLink": "کپی لینک",
|
||||||
"save": "ذخیره در همین فایل",
|
"save": "ذخیره در همین فایل",
|
||||||
"saveAs": "ذخیره با نام",
|
"saveAs": "ذخیره با نام",
|
||||||
"load": "باز کردن",
|
"load": "باز کردن",
|
||||||
@@ -171,17 +225,19 @@
|
|||||||
"fullScreen": "تمامصفحه",
|
"fullScreen": "تمامصفحه",
|
||||||
"darkMode": "حالت تیره",
|
"darkMode": "حالت تیره",
|
||||||
"lightMode": "حالت روشن",
|
"lightMode": "حالت روشن",
|
||||||
|
"systemMode": "حالت سیستم",
|
||||||
"zenMode": "حالت ذن",
|
"zenMode": "حالت ذن",
|
||||||
"objectsSnapMode": "",
|
"objectsSnapMode": "به اشیاء بچسبد",
|
||||||
"exitZenMode": "خروج از حالت تمرکز",
|
"exitZenMode": "خروج از حالت تمرکز",
|
||||||
"cancel": "لغو",
|
"cancel": "لغو",
|
||||||
"clear": "پاک کردن",
|
"saveLibNames": "",
|
||||||
|
"clear": "پاکسازی",
|
||||||
"remove": "پاک کردن",
|
"remove": "پاک کردن",
|
||||||
"embed": "",
|
"embed": "تغییر افزونه",
|
||||||
"publishLibrary": "انتشار",
|
"publishLibrary": "",
|
||||||
"submit": "ارسال",
|
"submit": "ارسال",
|
||||||
"confirm": "تایید",
|
"confirm": "تایید",
|
||||||
"embeddableInteractionButton": ""
|
"embeddableInteractionButton": "کلیک برای تعامل"
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"clearReset": "این کار کل صفحه را پاک میکند. آیا مطمئنید؟",
|
"clearReset": "این کار کل صفحه را پاک میکند. آیا مطمئنید؟",
|
||||||
@@ -190,8 +246,8 @@
|
|||||||
"couldNotLoadInvalidFile": "عدم توانایی در بازگذاری فایل نامعتبر",
|
"couldNotLoadInvalidFile": "عدم توانایی در بازگذاری فایل نامعتبر",
|
||||||
"importBackendFailed": "بارگیری از پشت صحنه با شکست مواجه شد.",
|
"importBackendFailed": "بارگیری از پشت صحنه با شکست مواجه شد.",
|
||||||
"cannotExportEmptyCanvas": "بوم خالی قابل تبدیل نیست.",
|
"cannotExportEmptyCanvas": "بوم خالی قابل تبدیل نیست.",
|
||||||
"couldNotCopyToClipboard": "به کلیپ بورد کپی نشد.",
|
"couldNotCopyToClipboard": "در بریدهدان رونویسی نشد.",
|
||||||
"decryptFailed": "رمزگشایی داده ها امکان پذیر نیست.",
|
"decryptFailed": "رمزگشایی داده ها امکانپذیر نیست.",
|
||||||
"uploadedSecurly": "آپلود با رمزگذاری دو طرفه انجام میشود، به این معنی که سرور Excalidraw و اشخاص ثالث نمی توانند مطالب شما را بخوانند.",
|
"uploadedSecurly": "آپلود با رمزگذاری دو طرفه انجام میشود، به این معنی که سرور Excalidraw و اشخاص ثالث نمی توانند مطالب شما را بخوانند.",
|
||||||
"loadSceneOverridePrompt": "بارگزاری یک طرح خارجی محتوای فعلی رو از بین میبرد. آیا میخواهید ادامه دهید؟",
|
"loadSceneOverridePrompt": "بارگزاری یک طرح خارجی محتوای فعلی رو از بین میبرد. آیا میخواهید ادامه دهید؟",
|
||||||
"collabStopOverridePrompt": "با توقف بوم نقاشی، نقشه قبلی و ذخیره شده محلی شما را بازنویسی می کند. مطمئنی؟\n\n(اگر می خواهید نقاشی محلی خود را حفظ کنید، به سادگی برگه مرورگر را ببندید.)",
|
"collabStopOverridePrompt": "با توقف بوم نقاشی، نقشه قبلی و ذخیره شده محلی شما را بازنویسی می کند. مطمئنی؟\n\n(اگر می خواهید نقاشی محلی خود را حفظ کنید، به سادگی برگه مرورگر را ببندید.)",
|
||||||
@@ -204,37 +260,39 @@
|
|||||||
"resetLibrary": "ین کار کل صفحه را پاک میکند. آیا مطمئنید?",
|
"resetLibrary": "ین کار کل صفحه را پاک میکند. آیا مطمئنید?",
|
||||||
"removeItemsFromsLibrary": "حذف {{count}} آیتم(ها) از کتابخانه?",
|
"removeItemsFromsLibrary": "حذف {{count}} آیتم(ها) از کتابخانه?",
|
||||||
"invalidEncryptionKey": "کلید رمزگذاری باید 22 کاراکتر باشد. همکاری زنده غیرفعال است.",
|
"invalidEncryptionKey": "کلید رمزگذاری باید 22 کاراکتر باشد. همکاری زنده غیرفعال است.",
|
||||||
"collabOfflineWarning": "اتصال به اینترنت در دسترس نیست.\nتغییرات شما ذخیره نمی شود!"
|
"collabOfflineWarning": "اتصال به اینترنت در دسترس نیست.\nتغییرات شما ذخیره نمی شود!",
|
||||||
|
"localStorageQuotaExceeded": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"unsupportedFileType": "نوع فایل پشتیبانی نشده.",
|
"unsupportedFileType": "نوع فایل پشتیبانی نشده.",
|
||||||
"imageInsertError": "عکس ارسال نشد. بعداً دوباره تلاش کنید...",
|
"imageInsertError": "عکس ارسال نشد. بعداً دوباره تلاش کنید...",
|
||||||
"fileTooBig": "فایل خیلی بزرگ است حداکثر اندازه مجاز {{maxSize}}.",
|
"fileTooBig": "فایل خیلی بزرگ است حداکثر اندازه مجاز {{maxSize}}.",
|
||||||
"svgImageInsertError": "تصویر SVG وارد نشد. نشانه گذاری SVG نامعتبر به نظر می رسد.",
|
"svgImageInsertError": "تصویر SVG وارد نشد. نشانه گذاری SVG نامعتبر به نظر می رسد.",
|
||||||
"failedToFetchImage": "",
|
"failedToFetchImage": "گرفتن تصویر ناموفق بود.",
|
||||||
"invalidSVGString": "SVG نادرست.",
|
|
||||||
"cannotResolveCollabServer": "به سرور collab متصل نشد. لطفا صفحه را مجددا بارگذاری کنید و دوباره تلاش کنید.",
|
"cannotResolveCollabServer": "به سرور collab متصل نشد. لطفا صفحه را مجددا بارگذاری کنید و دوباره تلاش کنید.",
|
||||||
"importLibraryError": "دادهها بارگذاری نشدند",
|
"importLibraryError": "دادهها بارگذاری نشدند",
|
||||||
|
"saveLibraryError": "ذخیرهسازی در سرور با مشکل مواجه شد. لطفا فایل خود را در دستگاه خود به صورت محلی ذخیره کنید تا مطمئن شوید تغییرات اعمال شده را از دست نخواهید داد.",
|
||||||
"collabSaveFailed": "در پایگاه داده باطن ذخیره نشد. اگر مشکلات همچنان ادامه داشت، باید فایل خود را به صورت محلی ذخیره کنید تا مطمئن شوید کار خود را از دست نمی دهید.",
|
"collabSaveFailed": "در پایگاه داده باطن ذخیره نشد. اگر مشکلات همچنان ادامه داشت، باید فایل خود را به صورت محلی ذخیره کنید تا مطمئن شوید کار خود را از دست نمی دهید.",
|
||||||
"collabSaveFailed_sizeExceeded": "در پایگاه داده بکند ذخیره نشد. اگر مشکلات همچنان ادامه داشت، باید فایل خود را به صورت محلی ذخیره کنید تا مطمئن شوید کار خود را از دست نمی دهید.",
|
"collabSaveFailed_sizeExceeded": "در پایگاه داده بکند ذخیره نشد. اگر مشکلات همچنان ادامه داشت، باید فایل خود را به صورت محلی ذخیره کنید تا مطمئن شوید کار خود را از دست نمی دهید.",
|
||||||
"imageToolNotSupported": "",
|
"imageToolNotSupported": "تصاویر غیر فعال شدند.",
|
||||||
"brave_measure_text_error": {
|
"brave_measure_text_error": {
|
||||||
"line1": "به نظر میرسد از مرورگر Brave با تنظیم <bold> مسدود کردن شدید اثرانگشت</bold> استفاده میکنید.",
|
"line1": "به نظر میرسد از مرورگر Brave با تنظیم <bold> مسدود کردن شدید اثرانگشت</bold> استفاده میکنید.",
|
||||||
"line2": "این می تواند منجر به شکستن <bold>عناصر متن</bold> در نقاشی های شما شود.",
|
"line2": "این می تواند منجر به شکستن <bold>عناصر متن</bold> در نقاشی های شما شود.",
|
||||||
"line3": "اکیداً توصیه می کنیم این تنظیم را غیرفعال کنید. برای نحوه انجام این کار میتوانید <link>این مراحل</link> را دنبال کنید.",
|
"line3": "اکیداً توصیه می کنیم این تنظیم را غیرفعال کنید. برای نحوه انجام این کار میتوانید <link>این مراحل</link> را دنبال کنید.",
|
||||||
"line4": "اگر غیرفعال کردن این تنظیم نمایش عناصر متنی را برطرف نکرد، لطفاً یک <issueLink>مشکل</issueLink> را در GitHub ما باز کنید یا برای ما در <discordLink>Discord</discordLink> بنویسید."
|
"line4": "اگر غیرفعال کردن این تنظیم نمایش عناصر متنی را برطرف نکرد، لطفاً یک <issueLink>مشکل</issueLink> را در GitHub ما باز کنید یا برای ما در <discordLink>Discord</discordLink> بنویسید"
|
||||||
},
|
},
|
||||||
"libraryElementTypeError": {
|
"libraryElementTypeError": {
|
||||||
"embeddable": "",
|
"embeddable": "عناصر افزوده شده نمی توانند به کتابخانه افزوده شوند.",
|
||||||
"iframe": "",
|
"iframe": "عناصر IFrame نمی توانند به کتابخانه افزوده شوند.",
|
||||||
"image": ""
|
"image": "پشتیبانی از افزودن تصاویر به کتابخانه به زودی اضافه خواهد شد!"
|
||||||
},
|
},
|
||||||
"asyncPasteFailedOnRead": "",
|
"asyncPasteFailedOnRead": "نمی تواند جاگذاری شود (نمی تواند از کلیپبورد بخواند).",
|
||||||
"asyncPasteFailedOnParse": "",
|
"asyncPasteFailedOnParse": "نمیتواند جایگذاری شود.",
|
||||||
"copyToSystemClipboardFailed": ""
|
"copyToSystemClipboardFailed": "نمی تواند در کلیپبورد کپی شود."
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "گزینش",
|
"selection": "گزینش",
|
||||||
|
"lasso": "",
|
||||||
"image": "وارد کردن تصویر",
|
"image": "وارد کردن تصویر",
|
||||||
"rectangle": "مستطیل",
|
"rectangle": "مستطیل",
|
||||||
"diamond": "لوزی",
|
"diamond": "لوزی",
|
||||||
@@ -246,45 +304,66 @@
|
|||||||
"library": "کتابخانه",
|
"library": "کتابخانه",
|
||||||
"lock": "ابزار انتخاب شده را بعد از کشیدن نگه دار",
|
"lock": "ابزار انتخاب شده را بعد از کشیدن نگه دار",
|
||||||
"penMode": "حالت قلم - جلوگیری از تماس",
|
"penMode": "حالت قلم - جلوگیری از تماس",
|
||||||
"link": "افزودن/بهروزرسانی پیوند برای شکل انتخابی",
|
"link": "افزودن/بهروزرسانی لینک برای شکل انتخابی",
|
||||||
"eraser": "پاک کن",
|
"eraser": "پاک کن",
|
||||||
"frame": "",
|
"frame": "ابزار فریم",
|
||||||
"magicframe": "",
|
"magicframe": "وایرفریم به کد",
|
||||||
"embeddable": "",
|
"embeddable": "افزونه وب",
|
||||||
"laser": "",
|
"laser": "اشاره گر لیزری",
|
||||||
"hand": "دست (ابزار پانینگ)",
|
"hand": "دست (ابزار پانینگ)",
|
||||||
"extraTools": "ابزارهای بیشتر",
|
"extraTools": "ابزارهای بیشتر",
|
||||||
"mermaidToExcalidraw": "",
|
"mermaidToExcalidraw": "مرمید به excalidraw",
|
||||||
"magicSettings": ""
|
"convertElementType": ""
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
"rectangle": "مستطیل",
|
||||||
|
"diamond": "لوزی",
|
||||||
|
"ellipse": "بیضی",
|
||||||
|
"arrow": "پیکان",
|
||||||
|
"line": "خط",
|
||||||
|
"freedraw": "کشیدن",
|
||||||
|
"text": "متن",
|
||||||
|
"image": "تصویر",
|
||||||
|
"group": "گروه",
|
||||||
|
"frame": "قاب",
|
||||||
|
"magicframe": "وایرفریم به کد",
|
||||||
|
"embeddable": "افزونه وب",
|
||||||
|
"selection": "انتخاب",
|
||||||
|
"iframe": "آی فریم"
|
||||||
},
|
},
|
||||||
"headings": {
|
"headings": {
|
||||||
"canvasActions": "عملیات روی بوم",
|
"canvasActions": "عملیات روی بوم",
|
||||||
"selectedShapeActions": "عملیات روی شکل انتخاب شده",
|
"selectedShapeActions": "عملیات روی شکل انتخاب شده",
|
||||||
"shapes": "شکلها"
|
"shapes": "اشکال"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"canvasPanning": "برای حرکت دادن بوم، چرخ ماوس یا فاصله را در حین کشیدن نگه دارید یا از ابزار دستی استفاده کنید",
|
"dismissSearch": "",
|
||||||
|
"canvasPanning": "",
|
||||||
"linearElement": "برای چند نقطه کلیک و برای یک خط بکشید",
|
"linearElement": "برای چند نقطه کلیک و برای یک خط بکشید",
|
||||||
|
"arrowTool": "",
|
||||||
"freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید",
|
"freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید",
|
||||||
"text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید",
|
"text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید",
|
||||||
"embeddable": "",
|
"embeddable": "کلیک-درگ برای ساخت افزونه وب",
|
||||||
"text_selected": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید",
|
"text_selected": "",
|
||||||
"text_editing": "Escape یا CtrlOrCmd+ENTER را فشار دهید تا ویرایش تمام شود",
|
"text_editing": "",
|
||||||
"linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار",
|
"linearElementMulti": "",
|
||||||
"lockAngle": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید",
|
"lockAngle": "",
|
||||||
"resize": "می توانید با نگه داشتن SHIFT در هنگام تغییر اندازه، نسبت ها را محدود کنید،ALT را برای تغییر اندازه از مرکز نگه دارید",
|
"resize": "",
|
||||||
"resizeImage": "با نگه داشتن SHIFT می توانید آزادانه اندازه را تغییر دهید،\nبرای تغییر اندازه از مرکز، ALT را نگه دارید",
|
"resizeImage": "",
|
||||||
"rotate": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید",
|
"rotate": "",
|
||||||
"lineEditor_info": "CtrlOrCmd را نگه دارید و دوبار کلیک کنید یا CtrlOrCmd + Enter را فشار دهید تا نقاط را ویرایش کنید.",
|
"lineEditor_info": "",
|
||||||
"lineEditor_pointSelected": "برای حذف نقطه Delete برای کپی زدن Ctrl یا Cmd+D را بزنید و یا برای جابجایی بکشید",
|
"lineEditor_line_info": "",
|
||||||
"lineEditor_nothingSelected": "یک نقطه را برای ویرایش انتخاب کنید (SHIFT را برای انتخاب چندگانه نگه دارید)،\nیا Alt را نگه دارید و برای افزودن نقاط جدید کلیک کنید",
|
"lineEditor_pointSelected": "",
|
||||||
"placeImage": "برای قرار دادن تصویر کلیک کنید، یا کلیک کنید و بکشید تا اندازه آن به صورت دستی تنظیم شود",
|
"lineEditor_nothingSelected": "",
|
||||||
"publishLibrary": "کتابخانه خود را منتشر کنید",
|
"publishLibrary": "کتابخانه خود را منتشر کنید",
|
||||||
"bindTextToElement": "برای افزودن اینتر را بزنید",
|
"bindTextToElement": "",
|
||||||
"deepBoxSelect": "CtrlOrCmd را برای انتخاب عمیق و جلوگیری از کشیدن نگه دارید",
|
"createFlowchart": "",
|
||||||
"eraserRevert": "Alt را نگه دارید تا عناصر علامت گذاری شده برای حذف برگردند",
|
"deepBoxSelect": "",
|
||||||
|
"eraserRevert": "",
|
||||||
"firefox_clipboard_write": "احتمالاً میتوان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید.",
|
"firefox_clipboard_write": "احتمالاً میتوان این ویژگی را با تنظیم پرچم «dom.events.asyncClipboard.clipboardItem» روی «true» فعال کرد. برای تغییر پرچم های مرورگر در فایرفاکس، از صفحه \"about:config\" دیدن کنید.",
|
||||||
"disableSnapping": ""
|
"disableSnapping": "",
|
||||||
|
"enterCropEditor": "",
|
||||||
|
"leaveCropEditor": ""
|
||||||
},
|
},
|
||||||
"canvasError": {
|
"canvasError": {
|
||||||
"cannotShowPreview": "پیش نمایش نشان داده نمی شود",
|
"cannotShowPreview": "پیش نمایش نشان داده نمی شود",
|
||||||
@@ -292,16 +371,19 @@
|
|||||||
"canvasTooBigTip": "نکته: سعی کنید دورترین عناصر را کمی به همدیگر نزدیک کنید."
|
"canvasTooBigTip": "نکته: سعی کنید دورترین عناصر را کمی به همدیگر نزدیک کنید."
|
||||||
},
|
},
|
||||||
"errorSplash": {
|
"errorSplash": {
|
||||||
"headingMain": "",
|
"headingMain": "مشکلی رخ داده. امتحان کنید <button> بارگذاری مجدد صفحه </button>.",
|
||||||
"clearCanvasMessage": "اگر بازنشانی صفحه مشکل را حل نکرد این را امتحان کنید ",
|
"clearCanvasMessage": "اگر بازنشانی صفحه مشکل را حل نکرد <button>پاک کردن بوم</button> را امتحان کنید.",
|
||||||
"clearCanvasCaveat": " این باعث میشود کارهای شما ذخیره نشود ",
|
"clearCanvasCaveat": " این باعث میشود کارهای شما ذخیره نشود ",
|
||||||
"trackedToSentry": "",
|
"trackedToSentry": "خطا با شناسه {{eventId}} در سیستم ما رهگیری شد.",
|
||||||
"openIssueMessage": "",
|
"openIssueMessage": "ما بسیار محتاط بودیم که اطلاعات صحنه شما را در خطا لحاظ نکنیم. اگر صحنه شما خصوصی نیست، لطفاً ما را دنبال کنید\n<button> رد یابی خطا </button>. لطفاً اطلاعات زیر را با کپی و جایگذاری در مشکل GitHub وارد کنید.",
|
||||||
"sceneContent": "محتوای صحنه:"
|
"sceneContent": "محتوای صحنه:"
|
||||||
},
|
},
|
||||||
|
"shareDialog": {
|
||||||
|
"or": "یا"
|
||||||
|
},
|
||||||
"roomDialog": {
|
"roomDialog": {
|
||||||
"desc_intro": "می توانید افرادی را به صحنه فعلی خود دعوت کنید تا با شما همکاری کنند.",
|
"desc_intro": "از دیگران برای همکاری در کار خود دعوت کنید.",
|
||||||
"desc_privacy": "نگران نباشید، این جلسه از رمزگذاری دوطرفه استفاده می کند، پس هر چیزی بکشید خصوصی خواهد ماند. حتی سرور ما نمیتواند ببیند چیزی که شما طراحی میکنید.",
|
"desc_privacy": "نگران نباشید، این نشست به صورت پایانه-به-پایانه رمزنگاری شده است و کاملا امن است. حتی سرورهای ما نیز قادر به دیدن ترسیمات شما نیستند.",
|
||||||
"button_startSession": "شروع جلسه",
|
"button_startSession": "شروع جلسه",
|
||||||
"button_stopSession": "پایان جلسه",
|
"button_stopSession": "پایان جلسه",
|
||||||
"desc_inProgressIntro": "جلسه همکاری آنلاین در حال انجام است.",
|
"desc_inProgressIntro": "جلسه همکاری آنلاین در حال انجام است.",
|
||||||
@@ -328,6 +410,8 @@
|
|||||||
"click": "کلیک",
|
"click": "کلیک",
|
||||||
"deepSelect": "انتخاب عمیق",
|
"deepSelect": "انتخاب عمیق",
|
||||||
"deepBoxSelect": "انتخاب عمیق در کادر، و جلوگیری از کشیدن",
|
"deepBoxSelect": "انتخاب عمیق در کادر، و جلوگیری از کشیدن",
|
||||||
|
"createFlowchart": "از هر آیتمی یک فلوچارت ایجاد کنید",
|
||||||
|
"navigateFlowchart": "پیمایش یک فلوچارت",
|
||||||
"curvedArrow": "فلش خمیده",
|
"curvedArrow": "فلش خمیده",
|
||||||
"curvedLine": "منحنی",
|
"curvedLine": "منحنی",
|
||||||
"documentation": "مستندات",
|
"documentation": "مستندات",
|
||||||
@@ -350,7 +434,9 @@
|
|||||||
"zoomToSelection": "بزرگنمایی قسمت انتخاب شده",
|
"zoomToSelection": "بزرگنمایی قسمت انتخاب شده",
|
||||||
"toggleElementLock": "قفل/بازکردن انتخاب شده ها",
|
"toggleElementLock": "قفل/بازکردن انتخاب شده ها",
|
||||||
"movePageUpDown": "حرکت صفحه به بالا/پایین",
|
"movePageUpDown": "حرکت صفحه به بالا/پایین",
|
||||||
"movePageLeftRight": "حرکت صفحه به چپ/راست"
|
"movePageLeftRight": "حرکت صفحه به چپ/راست",
|
||||||
|
"cropStart": "برش تصویر",
|
||||||
|
"cropFinish": "پایان برش تصویر"
|
||||||
},
|
},
|
||||||
"clearCanvasDialog": {
|
"clearCanvasDialog": {
|
||||||
"title": "پاک کردن بوم"
|
"title": "پاک کردن بوم"
|
||||||
@@ -363,22 +449,22 @@
|
|||||||
"twitterUsername": "نام کاربری توییتر",
|
"twitterUsername": "نام کاربری توییتر",
|
||||||
"libraryName": "نام کتابخانه",
|
"libraryName": "نام کتابخانه",
|
||||||
"libraryDesc": "توضیحات کتابخانه",
|
"libraryDesc": "توضیحات کتابخانه",
|
||||||
"website": "تارنما",
|
"website": "وبسایت",
|
||||||
"placeholder": {
|
"placeholder": {
|
||||||
"authorName": "نام یا نام کاربری شما",
|
"authorName": "نام یا نام کاربری شما",
|
||||||
"libraryName": "اسم کتابخانه",
|
"libraryName": "اسم کتابخانه",
|
||||||
"libraryDesc": "شرحی از کتابخانه شما برای کمک به مردم برای درک استفاده از آن",
|
"libraryDesc": "شرحی از کتابخانه شما برای کمک به مردم برای درک استفاده از آن",
|
||||||
"githubHandle": "دسته GitHub (اختیاری)، بنابراین می توانید پس از ارسال برای بررسی، کتابخانه را ویرایش کنید",
|
"githubHandle": "دسته GitHub (اختیاری)، بنابراین می توانید پس از ارسال برای بررسی، کتابخانه را ویرایش کنید",
|
||||||
"twitterHandle": "نام کاربری توییتر (اختیاری)، بنابراین می دانیم هنگام تبلیغ در توییتر به چه کسی اعتبار دهیم",
|
"twitterHandle": "نام کاربری توییتر (اختیاری)، بنابراین میدانیم هنگام تبلیغ در توییتر به چه کسی اعتبار دهیم",
|
||||||
"website": "پیوند به وب سایت شخصی شما یا هر جای دیگر (اختیاری)"
|
"website": "پیوند به وب سایت شخصی شما یا هر جای دیگر (اختیاری)"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"required": "لازم",
|
"required": "لازم",
|
||||||
"website": "وارد کردن آدرس درست"
|
"website": "وارد کردن آدرس درست"
|
||||||
},
|
},
|
||||||
"noteDescription": "",
|
"noteDescription": "کتابخانه خود را ارسال کنید تا در <link/> مخرن کتابخانه عمومی <link> برای بقیه مردم گنجانده شود تا در طرح هایشان استفاده کنند.",
|
||||||
"noteGuidelines": "",
|
"noteGuidelines": "کتابخانه باید ابتدا به صورت دستی تأیید شود. لطفا قبل انتشار <link>راهنما</link> را مطالعه کنید. برای برقراری ارتباط و ایجاد تغییرات در صورت درخواست، به یک حساب GitHub نیاز دارید، اما خیلی الزامی نیست.",
|
||||||
"noteLicense": "",
|
"noteLicense": "با ارسال، موافقت می کنید که کتابخانه تحت عنوان <link>MIT License</link> منتشر شود،که به طور خلاصه به این معنی است که هر کسی می تواند بدون محدودیت از آنها استفاده کند.",
|
||||||
"noteItems": "هر مورد کتابخانه باید نام خاص خود را داشته باشد تا قابل فیلتر باشد. اقلام کتابخانه زیر شامل خواهد شد:",
|
"noteItems": "هر مورد کتابخانه باید نام خاص خود را داشته باشد تا قابل فیلتر باشد. اقلام کتابخانه زیر شامل خواهد شد:",
|
||||||
"atleastOneLibItem": "لطفاً حداقل یک مورد از کتابخانه را برای شروع انتخاب کنید",
|
"atleastOneLibItem": "لطفاً حداقل یک مورد از کتابخانه را برای شروع انتخاب کنید",
|
||||||
"republishWarning": "توجه: برخی از موارد انتخاب شده به عنوان قبلاً منتشر شده/ارسال شده علامت گذاری شده اند. شما فقط باید هنگام بهروزرسانی یک کتابخانه موجود یا ارسال، موارد را دوباره ارسال کنید."
|
"republishWarning": "توجه: برخی از موارد انتخاب شده به عنوان قبلاً منتشر شده/ارسال شده علامت گذاری شده اند. شما فقط باید هنگام بهروزرسانی یک کتابخانه موجود یا ارسال، موارد را دوباره ارسال کنید."
|
||||||
@@ -389,30 +475,30 @@
|
|||||||
},
|
},
|
||||||
"confirmDialog": {
|
"confirmDialog": {
|
||||||
"resetLibrary": "تنظیم مجدد کتابخانه",
|
"resetLibrary": "تنظیم مجدد کتابخانه",
|
||||||
"removeItemsFromLib": "موارد انتخاب شده از موارد پسندیده حذف شوند"
|
"removeItemsFromLib": "موارد انتخاب شده از کتابخوانه حذف شوند"
|
||||||
},
|
},
|
||||||
"imageExportDialog": {
|
"imageExportDialog": {
|
||||||
"header": "",
|
"header": "خروجی گرفتن از تصویر",
|
||||||
"label": {
|
"label": {
|
||||||
"withBackground": "پس زمینه",
|
"withBackground": "پس زمینه",
|
||||||
"onlySelected": "",
|
"onlySelected": "فقط انتخاب شده ها",
|
||||||
"darkMode": "حالت تیره",
|
"darkMode": "حالت تاریک",
|
||||||
"embedScene": "",
|
"embedScene": "صحنه افزونه",
|
||||||
"scale": "",
|
"scale": "نسبت",
|
||||||
"padding": ""
|
"padding": "فاصله"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"embedScene": ""
|
"embedScene": "داده های صحنه در فایل PNG/SVG صادر شده ذخیره می شود تا صحنه را بتوان از آن بازیابی کرد.\nاندازه فایل خروجی را افزایش می دهد."
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"exportToPng": "",
|
"exportToPng": "تبدیل به PNG",
|
||||||
"exportToSvg": "",
|
"exportToSvg": "تبدیل به SVG",
|
||||||
"copyPngToClipboard": ""
|
"copyPngToClipboard": "کپی PNG در حافظه موقت"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"exportToPng": "PNG",
|
"exportToPng": "PNG",
|
||||||
"exportToSvg": "SVG",
|
"exportToSvg": "SVG",
|
||||||
"copyPngToClipboard": "کپی در کلیپبورد"
|
"copyPngToClipboard": "کپی در حافظه موقت"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"encrypted": {
|
"encrypted": {
|
||||||
@@ -421,13 +507,15 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"angle": "زاویه",
|
"angle": "زاویه",
|
||||||
"element": "اِلمان",
|
"shapes": "اشکال",
|
||||||
"elements": "اِلمان ها",
|
|
||||||
"height": "ارتفاع",
|
"height": "ارتفاع",
|
||||||
"scene": "صحنه",
|
"scene": "صحنه",
|
||||||
"selected": "انتخاب شده",
|
"selected": "انتخاب شده",
|
||||||
"storage": "حافظه",
|
"storage": "حافظه",
|
||||||
"title": "آمار برای نردها",
|
"fullTitle": "ویژگیهای بوم و شکل",
|
||||||
|
"title": "ویژگیها",
|
||||||
|
"generalStats": "عمومی",
|
||||||
|
"elementProperties": "ویژگیهای شکل",
|
||||||
"total": "مجموع",
|
"total": "مجموع",
|
||||||
"version": "نسخه",
|
"version": "نسخه",
|
||||||
"versionCopy": "برای کپی کردن کلیک کنید",
|
"versionCopy": "برای کپی کردن کلیک کنید",
|
||||||
@@ -436,16 +524,18 @@
|
|||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"addedToLibrary": "به مجموعه اضافه شد",
|
"addedToLibrary": "به مجموعه اضافه شد",
|
||||||
"copyStyles": "کپی سبک.",
|
"copyStyles": "سبک کپی شد.",
|
||||||
"copyToClipboard": "در کلیپبورد کپی شد.",
|
"copyToClipboard": "در کلیپبورد کپی شد.",
|
||||||
"copyToClipboardAsPng": "کپی {{exportSelection}} در کلیپبورد به عنوان PNG\n({{exportColorScheme}})",
|
"copyToClipboardAsPng": "کپی {{exportSelection}} در حافظه موقت به عنوان PNG\n({{exportColorScheme}})",
|
||||||
|
"copyToClipboardAsSvg": "{{exportSelection}} در حافظه موقت به عنوان\n({{exportColorScheme}}) رونویسی شد",
|
||||||
"fileSaved": "فایل ذخیره شد.",
|
"fileSaved": "فایل ذخیره شد.",
|
||||||
"fileSavedToFilename": "ذخیره در {filename}",
|
"fileSavedToFilename": "ذخیره در {filename}",
|
||||||
"canvas": "بوم",
|
"canvas": "بوم",
|
||||||
"selection": "انتخاب",
|
"selection": "انتخاب",
|
||||||
"pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید",
|
"pasteAsSingleElement": "از {{shortcut}} برای چسباندن به عنوان یک عنصر استفاده کنید،\nیا در یک ویرایشگر متن موجود جایگذاری کنید",
|
||||||
"unableToEmbed": "",
|
"unableToEmbed": "قرار دادن این Url در حال حاضر مجاز نیست. درGitHub برای درخواست Url Whitelisted مشکلی ایجاد کنید",
|
||||||
"unrecognizedLinkFormat": ""
|
"unrecognizedLinkFormat": "پیوندی که افزودید با قالب مورد انتظار مطابقت ندارد. لطفاً سعی کنید رشته \"افزونه\" ارائه شده توسط سایت منبع را بچسبانید",
|
||||||
|
"elementLinkCopied": "لینک در کلیپبورد کپی شد"
|
||||||
},
|
},
|
||||||
"colors": {
|
"colors": {
|
||||||
"transparent": "شفاف",
|
"transparent": "شفاف",
|
||||||
@@ -478,48 +568,97 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"colorPicker": {
|
"colorPicker": {
|
||||||
"mostUsedCustomColors": "",
|
"color": "",
|
||||||
|
"mostUsedCustomColors": "رنگ های بهتازگی بهکار گرفته شده",
|
||||||
"colors": "رنگها",
|
"colors": "رنگها",
|
||||||
"shades": "جلوهها",
|
"shades": "جلوهها",
|
||||||
"hexCode": "کدِ هگز",
|
"hexCode": "کدِ هگز",
|
||||||
"noShades": ""
|
"noShades": "هیچ سایه ای برای این رنگ در دسترس نیست"
|
||||||
},
|
},
|
||||||
"overwriteConfirm": {
|
"overwriteConfirm": {
|
||||||
"action": {
|
"action": {
|
||||||
"exportToImage": {
|
"exportToImage": {
|
||||||
"title": "",
|
"title": "صادر کردن به عنوان تصاویر",
|
||||||
"button": "",
|
"button": "صادر کردن به عنوان تصاویر",
|
||||||
"description": ""
|
"description": "خروجی از داده های صحنه به عنوان تصویر که میتوانید بعدا بیافزایید."
|
||||||
},
|
},
|
||||||
"saveToDisk": {
|
"saveToDisk": {
|
||||||
"title": "ذخیره در دیسک",
|
"title": "ذخیره در دیسک",
|
||||||
"button": "ذخیره در دیسک",
|
"button": "ذخیره در دیسک",
|
||||||
"description": ""
|
"description": "خروجی از داده های صحنه را به عنوان فایل که بعدا می توانید بیافزایید."
|
||||||
},
|
},
|
||||||
"excalidrawPlus": {
|
"excalidrawPlus": {
|
||||||
"title": "",
|
"title": "Excalidraw+",
|
||||||
"button": "",
|
"button": "خروجی به Excalidraw+",
|
||||||
"description": ""
|
"description": "ذخیره صفحه در میز کار Excalidraw+."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"loadFromFile": {
|
"loadFromFile": {
|
||||||
"title": "بارگذاری از فایل",
|
"title": "بارگذاری از فایل",
|
||||||
"button": "بارگذاری از فایل",
|
"button": "بارگذاری از فایل",
|
||||||
"description": ""
|
"description": "بارگذاری از فایل <bold>جایگزین بشه با محتوای موجود</bold>.<br></br> می توانید ابتدا با استفاده از یکی از گزینه های زیر از نقاشی خود نسخه پشتیبان تهیه کنید."
|
||||||
},
|
},
|
||||||
"shareableLink": {
|
"shareableLink": {
|
||||||
"title": "",
|
"title": "بارگذاری از پیوند",
|
||||||
"button": "",
|
"button": "جایگزینی محتوای من",
|
||||||
"description": ""
|
"description": "بارگذاری از فایل <bold>جایگزین بشه با محتوای موجود</bold>.<br></br> می توانید ابتدا با استفاده از یکی از گزینه های زیر از نقاشی خود نسخه پشتیبان تهیه کنید."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mermaid": {
|
"mermaid": {
|
||||||
"title": "",
|
"title": "مرمید به excalidraw",
|
||||||
"button": "",
|
"button": "درج",
|
||||||
"description": "",
|
"description": "فعلا فقط <flowchartLink> فلوچارت </flowchartLink> ، <sequenceLink> توالی </sequenceLink> و <classLink> کلاس </classLink> نمودارها پشتیبانی می شوند. انواع دیگر به صورت تصویر در Excalidraw ارائه خواهند شد.",
|
||||||
"syntax": "",
|
"syntax": "مرمید syntax",
|
||||||
"preview": "پیشنمایش"
|
"preview": "پیشنمایش"
|
||||||
|
},
|
||||||
|
"quickSearch": {
|
||||||
|
"placeholder": "جستجو فوری"
|
||||||
|
},
|
||||||
|
"fontList": {
|
||||||
|
"badge": {
|
||||||
|
"old": "قدیمی"
|
||||||
|
},
|
||||||
|
"sceneFonts": "در این صحنه",
|
||||||
|
"availableFonts": "قلم های در دسترس",
|
||||||
|
"empty": "قلمی یافت نشد"
|
||||||
|
},
|
||||||
|
"userList": {
|
||||||
|
"empty": "کاربری یافت نشد",
|
||||||
|
"hint": {
|
||||||
|
"text": "روی کاربر بزنید تا دنبالش کنید",
|
||||||
|
"followStatus": "هماینک این کاربر را دنبال میکنید",
|
||||||
|
"inCall": "کاربر در تماسی صوتی است",
|
||||||
|
"micMuted": "میکروفون کاربر بیصدا است",
|
||||||
|
"isSpeaking": "کاربر در حال صحبت است"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commandPalette": {
|
||||||
|
"title": "تخته فرمانها",
|
||||||
|
"shortcuts": {
|
||||||
|
"select": "انتخاب",
|
||||||
|
"confirm": "تایید",
|
||||||
|
"close": "بستن"
|
||||||
|
},
|
||||||
|
"recents": "اخیراً استفاده شده",
|
||||||
|
"search": {
|
||||||
|
"placeholder": "در فهرستها و دستورها را جستجو کنید هم سنگهای پنهان را کشف کنید",
|
||||||
|
"noMatch": "دستوری یافت نشد..."
|
||||||
|
},
|
||||||
|
"itemNotAvailable": "دستور در دسترس نیست...",
|
||||||
|
"shortcutHint": "برای تخته دستور ها {{shortcut}} را بکار بگیرید"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ctrl": "",
|
||||||
|
"option": "",
|
||||||
|
"cmd": "",
|
||||||
|
"alt": "",
|
||||||
|
"escape": "",
|
||||||
|
"enter": "",
|
||||||
|
"shift": "",
|
||||||
|
"spacebar": "",
|
||||||
|
"delete": "",
|
||||||
|
"mmb": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user