From 1769711f779d667dbc7008eb9fe67ca5e9c69fef Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Fri, 29 May 2026 12:13:35 +0900 Subject: [PATCH 01/10] Characterization test safety net for the framework-independent core (#803) * test: characterization tests locking down the framework-independent core Adds 274 characterization tests across 12 core modules (parse pipeline, prepareChart delimiter/migration logic, theme conversion, sizing, and the export converters) to pin CURRENT behavior before a future framework migration. Tests capture actual output (not ideal output); ~23 likely bugs are documented in-place with // CHARACTERIZATION comments rather than fixed, so any future change to these behaviors fails loudly and becomes a deliberate decision. Suite: 8 -> 20 test suites, 32 -> 306 passing tests, 12 snapshots. Co-Authored-By: Claude Opus 4.8 (1M context) * test: add alignNodesVertically undo/redo + early-return coverage Mirrors the coverage its siblings (alignNodes, alignNodesHorizontally) already had, closing the one asymmetry the audit flagged. alignNodes is the foundation of the planned auto-layout-with-control work, so its baseline should be fully symmetric. Co-Authored-By: Claude Opus 4.8 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- ...ilityClasses.characterization.test.ts.snap | 285 ++++++++ ...toExcalidraw.characterization.test.ts.snap | 3 + ...toJSONCanvas.characterization.test.ts.snap | 40 ++ .../toTheme.characterization.test.ts.snap | 66 ++ .../toVisio.characterization.test.ts.snap | 17 + .../lib/alignNodes.characterization.test.ts | 423 ++++++++++++ ...tyleToString.characterization.test.ts.snap | 82 +++ .../cyStyleToString.characterization.test.ts | 160 +++++ .../lib/getElements.characterization.test.ts | 265 ++++++++ app/src/lib/getSize.characterization.test.ts | 491 ++++++++++++++ ...aphUtilityClasses.characterization.test.ts | 268 ++++++++ .../prepareChart.characterization.test.ts | 510 +++++++++++++++ .../preprocessStyle.characterization.test.ts | 297 +++++++++ .../lib/repairText.characterization.test.ts | 221 +++++++ .../lib/toExcalidraw.characterization.test.ts | 608 ++++++++++++++++++ .../lib/toJSONCanvas.characterization.test.ts | 423 ++++++++++++ app/src/lib/toTheme.characterization.test.ts | 408 ++++++++++++ app/src/lib/toVisio.characterization.test.ts | 283 ++++++++ 18 files changed, 4850 insertions(+) create mode 100644 app/src/lib/__snapshots__/graphUtilityClasses.characterization.test.ts.snap create mode 100644 app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap create mode 100644 app/src/lib/__snapshots__/toJSONCanvas.characterization.test.ts.snap create mode 100644 app/src/lib/__snapshots__/toTheme.characterization.test.ts.snap create mode 100644 app/src/lib/__snapshots__/toVisio.characterization.test.ts.snap create mode 100644 app/src/lib/alignNodes.characterization.test.ts create mode 100644 app/src/lib/cyStyleToString/__snapshots__/cyStyleToString.characterization.test.ts.snap create mode 100644 app/src/lib/cyStyleToString/cyStyleToString.characterization.test.ts create mode 100644 app/src/lib/getElements.characterization.test.ts create mode 100644 app/src/lib/getSize.characterization.test.ts create mode 100644 app/src/lib/graphUtilityClasses.characterization.test.ts create mode 100644 app/src/lib/prepareChart/prepareChart.characterization.test.ts create mode 100644 app/src/lib/preprocessStyle.characterization.test.ts create mode 100644 app/src/lib/repairText.characterization.test.ts create mode 100644 app/src/lib/toExcalidraw.characterization.test.ts create mode 100644 app/src/lib/toJSONCanvas.characterization.test.ts create mode 100644 app/src/lib/toTheme.characterization.test.ts create mode 100644 app/src/lib/toVisio.characterization.test.ts diff --git a/app/src/lib/__snapshots__/graphUtilityClasses.characterization.test.ts.snap b/app/src/lib/__snapshots__/graphUtilityClasses.characterization.test.ts.snap new file mode 100644 index 000000000..4b30cb8a2 --- /dev/null +++ b/app/src/lib/__snapshots__/graphUtilityClasses.characterization.test.ts.snap @@ -0,0 +1,285 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`graphUtilityClasses characterization childlessShapeClasses (module-load-time built array) snapshots the full 21-rule array including the appended iso-trapezoid 1`] = ` +Array [ + Object { + "css": Object { + "shape": "rectangle", + }, + "selector": ":childless.shape_rectangle", + }, + Object { + "css": Object { + "shape": "roundrectangle", + }, + "selector": ":childless.shape_roundrectangle", + }, + Object { + "css": Object { + "shape": "ellipse", + }, + "selector": ":childless.shape_ellipse", + }, + Object { + "css": Object { + "shape": "triangle", + }, + "selector": ":childless.shape_triangle", + }, + Object { + "css": Object { + "shape": "pentagon", + }, + "selector": ":childless.shape_pentagon", + }, + Object { + "css": Object { + "shape": "hexagon", + }, + "selector": ":childless.shape_hexagon", + }, + Object { + "css": Object { + "shape": "heptagon", + }, + "selector": ":childless.shape_heptagon", + }, + Object { + "css": Object { + "shape": "octagon", + }, + "selector": ":childless.shape_octagon", + }, + Object { + "css": Object { + "shape": "star", + }, + "selector": ":childless.shape_star", + }, + Object { + "css": Object { + "shape": "barrel", + }, + "selector": ":childless.shape_barrel", + }, + Object { + "css": Object { + "shape": "diamond", + }, + "selector": ":childless.shape_diamond", + }, + Object { + "css": Object { + "shape": "vee", + }, + "selector": ":childless.shape_vee", + }, + Object { + "css": Object { + "shape": "rhomboid", + }, + "selector": ":childless.shape_rhomboid", + }, + Object { + "css": Object { + "shape": "right-rhomboid", + }, + "selector": ":childless.shape_right-rhomboid", + }, + Object { + "css": Object { + "shape": "polygon", + }, + "selector": ":childless.shape_polygon", + }, + Object { + "css": Object { + "shape": "tag", + }, + "selector": ":childless.shape_tag", + }, + Object { + "css": Object { + "shape": "round-rectangle", + }, + "selector": ":childless.shape_round-rectangle", + }, + Object { + "css": Object { + "shape": "cut-rectangle", + }, + "selector": ":childless.shape_cut-rectangle", + }, + Object { + "css": Object { + "shape": "bottom-round-rectangle", + }, + "selector": ":childless.shape_bottom-round-rectangle", + }, + Object { + "css": Object { + "shape": "concave-hexagon", + }, + "selector": ":childless.shape_concave-hexagon", + }, + Object { + "css": Object { + "shape": "polygon", + "shape-polygon-points": "-1 1 1 1 0.5 -1 -0.5 -1", + }, + "selector": ":childless.shape_iso-trapezoid", + }, +] +`; + +exports[`graphUtilityClasses characterization createSmartChildlessBorderClasses(width) snapshots full output for a representative width 1`] = ` +Array [ + Object { + "css": Object { + "border-style": "none", + "border-width": 5, + }, + "selector": ":childless.border_none", + }, + Object { + "css": Object { + "border-style": "solid", + "border-width": 5, + }, + "selector": ":childless.border_solid", + }, + Object { + "css": Object { + "border-style": "dashed", + "border-width": 5, + }, + "selector": ":childless.border_dashed", + }, + Object { + "css": Object { + "border-style": "dotted", + "border-width": 5, + }, + "selector": ":childless.border_dotted", + }, + Object { + "css": Object { + "border-style": "double", + "border-width": 5, + }, + "selector": ":childless.border_double", + }, +] +`; + +exports[`graphUtilityClasses characterization createSmartShapeClasses(width) snapshots full output for a representative width 1`] = ` +Array [ + Object { + "css": Object { + "height": 30, + "shape": "rectangle", + "width": 30, + }, + "selector": ":childless.shape_square", + }, + Object { + "css": Object { + "height": 30, + "shape": "roundrectangle", + "width": 30, + }, + "selector": ":childless.shape_roundsquare", + }, + Object { + "css": Object { + "height": 30, + "shape": "ellipse", + "width": 30, + }, + "selector": ":childless.shape_circle", + }, + Object { + "css": Object { + "height": 30, + "shape": "star", + "width": 30, + }, + "selector": ":childless.shape_star", + }, + Object { + "css": Object { + "height": 30, + "shape": "diamond", + "width": 30, + }, + "selector": ":childless.shape_diamond", + }, + Object { + "css": Object { + "height": 30, + "shape": "pentagon", + "width": 30, + }, + "selector": ":childless.shape_pentagon", + }, + Object { + "css": Object { + "height": 30, + "shape": "hexagon", + "width": 30, + }, + "selector": ":childless.shape_hexagon", + }, + Object { + "css": Object { + "height": 30, + "shape": "heptagon", + "width": 30, + }, + "selector": ":childless.shape_heptagon", + }, + Object { + "css": Object { + "height": 30, + "shape": "octagon", + "width": 30, + }, + "selector": ":childless.shape_octagon", + }, +] +`; + +exports[`graphUtilityClasses characterization nodeBorderClasses (dead export, conflicting semantics) snapshots the 5-rule array 1`] = ` +Array [ + Object { + "css": Object { + "border-style": "solid", + }, + "selector": ":childless.border_solid", + }, + Object { + "css": Object { + "border-style": "dashed", + }, + "selector": ":childless.border_dashed", + }, + Object { + "css": Object { + "border-style": "dotted", + }, + "selector": ":childless.border_dotted", + }, + Object { + "css": Object { + "border-style": "double", + }, + "selector": ":childless.border_double", + }, + Object { + "css": Object { + "border-width": 0, + }, + "selector": ":childless.border_none", + }, +] +`; diff --git a/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap b/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap new file mode 100644 index 000000000..6791e7c9a --- /dev/null +++ b/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`toExcalidraw characterization referential integrity + determinism: with Math.random mocked, all bindings/containerIds resolve to real element ids and the full output is a stable snapshot 1`] = `"{\\"type\\":\\"excalidraw/clipboard\\",\\"elements\\":[{\\"id\\":\\"4g0gsldloh\\",\\"type\\":\\"diamond\\",\\"x\\":54,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g0xl978r5\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2srwht1w\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g0xl978r5\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"Start\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g0gsldloh\\",\\"originalText\\":\\"Start\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g1edx0vtu\\",\\"type\\":\\"rectangle\\",\\"x\\":234,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g1v6kuiwj\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2srwht1w\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g1v6kuiwj\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"End\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g1edx0vtu\\",\\"originalText\\":\\"End\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g2srwht1w\\",\\"type\\":\\"text\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1700487763161,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"go\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":20,\\"containerId\\":\\"4g2bz8o5z7\\",\\"originalText\\":\\"go\\",\\"lineHeight\\":1.2},{\\"id\\":\\"4g2bz8o5z7\\",\\"type\\":\\"arrow\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":2},\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698866637577,\\"link\\":null,\\"locked\\":false,\\"points\\":[[126,90],[234,90]],\\"lastCommittedPoint\\":null,\\"startBinding\\":{\\"elementId\\":\\"4g0gsldloh\\",\\"gap\\":4},\\"endBinding\\":{\\"elementId\\":\\"4g1edx0vtu\\",\\"gap\\":4},\\"startArrowhead\\":null,\\"endArrowhead\\":\\"triangle\\"}],\\"files\\":{}}"`; diff --git a/app/src/lib/__snapshots__/toJSONCanvas.characterization.test.ts.snap b/app/src/lib/__snapshots__/toJSONCanvas.characterization.test.ts.snap new file mode 100644 index 000000000..e81585c32 --- /dev/null +++ b/app/src/lib/__snapshots__/toJSONCanvas.characterization.test.ts.snap @@ -0,0 +1,40 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`toJSONCanvas characterization full structural snapshot for a representative two-node + edge graph 1`] = ` +Object { + "edges": Array [ + Object { + "fromEnd": undefined, + "fromNode": "a", + "fromSide": "right", + "id": "e", + "label": "goes to", + "toEnd": undefined, + "toNode": "b", + "toSide": "left", + }, + ], + "nodes": Array [ + Object { + "color": "#e3f2fd", + "height": 66, + "id": "a", + "text": "Start", + "type": "text", + "width": 86, + "x": 0, + "y": 0, + }, + Object { + "color": "#e3f2fd", + "height": 66, + "id": "b", + "text": "End", + "type": "text", + "width": 86, + "x": 200, + "y": 0, + }, + ], +} +`; diff --git a/app/src/lib/__snapshots__/toTheme.characterization.test.ts.snap b/app/src/lib/__snapshots__/toTheme.characterization.test.ts.snap new file mode 100644 index 000000000..857d02dc0 --- /dev/null +++ b/app/src/lib/__snapshots__/toTheme.characterization.test.ts.snap @@ -0,0 +1,66 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`toTheme - default theme (canonical baseline) produces stable layout + style + postStyle for the default-template theme (dagre/DOWN): default-layout 1`] = ` +Object { + "name": "dagre", + "rankDir": "TB", + "spacingFactor": 1.1, +} +`; + +exports[`toTheme - default theme (canonical baseline) produces stable layout + style + postStyle for the default-template theme (dagre/DOWN): default-postStyle 1`] = ` +"edge.border_dashed { line-style: dashed; } +edge.border_dotted { line-style: dotted; } +edge.border_solid { line-style: solid; } +:childless.shape_rectangle { shape: rectangle; } +:childless.shape_roundrectangle { shape: roundrectangle; } +:childless.shape_ellipse { shape: ellipse; } +:childless.shape_triangle { shape: triangle; } +:childless.shape_pentagon { shape: pentagon; } +:childless.shape_hexagon { shape: hexagon; } +:childless.shape_heptagon { shape: heptagon; } +:childless.shape_octagon { shape: octagon; } +:childless.shape_star { shape: star; } +:childless.shape_barrel { shape: barrel; } +:childless.shape_diamond { shape: diamond; } +:childless.shape_vee { shape: vee; } +:childless.shape_rhomboid { shape: rhomboid; } +:childless.shape_right-rhomboid { shape: right-rhomboid; } +:childless.shape_polygon { shape: polygon; } +:childless.shape_tag { shape: tag; } +:childless.shape_round-rectangle { shape: round-rectangle; } +:childless.shape_cut-rectangle { shape: cut-rectangle; } +:childless.shape_bottom-round-rectangle { shape: bottom-round-rectangle; } +:childless.shape_concave-hexagon { shape: concave-hexagon; } +:childless.shape_iso-trapezoid { shape: polygon; shape-polygon-points: -1 1 1 1 0.5 -1 -0.5 -1; } +:childless.border_none { border-width: 2; border-style: none; } +:childless.border_solid { border-width: 2; border-style: solid; } +:childless.border_dashed { border-width: 2; border-style: dashed; } +:childless.border_dotted { border-width: 2; border-style: dotted; } +:childless.border_double { border-width: 2; border-style: double; } +:childless.shape_square { shape: rectangle; width: 178; height: 178; } +:childless.shape_roundsquare { shape: roundrectangle; width: 178; height: 178; } +:childless.shape_circle { shape: ellipse; width: 178; height: 178; } +:childless.shape_star { shape: star; width: 178; height: 178; } +:childless.shape_diamond { shape: diamond; width: 178; height: 178; } +:childless.shape_pentagon { shape: pentagon; width: 178; height: 178; } +:childless.shape_hexagon { shape: hexagon; width: 178; height: 178; } +:childless.shape_heptagon { shape: heptagon; width: 178; height: 178; } +:childless.shape_octagon { shape: octagon; width: 178; height: 178; } +:childless[w] { width: data(width); } +:childless[h] { height: data(height); }" +`; + +exports[`toTheme - default theme (canonical baseline) produces stable layout + style + postStyle for the default-template theme (dagre/DOWN): default-style 1`] = ` +"@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500&display=swap'); +$width: 178px; +$height: 50px; + +$background: #ffffff; +:childless { shape: roundrectangle; label: data(label); text-valign: center; text-halign: center; text-wrap: wrap; text-max-width: 146px; width: 178; height: label; padding: 16; line-height: 1.3; font-family: \\"IBM Plex Sans\\"; background-color: #e6e6e6; color: #000000; border-width: 0; border-color: #000000; text-margin-y: 0; font-size: 16; } +edge { curve-style: bezier; source-arrow-shape: none; target-arrow-shape: triangle; source-arrow-color: #606ef6; target-arrow-color: #606ef6; line-color: #606ef6; text-background-color: #ffffff; text-background-opacity: 1; text-background-padding: 2; color: #606ef6; width: 2; font-size: 14; label: data(label); line-height: 1.3; font-family: \\"IBM Plex Sans\\"; source-distance-from-node: 0; target-distance-from-node: 0; arrow-scale: 1; text-rotation: none; } +:parent { padding: 10; border-style: solid; border-width: 2; border-color: #606ef6; background-color: #ffffff; text-valign: top; font-family: \\"IBM Plex Sans\\"; label: data(label); color: #000000; font-size: 24; text-margin-y: -5; } +:active { overlay-color: #000000; overlay-opacity: 0; } +:selected { opacity: 0.5; } +core { selection-box-color: #606ef6; selection-box-opacity: 0.25; selection-box-border-width: 0; active-bg-opacity: 0; }" +`; diff --git a/app/src/lib/__snapshots__/toVisio.characterization.test.ts.snap b/app/src/lib/__snapshots__/toVisio.characterization.test.ts.snap new file mode 100644 index 000000000..2d4ea709d --- /dev/null +++ b/app/src/lib/__snapshots__/toVisio.characterization.test.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`toVisioFlowchart — characterization node with 1 outgoing but multiple incoming is Process (not Decision/End) 1`] = ` +"\\"Process Step ID\\",\\"Process Step Description\\",\\"Next Step ID\\",\\"Connector Label\\",\\"Shape Type\\" +\\"n1\\",\\"a\\",\\"n3\\",\\"\\",\\"Start\\" +\\"n2\\",\\"b\\",\\"n3\\",\\"\\",\\"Start\\" +\\"n3\\",\\"c\\",\\"n4\\",\\"\\",\\"Process\\" +\\"n4\\",\\"d\\",\\"\\",\\"\\",\\"End\\"" +`; + +exports[`toVisioFlowchart — characterization node with incoming AND >1 outgoing is Decision 1`] = ` +"\\"Process Step ID\\",\\"Process Step Description\\",\\"Next Step ID\\",\\"Connector Label\\",\\"Shape Type\\" +\\"n1\\",\\"a\\",\\"n2\\",\\"b\\",\\"Start\\" +\\"n2\\",\\"b\\",\\"n3,n4\\",\\",\\",\\"Decision\\" +\\"n3\\",\\"c\\",\\"\\",\\"\\",\\"End\\" +\\"n4\\",\\"d\\",\\"\\",\\"\\",\\"End\\"" +`; diff --git a/app/src/lib/alignNodes.characterization.test.ts b/app/src/lib/alignNodes.characterization.test.ts new file mode 100644 index 000000000..0958d26a3 --- /dev/null +++ b/app/src/lib/alignNodes.characterization.test.ts @@ -0,0 +1,423 @@ +/** + * CHARACTERIZATION TESTS for alignNodes.ts + * + * These lock in the CURRENT behavior of the three node-alignment helpers + * (alignNodes, alignNodesHorizontally, alignNodesVertically) before a future + * framework / layout-control migration. They are a safety net, NOT a + * correctness audit. Where current behavior looks surprising or buggy it is + * pinned as-is and flagged with a CHARACTERIZATION comment. + * + * Note: none of these functions take input or return output. They read + * `useDoc.getState().meta.nodePositions` and write back via `useDoc.setState`, + * and push an action onto the module-level undo/redo stack in ./undoStack. + * So each test must SEED useDoc, call the fn, then READ useDoc. + */ + +import { NodePositions } from "../components/getNodePositionsFromCy"; +import { + alignNodes, + alignNodesHorizontally, + alignNodesVertically, +} from "./alignNodes"; +import { useDoc } from "./useDoc"; +import { canRedo, canUndo, redo, undo } from "./undoStack"; + +// Helpers to seed / read the store-backed input/output. +function seed(nodePositions: NodePositions | undefined, otherMeta = {}) { + useDoc.setState(() => ({ + meta: { ...otherMeta, ...(nodePositions ? { nodePositions } : {}) }, + })); +} + +function getPositions(): NodePositions | undefined { + return useDoc.getState().meta.nodePositions as NodePositions | undefined; +} + +// The undo/redo stacks are module-level singletons with no reset export. +// Drain both stacks before each test so length-based assertions are isolated. +function drainStacks() { + // redo() pops from redoStack; undo() pops from undoStack. Calling them does + // mutate useDoc, but we re-seed at the start of every test so that's fine. + while (canRedo()) redo(); + while (canUndo()) undo(); +} + +beforeEach(() => { + drainStacks(); + // Reset doc to a clean known state. + useDoc.setState(() => ({ meta: {} })); +}); + +describe("alignNodes (auto-align to nearest within threshold 40)", () => { + test("snaps x to nearest node within threshold; leaves y alone when y diff >= threshold", () => { + // A and B: x diff = 30 (< 40, snaps), y diff = 50 (>= 40, no snap) + seed({ + A: { x: 100, y: 0 }, + B: { x: 130, y: 50 }, + }); + + alignNodes(); + + const out = getPositions()!; + // A.x snaps to B.x (130); A.y stays (no neighbor within 40 on y) + expect(out.A).toEqual({ x: 130, y: 0 }); + // B.x snaps to A.x (100); B.y stays + expect(out.B).toEqual({ x: 100, y: 50 }); + }); + + test("x diff of exactly 40 does NOT snap (strict-less-than boundary at magic number 40)", () => { + // CHARACTERIZATION: threshold uses strict `< 40`. At exactly 40 no snap. + seed({ + A: { x: 0, y: 0 }, + B: { x: 40, y: 200 }, + }); + + alignNodes(); + + const out = getPositions()!; + // No snapping on either axis: positions unchanged. + expect(out.A).toEqual({ x: 0, y: 0 }); + expect(out.B).toEqual({ x: 40, y: 200 }); + }); + + test("x diff of 39 DOES snap (just under the boundary)", () => { + seed({ + A: { x: 0, y: 0 }, + B: { x: 39, y: 200 }, + }); + + alignNodes(); + + const out = getPositions()!; + expect(out.A).toEqual({ x: 39, y: 0 }); + expect(out.B).toEqual({ x: 0, y: 200 }); + }); + + test("x and y can snap to TWO DIFFERENT neighbors, producing a coordinate matching no existing node", () => { + // CHARACTERIZATION: per-axis nearest is computed independently. + // Target node T is near B on x and near C on y. + // B = {x:105, y:1000}, C = {x:9000, y:25}, T = {x:100, y:0} + // T.x diff to B = 5 (< 40) -> nearest x is B.x = 105 + // T.y diff to C = 25 (< 40) -> nearest y is C.y = 25 + // Result T = {x:105, y:25} which equals neither B nor C. + seed({ + T: { x: 100, y: 0 }, + B: { x: 105, y: 1000 }, + C: { x: 9000, y: 25 }, + }); + + alignNodes(); + + const out = getPositions()!; + expect(out.T).toEqual({ x: 105, y: 25 }); + }); + + test("comparisons read the ORIGINAL map (non-incremental) so a chain shifts predictably, not cascading", () => { + // CHARACTERIZATION: each node is compared against the ORIGINAL nodePositions + // map and results are written to a SEPARATE aligned map. So alignment is NOT + // applied incrementally / cascading. A naive refactor reading the in-progress + // map would change these outputs. + // A=100, C=120 are each 20 from B=110 (within threshold). B is 20 from A and + // 20 from C. Each computed independently from the originals. + seed({ + A: { x: 100, y: 0 }, + B: { x: 110, y: 1000 }, + C: { x: 120, y: 2000 }, + }); + + alignNodes(); + + const out = getPositions()!; + // A's nearest x: B(diff10) vs C(diff20) -> B(110). + expect(out.A.x).toBe(110); + // C's nearest x: B(diff10) vs A(diff20) -> B(110). + expect(out.C.x).toBe(110); + // B was compared against ORIGINAL A(100)/C(120), not the just-moved values. + // y diffs are huge so y is untouched for all. + expect(out.A.y).toBe(0); + expect(out.C.y).toBe(2000); + }); + + test("TIE-BREAK on nearest x is ORDER-DEPENDENT: first-encountered equal-distance neighbor wins (strict < on minDiff)", () => { + // CHARACTERIZATION + LIKELY SURPRISE: when two neighbors are EQUIDISTANT on + // an axis, the code keeps the FIRST one seen (uses `diff < minDiff`, strict). + // Iteration order = object insertion order, so output depends on key order. + // B=110 is equidistant from A=100 (10) and C=120 (10). + + // Insertion order A, C: A is seen before C -> B snaps to A.x. + seed({ + B: { x: 110, y: 0 }, + A: { x: 100, y: 1000 }, + C: { x: 120, y: 2000 }, + }); + alignNodes(); + expect(getPositions()!.B.x).toBe(100); + + // Reverse the order of the equidistant pair: C before A -> B snaps to C.x. + seed({ + B: { x: 110, y: 0 }, + C: { x: 120, y: 2000 }, + A: { x: 100, y: 1000 }, + }); + alignNodes(); + expect(getPositions()!.B.x).toBe(120); + }); + + test("node with no neighbor within threshold on either axis keeps BOTH original coordinates", () => { + seed({ + A: { x: 0, y: 0 }, + Far: { x: 5000, y: 5000 }, + }); + + alignNodes(); + + const out = getPositions()!; + expect(out.A).toEqual({ x: 0, y: 0 }); + expect(out.Far).toEqual({ x: 5000, y: 5000 }); + }); + + test("nearest x wins when multiple neighbors are within threshold", () => { + // A at x=100. B at x=130 (diff 30), C at x=110 (diff 10). C is nearest. + // y values far apart so only x snapping is in play for A. + seed({ + A: { x: 100, y: 0 }, + B: { x: 130, y: 1000 }, + C: { x: 110, y: 2000 }, + }); + + alignNodes(); + + const out = getPositions()!; + // A.x snaps to the nearest x neighbor, which is C (110). + expect(out.A.x).toBe(110); + expect(out.A.y).toBe(0); + }); + + test("early-return when meta.nodePositions is undefined: no setState change, no undo push", () => { + // Seed meta WITHOUT nodePositions. + useDoc.setState(() => ({ meta: { somethingElse: 123 } })); + const undoBefore = canUndo(); + const metaBefore = useDoc.getState().meta; + + alignNodes(); + + // Guard returns early: meta unchanged, no undo entry added. + expect(useDoc.getState().meta).toBe(metaBefore); + expect(canUndo()).toBe(undoBefore); + }); +}); + +describe("alignNodesHorizontally (sets a SHARED X = average; preserves each Y)", () => { + test("sets shared X = average of selected ids; Y preserved (despite 'Horizontally' name it makes a vertical column)", () => { + // CHARACTERIZATION: name is inverted vs intuition. It changes X. + seed({ + A: { x: 0, y: 10 }, + B: { x: 100, y: 20 }, + C: { x: 200, y: 30 }, + }); + + alignNodesHorizontally(["A", "B", "C"]); + + const out = getPositions()!; + const avgX = (0 + 100 + 200) / 3; // 100 + expect(out.A).toEqual({ x: avgX, y: 10 }); + expect(out.B).toEqual({ x: avgX, y: 20 }); + expect(out.C).toEqual({ x: avgX, y: 30 }); + }); + + test("ids not present in the map are ignored in BOTH the average and the write", () => { + // Pass a mix of existing + nonexistent ids; average excludes the missing. + seed({ + A: { x: 0, y: 10 }, + B: { x: 100, y: 20 }, + D: { x: 999, y: 999 }, // exists but NOT selected -> untouched + }); + + alignNodesHorizontally(["A", "B", "GHOST"]); + + const out = getPositions()!; + const avgX = (0 + 100) / 2; // 50, GHOST excluded + expect(out.A).toEqual({ x: avgX, y: 10 }); + expect(out.B).toEqual({ x: avgX, y: 20 }); + // Non-selected existing node is untouched. + expect(out.D).toEqual({ x: 999, y: 999 }); + // Ghost id is not added to the map. + expect(out.GHOST).toBeUndefined(); + }); + + test("zero matching ids: averageX fallback of 0 does NOT write x:0 onto any node (write loop skips missing ids)", () => { + // CHARACTERIZATION: divide-by-zero fallback (count===0 -> averageX=0) is + // effectively inert because the write loop only touches ids in the map. + seed({ + A: { x: 7, y: 8 }, + B: { x: 9, y: 10 }, + }); + + alignNodesHorizontally(["NOPE1", "NOPE2"]); + + const out = getPositions()!; + // Nothing zeroed: original positions intact. + expect(out.A).toEqual({ x: 7, y: 8 }); + expect(out.B).toEqual({ x: 9, y: 10 }); + }); + + test("early-return when nodePositions undefined: no undo push", () => { + useDoc.setState(() => ({ meta: {} })); + const undoBefore = canUndo(); + alignNodesHorizontally(["A"]); + expect(canUndo()).toBe(undoBefore); + }); +}); + +describe("alignNodesVertically (sets a SHARED Y = average; preserves each X)", () => { + test("sets shared Y = average of selected ids; X preserved (despite 'Vertically' name it makes a horizontal row)", () => { + // CHARACTERIZATION: name is inverted vs intuition. It changes Y. + seed({ + A: { x: 10, y: 0 }, + B: { x: 20, y: 100 }, + C: { x: 30, y: 200 }, + }); + + alignNodesVertically(["A", "B", "C"]); + + const out = getPositions()!; + const avgY = (0 + 100 + 200) / 3; // 100 + expect(out.A).toEqual({ x: 10, y: avgY }); + expect(out.B).toEqual({ x: 20, y: avgY }); + expect(out.C).toEqual({ x: 30, y: avgY }); + }); + + test("ids not present in the map are ignored in BOTH the average and the write", () => { + seed({ + A: { x: 10, y: 0 }, + B: { x: 20, y: 100 }, + D: { x: 999, y: 999 }, + }); + + alignNodesVertically(["A", "B", "GHOST"]); + + const out = getPositions()!; + const avgY = (0 + 100) / 2; // 50 + expect(out.A).toEqual({ x: 10, y: avgY }); + expect(out.B).toEqual({ x: 20, y: avgY }); + expect(out.D).toEqual({ x: 999, y: 999 }); + expect(out.GHOST).toBeUndefined(); + }); + + test("zero matching ids: averageY fallback of 0 does NOT write y:0 onto any node", () => { + seed({ + A: { x: 7, y: 8 }, + B: { x: 9, y: 10 }, + }); + + alignNodesVertically(["NOPE"]); + + const out = getPositions()!; + expect(out.A).toEqual({ x: 7, y: 8 }); + expect(out.B).toEqual({ x: 9, y: 10 }); + }); + + test("early-return when nodePositions undefined: no undo push", () => { + useDoc.setState(() => ({ meta: {} })); + const undoBefore = canUndo(); + alignNodesVertically(["A"]); + expect(canUndo()).toBe(undoBefore); + }); +}); + +describe("undo / redo round-trip (guards the shallow-copy of originalPositions)", () => { + test("alignNodes: undo() restores exact original coordinates; redo() re-applies aligned", () => { + const original: NodePositions = { + A: { x: 100, y: 0 }, + B: { x: 130, y: 5 }, + }; + seed(original); + + alignNodes(); + const aligned = getPositions()!; + // Sanity: something actually moved. + expect(aligned.A).not.toEqual(original.A); + + undo(); + const afterUndo = getPositions()!; + expect(afterUndo.A).toEqual({ x: 100, y: 0 }); + expect(afterUndo.B).toEqual({ x: 130, y: 5 }); + + redo(); + const afterRedo = getPositions()!; + expect(afterRedo.A).toEqual(aligned.A); + expect(afterRedo.B).toEqual(aligned.B); + }); + + test("alignNodesHorizontally: undo() restores original X values", () => { + seed({ + A: { x: 0, y: 1 }, + B: { x: 200, y: 2 }, + }); + + alignNodesHorizontally(["A", "B"]); + expect(getPositions()!.A.x).toBe(100); + + undo(); + const afterUndo = getPositions()!; + expect(afterUndo.A).toEqual({ x: 0, y: 1 }); + expect(afterUndo.B).toEqual({ x: 200, y: 2 }); + }); + + test("alignNodesVertically: undo() restores original Y values; redo() re-applies", () => { + seed({ + A: { x: 1, y: 0 }, + B: { x: 2, y: 200 }, + }); + + alignNodesVertically(["A", "B"]); + expect(getPositions()!.A.y).toBe(100); // avg of 0 and 200 + + undo(); + const afterUndo = getPositions()!; + expect(afterUndo.A).toEqual({ x: 1, y: 0 }); + expect(afterUndo.B).toEqual({ x: 2, y: 200 }); + + redo(); + const afterRedo = getPositions()!; + expect(afterRedo.A).toEqual({ x: 1, y: 100 }); + expect(afterRedo.B).toEqual({ x: 2, y: 100 }); + }); +}); + +describe("undo-stack pollution: even a NO-OP align pushes an undo entry and clears redo", () => { + test("a no-op alignNodes still pushes undo and wipes redo history (customer-visible landmine)", () => { + // CHARACTERIZATION: align functions ALWAYS setState + push undo, even when + // nothing changes. A no-op align therefore destroys redo history. + + // 1. Do a real align so there's something to undo, then undo it so redo is + // available. + seed({ A: { x: 100, y: 0 }, B: { x: 130, y: 5 } }); + alignNodes(); + undo(); + expect(canRedo()).toBe(true); + + // 2. Now perform a NO-OP align (nodes far apart on both axes -> nothing + // snaps). It still pushes an undo entry AND clears the redo stack. + seed({ A: { x: 0, y: 0 }, Far: { x: 9000, y: 9000 } }); + const undoCountBefore = canUndo(); + alignNodes(); + + // redo history wiped by the no-op. + expect(canRedo()).toBe(false); + // an undo entry exists from the no-op. + expect(canUndo()).toBe(true); + expect(undoCountBefore).toBe(false); // pre-condition: after the undo above, undo stack was empty + }); + + test("alignNodesHorizontally with a single id is a no-op-on-position but still pushes an undo entry", () => { + seed({ A: { x: 50, y: 7 }, B: { x: 999, y: 8 } }); + // Single id -> averageX = its own x -> A unchanged. + alignNodesHorizontally(["A"]); + + const out = getPositions()!; + expect(out.A).toEqual({ x: 50, y: 7 }); // unchanged + // But an undo entry was still pushed. + expect(canUndo()).toBe(true); + }); +}); diff --git a/app/src/lib/cyStyleToString/__snapshots__/cyStyleToString.characterization.test.ts.snap b/app/src/lib/cyStyleToString/__snapshots__/cyStyleToString.characterization.test.ts.snap new file mode 100644 index 000000000..9951a5e65 --- /dev/null +++ b/app/src/lib/cyStyleToString/__snapshots__/cyStyleToString.characterization.test.ts.snap @@ -0,0 +1,82 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`cyStyleToString characterization full fixture.json exact snapshot 1`] = ` +":parent { shape: rectangle; background-color: rgb(238,238,238); padding: 10px; border-color: rgb(204,204,204); border-width: 1px; text-valign: top; text-halign: center; text-margin-y: -6px; text-wrap: none; color: rgb(0,0,0); } +edge { width: 0.75px; font-size: 10px; loop-direction: 0deg; loop-sweep: 20deg; text-background-opacity: 1; text-background-color: rgb(255,255,255); text-background-padding: 3px; line-color: rgb(0,0,0); target-arrow-color: rgb(0,0,0); source-arrow-color: rgb(0,0,0); target-arrow-shape: triangle; arrow-scale: 1; curve-style: bezier; label: data(label); color: rgb(0,0,0); text-valign: center; text-wrap: wrap; font-family: Karla; text-halign: center; text-rotation: autorotate; target-distance-from-node: 1px; source-distance-from-node: 0px; } +:loop { curve-style: bezier; } +edge:compound { curve-style: bezier; source-endpoint: outside-to-line; target-endpoint: outside-to-line; } +:selected { background-color: rgb(1,105,217); line-color: rgb(1,105,217); source-arrow-color: rgb(1,105,217); mid-source-arrow-color: rgb(1,105,217); target-arrow-color: rgb(1,105,217); mid-target-arrow-color: rgb(1,105,217); } +:parent:selected { background-color: rgb(204,225,249); border-color: rgb(174,200,229); } +:active { overlay-padding: 10px; overlay-color: rgb(0,0,0); overlay-opacity: 0.25; } +.nodeHovered, .edgeHovered, node:selected { underlay-opacity: 0.1; underlay-color: rgb(0,0,0); underlay-padding: 5px; } +node { font-size: 10px; font-family: Karla; background-color: rgb(255,255,255); border-color: rgb(0,0,0); color: rgb(0,0,0); label: data(label); text-wrap: wrap; text-max-width: data(width); padding: 6px; text-valign: center; text-halign: center; border-width: 0.75px; shape: rectangle; line-height: 1.25; } +node[label!=''] { width: data(shapeWidth); height: data(shapeHeight); text-margin-y: data(textMarginY); text-margin-x: data(textMarginX); } +node.black { background-color: rgb(0,0,0); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(255,255,255); } +node.white { background-color: rgb(255,255,255); background-opacity: 1; border-color: rgb(255,255,255); color: rgb(0,0,0); } +node.green { background-color: rgb(1,216,87); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +node.yellow { background-color: rgb(255,207,13); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +node.blue { background-color: rgb(97,114,249); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(255,255,255); } +node.orange { background-color: rgb(255,112,68); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +node.purple { background-color: rgb(164,146,255); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +node.red { background-color: rgb(250,35,35); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +node.gray { background-color: rgb(170,170,170); background-opacity: 1; border-color: rgb(0,0,0); color: rgb(0,0,0); } +.rectangle { shape: rectangle; } +.roundrectangle { shape: roundrectangle; } +.ellipse { shape: ellipse; } +.triangle { shape: triangle; } +.pentagon { shape: pentagon; } +.hexagon { shape: hexagon; } +.heptagon { shape: heptagon; } +.octagon { shape: octagon; } +.star { shape: star; } +.barrel { shape: barrel; } +.diamond { shape: diamond; } +.vee { shape: vee; } +.rhomboid { shape: rhomboid; } +.right-rhomboid { shape: right-rhomboid; } +.polygon { shape: polygon; } +.tag { shape: tag; } +.round-rectangle { shape: round-rectangle; } +.cut-rectangle { shape: cut-rectangle; } +.bottom-round-rectangle { shape: bottom-round-rectangle; } +.concave-hexagon { shape: concave-hexagon; } +.circle { shape: ellipse; height: data(width); } +edge.dashed { line-style: dashed; } +edge.dotted { line-style: dotted; } +edge.solid { line-style: solid; } +edge.source-triangle { source-arrow-shape: triangle; } +edge.target-triangle { target-arrow-shape: triangle; } +edge.source-triangle-tee { source-arrow-shape: triangle-tee; } +edge.target-triangle-tee { target-arrow-shape: triangle-tee; } +edge.source-circle-triangle { source-arrow-shape: circle-triangle; } +edge.target-circle-triangle { target-arrow-shape: circle-triangle; } +edge.source-triangle-cross { source-arrow-shape: triangle-cross; } +edge.target-triangle-cross { target-arrow-shape: triangle-cross; } +edge.source-triangle-backcurve { source-arrow-shape: triangle-backcurve; } +edge.target-triangle-backcurve { target-arrow-shape: triangle-backcurve; } +edge.source-vee { source-arrow-shape: vee; } +edge.target-vee { target-arrow-shape: vee; } +edge.source-tee { source-arrow-shape: tee; } +edge.target-tee { target-arrow-shape: tee; } +edge.source-square { source-arrow-shape: square; } +edge.target-square { target-arrow-shape: square; } +edge.source-circle { source-arrow-shape: circle; } +edge.target-circle { target-arrow-shape: circle; } +edge.source-diamond { source-arrow-shape: diamond; } +edge.target-diamond { target-arrow-shape: diamond; } +edge.source-chevron { source-arrow-shape: chevron; } +edge.target-chevron { target-arrow-shape: chevron; } +edge.source-none { source-arrow-shape: none; } +edge.target-none { target-arrow-shape: none; } +node.border-solid { border-style: solid; } +node.border-dashed { border-style: dashed; } +node.border-dotted { border-style: dotted; } +node.border-double { border-style: double; } +node.border-none { border-width: 0px; } +.text-sm { font-size: 7.5px; } +.text-lg { font-size: 15px; } +.text-xl { font-size: 20px; } +node[w] { width: data(w); } +node[h] { height: data(h); } +node[src] { background-image: data(src); background-fit: cover; border-width: 0px; text-valign: bottom; text-margin-y: 5px; }" +`; diff --git a/app/src/lib/cyStyleToString/cyStyleToString.characterization.test.ts b/app/src/lib/cyStyleToString/cyStyleToString.characterization.test.ts new file mode 100644 index 000000000..b7cbc7bcf --- /dev/null +++ b/app/src/lib/cyStyleToString/cyStyleToString.characterization.test.ts @@ -0,0 +1,160 @@ +import { cyStyleToString } from "./cyStyleToString"; +import fixture from "./fixture.json"; + +// Characterization tests for cyStyleToString. +// These lock in the CURRENT serialization behavior (exact strings, ordering, +// merge semantics, and edge-case handling) ahead of a future framework +// migration. They assert ACTUAL output, not ideal output. + +// Helper to build a minimally-typed Style declaration. The real input shape +// comes from cytoscape's cy.style().json(); only selector.inputText and +// properties[].name / .strValue are read by the module. +function decl(inputText: string, properties: any): any { + return { + selector: { inputText }, + properties, + index: 0, + }; +} + +describe("cyStyleToString characterization", () => { + test("empty array input returns empty string", () => { + expect(cyStyleToString([] as any)).toBe(""); + }); + + test("single selector with single property formats as `sel { name: value; }`", () => { + // Pins exact spacing: space inside braces, semicolon after value, + // no trailing newline. + const result = cyStyleToString([ + decl("node", [{ name: "color", strValue: "red" }]), + ]); + expect(result).toBe("node { color: red; }"); + }); + + test("declaration with properties:null is skipped entirely", () => { + const result = cyStyleToString([ + decl("node", null), + decl("edge", [{ name: "width", strValue: "1px" }]), + ]); + // The null-properties declaration produces no block at all. + expect(result).toBe("edge { width: 1px; }"); + }); + + test("declaration with properties:undefined is skipped entirely", () => { + const result = cyStyleToString([ + decl("node", undefined), + decl("edge", [{ name: "width", strValue: "1px" }]), + ]); + expect(result).toBe("edge { width: 1px; }"); + }); + + test("declaration with properties:[] (empty array) emits `sel { }` and is NOT skipped", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // An empty array is truthy, so the guard `if (!properties) continue;` + // does not skip it. It serializes to selector + space + "{ " + "" + " }", + // i.e. two spaces between the braces. + const result = cyStyleToString([decl("node", [])]); + expect(result).toBe("node { }"); + }); + + test("duplicate selector merges differing properties in first-seen order at first occurrence position", () => { + // The merged block stays at the FIRST occurrence's position, and property + // order follows first-seen key insertion order across all merged decls. + const result = cyStyleToString([ + decl("node", [{ name: "color", strValue: "red" }]), + decl("edge", [{ name: "width", strValue: "1px" }]), + decl("node", [{ name: "shape", strValue: "ellipse" }]), + ]); + expect(result).toBe( + "node { color: red; shape: ellipse; }\nedge { width: 1px; }" + ); + }); + + test("duplicate selector with same property name: later declaration overrides earlier (last-write-wins)", () => { + // The most migration-fragile path. Spread order means the later + // declaration's value wins, but the key keeps its first-seen position. + const result = cyStyleToString([ + decl("node", [{ name: "color", strValue: "red" }]), + decl("node", [{ name: "color", strValue: "blue" }]), + ]); + expect(result).toBe("node { color: blue; }"); + }); + + test("uses strValue and ignores value/pfValue/units/mapped/mappedProperties", () => { + // Construct a declaration where value/pfValue differ from strValue, with a + // populated mappedProperties array. Only strValue must survive. + const result = cyStyleToString([ + { + selector: { inputText: "node" }, + properties: [ + { + name: "background-color", + value: [238, 238, 238], + strValue: "rgb(238,238,238)", + pfValue: [238, 238, 238], + units: null, + mapped: { mapping: false, regex: "" }, + }, + ], + mappedProperties: [ + { name: "label", strValue: "SHOULD_NOT_APPEAR", value: null }, + ], + index: 0, + } as any, + ]); + expect(result).toBe("node { background-color: rgb(238,238,238); }"); + expect(result).not.toContain("SHOULD_NOT_APPEAR"); + expect(result).not.toContain("238,238,238,238"); // value array not joined in + }); + + test("mapped/data() property passes through verbatim via strValue", () => { + const result = cyStyleToString([ + decl("node", [ + { name: "label", strValue: "data(label)" }, + { name: "text-max-width", strValue: "data(width)" }, + ]), + ]); + expect(result).toBe( + "node { label: data(label); text-max-width: data(width); }" + ); + }); + + test("multiple selectors preserve insertion order, joined by single newline with no trailing newline", () => { + const result = cyStyleToString([ + decl("a", [{ name: "p1", strValue: "v1" }]), + decl("b", [{ name: "p2", strValue: "v2" }]), + decl("c", [{ name: "p3", strValue: "v3" }]), + ]); + expect(result).toBe("a { p1: v1; }\nb { p2: v2; }\nc { p3: v3; }"); + expect(result.endsWith("\n")).toBe(false); + expect(result.split("\n")).toHaveLength(3); + }); + + test("multiple properties within one selector are joined by single space", () => { + const result = cyStyleToString([ + decl("node", [ + { name: "color", strValue: "red" }, + { name: "shape", strValue: "ellipse" }, + { name: "width", strValue: "10px" }, + ]), + ]); + expect(result).toBe("node { color: red; shape: ellipse; width: 10px; }"); + }); + + test("values are concatenated verbatim with no escaping", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // No sanitization: a value containing a semicolon or brace is emitted + // as-is, which would corrupt downstream CSS. Locks the no-escaping contract. + const result = cyStyleToString([ + decl("node", [{ name: "content", strValue: "a; color: red } evil" }]), + ]); + expect(result).toBe("node { content: a; color: red } evil; }"); + }); + + test("full fixture.json exact snapshot", () => { + // Real-world end-to-end lock (84-entry cytoscape stylesheet). Mirrors the + // existing inline-string test but as a snapshot baseline. Exercises the + // duplicate-selector merge path (:parent, edge, node) and data() mappings. + expect(cyStyleToString(fixture as any)).toMatchSnapshot(); + }); +}); diff --git a/app/src/lib/getElements.characterization.test.ts b/app/src/lib/getElements.characterization.test.ts new file mode 100644 index 000000000..4a901a5f8 --- /dev/null +++ b/app/src/lib/getElements.characterization.test.ts @@ -0,0 +1,265 @@ +import cytoscape from "cytoscape"; + +import { getElements } from "./getElements"; + +/** + * CHARACTERIZATION TESTS for getElements (core pipeline entry). + * + * These lock down the CURRENT behavior of getElements (text -> Cytoscape + * ElementDefinition[]) before a future framework migration. They assert what + * the code actually does today, not what it ideally should do. + * + * Environment note: getSize() depends on a DOM element with id="resizer" plus a + * zustand font store. In jsdom (this test env) there is no #resizer by default, + * so getSize() returns the string-literal sizes { width: "label", height: + * "label" }. Most cases below therefore assert "label", NOT measured pixels. + * One case injects a #resizer to characterize the measured-size path. + */ + +// Helpers to split the heterogeneous element list. +const nodes = (els: ReturnType) => + els.filter((e) => !("source" in (e.data as any))); +const edges = (els: ReturnType) => + els.filter((e) => "source" in (e.data as any)); + +describe("getElements characterization", () => { + it("empty string returns []", () => { + expect(getElements("")).toEqual([]); + }); + + it("whitespace-only string returns [] (no phantom nodes)", () => { + expect(getElements(" \n \n")).toEqual([]); + }); + + it("simple 3-level nesting produces 3 nodes + 2 edges with stable ids", () => { + const els = getElements("A\n B\n C"); + const ns = nodes(els); + const es = edges(els); + + expect(ns.map((n) => n.data.id)).toEqual(["n1", "n2", "n3"]); + expect(es.map((e) => e.data.id)).toEqual(["n1-n2-1", "n2-n3-1"]); + expect(es.map((e) => [e.data.source, e.data.target])).toEqual([ + ["n1", "n2"], + ["n2", "n3"], + ]); + // node labels survive + expect(ns.map((n) => n.data.label)).toEqual(["A", "B", "C"]); + }); + + it("nodes carry in_degree/out_degree matching their edges (A->B->C)", () => { + const els = getElements("A\n B\n C"); + const byLabel = (label: string) => + nodes(els).find((n) => n.data.label === label)!.data as any; + + // root: no incoming, one outgoing + expect(byLabel("A").in_degree).toBe(0); + expect(byLabel("A").out_degree).toBe(1); + // middle: one in, one out + expect(byLabel("B").in_degree).toBe(1); + expect(byLabel("B").out_degree).toBe(1); + // leaf: one in, none out + expect(byLabel("C").in_degree).toBe(1); + expect(byLabel("C").out_degree).toBe(0); + }); + + it("self-loops are counted in BOTH in_degree and out_degree (and parallel self-loops inflate counts)", () => { + // Two self-loops on A: "A #a" with two "(#a)" children. + const els = getElements("A #a\n (#a)\n (#a)"); + const ns = nodes(els); + const es = edges(els); + + // node A has id "a" (explicit id) + expect(ns).toHaveLength(1); + const a = ns[0].data as any; + + // two self-loop edges produced, distinct ids + expect(es.map((e) => e.data.id)).toEqual(["a-a-1", "a-a-2"]); + es.forEach((e) => { + expect(e.data.source).toBe("a"); + expect(e.data.target).toBe("a"); + }); + + // CHARACTERIZATION: each self-loop counts once toward in_degree and once + // toward out_degree, and parallel duplicates are NOT de-duplicated. + expect(a.in_degree).toBe(2); + expect(a.out_degree).toBe(2); + }); + + it("parallel edges (A->B twice) inflate degree counts", () => { + const els = getElements("A #a\nB #b\n(#a)\n (#b)\n(#a)\n (#b)"); + const es = edges(els); + expect(es.map((e) => e.data.id)).toEqual(["a-b-1", "a-b-2"]); + + const byLabel = (label: string) => + nodes(els).find((n) => n.data.label === label)!.data as any; + expect(byLabel("A").out_degree).toBe(2); + expect(byLabel("A").in_degree).toBe(0); + expect(byLabel("B").in_degree).toBe(2); + expect(byLabel("B").out_degree).toBe(0); + }); + + it("classes are attached and parsed; parser emits a leading space; only the FIRST .class is kept", () => { + const els = getElements("Hello .color_blue .shape_diamond"); + const n = nodes(els)[0]; + + // CHARACTERIZATION: graph-selector 0.13.0 returns classes as a single string + // with a LEADING SPACE, and in this multi-class form it keeps ONLY the first + // class (".shape_diamond" is dropped). getElements does not normalize this. + // This may be a parser quirk/bug but is the current behavior. + expect(n.classes).toBe(" color_blue"); + // node still gets sizing/degree augmentation + expect((n.data as any).in_degree).toBe(0); + expect((n.data as any).out_degree).toBe(0); + // jsdom: no #resizer -> label fallback + expect((n.data as any).width).toBe("label"); + expect((n.data as any).height).toBe("label"); + }); + + it("edge label is preserved (DSL 'goes to: B' yields edge label 'goes to')", () => { + const els = getElements("A\n goes to: B"); + const es = edges(els); + expect(es).toHaveLength(1); + expect(es[0].data.label).toBe("goes to"); + // child node label is the text after the colon + expect(nodes(els).map((n) => n.data.label)).toEqual(["A", "B"]); + }); + + it("edges pass through getElements unchanged (returned by reference, no style/degree added)", () => { + const els = getElements("A\n B"); + const edge = edges(els)[0]; + // CHARACTERIZATION: edges are NOT augmented; they have no style/in_degree/out_degree + expect(edge).not.toHaveProperty("style"); + expect(edge.data).not.toHaveProperty("in_degree"); + expect(edge.data).not.toHaveProperty("out_degree"); + expect(edge.data).not.toHaveProperty("width"); + }); + + it("pointer/reference (#id) creates an edge to the referenced node, not a new node", () => { + // "B" then "(#a)" nested under it -> edge from B to A. A is NOT duplicated. + const els = getElements("A #a\nB\n (#a)"); + const ns = nodes(els); + const es = edges(els); + + expect(ns.map((n) => n.data.id)).toEqual(["a", "n2"]); + expect(es).toHaveLength(1); + expect([es[0].data.source, es[0].data.target]).toEqual(["n2", "a"]); + }); + + describe("[w]/[h] data attribute sizing (LANDMINE, backward-compat path)", () => { + it("node with [w] and [h] uses attribute sizing and sets style['text-max-width']", () => { + // NOTE: a SPACE before the bracket is required for attribute parsing. + const els = getElements("Node [w=200] [h=50]"); + const n = nodes(els)[0] as any; + + expect(n.data.width).toBe(200); + expect(n.data.height).toBe(50); + // text-max-width is seeded from w + expect(n.style["text-max-width"]).toBe(200); + // raw attributes are retained on data + expect(n.data.w).toBe(200); + expect(n.data.h).toBe(50); + }); + + it("node with only [w] sets width + text-max-width, leaves height as 'label'", () => { + const els = getElements("Node [w=200]"); + const n = nodes(els)[0] as any; + + expect(n.data.width).toBe(200); + // h absent -> height stays the literal 'label' seed + expect(n.data.height).toBe("label"); + expect(n.style["text-max-width"]).toBe(200); + }); + + it("'Node[w=200]' WITHOUT a space is treated as literal label text (no attribute parsing)", () => { + const els = getElements("Node[w=200]"); + const n = nodes(els)[0] as any; + + // CHARACTERIZATION: no space => whole thing is the label, no w/h, label fallback sizing + expect(n.data.label).toBe("Node[w=200]"); + expect(n.data).not.toHaveProperty("w"); + expect(n.data.width).toBe("label"); + expect(n.style).toEqual({}); + }); + }); + + it("duplicate explicit node id throws a ParseError that propagates (not caught)", () => { + // CHARACTERIZATION: getElements has no try/catch. The Graph.tsx error UI + // depends on this throw-not-catch contract (it checks e.name === 'ParseError'). + let thrown: any; + try { + getElements("A #x\nB #x"); + } catch (e) { + thrown = e; + } + expect(thrown).toBeDefined(); + expect(thrown.name).toBe("ParseError"); + }); + + describe("lenient inputs do NOT throw (best-effort parse, backward-compat)", () => { + it("over-indent jump (0 -> 6 spaces) parses without error", () => { + expect(() => getElements("A\n B")).not.toThrow(); + const els = getElements("A\n B"); + // over-indented child still attaches to nearest valid ancestor + expect(edges(els)).toHaveLength(1); + expect([edges(els)[0].data.source, edges(els)[0].data.target]).toEqual([ + "n1", + "n2", + ]); + }); + + it("dangling pointer to a non-existent node parses without error (no edge)", () => { + expect(() => getElements("A\n(DoesNotExist)")).not.toThrow(); + const els = getElements("A\n(DoesNotExist)"); + expect(nodes(els)).toHaveLength(1); + expect(edges(els)).toHaveLength(0); + }); + + it("unclosed bracket parses without error", () => { + expect(() => getElements("A [")).not.toThrow(); + const els = getElements("A ["); + expect(nodes(els)).toHaveLength(1); + }); + + it("tab indentation parses without error and creates an edge", () => { + expect(() => getElements("A\n\tB")).not.toThrow(); + const els = getElements("A\n\tB"); + expect(edges(els)).toHaveLength(1); + }); + }); + + describe("environment-dependent sizing via #resizer", () => { + it("plain node falls back to width:'label'/height:'label' when no #resizer exists (jsdom default)", () => { + const els = getElements("Hello"); + const n = nodes(els)[0] as any; + expect(n.data.width).toBe("label"); + expect(n.data.height).toBe("label"); + // CHARACTERIZATION: no measured numeric sizes in jsdom + }); + + it("with a #resizer present, the measured-size branch is taken but THROWS in jsdom (Range.getClientRects unsupported)", () => { + const resizer = document.createElement("div"); + resizer.id = "resizer"; + // getSize sets textContent, so resizer.firstChild exists -> it enters the + // measured branch which calls range.getClientRects(). + document.body.appendChild(resizer); + try { + // CHARACTERIZATION: jsdom does not implement Range.getClientRects, so the + // measured-size path throws here. In a real browser this branch returns + // numeric width/height/shapeWidth/etc. We pin that the path is reached + // (i.e. #resizer flips behavior away from the 'label' fallback) and that + // it currently throws under jsdom rather than degrading gracefully. + expect(() => getElements("Hello")).toThrow(/getClientRects/); + } finally { + document.body.removeChild(resizer); + } + }); + }); + + it("output is accepted by a headless cytoscape instance (smoke check)", () => { + const els = getElements("A\n B\n C"); + const cy = cytoscape({ headless: true, elements: els as any }); + expect(cy.nodes().length).toBe(3); + expect(cy.edges().length).toBe(2); + cy.destroy(); + }); +}); diff --git a/app/src/lib/getSize.characterization.test.ts b/app/src/lib/getSize.characterization.test.ts new file mode 100644 index 000000000..c1b9344b6 --- /dev/null +++ b/app/src/lib/getSize.characterization.test.ts @@ -0,0 +1,491 @@ +/** + * CHARACTERIZATION TESTS for getSize.ts + * + * Goal: lock down CURRENT behavior of node-sizing math + text-size classes + * before a future framework migration. These tests assert ACTUAL output + * (possibly buggy), not ideal output. + * + * Environment note: these run under jsdom (CRA default test env). jsdom does + * NOT implement real text layout — Range.getClientRects() returns an empty + * list (=> measured width 0) and element.clientHeight returns 0. So in the + * "normal" measured path the returned width/height are 0 and shape multipliers + * multiply 0 (=> 0). We therefore pin: + * - the exact RETURN SHAPE (keys present) for each branch, + * - the resizer's written `style` string, which faithfully captures the + * observable math (getWidth max-width, MAGIC_SCALAR, fontSize parsing, + * text-size scalar precedence, and preventCyRenderingBugs substitution). + * The genuine pixel measurement (getClientRects) needs a real layout engine + * and is out of scope for jsdom; documented in notes. + */ + +import { getSize, fontSizeScalars } from "./getSize"; +import { useProcessStyleStore } from "./preprocessStyle"; + +// Save/restore the zustand store's fontData around each test. +const ORIGINAL_FONT_DATA = useProcessStyleStore.getState().fontData; + +function setFontData(fontData: Record) { + useProcessStyleStore.setState({ fontData: fontData as any }); +} + +function ensureResizer(): HTMLElement { + let el = document.getElementById("resizer"); + if (!el) { + el = document.createElement("div"); + el.id = "resizer"; + document.body.appendChild(el); + } + return el; +} + +function removeResizer() { + const el = document.getElementById("resizer"); + if (el) el.remove(); +} + +// jsdom's Range does NOT implement getClientRects (it is not even a function), +// so the measured path of getSize() THROWS for any non-empty label unless we +// stub measurement. Default stub: a single client rect of width +// DEFAULT_STUB_WIDTH and clientHeight DEFAULT_STUB_HEIGHT. Individual tests may +// override via installMeasurementStub(). +const DEFAULT_STUB_WIDTH = 100; +const DEFAULT_STUB_HEIGHT = 20; + +let createRangeSpy: jest.SpyInstance | null = null; +let clientHeightSpy: jest.SpyInstance | null = null; + +function installMeasurementStub(width: number, height: number) { + uninstallMeasurementStub(); + const resizer = ensureResizer(); + const realCreateRange = document.createRange.bind(document); + createRangeSpy = jest + .spyOn(document, "createRange") + .mockImplementation(() => { + const range = realCreateRange(); + range.getClientRects = () => + [{ width } as DOMRect] as unknown as DOMRectList; + return range; + }); + clientHeightSpy = jest + .spyOn(resizer, "clientHeight", "get") + .mockReturnValue(height); +} + +function uninstallMeasurementStub() { + createRangeSpy?.mockRestore(); + clientHeightSpy?.mockRestore(); + createRangeSpy = null; + clientHeightSpy = null; +} + +function withStubbedMeasurement( + width: number, + height: number, + fn: () => T +): T { + installMeasurementStub(width, height); + try { + return fn(); + } finally { + uninstallMeasurementStub(); + } +} + +beforeEach(() => { + // Most tests observe the resizer's written style/textContent or the returned + // object; they need a non-throwing measurement. Install the default stub. + installMeasurementStub(DEFAULT_STUB_WIDTH, DEFAULT_STUB_HEIGHT); +}); + +afterEach(() => { + uninstallMeasurementStub(); + setFontData(ORIGINAL_FONT_DATA as any); + removeResizer(); +}); + +describe("fontSizeScalars constant", () => { + it("pins the exact text-size multipliers", () => { + // These scale font-size and thus node size. Guard against accidental edits. + expect(fontSizeScalars).toEqual({ + "text-sm": 0.75, + "text-base": 1, + "text-lg": 1.5, + "text-xl": 2, + }); + }); +}); + +describe("getSize: no #resizer in DOM (string-sentinel fallback)", () => { + it("returns {width:'label', height:'label'} when #resizer is absent", () => { + removeResizer(); + setFontData({ fontSize: 10 }); + const result = getSize("Hello", []); + // Cytoscape sentinel meaning "size to label". Downstream getElements.ts + // spreads this into node data. + expect(result).toEqual({ width: "label", height: "label" }); + }); +}); + +describe("getSize: empty-text path (silent undefined return)", () => { + it("returns undefined when label is empty (resizer present but no firstChild)", () => { + ensureResizer(); + setFontData({ fontSize: 10 }); + // CHARACTERIZATION: documents current behavior, may be a bug. + // textContent = "" produces no firstChild, so the function falls through + // the if-block and returns undefined (no explicit return). getElements.ts + // would spread undefined. + const result = getSize("", []); + expect(result).toBeUndefined(); + }); +}); + +describe("getSize: resizer style string (observable math)", () => { + it("writes max-width, the raw fontData font-size, then the computed font-size (font-size appears TWICE)", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("Hello", []); // length 5 + const style = resizer.getAttribute("style"); + // CHARACTERIZATION: documents current behavior, may be a bug. + // fontData is spread into the style object, so its `fontSize:10` becomes a + // `font-size: 10` declaration; then an explicit `font-size: 12.7px` is + // ALSO emitted. Both are written; in CSS the later one wins. + // getWidth(5) = Math.max(64, ceil(33.8993*ln(5) - 38.614819)) = 64 (floor) + // computed font-size = 1.27 * 10 * 1 (text-base) = 12.7 + expect(style).toBe("max-width: 64px; font-size: 10; font-size: 12.7px;"); + }); + + it("getWidth grows logarithmically above the 64px floor for long labels", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + // 100-char label + getSize("x".repeat(100), []); + const style = resizer.getAttribute("style") || ""; + // getWidth(100) = ceil(33.8993 * ln(100) - 38.614819) + // = ceil(33.8993 * 4.60517 - 38.614819) + // = ceil(156.115... - 38.614...) = ceil(117.50) = 118 + expect(style).toContain("max-width: 118px;"); + }); + + it("MAGIC_SCALAR (1.27) and text-base scalar (1) are applied to numeric fontSize", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 20 }); + getSize("Node", []); + // 1.27 * 20 * 1 = 25.4 + expect(resizer.getAttribute("style")).toContain("font-size: 25.4px;"); + }); +}); + +describe("getSize: fontSize resolution (triple-branch fallback)", () => { + it("uses a numeric fontSize directly", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 12 }); + getSize("Node", []); + // 1.27 * 12 * 1 = 15.24 + expect(resizer.getAttribute("style")).toContain("font-size: 15.24px;"); + }); + + it("parseInt's a string fontSize like '14px'", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: "14px" }); + getSize("Node", []); + // parseInt('14px',10) => 14 ; 1.27 * 14 * 1 = 17.78 + expect(resizer.getAttribute("style")).toContain("font-size: 17.78px;"); + }); + + it("defaults to 10 when fontSize is absent", () => { + const resizer = ensureResizer(); + setFontData({}); + getSize("Node", []); + // default 10 ; 1.27 * 10 * 1 = 12.7 + expect(resizer.getAttribute("style")).toContain("font-size: 12.7px;"); + }); + + it("produces font-size NaNpx for a non-numeric string fontSize", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: "abc" }); + getSize("Node", []); + // CHARACTERIZATION: documents current behavior, may be a bug. + // parseInt('abc',10) => NaN ; 1.27 * NaN * 1 => NaN -> "NaNpx". No validation. + expect(resizer.getAttribute("style")).toContain("font-size: NaNpx;"); + }); +}); + +describe("getSize: text-size class precedence", () => { + function fontSizeFor(classes: string[]): string { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("Node", classes); + const style = resizer.getAttribute("style") || ""; + // font-size is emitted twice (raw fontData + computed). The COMPUTED value + // is last; grab the last match. + const all = Array.from(style.matchAll(/font-size: ([^;]+);/g)); + return all.length ? all[all.length - 1][1] : ""; + } + + it("text-sm (0.75x) wins over everything", () => { + // 1.27 * 10 * 0.75 -> JS float = 9.524999999999999 (pinned exactly) + expect(fontSizeFor(["text-sm", "text-lg", "text-xl"])).toBe( + "9.524999999999999px" + ); + }); + + it("text-lg (1.5x) beats text-xl when both present", () => { + // if/else chain checks isLarge (text-lg) before isXLarge (text-xl) + // 1.27 * 10 * 1.5 -> JS float = 19.049999999999997 (pinned exactly) + expect(fontSizeFor(["text-lg", "text-xl"])).toBe("19.049999999999997px"); + }); + + it("text-xl (2x) applies when only text-xl present", () => { + // 1.27 * 10 * 2 = 25.4 + expect(fontSizeFor(["text-xl"])).toBe("25.4px"); + }); + + it("text-base (1x) is the default with no text-size class", () => { + // 1.27 * 10 * 1 = 12.7 + expect(fontSizeFor([])).toBe("12.7px"); + }); +}); + +describe("getSize: preventCyRenderingBugs substitution (observable via textContent)", () => { + it("replaces hyphens with the ‑ non-breaking-hyphen entity literal before measuring", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("a-b", []); + // textContent is the entity-substituted string (literal 7-char entity). + expect(resizer.textContent).toBe("a‑b"); + }); + + it("replaces the Chinese comma (,) with the same entity", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("a,b", []); + expect(resizer.textContent).toBe("a‑b"); + }); + + it("replaces ALL hyphens globally", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("a-b-c", []); + expect(resizer.textContent).toBe("a‑b‑c"); + }); + + it("leaves non-hyphen / non-CJK-comma characters untouched", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + getSize("Hello World 123", []); + expect(resizer.textContent).toBe("Hello World 123"); + }); + + it("counts the substituted entity literal toward max-width (length skew)", () => { + const resizer = ensureResizer(); + setFontData({ fontSize: 10 }); + // CHARACTERIZATION: documents current behavior, may be a bug. + // "a-b-c" (5 chars) becomes "a‑b‑c" (19 chars) BEFORE + // getWidth(text.length). So max-width is computed from 19, not 5. + getSize("a-b-c", []); + // getWidth(19) = ceil(33.8993 * ln(19) - 38.614819) + // = ceil(33.8993 * 2.9444 - 38.6148) = ceil(61.21) = 62 + // 62 < 64 floor -> 64 + expect(resizer.getAttribute("style")).toContain("max-width: 64px;"); + // sanity: a 26-char-equivalent forces growth above floor + }); +}); + +describe("getSize: measured path environment behavior", () => { + it("THROWS in jsdom for a non-empty label because Range.getClientRects is unimplemented", () => { + // Remove the default stub installed in beforeEach to observe raw jsdom. + uninstallMeasurementStub(); + ensureResizer(); + setFontData({ fontSize: 10 }); + // CHARACTERIZATION: this documents the TEST ENVIRONMENT (jsdom), not a + // product bug. In a real browser getClientRects returns real rects. We pin + // it so future readers understand why the rest of the measured-path tests + // must stub measurement. + expect(() => getSize("Node", [])).toThrow(); + }); +}); + +describe("getSize: return SHAPE for the measured path (stubbed measurement)", () => { + it("default (no shape class): returns 6-key numeric object, shapeWidth==width, margins 0", () => { + setFontData({ fontSize: 10 }); + const result = withStubbedMeasurement(100, 20, () => + getSize("Node", []) + ) as any; + expect(Object.keys(result).sort()).toEqual( + [ + "height", + "shapeHeight", + "shapeWidth", + "textMarginX", + "textMarginY", + "width", + ].sort() + ); + expect(result.width).toBe(100); + expect(result.shapeWidth).toBe(100); + expect(result.height).toBe(20); + expect(result.shapeHeight).toBe(20); + expect(result.textMarginX).toBe(0); + expect(result.textMarginY).toBe(0); + }); + + it("unknown class produces no shape transform (same as default)", () => { + setFontData({ fontSize: 10 }); + const result = withStubbedMeasurement(100, 20, () => + getSize("Node", ["color_blue", "not-a-shape"]) + ) as any; + expect(result.shapeWidth).toBe(result.width); + expect(result.shapeHeight).toBe(result.height); + expect(result.textMarginX).toBe(0); + expect(result.textMarginY).toBe(0); + }); +}); + +/** + * Shape transform math. + * + * Because jsdom measures 0, the multipliers (e.g. 2.2 * width) all evaluate to + * 0 and we cannot observe the FACTOR from the output alone. To pin the actual + * multipliers, we stub getClientRects + clientHeight on the resizer so the + * measured base width/height are known non-zero values, then assert the exact + * transformed numbers. This locks the bespoke shape factors that determine + * on-screen geometry for existing customer charts. + */ +describe("getSize: shape transform factors (stubbed measurement)", () => { + const BASE_W = 100; + const BASE_H = 20; + + // Note: JS float arithmetic makes some products inexact (e.g. 2.2 * 100 === + // 220.00000000000003), so multiplier assertions use toBeCloseTo. + function stubbedGetSize(classes: string[]) { + setFontData({ fontSize: 10 }); + return withStubbedMeasurement(BASE_W, BASE_H, () => + getSize("Node", classes) + ) as any; + } + + it("base case: width=100, height=20 with stubbed measurement", () => { + const r = stubbedGetSize([]); + expect(r.width).toBe(100); + expect(r.height).toBe(20); + expect(r.shapeWidth).toBe(100); + expect(r.shapeHeight).toBe(20); + }); + + it("triangle: shapeWidth=2.2w, shapeHeight=1.25h, textMarginY=0.18*shapeHeight", () => { + const r = stubbedGetSize(["triangle"]); + expect(r.shapeWidth).toBeCloseTo(2.2 * 100, 10); // 220 + expect(r.shapeHeight).toBeCloseTo(1.25 * 20, 10); // 25 + expect(r.textMarginY).toBeCloseTo(0.18 * 25, 10); // 4.5 + }); + + it("round-triangle aliases triangle", () => { + const r = stubbedGetSize(["round-triangle"]); + expect(r.shapeWidth).toBeCloseTo(220, 10); + expect(r.shapeHeight).toBeCloseTo(25, 10); + }); + + it("diamond: shapeWidth=1.5w, shapeHeight=1.5h, margins 0", () => { + const r = stubbedGetSize(["diamond"]); + expect(r.shapeWidth).toBeCloseTo(150, 10); + expect(r.shapeHeight).toBeCloseTo(30, 10); + expect(r.textMarginX).toBe(0); + expect(r.textMarginY).toBe(0); + }); + + it("pentagon: shapeWidth=1.35w, textMarginY=0.1*shapeHeight (shapeHeight unchanged=h)", () => { + const r = stubbedGetSize(["pentagon"]); + expect(r.shapeWidth).toBeCloseTo(1.35 * 100, 10); // 135 + expect(r.shapeHeight).toBe(20); // unchanged + expect(r.textMarginY).toBeCloseTo(0.1 * 20, 10); // 2 + }); + + it("hexagon: shapeWidth=1.5w only", () => { + const r = stubbedGetSize(["hexagon"]); + expect(r.shapeWidth).toBeCloseTo(150, 10); + expect(r.shapeHeight).toBe(20); + expect(r.textMarginY).toBe(0); + }); + + it("heptagon: shapeWidth=1.5w, textMarginY=0.05*shapeHeight", () => { + const r = stubbedGetSize(["heptagon"]); + expect(r.shapeWidth).toBeCloseTo(150, 10); + expect(r.textMarginY).toBeCloseTo(0.05 * 20, 10); // 1 + }); + + it("octagon: shapeWidth=1.25w only", () => { + const r = stubbedGetSize(["octagon"]); + expect(r.shapeWidth).toBeCloseTo(125, 10); + expect(r.shapeHeight).toBe(20); + }); + + it("star: shapeHeight=shapeWidth=1.4*max(shapeHeight,shapeWidth), textMarginY=0.13*height", () => { + const r = stubbedGetSize(["star"]); + // max(20,100)=100 -> 1.4*100 = 140 for BOTH + expect(r.shapeWidth).toBeCloseTo(140, 10); + expect(r.shapeHeight).toBeCloseTo(140, 10); + // CHARACTERIZATION: documents current behavior, may be a bug. + // textMarginY uses height (20), computed BEFORE the shapeWidth/shapeHeight + // reassignment: 0.13 * 20 = 2.6 + expect(r.textMarginY).toBeCloseTo(0.13 * 20, 10); + }); + + it("vee: shapeWidth=2.5w, shapeHeight=2.5h, textMarginY=0.01*shapeHeight", () => { + const r = stubbedGetSize(["vee"]); + expect(r.shapeWidth).toBeCloseTo(250, 10); + expect(r.shapeHeight).toBeCloseTo(50, 10); + expect(r.textMarginY).toBeCloseTo(0.01 * 50, 10); // 0.5 + }); + + it("rhomboid: shapeWidth=2w only", () => { + const r = stubbedGetSize(["rhomboid"]); + expect(r.shapeWidth).toBeCloseTo(200, 10); + expect(r.shapeHeight).toBe(20); + }); + + it("right-rhomboid aliases rhomboid", () => { + const r = stubbedGetSize(["right-rhomboid"]); + expect(r.shapeWidth).toBeCloseTo(200, 10); + }); + + it("tag: shapeWidth=1.25w and NEGATIVE textMarginX=-0.1*shapeWidth", () => { + const r = stubbedGetSize(["tag"]); + expect(r.shapeWidth).toBeCloseTo(125, 10); + // CHARACTERIZATION: negative margin is intentional; pin the sign. + expect(r.textMarginX).toBeCloseTo(-0.1 * 125, 10); // -12.5 + }); + + it("round-tag aliases tag", () => { + const r = stubbedGetSize(["round-tag"]); + expect(r.shapeWidth).toBeCloseTo(125, 10); + expect(r.textMarginX).toBeCloseTo(-12.5, 10); + }); + + it("concave-hexagon: shapeWidth=1.5w only", () => { + const r = stubbedGetSize(["concave-hexagon"]); + expect(r.shapeWidth).toBeCloseTo(150, 10); + expect(r.shapeHeight).toBe(20); + }); + + it("circle: when width>height, all dims become width (height promoted up)", () => { + // BASE_W=100 > BASE_H=20 -> else branch: + // height = shapeWidth = shapeHeight = width(100) + const r = stubbedGetSize(["circle"]); + expect(r.width).toBe(100); + expect(r.height).toBe(100); + expect(r.shapeWidth).toBe(100); + expect(r.shapeHeight).toBe(100); + }); + + it("circle: when height>width, all dims become height", () => { + setFontData({ fontSize: 10 }); + const r = withStubbedMeasurement(30, 80, () => + getSize("Node", ["circle"]) + ) as any; + // if branch: width = shapeWidth = shapeHeight = height(80) + expect(r.width).toBe(80); + expect(r.height).toBe(80); + expect(r.shapeWidth).toBe(80); + expect(r.shapeHeight).toBe(80); + }); +}); diff --git a/app/src/lib/graphUtilityClasses.characterization.test.ts b/app/src/lib/graphUtilityClasses.characterization.test.ts new file mode 100644 index 000000000..312df6358 --- /dev/null +++ b/app/src/lib/graphUtilityClasses.characterization.test.ts @@ -0,0 +1,268 @@ +import { + shapes, + smartShapes, + createSmartShapeClasses, + childlessShapeClasses, + createSmartChildlessBorderClasses, + nodeBorderClasses, + edgeStyleClasses, + sourceArrowSuffixes, + targetArrowSuffixes, +} from "./graphUtilityClasses"; + +/** + * Characterization tests for graphUtilityClasses. + * + * These lock down the CURRENT generated "postStyle" Cytoscape utility + * stylesheets so any drift is caught during a future framework migration. + * They assert ACTUAL output, not ideal output. + */ + +describe("graphUtilityClasses characterization", () => { + describe("shapes (raw input array)", () => { + it("is the exact ordered list of 20 shape names", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // Note duplicate roundrectangle (idx 1) vs round-rectangle (idx 16), + // and @ts-ignore'd "right-rhomboid". A dedupe would silently drop a + // customer-facing class name. + expect(shapes).toEqual([ + "rectangle", + "roundrectangle", + "ellipse", + "triangle", + "pentagon", + "hexagon", + "heptagon", + "octagon", + "star", + "barrel", + "diamond", + "vee", + "rhomboid", + "right-rhomboid", + "polygon", + "tag", + "round-rectangle", + "cut-rectangle", + "bottom-round-rectangle", + "concave-hexagon", + ]); + expect(shapes).toHaveLength(20); + }); + + it("contains both roundrectangle and round-rectangle (no dedupe)", () => { + expect(shapes).toContain("roundrectangle"); + expect(shapes).toContain("round-rectangle"); + }); + }); + + describe("smartShapes (1:1 aspect-ratio mapping)", () => { + it("maps 9 className->coreShape pairs with the rename of square/roundsquare/circle", () => { + expect(smartShapes).toEqual([ + { coreShape: "rectangle", className: "square" }, + { coreShape: "roundrectangle", className: "roundsquare" }, + { coreShape: "ellipse", className: "circle" }, + { coreShape: "star", className: "star" }, + { coreShape: "diamond", className: "diamond" }, + { coreShape: "pentagon", className: "pentagon" }, + { coreShape: "hexagon", className: "hexagon" }, + { coreShape: "heptagon", className: "heptagon" }, + { coreShape: "octagon", className: "octagon" }, + ]); + expect(smartShapes).toHaveLength(9); + }); + }); + + describe("childlessShapeClasses (module-load-time built array)", () => { + it("snapshots the full 21-rule array including the appended iso-trapezoid", () => { + // CHARACTERIZATION: the 21st entry (iso-trapezoid) is appended via + // .push() mutation at import time. The double spaces in the + // shape-polygon-points string are load-bearing for the snapshot. + expect(childlessShapeClasses).toMatchSnapshot(); + }); + + it("has exactly 21 rules (20 shapes + appended iso-trapezoid)", () => { + expect(childlessShapeClasses).toHaveLength(21); + }); + + it("emits one ':childless.shape_' selector per shape, shape-only css", () => { + // First 20 entries mirror `shapes` + shapes.forEach((shape, i) => { + expect(childlessShapeClasses[i]).toEqual({ + selector: `:childless.shape_${shape}`, + css: { shape }, + }); + }); + }); + + it("appends the iso-trapezoid polygon rule with exact double-spaced points", () => { + // CHARACTERIZATION: exact string with double spaces is intentional to pin. + expect(childlessShapeClasses[20]).toEqual({ + selector: ":childless.shape_iso-trapezoid", + css: { + shape: "polygon", + "shape-polygon-points": "-1 1 1 1 0.5 -1 -0.5 -1", + }, + }); + }); + }); + + describe("createSmartShapeClasses(width)", () => { + it("returns 9 rules with width === height === arg (1:1 aspect)", () => { + const result = createSmartShapeClasses(30); + expect(result).toHaveLength(9); + result.forEach((rule) => { + expect((rule.css as any).width).toBe(30); + expect((rule.css as any).height).toBe(30); + }); + }); + + it("uses ':childless.shape_' selectors mapped to coreShape", () => { + const result = createSmartShapeClasses(42); + expect(result.map((r) => r.selector)).toEqual([ + ":childless.shape_square", + ":childless.shape_roundsquare", + ":childless.shape_circle", + ":childless.shape_star", + ":childless.shape_diamond", + ":childless.shape_pentagon", + ":childless.shape_hexagon", + ":childless.shape_heptagon", + ":childless.shape_octagon", + ]); + // rename mapping: square->rectangle, roundsquare->roundrectangle, circle->ellipse + expect((result[0].css as any).shape).toBe("rectangle"); + expect((result[1].css as any).shape).toBe("roundrectangle"); + expect((result[2].css as any).shape).toBe("ellipse"); + }); + + it("passes width through as a raw number (not a px string)", () => { + // CHARACTERIZATION: a migration to a unit-string stylesheet system + // would silently break sizing if it expected "30px". + const result = createSmartShapeClasses(30); + expect(typeof (result[0].css as any).width).toBe("number"); + }); + + it("snapshots full output for a representative width", () => { + expect(createSmartShapeClasses(30)).toMatchSnapshot(); + }); + }); + + describe("createSmartChildlessBorderClasses(width)", () => { + it("returns 5 rules setting border-width=width for EVERY border including none", () => { + // CHARACTERIZATION: LANDMINE — border_none gets border-width:, + // NOT 0. border-style is set to the literal border name ("none", etc). + const result = createSmartChildlessBorderClasses(5); + expect(result).toHaveLength(5); + result.forEach((rule) => { + expect((rule.css as any)["border-width"]).toBe(5); + }); + }); + + it("border_none sets border-style:'none' AND border-width:5 (not 0)", () => { + const result = createSmartChildlessBorderClasses(5); + const none = result.find((r) => r.selector === ":childless.border_none"); + expect(none).toEqual({ + selector: ":childless.border_none", + css: { + "border-width": 5, + "border-style": "none", + }, + }); + }); + + it("emits border selectors in order none/solid/dashed/dotted/double", () => { + const result = createSmartChildlessBorderClasses(5); + expect(result.map((r) => r.selector)).toEqual([ + ":childless.border_none", + ":childless.border_solid", + ":childless.border_dashed", + ":childless.border_dotted", + ":childless.border_double", + ]); + }); + + it("snapshots full output for a representative width", () => { + expect(createSmartChildlessBorderClasses(5)).toMatchSnapshot(); + }); + }); + + describe("nodeBorderClasses (dead export, conflicting semantics)", () => { + it("snapshots the 5-rule array", () => { + // CHARACTERIZATION: this export is imported nowhere in app code. + expect(nodeBorderClasses).toMatchSnapshot(); + }); + + it("sets border-width:0 for border_none (contradicts the active factory)", () => { + // CHARACTERIZATION: LANDMINE — unused nodeBorderClasses sets width:0 for + // none, while the wired-up createSmartChildlessBorderClasses sets width:. + const none = nodeBorderClasses.find( + (r) => r.selector === ":childless.border_none" + ); + expect(none).toEqual({ + selector: ":childless.border_none", + css: { "border-width": 0 }, + }); + }); + + it("has 5 rules: solid/dashed/dotted/double (border-style only) + none (border-width:0)", () => { + expect(nodeBorderClasses).toHaveLength(5); + expect(nodeBorderClasses.map((r) => r.selector)).toEqual([ + ":childless.border_solid", + ":childless.border_dashed", + ":childless.border_dotted", + ":childless.border_double", + ":childless.border_none", + ]); + }); + }); + + describe("edgeStyleClasses", () => { + it("maps 3 edge.border_* selectors to line-style", () => { + expect(edgeStyleClasses).toEqual([ + { selector: "edge.border_dashed", css: { "line-style": "dashed" } }, + { selector: "edge.border_dotted", css: { "line-style": "dotted" } }, + { selector: "edge.border_solid", css: { "line-style": "solid" } }, + ]); + }); + }); + + describe("sourceArrowSuffixes / targetArrowSuffixes (dead exports)", () => { + it("sourceArrowSuffixes is the 12 'source-' prefixed strings", () => { + // CHARACTERIZATION: imported nowhere; pinned so a migration drops them intentionally. + expect(sourceArrowSuffixes).toEqual([ + "source-triangle", + "source-triangle-tee", + "source-circle-triangle", + "source-triangle-cross", + "source-triangle-backcurve", + "source-vee", + "source-tee", + "source-square", + "source-circle", + "source-diamond", + "source-chevron", + "source-none", + ]); + expect(sourceArrowSuffixes).toHaveLength(12); + }); + + it("targetArrowSuffixes is the 12 'target-' prefixed strings", () => { + expect(targetArrowSuffixes).toEqual([ + "target-triangle", + "target-triangle-tee", + "target-circle-triangle", + "target-triangle-cross", + "target-triangle-backcurve", + "target-vee", + "target-tee", + "target-square", + "target-circle", + "target-diamond", + "target-chevron", + "target-none", + ]); + expect(targetArrowSuffixes).toHaveLength(12); + }); + }); +}); diff --git a/app/src/lib/prepareChart/prepareChart.characterization.test.ts b/app/src/lib/prepareChart/prepareChart.characterization.test.ts new file mode 100644 index 000000000..b3674878b --- /dev/null +++ b/app/src/lib/prepareChart/prepareChart.characterization.test.ts @@ -0,0 +1,510 @@ +import { readFileSync } from "fs"; +import { join } from "path"; + +import { theme, cytoscapeStyle } from "../templates/default-template"; +import { initialDoc, useDoc } from "../useDoc"; +import { + delimiters, + HIDDEN_GRAPH_OPTIONS_DIVIDER, + newDelimiters, +} from "../constants"; +import { prepareChart } from "./prepareChart"; + +/** + * CHARACTERIZATION tests for prepareChart. + * + * These lock down the CURRENT behavior of the three-delimiter / layout-migration + * pipeline before a future framework migration. They capture ACTUAL output, not + * ideal output. Where current behavior is surprising or buggy it is asserted as-is + * and flagged with a // CHARACTERIZATION comment. + * + * Pure cases use { set: false } so they exercise the delimiter parsing, deep merge, + * theme backfill, layout migration and text normalization WITHOUT touching jsdom or + * the zustand store. A small number of { set: true } cases pin the side-effect path. + * + * IMPORTANT MUTATION HAZARD (see "shared default theme" test): prepareChart assigns + * `meta.themeEditor = theme` (the SAME imported module-level object) and then mutates + * .layoutName / .spacingFactor on it during legacy-layout migration. That permanently + * mutates the shared `theme` import and LEAKS across subsequent prepareChart calls in + * the same module. We capture the pristine default values up-front so the leak can be + * pinned deterministically, and we keep the leak-inducing test isolated/last. + */ + +// Capture the PRISTINE default theme values BEFORE any prepareChart call runs, +// because prepareChart mutates the shared `theme` object in place. +const PRISTINE_LAYOUT_NAME = theme.layoutName; // "dagre" +const PRISTINE_SPACING_FACTOR = theme.spacingFactor; // 1.1 +const PRISTINE_THEME_SNAPSHOT = JSON.parse(JSON.stringify(theme)); + +function getFixture(name: string) { + return readFileSync(join(__dirname, "examples", name), "utf8"); +} + +describe("prepareChart (characterization)", () => { + // --------------------------------------------------------------------------- + // Branch (a): no metadata at all -> default theme + default cytoscapeStyle + // --------------------------------------------------------------------------- + test("example9: plain text, no delimiters, no metadata -> default theme + cytoscapeStyle backfilled", async () => { + const result = await prepareChart({ + doc: getFixture("example9"), + details: initialDoc.details, + set: false, + }); + + // text: trimmed with exactly one trailing newline + expect(result.text).toBe( + `This app works by typing + Indenting creates a link to the current line + any text: before a colon creates a label +` + ); + + // meta: ONLY the two backfilled keys, nothing else + expect(Object.keys(result.meta).sort()).toEqual([ + "cytoscapeStyle", + "themeEditor", + ]); + expect(result.meta.cytoscapeStyle).toBe(cytoscapeStyle); + // themeEditor is the (still-pristine here) default theme object reference + expect(result.meta.themeEditor).toBe(theme); + expect((result.meta.themeEditor as any).layoutName).toBe( + PRISTINE_LAYOUT_NAME + ); + expect((result.meta.themeEditor as any).spacingFactor).toBe( + PRISTINE_SPACING_FACTOR + ); + + expect(result.details).toBe(initialDoc.details); + }); + + // --------------------------------------------------------------------------- + // set=false purity: no store write, no DOM side effect + // --------------------------------------------------------------------------- + test("set=false returns pure result and does NOT write to the useDoc store", async () => { + const before = useDoc.getState(); + + const result = await prepareChart({ + doc: "alpha\n beta\n", + details: initialDoc.details, + set: false, + }); + + const after = useDoc.getState(); + + // store untouched (same reference values as before) + expect(after.text).toBe(before.text); + expect(after.meta).toBe(before.meta); + expect(after.details).toBe(before.details); + + expect(result.text).toBe("alpha\n beta\n"); + }); + + // --------------------------------------------------------------------------- + // set=true side-effect path: writes the SAME payload into the store + // --------------------------------------------------------------------------- + test("set=true writes { text, meta, details } into the useDoc store", async () => { + const details = { id: "side-effect", title: "t", isHosted: false }; + const result = await prepareChart({ + doc: "alpha\n beta\n", + details, + set: true, + }); + + const state = useDoc.getState(); + expect(state.text).toBe(result.text); + expect(state.meta).toBe(result.meta); + expect(state.details).toBe(result.details); + expect(state.details).toBe(details); + }); + + // --------------------------------------------------------------------------- + // elk- prefix stripping via slice(4) + // --------------------------------------------------------------------------- + test("legacy layout name 'elk-layered' migrates to themeEditor.layoutName 'layered' (slice(4))", async () => { + const doc = `n1\n n2\n=====\n${JSON.stringify({ + layout: { name: "elk-layered", spacingFactor: 2 }, + // supply our own themeEditor so we do NOT mutate the shared default theme + themeEditor: { ...PRISTINE_THEME_SNAPSHOT }, + })}\n=====`; + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + expect((result.meta.themeEditor as any).layoutName).toBe("layered"); + expect((result.meta.themeEditor as any).spacingFactor).toBe(2); + // old layout key is deleted + expect(result.meta.layout).toBeUndefined(); + }); + + test("elk-radial -> 'radial'; a bare 'elk-' prefix yields empty name so layoutName is left unchanged", async () => { + const radial = await prepareChart({ + doc: `n\n=====\n${JSON.stringify({ + layout: { name: "elk-radial" }, + themeEditor: { ...PRISTINE_THEME_SNAPSHOT }, + })}\n=====`, + details: initialDoc.details, + set: false, + }); + expect((radial.meta.themeEditor as any).layoutName).toBe("radial"); + + // CHARACTERIZATION: name "elk-" -> slice(4) -> "" which is falsy, so layoutName + // is NOT assigned and the existing themeEditor.layoutName is preserved. + const bare = await prepareChart({ + doc: `n\n=====\n${JSON.stringify({ + layout: { name: "elk-" }, + themeEditor: { ...PRISTINE_THEME_SNAPSHOT, layoutName: "klay" }, + })}\n=====`, + details: initialDoc.details, + set: false, + }); + expect((bare.meta.themeEditor as any).layoutName).toBe("klay"); + }); + + // --------------------------------------------------------------------------- + // Branch (b): cytoscapeStyle present but no themeEditor + // --------------------------------------------------------------------------- + test("branch (b): cytoscapeStyle present, no themeEditor -> default themeEditor AND customCssOnly:true", async () => { + const doc = `n1\n=====\n${JSON.stringify({ + cytoscapeStyle: "node { background-color: red; }", + })}\n=====`; + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + // user's cytoscapeStyle preserved (NOT overwritten with default) + expect(result.meta.cytoscapeStyle).toBe("node { background-color: red; }"); + // default theme backfilled (shared `theme` reference) + expect(result.meta.themeEditor).toBe(theme); + // CHARACTERIZATION: the easy-to-lose customCssOnly flag that disables the + // backfilled default theme at render time + expect(result.meta.customCssOnly).toBe(true); + }); + + test("branch (c): themeEditor present -> left as-is, no cytoscapeStyle backfill, no customCssOnly", async () => { + const customThemeEditor = { + ...PRISTINE_THEME_SNAPSHOT, + layoutName: "klay", + fontFamily: "X", + }; + const doc = `n1\n=====\n${JSON.stringify({ + themeEditor: customThemeEditor, + })}\n=====`; + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + expect(result.meta.themeEditor).toEqual(customThemeEditor); + // no default cytoscapeStyle is added in branch (c) + expect(result.meta.cytoscapeStyle).toBeUndefined(); + expect(result.meta.customCssOnly).toBeUndefined(); + }); + + // --------------------------------------------------------------------------- + // deepmerge precedence: last-wins (json < yaml < hidden) + // gray-matter only parses ~~~ frontmatter at the START of the text, so the + // realistic layout is: ~~~yaml~~~ first, then content, then ===== / ¼▓╬ blocks. + // --------------------------------------------------------------------------- + test("deepmerge precedence: ¼▓╬ (hidden) beats ~~~ (yaml) for a colliding scalar key", async () => { + const doc = [ + delimiters, + `customKey: from-yaml`, + delimiters, + `node`, + `${HIDDEN_GRAPH_OPTIONS_DIVIDER}${JSON.stringify({ + customKey: "from-hidden", + })}`, + ].join("\n"); + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + // merge.all([jsonMeta, parsedData(yaml), hidden]) -> last array element wins + expect(result.meta.customKey).toBe("from-hidden"); + }); + + test("deepmerge precedence: ¼▓╬ (hidden) beats ===== (json) when hidden block precedes the json block", async () => { + // ===== is split FIRST (only parts[1] kept), so the ¼▓╬ block must appear + // BEFORE the ===== block to survive. Here it does. + const doc = [ + `node`, + `${HIDDEN_GRAPH_OPTIONS_DIVIDER}${JSON.stringify({ + customKey: "from-hidden", + })}`, + newDelimiters, + JSON.stringify({ customKey: "from-json" }), + newDelimiters, + ].join("\n"); + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + expect(result.meta.customKey).toBe("from-hidden"); + }); + + test("deepmerge precedence: ~~~ (yaml) beats ===== (json) when hidden block absent", async () => { + const doc = [ + delimiters, + `customKey: from-yaml`, + delimiters, + `node`, + newDelimiters, + JSON.stringify({ customKey: "from-json" }), + newDelimiters, + ].join("\n"); + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + expect(result.meta.customKey).toBe("from-yaml"); + }); + + test("deepmerge concatenates arrays across blocks (default deepmerge array strategy)", async () => { + const doc = [ + delimiters, + `arr:\n - 1\n - 2`, + delimiters, + `node`, + `${HIDDEN_GRAPH_OPTIONS_DIVIDER}${JSON.stringify({ arr: [3] })}`, + ].join("\n"); + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + // CHARACTERIZATION: arrays are concatenated (yaml [1,2] then hidden [3]), + // not replaced + expect(result.meta.arr).toEqual([1, 2, 3]); + }); + + // --------------------------------------------------------------------------- + // gray-matter only parses frontmatter at the very start of the text + // --------------------------------------------------------------------------- + test("CHARACTERIZATION: ~~~ block NOT at start of text is NOT parsed as YAML (left in text)", async () => { + // The ~~~ block follows a content line, so gray-matter does not treat it as + // frontmatter; the data is empty and the ~~~ block remains in the text. + const doc = [`node`, delimiters, `foo: bar`, delimiters].join("\n"); + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + expect(result.meta.foo).toBeUndefined(); + // the ~~~ content stays embedded in the text + expect(result.text).toContain("~~~"); + expect(result.text).toContain("foo: bar"); + }); + + // --------------------------------------------------------------------------- + // Layout migration data loss: rankDir / direction dropped + // --------------------------------------------------------------------------- + test("legacy layout.rankDir is DROPPED; layoutName preserved, spacingFactor overwritten from layout, layout deleted", async () => { + // No `name` in layout, but rankDir present (like example5/6 'BT'/'LR'), + // and an explicit spacingFactor on the layout. + const doc = `n1\n n2\n=====\n${JSON.stringify({ + layout: { rankDir: "BT", spacingFactor: 3 }, + themeEditor: { ...PRISTINE_THEME_SNAPSHOT, layoutName: "klay" }, + })}\n=====`; + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + const te = result.meta.themeEditor as any; + // CHARACTERIZATION: rankDir is silently lost (not migrated to `direction`) + expect(te.rankDir).toBeUndefined(); + expect(te.direction).toBe(PRISTINE_THEME_SNAPSHOT.direction); + expect(result.meta.layout).toBeUndefined(); + // name was empty so layoutName is preserved from the existing themeEditor + expect(te.layoutName).toBe("klay"); + // spacingFactor is ALWAYS overwritten from the layout block (3 here) + expect(te.spacingFactor).toBe(3); + }); + + test("legacy layout with NO spacingFactor defaults spacingFactor to the CURRENT theme.spacingFactor", async () => { + // CHARACTERIZATION + MUTATION HAZARD: the default for spacingFactor is + // `theme.spacingFactor` read off the shared (possibly-already-mutated) object. + // We assert it equals whatever theme.spacingFactor is RIGHT NOW. + const currentDefault = theme.spacingFactor; + const doc = `n1\n=====\n${JSON.stringify({ + layout: { name: "klay" }, + themeEditor: { ...PRISTINE_THEME_SNAPSHOT, spacingFactor: 99 }, + })}\n=====`; + + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + + const te = result.meta.themeEditor as any; + expect(te.layoutName).toBe("klay"); + // existing 99 is clobbered by the layout default (current theme.spacingFactor) + expect(te.spacingFactor).toBe(currentDefault); + }); + + // --------------------------------------------------------------------------- + // Unguarded JSON.parse -> promise rejects on malformed metadata + // --------------------------------------------------------------------------- + test("malformed ===== JSON block rejects the promise (unguarded JSON.parse)", async () => { + const doc = `n1\n=====\n{ not valid json }\n=====`; + await expect( + prepareChart({ doc, details: initialDoc.details, set: false }) + ).rejects.toThrow(); + }); + + test("malformed ¼▓╬ hidden block rejects the promise (unguarded JSON.parse)", async () => { + const doc = `n1${HIDDEN_GRAPH_OPTIONS_DIVIDER}{ not valid json }`; + await expect( + prepareChart({ doc, details: initialDoc.details, set: false }) + ).rejects.toThrow(); + }); + + test("trailing ===== with nothing after it parses as empty object (|| '{}' fallback)", async () => { + // CHARACTERIZATION: parts[1] after the trailing delimiter is '' (falsy) so + // it falls back to '{}' and does not throw. + const doc = `n1\n n2\n=====`; + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + expect(result.text).toBe("n1\n n2\n"); + // empty meta -> default backfill kicks in + expect(result.meta.cytoscapeStyle).toBe(cytoscapeStyle); + }); + + // --------------------------------------------------------------------------- + // parser key always stripped + // --------------------------------------------------------------------------- + test("`parser` key is always deleted from meta", async () => { + const doc = `n1\n=====\n${JSON.stringify({ + parser: "v1", + themeEditor: { ...PRISTINE_THEME_SNAPSHOT }, + })}\n=====`; + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + expect(result.meta.parser).toBeUndefined(); + }); + + // --------------------------------------------------------------------------- + // Whitespace normalization: trim + exactly one trailing newline + // --------------------------------------------------------------------------- + test("many leading/trailing blank lines collapse to a single trailing newline", async () => { + const doc = `\n\n\n hello\n to the: world \n\n\n\n`; + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + // CHARACTERIZATION: ${text.trim()}\n - leading whitespace and all trailing + // blank lines removed, exactly one trailing newline added. Note trim() + // also removes the leading spaces before "hello". + expect(result.text).toBe(`hello\n to the: world\n`); + }); + + // --------------------------------------------------------------------------- + // Delimiter substring inside node text -> truncation landmine + // --------------------------------------------------------------------------- + test("CHARACTERIZATION: a node line equal to '=====' truncates the doc and throws when remainder is not JSON", async () => { + // The string '=====' appears in node text BEFORE any real metadata block. + // text is split on the first '=====', the remainder is treated as JSON, + // and since 'after' is not valid JSON the promise REJECTS. This is a real, + // lossy parsing landmine (a node literally named '=====' breaks the chart). + const doc = `before\n=====\nafter`; + await expect( + prepareChart({ doc, details: initialDoc.details, set: false }) + ).rejects.toThrow(); + }); + + test("CHARACTERIZATION: a node line equal to '=====' followed by valid JSON silently drops the trailing text", async () => { + // Here the remainder after the (mis-detected) delimiter happens to be valid + // JSON, so it is parsed as metadata and the 'after' content is LOST from text. + const doc = `before\n=====\n${JSON.stringify({ note: "eaten" })}`; + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + expect(result.text).toBe("before\n"); + expect(result.meta.note).toBe("eaten"); + }); + + test("CHARACTERIZATION: a leading '~~~' block in user content is consumed as YAML frontmatter", async () => { + const doc = `~~~\nfoo: bar\n~~~\nreal content here\n child`; + const result = await prepareChart({ + doc, + details: initialDoc.details, + set: false, + }); + // the leading ~~~ block is parsed as YAML frontmatter and stripped from text + expect(result.text).toBe("real content here\n child\n"); + expect(result.meta.foo).toBe("bar"); + }); + + // --------------------------------------------------------------------------- + // SHARED DEFAULT THEME MUTATION HAZARD — keep LAST; it permanently mutates the + // imported `theme` object for the rest of this module's lifetime. + // --------------------------------------------------------------------------- + test("MUTATION HAZARD: legacy-layout migration mutates the shared imported default theme and leaks into a later default chart", async () => { + // Confirm the import is still pristine right before we trigger the leak. + expect(theme.layoutName).toBe(PRISTINE_LAYOUT_NAME); + expect(theme.spacingFactor).toBe(PRISTINE_SPACING_FACTOR); + + // Chart 1: legacy `layout` present AND themeEditor defaulted (no themeEditor + // in meta) -> prepareChart assigns meta.themeEditor = theme (shared ref) and + // then mutates layoutName/spacingFactor on it. + const chart1 = await prepareChart({ + doc: `n1\n=====\n${JSON.stringify({ + layout: { name: "cose", spacingFactor: 5 }, + })}\n=====`, + details: initialDoc.details, + set: false, + }); + expect((chart1.meta.themeEditor as any).layoutName).toBe("cose"); + + // CHARACTERIZATION (likely a bug): the shared module-level `theme` object is + // now mutated in place. + expect(theme.layoutName).toBe("cose"); + expect(theme.spacingFactor).toBe(5); + + // Chart 2: a plain default chart with no metadata. It assigns the SAME shared + // (now-mutated) theme object, so it inherits 'cose' / 5 instead of the + // pristine 'dagre' / 1.1 defaults. The state has leaked across calls. + const chart2 = await prepareChart({ + doc: `just text`, + details: initialDoc.details, + set: false, + }); + expect((chart2.meta.themeEditor as any).layoutName).toBe("cose"); + expect((chart2.meta.themeEditor as any).spacingFactor).toBe(5); + // chart1 and chart2 themeEditor are literally the same object reference + expect(chart2.meta.themeEditor).toBe(chart1.meta.themeEditor); + }); +}); diff --git a/app/src/lib/preprocessStyle.characterization.test.ts b/app/src/lib/preprocessStyle.characterization.test.ts new file mode 100644 index 000000000..35a45ee1c --- /dev/null +++ b/app/src/lib/preprocessStyle.characterization.test.ts @@ -0,0 +1,297 @@ +/** + * CHARACTERIZATION TESTS for preprocessStyle.ts + * + * These tests lock down the CURRENT behavior of the module before a future + * framework migration. They are a safety net, NOT a correctness audit. + * + * The pure, characterizable surface is: + * - preprocessStyle(style): @import extraction, $variable substitution, and + * dynamic class detection (the latter only observable via the zustand store) + * - getStyleStringFromMeta(meta): branch on customCssOnly + concat order + * + * The font/CSSStyleSheet paths (findFontData / parseFontFaces / the react-query + * hook) depend on browser APIs + a load-time polyfill; those are guarded / + * documented rather than forced. + */ +import { + preprocessStyle, + getStyleStringFromMeta, + useProcessStyleStore, +} from "./preprocessStyle"; +import { theme as defaultTheme } from "./templates/default-template"; + +describe("preprocessStyle - @import extraction", () => { + it("extracts a quoted @import url() with trailing semicolon and strips it from returned style", () => { + const style = `@import url("https://fonts.example.com/font.css"); +node { + background-color: red; +}`; + const result = preprocessStyle(style); + + expect(result.imports).toEqual(["https://fonts.example.com/font.css"]); + // the @import line is removed from the returned style + expect(result.style).not.toContain("@import"); + expect(result.style).toContain("background-color: red;"); + }); + + it("extracts multiple @import urls in source order", () => { + const style = `@import url('https://a.example.com/a.css'); +@import url("https://b.example.com/b.css"); +node { color: black; }`; + const result = preprocessStyle(style); + + expect(result.imports).toEqual([ + "https://a.example.com/a.css", + "https://b.example.com/b.css", + ]); + expect(result.style).not.toContain("@import"); + }); + + it("CHARACTERIZATION: does NOT extract an @import without trailing semicolon (current limitation)", () => { + const style = `@import url("https://nosemi.example.com/font.css") +node { color: red; }`; + const result = preprocessStyle(style); + + expect(result.imports).toEqual([]); + // left intact in the returned style + expect(result.style).toContain("@import"); + }); + + it("CHARACTERIZATION: does NOT extract an @import whose url() is unquoted (current limitation)", () => { + const style = `@import url(https://noquote.example.com/font.css); +node { color: red; }`; + const result = preprocessStyle(style); + + expect(result.imports).toEqual([]); + expect(result.style).toContain("@import"); + }); + + it("sets styleImports in the store equal to the returned imports", () => { + const style = `@import url("https://store.example.com/font.css"); +node { color: red; }`; + const result = preprocessStyle(style); + + expect(useProcessStyleStore.getState().styleImports).toEqual( + result.imports + ); + }); +}); + +describe("preprocessStyle - $variable substitution (processScss)", () => { + it("removes a col-0 $variable declaration and substitutes its references", () => { + const style = `$blue: #e3f2fd; +:childless.color_blue { + background-color: $blue; +}`; + const result = preprocessStyle(style); + + // declaration line removed + expect(result.style).not.toContain("$blue:"); + // reference substituted + expect(result.style).toContain("background-color: #e3f2fd;"); + // variable recorded in the returned map (and store) + expect(result.variables.blue).toBe("#e3f2fd"); + expect(useProcessStyleStore.getState().variables.blue).toBe("#e3f2fd"); + }); + + it("CHARACTERIZATION: variable replace has NO word boundary so a prefix collides (likely bug)", () => { + // $color is a prefix of $colorDark. Insertion order: color first, then colorDark. + // When substituting $color (no \b), it will replace the "$color" prefix inside + // "$colorDark" too, leaving "Dark" appended to color's value. + const style = `$color: red; +$colorDark: blue; +node { + color: $color; + border-color: $colorDark; +}`; + const result = preprocessStyle(style); + + // CHARACTERIZATION: documents current behavior, may be a bug + // $color -> "red", and $colorDark's reference gets its "$color" prefix + // replaced first, yielding "redDark" + expect(result.style).toContain("color: red;"); + expect(result.style).toContain("border-color: redDark;"); + expect(result.variables).toEqual({ color: "red", colorDark: "blue" }); + }); + + it("CHARACTERIZATION: indented $variable declarations are left verbatim (not treated as variables)", () => { + const style = ` $indented: green; +node { + color: $other; +}`; + const result = preprocessStyle(style); + + // indented decl is NOT captured as a variable + expect(result.variables.indented).toBeUndefined(); + // and the indented line is left in the output verbatim + expect(result.style).toContain(" $indented: green;"); + }); + + it("CHARACTERIZATION: a declaration line must end with a semicolon to be captured", () => { + const style = `$nosemi: green +node { color: red; }`; + const result = preprocessStyle(style); + + expect(result.variables.nosemi).toBeUndefined(); + expect(result.style).toContain("$nosemi: green"); + }); +}); + +describe("preprocessStyle - dynamic class detection (store side effect)", () => { + it("detects childless / edge / parent type_name classes into the store", () => { + const style = `:childless.color_blue { + background-color: blue; +} +edge.color_red { + line-color: red; +} +:parent.color_grey { + background-color: grey; +}`; + preprocessStyle(style); + + const state = useProcessStyleStore.getState(); + expect(state.dynamicClassesChildless).toEqual(["color_blue"]); + expect(state.dynamicClassesEdges).toEqual(["color_red"]); + expect(state.dynamicClassesParent).toEqual(["color_grey"]); + }); + + it("detects multiple dynamic classes of the same kind", () => { + const style = `:childless.color_blue { background-color: blue; } +:childless.shape_diamond { shape: diamond; }`; + preprocessStyle(style); + + expect(useProcessStyleStore.getState().dynamicClassesChildless).toEqual([ + "color_blue", + "shape_diamond", + ]); + }); + + it("CHARACTERIZATION: an INDENTED dynamic selector is NOT detected (requires line start)", () => { + const style = ` :childless.color_blue { + background-color: blue; +}`; + preprocessStyle(style); + + expect(useProcessStyleStore.getState().dynamicClassesChildless).toEqual([]); + }); + + it("CHARACTERIZATION: a class WITHOUT an underscore is NOT detected (type_name convention required)", () => { + const style = `:childless.highlight { + background-color: yellow; +}`; + preprocessStyle(style); + + expect(useProcessStyleStore.getState().dynamicClassesChildless).toEqual([]); + }); + + it("CHARACTERIZATION: a compound selector prefix (node:childless.foo_bar) is NOT detected", () => { + const style = `node:childless.color_blue { + background-color: blue; +}`; + preprocessStyle(style); + + expect(useProcessStyleStore.getState().dynamicClassesChildless).toEqual([]); + }); +}); + +describe("getStyleStringFromMeta", () => { + it("returns only cytoscapeStyle when customCssOnly is true", () => { + const meta = { + customCssOnly: true, + cytoscapeStyle: "node { color: red; }", + themeEditor: defaultTheme, + }; + expect(getStyleStringFromMeta(meta)).toBe("node { color: red; }"); + }); + + it("returns empty string when customCssOnly is true and cytoscapeStyle is missing", () => { + const meta = { customCssOnly: true }; + expect(getStyleStringFromMeta(meta)).toBe(""); + }); + + it("concatenates theme.style, cytoscapeStyle, theme.postStyle (in that order) when not customCssOnly", () => { + const cytoscapeStyle = "/* USER_CSS_MARKER */"; + const meta = { + customCssOnly: false, + cytoscapeStyle, + themeEditor: defaultTheme, + }; + const result = getStyleStringFromMeta(meta); + + // user css appears, sandwiched between theme.style and theme.postStyle + expect(result).toContain(cytoscapeStyle); + + // Verify the join order against the same toTheme output used internally. + // We re-derive it to pin the \n separators + order. + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { toTheme } = require("./toTheme"); + const theme = toTheme(defaultTheme); + expect(result).toBe( + `${theme.style}\n${cytoscapeStyle}\n${theme.postStyle}` + ); + + // order: theme.style index < user css index < postStyle index + const userIdx = result.indexOf(cytoscapeStyle); + expect(result.indexOf(theme.style)).toBeLessThan(userIdx); + expect(userIdx).toBeLessThan(result.lastIndexOf(theme.postStyle)); + }); + + it("CHARACTERIZATION: explicit customCssOnly=false falls through to concatenation (only null/undefined fall back)", () => { + const meta = { + customCssOnly: false, + cytoscapeStyle: "/* X */", + themeEditor: defaultTheme, + }; + const result = getStyleStringFromMeta(meta); + expect(result).toContain("/* X */"); + // not just the raw cytoscapeStyle + expect(result).not.toBe("/* X */"); + }); +}); + +describe("preprocessStyle - font data (browser-API dependent, guarded)", () => { + /** + * Probe whether constructable-CSSStyleSheet rule parsing actually works in + * this environment. In a real browser, `replaceSync` populates `cssRules` + * with parsed CSSStyleRule objects whose `.selectorText` / `.style` are + * readable — which is what findFontData relies on. Under jest/jsdom this + * frequently does NOT populate cssRules, so findFontData returns {}. + */ + function sheetParsingWorks(): boolean { + try { + const s = new CSSStyleSheet(); + if (typeof (s as any).replaceSync !== "function") return false; + (s as any).replaceSync("node { font-size: 16px; }"); + const rules = Array.from((s as any).cssRules || []) as any[]; + const nodeRule = rules.find((r) => r?.selectorText === "node"); + return !!(nodeRule && nodeRule.style && nodeRule.style.fontSize); + } catch { + return false; + } + } + + it("populates store.fontData from a 'node' rule (only when the env can parse stylesheets)", () => { + const style = `node { + font-family: "Arial"; + font-size: 16px; +}`; + preprocessStyle(style); + const fontData = useProcessStyleStore.getState().fontData as any; + + if (!sheetParsingWorks()) { + // CHARACTERIZATION: under jest/jsdom, constructable-stylesheet rule + // parsing does not populate cssRules, so findFontData returns {}. + // The font path is therefore only meaningfully exercised in a real + // browser. The variable/import/dynamic-class paths above are the safe + // core and need none of this. + expect(fontData).toEqual({}); + return; + } + + // Browser-like env: fontFamily is sanitized (quotes removed) and empty + // props are dropped. + expect(fontData.fontFamily).toBe("Arial"); + expect(fontData.fontSize).toBe("16px"); + }); +}); diff --git a/app/src/lib/repairText.characterization.test.ts b/app/src/lib/repairText.characterization.test.ts new file mode 100644 index 000000000..714f6247c --- /dev/null +++ b/app/src/lib/repairText.characterization.test.ts @@ -0,0 +1,221 @@ +import { parse } from "graph-selector"; + +import { repairText } from "./repairText"; + +/** + * CHARACTERIZATION TESTS for repairText. + * + * These lock down the CURRENT behavior of repairText (and, by extension, the + * graph-selector v0.13.0 error-message strings it depends on) ahead of a future + * framework migration. They assert what the code ACTUALLY does today, not what + * it ideally should do. Several cases document surprising-but-intentional + * behavior; those are flagged with CHARACTERIZATION comments. + */ +describe("repairText (characterization)", () => { + describe("inputs that graph-selector already considers valid -> null", () => { + test("empty string returns null", () => { + // '' parses cleanly, so newText is never assigned -> null. + expect(repairText("")).toBe(null); + }); + + test("whitespace-only input returns null", () => { + expect(repairText(" ")).toBe(null); + }); + + test("newline-only input returns null", () => { + expect(repairText("\n\n")).toBe(null); + }); + + test("plain valid text returns null", () => { + expect(repairText("hello world")).toBe(null); + }); + + test("an edge ('a -> b') is valid and returns null", () => { + expect(repairText("a -> b")).toBe(null); + }); + + test("unmatched / stray parens with no node before them parse fine -> null", () => { + // CHARACTERIZATION: graph-selector is permissive about bare parens. + // '((((' does NOT trigger the pointer error and is left untouched. + expect(repairText("((((")).toBe(null); + expect(repairText("(a)(b)")).toBe(null); + }); + + test("a leading-colon line (': x') is treated as VALID -> null (no repair)", () => { + // CHARACTERIZATION: ': x' parses cleanly in graph-selector, so repairText + // returns null even though a human might read it as malformed. The colon + // is NOT escaped. Documents the null-means-"was fine" path. + expect(repairText(": x")).toBe(null); + }); + }); + + describe("idempotency: already-escaped text must not be re-escaped", () => { + test("already-escaped colon ('a\\: b') returns null and is NOT double-escaped", () => { + // Protects existing customer charts that legitimately use escaped colons. + expect(repairText("a\\: b")).toBe(null); + }); + + test("fully-escaped paren+colon result returns null (stable fixed point)", () => { + // The output of repairing 'hello (world): foo' must itself be valid. + expect(repairText("hello \\(world\\)\\: foo")).toBe(null); + }); + + test("only the UNescaped offending char is escaped when one is already escaped", () => { + // CHARACTERIZATION: 'a\: already (paren)' has a pre-escaped colon and a + // raw paren. Only the paren gets escaped; the existing '\:' is left as-is + // (the colon-escape branch never runs because no colon error is thrown + // once parens are fixed). Output: 'a\: already \(paren\)'. + expect(repairText("a\\: already (paren)")).toBe( + "a\\: already \\(paren\\)" + ); + }); + }); + + describe("pointer branch (parentheses) — driven by the 'pointer' substring", () => { + test("single parenthesized pair gets both parens escaped", () => { + expect(repairText("hello (world)")).toBe("hello \\(world\\)"); + }); + + test("multiple parenthesized pairs all get escaped (global replace)", () => { + expect(repairText("hello (world) (again)")).toBe( + "hello \\(world\\) \\(again\\)" + ); + }); + + test("the exact graph-selector error message contains the 'pointer' substring", () => { + // Highest-value migration tripwire: repairText dispatches on + // error.message.includes("pointer"). Pin the real message so a + // graph-selector wording change is caught here. + let message = ""; + try { + parse("hello (world)"); + } catch (e) { + message = (e as Error).message; + } + expect(message).toBe( + "Line 1: Can't create node and pointer on same line" + ); + expect(message.includes("pointer")).toBe(true); + }); + }); + + describe("label-without-parent branch (colons) — driven by the 'label without parent' substring", () => { + test("single colon gets escaped", () => { + expect(repairText("hello: world")).toBe("hello\\: world"); + }); + + test("multiple colons on one line all get escaped (global replace)", () => { + // CHARACTERIZATION: even though only the first colon triggers the error, + // EVERY colon in the text is escaped because the replace is global. + expect(repairText("a: b: c")).toBe("a\\: b\\: c"); + }); + + test("the exact graph-selector error message contains the 'label without parent' substring", () => { + let message = ""; + try { + parse("hello: world"); + } catch (e) { + message = (e as Error).message; + } + expect(message).toBe("Line 1: Edge label without parent"); + expect(message.includes("label without parent")).toBe(true); + }); + + test("'missing indentation' branch is dead: an object-destructure+type line takes the colon branch", () => { + // CHARACTERIZATION: the test historically named "Edge missing indentation" + // actually exercises the 'label without parent' (colon) branch. There is + // no graph-selector error containing 'missing indentation' in v0.13.0, so + // the third branch is unreachable (but identical in effect to the second). + expect( + repairText( + "export function TextEditor({ extendOptions = {}, ...props }: TextEditorProps) {" + ) + ).toBe( + "export function TextEditor({ extendOptions = {}, ...props }\\: TextEditorProps) {" + ); + }); + }); + + describe("multi-line over-escaping (global replace across all lines)", () => { + test("a colon on ONLY one line still escapes colons; offending line gets escaped", () => { + // Here only line 2 has a colon, so only line 2 changes — but the escape + // is applied to the whole text, so ALL colons (anywhere) would be hit. + expect(repairText("good line\nbad: line")).toBe("good line\nbad\\: line"); + }); + + test("colons on multiple lines ALL get escaped from a single offending error", () => { + // CHARACTERIZATION: the offending error is reported on the FIRST bad line + // only, but because the replace is global, the colon on the OTHER + // (independent) line is ALSO escaped. Documents the over-escaping + // idiosyncrasy as current intended behavior. + expect(repairText("first: one\nsecond: two")).toBe( + "first\\: one\nsecond\\: two" + ); + }); + }); + + describe("combined paren + colon resolves across multiple loop passes", () => { + test("'hello (world): foo' escapes colon first, then parens (order-dependent)", () => { + // CHARACTERIZATION: graph-selector surfaces the 'label without parent' + // (colon) error before the 'pointer' (paren) error, so colons are escaped + // on the first pass and parens on a later pass. The final string is the + // same regardless of order, but this pins the parser's error-ordering + // coupling so a reordering in a future version is detected. + expect(repairText("hello (world): foo")).toBe("hello \\(world\\)\\: foo"); + }); + + test("interleaved parens and colons all get escaped", () => { + expect(repairText("a (b): (c)")).toBe("a \\(b\\)\\: \\(c\\)"); + }); + + test("the original 'Pointer bug' line (parens + colon) escapes both", () => { + expect(repairText(`export function repairText(text: string) {`)).toBe( + `export function repairText\\(text\\: string\\) {` + ); + }); + }); + + describe("safety contract: never throws, swallows unhandled errors", () => { + test("repairText never throws for a wide range of malformed inputs", () => { + const inputs = [ + "", + " ", + "\n\n\n", + "(", + ")", + "::::", + "(((:", + "a #[ weird", + "/* unterminated", + "@", + ".", + "[", + "a {invalid", + "🙂: emoji", + "tab\tcolon: x", + ]; + for (const input of inputs) { + expect(() => repairText(input)).not.toThrow(); + } + }); + + test("result of repairText, when non-null, always re-parses without error (fixed point)", () => { + // Pins that the loop terminates on a string graph-selector accepts — + // i.e. it does not leave behind a half-escaped, still-invalid string for + // these inputs. + const inputs = [ + "hello (world)", + "hello: world", + "a: b: c", + "hello (world): foo", + "a (b): (c)", + "good line\nbad: line", + ]; + for (const input of inputs) { + const repaired = repairText(input); + expect(repaired).not.toBeNull(); + expect(() => parse(repaired as string)).not.toThrow(); + } + }); + }); +}); diff --git a/app/src/lib/toExcalidraw.characterization.test.ts b/app/src/lib/toExcalidraw.characterization.test.ts new file mode 100644 index 000000000..034e88e24 --- /dev/null +++ b/app/src/lib/toExcalidraw.characterization.test.ts @@ -0,0 +1,608 @@ +import { toExcalidraw } from "./toExcalidraw"; + +/** + * CHARACTERIZATION TESTS for toExcalidraw(). + * + * toExcalidraw() reads window.__cy (a Cytoscape Core) and serializes the + * currently-rendered graph into an Excalidraw clipboard JSON string. + * + * It only touches a known subset of the Cytoscape API: + * - cy.nodes() / cy.edges() -> collections with .forEach + * - node.id(), node.position(), node.boundingBox(), node.data(), node.style() + * - edge.data(), edge._private.rstyle (internal renderer state) + * + * Headless cytoscape does NOT populate node.style() with resolved values nor + * edge._private.rstyle. Rather than render in a browser, we construct fake + * node/edge objects implementing exactly that API surface. This isolates the + * pure transform logic (rgbToHex, geometry math, bindings) that the migration + * safety net is meant to lock down. + * + * These tests pin CURRENT behavior, including bugs. Do not "fix" anything here. + */ + +type FakeStyle = Record; + +function makeNode(opts: { + id: string; + x: number; + y: number; + w: number; + h: number; + label: string; + style: FakeStyle; +}) { + return { + id: () => opts.id, + position: () => ({ x: opts.x, y: opts.y }), + boundingBox: () => ({ w: opts.w, h: opts.h }), + data: () => ({ label: opts.label }), + style: () => opts.style, + }; +} + +function makeEdge(opts: { + source: string; + target: string; + label?: string; + srcX: number; + srcY: number; + tgtX: number; + tgtY: number; +}) { + return { + data: () => ({ + source: opts.source, + target: opts.target, + label: opts.label, + }), + _private: { + rstyle: { + srcX: opts.srcX, + srcY: opts.srcY, + tgtX: opts.tgtX, + tgtY: opts.tgtY, + }, + }, + }; +} + +function makeCy(nodes: any[], edges: any[]) { + return { + nodes: () => ({ + forEach: (cb: (n: any) => void) => nodes.forEach(cb), + }), + edges: () => ({ + forEach: (cb: (e: any) => void) => edges.forEach(cb), + }), + }; +} + +// A reasonable, fully-resolved style as a real renderer would return. +function defaultStyle(overrides: Partial = {}): FakeStyle { + return { + shape: "rectangle", + "background-color": "rgb(230,57,70)", + color: "rgb(0,0,0)", + "border-width": "2px", + "border-color": "rgb(17,17,17)", + ...overrides, + }; +} + +function setCy(nodes: any[], edges: any[]) { + (window as any).__cy = makeCy(nodes, edges); +} + +afterEach(() => { + delete (window as any).__cy; + jest.restoreAllMocks(); +}); + +describe("toExcalidraw characterization", () => { + it("returns empty string when window.__cy is undefined", () => { + delete (window as any).__cy; + expect(toExcalidraw()).toBe(""); + }); + + it("returns a JSON string with envelope { type: 'excalidraw/clipboard', elements: [], files: {} }", () => { + setCy( + [ + makeNode({ + id: "n1", + x: 100, + y: 100, + w: 80, + h: 40, + label: "A", + style: defaultStyle(), + }), + ], + [] + ); + const out = toExcalidraw(); + expect(typeof out).toBe("string"); + const parsed = JSON.parse(out); + expect(parsed.type).toBe("excalidraw/clipboard"); + expect(parsed.files).toEqual({}); + expect(Array.isArray(parsed.elements)).toBe(true); + }); + + it("each node emits a shape element followed by a bound text element; text.containerId points back to the shape and shape.boundElements has {type:'text', id:}", () => { + setCy( + [ + makeNode({ + id: "n1", + x: 100, + y: 100, + w: 80, + h: 40, + label: "Hello", + style: defaultStyle(), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + expect(parsed.elements).toHaveLength(2); + + const [shape, text] = parsed.elements; + expect(shape.type).toBe("rectangle"); + expect(text.type).toBe("text"); + expect(text.text).toBe("Hello"); + expect(text.originalText).toBe("Hello"); + + // two-way binding + expect(text.containerId).toBe(shape.id); + expect(shape.boundElements).toEqual([{ type: "text", id: text.id }]); + }); + + it("unlabeled edge: emits a single arrow; boundElements on both endpoints reference the arrow id; no edge-label text element", () => { + const n1 = makeNode({ + id: "n1", + x: 100, + y: 100, + w: 80, + h: 40, + label: "A", + style: defaultStyle(), + }); + const n2 = makeNode({ + id: "n2", + x: 300, + y: 100, + w: 80, + h: 40, + label: "B", + style: defaultStyle(), + }); + setCy( + [n1, n2], + [ + makeEdge({ + source: "n1", + target: "n2", + srcX: 140, + srcY: 100, + tgtX: 260, + tgtY: 100, + }), + ] + ); + + const parsed = JSON.parse(toExcalidraw()); + // 2 nodes * (shape + text) = 4, + 1 arrow = 5 + expect(parsed.elements).toHaveLength(5); + + const arrows = parsed.elements.filter((e: any) => e.type === "arrow"); + expect(arrows).toHaveLength(1); + const arrow = arrows[0]; + + const shapes = parsed.elements.filter( + (e: any) => e.type === "rectangle" || e.type === "diamond" + ); + const sourceShape = shapes[0]; + const targetShape = shapes[1]; + + // arrow binds source -> target via mapped ids + expect(arrow.startBinding.elementId).toBe(sourceShape.id); + expect(arrow.endBinding.elementId).toBe(targetShape.id); + expect(arrow.startBinding.gap).toBe(4); + expect(arrow.endBinding.gap).toBe(4); + expect(arrow.endArrowhead).toBe("triangle"); + expect(arrow.startArrowhead).toBe(null); + + // both endpoints reference the arrow id (correct in the unlabeled path) + const sourceArrowBindings = sourceShape.boundElements.filter( + (b: any) => b.type === "arrow" + ); + const targetArrowBindings = targetShape.boundElements.filter( + (b: any) => b.type === "arrow" + ); + expect(sourceArrowBindings).toEqual([{ type: "arrow", id: arrow.id }]); + expect(targetArrowBindings).toEqual([{ type: "arrow", id: arrow.id }]); + }); + + it("LABELED edge: boundElements on endpoints reference the LABEL element id (type 'arrow'), NOT the arrow id", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // createEdge returns [labelNode, edge] when a label exists, but the caller + // pushes edgeAndLabel[0].id (the LABEL) into boundElements as type 'arrow'. + const n1 = makeNode({ + id: "n1", + x: 100, + y: 100, + w: 80, + h: 40, + label: "A", + style: defaultStyle(), + }); + const n2 = makeNode({ + id: "n2", + x: 300, + y: 100, + w: 80, + h: 40, + label: "B", + style: defaultStyle(), + }); + setCy( + [n1, n2], + [ + makeEdge({ + source: "n1", + target: "n2", + label: "EDGE LABEL", + srcX: 140, + srcY: 100, + tgtX: 260, + tgtY: 100, + }), + ] + ); + + const parsed = JSON.parse(toExcalidraw()); + + const arrow = parsed.elements.find((e: any) => e.type === "arrow"); + const edgeLabel = parsed.elements.find( + (e: any) => e.type === "text" && e.text === "EDGE LABEL" + ); + expect(arrow).toBeDefined(); + expect(edgeLabel).toBeDefined(); + + const shapes = parsed.elements.filter( + (e: any) => e.type === "rectangle" || e.type === "diamond" + ); + const sourceShape = shapes[0]; + const targetShape = shapes[1]; + + const sourceArrowBinding = sourceShape.boundElements.find( + (b: any) => b.type === "arrow" + ); + const targetArrowBinding = targetShape.boundElements.find( + (b: any) => b.type === "arrow" + ); + + // BUG: the pushed id is the LABEL's id, not the arrow's id + expect(sourceArrowBinding.id).toBe(edgeLabel.id); + expect(targetArrowBinding.id).toBe(edgeLabel.id); + expect(sourceArrowBinding.id).not.toBe(arrow.id); + + // edge label's containerId points to the arrow id + expect(edgeLabel.containerId).toBe(arrow.id); + }); + + it("rgbToHex: normal channels rgb(230,57,70) -> '#e63946' (background) and rgb(17,17,17) -> '#111111' (border)", () => { + setCy( + [ + makeNode({ + id: "n1", + x: 0, + y: 0, + w: 10, + h: 10, + label: "A", + style: defaultStyle({ + "background-color": "rgb(230,57,70)", + "border-color": "rgb(17,17,17)", + }), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + const shape = parsed.elements[0]; + expect(shape.backgroundColor).toBe("#e63946"); + expect(shape.strokeColor).toBe("#111111"); + }); + + it("rgbToHex: channel value < 16 is NOT zero-padded; rgb(5,5,5) -> malformed '#555'", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // No padStart(2,'0'), so channels < 16 emit a single hex digit. Excalidraw + // interprets '#555' as the 3-char shorthand #555555 (a different gray). + setCy( + [ + makeNode({ + id: "n1", + x: 0, + y: 0, + w: 10, + h: 10, + label: "A", + style: defaultStyle({ + "background-color": "rgb(5,5,5)", + color: "rgb(10,200,30)", + }), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + const [shape, text] = parsed.elements; + expect(shape.backgroundColor).toBe("#555"); + // rgb(10,200,30) -> 'a' + 'c8' + '1e' = '#ac81e' (5 chars, garbage) + expect(text.strokeColor).toBe("#ac81e"); + }); + + it("node with border-width 0px: strokeColor short-circuits to literal 'transparent' (border-color not converted)", () => { + setCy( + [ + makeNode({ + id: "n1", + x: 0, + y: 0, + w: 10, + h: 10, + label: "A", + style: defaultStyle({ + "border-width": "0px", + // intentionally invalid: would throw in rgbToHex if not short-circuited + "border-color": "rgb(1,2,3)", + }), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + const shape = parsed.elements[0]; + expect(shape.strokeColor).toBe("transparent"); + expect(shape.strokeWidth).toBe(0); + }); + + it("getNodeType: shape 'diamond' -> 'diamond'; ellipse and hexagon both -> 'rectangle'", () => { + setCy( + [ + makeNode({ + id: "d", + x: 0, + y: 0, + w: 10, + h: 10, + label: "D", + style: defaultStyle({ shape: "diamond" }), + }), + makeNode({ + id: "e", + x: 0, + y: 0, + w: 10, + h: 10, + label: "E", + style: defaultStyle({ shape: "ellipse" }), + }), + makeNode({ + id: "h", + x: 0, + y: 0, + w: 10, + h: 10, + label: "H", + style: defaultStyle({ shape: "hexagon" }), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + const shapes = parsed.elements.filter((e: any) => e.type !== "text"); + expect(shapes.map((s: any) => s.type)).toEqual([ + "diamond", + "rectangle", + "rectangle", + ]); + }); + + it("geometry: node x/y == 0.9*(pos - dim/2), width/height == 0.9*dim", () => { + setCy( + [ + makeNode({ + id: "n1", + x: 100, + y: 200, + w: 80, + h: 40, + label: "A", + style: defaultStyle(), + }), + ], + [] + ); + const parsed = JSON.parse(toExcalidraw()); + const shape = parsed.elements[0]; + expect(shape.x).toBeCloseTo(0.9 * (100 - 80 / 2)); // 0.9 * 60 = 54 + expect(shape.y).toBeCloseTo(0.9 * (200 - 40 / 2)); // 0.9 * 180 = 162 + expect(shape.width).toBeCloseTo(0.9 * 80); // 72 + expect(shape.height).toBeCloseTo(0.9 * 40); // 36 + }); + + it("geometry: edge points == [[srcX*0.9, srcY*0.9],[tgtX*0.9, tgtY*0.9]]; arrow element x=y=0", () => { + const n1 = makeNode({ + id: "n1", + x: 0, + y: 0, + w: 10, + h: 10, + label: "A", + style: defaultStyle(), + }); + const n2 = makeNode({ + id: "n2", + x: 0, + y: 0, + w: 10, + h: 10, + label: "B", + style: defaultStyle(), + }); + setCy( + [n1, n2], + [ + makeEdge({ + source: "n1", + target: "n2", + srcX: 140, + srcY: 100, + tgtX: 260, + tgtY: 220, + }), + ] + ); + const parsed = JSON.parse(toExcalidraw()); + const arrow = parsed.elements.find((e: any) => e.type === "arrow"); + expect(arrow.x).toBe(0); + expect(arrow.y).toBe(0); + expect(arrow.points).toEqual([ + [140 * 0.9, 100 * 0.9], + [260 * 0.9, 220 * 0.9], + ]); + }); + + it("hardcoded magic constants are present on node shape, node text, and arrow (paste-format pinning)", () => { + const n1 = makeNode({ + id: "n1", + x: 0, + y: 0, + w: 10, + h: 10, + label: "A", + style: defaultStyle(), + }); + const n2 = makeNode({ + id: "n2", + x: 0, + y: 0, + w: 10, + h: 10, + label: "B", + style: defaultStyle(), + }); + setCy( + [n1, n2], + [ + makeEdge({ + source: "n1", + target: "n2", + srcX: 1, + srcY: 1, + tgtX: 2, + tgtY: 2, + }), + ] + ); + const parsed = JSON.parse(toExcalidraw()); + const shape = parsed.elements.find((e: any) => e.type === "rectangle"); + const text = parsed.elements.find((e: any) => e.type === "text"); + const arrow = parsed.elements.find((e: any) => e.type === "arrow"); + + // node shape + expect(shape.roundness).toEqual({ type: 3 }); + expect(shape.updated).toBe(1698858608230); + expect(shape.fillStyle).toBe("solid"); + expect(shape.strokeStyle).toBe("solid"); + expect(shape.roughness).toBe(0); + expect(shape.opacity).toBe(100); + + // node text + expect(text.backgroundColor).toBe("#f8f9fa"); + expect(text.fontFamily).toBe(1); + expect(text.fontSize).toBe(16); + expect(text.roundness).toBe(null); + expect(text.updated).toBe(1698858603606); + expect(text.lineHeight).toBe(1.25); + + // arrow + expect(arrow.roundness).toEqual({ type: 2 }); + expect(arrow.strokeColor).toBe("#1e1e1e"); + expect(arrow.strokeWidth).toBe(2); + expect(arrow.updated).toBe(1698866637577); + }); + + it("referential integrity + determinism: with Math.random mocked, all bindings/containerIds resolve to real element ids and the full output is a stable snapshot", () => { + // Deterministic id sequence + let seed = 0; + jest.spyOn(Math, "random").mockImplementation(() => { + // produce distinct, stable values + seed += 0.00001; + return 0.123456789 + seed; + }); + + const n1 = makeNode({ + id: "n1", + x: 100, + y: 100, + w: 80, + h: 40, + label: "Start", + style: defaultStyle({ shape: "diamond" }), + }); + const n2 = makeNode({ + id: "n2", + x: 300, + y: 100, + w: 80, + h: 40, + label: "End", + style: defaultStyle(), + }); + setCy( + [n1, n2], + [ + makeEdge({ + source: "n1", + target: "n2", + label: "go", + srcX: 140, + srcY: 100, + tgtX: 260, + tgtY: 100, + }), + ] + ); + + const out = toExcalidraw(); + const parsed = JSON.parse(out); + + // collect all element ids + const allIds = new Set(parsed.elements.map((e: any) => e.id)); + // ids must be unique + expect(allIds.size).toBe(parsed.elements.length); + + // every reference must resolve to a real element id + for (const el of parsed.elements) { + if (el.containerId != null) { + expect(allIds.has(el.containerId)).toBe(true); + } + if (el.startBinding?.elementId != null) { + expect(allIds.has(el.startBinding.elementId)).toBe(true); + } + if (el.endBinding?.elementId != null) { + expect(allIds.has(el.endBinding.elementId)).toBe(true); + } + if (Array.isArray(el.boundElements)) { + for (const b of el.boundElements) { + expect(allIds.has(b.id)).toBe(true); + } + } + } + + // Stable byte-for-byte snapshot of the locked output shape. + expect(out).toMatchSnapshot(); + }); +}); diff --git a/app/src/lib/toJSONCanvas.characterization.test.ts b/app/src/lib/toJSONCanvas.characterization.test.ts new file mode 100644 index 000000000..8d7c54041 --- /dev/null +++ b/app/src/lib/toJSONCanvas.characterization.test.ts @@ -0,0 +1,423 @@ +import cytoscape from "cytoscape"; + +import { toJSONCanvas } from "./toJSONCanvas"; + +/** + * CHARACTERIZATION tests for toJSONCanvas. + * + * These lock in the CURRENT behavior of the Cytoscape -> Obsidian JSON Canvas + * exporter so a future framework/engine migration can't silently change the + * exported file format. They assert ACTUAL output, not ideal output. + * + * Environment notes (discovered by running, not assumed): + * - A headless cytoscape instance built with `styleEnabled: true` + an explicit + * stylesheet DOES resolve `node.renderedStyle().backgroundColor` to a concrete + * `rgb(...)` string in jsdom. So rgbToHex does not crash here. The + * non-null-assertion crash in rgbToHex is still a latent landmine if a future + * engine returns undefined/empty for renderedStyle (see notes/surprises). + * - Manual `position:` on element definitions is NOT reliably honored on a + * headless instance without a layout, so positions are set explicitly via + * `node.position({x,y})` AFTER construction. This is the only way to drive the + * side-scoring heuristic deterministically. + * - `width`/`height` from the stylesheet ARE applied: e.g. style width:40 -> + * exported width Math.round(40 + 46) = 86. + */ + +type CyOpts = cytoscape.CytoscapeOptions; + +const NODE_STYLE = [ + { + selector: "node", + style: { + "background-color": "rgb(227,242,253)", // -> #e3f2fd + width: 40, + height: 20, + }, + }, +]; + +function buildCy(opts: Omit, "headless">) { + return cytoscape({ + headless: true, + styleEnabled: true, + ...opts, + } as CyOpts); +} + +describe("toJSONCanvas characterization", () => { + it("empty graph returns { nodes: [], edges: [] } (always-present arrays)", () => { + const cy = buildCy({ elements: [], style: NODE_STYLE }); + const out = toJSONCanvas(cy); + + // CHARACTERIZATION: documents current behavior. The JSONCanvas type marks + // both arrays optional, but the code always initializes them, so an empty + // graph yields explicit empty arrays, not {}. + expect(out).toEqual({ nodes: [], edges: [] }); + expect(Array.isArray(out.nodes)).toBe(true); + expect(Array.isArray(out.edges)).toBe(true); + }); + + it("single leaf node maps to a 'text' node with +46 padded, rounded width/height, label as text, and color hex", () => { + const cy = buildCy({ + elements: [{ data: { id: "a", label: "Hello" } }], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 10, y: 20 }); + + const out = toJSONCanvas(cy); + + expect(out.nodes).toEqual([ + { + id: "a", + type: "text", + x: 10, + y: 20, + // Math.round(40 + 46) and Math.round(20 + 46) -- HEIGHT_PAD=46 is added + // to BOTH width and height despite its name. + width: 86, + height: 66, + text: "Hello", + // rgb(227,242,253) -> #e3f2fd + color: "#e3f2fd", + }, + ]); + expect(out.edges).toEqual([]); + }); + + it("node with rgb(255,255,255) background OMITS the color key", () => { + const cy = buildCy({ + elements: [{ data: { id: "a", label: "White" } }], + style: [ + { + selector: "node", + style: { + "background-color": "rgb(255,255,255)", + width: 40, + height: 20, + }, + }, + ], + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + + // CHARACTERIZATION: white (#ffffff) is silently dropped -- no color key. + expect(out.nodes).toHaveLength(1); + expect(out.nodes![0]).not.toHaveProperty("color"); + expect(out.nodes![0]).toEqual({ + id: "a", + type: "text", + x: 0, + y: 0, + width: 86, + height: 66, + text: "White", + }); + }); + + it("a style of background-color:'transparent' resolves to rgb(0,0,0) and DOES emit color '#000000'", () => { + const cy = buildCy({ + elements: [{ data: { id: "a", label: "Transparent" } }], + style: [ + { + selector: "node", + style: { + "background-color": "transparent", + width: 40, + height: 20, + }, + }, + ], + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + + // CHARACTERIZATION (likely-bug-adjacent): the source only skips color when + // renderedStyle().backgroundColor === the literal string "transparent". + // But cytoscape resolves the "transparent" style to an rgb() value (here + // rgb(0,0,0)) in renderedStyle, so the string check NEVER matches and the + // node gets color "#000000" instead of being skipped. The `!== "transparent"` + // guard is effectively dead for styled nodes. No crash occurs because a + // concrete rgb() is returned. + expect(out.nodes).toHaveLength(1); + expect(out.nodes![0].color).toBe("#000000"); + }); + + it("a non-default colored node DOES emit a color hex", () => { + const cy = buildCy({ + elements: [{ data: { id: "a", label: "Red" } }], + style: [ + { + selector: "node", + style: { + "background-color": "rgb(255,0,0)", + width: 40, + height: 20, + }, + }, + ], + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.nodes![0].color).toBe("#ff0000"); + }); + + it("rgbToHex zero-pads single hex digits (e.g. rgb(1,2,3) -> #010203)", () => { + const cy = buildCy({ + elements: [{ data: { id: "a", label: "Dark" } }], + style: [ + { + selector: "node", + style: { + "background-color": "rgb(1,2,3)", + width: 40, + height: 20, + }, + }, + ], + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + // CHARACTERIZATION: padStart(2,"0") on each channel. + expect(out.nodes![0].color).toBe("#010203"); + }); + + it("parent (compound) node is typed 'group' but still carries a `text` field (TextNode shape)", () => { + const cy = buildCy({ + elements: [ + { data: { id: "parent", label: "ParentLabel" } }, + { data: { id: "child", label: "Child", parent: "parent" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("child").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + + const parent = out.nodes!.find((n) => n.id === "parent") as any; + const child = out.nodes!.find((n) => n.id === "child") as any; + + // CHARACTERIZATION: isParent() => type 'group', but the emitted object is + // still TextNode-shaped (has `text`, NOT `label`/`background`). + expect(parent.type).toBe("group"); + expect(parent.text).toBe("ParentLabel"); + expect(parent).not.toHaveProperty("label"); + expect(parent).not.toHaveProperty("background"); + + expect(child.type).toBe("text"); + expect(child.text).toBe("Child"); + }); + + it("two horizontally-separated nodes => fromSide 'right' / toSide 'left'", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "edge" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 200, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.edges![0].fromSide).toBe("right"); + expect(out.edges![0].toSide).toBe("left"); + }); + + it("two vertically-separated nodes (target below) => fromSide 'bottom' / toSide 'top'", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "edge" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 0, y: 200 }); + + const out = toJSONCanvas(cy); + expect(out.edges![0].fromSide).toBe("bottom"); + expect(out.edges![0].toSide).toBe("top"); + }); + + it("target to the left => fromSide 'left' / toSide 'right'", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "edge" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 300, y: 0 }); + cy.getElementById("b").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.edges![0].fromSide).toBe("left"); + expect(out.edges![0].toSide).toBe("right"); + }); + + it("target above => fromSide 'top' / toSide 'bottom'", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "edge" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 300 }); + cy.getElementById("b").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.edges![0].fromSide).toBe("top"); + expect(out.edges![0].toSide).toBe("bottom"); + }); + + it("perfectly overlapping nodes (all scores equal) tie-break resolves to 'down' => bottom/top", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "edge" } }, + ], + style: NODE_STYLE, + }); + // identical positions => all four direction scores equal => Object.keys + // order (down, left, right, up) makes 'down' win. + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 0, y: 0 }); + + const out = toJSONCanvas(cy); + // CHARACTERIZATION: tie-break is deterministic via object key literal order. + expect(out.edges![0].fromSide).toBe("bottom"); + expect(out.edges![0].toSide).toBe("top"); + }); + + it("edge mapping copies id, source->fromNode, target->toNode, label; fromEnd/toEnd pass through data()", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { + data: { + id: "edge1", + source: "a", + target: "b", + label: "my edge", + fromEnd: "none", + toEnd: "arrow", + }, + }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 200, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.edges![0]).toEqual({ + id: "edge1", + fromNode: "a", + toNode: "b", + label: "my edge", + fromSide: "right", + toSide: "left", + fromEnd: "none", + toEnd: "arrow", + }); + }); + + it("edge without fromEnd/toEnd keeps the keys present-but-undefined in memory; JSON.stringify drops them", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "A" } }, + { data: { id: "b", label: "B" } }, + { data: { id: "e", source: "a", target: "b", label: "lbl" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 200, y: 0 }); + + const out = toJSONCanvas(cy); + const edge = out.edges![0]; + + // CHARACTERIZATION: raw object has the keys with undefined values... + expect("fromEnd" in edge).toBe(true); + expect("toEnd" in edge).toBe(true); + expect(edge.fromEnd).toBeUndefined(); + expect(edge.toEnd).toBeUndefined(); + + // ...but the serialized form (what actually gets written to the file) drops + // undefined keys. + const serialized = JSON.parse(JSON.stringify(out)); + expect(serialized.edges[0]).not.toHaveProperty("fromEnd"); + expect(serialized.edges[0]).not.toHaveProperty("toEnd"); + expect(serialized.edges[0]).toEqual({ + id: "e", + fromNode: "a", + toNode: "b", + label: "lbl", + fromSide: "right", + toSide: "left", + }); + }); + + it("node ordering in output follows cytoscape element order (parent before child here)", () => { + const cy = buildCy({ + elements: [ + { data: { id: "first", label: "First" } }, + { data: { id: "second", label: "Second" } }, + { data: { id: "third", label: "Third" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("first").position({ x: 0, y: 0 }); + cy.getElementById("second").position({ x: 100, y: 0 }); + cy.getElementById("third").position({ x: 200, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out.nodes!.map((n) => n.id)).toEqual(["first", "second", "third"]); + }); + + it("DEFAULT stylesheet (no custom style): node still gets a color (default bg resolves to a concrete rgb)", () => { + // No `style` provided -> cytoscape default stylesheet applies. + const cy = buildCy({ + elements: [{ data: { id: "a", label: "Default" } }], + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + + // CHARACTERIZATION: With styleEnabled headless + the DEFAULT cytoscape + // stylesheet, renderedStyle().backgroundColor returns a concrete rgb() + // string, so rgbToHex does NOT throw. The default cytoscape node background + // is "#999" => rgb(153,153,153) => "#999999". This documents that the + // naive-headless rgbToHex crash hazard does NOT trigger here; it would only + // trigger if a future engine returned undefined/empty for backgroundColor. + const out = toJSONCanvas(cy); + expect(out.nodes).toHaveLength(1); + expect(out.nodes![0].color).toBe("#999999"); + }); + + it("full structural snapshot for a representative two-node + edge graph", () => { + const cy = buildCy({ + elements: [ + { data: { id: "a", label: "Start" } }, + { data: { id: "b", label: "End" } }, + { data: { id: "e", source: "a", target: "b", label: "goes to" } }, + ], + style: NODE_STYLE, + }); + cy.getElementById("a").position({ x: 0, y: 0 }); + cy.getElementById("b").position({ x: 200, y: 0 }); + + const out = toJSONCanvas(cy); + expect(out).toMatchSnapshot(); + }); +}); diff --git a/app/src/lib/toTheme.characterization.test.ts b/app/src/lib/toTheme.characterization.test.ts new file mode 100644 index 000000000..f1c14fe6f --- /dev/null +++ b/app/src/lib/toTheme.characterization.test.ts @@ -0,0 +1,408 @@ +/** + * CHARACTERIZATION TESTS for toTheme.ts + * + * These tests lock down the CURRENT behavior of the FFTheme -> Cytoscape + * conversion before a future framework/refactor migration. They are a SAFETY + * NET, not a correctness audit. Where the current behavior looks surprising or + * buggy, we intentionally pin it as-is and flag it with a CHARACTERIZATION + * comment rather than fixing it. + * + * The module under test treats its `cytoscape` import as type-only at runtime; + * toTheme() never instantiates a Core, so these tests are pure. + */ +import { toTheme, styleToString, getThemeEditor } from "./toTheme"; +import { FFTheme } from "./FFTheme"; +import { theme as defaultTheme } from "./templates/default-template"; + +/** Build a complete FFTheme by overriding the default-template theme. */ +function makeTheme(overrides: Partial = {}): FFTheme { + return { ...defaultTheme, ...overrides }; +} + +describe("toTheme - default theme (canonical baseline)", () => { + it("produces stable layout + style + postStyle for the default-template theme (dagre/DOWN)", () => { + const result = toTheme(makeTheme()); + + // Pin the full structured output. The default theme is the most common + // real-world input, so this is the canonical baseline. + expect(result.layout).toMatchSnapshot("default-layout"); + expect(result.style).toMatchSnapshot("default-style"); + expect(result.postStyle).toMatchSnapshot("default-postStyle"); + }); + + it("dagre layout sets name='dagre', rankDir from direction, and spacingFactor", () => { + const result = toTheme(makeTheme()); + expect(result.layout.name).toBe("dagre"); + // @ts-expect-error - rankDir is not on the typed LayoutOptions + expect(result.layout.rankDir).toBe("TB"); // DOWN -> TB + // @ts-expect-error - spacingFactor is written via @ts-ignore + expect(result.layout.spacingFactor).toBe(1.1); + }); + + it("default style begins with the IBM Plex Sans @import (known font prepend)", () => { + const result = toTheme(makeTheme()); + expect(result.style.startsWith("@import url(")).toBe(true); + expect(result.style).toContain("IBM+Plex+Sans"); + }); + + it("default style contains $width and $background variables", () => { + const result = toTheme(makeTheme()); + // width = textMaxWidth(146) + padding(16)*2 = 178 + expect(result.style).toContain("$width: 178px;"); + expect(result.style).toContain("$background: #ffffff;"); + }); + + it("default theme (fixedHeight=50, useFixedHeight=false) STILL emits $height variable", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + // $height is emitted whenever fixedHeight is truthy, decoupled from useFixedHeight. + const result = toTheme(makeTheme()); + expect(result.style).toContain("$height: 50px;"); + // ...but the node itself uses height: label since useFixedHeight is false. + expect(result.style).toContain("height: label;"); + }); +}); + +describe("toTheme - dagre direction mapping (RIGHT/LEFT/DOWN/UP -> LR/RL/TB/BT)", () => { + const cases: Array<[FFTheme["direction"], string]> = [ + ["RIGHT", "LR"], + ["LEFT", "RL"], + ["DOWN", "TB"], + ["UP", "BT"], + ]; + it.each(cases)( + "dagre + direction %s translates rankDir to %s", + (direction, expected) => { + const result = toTheme(makeTheme({ layoutName: "dagre", direction })); + // @ts-expect-error - rankDir written via @ts-ignore + expect(result.layout.rankDir).toBe(expected); + } + ); +}); + +describe("toTheme - klay and layered emit RAW (untranslated) direction values", () => { + it("klay sets layout.klay.direction to the raw Direction string", () => { + const result = toTheme( + makeTheme({ layoutName: "klay", direction: "RIGHT" }) + ); + expect(result.layout.name).toBe("klay"); + // CHARACTERIZATION: klay receives the raw 'RIGHT' value, NOT translated to 'LR'. + // @ts-expect-error - klay written via @ts-ignore + expect(result.layout.klay).toEqual({ direction: "RIGHT" }); + }); + + it("layered sets name='elk', elk.algorithm='layered', raw elk.direction, and BALANCED fixedAlignment", () => { + const result = toTheme( + makeTheme({ layoutName: "layered", direction: "DOWN" }) + ); + expect(result.layout.name).toBe("elk"); + // @ts-expect-error - elk written via @ts-ignore + const elk = result.layout.elk; + expect(elk.algorithm).toBe("layered"); + // CHARACTERIZATION: layered receives raw 'DOWN', NOT translated. + expect(elk["elk.direction"]).toBe("DOWN"); + expect(elk["elk.layered.nodePlacement.bk.fixedAlignment"]).toBe("BALANCED"); + }); +}); + +describe("toTheme - elk layouts set name='elk' with algorithm = original layoutName", () => { + it("mrtree -> name='elk', elk.algorithm='mrtree', no animation flags", () => { + const result = toTheme(makeTheme({ layoutName: "mrtree" })); + expect(result.layout.name).toBe("elk"); + // @ts-expect-error + expect(result.layout.elk.algorithm).toBe("mrtree"); + // @ts-expect-error + expect(result.layout.animate).toBeUndefined(); + }); + + it("radial -> name='elk', elk.algorithm='radial', no animation flags", () => { + const result = toTheme(makeTheme({ layoutName: "radial" })); + expect(result.layout.name).toBe("elk"); + // @ts-expect-error + expect(result.layout.elk.algorithm).toBe("radial"); + // @ts-expect-error + expect(result.layout.animate).toBeUndefined(); + }); + + it("stress -> name='elk' with interactive + animation flags", () => { + const result = toTheme(makeTheme({ layoutName: "stress" })); + expect(result.layout.name).toBe("elk"); + // @ts-expect-error + expect(result.layout.elk.algorithm).toBe("stress"); + // @ts-expect-error + expect(result.layout.elk.interactive).toBe(true); + // @ts-expect-error + expect(result.layout.animate).toBe(true); + // @ts-expect-error + expect(result.layout.animationDuration).toBe(150); + // @ts-expect-error + expect(result.layout.animationEasing).toBe("ease-in-out"); + }); +}); + +describe("toTheme - cose remaps to fcose with animation flags", () => { + it("cose -> name='fcose' + animate flags (distinct from elk path)", () => { + const result = toTheme(makeTheme({ layoutName: "cose" })); + expect(result.layout.name).toBe("fcose"); + // @ts-expect-error + expect(result.layout.animate).toBe(true); + // @ts-expect-error + expect(result.layout.animationDuration).toBe(150); + // @ts-expect-error + expect(result.layout.animationEasing).toBe("ease-in-out"); + // No elk key on the fcose path. + // @ts-expect-error + expect(result.layout.elk).toBeUndefined(); + }); +}); + +describe("toTheme - non-hierarchical / non-direction-aware layouts ignore direction", () => { + // CHARACTERIZATION: direction only affects dagre/klay/layered. For these + // layouts changing direction produces identical layout output. + const layouts: Array = [ + "breadthfirst", + "concentric", + "circle", + ]; + it.each(layouts)( + "%s ignores direction (DOWN vs RIGHT identical)", + (layoutName) => { + const down = toTheme(makeTheme({ layoutName, direction: "DOWN" })); + const right = toTheme(makeTheme({ layoutName, direction: "RIGHT" })); + expect(down.layout).toEqual(right.layout); + expect(down.layout.name).toBe(layoutName); + } + ); + + it("radial (an elk layout) also ignores direction", () => { + const down = toTheme( + makeTheme({ layoutName: "radial", direction: "DOWN" }) + ); + const right = toTheme( + makeTheme({ layoutName: "radial", direction: "RIGHT" }) + ); + expect(down.layout).toEqual(right.layout); + }); +}); + +describe("toTheme - taxi-direction narrow conjunction", () => { + it("curveStyle 'taxi' + mrtree -> taxi-direction 'downward' regardless of direction", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "mrtree", direction: "UP" }) + ); + expect(result.style).toContain("taxi-direction: downward;"); + }); + + it("curveStyle 'taxi' + dagre + RIGHT -> 'horizontal'", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "dagre", direction: "RIGHT" }) + ); + expect(result.style).toContain("taxi-direction: horizontal;"); + }); + + it("curveStyle 'taxi' + dagre + LEFT -> 'horizontal'", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "dagre", direction: "LEFT" }) + ); + expect(result.style).toContain("taxi-direction: horizontal;"); + }); + + it("curveStyle 'taxi' + dagre + DOWN -> 'vertical'", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "dagre", direction: "DOWN" }) + ); + expect(result.style).toContain("taxi-direction: vertical;"); + }); + + it("curveStyle 'taxi' + klay (hierarchical) gets taxi-direction", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "klay", direction: "DOWN" }) + ); + expect(result.style).toContain("taxi-direction: vertical;"); + }); + + it("curveStyle 'round-taxi' does NOT trigger taxi-direction", () => { + // CHARACTERIZATION: only literal 'taxi' triggers the branch; 'round-taxi' does not. + const result = toTheme( + makeTheme({ + curveStyle: "round-taxi", + layoutName: "dagre", + direction: "DOWN", + }) + ); + expect(result.style).not.toContain("taxi-direction"); + }); + + it("curveStyle 'taxi' + non-hierarchical layout (cose) gets NO taxi-direction", () => { + const result = toTheme( + makeTheme({ curveStyle: "taxi", layoutName: "cose", direction: "DOWN" }) + ); + expect(result.style).not.toContain("taxi-direction"); + }); +}); + +describe("toTheme - useFixedHeight controls node height (number vs 'label')", () => { + it("useFixedHeight=false -> node height is the string 'label'", () => { + const result = toTheme(makeTheme({ useFixedHeight: false })); + expect(result.style).toContain("height: label;"); + }); + + it("useFixedHeight=true -> node height is the numeric fixedHeight", () => { + const result = toTheme( + makeTheme({ useFixedHeight: true, fixedHeight: 120 }) + ); + expect(result.style).toContain("height: 120;"); + expect(result.style).not.toContain("height: label;"); + // And $height variable is also present (fixedHeight truthy). + expect(result.style).toContain("$height: 120px;"); + }); +}); + +describe("toTheme - $height variable decoupled from useFixedHeight", () => { + it("fixedHeight truthy but useFixedHeight=false STILL emits $height variable", () => { + // CHARACTERIZATION: documents current behavior, may be a bug. + const result = toTheme( + makeTheme({ useFixedHeight: false, fixedHeight: 99 }) + ); + expect(result.style).toContain("$height: 99px;"); + expect(result.style).toContain("height: label;"); // node still uses label + }); + + it("fixedHeight=0 omits the $height variable entirely", () => { + const result = toTheme( + makeTheme({ useFixedHeight: false, fixedHeight: 0 }) + ); + expect(result.style).not.toContain("$height:"); + }); +}); + +describe("toTheme - smart border classes use || (truthiness) fallback", () => { + it("borderWidth=0 (default) falls through to edgeWidth in .border_* classes", () => { + // CHARACTERIZATION / LANDMINE: `theme.borderWidth || theme.edgeWidth`. + // When borderWidth is 0, the border utility classes use edgeWidth (2), NOT 0. + // A migration replacing || with ?? would change default-theme borders for ALL customers. + const result = toTheme(makeTheme({ borderWidth: 0, edgeWidth: 2 })); + // border_solid etc. live in postStyle. + expect(result.postStyle).toContain( + ":childless.border_solid { border-width: 2;" + ); + // sanity: there is no border-width: 0 in those smart classes + expect(result.postStyle).not.toContain( + ":childless.border_solid { border-width: 0;" + ); + }); + + it("borderWidth=3 (truthy) is used directly in .border_* classes", () => { + const result = toTheme(makeTheme({ borderWidth: 3, edgeWidth: 2 })); + expect(result.postStyle).toContain( + ":childless.border_solid { border-width: 3;" + ); + }); +}); + +describe("toTheme - font @import behavior", () => { + it("known font (REM) prepends its @import snippet at the front of the style", () => { + const result = toTheme(makeTheme({ fontFamily: "REM" })); + expect(result.style.startsWith("@import url(")).toBe(true); + expect(result.style).toContain("family=REM"); + }); + + it("unknown/custom font produces NO @import; style starts with the variables block", () => { + // CHARACTERIZATION: exact-match, case-sensitive lookup. Unknown fonts get no import. + const result = toTheme(makeTheme({ fontFamily: "My Custom Font" })); + expect(result.style.includes("@import")).toBe(false); + expect(result.style.startsWith("$width:")).toBe(true); + }); + + it("font lookup is case-sensitive: 'ibm plex sans' is treated as unknown", () => { + const result = toTheme(makeTheme({ fontFamily: "ibm plex sans" })); + expect(result.style.includes("@import")).toBe(false); + }); +}); + +describe("toTheme - fontFamily is JSON.stringify-quoted across node/edge/parent", () => { + it("multi-word font name is emitted quoted in all three selectors", () => { + const result = toTheme(makeTheme({ fontFamily: "Space Grotesk" })); + // CHARACTERIZATION: font-family values are JSON.stringify'd (quoted). + const matches = result.style.match(/font-family: "Space Grotesk";/g) || []; + // node, edge, parent => 3 occurrences + expect(matches.length).toBe(3); + }); +}); + +describe("toTheme - magic-number scaling for label/border sizes", () => { + it("edge font-size = edgeTextSize*16, node font-size=16, parent=24, text-background-padding=edgeWidth", () => { + const result = toTheme(makeTheme({ edgeTextSize: 0.875, edgeWidth: 2 })); + // edge font-size: 0.875 * 16 = 14 + expect(result.style).toContain("font-size: 14;"); + // node font-size hardcoded 16 + expect(result.style).toContain("font-size: 16;"); + // parent font-size hardcoded 24 + expect(result.style).toContain("font-size: 24;"); + // text-background-padding reuses edgeWidth + expect(result.style).toContain("text-background-padding: 2;"); + }); +}); + +describe("toTheme - rotateEdgeLabel toggles text-rotation", () => { + it("true -> autorotate", () => { + const result = toTheme(makeTheme({ rotateEdgeLabel: true })); + expect(result.style).toContain("text-rotation: autorotate;"); + }); + it("false -> none", () => { + const result = toTheme(makeTheme({ rotateEdgeLabel: false })); + expect(result.style).toContain("text-rotation: none;"); + }); +}); + +describe("styleToString (exported serializer)", () => { + it("serializes camelCase->kebab, preserves pre-kebab keys, trailing-space format", () => { + const out = styleToString([ + { + selector: ":childless", + css: { + backgroundColor: "#fff", + "text-valign": "center", + textMarginY: 0, + fontSize: 16, + "border-width": 2, + } as any, + }, + ]); + // CHARACTERIZATION: exact serialized format including the space before `}`. + expect(out).toBe( + ":childless { background-color: #fff; text-valign: center; text-margin-y: 0; font-size: 16; border-width: 2; }" + ); + }); + + it("joins multiple stylesheet entries with newlines", () => { + const out = styleToString([ + { selector: "edge", css: { width: 2 } as any }, + { selector: ":parent", css: { padding: 10 } as any }, + ]); + expect(out).toBe("edge { width: 2; }\n:parent { padding: 10; }"); + }); + + it("camelToKebab is idempotent on already-kebab keys", () => { + const out = styleToString([ + { selector: "x", css: { "source-arrow-shape": "none" } as any }, + ]); + expect(out).toBe("x { source-arrow-shape: none; }"); + }); +}); + +describe("getThemeEditor", () => { + it("returns doc.meta.themeEditor when present", () => { + const custom = makeTheme({ layoutName: "klay", background: "#123456" }); + const result = getThemeEditor({ meta: { themeEditor: custom } } as any); + expect(result).toBe(custom); + }); + + it("falls back to the default-template theme when themeEditor is absent", () => { + // CHARACTERIZATION: backward-compat for legacy charts lacking themeEditor metadata. + expect(getThemeEditor({ meta: {} } as any)).toBe(defaultTheme); + expect(getThemeEditor({} as any)).toBe(defaultTheme); + expect(getThemeEditor({ meta: { themeEditor: null } } as any)).toBe( + defaultTheme + ); + }); +}); diff --git a/app/src/lib/toVisio.characterization.test.ts b/app/src/lib/toVisio.characterization.test.ts new file mode 100644 index 000000000..b2a5a43d3 --- /dev/null +++ b/app/src/lib/toVisio.characterization.test.ts @@ -0,0 +1,283 @@ +import { parse, Graph } from "graph-selector"; + +import { toVisioFlowchart, toVisioOrgChart } from "./toVisio"; + +// CHARACTERIZATION TESTS — these lock in the CURRENT behavior of toVisio.ts +// before a future framework migration. They are a safety net, not a correctness +// audit. Where behavior looks like a bug it is preserved here and flagged with a +// // CHARACTERIZATION comment, not fixed. + +const HEADER_FLOWCHART = `"Process Step ID","Process Step Description","Next Step ID","Connector Label","Shape Type"`; +const HEADER_ORGCHART = `"Employee ID","Name","Title","Manager ID","Role Type"`; + +describe("toVisioFlowchart — characterization", () => { + it("empty graph returns an empty string (NOT header-only)", async () => { + const graph = parse(``); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: papaparse.unparse([]) with header:true yields "" — there + // are no rows so no header is emitted either. Surprising: an empty input + // produces a completely empty file, not a header row. + expect(csv).toBe(""); + }); + + it("isolated node (zero edges) is Document, not Process", async () => { + const graph = parse(`a`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: a node with no edges in OR out => "Document" + expect(csv).toBe(`${HEADER_FLOWCHART}\r\n"n1","a","","","Document"`); + }); + + it("middle node of a 3-node chain (1 in, 1 out) is Process", async () => { + const graph = parse(`a\n\tb\n\t\tc`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: n2 has 1 incoming + 1 outgoing => "Process" (the else fall-through) + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","a","n2","","Start"\r\n"n2","b","n3","","Process"\r\n"n3","c","","","End"` + ); + }); + + it("top-level node with >1 outgoing is Start (NOT Decision) — Start check wins", async () => { + const graph = parse(`a\n\tb\n\tc`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: n1 has 0 incoming + 2 outgoing. The if/else cascade checks + // "no incoming => Start" BEFORE ">1 outgoing => Decision", so a root fan-out + // node is "Start", not "Decision". Two empty labels join to a single comma. + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","a","n2,n3",",","Start"\r\n"n2","b","","","End"\r\n"n3","c","","","End"` + ); + }); + + it("node with incoming AND >1 outgoing is Decision", async () => { + // a -> b ; b -> c ; b -> d => b has 1 incoming + 2 outgoing => Decision + const graph = parse(`a\n\tb: b\n\t\tc\n\t\td`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: Decision only fires when a node also has incoming edges. + expect(csv).toContain(`,"Decision"`); + expect(csv).toMatchSnapshot(); + }); + + it("edge label containing a comma is joined with literal commas (ambiguous on re-parse)", async () => { + const graph = parse(`a\n\thello, world: b`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: a label containing ", " is indistinguishable from the + // multi-edge comma separator when Visio re-parses. Locked as-is. + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","a","n2","hello, world","Start"\r\n"n2","b","","","End"` + ); + }); + + it("node label with comma and double quote is papaparse-escaped (quotes doubled)", async () => { + const graph = parse(`he said "hi", ok`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: papaparse doubles internal double-quotes (" => "") and + // wraps the whole field in quotes so the comma does not split the column. + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","he said ""hi"", ok","","","Document"` + ); + }); + + it("multiple outgoing edges where one label is empty", async () => { + // first edge unlabeled, second edge labeled + const graph = parse(`a\n\tb\n\tlbl: c`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: Connector Label accumulates ",,lbl" then slice(1) + // yields ",lbl" — the leading empty label leaves an embedded leading comma. + // (n1 is "Start" here, not "Decision", because it has no incoming edges.) + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","a","n2,n3",",lbl","Start"\r\n"n2","b","","","End"\r\n"n3","c","","","End"` + ); + }); + + it("single edge: source is Start, target is End", async () => { + const graph = parse(`a\n\tb`); + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: 0-in/1-out => Start; 1-in/0-out => End + expect(csv).toBe( + `${HEADER_FLOWCHART}\r\n"n1","a","n2","","Start"\r\n"n2","b","","","End"` + ); + }); + + it("node with 1 outgoing but multiple incoming is Process (not Decision/End)", async () => { + // a -> c, b -> c, c -> d. c (n3) has 2 incoming + 1 outgoing. + const graph: Graph = { + nodes: [ + { data: { id: "n1", label: "a", classes: "" } }, + { data: { id: "n2", label: "b", classes: "" } }, + { data: { id: "n3", label: "c", classes: "" } }, + { data: { id: "n4", label: "d", classes: "" } }, + ], + edges: [ + { + source: "n1", + target: "n3", + data: { id: "e1", label: "", classes: "" }, + }, + { + source: "n2", + target: "n3", + data: { id: "e2", label: "", classes: "" }, + }, + { + source: "n3", + target: "n4", + data: { id: "e3", label: "", classes: "" }, + }, + ], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: n3 has >1 incoming + exactly 1 outgoing => falls through + // to "Process" (not Decision, not End). Locks the else fall-through. + expect(csv).toContain(`"n3","c","n4","","Process"`); + expect(csv).toMatchSnapshot(); + }); + + it("Subprocess branch never fires for normally-parsed docs (no data.parent)", async () => { + const graph = parse(`a\n\tb\n\t\tc`); + // CHARACTERIZATION: graph-selector does not set data.parent; Subprocess is dead. + const anyParent = graph.nodes.some( + (n) => (n.data as Record).parent != null + ); + expect(anyParent).toBe(false); + const csv = await toVisioFlowchart(graph); + expect(csv).not.toContain("Subprocess"); + }); + + it("hand-built graph with data.parent DOES produce Subprocess (dead-branch coverage)", async () => { + // Manually construct a graph where a node has 1-in/1-out AND data.parent set. + const graph: Graph = { + nodes: [ + { data: { id: "n1", label: "a", classes: "" } }, + { data: { id: "n2", label: "b", classes: "", parent: "grp" } }, + { data: { id: "n3", label: "c", classes: "" } }, + ], + edges: [ + { + source: "n1", + target: "n2", + data: { id: "e1", label: "", classes: "" }, + }, + { + source: "n2", + target: "n3", + data: { id: "e2", label: "", classes: "" }, + }, + ], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const csv = await toVisioFlowchart(graph); + // CHARACTERIZATION: with data.parent + 1-in/1-out, the otherwise-dead branch fires => Subprocess + expect(csv).toContain(`"n2","b","n3","","Subprocess"`); + }); +}); + +describe("toVisioOrgChart — characterization", () => { + it("empty graph returns an empty string (NOT header-only)", async () => { + const graph = parse(``); + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: like the flowchart, empty input => "" (no header row). + expect(csv).toBe(""); + }); + + it("flat list has empty Manager ID for all", async () => { + const graph = parse(`Larry\nCurly\nMoe`); + const csv = await toVisioOrgChart(graph); + expect(csv).toBe( + `${HEADER_ORGCHART}\r\n"n1","Larry","","",""\r\n"n2","Curly","","",""\r\n"n3","Moe","","",""` + ); + }); + + it("roleType camelCase attribute populates Role Type column", async () => { + const graph = parse(`Larry [roleType=Boss]`); + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: node.data.roleType falls back into the "Role Type" column + expect(csv).toBe(`${HEADER_ORGCHART}\r\n"n1","Larry","","","Boss"`); + }); + + it("Title (capitalized) wins over title (lowercase) when both present", async () => { + // Hand-build node data with both keys to test precedence deterministically. + const graph: Graph = { + nodes: [ + { + data: { + id: "n1", + label: "Larry", + classes: "", + Title: "BigTitle", + title: "smallTitle", + }, + }, + ], + edges: [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: bracket-spelled "Title" wins over camelCase "title" + expect(csv).toBe(`${HEADER_ORGCHART}\r\n"n1","Larry","BigTitle","",""`); + }); + + it("Role Type (spaced) wins over roleType (camelCase) when both present", async () => { + const graph: Graph = { + nodes: [ + { + data: { + id: "n1", + label: "Larry", + classes: "", + ["Role Type"]: "Spaced", + roleType: "camel", + }, + }, + ], + edges: [], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: "Role Type" wins over roleType + expect(csv).toBe(`${HEADER_ORGCHART}\r\n"n1","Larry","","","Spaced"`); + }); + + it("node with two incoming edges keeps the LAST source as Manager ID", async () => { + const graph: Graph = { + nodes: [ + { data: { id: "n1", label: "A", classes: "" } }, + { data: { id: "n2", label: "B", classes: "" } }, + { data: { id: "n3", label: "C", classes: "" } }, + ], + edges: [ + { + source: "n1", + target: "n3", + data: { id: "e1", label: "", classes: "" }, + }, + { + source: "n2", + target: "n3", + data: { id: "e2", label: "", classes: "" }, + }, + ], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: last-write-wins — n3's Manager ID is n2 (the last edge), + // silently dropping n1. Multi-manager input loses data. + expect(csv).toBe( + `${HEADER_ORGCHART}\r\n"n1","A","","",""\r\n"n2","B","","",""\r\n"n3","C","","n2",""` + ); + }); + + it("special chars in Name (comma + double quote) are papaparse-escaped", async () => { + const graph = parse(`Smith, "Bob"`); + const csv = await toVisioOrgChart(graph); + // CHARACTERIZATION: quote-doubling + comma contained inside quoted field + expect(csv).toBe(`${HEADER_ORGCHART}\r\n"n1","Smith, ""Bob""","","",""`); + }); + + it("manager chain over multiple depths", async () => { + const graph = parse(`Larry\n\tCurly\n\t\tMoe`); + const csv = await toVisioOrgChart(graph); + expect(csv).toBe( + `${HEADER_ORGCHART}\r\n"n1","Larry","","",""\r\n"n2","Curly","","n1",""\r\n"n3","Moe","","n2",""` + ); + }); +}); From 9f54323dcf8d367b00c46acf62d39d2e02486254 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Thu, 28 May 2026 23:20:47 -0400 Subject: [PATCH 02/10] fix: correct Excalidraw export colors and labeled-edge arrow bindings rgbToHex now zero-pads each channel (rgb(5,5,5) emitted '#555' -> now '#050505'; rgb(10,200,30) emitted invalid 5-char '#ac81e' -> now '#0ac81e'). Labeled edges now register the arrow element's id in each endpoint's boundElements instead of the label text node's id. Both are generated-on-demand exports (no stored data changes), but re-exporting an unchanged chart now yields corrected colors for any node with an RGB channel < 16. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...toExcalidraw.characterization.test.ts.snap | 2 +- .../lib/toExcalidraw.characterization.test.ts | 27 +++++++++---------- app/src/lib/toExcalidraw.ts | 16 +++++++---- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap b/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap index 6791e7c9a..aff81d5f2 100644 --- a/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap +++ b/app/src/lib/__snapshots__/toExcalidraw.characterization.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`toExcalidraw characterization referential integrity + determinism: with Math.random mocked, all bindings/containerIds resolve to real element ids and the full output is a stable snapshot 1`] = `"{\\"type\\":\\"excalidraw/clipboard\\",\\"elements\\":[{\\"id\\":\\"4g0gsldloh\\",\\"type\\":\\"diamond\\",\\"x\\":54,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g0xl978r5\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2srwht1w\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g0xl978r5\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"Start\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g0gsldloh\\",\\"originalText\\":\\"Start\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g1edx0vtu\\",\\"type\\":\\"rectangle\\",\\"x\\":234,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g1v6kuiwj\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2srwht1w\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g1v6kuiwj\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"End\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g1edx0vtu\\",\\"originalText\\":\\"End\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g2srwht1w\\",\\"type\\":\\"text\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1700487763161,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"go\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":20,\\"containerId\\":\\"4g2bz8o5z7\\",\\"originalText\\":\\"go\\",\\"lineHeight\\":1.2},{\\"id\\":\\"4g2bz8o5z7\\",\\"type\\":\\"arrow\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":2},\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698866637577,\\"link\\":null,\\"locked\\":false,\\"points\\":[[126,90],[234,90]],\\"lastCommittedPoint\\":null,\\"startBinding\\":{\\"elementId\\":\\"4g0gsldloh\\",\\"gap\\":4},\\"endBinding\\":{\\"elementId\\":\\"4g1edx0vtu\\",\\"gap\\":4},\\"startArrowhead\\":null,\\"endArrowhead\\":\\"triangle\\"}],\\"files\\":{}}"`; +exports[`toExcalidraw characterization referential integrity + determinism: with Math.random mocked, all bindings/containerIds resolve to real element ids and the full output is a stable snapshot 1`] = `"{\\"type\\":\\"excalidraw/clipboard\\",\\"elements\\":[{\\"id\\":\\"4g0gsldloh\\",\\"type\\":\\"diamond\\",\\"x\\":54,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g0xl978r5\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2bz8o5z7\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g0xl978r5\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"Start\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g0gsldloh\\",\\"originalText\\":\\"Start\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g1edx0vtu\\",\\"type\\":\\"rectangle\\",\\"x\\":234,\\"y\\":72,\\"width\\":72,\\"height\\":36,\\"angle\\":0,\\"strokeColor\\":\\"#111111\\",\\"strokeWidth\\":2,\\"backgroundColor\\":\\"#e63946\\",\\"fillStyle\\":\\"solid\\",\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":3},\\"isDeleted\\":false,\\"boundElements\\":[{\\"type\\":\\"text\\",\\"id\\":\\"4g1v6kuiwj\\"},{\\"type\\":\\"arrow\\",\\"id\\":\\"4g2bz8o5z7\\"}],\\"updated\\":1698858608230,\\"link\\":null,\\"locked\\":false},{\\"id\\":\\"4g1v6kuiwj\\",\\"type\\":\\"text\\",\\"angle\\":0,\\"strokeColor\\":\\"#000000\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":1,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698858603606,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"End\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":14,\\"containerId\\":\\"4g1edx0vtu\\",\\"originalText\\":\\"End\\",\\"lineHeight\\":1.25},{\\"id\\":\\"4g2srwht1w\\",\\"type\\":\\"text\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":null,\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1700487763161,\\"link\\":null,\\"locked\\":false,\\"text\\":\\"go\\",\\"fontSize\\":16,\\"fontFamily\\":1,\\"textAlign\\":\\"center\\",\\"verticalAlign\\":\\"middle\\",\\"baseline\\":20,\\"containerId\\":\\"4g2bz8o5z7\\",\\"originalText\\":\\"go\\",\\"lineHeight\\":1.2},{\\"id\\":\\"4g2bz8o5z7\\",\\"type\\":\\"arrow\\",\\"x\\":0,\\"y\\":0,\\"angle\\":0,\\"strokeColor\\":\\"#1e1e1e\\",\\"backgroundColor\\":\\"#f8f9fa\\",\\"fillStyle\\":\\"solid\\",\\"strokeWidth\\":2,\\"strokeStyle\\":\\"solid\\",\\"roughness\\":0,\\"opacity\\":100,\\"groupIds\\":[],\\"frameId\\":null,\\"roundness\\":{\\"type\\":2},\\"isDeleted\\":false,\\"boundElements\\":null,\\"updated\\":1698866637577,\\"link\\":null,\\"locked\\":false,\\"points\\":[[126,90],[234,90]],\\"lastCommittedPoint\\":null,\\"startBinding\\":{\\"elementId\\":\\"4g0gsldloh\\",\\"gap\\":4},\\"endBinding\\":{\\"elementId\\":\\"4g1edx0vtu\\",\\"gap\\":4},\\"startArrowhead\\":null,\\"endArrowhead\\":\\"triangle\\"}],\\"files\\":{}}"`; diff --git a/app/src/lib/toExcalidraw.characterization.test.ts b/app/src/lib/toExcalidraw.characterization.test.ts index 034e88e24..827072e92 100644 --- a/app/src/lib/toExcalidraw.characterization.test.ts +++ b/app/src/lib/toExcalidraw.characterization.test.ts @@ -222,10 +222,9 @@ describe("toExcalidraw characterization", () => { expect(targetArrowBindings).toEqual([{ type: "arrow", id: arrow.id }]); }); - it("LABELED edge: boundElements on endpoints reference the LABEL element id (type 'arrow'), NOT the arrow id", () => { - // CHARACTERIZATION: documents current behavior, may be a bug. - // createEdge returns [labelNode, edge] when a label exists, but the caller - // pushes edgeAndLabel[0].id (the LABEL) into boundElements as type 'arrow'. + it("LABELED edge: boundElements on endpoints reference the actual ARROW element id (type 'arrow'), NOT the label id", () => { + // The caller binds the actual arrow element's id regardless of whether a + // label exists, so endpoints reference the arrow (not the edge label). const n1 = makeNode({ id: "n1", x: 100, @@ -281,10 +280,10 @@ describe("toExcalidraw characterization", () => { (b: any) => b.type === "arrow" ); - // BUG: the pushed id is the LABEL's id, not the arrow's id - expect(sourceArrowBinding.id).toBe(edgeLabel.id); - expect(targetArrowBinding.id).toBe(edgeLabel.id); - expect(sourceArrowBinding.id).not.toBe(arrow.id); + // the pushed id is the actual arrow's id, not the label's id + expect(sourceArrowBinding.id).toBe(arrow.id); + expect(targetArrowBinding.id).toBe(arrow.id); + expect(sourceArrowBinding.id).not.toBe(edgeLabel.id); // edge label's containerId points to the arrow id expect(edgeLabel.containerId).toBe(arrow.id); @@ -314,10 +313,8 @@ describe("toExcalidraw characterization", () => { expect(shape.strokeColor).toBe("#111111"); }); - it("rgbToHex: channel value < 16 is NOT zero-padded; rgb(5,5,5) -> malformed '#555'", () => { - // CHARACTERIZATION: documents current behavior, may be a bug. - // No padStart(2,'0'), so channels < 16 emit a single hex digit. Excalidraw - // interprets '#555' as the 3-char shorthand #555555 (a different gray). + it("rgbToHex: channel value < 16 is zero-padded; rgb(5,5,5) -> '#050505'", () => { + // Each channel is padded to 2 hex digits, so the result is always #rrggbb. setCy( [ makeNode({ @@ -337,9 +334,9 @@ describe("toExcalidraw characterization", () => { ); const parsed = JSON.parse(toExcalidraw()); const [shape, text] = parsed.elements; - expect(shape.backgroundColor).toBe("#555"); - // rgb(10,200,30) -> 'a' + 'c8' + '1e' = '#ac81e' (5 chars, garbage) - expect(text.strokeColor).toBe("#ac81e"); + expect(shape.backgroundColor).toBe("#050505"); + // rgb(10,200,30) -> '0a' + 'c8' + '1e' = '#0ac81e' + expect(text.strokeColor).toBe("#0ac81e"); }); it("node with border-width 0px: strokeColor short-circuits to literal 'transparent' (border-color not converted)", () => { diff --git a/app/src/lib/toExcalidraw.ts b/app/src/lib/toExcalidraw.ts index 2c3f9cf69..3ef22e50e 100644 --- a/app/src/lib/toExcalidraw.ts +++ b/app/src/lib/toExcalidraw.ts @@ -78,19 +78,23 @@ export function toExcalidraw() { label, }); + // find the actual arrow element (createEdge may also return a label node) + const arrowElement = edgeAndLabel.find((x) => x.type === "arrow"); + const arrowId = arrowElement?.id; + // add the edge to the elements const fromIndex = elements.findIndex((x) => x.id === fromId); - if (fromIndex > -1) { + if (fromIndex > -1 && arrowId) { elements[fromIndex].boundElements.push({ type: "arrow", - id: edgeAndLabel[0].id, + id: arrowId, }); } const toIndex = elements.findIndex((x) => x.id === toId); - if (toIndex > -1) { + if (toIndex > -1 && arrowId) { elements[toIndex].boundElements.push({ type: "arrow", - id: edgeAndLabel[0].id, + id: arrowId, }); } @@ -306,7 +310,9 @@ function rgbToHex(rgb: string) { .split(",") .map((x) => parseInt(x)); - return `#${r.toString(16)}${g.toString(16)}${b.toString(16)}`; + return `#${r.toString(16).padStart(2, "0")}${g + .toString(16) + .padStart(2, "0")}${b.toString(16).padStart(2, "0")}`; } /** From 51302fad588e5793a814009f8bd5a6e835d6c058 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Thu, 28 May 2026 23:20:57 -0400 Subject: [PATCH 03/10] fix: add word boundary to $variable substitution to prevent prefix collisions processScss substituted each $var with a boundary-less regex, so $color rewrote the prefix inside $colorDark (-> 'redDark'). Added a negative lookahead matching the valid name char class so a variable only matches when not followed by another name character. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/src/lib/preprocessStyle.characterization.test.ts | 12 +++++------- app/src/lib/preprocessStyle.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/lib/preprocessStyle.characterization.test.ts b/app/src/lib/preprocessStyle.characterization.test.ts index 35a45ee1c..638b5f1e9 100644 --- a/app/src/lib/preprocessStyle.characterization.test.ts +++ b/app/src/lib/preprocessStyle.characterization.test.ts @@ -94,10 +94,10 @@ describe("preprocessStyle - $variable substitution (processScss)", () => { expect(useProcessStyleStore.getState().variables.blue).toBe("#e3f2fd"); }); - it("CHARACTERIZATION: variable replace has NO word boundary so a prefix collides (likely bug)", () => { + it("variable replace has a trailing boundary so a prefix does NOT collide", () => { // $color is a prefix of $colorDark. Insertion order: color first, then colorDark. - // When substituting $color (no \b), it will replace the "$color" prefix inside - // "$colorDark" too, leaving "Dark" appended to color's value. + // With the trailing negative lookahead, substituting $color must NOT rewrite + // the "$color" prefix inside "$colorDark"; each variable resolves to its own value. const style = `$color: red; $colorDark: blue; node { @@ -106,11 +106,9 @@ node { }`; const result = preprocessStyle(style); - // CHARACTERIZATION: documents current behavior, may be a bug - // $color -> "red", and $colorDark's reference gets its "$color" prefix - // replaced first, yielding "redDark" + // $color -> "red" and $colorDark -> "blue", with no prefix collision expect(result.style).toContain("color: red;"); - expect(result.style).toContain("border-color: redDark;"); + expect(result.style).toContain("border-color: blue;"); expect(result.variables).toEqual({ color: "red", colorDark: "blue" }); }); diff --git a/app/src/lib/preprocessStyle.ts b/app/src/lib/preprocessStyle.ts index 1a2a6747e..b2f9e18de 100644 --- a/app/src/lib/preprocessStyle.ts +++ b/app/src/lib/preprocessStyle.ts @@ -313,7 +313,14 @@ function processScss(scss: string): { const updatedScss = updatedLines .map((line) => { for (const variable in variables) { - const regex = new RegExp(`\\$${variable}`, "g"); + // Escape the variable name for safe use in a regex, then add a + // negative lookahead so a variable only matches when it is NOT + // immediately followed by another valid variable-name character. + // Variable names are tokenized as [a-z0-9-_] (case-insensitive), + // so e.g. substituting $color must not rewrite the "$color" prefix + // inside "$colorDark". + const escaped = variable.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const regex = new RegExp(`\\$${escaped}(?![a-zA-Z0-9_-])`, "g"); line = line.replace(regex, variables[variable]); } return line; From 21540119cb2b038daf420f475db73604c7f27e64 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Thu, 28 May 2026 23:21:06 -0400 Subject: [PATCH 04/10] fix: clone default theme in prepareChart to stop cross-chart mutation leak prepareChart backfilled meta.themeEditor with the shared imported default theme object, then mutated its layoutName/spacingFactor during legacy-layout migration - leaking into the shared import and the next chart in the session. Now backfills a clone ({ ...theme }) so the import is never mutated. Single-chart output unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../prepareChart.characterization.test.ts | 69 +++++++++++-------- app/src/lib/prepareChart/prepareChart.ts | 4 +- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/app/src/lib/prepareChart/prepareChart.characterization.test.ts b/app/src/lib/prepareChart/prepareChart.characterization.test.ts index b3674878b..2c10c1ca2 100644 --- a/app/src/lib/prepareChart/prepareChart.characterization.test.ts +++ b/app/src/lib/prepareChart/prepareChart.characterization.test.ts @@ -22,16 +22,16 @@ import { prepareChart } from "./prepareChart"; * theme backfill, layout migration and text normalization WITHOUT touching jsdom or * the zustand store. A small number of { set: true } cases pin the side-effect path. * - * IMPORTANT MUTATION HAZARD (see "shared default theme" test): prepareChart assigns - * `meta.themeEditor = theme` (the SAME imported module-level object) and then mutates - * .layoutName / .spacingFactor on it during legacy-layout migration. That permanently - * mutates the shared `theme` import and LEAKS across subsequent prepareChart calls in - * the same module. We capture the pristine default values up-front so the leak can be - * pinned deterministically, and we keep the leak-inducing test isolated/last. + * THEME CLONING (see "shared default theme" test): prepareChart backfills + * `meta.themeEditor` with a CLONE of the default theme ({ ...theme }), not the shared + * imported object, so legacy-layout migration mutating .layoutName / .spacingFactor no + * longer leaks into the shared `theme` import or across subsequent prepareChart calls. + * We capture the pristine default values up-front and assert the shared import stays + * pristine after a mutating call. */ -// Capture the PRISTINE default theme values BEFORE any prepareChart call runs, -// because prepareChart mutates the shared `theme` object in place. +// Capture the PRISTINE default theme values BEFORE any prepareChart call runs, so we +// can assert the shared `theme` import is NOT mutated by prepareChart (it clones). const PRISTINE_LAYOUT_NAME = theme.layoutName; // "dagre" const PRISTINE_SPACING_FACTOR = theme.spacingFactor; // 1.1 const PRISTINE_THEME_SNAPSHOT = JSON.parse(JSON.stringify(theme)); @@ -65,8 +65,10 @@ describe("prepareChart (characterization)", () => { "themeEditor", ]); expect(result.meta.cytoscapeStyle).toBe(cytoscapeStyle); - // themeEditor is the (still-pristine here) default theme object reference - expect(result.meta.themeEditor).toBe(theme); + // themeEditor is a CLONE of the default theme (not the shared import ref), + // so it deep-equals the default but is a distinct object + expect(result.meta.themeEditor).not.toBe(theme); + expect(result.meta.themeEditor).toEqual(theme); expect((result.meta.themeEditor as any).layoutName).toBe( PRISTINE_LAYOUT_NAME ); @@ -179,8 +181,9 @@ describe("prepareChart (characterization)", () => { // user's cytoscapeStyle preserved (NOT overwritten with default) expect(result.meta.cytoscapeStyle).toBe("node { background-color: red; }"); - // default theme backfilled (shared `theme` reference) - expect(result.meta.themeEditor).toBe(theme); + // default theme backfilled as a CLONE (not the shared `theme` reference) + expect(result.meta.themeEditor).not.toBe(theme); + expect(result.meta.themeEditor).toEqual(theme); // CHARACTERIZATION: the easy-to-lose customCssOnly flag that disables the // backfilled default theme at render time expect(result.meta.customCssOnly).toBe(true); @@ -469,17 +472,18 @@ describe("prepareChart (characterization)", () => { }); // --------------------------------------------------------------------------- - // SHARED DEFAULT THEME MUTATION HAZARD — keep LAST; it permanently mutates the - // imported `theme` object for the rest of this module's lifetime. + // SHARED DEFAULT THEME — the default-theme backfill now assigns a CLONE of the + // imported `theme` object, so legacy-layout migration can no longer mutate the + // shared import or leak across calls. // --------------------------------------------------------------------------- - test("MUTATION HAZARD: legacy-layout migration mutates the shared imported default theme and leaks into a later default chart", async () => { - // Confirm the import is still pristine right before we trigger the leak. + test("legacy-layout migration does NOT mutate the shared imported default theme and does NOT leak into a later default chart", async () => { + // Confirm the import is pristine right before we run the migration. expect(theme.layoutName).toBe(PRISTINE_LAYOUT_NAME); expect(theme.spacingFactor).toBe(PRISTINE_SPACING_FACTOR); // Chart 1: legacy `layout` present AND themeEditor defaulted (no themeEditor - // in meta) -> prepareChart assigns meta.themeEditor = theme (shared ref) and - // then mutates layoutName/spacingFactor on it. + // in meta) -> prepareChart assigns meta.themeEditor = { ...theme } (a CLONE) + // and then mutates layoutName/spacingFactor only on that clone. const chart1 = await prepareChart({ doc: `n1\n=====\n${JSON.stringify({ layout: { name: "cose", spacingFactor: 5 }, @@ -488,23 +492,30 @@ describe("prepareChart (characterization)", () => { set: false, }); expect((chart1.meta.themeEditor as any).layoutName).toBe("cose"); + expect((chart1.meta.themeEditor as any).spacingFactor).toBe(5); - // CHARACTERIZATION (likely a bug): the shared module-level `theme` object is - // now mutated in place. - expect(theme.layoutName).toBe("cose"); - expect(theme.spacingFactor).toBe(5); + // The shared module-level `theme` object is UNCHANGED (still pristine). + expect(theme.layoutName).toBe(PRISTINE_LAYOUT_NAME); + expect(theme.spacingFactor).toBe(PRISTINE_SPACING_FACTOR); - // Chart 2: a plain default chart with no metadata. It assigns the SAME shared - // (now-mutated) theme object, so it inherits 'cose' / 5 instead of the - // pristine 'dagre' / 1.1 defaults. The state has leaked across calls. + // Chart 2: a plain default chart with no metadata. It assigns a fresh CLONE + // of the pristine theme, so it gets the default 'dagre' / 1.1 values — the + // earlier migration did NOT leak across calls. const chart2 = await prepareChart({ doc: `just text`, details: initialDoc.details, set: false, }); - expect((chart2.meta.themeEditor as any).layoutName).toBe("cose"); - expect((chart2.meta.themeEditor as any).spacingFactor).toBe(5); - // chart1 and chart2 themeEditor are literally the same object reference - expect(chart2.meta.themeEditor).toBe(chart1.meta.themeEditor); + expect((chart2.meta.themeEditor as any).layoutName).toBe( + PRISTINE_LAYOUT_NAME + ); + expect((chart2.meta.themeEditor as any).spacingFactor).toBe( + PRISTINE_SPACING_FACTOR + ); + // chart1 and chart2 themeEditor are DISTINCT objects (each a fresh clone), + // and neither is the shared import. + expect(chart2.meta.themeEditor).not.toBe(chart1.meta.themeEditor); + expect(chart2.meta.themeEditor).not.toBe(theme); + expect(chart1.meta.themeEditor).not.toBe(theme); }); }); diff --git a/app/src/lib/prepareChart/prepareChart.ts b/app/src/lib/prepareChart/prepareChart.ts index 2876217bb..90e13d1e9 100644 --- a/app/src/lib/prepareChart/prepareChart.ts +++ b/app/src/lib/prepareChart/prepareChart.ts @@ -69,12 +69,12 @@ export async function prepareChart({ typeof meta.cytoscapeStyle === "undefined" && typeof meta.themeEditor === "undefined" ) { - meta.themeEditor = theme; + meta.themeEditor = { ...theme }; meta.cytoscapeStyle = cytoscapeStyle; } else if (typeof meta.themeEditor === "undefined") { // or if there is cytoscapeStyle but no themeEditor, then // set the default theme but disable it - meta.themeEditor = theme; + meta.themeEditor = { ...theme }; meta.customCssOnly = true; } From 952698494903eb2a3470846af0f117267f073cd7 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Thu, 28 May 2026 23:21:14 -0400 Subject: [PATCH 05/10] fix: skip undo/redo push when an align is a no-op All three align functions always called setState + addToUndoStack, so a no-op align pushed a useless undo entry and wiped the user's redo history. Each now returns early when the computed positions deeply equal the originals, leaving undo/redo untouched. Real aligns are unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../lib/alignNodes.characterization.test.ts | 24 +++++++------- app/src/lib/alignNodes.ts | 31 +++++++++++++++++++ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/app/src/lib/alignNodes.characterization.test.ts b/app/src/lib/alignNodes.characterization.test.ts index 0958d26a3..4f6f97782 100644 --- a/app/src/lib/alignNodes.characterization.test.ts +++ b/app/src/lib/alignNodes.characterization.test.ts @@ -385,10 +385,10 @@ describe("undo / redo round-trip (guards the shallow-copy of originalPositions)" }); }); -describe("undo-stack pollution: even a NO-OP align pushes an undo entry and clears redo", () => { - test("a no-op alignNodes still pushes undo and wipes redo history (customer-visible landmine)", () => { - // CHARACTERIZATION: align functions ALWAYS setState + push undo, even when - // nothing changes. A no-op align therefore destroys redo history. +describe("undo-stack hygiene: a NO-OP align does NOT push an undo entry and preserves redo", () => { + test("a no-op alignNodes leaves undo/redo history untouched (no pollution)", () => { + // A no-op align (nodes far apart on both axes -> nothing snaps) must NOT + // setState or push undo, so it must NOT destroy redo history. // 1. Do a real align so there's something to undo, then undo it so redo is // available. @@ -398,26 +398,26 @@ describe("undo-stack pollution: even a NO-OP align pushes an undo entry and clea expect(canRedo()).toBe(true); // 2. Now perform a NO-OP align (nodes far apart on both axes -> nothing - // snaps). It still pushes an undo entry AND clears the redo stack. + // snaps). It must leave both stacks exactly as they were. seed({ A: { x: 0, y: 0 }, Far: { x: 9000, y: 9000 } }); const undoCountBefore = canUndo(); alignNodes(); - // redo history wiped by the no-op. - expect(canRedo()).toBe(false); - // an undo entry exists from the no-op. - expect(canUndo()).toBe(true); + // redo history preserved (the no-op did not wipe it). + expect(canRedo()).toBe(true); + // no undo entry added by the no-op. + expect(canUndo()).toBe(false); expect(undoCountBefore).toBe(false); // pre-condition: after the undo above, undo stack was empty }); - test("alignNodesHorizontally with a single id is a no-op-on-position but still pushes an undo entry", () => { + test("alignNodesHorizontally with a single id is a no-op-on-position and does NOT push an undo entry", () => { seed({ A: { x: 50, y: 7 }, B: { x: 999, y: 8 } }); // Single id -> averageX = its own x -> A unchanged. alignNodesHorizontally(["A"]); const out = getPositions()!; expect(out.A).toEqual({ x: 50, y: 7 }); // unchanged - // But an undo entry was still pushed. - expect(canUndo()).toBe(true); + // No undo entry was pushed since nothing changed. + expect(canUndo()).toBe(false); }); }); diff --git a/app/src/lib/alignNodes.ts b/app/src/lib/alignNodes.ts index 5303374c0..3b82f0068 100644 --- a/app/src/lib/alignNodes.ts +++ b/app/src/lib/alignNodes.ts @@ -2,6 +2,25 @@ import { NodePositions } from "../components/getNodePositionsFromCy"; import { useDoc } from "./useDoc"; import { addToUndoStack } from "./undoStack"; +/** + * Deep equality over two position maps. Returns true when both maps have the + * exact same set of ids and each id's x and y are identical. Used to detect + * no-op aligns so we can skip the setState + undo-stack push (which would + * otherwise pollute the undo stack and wipe redo history). + */ +function positionsAreEqual(a: NodePositions, b: NodePositions): boolean { + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + if (aKeys.length !== bKeys.length) return false; + for (const id of aKeys) { + const aPos = a[id]; + const bPos = b[id]; + if (!bPos) return false; + if (aPos.x !== bPos.x || aPos.y !== bPos.y) return false; + } + return true; +} + /** * This function tries to align nodes vertical and horiontal on their center * axis by iterating over all the nodes, finding their centers, looking for other @@ -53,6 +72,10 @@ export function alignNodes() { }; }); + // No-op guard: if nothing actually moved, don't touch state or the undo + // stack (avoids polluting undo and wiping the user's redo history). + if (positionsAreEqual(originalPositions, alignedPositions)) return; + // Update the node positions in the document state useDoc.setState((state) => ({ meta: { @@ -119,6 +142,10 @@ export function alignNodesHorizontally(nodeIds: string[]) { } } + // No-op guard: if nothing actually moved, don't touch state or the undo + // stack (avoids polluting undo and wiping the user's redo history). + if (positionsAreEqual(originalPositions, alignedPositions)) return; + // Update the node positions in the document state useDoc.setState((state) => ({ meta: { @@ -185,6 +212,10 @@ export function alignNodesVertically(nodeIds: string[]) { } } + // No-op guard: if nothing actually moved, don't touch state or the undo + // stack (avoids polluting undo and wiping the user's redo history). + if (positionsAreEqual(originalPositions, alignedPositions)) return; + // Update the node positions in the document state useDoc.setState((state) => ({ meta: { From 0bc6244143e5d2729e7a994f8a954f5307eede52 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Fri, 29 May 2026 00:30:05 -0400 Subject: [PATCH 06/10] docs: explain why prepareChart clones the default theme Insurance against a future 'simplification' back to `meta.themeEditor = theme` that would reintroduce the shared-import mutation leak fixed in a0fb926. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/src/lib/prepareChart/prepareChart.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/lib/prepareChart/prepareChart.ts b/app/src/lib/prepareChart/prepareChart.ts index 90e13d1e9..5ea4fdf2f 100644 --- a/app/src/lib/prepareChart/prepareChart.ts +++ b/app/src/lib/prepareChart/prepareChart.ts @@ -64,7 +64,12 @@ export async function prepareChart({ text = `${text.trim()}\n`; // If cytoscapeStyle is not defined, and themeEditor is not defined - // load the default theme + // load the default theme. + // NOTE: spread-clone `theme` rather than assigning it directly. The + // legacy-layout migration below mutates themeEditor.layoutName/spacingFactor + // in place, and `theme` is the shared default-template import — without the + // clone that mutation leaks into every subsequent chart in the session. + // A shallow clone suffices because only top-level scalars are mutated. if ( typeof meta.cytoscapeStyle === "undefined" && typeof meta.themeEditor === "undefined" From 74336b9a6a00021e256da59266e2b7c7828805a8 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Fri, 29 May 2026 14:58:11 +0900 Subject: [PATCH 07/10] Visual-regression net for the 13 templates (#805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: visual-regression net for the 13 templates Pixel-diffs each template's rendered graph against committed golden images (Playwright toHaveScreenshot) — the rendering half of the migration safety net. A refactor, framework migration, or deliberate render-bug fix that changes how a chart looks now fails loudly with a visible diff. - Separate playwright.visual.config.ts (Chromium, local server, AA-tolerant thresholds) so it doesn't entangle with the preview-based e2e flow. - 10 deterministic-layout templates render live (tests layout + rendering). - 3 mindmap templates use force-directed layouts that re-randomize positions; they render from committed frozen-position fixtures via a preset layout so the test is deterministic (checks rendering). The flaky set was found empirically (failed two consecutive runs), not assumed from layout name. - Scripts: visual, visual:update, visual:fixtures. Point at a non-default port with E2E_START_URL. CI wiring (Linux goldens) is a documented follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) * test: exclude visual specs from the e2e config The e2e Playwright config's testDir is "e2e" with the default *.spec.ts matcher, so it was picking up e2e/visual/templates.visual.spec.ts and would run it against the Linux preview in CI with no matching (-linux) goldens, failing the e2e check. Add testIgnore for **/visual/** so visual regression runs only via playwright.visual.config.ts. Co-Authored-By: Claude Opus 4.8 (1M context) * docs: note to run visual regression on visually significant changes Adds a Visual Regression subsection to CLAUDE.md's Testing section flagging that it's a local, manual gate (not yet in CI) and must be run whenever touching render-affecting code (toTheme, graphUtilityClasses, getSize, preprocessStyle, the Cytoscape pipeline, FFTheme, or any template). Co-Authored-By: Claude Opus 4.8 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CLAUDE.md | 15 +++ app/e2e/visual/README.md | 52 +++++++++++ app/e2e/visual/fixtures/mindmap-dark.doc.txt | 14 +++ app/e2e/visual/fixtures/mindmap.doc.txt | 16 ++++ .../visual/fixtures/playful-mindmap.doc.txt | 29 ++++++ app/e2e/visual/frozen-templates.ts | 40 ++++++++ app/e2e/visual/templates.visual.spec.ts | 72 +++++++++++++++ .../code-flow-darwin.png | Bin 0 -> 38739 bytes .../decision-flow-darwin.png | Bin 0 -> 72572 bytes .../default-darwin.png | Bin 0 -> 62924 bytes .../flowchart-darwin.png | Bin 0 -> 86615 bytes .../knowledge-graph-darwin.png | Bin 0 -> 74186 bytes .../mindmap-dark-darwin.png | Bin 0 -> 55181 bytes .../mindmap-darwin.png | Bin 0 -> 57980 bytes .../network-diagram-dark-darwin.png | Bin 0 -> 37114 bytes .../network-diagram-icons-darwin.png | Bin 0 -> 65921 bytes .../org-chart-darwin.png | Bin 0 -> 58231 bytes .../pert-light-darwin.png | Bin 0 -> 69151 bytes .../playful-mindmap-darwin.png | Bin 0 -> 96177 bytes .../process-flow-darwin.png | Bin 0 -> 57400 bytes app/package.json | 3 + app/playwright.config.ts | 5 + app/playwright.visual.config.ts | 45 +++++++++ app/scripts/generate-frozen-fixtures.mjs | 86 ++++++++++++++++++ 24 files changed, 377 insertions(+) create mode 100644 app/e2e/visual/README.md create mode 100644 app/e2e/visual/fixtures/mindmap-dark.doc.txt create mode 100644 app/e2e/visual/fixtures/mindmap.doc.txt create mode 100644 app/e2e/visual/fixtures/playful-mindmap.doc.txt create mode 100644 app/e2e/visual/frozen-templates.ts create mode 100644 app/e2e/visual/templates.visual.spec.ts create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/code-flow-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/decision-flow-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/default-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/flowchart-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/knowledge-graph-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/mindmap-dark-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/mindmap-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-dark-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-icons-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/org-chart-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/pert-light-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/playful-mindmap-darwin.png create mode 100644 app/e2e/visual/templates.visual.spec.ts-snapshots/process-flow-darwin.png create mode 100644 app/playwright.visual.config.ts create mode 100644 app/scripts/generate-frozen-fixtures.mjs diff --git a/CLAUDE.md b/CLAUDE.md index b7bd77baf..7068f1ec0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -550,6 +550,21 @@ No test files exist in the `shared` package. > **Maintainer note:** E2E test coverage is between "bad and moderate" — roughly 50% of happy paths, with no edge case or error coverage. They've been problematic over the years. Unit tests are well-maintained and passing. If we ever migrate off CRA, E2E tests will become much more important and we'll need to write more. +### Visual Regression (templates) + +Pixel-diffs all 13 templates' rendered graphs against committed golden images — the rendering half of the safety net (the logic half is the characterization tests in `app/src/lib/*.characterization.test.ts`). Runs via its own config (`app/playwright.visual.config.ts`), NOT the e2e config. See `app/e2e/visual/README.md`. + +> **⚠️ RUN THIS ON ANY VISUALLY SIGNIFICANT CHANGE.** It is currently a **local, manual gate — NOT wired to CI** (goldens are macOS-specific; Linux goldens via the Playwright Docker image is a follow-up). So CI will NOT catch a rendering regression for you. If you touch anything that can change how a chart renders — `toTheme.ts`, `graphUtilityClasses.ts`, `getSize.ts`, `preprocessStyle.ts`, the Cytoscape style/layout pipeline, `FFTheme`, or any template file — you must run it yourself. + +```bash +# the app must be served; if :3000 is taken by another project, use another port: +BROWSER=none PORT=3001 pnpm -F app dev +E2E_START_URL=http://localhost:3001 pnpm -F app visual # compare against goldens +E2E_START_URL=http://localhost:3001 pnpm -F app visual:update # regenerate after an INTENTIONAL change +``` + +After an intentional visual change: regenerate goldens, **eyeball the diff**, then commit the updated `*.png` goldens. The 3 force-directed mindmap templates use frozen-position fixtures (`pnpm -F app visual:fixtures`); regenerate those only if their content/theme changes. + ## CI/CD - **GitHub Actions:** diff --git a/app/e2e/visual/README.md b/app/e2e/visual/README.md new file mode 100644 index 000000000..0d604cf93 --- /dev/null +++ b/app/e2e/visual/README.md @@ -0,0 +1,52 @@ +# Visual regression + +Pixel-diffs the rendered graph for every template against committed golden +images. This is the **rendering half of the safety net**: a refactor, a +framework migration, or a deliberate fix to a render bug that changes how a +chart looks will fail here loudly — and you review the diff before accepting a +new golden. + +## Running + +Requires the flowchart-fun dev server. If something else owns `:3000`, run it +elsewhere and point the tests at it with `E2E_START_URL`: + +```bash +# start the app (client-only is enough — visual tests hit no /api routes) +BROWSER=none PORT=3001 pnpm -F app dev + +# compare current render against goldens +E2E_START_URL=http://localhost:3001 pnpm -F app visual + +# (re)generate goldens — do this after an intentional visual change, and review the diff +E2E_START_URL=http://localhost:3001 pnpm -F app visual:update +``` + +## Deterministic vs frozen templates + +Most templates use deterministic layouts (dagre/layered/mrtree/radial, and even +the cose network-diagrams converge stably) and are rendered live — so the test +covers **both layout and rendering**. + +Three mindmap templates use a force-directed layout that re-randomizes node +positions every render. They are listed in `frozen-templates.ts` and rendered +from a committed fixture (`fixtures/{name}.doc.txt`) with `meta.nodePositions` +baked in, so geometry is fixed via a `preset` layout and the test +deterministically checks **rendering** (not layout). The flaky set was found +empirically (failed two consecutive comparison runs), not assumed from layout +name. + +Regenerate fixtures if a frozen template's content/theme changes: + +```bash +E2E_START_URL=http://localhost:3001 pnpm -F app visual:fixtures +# then regenerate those goldens: +E2E_START_URL=http://localhost:3001 pnpm -F app visual:update -- -g mindmap +``` + +## Not yet wired to CI + +Playwright goldens are platform-specific (suffixed `-darwin` here). CI is Linux, +so running this in CI needs Linux-generated goldens (e.g. via the Playwright +Docker image). That's a deliberate follow-up — today this is a **local** +pre-migration / pre-render-fix tool, like `scripts/screenshot-templates.mjs`. diff --git a/app/e2e/visual/fixtures/mindmap-dark.doc.txt b/app/e2e/visual/fixtures/mindmap-dark.doc.txt new file mode 100644 index 000000000..8b851e59e --- /dev/null +++ b/app/e2e/visual/fixtures/mindmap-dark.doc.txt @@ -0,0 +1,14 @@ +Universe .color_blue .shape_ellipse + Stars .color_yellow + Sun .shape_circle + Planets .color_green + Earth .shape_roundrectangle + Moon .color_grey .shape_circle + Mars .color_red .shape_circle + Galaxies .color_purple + Milky Way .shape_star + Black Holes .color_black .shape_octagon + +===== +{"themeEditor":{"layoutName":"cose","spacingFactor":1,"background":"#111827","fontFamily":"Space Grotesk","shape":"roundrectangle","nodeBackground":"#1f2937","nodeForeground":"#f3f4f6","padding":15,"borderWidth":2,"borderColor":"#4b5563","textMaxWidth":100,"lineHeight":1.3,"textMarginY":0,"useFixedHeight":false,"curveStyle":"bezier","edgeWidth":2,"edgeColor":"#6b7280","sourceArrowShape":"none","targetArrowShape":"none","sourceDistanceFromNode":5,"targetDistanceFromNode":5,"edgeTextSize":1,"rotateEdgeLabel":false,"direction":"DOWN","fixedHeight":300,"arrowScale":1},"cytoscapeStyle":"\n$bg-dark: #111827;\n$bg-light: #1f2937;\n$text-light: #f3f4f6;\n$text-dark: #9ca3af;\n$accent-blue: #3b82f6;\n$accent-yellow: #fbbf24;\n$accent-green: #10b981;\n$accent-red: #ef4444;\n$accent-purple: #8b5cf6;\n$accent-grey: #6b7280;\n$accent-black: #000000;\n\nnode {\n font-weight: 400;\n text-halign: center;\n text-valign: center;\n color: $text-light;\n background-color: $bg-light;\n border-color: $text-dark;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n text-outline-color: $bg-dark;\n text-outline-width: 1px;\n text-outline-opacity: 0.5;\n}\n\nedge {\n curve-style: bezier;\n line-color: $text-dark;\n width: 2px;\n opacity: 0.8;\n}\n\n:parent {\n background-color: rgba(29, 78, 216, 0.15);\n border-color: $accent-blue;\n border-width: 2px;\n border-style: dashed;\n}\n\n:childless {\n padding: 12px;\n font-size: 14px;\n text-wrap: wrap;\n text-max-width: 90px;\n}\n\n.color_blue { background-color: $accent-blue; }\n.color_yellow { background-color: $accent-yellow; color: $bg-dark; }\n.color_green { background-color: $accent-green; }\n.color_red { background-color: $accent-red; }\n.color_purple { background-color: $accent-purple; }\n.color_grey { background-color: $accent-grey; }\n.color_black { background-color: $accent-black; }\n\n.shape_circle { shape: circle; }\n.shape_ellipse { shape: ellipse; }\n.shape_roundrectangle { shape: roundrectangle; }\n.shape_star { shape: star; }\n.shape_octagon { shape: octagon; }\n\n#Universe {\n font-size: 18px;\n font-weight: bold;\n text-max-width: 120px;\n border-width: 3px;\n border-color: $accent-yellow;\n}\n\n:childless[depth = 1] {\n font-weight: 700;\n}\n\n:childless:selected,\n:parent:selected {\n border-color: $accent-yellow;\n border-width: 3px;\n border-style: solid;\n box-shadow: 0 0 0 4px rgba(251, 191, 36, 0.4);\n}\n\nedge:selected {\n width: 4px;\n line-color: $accent-yellow;\n}\n","expires":"2026-05-30T05:15:18.481Z","customCssOnly":false,"nodePositions":{"n1":{"x":90.67366458040678,"y":-11.956547958492905},"n2":{"x":123.27758161762398,"y":80.78059141462374},"n3":{"x":92.78993602175682,"y":232.28754556266546},"n4":{"x":42.97874508916401,"y":-101.13440975012406},"n5":{"x":41.63073908276477,"y":-196.17265159894208},"n6":{"x":36.65882349396908,"y":-290.28754556266546},"n7":{"x":-166.95238074430725,"y":-116.91847656696797},"n8":{"x":-92.41263496731636,"y":42.73202943040194},"n9":{"x":-299.48551400430085,"y":57.35070103967438},"n10":{"x":299.48551400430085,"y":-17.722130573523543}}} +===== \ No newline at end of file diff --git a/app/e2e/visual/fixtures/mindmap.doc.txt b/app/e2e/visual/fixtures/mindmap.doc.txt new file mode 100644 index 000000000..886c94677 --- /dev/null +++ b/app/e2e/visual/fixtures/mindmap.doc.txt @@ -0,0 +1,16 @@ +Mind Mapping .size_lg + Learning Style .color_blue + Read .color_blue + Listen .color_blue + Summarize .color_blue + Motivation .color_orange + Tips .color_orange + Roadmap .color_orange + Review .color_green + Notes .color_green + Method .color_green + Discuss .color_green + +===== +{"themeEditor":{"layoutName":"cose","direction":"RIGHT","spacingFactor":0.95,"lineHeight":1.2,"shape":"ellipse","background":"#ffffff","textMaxWidth":100,"padding":17,"fontFamily":"Kalam","curveStyle":"bezier","textMarginY":2,"borderWidth":0,"edgeTextSize":0.8,"edgeWidth":2,"sourceArrowShape":"none","targetArrowShape":"triangle-backcurve","edgeColor":"#314137","borderColor":"#000000","nodeBackground":"#ffffff","nodeForeground":"#314137","sourceDistanceFromNode":0,"targetDistanceFromNode":7,"arrowScale":1.25,"rotateEdgeLabel":false,"useFixedHeight":false,"fixedHeight":130},"cytoscapeStyle":"$green: #ddff75;\n$blue: #bde2ff;\n$orange: #ffe253;\n$pink: #ffb6bc;\n$grey: #f2f0ea;\n\n:childless.size_lg {\n font-size: 30;\n width: 150;\n line-height: 1;\n text-max-width: 130;\n}\n\n:childless.color_orange {\n background-color: $orange;\n}\n:childless.color_green {\n background-color: $green;\n}\n:childless.color_pink {\n background-color: $pink;\n}\n:childless.color_grey {\n background-color: $grey;\n}\n:childless.color_blue {\n background-color: $blue;\n}","expires":"2026-05-30T05:15:07.598Z","customCssOnly":false,"nodePositions":{"n1":{"x":88.13698150351098,"y":-3.748122996878957},"n2":{"x":52.98235435026533,"y":-125.95716601551867},"n3":{"x":264.10074377013405,"y":-122.45533797838313},"n4":{"x":168.67021831132791,"y":-203.16977658929224},"n5":{"x":-31.78655166530496,"y":-212.3694571223207},"n6":{"x":-129.52566613670123,"y":2.300665721769835},"n7":{"x":-290.3224840190624,"y":69.70981178708847},"n8":{"x":-338.2752463117439,"y":-46.44360767536899},"n9":{"x":126.01598857370895,"y":117.85656508241166},"n10":{"x":338.27524631174384,"y":124.1721084655266},"n11":{"x":178.95491348801377,"y":212.3694571223207},"n12":{"x":-29.706801086715835,"y":186.99239568347014}}} +===== \ No newline at end of file diff --git a/app/e2e/visual/fixtures/playful-mindmap.doc.txt b/app/e2e/visual/fixtures/playful-mindmap.doc.txt new file mode 100644 index 000000000..a57f54400 --- /dev/null +++ b/app/e2e/visual/fixtures/playful-mindmap.doc.txt @@ -0,0 +1,29 @@ +My Favorite Things! .color_pink .size_lg + Animals .color_yellow + Dogs .color_blue + Fluffy .color_green + Spotty .color_green + Cats .color_blue + Whiskers .color_green + Mittens .color_green + Unicorns .color_blue + Food .color_yellow + Pizza .color_blue + Cheese .color_green + Pepperoni .color_green + Ice Cream .color_blue + Chocolate .color_green + Vanilla .color_green + Cookies .color_blue + Hobbies .color_yellow + Drawing .color_blue + Dancing .color_blue + Singing .color_blue + Places .color_yellow + Beach .color_blue + Mountains .color_blue + Space .color_blue + +===== +{"themeEditor":{"layoutName":"cose","direction":"DOWN","spacingFactor":1.1,"background":"#FFFFFF","fontFamily":"Patrick Hand","shape":"ellipse","nodeBackground":"#FFB6C1","nodeForeground":"#333333","padding":10,"borderWidth":2,"borderColor":"#FF69B4","textMaxWidth":100,"lineHeight":1.2,"textMarginY":0,"useFixedHeight":false,"curveStyle":"bezier","edgeWidth":2,"edgeColor":"#888888","sourceArrowShape":"none","targetArrowShape":"none","sourceDistanceFromNode":5,"targetDistanceFromNode":5,"arrowScale":1,"edgeTextSize":0.875,"rotateEdgeLabel":false,"fixedHeight":100},"cytoscapeStyle":"\n@import url('https://fonts.googleapis.com/css2?family=Patrick+Hand&display=swap');\n\n$pink: #FF69B4;\n$yellow: #FFD700;\n$blue: #87CEFA;\n$green: #98FB98;\n$red: #FF6B6B;\n$orange: #FFB347;\n$purple: #DDA0DD;\n$grey: #D3D3D3;\n\n:childless.size_lg {\n font-size: 30;\n width: 150;\n line-height: 1;\n text-max-width: 130;\n}\n\n:childless.color_pink {\n background-color: $pink;\n border-color: #FF1493;\n color: #FFFFFF;\n}\n\n:childless.color_yellow {\n background-color: $yellow;\n border-color: #FFA500;\n}\n\n:childless.color_blue {\n background-color: $blue;\n border-color: #4169E1;\n}\n\n:childless.color_green {\n background-color: $green;\n border-color: #32CD32;\n}\n\n:childless.color_red {\n background-color: $red;\n border-color: #CC0000;\n}\n\n:childless.color_orange {\n background-color: $orange;\n border-color: #FF8C00;\n}\n\n:childless.color_purple {\n background-color: $purple;\n border-color: #9B30FF;\n}\n\n:childless.color_grey {\n background-color: $grey;\n border-color: #A9A9A9;\n}\n\nnode:selected {\n border-width: 4px;\n border-color: #FF4500;\n}\n\nedge:selected {\n width: 4px;\n line-color: #FF4500;\n opacity: 1;\n}\n","expires":"2026-05-30T05:15:13.724Z","customCssOnly":false,"nodePositions":{"n1":{"x":-173.48639827097753,"y":-52.46520675810685},"n2":{"x":53.93519799010399,"y":-21.67378689473931},"n3":{"x":277.43638905065643,"y":24.181064150182593},"n4":{"x":492.15386732062393,"y":77.88712963131638},"n5":{"x":496.0306101024097,"y":-27.649587788518637},"n6":{"x":283.7174278419482,"y":-81.22794296358356},"n7":{"x":497.95198837020564,"y":-137.58668572355117},"n8":{"x":304.7321419601531,"y":-186.19030550597225},"n9":{"x":-171.12382748847867,"y":26.23047765790793},"n10":{"x":-96.88343749829544,"y":81.51260782776107},"n11":{"x":-48.538637440887086,"y":187.56341239001543},"n12":{"x":45.18399707265733,"y":274.3018631974429},"n13":{"x":-151.66001677937737,"y":267.70682244066893},"n14":{"x":-275.76457264334186,"y":145.64685689180754},"n15":{"x":-361.08182757054135,"y":230.6673493230766},"n16":{"x":-492.2166478178611,"y":149.6238083660829},"n17":{"x":118.31799121635522,"y":105.96625172226744},"n18":{"x":-96.44458526298203,"y":-145.07011523881692},"n19":{"x":102.3943721932104,"y":-100.18046875264983},"n20":{"x":117.24336762094659,"y":-182.25365016568432},"n21":{"x":-40.55106833627173,"y":-234.62639893791427},"n22":{"x":-282.36334235761996,"y":-169.752453377662},"n23":{"x":-228.51469396366863,"y":-274.3018631974429},"n24":{"x":-497.95198837020564,"y":-141.30781205862962},"n25":{"x":-411.8667509979206,"y":-247.34234468384224}}} +===== \ No newline at end of file diff --git a/app/e2e/visual/frozen-templates.ts b/app/e2e/visual/frozen-templates.ts new file mode 100644 index 000000000..794355649 --- /dev/null +++ b/app/e2e/visual/frozen-templates.ts @@ -0,0 +1,40 @@ +import { readFileSync } from "fs"; +import { join } from "path"; + +import { compressToEncodedURIComponent } from "lz-string"; + +/** + * Templates that proved NON-deterministic in the stability check (force-directed + * layouts re-randomize node positions every render). These are rendered with + * FROZEN positions baked into a committed fixture so the geometry is fixed and + * the visual test deterministically checks RENDERING rather than layout. + * + * Each entry has a fixture at ./fixtures/{name}.doc.txt — the full flowchart.fun + * document string with meta.nodePositions populated. Generated by + * `generate-frozen-fixtures` (see scripts/), regenerate if a template changes. + * + * Populated empirically after the first all-live stability run: these three + * mindmap templates (force-directed cose layout) failed the same comparison on + * two consecutive runs; the other 10 — including the two cose network-diagram + * templates and the ELK stress one — rendered stably and use the live path. + */ +export const FROZEN_TEMPLATES: string[] = [ + "mindmap", + "playful-mindmap", + "mindmap-dark", +]; + +const ORIGIN = process.env.E2E_START_URL || "http://localhost:3000"; + +/** + * Build a fullscreen screenshot URL from a committed frozen-document fixture. + * The /f route decodes the lz-string hash; with meta.nodePositions set, Graph + * renders a deterministic `preset` layout. + */ +export function frozenScreenshotUrl(name: string): string { + const doc = readFileSync( + join(__dirname, "fixtures", `${name}.doc.txt`), + "utf8" + ); + return `${ORIGIN}/f?screenshot=true#${compressToEncodedURIComponent(doc)}`; +} diff --git a/app/e2e/visual/templates.visual.spec.ts b/app/e2e/visual/templates.visual.spec.ts new file mode 100644 index 000000000..44810af32 --- /dev/null +++ b/app/e2e/visual/templates.visual.spec.ts @@ -0,0 +1,72 @@ +import { test, expect, Page } from "@playwright/test"; +import { templates } from "shared"; + +import { FROZEN_TEMPLATES, frozenScreenshotUrl } from "./frozen-templates"; + +/** + * Visual-regression baseline for the 13 templates. + * + * Templates exercise every layout, theme and cytoscape-style path, so pixel- + * diffing their rendered output is high-coverage protection for any rendering + * change (refactor, framework migration, or a deliberate fix to a render bug). + * + * Two render paths: + * - Deterministic-layout templates (dagre/layered/mrtree/radial): load the + * template and screenshot the live render — this tests BOTH layout and + * rendering. + * - Force-directed templates (cose/fcose, and any other that proved unstable): + * render with FROZEN node positions from a committed fixture, so geometry is + * fixed and the test deterministically checks RENDERING (not layout). See + * ./frozen-templates.ts. Listed in FROZEN_TEMPLATES. + */ + +// window.__load_template__ / __get_screenshot_link__ / __cy are declared +// globally by the app (loadTemplate.ts, useEnsureGetScreenshotLink.ts, Graph). +type TemplateName = (typeof templates)[number]; + +const RENDER_SETTLE_MS = 3000; + +/** Wait for the fullscreen canvas to be visible, fonts loaded, and render settled. */ +async function waitForCanvas(page: Page) { + const canvas = page.locator('[data-flowchart-fun-canvas="true"]'); + await canvas.waitFor({ state: "visible", timeout: 30000 }); + await page.evaluate(() => (document as any).fonts?.ready); + await page.waitForTimeout(RENDER_SETTLE_MS); + return canvas; +} + +/** Deterministic path: load template on the sandbox, open its screenshot link, screenshot. */ +async function renderLive(page: Page, name: TemplateName) { + await page.goto("/?isE2E=true"); + await page.waitForFunction( + () => typeof window.__load_template__ === "function", + null, + { timeout: 30000 } + ); + await page.evaluate((n) => window.__load_template__(n, true), name); + await page.waitForFunction(() => !!window.__cy, null, { timeout: 30000 }); + await page.waitForTimeout(RENDER_SETTLE_MS); + + const link = await page.evaluate(() => window.__get_screenshot_link__()); + expect(link, `screenshot link for ${name}`).toBeTruthy(); + await page.goto(link); + return waitForCanvas(page); +} + +test.describe("template visual regression", () => { + for (const name of templates) { + test(name, async ({ page }) => { + let canvas; + if (FROZEN_TEMPLATES.includes(name)) { + // Frozen path: navigate straight to a screenshot URL built from the + // committed fixed positions, so the layout is a deterministic preset. + await page.goto(frozenScreenshotUrl(name)); + canvas = await waitForCanvas(page); + } else { + canvas = await renderLive(page, name); + } + + await expect(canvas).toHaveScreenshot(`${name}.png`); + }); + } +}); diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/code-flow-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/code-flow-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..e47a60b09931a6138d72346ccc789a4160923b34 GIT binary patch literal 38739 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 I)bPXq03OU?a{vGU literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/decision-flow-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/decision-flow-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..7a503e022b0d8311b9a0ab130b1f6dee494719e0 GIT binary patch literal 72572 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 literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/default-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/default-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..0dce2d34bd34392d893ff25e2b5c7d0de66c947d GIT binary patch literal 62924 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 literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/flowchart-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/flowchart-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..781a979d9af0a4de4328775c4a12c901104cb53e GIT binary patch literal 86615 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

neA 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

kG3Gf#j9ruY{yRAxAzwkackD*I0=~ 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„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%0D$qq0_f?fJcb%R8l@~;gO&weZK22(h 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 QR6z*pNZ3~mhZBDM4-Y-j!vFvP literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-dark-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-dark-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ffa1b71bcdd3ed31687b1f56ec8996879b9a4d GIT binary patch literal 37114 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 RM_{&6@8!XzZ$Ewce*pi!*YN-V literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-icons-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/network-diagram-icons-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdd548f0b55a863bea8ee5842c4311bff0bfcac GIT binary patch literal 65921 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 z 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 literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/pert-light-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/pert-light-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..bab242b2838d0160fbd945828d370081c3252889 GIT binary patch literal 69151 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∋~fOl?UI6eQNCj~vP05gz{^qOLNit|rJnB)A3-F2N!TlSQyro=VFqVd57dh)z9k4s4s16FV108+XKtyhpz z_`33Za+-PkmbqPr^5WP>NU|FkW-+Xm$ZxUr!=qt_fAmbMVTMv_hxi+o2V|FNS$U0w z`z0+F`~Ste%TB2jPN#{<4ye*}=ZT1eGU=JAis?o4|3oyEGHj6Q%Oi*reIyBVFT*8x zsK-d`;AwT7qZnE+l7GVoK{i1XLUSV;2{9&D-)!yPih}_Y)W=Y?lNF$IW_$!)+vG~o zUuh@*D??CNL9B$zRY@0(c5m|0B_u62XZ z;0`=pJ-@?cmvtpb9NWY%1-eRT(j*FKgQa5&SkyLrr6F?hQ6Or!@R;)h_-`~A0#hyjIuJQUjYY#Y?jF(JlQBnE4Z=lxR%TK)XlutY%OgRmHH(1w| zp$Vg9W5pOwPScqt4Cbrz*tE?!d)VIzmN0P4I5OdRn9DKT@Tz{DmDC@@x|A-Q?vcy2 z4^mxq>`#6y2)v&E)k}W2|M!@QZM}?M(yjuW=##Z|Zeoi(Jf;vCEh{X362&`y`x)%= zmLRI&7R_u&u~S-s*|zz+%Hl_SK=vuhUfV>csP&MrL{af?&Ej1slF^} z#PCxj$hkg00{&Z(D!p+MN&*+{0xwIG`)lnfil}NRC&*5$JfWa{ zjpl#lA+I@6WWc+NWr)S(qCn7JOVdLU%D|A}#Ta&be`7y&UH*=&wVU)u%}Ls+&{!Yn zfxVkjxp1shlOKgaW9l4NCbAcrqN{?0?(7~9z~-zXL|Y{qXD{zlUir>dBtt*6sJW~t zl0DIhjfnSii@) z3Xa80V4t_UetD}BD3DVmC76I{=#YcdwB#9uk_rYxaDBZY@Y*H@;+@4Tdg&daeY+jczi$)HGO-vT+tQadn)0FG9MF1 zv$90-dMwZP<)up04a+XH#F$88A|RNOHB~Y^+FF-3Og`J>l$U#XDQh2}QdSDo+Mn1D z8!|sTu)XhCW7bzsI+&E;RI}B>d)g{lQ~LJGB+!wy$`sK*yYbxhHa6nl;jA_j*+X8@ z5LLh)ZaB$*LMP~<)kZdbs{0kdA(9{ap8M~$4M}Q9CvTFUcxm?(p|dRT-I6V4ZI}oXbROghz|)-Z%GZ0+{T-5$NK-d9PIwU3lF#ZSf1NJL}CQ zpsHBiTr$G23=}+jPu^~iE^J_1w6!=WsoxYZ+}g_XJCnFmb_ibVnUx^bHEQ7IBA3ER z4tB|IN3DIoZn-c2iWb>heUTB#7T09ySAKn)Uu(i&V|zGjx1E6;-%uBSD`!F=0|#;W z3;ml#LmA`qaT}dF%if_{dG z$wbgOkxjjC4|*qKomVVpS5DLVyn3l{QjCtWid?kwyS0v~fo=EllPfOvw1W+GfFIrU z+oPwI1N%KRJkXN;80Er(j40jt?6%1wm+_A%Ur|OiLdvSz%bbN~kAa!YmbR>_RmZm- zjWvO394(!L_f>1;&o=s=n$NfELU2MVowrpCbvrZ1%EObgym^|JwN=^ET1v;q1hOa+ zH4^TI^iZ}o@FH-nES&KyPvptX(GHec8jDn8&rc)#X%XLq3q&TVi_Jbe85k;_C%@C) zx@vn|rT4yss~{k3d%}K zk@!jjg^x3aYevk8`U`WOa=9Dae&g+S%m3RRMB6S(NxiwdXYAzcLqBLT()7|f(m%H=J-b|#{j|gTZg*>ak$fd_t)^UYn+dbl3Rb>A zwxQRJB2ug}ThtHjhcHjj$M>6Ub3oLgh@cRXN@kk)CM~u2HV3Dhh#d^5n9=$DACq)f z1Wy;J^#V1vW~R@L{@;whzRk#&7a`KPy@t|+Wsi3!wK_PJIVbv^dI98i8`L|L}{Vhad<H7nc0BPCcMFnDE z{O&T!s{EWlcCDeRnuR3MJz%5BuHXi{awJRrgoP=2T5yvf`At8>~u^tfdhe%JSPYr3NxmwjJXmb8Q`)~W3lAO ze0zVz1*SK~cpKl4fHw30(t^Hj7apkZz&uzp&lv5+g)_qo3833fNgY&Ksi zu+`oFxN+^d#huSWBBu1DEXBkWBaceO43i(R!Od=-H15;Z;iluYIg!c3jP?x*BpSIi ziRS8lu_+xakxlbD0_K3HXOXd5+9gjd_BqJF>R9J}C;`LXIm^vK>u@hm%K`bpPc#rr z0gFbD+r5*KkD4;8HEis`9co4KbtdXLL<7myXlPe2IVWU~Lvz0(Yv}v!-DNCPDDlfe z8P?~k84sAuFce78Doca0Sfv-qTaH=_9`uE#Ru@Uqlr>z}#YTtXW)ktmsrTOD;`(?I z;CseyoS-wD_b4ez6b^e;>FL zgaN59&J*~Hl?KP+h0MpZ>At9a;o|%m15C?2##P`CC81A*1_tE7jRcF&Q!g{9v+ab=)&l;T z9um~}`7UU$E3D8+5{yAOqbx}Lve**rNe&1`^$DRAolkiTif+XG_H4Uy5iQ)VSi8Cg?g%Mg0AO> zLZ2%A(Bj!hYiL4bli41BJ&C9Ef% z9W6DUJK0A5M1wQ5jDI(?CREd{{_55%?3;f)dRsuvXCL)(h_@^sT>rR_5^>ZEC#-Kl z)IkHidBNd@1%(7kn#LH|ZVNJ0Y4N*Pu{L*78^v639*{}V5FRA16S&e#Ilo36#(ElL z?uvbK8kO`aI?B-ME-BFw`nd(m63g1f4-VObh+IV5EO(S3YD-WG*FE2-vdC9DPlNzb z!D6ryFMTKOJkUkOjCr0N8)0c~t8k<}#UO5~ItMHPQF4o^*Id!o?l=YpmbbZ*(ou2@ z#Q+)TYmt_=%E`u(K)bbZWiJB=^uqY|?&;mr(Kda1vo56Z<9!8+AvGa!{8?UPJRT3o z0!^A|J~oTqy^Qq-vB*0Y(VfOZp9{z5&N6sD$IQK7O(&CkT^9SEgoD{KKFPrmJnfE+ zh#MZycm#97czJqQd-!N$tAoDkNERW}7~0=Xr5>xpK!9w_5eKIGEACMQ+DjG~sye`W z*LU$*1TWOwt?HO%LPL=051hku)=G01-`@foy8Cqi3 z-;44b$NgRYEsnTSaYNi%W@SA+e7u-4jX}f8%Q|O2EV+oQwYZLd^j-ZZXKqDG%yyn5 zve%;>yx&y!IRc$Oi>H5-l_s0Yp#Ozf!tS+>J82MeRVWJ6`L;P{UhrJDtOB#6aftT< z>%K$??u&J>F`7RkA3mXs)5w;F(_4Do-sbq!EMV$%c{%RZk)Oh=uCy zWvn;rl1=UH>*^oJMHS4-chrg=HfIkdeT2HzrIJRfM@7o!|yc(sdMww{*}wg@d0k zG_D;RIJMK3O*!h_ceNu5$CJ47c_8riZQgMAu+TwhT!@$R3U$bH8OCJMKLtBU6d)y) z^%}{&L&-7d<2=-zyu|)X7iBl2)dG6H@s@A>fQT|g=i2`%t0I8YVWRP^QzS|~o7zGk zUNS^zb2G$S!cb^Ky@WPiu(fLVV!MGI_PPz*A|t*Dodgcw_!nQ=MI9#KCyM%Hjk5F% z`ezbi3c{XM5Zrs^*K6sSHr%Q8?L(j)Rfn^wX)pX(w$YMDF`u|C8Rps(EH=7*^ybLm zk(sVp$$&(-NpWur^o(AWBP8ZRgp#Yl`6}5z4hV8^i#+_vS6eaQy zGCT#+$s1A(;K_ifDhsKa(aM^`r)u|+s7ftRcYvgPBA$JZk0eCh&DF4;8f`?Lpox2s zb<~+34#2grIbph@yJ;amg`_sCOp4vN9;UFUV2HrEYMN#jZuiwxGIv^HpQmImy(%_~ z!EEOrp(XrW&^pWAr>w3lild4Yt$C&=NLIJ`8r`XVp^gU}UJO;JljH{v^h{B3BDa7( z3EYK_(1nhoa*QD!B*xk|BNb2#mp*Vgh*#{Nb+R5182!! zw(DKhx~NM8f+|n8mJZncPz_qrrqv$ZcW+i;)i5E)XgZ}N9k1d*bBB)2(KvG+BOPu+ ze0c@w?l#%q7BOI$S^y66a64nx#omkB^`A55?kQGzicX(GD~vsy_q3F)XNzKz4!k?%dQ!VcvtoByUQC zRb@KW#v>S?FwKvvkfoRQQ>Cmi^#HyteA#{U%Y<9YQncbLl>E35=!J#W@v`>{Bmq=x z5TN$$^RuMvD`*ZrC#bH{9H-%1KKcf{U7OJY*NLg4WFkC((59*|t9Z33We(I-*5t#_ zP0t8t@!&pdTI*3mz^~QHkhyU-vo4@E=))LUute=8CPOpS8YLCwO{JerY2Mt%2QvG@@qw=cva__C zAwU@eqLZvrN)6^QKJWVaE(QQ_T}v5uxM0rn@oPX_T-lkSxGNUW$r%^23exZso%LTh zW9nfsQ~}7{N02Xi6Rp)4PxcIvmW0*W8zq%=dvX}vDSshYd$jlwe^>?pMETCmq9H$C zOR2fAHRVdn;$aXI%(EjhT|3hMi_#O&LZKSw!kMvv-?Hxi7KpWBGw)cAFT1STBjS-a z5mNC;j);deO~h!k3eC)x`UT42oPStSbX&jT_*bTcqZv()$hL{qBh;HtKi5&(|4CW~ zfc)P-kE$sFh;TS$_z%aTN$mYQRC66^kD528r~;={t0HXG#Hr+MM5*n`Wrz0V5uPH| z>e?3LvidCs%C=tzDW}Q?#5a@MB$% zs|2zYC&~(!p@;1z=Cmh#USwEGiQAVycg&yb&QF^W^tB>LGUyt>qN8tI)~SL)4)ysSzZ2dtJlbpp#&v9OSc4a(vAI1V52LljZ~;5?YM z4W9JjXzrZFSl~JE5GqBJjfZk9HU{x%rglh%SW+v*5?QYiqq$Ahy-rJz!-jxpPH=X2 zc*fvbq+!TXM}sqJUPW8-4CKr2|5U~7s8!ZjCZ05a?~+K0h$}~JF+~FU3W86{1ik)C ztBE@v;=k+~%*S7+EA2ZLu%s4Kh^cGJk78hm14wwDW}(webSx(_go}!Lk|f>T4Q0KR zM0;Y*q+NYR(i>_;wDf*Oix-TSj8gazkgq5DRG!Jb_jNd5{%zlz?jVvR#GRf8+Plj? z*Rt+!M&F&p9%&_np3pJ2#)cZD{Ry{+KRk*&%@E>Gyd;DG!I4PQk$<0EH6i1Lh8|V2 z$h3c?+sY}44?n?y^Fzk!e$&tKTIJ#?-carc2=WlE8FwT+YEOEMm;LM%D^FAfx4uMj zia&2)K{(a(J#F+p3>&5DW&B1wB#^0GZT~f#b>n5e;ovn~QJFCSGvBNGSMi1UlBZLh zgVw8uxECoLBqOCE&`@8p+B5&aUCTyUl8gMpdC_l-EwFe@+i_T{j1!gO|B}MeE-D_Y z(dzMCkXfJ7>2yC!FXbJ~js_I`%i5HrSDOX}-j};y_QdWl+8ex?y`o@%k^KMrKLW0M z@1sbp4u$MC^zP9N%h zrkAU)GCAw9J`dlJo516fhB@FYL4crU?xb~=?YcSA5kJ2G z3t89f`8#mtEE!GwAyP|c$0D1+e4Lr;-(5_)6!i!b*_={gc01b}Ezo;vwY?l#+}D57SIa~J zJ-n7>Os?|QaYIY%jMmBl#Y7HDPGxB^Z6`slY(abaIkZh8tsG^YKDa=F-h0INMxR@` ztD{(r%#h-?Q!yX$9bT2ua)KpZGRmkwojN<=lYKG#rzYpNF8s|>_V9&<)2$8ww|bDT z^rjNvi(JCzbob1|hPh;OlWs0hu|5aY^5XBU;8R3>-|b5g>t*=!F`1hkUPV^O6UpJo zvx3@`0FP=Rj)fhy)XBOWJ79HnCmW~)iq?qVd8kQ}2Ex;f4uv>-_&cpwA(P_7aw{Jh zXKQ#mt-{e*>7W!8?JCKSz6@pUZr0vPaJu0`5pSA~iruzx+O+Zi@o~%XFs-NuOWM-! zX}>HX-?FtUi5(5cyiOKg-nYc2D?A(ZS|MK(*Y3H`54LCh24C9c&%9pE-;I1Q%3mIF zk*V1TN23Rfz@e*IYc5}YIz1>*fPB%Mb^$(n%&ZSB<{q?vAn|zSNiU=of z@rQuE7`kYdecHZbiZrdCm%1;D-XNM>gQN%7oX)NBb_g2@zH?jazafALnXnacXDC~q zYSrh9uCJRG<1_SlJ*qc05=lUw`fV-kl9p`YpZtG(6}OMLk!dE`|MTTTO!|e`7%NrX zC#nSoCIx}1eFQr0RXrhp-dl)0_G&$UMH~^(qM#MPXSj_QX4a_^kG+dRp}a#ePc811 zuWcS*sITa1Ro*ZiK0|Gwv4P-*z8SD?@HJ@*nSPLCut-#1B1BpzoUNfucB^s+e}A9a zx)EJQp+zG7!DhVCrp*{Lh41BV=zHD1;nuH)v1F?KYDpeIl3R&^XZl__PTt5zfvHsU zjL(03fB!jOXic>tO_kCq|iNxkC#fMdQu$e&r zoSu?rNA2o5?xs34Io`{>?^~8Qo)A#Q^&6&d^9Hmke0(p0*&ND|o{x}urJK*cGYkE? zOyE^S_UaPeQM1PwVFjz^Sh_J@=&jCXj46wjiFYBrswC=k;p_GfFM#=z&gsq$4CS*upDOYq#cn}3S&K-v+M-f} zhwGi=34ge_Teot)wA^0z!4C!x8#q~G94u1nlPgh4B|d4P|e8K7c8h< zWon)krz{kiE~t84L})RkO$pS9qpK%P{$1B6xBSf`_#B&)jDfL#T`>3bk@1Vx4o$?x zZ1xvRrWT8scfJ&BBs=}U$DtUR$vz6F0-t4Xqq>sz0A3!O<`3#*|43u`v{^-QmI$K) z3!e*OUimnqirZvldU!q9u)Cy~sPqP`n_C^f9Q{h!Sc%1zUP7&K@G5mSPmgVr1dCH|G^Ks%TTX|Sg zqNUv2DI4}7kQ*Urtx=G|hZg$s+hH08W#Udx1~7V+<(02-hMUql$FT!7&fXlq`i5M45GBrXp3;&x zg7tDu&P&foqe)CawcSzuaFFqUv3lYMp8B4#I-Dtr$<@dx*0}~wX?x=>F)Rj?b1^>c zqkOqy!k#Ps{G8ebH;hdo=DAgzxYBqr%T_)QP0M@`=tade>XfikC91;M~uyNKOyM5 z9i7IKY~W44zy5I7Cwq4D4lTN>WFA`*G?Fns?F0H9`T>V~w<9tn+23v(=&2SSI)Qvd?4Q#i#|GI5GKoiZh`a z>{P^u=rvvEl(I`#ojJf-I6YzyS1X@nN|tXEt76>U?Rj#NIDNTJdX{*01V#STPrEf! z60i9VnU2V1=?O$9W5%pIZZI6MkDA0M=nBi7v3LhlDpLIvVZOjcWF8H!SIf{k*7$T# zEeTq4#yce9keGWGAaw1;@EdNQCyBv*cLkU|?Jaau_%%VX;}Oo;HZi4QnmwKywa5^Q z>NH6xLz)j@o4>P(qeM&cvYH!f@t$=OI)j7W8S=vHx*YjiP~`ot!*?MvdEhAm7M_G! z-P6&xCsCd}-h0jwFx#+=zQQ`2`nE8F(%w$L63OrHzGr@b=3BJmILDJP`*F<$&Cr!- zw?|btSeJdoxq=Y@bYBBn`>400G}LE3!|kp1csohWV|Gse4XRCbpT9bjs*X$=;#c&c1M1?Qo}O8pgYx{ME=qll`(ycG{nzeE5Ul*z@m)H-mzwb69cDN9CDv0c5np#KToE zZRUP)bq(CxbC;9eDv|682=Z4~dc<@Izb3^AU%l$%RMu#a6e%?;le0OPO%k98vm5*I ztyG1w#=I`gEJgng24tlsDhnaEKRK>@tK1u6l!kz+^#Jcmq5rzKa_Qx-x!A`yOKV$! zh3GRjs}0FgGdiJ(GDEBoq6<^$`(O@A_pCVaLL)blU!z@SPaW|>t!tW(zZ4!9ub&8m z0Uui#Wj5LTfJ6#LgG_de>ItoNq_pT`Z?zpVb$S3hD^U=wcRqgFDkv>@gKtBts#T*_NX!SD0^tf*mF48eh`SU2Uv{b zSQ~iIK)82?{JS@6{tJ`+-%Il3q+>gzmuZ-L!82Jm(VHUn;T;K<6WR|rQE#Uay+Kkx z$Gr-!_J$>BWR24SE&0*io+E_PlvLSGfXloFDTSBY-80Dd;vBrJJnZdIw~c|Gc7}*0 zX(TAWrC{i*r8JHzw{n4Efd|F;A@C%bHq{b{w0vB_&5pxXC=NcAV=HJ6ov@k;A3i{C zVkuaL*uwoagtzC>KmdtuyOKtwbRC&cxwFc@G%zU%w8$0RRn@F>j?;WvO{@(ke}0U5 zIeDuc>~i457~%rBp58@D{9FcB74gv6^-=g>&LJ$KJ0Q;)Mg#AS4?_MrJs^eC=F`^c z*TOx=pO54lAjGQMh_-}U&Q@6;0S%Q z{*%2{*(^3=V|dpn?q*L;|F!9CdEwm0eZcLh>2=e5u)9!c`1YLiHj`7tik>sux2nsu zwnP#?_^7wIM}}uQ5#4S&co?b?Z*xbNx>jaflleWBnc46A{$><-Jy1YqB0u^h z2!{1ONiM3ey$_>boyse(K(i@MwJgM@@SQwiXV)_!dp>0f1pO*V&m@x8LMgnid9{BI zvgqp1^;vGOQQ+Y+0RE(eex1*A8KV+5I`&q`$8PTR{?(nrm>s6knti+e6LT)+b`4kg z_JT(paBe`-5486^CH#y;Si=0gDbBjUSi5~E%5t6&=_c5eJ>>W%{Ak zTiIS)$~ixremh?OebE|Ycm1XC3xiO5d%$g&*?fN2y|@d2vM49Tyc$Rhj3zeEX62@{ z4-PEHr6vHcj6-h>fL2T?%=sNz+I%GMzu8I0KTKh({UHg*ndNh@(eo+ON+0Bcr~BDT z70m_-P|db^tN421xQjT(i{S=G&ycqzQua#BKmPZ$qk+l`V8~_+@kU4+=A`+VN1VRS z_Yy$aR^T891Cxl{J<1k8?rQTDr&=e4n#6!%Z^Uqxn1DVQAhD2_OIc$+nRkE8H+FCg zL8U{ig^fc)8(YqydH!42UL&C*t9T+}ITC1HXP^PWhNF{L5_Pd-evl^zynuC8Ca=c@ zCB2PvAg7t_u^t|~-QH5zDUg`)v6tTjNTtBbsM~XFGY2yHW^A?c>H+1KiRa%)&;(FD z2s>L->dTL!snRt=k#cp+o$Szy>y2%7;@=yW28I~>2feGHdiu{v+juP?;4aMKIF-Z3 zNcHEj|7cIr6O8eA*`J(w-&+?e-k7j_eS?|Uo1Km6a&!#bidy6k`;A8@#-v0b?YCJ?00H47Vo;f_L==LB3> zc06tMj2o!Fqt@U$pK#scUT03|<9Uw3gX3W&I8i&q>;IJc`ef8^ ze`%%^udddu=C+hJKEX~njlqtJbfTkh-5Wsa_`@2nqg>bw{?ctVQhrZbk*dO}go<+P zXJc8mJq4-=Bm5)ot|9kJIRFjgTC(@jcWJ8BCF*F6SCpV7BvxN_M@BY5ep(G*-HTc4 z-hKI1Jr#GYSn$b(wWR0eTxXpRWM(BFJ)*OuIq9vm@}KllU>SVQ91xd3sQy?tm;xt>~N;cr$O~R4Z$1I z8iEJt=X&YPU2|!)%*||`o>I+2DU!(Vv1!Yxn{Be~O*f!?2i9jO<{r5!0;F=6v`lb{0CO<&$@|y{DBfsU_QnaJAf2GrHLE6G3UdEW z;F`tU%n*zn!`=NEe-+{Es51&g;f&6E{Ym^HPfW|K>;g6_NqXqJZ&zo%4K}wxTnLZS zWxKZTVfvN$+p=C;SILS|Iq8=^z*;5LRhsyjkFC#{nsKc2o5c-E?oU>K^fnFwUsjTK za>jda5^~`|$>*L$elw&tN0rlpA4`_uO^S|)->%mb*foG;*+D;A#6=j5TW1KCF+NN8 zTCNq3lrth>0p*Z;BOsuI2&v_S883f!l<$y52GorBlK)_ZBZyfHlivg?LMOD3AK?Qr z^X-aHadNuaTy@y^m<+dx38laTrTCV8Spl-3);e7$f-Comc9!1suq6G!rV@oPlS|2A zfNlOHb`ywf6Xk2-zM&ExCn>qTIZD#K9eJ8q$z1t`+3HFvaalm$MNWeNN&^}#fDZ~^ z3b31y;l7>OK_FNVwPVfatEGe+rC8GmyNqEjiGhfKb0_)a;y`$aX4x;K5Xq0Z%MfLdoI&&xJO@TJT^Ipy5Y?yAwy$Kk|7?pBUp6b-% zfXZ&GBJ`xC0%_nO{Jf7ig(tkgn+7{s0B+Y=ysY+TNBi2dNyoZ?ja3EK%D|X^PX80a zmQsn1BjKgeYRv1$W?4AWSdEud)}_dAboo34esGWpKUsq3RYOKz=s|zFd!8s@K$9N@ zR+KT+(nD+cuTNOffq&4JrIpKRu^ga|QpH?JSWPy_Kf7%~y(fx|fRuhMIVM*V>i-Qq zyS`MCp7dopfwjgQOBnylr;id40EvP`AK@$hSER?HokPz?m2UaAWs z>7oZk2cGszZM9=5<|Sfjbh17sU%SSe*)iFeGHH6*KUZwXz8sys`TkOeen0!lQ@jiS zS?`tyH?qzKO{rs=u3|I`pY}T%nA{A@YO@^f^tYsGt0#tQ?VlUDqn!ZUI$a5ya#x$$ zm$iceXKlCfArnp5mm~mG8{qoW-*Wh&&e${AW9pPA9Y;;W%co6(m)}?e1uzvH9~%2X zTKSb8K{qX_xelDq3m23?vBs3lWO2;XJ6$Wq5Q#YALV78loENmYftsHfU-=Qy2jCP2 zbGjR2d*6@sa@t<1G$wC&2|Sf)dFlsNF>j(J-8#j8##%CEk8z2VO)`giZzkux&JLbv z2W7mP4jky=G4aIW3&Vkaf*vUHhkFv}%&fUP^3x7*JoHH7QD5y(4jX|^%O)ia$ic^O zCQ2NXxU@@v$L^QsF@aZB%lH}e6TljxmdEiL zswxiXsULXf$X`Ti0J+l)VGV$NYv)Ls8+D|eMb9Yh+YLj2L|M434M1P-f ze&MFtE1v-^bH@og_i5q1d|%zqs)RYl1<*35lSj|A_jX_2n=hq{J{ie)OP9(IiMVmRKy2a6kbYKxDaIiF zU+=PK#n0h9M=>xq1gyV5d4Il?KD9YmRzo&VJ0j5<ZJ}&gv;Fj2! zUtU^mH$cImjc#``+bdQI3-kXgOBi?uK&IFNC0>?@OoJ3~(RAQXVn)3+yedO+a!SlW zq*aoZTpbySUq-qWih&pE4`2k%vRp95*m!cwdo_JvIFoJOKbLI}qoQ|BZ>9q?3>}S)3X1ya-W0cps{hAedCW(^MS>dOz{^WSj?brP`uXMYB zg8WTVI57Q;a!$z7?p$&~CBcFgT`C5^;mfMzkRX&Oyb-8X?Nr2~zVqP-=9y1--ww;X z&w2wMi`c_Dzc%>F$s~2~B)4^F5Xml0WU6-9*HqASj@L1zsV@C%2mso5AaINt>-Z`@l!!kKxpu`L7v>vS^y22 zWHzTn9{u|8Fm(eM=vcr&%bMlKq-Pg)i~2u*w7)|r&@d{eAprC)aPxSl#U?hh&eR3< z5JTj#x-~4Z7$g-+>UAMB-^N}FYu@JxN=~$ zWxU|QhGl$+~y{-e;Ph|j0VG?rRrl|@o7KrXOPt8W=`_@jG_*(F*WXfa2? zLq3=8!Se863P0W6{uCjKm09xZB0+>L{8#>IshIA`yg-fW7T$wH!!RqrjX5KlwJpRJ zX3S^qgwV8M5;uqPd9FLsB!1q)n*KiRwpH6)CG{X#b2GrZ{r>Wm2K2+UVqU<;JA3T5 z_fp1ZbzPIr+og;}?b7eRZxaLG9-vSE^Y84ZQ0x=Ga!)@Idl=2SzSTYn+FSxrpRyy( zeN4OqGogrdx??>iy2@pRoYC;=s6U+!nqQm9Q@ef+bLVYusq@i^-dl2K)evuj!9Ez%4=>=YQ@Ut3x#(@&%!NS}N*0 zJl^3Y{XuR1exVauvA(IR#{7H)-Iwbze4J4a$UWWT7C)sPITdK4#h!oA0DT?oYy1EQ zGP`n=6`Q{F$vS+S9Rfgmf%$Dn(97X>O{1*=O&!zx(U{ztHq{&HnoM1}|MoUThImdz zHD|N*Xek$>RsFS`O6O-?vB!2u5w*9I?L_Y*!fHN zSaBDN%jV$+InW@kE6Wb1G1xShvqf4ltUU227v%zc zZ3Xm^46;TG`HEEL$)Mpj)@v8uW-^Ea5jO2feYpB?@R$x%V{bi%c+A z5*M^OO3|IYHR*YlYT}>}jGtKD=S_aG``k$0f>Pl7!D>zWPc&vm1=JQ*bd#Iqnp{9L z-zNbci*uss0(MwKnJ@PAsXwezu)A=1AN;*Ff{fK8KY*$UdhF-};K&-=6>p^fM!M4+ z8gRp43%wrk0lGovQg`V!m9Szh^P4AmK5Z)ZT0C1U zlE3fipGY+}p`bQ*C-U=~N9L9`hRI9($_g;%rbuzNDZ`OAc9CYU`1?yDAe^?#pH*od z0Q3sx8{@d2NZ)<#&RO}&PnvPw)}L=!3H{d*A)=u@a6V7Pl``UdO9&^>av+e9+g{zJ zyp!GTy_db(T_5;%ZduUE>5|5k@R>KvsAMr=PAt>{ljaVR1Fa2Z_{Vbc%)PguZ#FeY zOfOP?*#_(i0TK-UmoL|u&hxtXWWX>{u3a6w1$rJ_$NQ*cThvb&-v*p%oOKrLt!Esp zsQmRp>;iCHBM;mZNC-#+tgPbbR2)P~2$UQDXfIA2p)Co8QV$>VikQ*vWh7N?5VD|( zSp}(ECVxNL!-)^qN{Oc>_Q8v?Z$gPoh41mI(Gz4h9Lv?I@J$^KI7!LnAzr}5v}-T8 zpAoxv% zq*#BHDWtL4Mj>;GoqK*6e@`>nk4#a4xxDgXn$5K~G=M+RN5$mVvRAn?b2mgWQhqlkw@x~fKM;jJ2qx;;~M^| zDwM32xcs*2JT{%4ZjmlXeBuHKtnm+I*oArOIWAk~#Z<7NoXGcwQG^R;hGN=X?^N04 z{3$jsSKHGFfi}{?jrDRXo8MRZ`Um=O`oNZb6{Bl5#vRA;bJD8W5Cljhkxp=@Wv@DS=5m`pp^JLl8}J4!ZJZ%Zm;OC9d{-UH_p-q9?QUQ6j5MiZm9aG!Rn0h87m!gMwtFSa_5-lVy;iqdOqi)axk8%C6`MzEl`(htbz2|eq0 z%o#ktiGFF;>!;+$zZbnCMIIPO(MuYr#oq+Zt@rIAKDna;U->l{{2-9*;NvXgkvCxm z56mjMv$2R9xfZC)ynKN_OU@a3(|FETeZ-LFLnKHft%d?gt#*F^2TkHbJ;essWofL) zoaE~>?iLRGA|aqEsVS+#I8c1P^Uh(Q2l@$rsHtorOI<`J zy#wRSc@3?tH5yM*VhBMXY_`S@fj@#S-|@q>#HAV-N;Var3A)jjawNlA3$0a~#**a?sUPkEOWDoz^%@bC#Q(wxI*LeBR-{3LAv7QkvHGyYNt8bx*ox zkKV={k=JR>jhCE%=LIzeoWk6%<2`TOQ^?Dt1m)vsSV+L33mZj|(N32U9v`T>`m1^5 z{ae~?&tcmG+73>}ax4c-aFs$w<{ApSvpP&GAWjaG@a%OV1*+#&-5$9A6g;vo`qZxO(V-TAeB(38jS}rC-8^m4mZ@6bhJ$QRJ8~h!T$L()^~3jSzvm5 z&qV6&5_n%T!lW(b<1y)K+rh^aZ*qv2>kdFFi|VRrG$?cHLdP8P=+!SA1j zsWH$USP6p3yzEx1kxDQXd4)rmP0V-(9Bq+s!|4L>HRB!6?c|I)%5(sQ{MuD?;{ay3 z9nC$ep_(?e@qGDy>^FAq&upqykrlEEWeFAWIeHmg*qHXdbGfsjVZ!Q!{TRwq>F?@7 zq9fV!>lwm-dPk-Ke;!3VO)yZ0RD-GboYr*8D7l>jt5in%CgY3@=v&|JWzX_bk=M9k za9s!YMby(_uCraY=MU>Yr0RdkSC}xw3jq(Zm@m-E*Yp89A-nE+ z&GMp=N{*3giA=qOoiL3&Tg;E&%~f+BgPs4&*9Au!_0=i(c4GP8RY8u>eyHvC*w0Mp z5hcnLBy^zIYG*aFu~8Ig9?XGD7F1-jrGeB?tFXF|z96dOU>}sG9a>FI&=eH>l6oZx z{m;6LN(A|Pu*qif#<=J#u#}AoI0#L$r(-O_qyhC_sM^y70#+PEJ}K707=AONx?7@S{{b z&k6qRxOaynUdrT?SDUuq-W_+Hx3^cDl~QdRldQB!0S3@3>HF)${aaz1BI5~@C z_fcU{JocG>yH)NlHb*W~M7$qBjepX~_q*&%XsER}viIE?nw-4CmoYKdiCBVmzIOvH zdB29#?K0(NvNWj5@bc=ZZncrP>(l4Y_;dE{T5EkUL2(&bNvU6s5>)F}m8Pvp_lRty zONMdZ`V{yVEFnO?+c8y}-dqOq7Ulm#(^dFI@qO(TQMy4wx=WC5LAtwBx+E7^8bw07 zTe@37x}+PFj-|VnW@+B>`+k0Zz|7ox=AP%A`<$w>eBv(-lwfjqu>LfgB`4vGl=Dj% z%u1%-9P{qXxZf`VdTu92a3<7qng_H$B2GwK^Z&f~f!A^&xrdQElu|m)K`(j}v)6Dh z`9+S~!-4Li+deR4W=r0}?Y{6=N`(C(L1=A$LLt8eItWxt#nrX!n!5ddz(XEzHx$61 z=V~(f?yrc+0);?@)TZize_LAAN$J5Kv-Nkj-}~R$gpCuw1U5S&<~&E{?F=PJua`e4 znN~1QY>5_%bF-Sl_ooIW0xbRVY&qZS;J1WHK#P&O`oypoX_r#R+=f1gpf8GpV$Ku_ zP0I-l<`UVXNKMh3EpBr^O-UoiSRVUo1;G&G3YJ%3pe6e;?49hu&243w7Qe?v!v z>t#mwlg+u<(ua>22)#5}R)1_YuqTJAKmMirSnbxFK#YjFTF?A2m?AXGcfZpac?)I@ zZGkOGgkbPMK=QwbY?oXXTD->o!H3f@wgr z4Quz?`iO^Q1*338Oa=_N&(c7E`=|cfpEoRM1%i~bh`nE2Ej8w0OR8r>TI-=J(QWf0 zLY?&iAoEdoXsU9kIcy_bk=*SSXprwOccx;q`wLSSI?{xP7u)1jY?O*cP@DAR(o;oX zTNj+GYgrz;&lM6z^2>_XL&EI=MNY%IYA4OPT&JZx>j`nc9Mxia$Ly3To z|1yA)sg{fUG+L}C9R|$5arNioIIs=y1=EEwMCO)Q$>26f5cih|u=>zpnim+ju{wIu zIT|H2){C!99~@@zdQ%gV35*hn@2xd8H;E5!^&o)G6$3_RKeyE2+*z>wW{9&LgT*XZ zmL(q6gFs@Y8BWf{=z45sk-3rA-;Vf`JP$R^PCk{fF*YQQd<=fh&nVNL^|{8fkFZa) z#*~I*6~a1;$|}X_iBxDS0(>pq;9>{;eO*XZr4NVJA;v;Dt@iFWe0(~$7SWt;pZKq; zt79NBz_hoUr_-XAk4>=jODXNUo=T1{+>A~y+H=>CMswrJsQ{AK~X z->^_YgQC$9j6Jwm8kFp7S!^ewZ9GEw;MrMmXTauorJV$iq{3iCoQ#Fs`9d1yFU`QZ z#>;!9=MhX(JfDYg6p^(h&+{9pY3g=%`82g}gH6a&ZzqfrcwU@!u4?LR3{TaKCDmQ$44Rwq)da$W6JF-86vQ}|}iacCh4VOru# zyt`c~MfXQTrV1f4LoQ+hsa|?S5lyAH){+G7zmgTULKpa{L; zQ)2o#Z{AS`m27g#`xL$FG389$05PgJj2MPnlCxI@t@*!*V4)kHmknHG!&|cfI_jr} zdcA_oSq>Dl9;nZ`a5Vxmxyw#blY637_C)=K&OMx5wZS`%C*)JWXoD_XmHrLwNoR)? zDV}0_O6^;zyA{|xXUuOLe9ha#rI$p&@f>h(9PNn^j;1B;DMHQ##_Eh#-3A)YZO1t~ zLl@^k)q5cP;8W-+MW4`5ta*3*wVzXNBaAwp-Lb6V94)4eO90N~>tXDYrhsEkgW^LIxP~d_ zBA?3Ykl&9zU}qqz(Rx}-6LzZ%6X{z81c>xr> z7E2K5lkrZg0FMH03!Y!~uz$yTNwd>?cR!z;+Y5)X!C>Kswa7EafOAFXfTzJDqw=1& z2EMDeifA&Y8+KPINY?(RcfFp_GL-KV&!%&pP<_Kn*jsti$k$eiQ@L=5l2du;>Icyu z3r@W?WFdbfaqplnKsx!N@!mED6MKs3oSGU%(AH*KOE9qv+mB@v0sfBrt;=tX9>3=9 z2z?6)>6|^~3iEC(M1F-Csrt|eXHE)(PkvZ{a=NQ_`u9CP9C%1morWoU?;Ia1- zY8RnSQVrRWTtVDZBHR@sH-k(AmQbJIk|*2EiEMIy;=kXRPZFBvlzX%0g~;S|ftrfv z@eavJ=a;CR5XP%hp*TFeJ1(UBlWPWRbq|B!AEhT7ka#~MJG&X zRVD`DCj3u3e}@Rha-+z$WkSucoDP)=jw6=6Jmr^GDU|jI+a;8-BN1?Gj4Zb1T0o$j z(@_YxZ2eO&r|bEo?eqNt+FaZ7(a_hrXDhQ;Vm(Ees$j!U`jmOW6w~P7h@nQ&^e3^oN1-6Eej?e2>>e0! zC0fFn8~^*{>+mn<>=R^ICEbsFzqDQ@*-SoUo}3(&Ts&`E>%fjPy&fvR<}y{XRS0|9 z57hRnzUjdFXW-wjCXb>|ICYA zVD%QO7VqoVeBIGJpm4$wo3jm4NL6{ZGD+t=&*k~on$7&PtBCHh8~^7!3+T-pp|bFU zT{W%i5|)ba^$rm6@^DTL`BcFKJ)z{2iS0|Ea)5noZrdLbji+NEKu(iYvg2 zYhQJF8OhM`*t?!!ekR4!@zSrZ^J+p!eSs;GE2Q?u9Ox4;`M$H16aQ*_K9Tdl%Cl@V z$<^@sZs?|zX>+h-mM`h=l*;ZvJz4LczsQDEuXAja3T;PoB8K}uD<(BVz!$9y#m^_z z0DvKs-Tc+!A-{dxJ?@aL_2Kt8sULejHjl9U+IqNDtu{;~Zlu&zy*e|azK!8U7j()J z+E2sbrv+ZnI6==MRjROK^YMTFJ_v5CD2wR597=V$Z)rhtw7H+&q3=)qZRu%V{(D_& z+YA_0YHLICPYH&m#!7XDJr>40XvNVu)^ULAyfn2#z+v&d;*#I#EM^?T#1Z-J3Yg)I z*1bWQGKB%o)X{#>g5EBi1z{p?ER(>AETb2>IZ?{2-#(N9*Y+gz(A)!GAv6KD z`o%C^r!Vu9W>Nh2FpjRzA3Z!A?XDa?pXssrY+5|r1i^M5J=D8#g47E6Vyu{7f;dN5 z%%mu}(hoTk7wp`dP2v$9o#lO8o*7jJ&*GW}6F9RycQETM9g-1cp2Ii(HtVhW}jI>BP0-Y*G?_Bc1P~K?&;Dv^^J(9mz^MK}bMoo0L7aT{ z>0i38jFi`KO!`;R+$ke3f}P4^8E|>cN+#I{5k4Xl^OA+9lYX3en#$-$%ql>Km`60W z%Nx&aEsMmaE9$@B1%YC-k^8fu^G%LwUW#=@<{x8p3DhM6x4C)zxDn7u1)T2Hvm(UCv!@Y9t-zP0!m=NZPp$6B4`6V&qaE~>S)KflFM zz*wpTqtx2T{}u2N9n>8Z!Gd$d&A+K$o|+kox;~-m$4Rxl3Dv9W19*lof(}2Gi)TNF zwn+xxv-IJgGS~v7a*M0}j-ITJkNXZ+mD`;Cj3uY+6cNj9+(FnaU@1LCNN1zpsB3L1 z)GJy7`5h|Z=matFA<3*?nqI`>->H0a?K)&OmdgAhZ^v)<^6X3uW{@0(|4=+WT`)wW z_rVNTRSk;9mj`hS*HcCw&-=&&o=Au9@)}gAO`ER&IpSQ^#cG)A$()#Y-7b0og8omk zZmd?76>#5+=ny1c9j%)nhXJ!t>0gA=qw4+fMfW$b{UD%peQ=ZGP!yu{!S7QM8>9dB z9dlsZ?{(K|XU@E5i`}h=<+=feNlZ&5nO_iZJjaIO1k)hw;iniRP%IY#Ic{t--qdXK zfP@96G(~(F`_11vCpSaEH%h>nxaM&;X|L}oM%KB!x#+@nC8i;=-VOr%F-E$Jazt}l zmsD&;e$3pXXl7A?+yMCY-x-Xo%7~ZQdOEpFutNqsQD5-JLeF1d<#ZVEA-}13F<;JI z^&;e61{dVqFRpiQ6^X_t;EJ6Kc*W>OQwR2_BS<0jMvri+Spq3X}w8}=^#vIT3xAKVE=qonA$>xks0 zZME`kk@pB7RQ0Ho#8L}>nEE^in5tnUT1g+{MO8mq7eI;ZSQ@M3Bj$&IC}IV=!3&rt zosIQ7LfN+MUbcICx_8S@TWgU_XF&lc!-vp-`oxhr$PFC5;OVqx<)lN{`?{DbXxv|_ z5Bc41DFem#0~g4-cc9Crm#V)II7`o6xojbvNt;{+7gH9)nX-c9I7k-Auz!kpfsrWO z^&(ht0Hr_GvTkvj&(gPm=BBuDW;H;mus7kSPO9=k`hN5{;7tNL8US+;ApUDKJj?5a z^6@a;m(ZuAU7~cNs`_TD?9^@YX(7v&!QS07YnP*+#Xbj$DHew|EJ?{9?oBmC;6M*B}bf-rN$`WxpQWfOvWv&qa)BfHbA!Avu=|vhP(-`Mez-fE0?Jd?}S#Q_+*JC=A@r| z5!G}==0R!-j3ybzFF?e&*QfDcR!IMV+hcw4XN>fIYc2TJz5;#0{c6r+{vo?s=xE>Z z*cvHezrZR(d*_XZDN%mxuttcP?e5W%Kwvv=${(^2Rk3w}K(l=Xtw|1PP8DqNmdw5y z&RUr`kzu|nEW@P&i<5E?$kp-F>{Dpt=7+TB=MQ>GhxJ>TPQpS0nYGV*i(*`wKSa@y_K!)~f7|$I<7e%S{WO+KF{fa`U!4>G5kq1kjeY zhU_Wo)_j2%G5nnXQh#KhX)cQTKYGaE^`uAIFb|@q^4e*j1zeo!JHh}sf(0?_cMb|D zoK)IIE{PGl4UFAl`C+a2enYtHn1Fip-yQOHL~Pm-*_owG>LWhk8c`8KAV)t@Wl7x4 zE23l+&|rN`0~2bDf30ZTVenRp+!z6hvG%KNfZ`hbf-dP0BWCybgW4r%1okwI5Qy@I zwq}^!aETFx6yO`eO`>AZN)1nb5%7It+_IJ6xbMT$H%K+nVc7Nt`ueD%b865yVWMEX zFpfp!pY+BYxcKq=9cqLzPL()FmARo|FtO&ieczCs)}(DZU#)+3S{x|S{W3bJSn(O- z9OH#Dc3<;F2#6}k+0Z9dXZ`Lyh|b);T%OpwR3<~-@8->|y0Zn;0==>-c;OnrYT`5$ zSo{}zzaKIih&X}F)IrF3e~j7K%5mw)nPH$r)Xt!cks#Sg5rNFBg{E7liSHcA&L1Yr zxPSls3p`Cl9FcT*P{7O{r%B}Z9eES{2IAgBq``ORa~>&6#0{JdEpFfQSGp=vifJ4CiEeiB&^E-Ba* zhmlUIjOjKulxOP|0lXU^A7Rdg!J2w0R2IqWvZf#;N>|ciZ`#gCI!54OZ)7V9g9=4E z*wV|E{lqbj?`r{{&`ftF-(B z!x9^!B4RI%P1Xqu9f&gOX^~LiXaypMm@#h~8(1hzDt@GK_ZKPecr=;U=CTn+#Qi7s$aQiHdr7xn;{v zpA^uAu1S|~ov>G5fIfZTB!#lHLmiG$`*jng6y@!6P}je2T-?z5D)`7jZeOZycm@iw z1kojRucOonnJqe^5G*^S9FuVXJLBV#zj}h-zgn38$n6z*{K({Y#!l4%u>4w^Pe&7- zNeeO+Xs0wN5MilO1*77iG9^G8@%KZtE$vx=lPI4)Y92QrGBvKaXrxi>DZfM6P@)`A z%U+dsd97T}bn^uBJu2^KUmM>1UoODaVND|`-GJUi`DY7ud6~Gao-AkOIW!RH75zn* z(T0mgtSD}c25(-p0@K*h<}SlWT#J}RH8y|uZzds3v7kiWK$oOYE~9JMPdRLT?RRmw z^VgfIK=ZtayIWt1!`wHp4`D9Owr=LX*XU}3V+iAhWHax2SnCDt`A z0{uT(lh@)x1p--weKm_WZG*6ZnjZouw*jIdV=c9y*48#Y_CR`K&~ID+Fi$#Hx5>L1 z4hOF!%}w?l$dzq`|3z@AD;B(&V1+J;g7*h#1ArI9qzXhxP%QJ>&tV`06BPV;B-hb} zcl1*vom4XZzPUnMwjOLv;wIDYenS5>O4 zpbDvcho`zd`gvz3lk=66!W;UIPQv-!rA?}!J~$VO z2+z<)zBM`OzvX|i5NVoF3NoVXddd{<%z2e$E=ynv2Y9-u}tw-7a`9x)3 z=s9GDlFk0Z;kSQB@Yazk@ZNA@beM$0vZjM*+iT_B{I@hoz022aK{TB;lRk6mL^Ll! zO@@e@s8~90*HnOSVI3s*%<|zMfEEIliSPerdHQ_;QV3S#QK=#Z6fBuLvdM-7Uhp~o zmX0L%{o(#hlG12qG6R*N1c2Ziitq~FOjtRN`mu3AHk?WkwF(x^@y1f_tc*PD`9c1~ zNI|687zbcbG(DT_L`CtzE5wr;^v5N!s5a6C5_;V^&ox3%Zjjn~#ioELC%x@JQdXYl z8~^c%d7l09fC0Y)p8|KZTJEDtu~gsFj{kOOvkvTVxm|#kKT&CakWM)N^LXI9wK5lB z1|NcKmC`G;?7ef}3JsCg?qA^fc@Z=Jn=~50+fhwQDZd1~F!+`KWA87ZcZF2eR)8-b z*|kRi&=s-oI+}=V`@verQ%9TqC}Blw01oEl2gb|o#^tOIvpT`v*m?(zH`=0&7nOzPM^SS;>~1lo!S#)N_0;ZmliYPzyS zpB2r6oRK-?iHAEUh1S0_D%8p_U4$6`^H|ulmb$wIe16*b8tQJ#;PF~Ofa#SN@)myW znpLjtb>q1xT$bw9vVo{6P7LDnY(gBCB4F05k$ff~-KV)1Y+ZaXcFR~f5_3Yx-dI;7 z@fj}houl>+d~}00XcCo#O-;xzj|H4~N|i0jrU{h60;b+uTHLx=Wr1#-gUJV`_Uy2u zTIzSD$)YR!&CN!o=f*dmH3wm!FXbBB>jw|Mi$y@z(zi|e?vi@e7-g^!kAuie=A9O# z%zE*l3?HU{u%OEx*QU2(*#`%|Q82pOcm}sXSL&iNJ#lm(xtHjN3n4oGBvE8})sG@O zbfk_FkyIl6>Iu3i)cx2Y|9)Kik5>Sks!%(an%Wi;HO@?q%+J^_9zq z_ntjeW@g>%+$U?Jrc}NE=m8+>D{<#$`8PV>U!)1~J06qqtRASKkvgL7J_&3A>JMKD zJEq`y-wk*3ayn6ci$IzkO2f*IvpRFy%#`6=aF`&ANh$sJ#uWeaZypv^GxX4ueY?G#WQ=Sr|Fz2#8~&=c7hCdh^~*Wud}(cOQGcZ;cK~aHcPck81Za? zAFI3T;s%PbK9j#=b8$YkOor+%4M&%^iFx~y-WCxmZ)}V&*<5w=?`0yXePZuDxq{?% zRWA8Rs%~Jp8%kJt=Tb+@p|PE>b=-c+^6B}$J)bkCEi?}y0`~B`d$1bt2^K}nl#7?M z$&}T?ap~Pzmv~v18gL|tv+tu(s1Wh85(v@=UujX!e1P3qc_}2|tFuGL{RJpnUxIde za*wt(?sU8T>{a8#go-0$ZJM35GCK2caq=`0MTIA6GzSiSOFH-M&ONrt(=OILS4z|C9W z3{5UC9d!fZ*k7LkgO#z**_tN2z+!x4m$Nw>2_AU#8A|Dq>Lb5)cz<&C?pXac+3zun z#OWuM!R`;j{)mgHrYWUPxHh6$MKfwLN2_COfpkFd^#~J`T5OZGoRKc4lS>@1)0~quhExKTwn^8Y~yfW>+ zqP^p41(||IoW$|AczudJCQ7+oZ>&12*CS~P-YT&K5zP*@{PF;d!Tw~Ro@Ke%Kl>gk zad{OWCLdeT5d*s+$821$H<3&Zp*^`ZL83`y?*Z;NeT>!L?uj>{zyK5E{)!8K^K`;b=PpS3zMD=ff zugS6-ig_T^`;q;&-L5`GnTb*?!iKj<-+WFh*2sO>n+7mQuei`M@A4FPcPhG zs2^_%b&E?^aliR8Qqe&ZG+Fn#B{b8Qc&Q8H>zmALfOaKVc7~fH#ao`d-AhjWu|{p8TaN zbSmyFSJqIfAW8B$&)epSvQymP0i}-}OoKjB)Xt2QV1E>Ap9%X9Ee|UYu3%&plY1fj z&$NdWpEMW%zd^?Fkp(zr&P`-|RpzY}(p|4>w_{>U#G3(40im)sWsl{KI;Se&h!46E zi4RH*x~Pac$e*;6xFB92o*^=cJ6`MkLw<{x{r5el;IYGo5p3~fAMcmg(z3oMX{u`| z9~F08uB$lSq+<0$U^FH&gykJeuQ@klQ6_bs2w_cWQqfdFL+7orTlp$}818=YZYzO^ zuc#OsUxI3*C$12x$W?youzo2XoT;Z4?*Q-*Na&&p`iCE!vMqtE#vqkcv;mVSoz>7K z$JB@u82j_R)MhIs%}43!K7!1qTYdburU?Vs47F*-(){X;c5LN9Gy0=58k{dJ`-K6|ZjX$J-g`n>=1AC;^~;xcYT!>ge~T=YmmzRi6(M z*GE7&vF_MVLS*1Pfd(~Fh*yo?UbS~wg*In&484YM2q|g%llZWVlNO|xZv)AVGB4mw zgw%TwfE{S_*k6Gd6bn6PUbO{&i}KuVZ?eVPunYqDCy*{B@J^Ed-U&(hej<%PHB3F= zGS%Pw6SKzx1VVcq=z}Q+2>T0yb8~|A|DFK9tOf2r_#q1YkbhEpgNq3N@eiIruQv0} z+NVd36KibJ>E6vb|AEGRN6uY z=zhnKHmnQH0aILkw}44T#0Kt$gr$^A>cwjC*S!ezVf**PzlghzmzHOA1U|Z#hfcD7i?k?J{u;Y(k#NpG>=q^iV4E+Fr=IL zz{Z$BLNTzrsPS-_K}>_rbpbG(i$!L1O4oi$ZgAgOdZsp5PeLYQqw`~L%okkORCCW z{e1+#gJZBh38mcLRG#z3nJI!i{b#h|d_wx$8CyjNSvaG_wsDo>`r0-xHQJ94 z=5EqpjW<%r7=5Hcv5r$6C1gsi1jfqiE~@mF%(j^43e0`iKVuJ1PI^8%Ply2S97xqu zo~Z+Ce33ni(>vdzyP(dNM71eLvEdgZd7PW(_i(YDan5XeSuy0&jeW!uRVx8>ssf=% z&R!yUJvYH^(#&5)QvezY@YQIA`@C_tdIh`ruYD|}* zm^DWB0oPdj9UC*=?5rFWUBFvg%BI~{|1CW>T(Co>5K0JKtX^Y`nYBoG1vdUF1M+z) zuh0-_!UhoY%Wd3D(H9b%@tY$B*nA#T)$8^y1~d>tUj_2<%DVf*qA|6$a)V#z#5G-9 zsyRHTT54F#PqTv?-Mt+h;X#_1GzG{+G`&W*>{OP69>kV|xr%jr?5!F-Em?u>ivPQhq zTE@9p*j&uQ5vkG$tyOt;b7YE&5C)ZL28B2H4OGw0}6k`1#e_Rlu0d z{k)aW<{*KjOLPzG?~nJb6p_0B=;Vp@e`=Z)wO?XuZ&uPXV&QuoHoEJy%Q5)V9V-Yq;5cC$!F?OO^7lf>=ez%($Taj?;BDJ$UQF`+kLP--z(4Jed(8?6`haedaq z(rCH6UhzvXN4&E!>@Pez9eL9}Bhej0-a2?M;d~om#A4X5T?J^FLN@b*j$qOub2vWy z$JmFB{|LJBY7Dlb{()dEe{R!G5gS*cccnr54SPCCc(?OB>i(DjiQN*sYEUvSK<5#Wr`FAg%L)#iMCNtFVaD1HVQMMOI zL2OJxS!pXB3@kSn_&oRhws-yVuiQOAf?-vl{Yr}PB3PKf<|ox|wwzJ#E@%yj0%}(Jlx$69~fyw7uE}WVDvEwZEDvV!2Qkc8up9CegPS5T3>sVe2 zg+%sj?$p?}j!$UqlpLV!OynNLy)2c%vcq5ZNx6sV?UY~cSXzljjBa9JoF{8vWq$NK zDG^9_dlUR>wYy_Ecr9!0pDhxeq*R9Oiqx_-9uK3BlF$=!TZ)0&%rz zFn{SY{5uDJ-Qi2|wDjE*{@<^3F@3hg4w~`yXF1QXs?nAg*T>3VS1M2vh2lFJedA1W zgYU%xg=_Z z(SPJEinY-GvlrufK6e_-Ff~$MxN1mfsKK!7Eu}Nc9#<6mKEVSXnW{nJfQ5!OYxTOT z9rPavQ2$yx6S1w)QQn^*RhfHrBf3mttW#~VS3l(w|alb4J#;>9p%)s=q9wbs~8Ke3@$u8*;x@JuDpPXFuOK!5b z_Zy5Kn-jdv#cnc{a<5%WbIPXybCDPk{{@0c+^*I-JF#mwjMU_tzy#MBn5@1c&LBx# zT_r8MCcJjb;Y>16rvnlR>iI-6i>_Wcz8DV=Tr+MqYECO>+m!w0FC`8-|4Xv}DYW~d|w7bBG1&b`eGUmHj1Bu3h z75RpmL9G5xz!wx>*ZR~vlmejzmzK7hacQhi0ax3?SxO6y#?juAFonZ!b9^jj9TU)2 zPK40bGP)_#RvAS-%8|01f}|L4s~;yPioX)WOct;W_2~#kga)Q0G1)8Q={3gVzH4pn zrU&YMegVkIb0=jv;?M~Qu7}UiZ3?{=5eqm&BBC*Dyqm=8!S;S|zPm~E8^B#HPQGpG zK8Y2`{=M#gH9T(WH}QQ4+*H>_I)YX zHQ5}|?g3J41KsKu$Y^?N+j;-x9)aU-##;iye%bPRgXVxCGRw;z3qT?}LyS!(!K4W^ zbwoqI4l_ST(F1ee9Hnt`M9b?oZ@-t(ExE_PiSKsji-_6tdbjzk5tk=kG06etiL82RC9w zGiDS{+1c4P`P1=7qq=$V@tM~t*V3K0l8p^{(pf@pdFDojsK54%QGMlXF#ofL0;^cN zWtD^=!(JW9*9rjv84#oMNgss!=gYJqxDx~&`t#|bRiy~Z(84n&9pG%Vm)(Ut* zSZMVEB^@1l454U1o>VNI1jp|0rsg7LM>I6L`JH8bdjHyyU7SHY8TDpkh5bcQ$ISE^ z$HU7+ANe!>rKI}v;*|R-UcVjBkO%-JA_f)~9;YMyltV{r^=R zSgE5zMk&TeYc znJBr9aT<8Gl_AZV01_u{h%o(fW!|Q`^Kvt~6CYQ+<2TTsPUbw@`qhr~y7XOz?66;r zjEc}v2ycCF@qWPPutsQ)yNbRDmq!tK9q_F_JFj|vQpora3^6}pszE}}I{2nCC4Zp! zNMDoz?Z!t4ui1bJAomq(jkrl6DVpJjhuenLba0^5Z86c|gwM4-b~2uOA#umiLF+9- zp}%Q1rJGN&wK^C}Nz553#jWee-yy+QB4Se1UdOv>2RoaaNg8m-8*~3%HTyoTrV8Lf z7DxI>0_0Mbb}LE~?0tP{_s9KDXRs|)0Jge+G_fyPTdt5-amSY^f5yF5g?bZ3rjGMM zLH9s(irS;=sH0FSOKysp0C7^Zg7M=keovBjYeBbs)nhx3g#adSe)7pyJKp5uD{VHG?UxnNogWe6OgugT6YdJ|HOgW8z1lj8$7Q2H z?9_6E7oqia&0OO>FA$PNoteNYCK3m(HTb#QGN(pgm}47$^5-`%@cVwi;z%4>(HSvi z&*WtGgBD3kZLOtXkGYQ|mKxTp5Ge?{(7asc1op5h@Xs3H`TB&Wb1p6ax~OM3L9jyciWAyaPh832nK^qV>k|K*CWG?L~SaMts0 zw`h$d%l_pVNJp-Ie}C}u!CmRRgM)=e3UYJ7hC+ChwqJpb9(w$i$1C!6UbJal=r#Q_ zENcGQiz~S`3CM|TB59FOQC!+)hR12|C3sPU{>^h8@>r1Uc6ZHmz1P?jJpu+BSgpO2 z>`i^F&eiF^+*hn%F^{Kz8!Z&k-FQ-g=8FJ_gjLst2IKtx2_2v2j*?2D>D*LK$u)UG0Hwa4B}QOZ1vAC& zsv$y2aqp~-n4+|Ir%Dox9gfCICA3@@);+UjgYd$rzMfi6mUX#pB@Je^9#q}mp4zi~ zb9lLrGF8tTlJfNVh9@NT%k7JIwamX5_X|QN@rc%SXzn|jM-}ke{+A1|g@!Qn_%d5n6#~l9TN|rMt4d z-Y^Tn{}jym6{eCddW|45?7ubRPd3<(w$7*NS>`z@=~>qszNw3s*#92EXo=4uNeoU^ zAVv$%TC(S@L}yKZZ^aO~*Rg;HpZ43*xT4V0nPtMx8i4McTV~rfnJQ*y)t_$&-ma)= zY`HWe1>QFgYgKjk^eG*Tw(0csrYOocC34_om>Huli%> zKXU8K-=-cSeLb}HzTJ3F_2b>m*9xh(?u% zqP7cf1tXfwu~MY}WHg7cX{#vei9++|?)bxckQgeGW=>y|fI#QdrNje27ZzJSA1jK~ z700h(4Ov7|1ra^{Y<>4$96R){Y`1diXhN%oB}YG!xkzW@i4bz`A&a&nD#Y((nq5;F zHQYGRAQ?%2HH!SczbioR$bRd6D96qz6pfocwWRHGsgmM(XPshD5^C7-Ijl2mpcs;O z7DVF}yNo5pnzcrkq$h_KSyMN~CQbNAV2;eu&*lcBTw=f#-GH-N6)bOM6xQ(dOrK?*<|(Upv*o?vOt$AVaA(qi+19ah%>>sKMNz zAzbV8P<)BByct8^Yg|h26E09u%F@aG{Y!2swE|Ru-}u7WVBcuPsP_}Hgume(aIfr? zX>{KtK0R!xPCb?tB%JoiE#tA6A>MSTtyS(fQTv~ay94P%MJPW<{%598m>fV(3&cB` z1s(bB+*{z*UMKK{8lU`Ns=bJ}qb=y_ynVRKn7e1YHPhoU{=nOetx={>AwU3iAl3Vv zt2}07%hR|BoshYvL!|!To0}@RrEWLzk%<5YS#N&SB&e(8vb;Utyenv6JPz?=9HR7| zYnLBu>P?D~U(9hy`NhJ5Au6oz&Ek066vxzWA|ol!(6x?5zn|99p9V#jtxhn@(BwAz zR;ERl_t$OB7z@VeB6W}^Av|4wf!Qaq25;hvtky_$c3Q>M<9YGq1H2XbmfwziQ`>h6 z@Y@;kGbeln|D*}a41Z0nUaIgu5`*{@jvlJuA%RwbSrhpP|w3qylj zzIHP9rBmH@Eem{PX#HClGi-7BEev^F5w;=p_VN|>BV?nN^(t#Qz9z|z3|Mg;5(b+CLs zf6{J@5}M|F4lv%oUmSlOPwC%cZ9|{sKBHv91_VWx4BYqCUHCSK8lGxCx9bT`AE^vWFWl9>@;k-du%Xwf_~^ zY;di$YI1<`Iocm(hJSdvMxFrL7~bUDUY#|DCe#|ka7+X`PB&T;FyqvCG`9AuVHKUZ z%@*6D`vWh!$Z|$3;nhyHR6%*Q3qsW>=x3`=?tK;))(m*oJJYBPkG=a_BKEx`goeOX zF4powPJ+*+Ug&}ahM>T6cf5=jR}7EI%#2)=+)?10F}evH|9fg+y)&!RO5Rap<;ixY z!hW6Df*6S{ms7+!fbov*P4v?Wnh28jZncSl`g%><3{PvSDwNl8Zpao*rg6?&P)0)L zjSAIPYyEJ={1V%)_hRS(ytGLp zVdtu&qjV3Ds}K+F;^Z2Ez`;zyR3qeOH~+k*t4~O9n3Niv!$+i48gTENQIsL`dPji% zB7e__nyz;1G|$X<*@8yaXzhoB6_8;j&LJbd2=U<83umlVRWhD^7vFiLc+M?fD!{D+ zIHlU}(%E2Vo>^QrcxSbX z-v6Ca)xKVc%{G%}eW-8i)Ua)oCY=Z}-2zBOIVQvb0qn}}<_C89whAb0GwabsD7}^V z{toKyIL3$M@lzyI#=v3}J-#cnKp!2qt=oMF=e=}!*Y<{wct3tvh2aiG(&vhchfPAh zb5^aRwcAkCnx}ckU<+pl=*jjOVkw&o#Mykd~JxZm)*h&3q~| za)+E&R~Oayz0a1z0#><>1iSq$tseAu z%Ml_8J}Y^8l&BGH9e4Sw^P7K{{ssZ4QKrG6M=r=9Uhxj%SoGmNg-rbLI=wrPX_zZ( zDJ^;3ebWsuVQ!dzwd4Hks}#mVlmvj|Oy6v9lQ93=a`-~W^VK_asizsd;+<|>@e-)H zZI$zpAO~6Wi1ycJM~52IjW{v04{Xo76AixbT#SJ01PBA+WV^=SDEF*Ue{4LO^T(d{ zIibU>mYr5&-xP%FKXK05lexf zi?(iX!ak;*$csXeeCzi(h<40%Dg43Kn9&quhTjXX`kLD6#&mYPoZ56{DvL`;pX!!- zL=ygrX~t{5q_QAPRWCkOhOF&6VGK+igsrQl85rIL3h66AveSfwh#wEeUuXO#qW{1} ze!Fh}Xg`ukU_7#>m{&7utY`7~r{zOUlNlmz%Y?K6(G7C{D z@HXSva^xolKpy;NaHY?|4E|+s@Q!$u#Abc3frL+5c4icS1%r&|3`mtJ`+Uo8gX^|2 znlyhU30ZwsWt3DQo2f>7aZzs($FD}-)t{G#FILA50ybeCJ)FOtwMU)p;ve25;pwpH$j)ZJS!gOR5NUZ#{bsDW# z=IQW~=9i5j7gxpBL>Kcdl8NiqP8$TOoNlv|zc~3jHN}V!*Ub6w7ryv!({GrLV;@f% zxZtS74ACE3Jb(E>x|-@~JgLQBzj~$il|qu^=Ge#HHmoEKOH!)_F{f>IMP*aP$-jei z90=i#)b~6Ba_NjQwb$%tO7F7s%51F}EdDGdJ&l{|3;K9pnpPHbu7O;niQwPR;kjaQ$ z5OTX_n-cwHQ&0DgkZp8!uqS6yR>$gWJa7A>P-)&ClI+9~`vFgOYE5JY-$$L56XoPM z1g26*d`9TL!oGK|p#)Uha@O6bi>Wm0kqjuMNe9WcREh$_yYsd;(s3k{Ei!0({wZk` zaERhr^2a4MCx`HSj&@eoO`C$twO2V0J>y$!`7Qy`W$TRwiy!=af45snS;dFgvowX{ zlJ#kkL$bt`C?0(|u@b3n5jlBa4JW7W`{W}61YET*BWEYWbQtXZzC7TwFsCtbi^w@0 zZ>W9`u~)KmMa%O71lLyL1>X|INu+>x^3rH8pf$y(Y!RER@{h41 z#xeOdG>9?$*~u4@xsc>)mOo)uP17y-;h%XLn1z9dqpVXe>!UtW7#?7t!fk$jQ1P+R zuT#9mXbf~E`9`F0YWya3FEyc7TOu-4qE}g&-tn^wiiUCG5DbZFvYVO0hzl9F1zkzt zR4)PZC*74s8Mu?*hX3d%O=S~97|;jEbPG%ryLn$6-4u*z{YLh@?EieU3|pwPkQ1r1 z!i{y@iSr=McI2?XoFj#H{bR44yn-6u)eJDjEi_*;G%-ZlcT0g=MCyG?tZlQRs!c!m z-Q3mHgxM8D{KEbipbu!t;1fQkXLKwQ&!a7OQdh;V_}Fng`9$^V?nxTAfI^d3yJd_f za8So2aW&c!qZ6|6%CeC`>d`|LkmQgd6V+F5@3mxRtIG`O#kGvHkiZZ^Ac-|gbhj3` zmolyhFFEL~;6wu)GJ~(&-_N#->r7CXE%G@BEq#Y;TQ#KBN4nAXN*=!j<_RQ?TWW>7 z&FrrI6h#uKb`iYSD@FeIbCe{ZMBXAjVN@#8mJV^QvuavNcDv#T46}Z|q0)J&rZ)~u z6{6XiJ5cBYdk8cPfl_5yWsUwv-(G;#rky7o*8Eh@peeA5-;?o1x}B)y6BmATdM{LC zxjQln;!p6Jg5UDT2H`3NjY&1Jv8oXI@iq#-a3M$wtxB=5h_iySqjATPT0LpLoa8M& zxVtaPea)7v>+BmV{5!#d6zC;Snw^yzv*cyf#Q)m#HRyArit@jKr;3d9SShphcCkdA zrc?85lFMr8_Go*DLEU^PBPwwkuVwWnd&8&+M~0O&G6$oWAm@=0mCI(24qAVxzWMiv zNYAt$pnmv`rJ9aqVEElU!PkM&GJsj$dJGnJHIVhf%Rsi4>0UUfQ_5{v#-ug)rIqg z1APKl@$OEszSn!^wJ{n1@7ezGqPCzi$v6}2r&zu5tQj_U<9e%U)n`?mTZXG?%|Xf0O%ok1v}?5Izl5qw40MSz`?0{)3az=F z{ukzEK~E~O!^Vj&Wp1*@N}5D+&iI-cri1O(Zo1RN+w~YY=^PJcrSzt*4$?+{nSX1r zu>Ct^WSdAf=e6Pf9}8_KK>G6)!Z} zo8}rjs#7(n0S^uz=7qUY6HF0Ig}S6MeDYR`m_Rpw(|8q6f{7xcZ}G?lr9jB!KUs_= zI`^yyj~w>dHVssqo9zL-k3YuBF&V9>x;Vjn0K@|%Dol%fL8q7d&ADq^aif(msfrj#_jv@LFaVpP2;=jFYkp=x(L{a7SE#h6>%vTf!vA2Po(qbkJx^RBHYB>LU zl7{sBEQSkD!7+)nX-gvZd%`)FOG?Ao>e@(CS~Z)o0^;{x`Ti%!bmG)`V4691xYKKw z6x;;f9_5sqx`7+8HmmHfQd3fy?95hf4=9ZP0I4fN&dqKc&&dOgI~^ zt{yM)Cs2Xd8#uH96WQ>_bS02`ch=m9dTxn{vsH!tz}gUU#IqEWFx7x5#o95`Tx?=u zq9p9sT)2)z+P}wy$Yal>bREV%dwimGw5{!D=wc^Z!_PL;k(`EDk&VDI<((uWh0DyTyI=H|RyPBRDQDr>RO`zmo6#9=O+J z$mdK|3mVhtU+W?j7kW|EMu8FUNEYm)9Ne#u=%W9uMZsxA?W zsvL}TPN)1L9=`T+-N=Y>YVvQ-55mRo=WNQKm3^MT;pLpDc-m5~V{z5$=Xp9_5ZMi1 z-q~Dy9CAB^D`(RS{C`LHGnyz+heSqR1VVtTWRzd4tw5z8o_Q+wuxHjy8U1XZwqocz zdzJnPEg<0?2ErY1lKIeFBneG{sRvW{de?0k|)>#H}~M?XCqeJhz6?V z_W9R~f|AWmrAf>T`%n?xgDUIF^;&K88y1vIhFT^4fo1l1DtP5x+JK0XSd(`C_^%H} zt&=@`vnJNMPnzOj|MUOte*!g|NK>4Glb4vE^9Ygvof9(TOcD17^q%ATQK}H81!Sm zFt$-NCeGSf%|GNN@Frtu>X=-|Tb$ra2`*vJ$$I&ex>>(L?IO7dl>R|SM4^djB2~V`|RE|DZf5x`Z z`-*Sqq{LTuU;6P*CY@s3`>@+`@IxX~QAXsOv4J><4OKj6)EG^6yh6gvIwD3^GD~p@yirlYg3aS663`lBIt{r2B-9yxMwu#@kx-bR=?g z=}RGxj#}1WMZe39_muqIifCa^e@AI2#M~InanVdSlkb6*mFN9C!LM{KdRiq_N>TMo zvskRt2q%{yw6B4Gu|;KknN+}FcVv8Zr13V;ILT18TrQ*EZHf4fGxL0R@E{>!dr_^s zV5WJxnYbz8Ud6`1u%Iy*1HH&a1ymF)hL|*b-|mCU%qaeCi!D=tQg5WjQw*nNM3~ON zGzypo$^WK-C8^x9w?xqWdC|>PF;g1P`R#0P4EG0W48uHv8*r4K7YSoIysRm&vnm`L zMa?Y7Jc(rM5^D$_mz9S=s`tW3o=d1?MuNl`jf3 z)+dl>6JxE!u*g&6Yj3VzX%#uDco*=pzGZ!D1@Wryi9L1z<>=V>DCX2A(-qvt3?;gn zlvd?fi;t~yu^GMBPj4WOVgh_*$ls?esJ*?heLf+d{&v__c%??A{omzH-6XMc99?_8 z)Vx+_!@aw7;t3hA>2}=I`8vEgnfbKmUYf=2VTl{h60rs_{x<(Ki#i9Kdchu01n+UG}Wk#mb-R=wlR~sZhl+GNKvnR?k;CEaGho}bOS%V;cZ?Q|kf z@E<<){!WY}g!e~!iqePF5~sm3FUcB)DSo*4h8d_tD|ypq1poFw0r)T-IWq^_+LkPvKi^^U-myr)RAz zD)_>ly+Iz++V-)r09@uwff(bBt%O{*XLg#5C4*OqQsAD7re2dDV0qz~HWbJv-n-LI zNF~5Y*|D6I9&RQ%BU5aWA9wqgK;J*Awnn5Pf++AeiUZcm$?0bbNBh;^ebdwKB-O)w zRgie+3DEK#gw@`d@_endXUxiPVw8q#Im8*Uu(&f%?q4Qk!(;lRfgj|`6(Xt&K%s#QevMIqXBTA{oB?Ft$@^3Rvg6ZAngzl__;Hi*jgn~jSiKi$gc6Lj(IfVOd z3p4ma&@7m^lXkjd(St3eefX<>IKyH~c5R|3P{D_isv)pqS)A8gL*O7bcvLU~iz3RN zmLmJ`CFld6kps}AEDIvuEj@UJBnZRJc&a4|bBJd9YD#Qn~9?(`@Lg^IulK@U*6tiAnI1kTI#h zl;KecOH87P!5PNSj%o)G$)*#&@sH^zPbDqm+pbk~$^5glFUF;Ps9*D-F8~jBLOS=) zmZcl(ao|tjD8dNSkZ;ymkO!Dx^iHlpSh^<(_=NjS3(fqBoF;o_`PAm1-9;uxLWk;82@DDZt!;n}}PGF}Bn=ls=+SiB@ZjtAc8-PYZ! z2Uv|cQD^SU{jdJxMIQh+|NQm;zEcbFFw z0I)P_Fz)9U=N^DUbkLo|Ta+)}4zNGgU`@Re5{@ESIa%0b0Zz#J7V*&3FV*6A=Nsq! zH=TLtiK7{__4UCY;kexfZ41$b6Xa?}`lcufB>gDhLWQ7-aNz{F!=r8V!qLV0e>QRz zT{0g?&LoE(NHgPw;Ys(YopY#f=Aa3K;E{41F8jSsb5j6WB9mZ%8A8QJApg{MuQ2;< z>0LPEa#HjcWM~?FJ|63i<4&27W?NEG!3!I~WpXF^;GJKK)4v1WfN(!cjD=o6bk1g- zdNif>|HlQez<^#{AXPJSh)80BOp$-$xw(Eqedie$q#6&VKy`1 z!{iFWxfGh*%TNvKYL1}Pl;+OLV5*-K#VHx=X@pkP6R;mli7>B)|1@!?tW2o(`IEUJ zMINUcek3{P-2xpKAQ6xwQn-CnCYJC1TU{lP#xgog8>g^hTBs@Yp(DcuK{+DqOsxom zUexQ1N%|nj~KMQuTW8i-~ zA#9%eYoP3G@=$s~jM;MchmT1D8!G{#C2-tU{&VIl(d2fp4E%hmFLnGkm3+3-^qf3B z+#)vUekY-8bJ9(j9q9-%$)#*BKsa+^D7dc;PSH2xH=V>-krxXql+m4e)mY1d6FK)@ zlOH~ikz~b~8c>Pm5IY-K(stA*GuC)*IFHC1aaM>MJ8~AZEhiD7T5=}N>kO^cs$iL^ zU1~WO7~CzrQ&bf~qzEUchm=d1T{vF8ouyP9a)mbtFEG?l=7hzaR=tar?D?0 zL=qSGTl3mD=$LZ-2)uWgn}u?HKKA5d7)6tkKE}D_mr}0bKr!`W!JYiD(~4hA^11;x zth`5!7^*~;3Nx==99dqnYReYe+SA%U^ls-pGcrZeH?XAiH1+>{@Lk9me ze9$&ZDmG{?-VU|A0g|*m=$)FgnUxjXHk*Zox3QzKUZAmR>D&Hdf(gK@e*A@=sl8Za z*B-d=IVS_Fm??5xjXE=iJ{)tSD2^$2*8%6fg!K#6^%`U8f`3~OB8{a z>+@v&W?o>7n;jk~I=fIBh>32_Re7)~EpJL5Qp_h|q)KB>mu;O)athnJvUo~G7)87w zztGj<6n}RY71c9E&<^QzkPn0WifQq6qbqp4bMjg4B(no*8TqYl07#={OA0L$YB(BEtK^-doPVu{$w6P<@!WNSB}t;o+iTcpW*~j z2cAKBn6(J1(rH=#ERW7QzjkO<(TqYNo5P)sL1@WD;xHQ!u0eNaZ?`_EKl( zP&575_yL>9J5`j)*MiQ#7?~s`x?n@BIDxKuXG9xTjSYRqXC;G&ztpA_=gBRtbhK+{ z)MPIzw_A!U$*wcc-arFh(j?H|W#^$5Q2S``Kgx(8zcW=LvIlotCb zR(;dt==P!;NbxxVv}+YzGTvhe`|YBhhjjj*5o@NbjDgvJqtd?5-31Pvrnx%D^0GY< z4zS0NpFdLgs-ii*E~M}YlzZ8Xv0*8S9}Vk$mLB$0wnF1@NuePUH5BXZdg zM9IE%`EAHOo7&k*Y*n$-M?W`rREe}9QhJ%(S+~?$`i&3xoC}715I92a+undfOkzM+ zaEhPEKy*7|UE!SHxmO%IvK(zHdC?v0_%@0VIzp)hJ8x2t{m>7REpI_p;bT}@n~$b+AFD{{ zZ5r3py$8;EwK?U|_P6VO&GAg0jA^6?Q?5otHVAXEJ^OWe?VGq>TMtEVM2-3(&|2N^ z#fB8bTeP#&kz^??5f=$Pi!tXegz8ooa<PFeX`TbC}LtwtL}zgSd2U$Mych8s=|dXU`1YGy<}a1&k*R$Cime%PH(=dAj%I&1d00~rNq;*ncwW7~j-X0Ef|NB;M)VZa5fVgTA5 z3QLL*#2zvM0xhE|+Xe`pP2TX5KfuD2(Ql*3)7|${Vs2Wg)-7H#TiBu$hLsQJ61%Wg zqU^O9@X7Km>ND4~fsgOOy(7>7E8SG-sl==*(F>Evm2zZDo9?@B9rMIj$;qC_!(+CE7SM)ozkH5%rEB|a`DO_ae-Ysj_S@aE}ZH@ z)0voPlVm$|kfEmniZHOiREH43oY>gQdL8AgktmZ)5HfpE{kd>=T75o0m9iwV1{Oy-|tN{r4b^t36{G@2F*n?`V#yEA&^qnk37IZKO^EQ-_ z`V@CIC}kd;AF`CnP--E60Bg@-uNfz56kOP>xKIJocL;qYqg+3tX?VVRtBJw!FPn_H zFfOQ?6iQo9izrK5jx*LeOs3vyxlUSUyUtejGUDKxpVzoV9>A9n3{!!WBoc^t5W3Is zxtZ|6zJPKNcpXG%*@Qi;B10vIdP{ZDE2JR`Uk&e4d+_ovA5sV{MPr5f3f9R%uiW8p zFTeGgR7P?_EOUBVokeJ$mueGWFm8$dV#HSx18wgOi9Qx~=+U-hp!nFznLO%31_~QV zfxrv1Byq@%(j+i>Xkr@`I4+ZKH?W6+HiPgP2=w|CWf|!Ti$jerf_zuph0|j9M}MuB zgY*8q6Y1rhoxlA!v)BQ!S=eN#UNNB*gO5*2LwdUtpMo|!iM-+|UK@58d#NK|>+ z1tuWM2>*2xeTFl^6jNras6@wi_!4#A*k6F)TNu)2IIiD{0fU1j+vm!m4$_S_3k!M* z&Rz~Mejso&dIh5LYw}op8N9Eso3#_rTUUsGI3|>b^En(jkd(-h=CpnVOPCmC=u9P zR)hQ+u02Q0^za#tRsiU34gssvT9_)qiY|>_wfyuE!070{VqG5fh_rUGLC9TO<~Jc8 z@YfJEO6-vykj;JdssiUB^*?u8@|=i32n@5O{<=qda>P4y@>n{euDaG{KPi#kW0uZG zMJu9WLx!#q&}m8QJsb~dM=^|C>HM$QZMoEZy@5vqY`I?gSS42eir-dqid7UN${a^n zMRZ(oAbqBgkOmfwszA~%k{SG(7{sz2lvsS&Q}pR|n%`u7lXe_gYHU!xPg~(CR+(&y zsd3KX)FLhO=pcxq=^$b!j;Q}{IX;=TfZ>K(Y{Z*rs5zu0E*a0@!Bb(Fm)G=bY-|+| zMWty44>{@=m&|XVIa+=mmPgjeuiX<=$50UgLVoNS3SuU}(`%$_y03lvt&9+n>N%@Wek^b*C?o^t z>S9jS$HbCyOvl6gSdN^r;(y5Ra>DhU`p(oK z$5zQ>E3NwgEzBUQ7tW>(?w~8v z0p|65NpYGKZSaOcVuVG|QFa?pCR&aC~uj( zVF#V0vHoCf70+uUVjuUf#jCOA4+oZ0D|HPW%prBP7eK zW~n!T1j_H~_CWIX(5&2nAL4TaQJT6?aKCS!WL{NP)x29xZ8P6^N|~>P?TbQT_`rB{ zO#JlSwrs}f0+5ul@DY>T8K{GB-Ge;-1RdPhe|hun{MlojK^7fv6Z2E{(&8iP%IAAQ zpQ#yk^fvdlQ`A$lGN$_8sl|>{{KYj)iM-3>a!TEK1=TM`kKawlh>mn`!aOy=!iS@UF`@MvbaF7I zIj`q@F1LOfjrjw{d!3%LqIO!$^p%+|-{^SZ(NS7GGzh^=n`6hE3IXJ$eg38-()sn-a37E4xBOyj*&a%{Y*)5W zw7Y>c|FO3Ow#80171!-ICtH}F;&W zvo-!H=PFwrt`Rp4{$;L8!p55Z^M~~i!P|yh8~Qn|eXq-{znN3Du@(;(L*8S=M7HG) z*0zibjvgn4wkV=X798axfm49Y+1T7KjL}_*`a)i_s&vNXb%V;juPkr=qqD*1C&c$@ z4@NP&??suSlpXs%P!;bO4F1uep>NP~%?9KqB7C)IEJMrOB-2$(J9&w_3E#ko%S_v~ zj*4#DhwVza!KqpuJyO* zVzDKfADWAYR~2^a&%?(UO2=f_Oz^)mq|2>#g;F8FWPc-xwjSV>=OfVAX0nfH5Z=2RR~Yn3x3T!7l$TJk=4tP_ z<$3>gZq|xQ2%5uEqhM?KS-s2iL}#Gj-TDNV+{n`eaRgj;B+ppZ+EUIz@7&Wii{uZV z2ZO%->V6;Z2P2OB2p9~&4F=4*(THtH$uu1q)R7))oY6{aSuG!3%baEV82P={Q#f zvy+%z*{|C=*B83)EL8L7ez9$F*;u>X-u&%2Ik=v0oTXDWj_GM8-~5<)BF9+ZP(dts z&DeA8+#@4BkT8a#5k3@KqKc*dOOlfE(6{Jsi=h%6St@yk3Xb95eMam`qAYOu|1NS% zzF)LhF0sioLMGeT-c*7Elr&uKn+y7ff{*Mhe?bP6L85e6pO`V z24}`sc3bv@DQLPERa;f z5)P)4Y)FVGoKe#-Hv8(q8pz5fv&@ga;B0UQ)Xd1C_xC%$sW9_^=%0#!`PCvn*6v|o z!WsJ%XE|$!luu}qG4}K)0$_+h4|$%g3?xeJuA~hLs0{VY+&(l9xmful5~nH1$#l%c zOe+2on6_w2ofaTTSmR;mB8k&1)pCj1HmezC6!7|lEQ-OdACe6hlbbepM%oG~*5*flsjk38qf3#W6xnl1pqxgD5k}z$&4I z=1of|cH+r0Qn3p6L^`6U3kBbJ`#*^ik$+M$Y8!hBBz6u8>4FcW2thb)vNSQLIe=wW zoC=V`15vOJz<$1BssU^_%=}$(stRY^3LCk22X7+_fdurs*uGKXy_5z!rxbCcJ;zf6 z>^(s8Z5W0Adb9XVRuAQBgpf)M`WIfl(F%(_4Vi0X5cY^#sLBlGY%0cKag3dDb$ouiJb}$Pd?_-ehJkTCPazrjvdSoSWQg zIOSn2$KSD1OAV8_wl1x+;}A9@qvMCzI=L}bpIW_2bL(r4je3~I){*vK`)WbqWMwvC zxVZ{A?=9Us2z}c+x;yBSv2F%yd%!%2bv)*Dl%}~+6)dPtHX-F^0Z;%GprV`;2BOKw zl|)9!R9?X|TwX`Hc%AmtG81JO(bP;+KI|9H>NFH2KRin1YU{miZKpzu(c$G*+SpjK zSh3AY$%QkJ4K$SYzwU9RUfV~RzPAGDf-D+)1Y+mRE^rG5L929WCa3Sy@a!P4COoVd zIg%T`hb0XhZfxz#naZ+IWRXFi_$$Z7D{5-7J}OB}{@L!ORfNtay!rg>r>zGFoKJru z3zn81ZRo$F-CcO5bv!GcvcvXb&lFuO*jQgUB8kRy&lZrck93mru4(OS5kx-iUUR15 zb$EGcC?ID^KlC0W>+rfh85A?sKb>XB3VwC`lXMzBj^#d<82Ws(zmxBgs4|$fDwvuW z!F+1fn48Oh7PHzi3>ScQ_xMGY;W5gz2+-f}qB{1U_S5{aB;%U{fXji+eG?{tD~ln` zMdxb6a7u*uY;j7{yXW6YY)E0ATrkd-5evf3Qdo3Z6TL*1R|{-)MUPqU&LY{K=+lT% zo+icLX;ZFnQ1(=v4^v{k@0FN!3Lf@P>Kq2CYid2`oU>>OvlCDuN6xMT{HiyWaG2ZqKEGNZo}iqmN|_S`oV%46Fe9k z?t^!>OHN%f^g#)Q%G5TV440k1I9_*5CVADcU#X=X7c7QNflHmfMWL#IQ~6F(1Ve)B>^$RGI4)1N z(Q26tj-m?JhXjO@6K)ZD%1>9!@<2)3STkEzIB6&QnT6KrJ{{_|u{$D2qhm)JH_^Y6 z#$1MnD(=P3(hYD65>CSFbAaa%UF<<^Az*I)LlgUh){k^tvE!avR4H%h+@A1`F=;`y zJjLxp9*^aRJQ}0Zed5 zUn{^7x406?rK~w5e-sy05TK^boeK7IFjcWw_>Hd4H&g+t>kP*<)F&<{CvqgNeFqAJ{Bg*dzCt!6J{4X zN$B>Nr5n)IDsZ4(Kf@g?hpXnTX2d%MpWp)SizI=~wfzE<(HFDpT82;U@6!QJ(X>7D zMDYnTLe%aMTn>W&0?GRA7!(Z4oxYVaM_XoQ!I|ZFeOmTCqnLjEjxMwCk8Lw12<038 zLVt-APJ5_g2X&-uuU?XVoRJI=MTLd*$o+*1O4aayY0N3bxFmI5gcNhiM(9b~T+>Yt zmj7_qxlMQCmDtb41XWQ-04@{_|B{KD*XZPSJ8v-6Z@Wl8`9>f|_=U-gL5JIwGnA^g z5+x5%iz_~`ByzG=xP1I~2f#l>X3=1F5aV8K>Jy?xz2yMBq5k{qsp8Y%wk#&uH zPtOv%6h$0aG2^9b6z?7n%T$tI8dlCe$5Z!A?nGynT{zcH`;fU%@G zL|#TZ4t?ZTH1tQKmh_qJ801-i!U`lSs$L72&-}DSDo`d?{~`MVrNO>HXgrYuv|G85z5WI zJQ0kdUeUNe!yq}&2K%+r-*2N;_u3*Vq}4Iy zB&CGx~X zhMj~)qDB;=Mo0rbxdUuE0Nq~U{{wS_$N^er{q<@qoUf{?xz}9Kn<^4*Ri!fo&@{g= z`L^cE71@mgl4{J%^#0qJ@HtpTN)-!j+9Aa%&?XW*qhsace{}VVS?ZP_@!IS-S&22V z+Yo|6-U{M7)rnHPdWGyRDe_U7mz`c$mC~xx_ft|$IO%6;R!_?|JefUt=U&x;oR++G zYTnJxfUlNqjkAb`qyVsf;g$VT-p{L7u`Ar&()JFSsoJ{zyFVXSXwZXmQ19^}pH0>2 zCIyE1;!Y2+LbojXPXs?;xEr#}{5Ix!hz70S_0(TL)PccRUW;4g{3F{jD!}Qr|5#Ws zP;_-CR5CBjKWh`%yRp0u`Fvf0Jw*IhkR%-ILG9Z2%_YRwDEE82Yxy4JGe`jds1Orq zh$=dwzo6I?2KAy>uf(=pk9rsy^Nv}r8%L=(iEFW<_}li?@}$=A>Kr-FQqk@hRqwku zEt>{>IgdWDzmP=vKm{+8N$tN>0RuQx(dG2|rxqA-p|}3;CMueshEF>4o&c+LI^0W^ za_;22BwN#75ZzM+j6Oq|z*llk48>Y)xt)lBY2EbTh`*kvwhmeIc$6p zh|3Tn7_AqPD3DD1g=ImeHy9q$@TU3~puY*;F|p+HP_{&1+>_$>@`0hx(Tk30fn)@H z!&blCJSk++L~^-K<*{YyKt?bG*8>AgS(V4C2Pc;F{2mkZ7dio%H+26#;I>7x0X`s5xQ+sA zLcK;8J(=Br=?I>VyI3wji2SeW4M4tC8Y~pxco`A9j?%=jwhfAUc0UZAC=9qg7#;PU zidilX8(JqK=U0)v&zk41S^gMEadA^u6Foh*W9p(Sf&Y9hu{HCg+>+&K)|NjAPpAk4 zG!O`AY4A@pY!r=I``vUN^a)}p_4WR=VKQ?!kd9r;Sf0r$b70jqtF6B!h3t|f2_-Cm zI$u7{d}s`hm;}1|osqrAJOdPllBle3V*Dgf4B%g$sNuTm1q;^WKcM$ja1o^wdCh{z zBju&3O|eFP63Mzbd{xTGOSu=Hl6UHb#Z3T5N_tEKA!NQTmFA%GFEi*e_iu-s-TDgks^)vsVP#ZedJS7mkaCN8kk{+oj_wC+my z&)c%2@43A!WMnvXNhD4Vq@_}Cg-VTUv#!+~__utc0C^dc{lM2AFoKVZYWeCqbrQP@ zSLOQts@`D$;}XkO6D})?1Lrz68_(`E*I*%xJe!_(u`gO1 z#iaY#zCwxy3GaIKWvyO&cYz3KEi;Ck=Mr|-#v;hwP0O4bXCk6klDwgNHSyQ&zl3E5b&ixslwNtg{KsMXm0}DfrXC7po zg+l@dTNqcsv0@=@eErP?vv*96ipLZ?e4;R|d~JEhpe8knRk#IK38*efnt}w%j+zM< zCC02CkDmy82t|UtDaoPxc)69W!faQrj)&kJWX!Y{lG=Un9aFQCQT>`SPh zzUqFwaI)nlB3*QojeO;qT8eSIoQN zM~skPspP>&r4yO@`&@0bqU^*_kNYN;O6ZomG#%dVQN+O#y%G|<{PZN5(SGoN5>Uas z?K1oPe7v$0MQBRgw~p^=W!oz0vbn+`IZ!}`20<5%43+iBTxYmcVMe@|<0t~aV#eCor8CtO)$ z1z|4j2R8CBB&S+8d%b4k%%?U!SyNE8#`iOw2LtwxBNOMYs6Ywc_2wURxx#eJtGBp1 zvv^s;WZW`aE}qECC&|mDtqJlh-HWsDB{ftcef9Qy=;ZB!lq}!s2)a3W%|1EX-fq;j zcQia~a$QV`dRjXEnX>fPJqbUNf$3fNZCkTB$QmOzxnz`QFNvRntX2QZ=hXOMp*Jwzn;74X@p^X>pNzo9!kHcgTg&B+CWT8++j_XP z`lSrc``Vp}i377$0e*GwJFm09jRL2ahe`K>&1{YA#ZL`Oe6QRX*HNBF&vN)Pxmu>K zP<;gNJvzR6Da!XghIOq5e&oi#wzWq2+WP(|p{GhWlSG^y|C%{M$M`z8Yv#6RLj7Xq z$)eecgk_}F{9i9Ocydi;%Nr$76$KnBNsW^ykC>T)Xc2QlqHvT?^*i& z`=!R03RF*H^}nG89DCTJtVg&r4Yoq2r6&(LHsH(Fiv~Iku2fz6m5nXhD=j>YU#mOZ zvwh5!uVg6x5Fd>#E|jcfL3B^bQFcbCqi|s_T=@0?Nl*dnOC_I=Y`aRru4UD6Xzkq$ zIp3P|qH|BlzKu4%7D3{vE^%uI|2)Ap6|TqOr#2Kcp~f!4z2=<#(E8(pilU{BiS+~K zu_RelhJ&kheQm6sFmp#1+cDer>*LwUa(hVIY70dD@#xM@8QWO>DlF$9$@atMtDal( zvZb8EX5*!L?bEQ89$Zgn1uXH4ot`?{(2Y)gN0kOqg|aVgBs%WS1j8dE7T)9cdM(Ya z*3--_H4LRSWgda1V&6!A0r(s0#uLz^px^*23yu`rCQSP6!{Qe(zGN-fv literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/playful-mindmap-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/playful-mindmap-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..aa92bd1d07d5b563e6d37cd15b4c29e59f2e4518 GIT binary patch literal 96177 zcmeFYhdbNr`v;!Wp0;X~4%DinirTHMRu4sM*9w9hd+#kmhfx%@Yab&tW{ns@v=lW{ zGbJMS3StK_e(&@BUB7?gcYU7ga=ist^4#}x-}m#nU$0xNfu1GY>mblypjR*cHV)3+B!u`|;^1>9Frq1p*#Ptb zK7ZxTqrVOB@x5;4Gq--6Bv_XB*e4e;mgTRHO(}u#*ZX5%QJ3uXMzj3U^&!3zu?n@Y zg(DV7irsXwhF+BzF<&^vPg3o^8n=uz}^JRot zGA1%}HV#Td&--&mU$wV<|2^v&t(JYS|A~~@=k=0|I2Y9qRUVE~Mbc#n&SsMW z47#*xtN}ivoC`N)L7;b$-Zy5E>1`^~WF7J5L}C7wJj?G;%R~MZ&R*tt;cB+g@?EZ1 z?DL=bBcF6-d%hG@m#e1Zsr*`+lg*?$_Tq6V^gKC0%_5m(-(a+BMI9oWHZ3TCi4E|w z1u!j!EKFn#9PtzCM**&qCx=wm4TQrD$uqY1(NeloE!}JGGWcxzu}@pN8fsdXPYYN; zpi0(A1#eNidOc*N^)r*}yO#BvarNMQQn2c`l_cK5;K<^~+{amGHzT34h%ZqtJ)tTWepZ zo9^cg^&ADdZQ+0;sE!AmP;I#@uBUKyb+gP`)ZRDW@FDcTNedbwr ztQKMp%HB_{HpCcc3GyY*a_9>jYASzzLXUJatfutxgFx=~kqR;>Tk|2&){~;kCE+M1 zy?bZ**h4drKEXZP&t1vhH@{u*UqWdCvXLgxjx5hP+ji z5cGWp6vkc7^sM@NI^bRMTFo|y51x&)UhK@9x$$Ze{{WdO00!lWD{87@K4Doz1F>D}b=-hRYEsHSymPVn~_IR%)aM_mV z;q-aakMIlLSAGna8z9i{LAigThn6qT;-gq^XluMADKn90?$&o^o8dPHhjbMw1>yD0 zieMaSzf}L66kP@DZsjb3-iLea&O9ewv_r~Q&G`e&0%vB|zwELTC_R=(d3 za;I&1cS+G-%@`ID?iF;jOppH4P&*IghU}dV=h|K7feRH*Y==+jOuP7Ot%3!$Te(RU5y%L!SGk64mtCOioWUm6>N-NMoK&txW>JeTwr-TORV{r zAhV??x4V~m2%$7`HB*-|FO2v)Bvj7&H-FJV$RW)brzV4bG5fB*gW;qw3)j7+%*&Fm zPtx7-7G14lXx4B2}ru&!DhR~fu*)g{mh&u^&(`z?n@L!t>E-0 zIc&G9W53%#QF^yOb%0gRp-lW%_#w7`N@oD00LNC?XFj_{AO_CmJF8Wca`=@&6TQ~g zFz3Y#_*0HXvSjCL$vfI8FSqp$BiX9XPGb*p;`ocl<;!v52uC9d@WHgCBD*&nLbfg* z2^v5lO_Xp|8n7{&_ZH&Pla5SXkLIF+d$0`$#0Os6o9A;_nJx6xNB%IJkJdFo>1Apl z56M(3kjF{GRzr?IZO;<_wX>g+PF^qNi)@H*nV#jd<5StFiR>7OyN=^DjmK=NI2K?fS1=xcKx$eZ$_2>t*;<@ni(cK8Sou6K2wM%>5 zWBrs|+v*hPtHvXdkNKauLjQh@3S0Nb>r#Y>6eVmB7f%{nEbi#R6m!IazYo?lKGo`0sxM zUyReJTO1MCyj+QOtCM};j#mHh=Nr*hKT+`GtAKyQ&&e0RXwa?JTLb1@pWUYfR7xd zUgM@J*jD;~Oxcr62@Nd6ZL?qD1-Hwml+gYXD)JUH6SfyeH8Q0OxspJVGrVZFtG~}x zA3^rYbd<1uR7jS)=e0?T3suLJg+Xa}P>1(_EVs$-g$25l-(eiUo>`2&oi(Te{|Wkb zU9;KF?_@7^sw322`W}wDtuxtVk&U_47(;eeBX8&2zqq1Eeab#Yp{yf`ei5T^x- z^;>UfQhy`4S(PSPI9Me(!F#6ZOgmkuf4`dIC7`ajxAJ}Zh4I~mA(fO5>)H2ee}*b% z!_?qg$ju;YApj;MU$1wHP&D=W%%dy&_?Wa~Wg-@=ZFF>ue3wTVeRckmt5zTW$Yl?F z1N1HXuNgNNtH-aLf`Nk0T3V1Ljy4-WNX5F|OJJhxA`Q z(T&T{*zX@|>}kqX_?IKF?NqR){W>iSvUrdDSd2F=A*6fwCNVDMEkM!PpOyL#fR)y?+|3wkG5!{1{tX8 zS3uuF)tYPaV&!{%x~Fc!e7Ye&gS+Dj`a%;c_V_vs3>yI;kyR-WNuw?$S#p!dHXyU< z{AO>!c~#WCS8F(~{l}HfUM*Q6q#+X=#rP=+_>0>vSr%~ByQ+~oYz%I(pB>kHHDjhm z|DoZ@9@FqDLy0+6Mfi@zZ_l;#kJT_kl}+j%TEOem-K7>?ijfMSMY7w!h6jq8Lr@WM zJyT%!5|vT9A+U(!qYG!RGPWeo%9`r{TvX~j?|Bx|7`Er`5ZK32fRZ#Pf{V;{xxl{@ z$<&7v_Ov{eA54ktb)DHv52t`vQo6=XB5e{Kh3keG=~OAJei9eyU^evStlv0e2kP|F za56y1HQ@Vg)!%$Ixs*LNoS%tQrFk@ys#)pBNE95ehMyiPeP$Qo^|LDI8B z$~bgUC&Y0|QiLsWeI)HQ(N#JiN_9lHsoTbLL~yws(Wj-nIPK73xFcdU3;%0xM8S5w zWY)~-MHi>T4bZ>WX(*H!L)Dk_R3WJGD!;HeeFj!vUI3dGbEGd0RE^_w{n z$D#URoW<|FfUQODb)T4=>W7)Sdb!uT5l>8@=jA7e7{igTiZk5nGq$vaC4q#PJESy2 zRY62#*cr7&XY#VM)`TZAE%S1|k^5tgO%+m@bGDh9hUe?}x-gt8n(n*3S1Foipi09R z=*4h8-G#i^;?boQ>^|fcxdM8_5$zqJABL#AhHBfe%C6m4zs%{STNUsieA0M1#^CZ< zV#-;=NCQ0)S4yvRJoc?(U(a)@Ha^^OQjAp*XW9=AoFWoAwq0cc{ViaP(HjdAEF-*y zAmUV9)vTORzPWEwfrzd+8c|0ME;86Fe$|ed7-h)vWau7?_Uw24$(~_(ne;skN`M#! zC+=Ay!c5E#bL&)m&~q*24I9~|EJ-ibGGjjn;x5)aU|n0fJ<%c7*FbL=-gsZ$bfCLf z`>a&ImX9_FSvN*5(dx4HX^eesuz#QI{G`iADSP@SYpLjR+gTmS_$*z%HElmPuE5IQ z)@JM5uz`L>z`(YFROQxYooo9b#npDWMQ%%^DzqzeGi(HExvK~jtqyk3f5buGH5$nj zt09^4i@|6kTB<8MO?3=m zq2P9#Xw*21(by9IOjb$S{$^c)mA7Rtl(S|@(o;K+h0cu%>!J|v5SY)xYAlARWAW9i zNaVF3*IBllfC|_j2}955*lN&a_Hv~+1^v~sZ3wh(*A!}hr0uCAmcaVp#|}z}NU~t-W?5>eTnS2c zU6esXu_!<)$3|ObV%7x-;6vzBrogd3p&MPSSCyO6(|~GRXmcF z>pgh=2ZY?Tn*ILSsm=&%pLiUPk`%)-m_{jm4&Pn8jn&pA+xEBFJtN zFTT};AvC6Dk1xV=D#zSE&VeuTiCT6k-B$UQw6w0Z(ldn19-5;MR=s!LRN!F=PuLSL z2-%#*7(TS`PjswD|Ka?o#KS{!@pcvB`-ezGb)T_il6r~D&#$Q2UKj}UZ35V_z3=S# zC8quKz)ii^#LPrNfQr)it0~|Icd|`IT*1PG>h+whnH7RlF)C% zpvPLl`Q`bm8z=pgsG79Z*m>=A1hbdtRO{YwR;~)lJ0wUCzl;5d$DJQnC1`X(VrtM9 zAMK4RJllz5jjU@FuZqLAT@{JI&=Jb@bQJUULGha~^Dy#`Tmm49SY2}|*5q{{rv8J@^ z{h>?%psi=QI?pXKOxp#ZVqwdzEphxgXw@x+;@VSGKIJRjR4h1u&{EOLGXIdX71QcP z7PyFFi>=y~m~HKj?O%&G?>bZo1fRWy6cMU2^xApnN?ACucbPSZoWxY}B%ZFeZNd3h zX1EVEi4R#a*2kB-{wNiLuoKVZi(ie*+CN$hwaWFn5Bj|+GyZ#*x{d8f2|2Py780i0 z#jSC+t`-c@45s|Umcc6|LJ;TF?i?>7U0tE+VOq!0KroqIK`lGqBKL8`V)p`vQ~%`= zm>t3)OU{IfWokdVgR;Ihn_O4bE^)%%UPb5f+zzDCQ_&%7+WOzph*J~5<~ z-o#BSm{D`d;I=jzx}ST4IfP_nIR8m1z$M#|rnY_{&ddTF&l3r>=A9Wc6I`Jk+k&8f z^6+iT{#Ly=w6K`h8yiUh+p*QV?t>F0<7s3;L?^NbJ)8&B=FQ_1CyaHUV_a5C57&** z?bFX}vEunk@+TWXO1+8WvH?V&N7KI~{PtQ}jKo_5k)%e(?wr^kH#sb_1m}OL#M`=}9W_wsgJmVDCKLwFh(L3P4&j3n`$aJ!xwHG@ z8)rGPaQ&)bd{!HHFhuo(-`zwem0g zVNVhXb(hs|Yc8hxe}8a{?nL^-vD;ax*aS{$TWOA|NV3azcKBio64!wX98 zPo=S~o-T2D+4*TCL5=tnC9(ISD?pL+X_iK1;Hx|en~(JwjI3Vgz%iX zsOZR>MF%bYUX@%d9(^K3klUk1c&&o1k0UO0ZNh!emIa=9hU|Rf?GTf$O3RAa+V5zh z+Fcq;s@1EBhi>DYym6mP2PV0ar}mezO8MtWm#&i0)So|p&dkhQWmNp6g>Y@p&;_U> z6Ze4d{`_3OeZI?+w}#!X{n)S#_K#fFO5KTUv8D8qC4B5UT`7if0Rem{`&7ZmFA=2I zVYt^Ve7#8Pe}orTB)50o$x1Ch6VO_Im-)dJuztM+)7~{ruv4ruc6mvJecNGmf`d`q$&^lQ=XFoavjivS@hJd#q=(p`#s%Q+d5 z#KOuN6BC2S-jdTi*QU$Zyo*AwDacnO_U5fU@CZM z@+xRjq4QkR&E<)X+KQy7m0v>5>3T-|@}_S|_3Nh2Y#Z9;*7VWzrVMaq8d(?{pmnV< zEf0#)4#9@_8F`l(dvC?vjysq+F`y1nT%ue2!@t_#tqJAJc6W$ITCqP%Ie&0*aaoy} z1@C;nAuk``k&7{tKMI>4{U}-BlWBTx*6taFYCPXH>!(pid8=k-OUanFxuQQ#m_#(@ zWY)BhzHD4N4X5YEsqEO!0|%^FEa6OQk4Ly`ozcD(=W|P zN$;yK$}r`Au&6r<;}K$BVnCuL@whBNv@$iJ*|w%Z0z zPEO|M=c}u$39Ui6P*IMV%@iuCY+sUYn8Qif0pIj66gTUv*=|mBeZ?bXMQdJ>+JMVu zn;iW5CEo^$a~I+Z(|2&(M2;-{x(4%iH`l7|kUbMuF~<>XCqruivqn_*v#{f#45Zh7 z)Aups&d{%XhYT#b$GtU8r2y1nzTjzm4=v#Hv3-7R@UgU9~8kb;@ z(crKlafQV)+8CHx$3d;JeX3RL`UDuN1UuTC?}}+fqk)i2=<}IS?YTUq_(q%|(s7#F z^%db(ITOFxru~A-YlS(r*|No?t@?G1w!C>3OY`1292S@)*`aMKC~cO_4N$zoSsOlC>(UQlwm^0u;&%W8Hr8p zuTC&lKiTI$ct%GusUn3#iqgc>QY>^=gVKMB$_sSl2rjpE91|g-3T|iaJ?uGodGLb~ zO%jQe^gxOImSon>MGhpegQ_*JAkI?8LU^gF-(<1XS~O8F@57K^Y|5H@qP@J#*815e zaWtU#w~Gx&V=6-0FC8%C=$II=sp)p};;r&?4LNx2-bC3R zHvjPpBMl%>jKFde_O7zWKWq2e2alaS9V=5HvEwpE^l|^+EP!<50kIHL*ty_e)I!SR z90lh$Jqu8tXi@98;IH%S_s>c9tT$cFi`v~YD(fdk6dy}+>x6Gsn|%zt@#Zk{b(Wip z9tU@`{KkpxfxAP<_uE=)(G8u_7rGe*1(uj#G~)7>a7N{p*6dB9(TPLQQP}!f?Ac(; zULoeE$|Vwg!!wrc6dgiqr>mo@%cTX>;uO|oUirIooHco zck|D8S3Hu<`aj8rWA|zoiR|HLe*F}ospa)lYL(30vE zwwnYHJT4lO-6s#`Kj(YWsi*dI<|>6XD*9ta39d3F$G+Fz9KPe-#wEv*E|)HTGzRV; z_l=HWt4kqO(TN6Xu*cS3Gi&cdR1!U-i`E^7XujPhoz*D>)i%hP_ldSZHV%?zxg*x9 zgK?#be|Xy4Kgt=J^}{M9&`+&`1cmJ+dl$`8ESF(uo2r-*>ZuHAPIEMVF+H_r z#>(V5Yc#dP0V``>cKkPQ?Nf zto8C~&<28w`)mr6bn$LHVRNuM6?(eZd1j9#a1$@S>94N##Bg6)k}wLH;<@O9GnKVy zdH7ySq8f$!?7+(<+T1Mn!RaYfBwuL?eOcYkc)8!C^PTXU%BOm}3Jxy$y6~|;=wf>{ z<6^5us`CAfd%&>EIhVEo%3op}M+kPDx!A9<*XY@tDe^m-2s6_B0uO2kX9&uF+Vxbj zO)TH+(nh#GFno%OL+GAgwSg`1$Q!@?3#qZjIsyK;V&Ex)E7gV#R44{+`cYCOdECE1y{QRxwTnY$@(S zFaAxj@|=PNhaab(<`W>~i(?C7Yu78BX-!hb^%fgq&yxYQ+0h@`g=y3+~^N1=O?5c@)(UR$z?}&I6T5?re zZwf2cJn}*3MZ-CaH%alc+^+%i&$jOF?*9G_H8n|HTe6)$5n7K5n>L#-o}VOqa>s}E zcAT{@$Ct5c=vzL!7&7h+)Riqs%l33e3zh`#7+v}`6rQACp0#!l&TNcdBl?lgxG%qn z*+VZ|RVtUjs=H}Ss*)neb;Gfs@M9xFQ1~X2NcHlow=?YD+Zgq@+-$OgJhMK}A&QC( zO)lMPJk-$37jO3|)oH%^E%bTwW#qQfeP&fff6cRQBZT(YFwovFSCXpZR6A6?Tq+9o9;M%)!5J`!%6x9%FIS%l_4!a_DWe3>w7=`7*%TBQk@iJ z_8+4~u$PPvzMSzBl5PnaNt-{l^_i&XbGiX)W0=3lk5t>k{8DDx}*8kyA08gZg%g8gkbM7SZ<+hCn*eDYm>fCo$cv-P* zb5*k1>WJeG+T{Z*D5m&!Rq-o;LrRRa_sg#N($wrd-w7o5Hh?a+rcFpFcO3>nJBN_~ z4`O+DPZV9Tz~IZaYPT|@{#Ha-L-i|3aqg^1f8KlgCI#>@wcA9$E@ZTpOlm=nw{Z7p z|2yDB#gl%&(rqfbNoa^n)Ks^+e?{KdGU~^zMz&1&fMOM$|lZylpY?F~pXr8JMr7jQiWdhVp z#nr9bOYPb;<{`td>Z&xuscU7Q_am9QO_~f3DtMm;_5qdh_eGnZBo4Dfj*lNZB(y5_ zT4%}OsdHGi!VdERum+H27%duzB!hJ7)@ zDj?iR5q@rWRIxvdx2~56I=M+v?FsN$rV6zJEqWOACSN2|ep#A$b(fJ&XZPdA1#Hi>Bqt|hFc>a{z;OU%PJXwV$DelAV3K9k>H;+Fb#IK8 zw2_;X6%J1&_jzk*5vLDMmwRS&HalI55O{h`+XN3tAdz2MS8_0Vi<;sA0mLt^%X4x8 zd?7yFy)+kMTJ6@I(s$(H_~?PwZ^-GbtdU5jqUs9VNB&CZh0=oap?c!Eujh*4p_YC> zrNW^@2B0OMS{^7Jl9Ecu3iqt)v2>v3>&Ue7Lw1>(!u@pBz7DxX8lGYOXATgCJaIa} z(qpaWd^GxRMX2RT(;j@e<9$RE_w3K^{cXPXzJtfqw zxVF9PW2D^RQNH5E@#5-m9_)BNrpW_u3gm(PqThB0bs)+Cg4+5B-2E@q62$NQ8>a7y zn^yjkGC&`8h-Ggi<3lO05n;L=lYiVJqBIlXg(*<^9mx)i4A{#6^HWs8?tK&h_O9a9 zB91vAlXIz8K(jX!n{kGhN1vD$yf5*xKg=u+O?_v(*?K9&u;m}Qq~=UFxbosMEl$PC z9oCB%Fls_UFS?17&M#CAaq9XcR4G_L?-?qHJR1}m;hiq&H2g6!@rXh(+LE<^6kp`1 zWQH#w&LnGA9kCp(w**L&-mppTzyw#Y)+<3c_Hc6m3%9D6PQPO)#5d#nx^m)=4BN@P z4zv7rv&sGoePTiI@$4}>+!pjr;dyh7CWBx*58~20u%^~sMnO(aPFZ=DNF+{8nd7_v zj5l-*4*o4Q1cZ%6jl-g(f5^YG<72Ml0*B%kc7bbC6Q?Zottu?~H8pMrEG(sZ;V1f| zkRZ2c6U+RBNm;1f*RnRW+!8V$cmO70ZB|M zGVwz%A7T)GX9%yPcJIp7;h1U0@VOojfsN^lac39XX0u^fKbZ31WB5i_-xgQKa3v?G zQgX0)@tI!UGifO)|MgJ>(5b8s`G=F|m_5bW#aT-L^=S&u@fT*^#+x|`@9 z-=3*AFP{3g%>4TGYi{lz{#0Zm3=9TWv7*BBo&{{=5YJW$)nXom?R*E0!$={daWBEi zcU54kuBy%<-CY6_^nzYH9^v0L>RLyJd9*YdVuUKu6BSSG9XAo{T0*6V0WpoJ99UBn zKu?LLYRZ7VhTq-}E-Ni9y?*1rbvO1!M8qWqPW_yFVw1S2c)C_hM@Ofb^uWW*tLD)6 zFKcem)wm0~_lPV$%HU@!A7gk0bKFMlGv1MZ?w7LYt{1MMWZvFH`_5L}J6|ZzvGTQq zi0XqC!RD$5UW^`YvM`IP9IER2lEwuGpgFwv?rrruJy`$#{rkp}PQcE2Pr~f=k-53K zCd^?K-m`V@H03Fe(XX~XZ&YvyLHMu$8U1I1fi#D4y zQFpI>pVMR*CcGagPd2IX+cZ7X8VPdmaElMQ6diFk3q+aaK|W?&fA0ka(J*y#ku8)9 zxH&mF+1V|ut*aYhK|w))qs5Gc(lxo^QmK8MN}&xX6l!wddy;`qng_K}xW_RMr#XO# zJEfNS8PXCy8K!27(Q9irS=2sLqX9G$9JZxOC6SDrNfC~GTq&2uhWDG;c((}a^n(-c z_JiR{g;gFa-}4H$P3y&~`D}rj71BP?^ap5?r;|&i5Q#)?%)vxh@J(LasgkN6QU&zG zsdysh{0OhI^Og}P+QFDv~2#pPEdv~AKe*%R>ePdhL zQ)%QYo|2c{4IW#jy)289O7jp(+quMT(3`o3GrRfpjEs!8Zdtbl*Vfn9XOmIZuZQl% zclSPkiDV8ao$Yi%8og`#{@n}n*-&+Gokd!w1{~XV@2ew=+%>1F#Umf5rL7|Csv?uP`vPDWL+oXlg7NbRs=bybfq5LkDIr?y7!9e-&Z7>4N58 zyv-KxT$SJmDaJTeIAr-ksG$)VAka=K&&;khGi}tytBQ%fEFdR6hLxPGVOuDHg0Q_| z1#;VJKFqb9rLDjnpxI|8+6u%^RX-rFH5tDiFxRK4ZQB3{(0=OxHak8RFtM$rVZ(}| zS?TiA_)HWs6RDH+!75zWPK#CbMVE#26h4QZ=Y?VsV!^_w-6pHZPJ1q9?+*}}X+Dvn z8Gy|yEG!IGwB`z{si>$pESl6)E{NEy?d@OQ8!6W0;NWm;=d4Ul&n1TnrS4aUFYlRf zbpYxhMF99T`%Te#Pd14M?Pu8=;o`}kSQsSJZ-H{SfHxjnA1jNAj;_`jcFzY43t3Jt z%MabyZY5(#)vbVGfbjJc$lrqH{S&|iIZoItcNywhaZ+f0(81b>|1&GnGB8(~@al5V zN!f@b{f}C$NJVjRF$!fe)?ieomynPElv!gT=36mt?F}5u39_^IIXT-7Cm}Ex%&nbe zd=RK=YirJScEvXL$#aB1K*6}mzUqZeH$Hpy_^f=t#*6cj1H_n%&8I{78cfqUWEOkc>qSaxU6SDJY&0U zQPy;>#l}Jmw{B?(0$cBROVPdJ>h|TyqsY&GD=S+eJdpxz$qPRx$OZ>-s{^YwRG(*R zc>z7kfO3z3z8C^3_VRi^_k;Sjy;8T&0gg4+Z<;qGWF`)cYuxQ#+C_v#q>hZUxZYLe z{K)ljW5g=i%23N{Lp64TE}LdhT*Up6<(r!*aHtQJ(b5$BONh#z_9`>#T)em3T67JvTiR4H5FNqR;qNNNA$5AS< zK2c`ELVAuvQ*P5f*mF8RuinpG!HpVtSXvW?3yNZD^b$sJ5?yL7j=GQ38$R$=UERG( znBPvzA4TMkr#{VFwW`&i2^yar9MlQ$<>$NwW^Aw7@5@?WUkB=4Wntm`-Gbvtmu!^v zE!V~0wRTspUS(7|V9M#Myz4hm%~WJ&I`s|=9}4T~IOPh14vDwo&gEi1v&64WWQwYd z^UW%Lb!D&PK?oFCNDYom2H8)U2d4R<{n1P5J;IBtTB~Ad;=eKNb7GMP24;)`l`jrK zfumZ{3168WGHaO#D^|vc5-h0F!U$iz>IKt&Yjc`f3-iOY%%HuAW?(i;SjB0zQ=(0& zO{qvdv{T8$6jD6(+ZI)l;D0EmFY179ibi%VUbzl*gon$qWEo#oGE}zMkZ}ldRJ2dOSrL4KG3opT4nwZ)q zVDl(YBT(XL5`{~1rZy3{vo@9n7Zw)KdAV7iKL-Of+5!UM4nMZB!T~jU{M+8%UaeiP z7GgA+SM&Fky=WnmafAyjun%^w(_;L(D^my~{-18P2e(nsqM1MGJWOLM@{AXZ{Ms2R z=X1hQzg@*9DxKxrtY@ac+>sVggGSN{d(9qjnwa^-$z#P%R6l$Yl-6YjbZWEGG()pe zcO5p_En2?f?6d`7uXPf;_XC`P*|XS2rGSM_yB(b5nYGxmM{vJbWjY0g5wApD zH4vYoS&kQ@^Y`4brdm@NEC0Cq?x}ZH&0j;mA8lPP{{BfrRX^1=fi9A(bHtF`ahcVW>nT(;{;#Rf_Zi_Lm=A~fdz3jk~aW&zhZW3@G*7dnMH$^fPetz(3e1+$rztSV~ zyfaQ9(k!n@2?xy!N@Lo%apN?-X5;QDFl_?R4p>vtbFY`FhPbHGSMWUL!sFD()aBmH z2bY~^td2sGT8{-Cv>OoelQa3wUU5=v*}HnfoCMG~R0db7s+OQp=tgp> zrl;;q=#%iTlWs5OfKp$kp`ihQSaHkdUn3(UKnFu4c09P{m6VX61fW;~fdHUbhSQ1S zomBat?HS;Vr}6kCPWd~rFI?Mm{}E0*tE*y>*ha9GnH_cP+twN!Ib|y8vKD@+c9FO@ zQ6#9uDY;>xL->>}W*0y@e_3U<2VQY6D~enqB?j~GsS4$-4nk!41 zd=`?6LX3{aY^WT}pE6Q3sT@N+!0`8XwPw5aRtfpLv{B_?xAKWe7^|4&e;L{6MFavf zqK%*K`B3}W-hjT!`2ipqkpbLeQNtIU##AP5Y|Sa8KP>Mgu$84Qn=RG(6yQsM2`IMF zI}D|zbdn8kqhHQyofKK_0MkVMq1B7nB$M2f4hgR&sr#{CCh-olwc?|r|9E;qaa+`x z4L_*$@!mf+zmoM}ZS4wE1a_|k_7Q2T$U9(tq8y*o$&7E2^lguiv^-h^h~@o(sv8h# zJ1)5BRDK?+-Y=>peky*-@W^{%r#*n8Y(RN#48eCi`;&7%@t^yEWXZ{?7;zB>AgX{J z_?Cdv%E}7BI|5(>_zCXV$WG~>#iN4X2SwDORbX73GX2s;o+P(g^JiQGbqgjmj-g;8$#$D3mXEn$8mX7m{PVg$>Wcx*s z7u?IJ0f}xpO)%;+(Rjc$wcn@YxU{#J6|Zk~z*)0+lsIEt9S&)~E#o`Zg1cNfoaJo? z?22Ma71zr@iIEICuL+8}L)v}y(Vb5LoXcU!dB91|%!xQ*&55X;6juFINwN9+UsoXH zfc5_W77>WWa)^c}0UaQU`vu7BGc#=&1-D84z+EyrdS~LIdWrU;7`uYm)lp8}k4!rp za)dyeVNj8KbZ7K~FxEI%)enG>CX-E|+G!!@SL=+5yK5rEDG5${1s5;(z{=ry@w8Ql z5ZDDH|K;5Ah7Y)z8-G+=`ZBe8-OYQ_CGerb8ESqQuP~-Cs!G%Pj|w$H2~RbsVUvcQ zj%6wzkX4L3P_sdB019j`r@qTev0L?+hmzHBFD24+BJaGGJUu(uFUULDTwPVZoZ>3j zO7K;rA%D2Y!iJSjx`AeIk4XW?hM%7Hx8mmFYWJR3MH-i%j4Q~*0uAh9ZxR6PE&*&_ zeQ5E{hL6kz!|Z562g5ECippFPtP0`WU+|$uZH2t{W~5y+UyoOUC20_JS02m`$v+@S z6^Pb`hCg(3F5*GNh#=iiVOqci$;yg3PFVJ8=z(xg9lq?;ayEqIwA<49MU8kR%4~U- z6HUnq7r$6z_@P-kUi#!PXD8B7RRAHtb81M>u?(7{*T7f#c{#m(xqcwNI9?Z)?QfK6 zXj;cyv-!#jm~vU&>=pM%AR-f|Yk86|V3D(YNl?t zruNxaW!?oj32b(ptZZcF56WlH>|NGVW^DpaePjLdIh@N)Gyg#=1EV_ zpK2gAnm=Fu5JKvbf1!cNrJnKZwhc-O;s!F!t`ZZ$(L~f@b zR7wJ0CBd(ObYclx&z4tkTFEL_k|eeikm1Ax-+haqE-m%!fyc1Tv)va&whY$bKJ}lZ zaqEo2^{Gb!{f`TLVwOKBe4A+Kk4wS@z=*q@n8hgXHx&uqI#~^^>Q(S8c#@8y;d;f4 zMQgf))-y;72R7iM!ARSsEuKsy5DzQFtQQCqo(NU>3&NsFMTMARfXyZNsO;2`H%2p> z@fI|ALzO%{dtiW$2vV{6`8&2Yv*UDc=evz|(-qyfbXd#Zhx)BOdLOxtldhJ!YGi2W zOoXj-LpRP|IZ^xw?=*L0PhZ_sS^dN*ft)HJ;oLn?b=iEwI%!?Z-jx!!_EU=d9P93L zqn-%n=?>dJBSJHvgeWIXV5D)^?L8mgQfH&u+Lcc@-K}+ksKzo8?y;J zETF&WpBuF8-ErJoO?dq+*v4<+$A5wBfp3)G%BX(%cd@@o+7+Jr*OWy&d`?GhP1vqL*gLYx;?sysNYX z&3fXg`kq7UBDwb9RNm|FzSk%`U^{+NAN&`^%7DR?F7s7Zbdi zn$Q0h&3>Q*K~H$wT_vxyhEJH(SC@JkwyaOK(=nmMv4T+a@-T~$Gz_{{ zMKI779HMth`)b(U7`pb&U?5L4D|v8jWTdKKy1dl5PayqbQ^wfCKsNvyN(>|(ImC@U z_%Tl_*GaI!*w{Z8UGte5dX~@ zTI8>K(t@imZn-1x0_^hU{=1H=k#88EyF`{<%e`R>%Dn-SyQa!iBg?sFz%pE*5^;9C zJ2^RNQem176WM>0%Gz*w=AwGlJRnEKj5p(X9qVhO+6@y~w5o}fegt&j5ep&gQW({W zWHz&YH0X79MQGmDpnvb3gL9+}TjOBU%V<86p*n%Vq{A;A!Gd@d*R%ZsLsAY*X@shMSYoBxO>eWB>XkX^LVt@BN#W&nkyZ`o&w>95;<2LVgaCZNHvj9H} zlMNtW%8O~={7a)ojVZ?&m)#g`bm$%KZfG!VFSR&`t^9T;+Fx;;=k!NAblPo+LH;jD z^h8H%$8KrQ&$^f9v?DJplgF~g7JH5*0AK#U4psg{(!{V@&|A>2OMaDlq+j&p&j5N2 z_U;|os~?QCl&;*nM8~JVpG9{LG3}}!Bb(Z;Pp6x%kH?#;Y=(d2`UAxAYBN$|VOIP{2y2I|A9k}r0rq+6Yx^P~gHuzCqeZg!&R1WF)=HZ_w zDMK>M1I2>L*%@1mv~iS~dKFp`3l`7y`-;aiC#w;*Inhm_BO5{Rg}E;1r}xZR$<|uy zXv%q%u$hZ%)OR(7Q0p)qaeG`F72BZmFmV3GM8BvNHVld_1;!N)0vid3v!@JAcU9{a z-wTBAkzIu*eev&6ZcR@u1v&df^xJG^x#oOtE*^($;giaU5&Fm>i$7mD+UHE)TNYH) zG+U^kvU!?q@dPWgo5;!9?$% zX0ckSrO@Q<7e`klR+G2XFx;V6La$WPUjOt5>)e${dgE8P^5DsxD_ox{oC0QU)qew!Ga8MS@tj#3 z2eq?5xG-_;EeykJ)Cd@lN-3yhe6iQx@C?mOPLYw>Vf?%B8#(e}cY zFK>edr4=&s>aq1<$lLk*oqEdb5+Z7X6ZN4!>C9#WUq8N^M;?9UgtQjQjI(TvCB9`~AF#YjE@b$2+i@&c@$WQY(a8z$}QCNZL{)x>}j1B1h zo164Xw>sZZ3Kv-Ze8#l)+}V!pI(df{XkQY!RjeV9R^R1*-z10dC+w2&+dP(#(}k(X zOv_N^tIxfu4?QYcgD!06zDZt0H|8ksB7k^BL&NUy{Wj)_c_c zJi_!Jz7Bhiz}Fw@6-l%$B167SXkoC)_F1Q%#y`PX#GMg_NS?}{b&76v`~rTJ-}tF1 z3d*frR_nv+e!{aY@0hjn9%Mh2Q0mLCnysQG>3n-;$)?$?V0puUuASJ66#vWbR`>Qh z`Y1XY5beJ@ul7lr|6VqJ&9v~3^Vo}fT5{zR``ep3^baS@KXSgK6rJDwF!P~*%YnW2 zYTW#h?fj9!W8>}GLB?UmwRZ*L+6jTP%Oig43w3v@C+hnw{eOU4%?#Rd*KEyh{ag9h z%{UwwcgNYCTlpv@`;}QXyQ_6KZK^)Ih&an4g}xVvz3w`OtP$lYR*3-Ar`%6)n?4R> zqo=C(@nUM5=DzjWo=$#-`{~f( zU*1ucLqSrk(A7uP;YLc5CXU8CG@?PM=1#F_JDH2Vp85_&y0}x(!(@kK)yiMHv$ryw zuBkg?+NU6k%!-|HK~;}`(9K$SZ84zuZZ$DF#3br-*4%cx_`1T#`igH$XW@yyPh_i_ z`M!AKD%URF$lOZ zGvrLYzr;@SR)X=Ep{FlZAc)qSYx9`<>u#5B>;p_aFpYuGm*|?TbFlgdrX1#ZvEyGU! z?Yz1xBt`a1>0;E6$b8*(qZ>j`v%buyynJL9%@Kq$IM0ux955bm-&cC_>47stgQ=hi zLcW1B4crlNI0)X5nP6tkm}xD!@8cv_8m@hQa9#biwdK)dsBD=1)l#vRZ6QiFW2K<$ zc~1^|8O12uFDus3#cH>DIM_*JAgpdXRn%8|y?5>j_kTX>8{uanBz@PsO`r>4GQDp7 zjj{QU3+BFJug7s?bhp1Yl%UVym&$#f6w*oEAR5=tl4|b%$oVmXJy0@rmnpy=2=;pH*(MVtZe=%67AzGA0M^{q^=$vCm7!kg*5 z#^z3y8wduHC|M?&DJ;5jBXZKEuJsGemKRsL=CU9E_#t&P+N9mr(rZKSoVp1GxYJlX zsNFrjv=@X~HYw|+jDv4duht%KLS{$_zoz_E;eN4y9~t`iN5hb*|Ns1CKM$<~9h=#)TFtw>2 z+>ge3Xt*v4C-(Qd_?n(1Z>#<^V23QW+VneXZezzeK_6A*>9m_$;S0{;pPtD*jK}IS zFK!aHKY)AJg{C#Yv%Hh+Sr=*FrAF_J9xf>S@d~2E0v{H<$)`|K7zq8M4ir{9nvTVF6fjN*`G6a&?!$>wt)#pNx3 zbE_@TdcA~tCx&yD$dwKy96Goo8PbR*{L$0BVDNGBg&#i!GpVA&PafXuM*?k9FuHYm zvzf9rlxua3aabcZ;bQpop4CRXPvSMWqZ&6JcP}`%`r~%_&$7XwzY~woW80$(VhsZV zQ<3&X%~a}l}Qq8HePkU^@@geGtkx3@#5prcQ+qIqHbfWQz27}Z7L zL*eo-e=lURuvwYjSvpb2OIi(IWtW$Y?S<3k;YZ0;;sr5{J_?F|H#h73hL<=aF)@P z5!!#Ak6MfBI_{Eakbp}J$*z;H*{V`5|E!KUv7JZc>g3Q`ve}rzWoyFlHD&QHFD17= z9y4Cpe)ayU$ZC0LxmmTDo3UQo$Pvp=z^4rmC0>kxJ^El&A@^xwj8%+RO$X|4{Z@@z z)_=V|er-WkfG0x_liIF6p4@81Q*a@Y3DIw;)1Eq5&PQO)*y^%xXv+U3=|ZX0cV3@S zt`=0XEU?P{d0%aDmrLgqNkHQoE)bCnIu`V{DP}3C{Q)m46~o7D_+JV`%&)GabGr9i zpRx%9jJ65xc@Tei$dxAMOCaXeD78xd?q(cC$Ua4pwa3=f|8z)V1XJh#W(SU5;pO|4 zze0J41pKunjVan{(QXFB_*f-+c9q>*sngM?wx`4$o6yoXQMQ@rk_PzhIK^%2X36Y) z&e>jtv?Cf&Yo){T?^~qhwxujI6Td065){lLZZ6AacP_SDgy$rM4=`-=@k&ElisXcJ zx`rUC#s*T1$uH?lS&#gRgm=Q})&G)$m67El58?K@F))NbTZ*dqDmm(Kc|9c^68=>C zIRpdJ;a3iLozBng!Si-nDd5w%VZI%as` zCOx*Zqepcz--sgJcA7=><8wJWFg|nq9t$yn8-phHZdb32l{`xO15(#>6 zYhcX!}9mCQ?G$ee%C`zUCnzbSH|AYET^w+ z{GKDlo)S9p3uB@Qq)O7BocXqn*LM!|B4&$3`yg~%n!9oqT)L$U6g*R!Y z{qYHVw3>|=$NxBnbJ`mW`!Y=rsX=KNd*&Dy<)vcXIeRn6n2z%;LiF( z&38cA>eSln2GL8pdL{&|BvKd}T{70y;Yc4uTJz?q(S5pqHo;1Huew7!$I?-thjn{- zWRzlNv)&{|DfdGe(>)A<92qa1Wk?q)oCP_}S+GuXo^H{u(H02=1DG~81%gE#k8t8= zS#icf1A}Iq<0txsE4P^aA)PLr%)#Ph`$NbbmWcmq5KQ>15O$DeO^CSPO&m4|I?VLg z_SglY_fr_-irU9Oqu82q77m+Oo6SsZH??0=cI4gYe=MvBau3sgZ?}riJ&$y~YZEUp zW*c~WxqwPc^GeQ$yvl7-3mTE(zF<+US9ih9j9ONj$a#Vk)nGO}_ zoVK>PX%L2QWlciGo>%vV9_e1l593{Dvo@8;^?cL+8QWTLTtuR~A$iisXUT~4&;aQI*I-PlR(bp36< z&#-#Se$E=^>k;nC`-6+cN~W_Je~WQXc~t5IS0K!PEw<;E7l*d}ly*L9hqHw`1{>|- zkrEm#sw(3G8d%66pfY60f`<$X6(mfCjxOeOK!OL$UF8n(uU%Rm77O_ct)acU4YIw7n5cV5a^|6ui;z&*0-!<>$=LB$z6aWdzD`DpSka8`hI7yAMLv^0z&hp$k?zk>MbfoJ3r#RMXrO_p#vfgvxg5 zDi6)q!;ATzo4BjRaFIV2oi}k&)b4OT5kt<151;cO&qsU>C_|;DTmAuSM-j$cQD?vz785BbSRH$c=Movf-p|H?m*>X*6H#1{g1p~ zL1Aj1{cx=yq{Rt6JuxM?2;SlUavQ00oj)&vu>xo$mq`}z0upAkI6QoF?|(LuEbv|z z0yx&)zZ z$!L@PB_uSjkh7y$P$#DW(h!nXSU>m=iW%Vmq%k0ZbaQia*y}%Ewsq%=%aNsuL7F3e z_7yUq!J>nmk1<|9%nZxe5#l~|DI~Bg+uw8zK_bib)NrIQA`vJoZn%#^S}C*V{p+1x?t*mz~&JZj282(SJ42tF6r!U znGBp|kAD96E$-^k%Pha^U$}bqi{;I_ zy(Y0kp)OGMc8Sk)ZcbI&;VN|H_ZVall}~iqLdYeiK?4p^#a37NSSBaz=f`vTw-o+8 zxn>h&aX00DkCj}XI3co*=M?l6X~V3P=U|(@eM7j0BN~?xJ7UseP+%lLunu zIE9w(sVd0T(J_saXdBG(koCfc>JJUM1yde)YF?fBS4O&hnaft1=U%NF!)1f)s-*yQ z3rV2(0$TLLujWppUR@NXH5}k#>Sn`~HqzsLg$*BY^>LSWlrkrTpbXr;B9P-a#1`{; zZrm+u{WWtK)5EwjSMvQ>40@X{Idi#FFo$JiM_s>(k?_sLoX%uu4ku7`x|uOUh1oxh zG1L6!{??k$;v>9EKh$J9fhnpj8j=zL8dNlYY7Q|9Nvp1Aph^#d_r}Z3v?|?!$>C7f z&T6|8h};qnxcF6sqb}cg%1Y%vMMPP2V?%ScYhf2l~wd zkG6pX5&?yVd3I@d<=(f;X3ndWsa|OSE0uNdX2I+9_IbXWl$_^~C6LjJP0hriO2B=? zHeo&G?!2Q&kn{!1bgSFrp2kbniK?0Xg4%Lpk8Tw1@xH-XZN?vdQgG6I{4XZiO98IR zwY|C;^|*oOi8r<Q0GL5?kUnp~WWiimS`&1Jchi(eP2An;-`XMe-=*8kyjl=`04Y3+ul*Cr;f z2Xpu!>yPEntwP*wX?sT}>-S|-am)*=IW2mSC6pZ0>p~Xlh%^Z8)AX-78!$<o_mSJ#Fi%fI<~4m}Z65S_iqkQ|;5$w1HW)(pBJ8txXvXJLo~1Jc{JZ&0#i z2)`jPe`Rdn7lQrg*I+*ASeDA39>;%omB>X1ZVq83*vYHZ zLvN=;^_A(6Z)`s8Wbl24wM|WK#ZqteC&#F$4$#JRX*AJ5Q2l>~s^+hVwIZ+4_DU|U zZ#J8got8I0_go<$;&vMV6SG3dey((#hU|?&2BlCU^IHk;4a$JeL(%11``0&`OU?e` zSJcMhS8z2UTjMv|g_udIpj@b><)uQ@wyL9h&5L_VnL?6;o52tCUKp7<1*LtxetK=B z$)%lZSeCISYhSm&Ko%fTaN0&pzN-{aE@6GdbM`xWGH?W;IR>I_1#%l2AR+w;;xGhh z^}@Oe+Yc5z6oRV^ztF_=PF1uaSPv{35~g_~9J}zmi0wTyoj5?C2eR}+A@v&AL0SpJ zISb?DseA>c1Q2B5a(eVNKqDg^AeQsROUm-k8)yl>u{k^k*Ol<|=u&PzFSdB*1YG!R z>VSiIcqSQ_!W?Jz&himlEc-ba`FQL%~&7TD~%3~gXm*=T9zv&>HB=j}k&i}j4< z*tWTuRW*CiIkm_HbWiQl)m;5C0%eGG@x20Rb1ZV~Z-~(Z>m1AkK``IaQVxW29g4*R z-Y~CHU^V|F^4xs+jB0Y*Hg-t|B^ikJ3t}etz7H2fhzBDpoQ-(&3F61aV8YLVF1$*l zGhd{1!7VgEq*jdPH0KspfObdiF^ zwvxssH9*1wKsEIBu~9i!OVF>KVE0z!Nq(|#o9_!wjNdNdre>4%f}Y2^8o2I1bD3d+ zzhj0M&!xuUuzC3yu08$j0m;{#mVu)2XDPmq6jl(G9c zrVDiTv&StQkACL|R-jf*~N&#u*9Z#CFKXXFxXelg5_{=Pg7y0eefI>fB2$CTL zcP|uEph2ygqkc>Q0OiTm2f5}wGqqYP`Y_Wuz+BMt{ds@s`OsOqv(oS;L#G*@pHLQD z?=$kBU0ApSB-{3z-Ronr**&I}lVSZZpzNnYM*H;0ZYGbpYV zxC-~|4>poyEtZELFPIIWk9H?e{8Q$?bY-+Yf4*0m6Ng_QESdu^;3PHa$KBy)Z!VXK zbvb=Lr8(D_9(0qAP{{r<@^Fk@?2@em{XVd)iX|3%|Coku^CSULY(yIXbHHm*0qwDIqTTS03b# z+vUu2tu^=+fpxenmzc3#pbC%=G$cAm0OUff24-gG%Y%ePhhq!W4H?DZ=!8N+gT%wf zcRB-HQ_au+SOP0er+sjwx{a2zYPMiSKIGNB(DLT;)pnHC+8;?g2+bI{~Z1m-^*s3sAL+8JHS~hNi$kQz+dHS*SXg< zYMPry#cLNW(&f`lMu>@HMS=n;vj!!XblBH7Mn}J-TAH%2_$l>t~S%s&9HvC%rJMSW_DeyxV+@M);>99(k+=I+^Dh(nu1oWfNdThx}!;Wd%du*8!dLWozOs z*7aQWOl&EYrH=4~2O0`n1wsVGrq)UlTr-IsUq@-L|!ov8V!s9THVqHEQa&YI~T z;FAOnN|SBjZw&Z=9z_k5=w-6@+Bq6z4$O|FkKgeHO;&LAy74JZG;w2+_F}W_kDVA% zd+QkoxLjqJqkX34Wvw%s+a$H;=~^J+FN2D%{}SX=jl%Kvhdus^p$#Zr)0>~8kx65J5$R60vQtZ6Nr!YDij6r>jHhMAy zLvAv^PgovS#IHp1Ss167W$?1w(kJ$>yCHv$?7DXxz9P$nkVqI|4beClL8nBkQrlvu z-++FdhNNenjSlDntcOvviZiuH8Kl-T9pmmDjUf%7X9fYfWDMDg&_(jV)Pzw6>Z5H0 zm5{8hhR;rry~_au`3fK`0Y!vRb5$z_%-P?UQ@I-cXMILuISf~=H<1AxbON3)p6L?z z<*^XoLGX0;{oyr?p(44cs9z3&$uFvz8$f2R*amk!Y$i$?g>xN@((w{>wgr@og4#U$+s0h?w=0TqD=jD7N0I|mOIaipJR|~ zxy_1~Ikf_{7g0Bv{z6(rx)T`Sj{YGuy#%(_z$;R+j=hZk`_oH){9Ad3pV27KpR#U8 z9tX|HLx!;_F3ySMDYglWWfgFT_Y)a(lg!?Zv-6~+!cltb(~i{nm|)wz_|@Xwbp}^i z(R;$eTvK{bX?~A;ySPw+<`5E9{SA^3RK(w+kW2^9VZr~ zuAA0uZ=KH)ocMvej`saGJZQVZ(uadk;NF*~r2eAK2e}uwd->0Xs;A-0;3SH;$!i^x zM|H0}(!(@Tbw0vX-zqitALN6ukoWRm8?z~X$xumY(qxdxDxw}ce{zlY4Jc}HvQ%h> z`?jrtp^jNg*M)MmeUeeaIAc>k1M|)8v+dvUlPk-m7*pC>En7Hv`K*6vTqC=y zr1nHX0s{?8a!1h?o;lm=ulq)FQ-2Z7^YId9GM_>-(r9GUn!PBTC@ciRP`aK--Y*g;TgC!o@yu29IMR3=#qzP3BODBz8?J{kNhO5wm-WWv~N{AN{|!vS;J?tk{LuAt=0rzl;jKW17?4_>;YwL>%8 z*xDm=kRVTmV~NJgv8;g!(r>oZox*lfGJ{!QH@PNgvF6^mVWt3GL;S73ya^Kr^|Fbs z?j5o*mDUsbxEfzzOQAiV9)vf9iN;90JkPdW z!d!~&4$gi1m{i;8-Vy@*hP-=@QhA~R;VW6}baD+MD{17hU69CCcdP4cV}di9(--Hy zr;`tGp-P~U&Jcg7y=n+-i;4Ss40YIqX6U@Nq!@ZO(5?lvvELM0u-7FGMar5)bU4R< z_R>trY~ZIX8afMGx>D!FCjRPD>ii@=t2e!3jVvS5WSl3>;wx%F} zkk8RT&AC^Fj&+-0Oa7+EJvu$`uCgxern%b4Hm6vmZ^hFfI%~NH=N&X1Ae;wvhn95o z2Nm@uOOpY%*Q$%7Bn?Oj{pRuBHvT>2$O>2~hJ2~)rx#jo;c8tR>Y&q0-Y41B?fcYh zX^O6;w4H2SM9_PXF@?Z5n|g98??!z)m>SV-tKt(@Z=7wh{+9njA2x36eX7f1)Bl#+ zLl|IfkYXfd*HPgVMnQLWHl8MWaqKx$_Dl#y$6^K*{yO(Qc?l}M&xp%p0t8PmPlKK_ z)44B%DV@r#I^kTdM^Dd$_SCXbR6=+u@N5{S=0jWoLS{M3+5UUWjrM=P`b*?>`){P+ zdr>+a{UKLVYq4L~1_vcYBYpg+uIbZ(T|n)v9UZN0-4*U-%#7mDz?_}A>v(_SNAXI= z@H|nfj5L_3I75nfRX9i5a4|Xi{_xY0;Yab~h(7$sE$_9(1)*j$Ps?GNgA|$L(dl`^xg2YMdX0vi3nZ4`gtZ}E6;#6s-@E2>>1 z+#Sh~f za-a2E-J0k%qYBu&RM8=aW}577b$Mh-HgkQ>h9(b%K5cZ?ztT>k*7OYyiaIzr0K;G- zPK4a{3=fXdBF%8F$lcei4=9O5Lc2m<-^iiczojrvlM3xt*QkE%K)o3}DXn*7=CrI6 zR3V=PJmq&|;wD7|XaQIrOd=V6ZI@i%i(cFwjfWq(8Xpt6IW4qx49>+PoJ82~yUf#m z=kXca2(v8d4Sr0irXN5HA`OQp#kolJT%SGv1dVxj}`SxXKqM8+&g zY6S}|+Ev!;L~I@W zFXHy%R$p7z&pNz9EC$XN3)vUPZ zp5=Q!&@yJ@3AM|}4fR(M1L{_9E*O!{g&0T_nT+N&$|sTKBS&(f>1$shA#io+%~Ff9 zwT1Yz^7lipwg3QX>hwEBD7LTYm1k*Iq1AJS9%q%ThY}WtEs%aWD^St!; z^@ccPfXEQ~>AUxxo#^t7ibJ7%E-Zy3=g?rwZ6os;KYZNr88 z*}DwXPb%cb_+C1su65J;FQs@kJ&r5qxu78_Vw!g&|M%fL3>w#IGBp3EKSMLkk8g1P z`s4lf>T%c4Iyc6ns!CVqunbAM&lqB)EqsN;U&!9te1Dvt-x2m6)zezwefZiV`5rze zPBOx}OiPeIfp9tbUlVteM^XKC+!k@mlS5`zp>Cohx9s!T#FL)HO_PkST*ZNJyQthq zN6xc;!HcSS=#EyDrg(bCXj@ij3I{0oXJoBL zp*NqmCTzZu6-)$wHJ$r__v^F#IdHB3;VkmO!v!IRG^wiv#A>JJ%V=NUHaF%Eal2J_ zWN^du;q%uP?k-$pJ~}>}7u*gn?vcsvT#=a*y`LUU-EC^Ox~eL5)&JfDHVwMkwdKm< zi!j1XqN7aHw`1-8y^DXCwf!g|;a%`l*}WrMi;=ASJf^IO$mNy!JonZy;z2q_%nDqj zu{Eu={J|;bmWdt8g@5E?!TeSr01Cc|FNk4}r(4 zg^TC8a5)cFmrDtO#B%et0xcnD_0tn(iGMTOEx=T^(apgWQ>qOxEd^jenI0Su(*B5R z2CC@m^`KP)X~ADO28>dp7*Hp4BMVC1i9 zir@CHk5uMx`^_{%Ji1G)-W}~^^w{B{L$v4rB26N068M|f18WV#3Pg>S)?oAaRj&Xj z(kOH>b^E{g{lnP2Tt(R&hd2AH-#|QJj+DTz$J2#Pn}glHcF$2R(gG?Och0GICq28X z6n{q49Of*$l1xiuqd9(}n%`Zl|DKM7{8w-78H4IbAO*3es%FRQ_k^CgzPv_JBm88( z!!DTnB)KFZem85gdBgdpP@2(oBbnd6zK@b>d?H#_s`GUJbF3SE07+bk-*rz6H0v@_ zu3=ZE-xkJl)@I>fN>vE5og-tA!JBSI?srC}=CJK7G(HZuT-p|KrkL;it9sM96aQuu zzKaxfHN?GnQDKwAwFCT3yZ60r7hSGJCi>t{oufSj-zB33`~;mlgwt#zQWY%RjFBh1rjS1wUdYqE{Z63HBC|y+@80J zaGuU0 zC|;a%G>X>h`TrbX1W*=^EI1Nfvxuooe$)Lp6jj$H&~2}_o~{uI)-i->MrYP#3!km* z8Jmf&Oqty|+%3>?71QnPXAT%~7JYx^y;Q8WxF2hK%kt z>rJDK@WjriZ+ul$RN5psxII%1_cx6;FN}yv8Qm)8U+kkcn!YIMzK^a(h;87&ya4S* zW(~tHv)3JRB9}!9IZG(Rz`cVlVu748Yz7}^S|VFcTG11bLq1><>cG$c0xp~5fxaZX zz+Ic1R$~as4HD@oD+5JLvrenmH>R%bA~%uehHu1)~gQ6cs~f3k#X=yCiAtI@_G4 zE~<|G@>93*3<_%=o;K!w<}|xbU^`X4ZE4HzFiibrTe-R*UUGR}*);HZeHnp!K%v8y z-j(}N<rNH3xQh&go@!;>|K(3yb2S|KddYZBm4;FL#w3Ykj(A4L8>jN3hMSafcTvSGUdKak1R{S8chZG=_`H(b&+5 zF6d#p_XrmKz!yxVU_e3--$j_f2xkOGY*CN{u@ z8u2Pog+jm&ASJDMGgX=I``guLP;@ZY37X(fHf?|ez6QNV=re=|NQJ-gqRA-J8BR@$vBCLKv3 zpW$oX^l=iSxj|=!gwl$Iikl9_Ny1S(Dh%hUR@t1OJIkTrCkTVr&fdorFheY^W7Io% zjZhVGYKf@ZiYxfokSC(ps3o@-7qDfxiJqr7Wx5ql?JiX5tWUYu{QXCMesPFQ#9}12 z;0eMs(|5=0zpPhgSew42sPVM@ekkfS`@`XU{jIg+B`HTHT{|dI7udHc*rLm%OwUHp zL-g%$VUL7T_Ledk-vVm@VLB4(nx44y1h$j$j)4dDVA ziqFjyw}v{?U^A8oI$?Koc+2i3HLEuk7Cgw<3sH31#8w#UZ!ffPS7{INX%B2!!T$<= zq<}9}lqTL5(zz|~db9qJL*Y)Y%q265q(1_1@Nf^PaYQ6_az3wntvO4;xXPO6G`7=1 zb-=Wy@JMFp0#at*1sH)ZFvbvJJ;+xY# zg@%o53l!dB28BOsf1gj;**Vx#BG<`fI_}N?RABU<+Zj(zu2d}0GKt65%c_t#XFcZR zy{?hMU_)MPk+!o-oX}p=e&3~wLXHR zrhO0RO2JL-x(lfT%hi9iJ*J}{O<-;XzXfa~s$+yV+I|p^kwTEQcTKHs=&NqXfPEEO z?Kr6=i>sYGOG7J`gl-RmR}X7!>^g1)3q}<1{yGj2SJEIbDZB`hDyk^WVqU6pPFh72 z2TiXDTXeIHcAvUCjB02z2M=&I_`f|DScLDkW;%3x^-;;I*^jg{=YL?t3jKVvf(9{@ zK}=)KV%G&h{(}7!INZM)7Y;Xj4Hswa;n?b3Fk70K&KEX6fSF`!l96mWsmMIGSC zCin~NX#mHZx>NkcDWRX9T7??LT6e;~nltHCDXqof;THK+4~`uw`zgf@JU(>I3BFN_ zf5TV~sADD=aPDqT0VXZVvbB`;uET7W*4UQA{Kw^0UXyF=*$jSdLkGO=)oB@+kuNXo^rpO{|-=d z91my915RsOo}((hZuq3k0X*;fv}tpv2s!hGRSYeR>b$^mcpM{0+I6|!8nbb zNDChQn-CjU$9z1mID^Kl)a-6J7*RAV!S=^kNt0In2gqy5U?2l?R@A=(t6BK_9~`y( zgvEi2#vxd(FB7vHfbH$@47Z5xUss(PS4)--tN);XxtSH9uMJA+&HlKUHreD|d=a_$ z3zzaKE>!zF81W&fhPYHyX}jt!IM73`+{Id1e|z=9rX=sm#fj1(NxXFgv2Oe9k~oOp z^ghG&n!%GLqx>o0Lv?}K!>s38a%Zxe13ro)5?SZHeYfXa7tN@+_(>)^A-te)o$Gk? zNo1z3GNmDf`BTs9SeRvLq2F(M2k_r*C(L2gQODQNE%s2* zvmUpjfFR2-gJ|Ekv?b$8EmB49QPgpqQVhgb96{r^;pg>_`pj*-A`#l>E&RCcP^qCz z;t8RfV~eE70<*>xejU*VUCzDqD6y*Tvs$aP7|0kNXStQkx6GcWOfCGm1aa~$vysAs z-sOJF+;Kqii6Jt2m$y~pVjEMg<?vg&o!@7LA}r{PO$if$auNq`iw*SSA3LcrNW!4Lum|# zkas;HKhR8`EEL`7e@nCMTbk}~vCIJV;0})qduwa$(IyX>n9;~@Lap?5r?$_w$raMu zG8l^JT?I!NnHQD^pXIM*5)8`qHO>*+@Zyvxq-%LcCj>5bY#d7W^*THLo>$z^Vn?5) z`u*rm>ClFZfee}{?qdY}r|vud#K5_c{sC`%g}#bjV}r}5 z5>YITLA9Q?ZhsfQ*=Y79*I~Yy!I`y_jytGiQpdU_tRc#zY4iP1+aNH{uT`IV$JeZ4 z(f_(7p{>GAWbHWB`fad?`1FL_*Z4M_I&$(y*#7oznVxgjOD9}oR>|##qo!>99$*2l z>%C&RO#Aj@s&KD?!Q4V0^smu55&81H;{%g@ljQKVfpEV-IAov(GLdVnyg-7XTL8sxW5dD2E(2S&FQ|m*@%@#8`#CUk6X*(#l5!+iVgjqmKuWp2-~`af(vo?Wh=vynl1MLg}cCf*AUS$2Q5y+4lLx6d2}4L;Jt zXIxwPtDPbmbgKs$6I(XUHX4f-i7?|1K>H2UF*1uI3l(6}y^6wcv1Nhn55%Dw1ab z8iOij)_&xRtTAncg=WB&2EVl@TwWB9LnSeai-afB-r) znY1o+9^%&9>$e5^PVWnKgwp4Qi#PCva^W6&v`L2`Dc?a&jMQx2mcg4?WvjGQk#dQA zHUSaQ85k@C*s3T(g?yL+u|-&JGAkrm3`|f-ga}2m7V1p>BM-zz2D;8BgjNJO4c#E4 z3E6@?u8+XV<$PPsH}#-_seS0Y#eSWiTU^jBeL83klmc>>R98&=eVKZNZT9ii&hI-eD1x-TP?ysNzJ~qC!Y)(zjynZGl zt9tQGpcu?lb+8E7V9JFPtAFyM+=FY~UI8@6A>nkzN0EJ(_ZeEeL4Cs|Eh+ zoXm$k(7|6HTf_YC8VHUd&M(u`_D~Wp)B755io2IwWPjrRVMLOIdVIV7cK`jy_b8$M z)A%WKT#844cqL1JSu_kcZ_WK`U}$@NY~#lXAc_Wn2L zGX8nx-QsYgrX&hN=plY;VQfle!Zu!+@`?5HNtO_9>W&YjPtH%FP3$A>J`Gzps0TCK z2)(np5#{^Sr5`~`4Yq8n=3#7ik3*8m7-pa3%7fBAj}M+V(MpRZl?(nh!%AWU#Z8q? z;fc{&5SsD%7n){P{;I>$x-1t>*-{D{;1^tf5g1D&LcKJ29+?FInq?{_&TYCL9uL)e z9dv?OCw;<p zaF#F>%&Mgh1A0$8Ly0bs{Twx#Aq*cWY^wIlltPsv&jL9`9^xMrr*x8%IPJLC2n{bN z+QpsKWEF>!YfkmkEyC5Wv`85@jIu(p>Zr)fgia6W2p#5nOW-0WGLV$$H`Nw<0603% zF$D&L0V0H&H_z#xNv(fklX~qwXq@qFjvg-0lW%ARqUa~O&Og=RHnY{bO(Yi01Sq87Ht$$3t5_7~@?>*KX!2){h;O(X~iUUcQ} ztO^Wy(AvR_KXnj(3}ki2&)}t3rf1X1FVE-D&RB~2us!ZYT_V&Ro!`1vONzblt1&nl zFc=i&fB9@{`perQ_f)_>4_Y~FoQXmWRgi4^n6zj2jN{9cOw}Qe?nrHwn1$+X@B&aPpNfZ0Pav$D- z`hF{e5SDf_8gg94r<$(&m5Q3~=P?C;=ec4zv|9caw(&+?XK5|!mz~=f_QgrGL;upq zXi3qUJ+&`QobxBCZwLk=7~HlQ^@cdEIz1_E=Dh0VN%erHXSHC_|KnX@!M|M1=7(f_ z9-i)kazQ!#8g7FfmquRk6lf2zQL)$s#)9iKR(`p7$Tcx;hG!0+U*k8(R1FToaF9#ngX~YGyeAtzUC*|1xfP2BP&b9;|LNSm%ZEbHm^*_r800#YpB)fPqn<{ zwk%jAvPGpieGmBKYPI4zi3D7Ysm^L+iVOZJJ*%+bYh4p?VgF&DUbzl4Q;xK@8Kr!n zsE7#50vplqRLXzS0ynAKhcC5^#E&cOYU%8s$m(v^+j?=eYs8A7a~(}>V$AUwQqlD9 z#&3|Nlq5tANaS-o2pt|1ngY@BW4~3x@oHx%Cnv{KU;}usfBq;QZ&wlmx?BKa2%tT? zyXj6e%O&y^HHk(#rmjIi$7JZ6zy;@+9moJs$Y6_Yv#TtL(U%J zV<96J-h~S35w}_jphq_6=H}+-T>$`zD8&`%r{`LF@zXecjc&W^aTIlq=k*vhJ>V6^ zX!X>UOz>d;TLUuif(U>d&;GX%@bK~;^PrM{P6vd&W1g2vkELF+?fK3r-d{7>J}Xu&rk21GJLX zBR>T3n!n-e`6?{acGOktEJNm*rhV7r)u()c zD=RC&3u`6!(bHQGAu7?bv0u!9@MXE~tIQ^5A0ax>oFw2LadBrdD@L}CO``V_gSyP+|e1(I87j zf{dnv&@A|g?LfTJc$?1@3l(=5te=vCGZgh4Vg(!zTc!E_cQ&z@&With{CKtNE5GgI z3Dj`_Y8b$vLL=rIlHXL6FW7)?G;bgW-Uv5J7hwi$_m6C+Q(c& zAV&8N=*cIj*i+nhn3ISnx<6p{B)7mN`hS?=W1a(H-wJ5ZH!515uQ*jSei`8*#Xmnj zdgd#F&;e|#!^RoaQsUU}&w}2ScnKm%Q)>4nUjq|VoVWI}1wbJLI1PyML9FVIh$aXB zT3NyGqsjHkS~lI40v3m`lR+;zbz(MJIMx?S_b~tzV^32z4(jOA74!>cd3}!gS&YIP zriRMWMyu-G(sOIt3ETbbAM0xKOzziH!-7EIc@BzEC{A{G)%lQ5K-Ah|{yEHrya?xv(fCaNOEK_dHoMit*_ka{9_sSR7dSN9{|4q>G%lVqHEto{BPXb<*lNQH zZaTih=w%5R+|T)Zf^k}wCQcx0dq5X~hPStSd-27=9)$9Ut6-5zSnGTliosp)d|82( zIvoWdy8vKYM|Y6=y1LSmgW!iaKR^HGvd#71q9^mGZAVWh^d5kjC|<%aV7wGjIh(|p z=~fSu!OWXfpjaF}wszaLDl9t-y+9ATlsHT@(yk)VJi<@i z=+cgaadiMDyJ3O&vvA`NGHFN@{Rfa*q)kI>2tlPyPZ;tgL*&2wr~j!+Re;d z6ANHpLBTHI_$iHM>L*z;Xa5`g-oY|*3*hDLowJ#HJHeOS1aTFJLBd-A;uYx*JQ7D- zaT{44Y?T3AB5-y?`jhWx0XJMvO=yjE;bT9y?Ybn?W!ytO~moBl#eg-lHI@NwCWNG3@jZ z5iJ4QTalZnfH|O=YDp>A?m;P!$=W73SfJPMtJ?68$U}$pc0qgM$**)+~mJS zGJu5k_~fMgR+GdAP>lo4(oAj#e~X$iofdmW)k&zdDZbsgd&%)}>|?Y|nuq_R=_U!|`ZbD+V{7 zd?=l?oHA7U0l_iDY)2;W9q3CBq1P0Z4Q zXG?>sMO6YnPia`{!9BduJAYMaCB2}17tMc<>nWV$7O|?Ur-wtoC>8gPZVUMl0_oKN zGMp)M>Ezu(!NK+^>Aj1szOu5s#Wv*`BrL{RugrYdF>GOs@qk`BTtvg=B0l1 z2{g!v{+<7<@3Xs5064s+rpIQddvs~W7q|V?r`I>&_5;Ki=Ch4QG~rQJ`Knsy78gkX zcKG7r{hPzteA=`1j^L0@3HX9A#GfyzvCl=W zVr>NzQ#0ovMn=-V9hu`eM)VfGObbk9wj$ls@~A$sfhYrMgV6wwKCA2Vo!5`?+mVp$ z3!;O6HFE`k2w7!msYfOb$aO!pRjo8}g`Pf5q18ztVVE+fv90E^J8P#*NnSp}W(BAe z`MvHc7)MtcZ2+rXSQaNp>kC0)VeZ>38yQEt?kD-jvN|QtpVX00nxIe9JMAf@1}R2L zz}WJpf*F(R4(TTeE>R)oV$IF*ZPk-PgjcowZ?)Y<#mj1lgiTbt$DD+hwRw>lds_dn z%b)|Km<)9S3^Jj8kc;r(&1KI=h?CZ9va4kjAp=dFMkoUTeO9uB2td=Q|eBDz@TR7#DvmHqnD>A5MBXs}0q^j*-JavgI<4PrOzp*3Z zK4t3(Fp2g(*`spY8 zRPAWW_uGep@@KMMTt)rUj+<@2aO?HYT}^F=n|1kDv{2i-Er%J^-i5cNIamD&<*Z{N zJ4j(GF(I{d<>z0{3e|s#r}^fNHWg@UJ~%4f*O8eQF@GI&{`QSLVfcctXw_@;<5(I1 z@QUf*+6R+QO?4DN;y-Oe;q*Tng@1k2;t*+93Fj$Uxqpyos3ooP%^gnF8S?-X-O_{K z&i(i}+3{bcVRaE*Tmt~!R+4zh%j<2qT(Cz@z@M%AfQu6i)0X0sX`vlw(*c)#s$ zukc)#-9LY~u(ATTxqmRRO`XJinLQ-MShctJcZ6Z@%-_y665u0RfFyRIMq3*gTj z{8l3u^Ia35Ue6M6o3NqiqtVsOtFucn@G4)e?b~P{Eq`1%`zGW>XeU^+`$u`vnegP5 zrRz9qp}|#TnXh0XO~DsM24{QDZ8pXU2)*JLWTl?b8su?82Iu|i_f zzp4U2La}9~x)alCMKcxu@OjO-)%&skjikNAJ;;pCAUor-KfZSH9Qy2Y zDXZ7DlgHY=P&_MZ>oLBfu=c z@VJWjy|w>W^?t2xnxW8Ti&zAC6SQlT;nMM4)aj$ z>e?F9sAC~a132U8(dp^w@v(sC4Xqu8dV_6rI#5cl6mjK{eG2{MNjUne5lVEXy>ofM zk-G3HFr4MD`vo2-x^y(1C-ys<trXkx#tKeEI@h6X3k*-8cFm!ZBd-_dmJ6RPJ-Y8e=uOCJID*F^rG z{RI#1@cmapRCm3#Qpy6g?5`P&ll88j-0c4)0NTxNSV-aN^q6&x=3D|Iofu@X8ZpL` zFlTd(P-2)^il|h6?P7_VZZz^Nd__I9I@+dUX5r&NKmbP76FMP#rZu9Eok)lSp27?t7tfx#3`zfUbF$gUDzD+cx;9#4xV_Jc)`MCcR0hM0D||M#dh8umQQ{>YBs!?>g4%Mot4 z1T~Ba$=ArB9BNeXoKK)!dP(%HSx7}J*T%BTP}tl`Ra-mHW?$hn1+zSBpG(5oAQ+U^ zVc=d))D!whs$8h?qgp-Onp&Qp6gBRF&)wa?&Sg~<^BbSmZljGFinHa0uzoYOX_FA1 z?x;G3D*M$TgTebGD6HQ3>~*dSZlNjJjK-${>C93tTgFCx5vI!bxO(iHaLsk7CjF0$ zmE%Sd+tasHo@CamH1}s=)mv26M2#5I@XmB-E>y7G2l45JtlB*rp*Obj#2g?@mE?`n zn&7#F{&pQcSDVNtW{*CZ^4)_tHkRX4G#*Sg~m7Tt#{N(UMD!_oxx z!E%>Lv5Xd7l`NnH5d?W{BY6Jj=)B$ffpig#VwftA+gLu~4s%R@2WLo0FS>tEjoN=E zGi&j%n<)sj-J|2g*9aB1J$c#CvRny2Cq`p+u@>{5{DNh?lj2$By~CpXa_1LEY>`$R zB1OkAzLfGcyDnnl{O#MzkkTZ6=8aJrb^&HfK1Z6Xn#J>TN1=BZP(nb)g`$&@qe=a+ z#FD}yzYRaaTEo6gBEI$E#g>oBu$2?$u`yGlZon{gy$5hp3m znbbV}a(lc8XpAMbQ^d)9_z%~>hyPRqiXxt#o`C)oz)$oc76=qKKdiaE0DgI(D#+$_ z*zOL10FtQtTxgn#_j`u49=K6VSv@V%^^!`(lTI_~iTBOrruU9Q2U(PU@jdw7n_~afNVSK z`?R##W21=)t2D8^UwuSD_xzMQ&0`&2Mk+)3rP%!p@;G0T^IckrBjq~!tNl&B`h>tz zqNyGyhtYueH{;6oLRI0`(Vh7pHW>@|)k00a|J|%j$BWefn$uq6xp zHa9Vl=B~E7JznhsJ|apw1za;TGirxh?I{sBEZKq{wJj}=hs8P3{og*!=0J{LaX%BM zE9ZS8EifNGUm@Nmn+ayYbYEa)uJYSN4Z!V5-?WsxcQf6PZQC=lvB-3Qp$DHAk(N>X9=ZMZ;{ZOr~)=5?6=)d+DNNcZb!fKMhknI z;NxXph#j|c&v8VsXXfb39JaXyKb}__5XAfmJTIU?1GF~)o0mh`Uk8YKl(Pj(%Z>oj z9$*QGL5R@SRAFM-?=DH`ITT=G(XAZ_CbTT7SHM+zGPWQqg(hi zVrN`#`It0{#c-#DBAc3=cbS77Wf;LSQk#F^qLTgN#0MPq#?k=l2p0ega&yztGP4sNvAMD9ey5jkM{FwV= z$4h9E=+dTa|N3)_rUsVNH{NJHw6pv&V4OUevb3#D0JkFi_KWq(+39JA!_EMp8{x!9LNT+0RJR3`T5J&7a;E{(}YaMf@!tvX@>zwM+0LXs)RC zW8S?yzc1Uap4l8+c!FaQo4B4VB-y?E#I9O;GJa3kM&fPUt+w)9bV;QxjAnu*hXune z+ay;~j3{#dnTEDg$Wh1uv6u6v*NKkN6#kJm5{v-P&p65tWcZAufHM;-@1{5(o}T&u z&@%vm_y8!ZT+B~B3gMWk8(mVs?KSVKlJ@?PeC>5P<;5j?N|3xaN*pYIVP6fq3Vwr4i?jwGev6N`+>hOAJuLFm^aUB)l(UM6-1I9gVcC z2yHks&Kj&7L@c6YJ^@JW2;x_g1CPVa$@htq@uuL(w}KNSYtJi+FrrV8rQc?uLjgz; zJ#=`^Y_Tf&?V!ul_jNW-4k>u$;=e-(XB@R%e+8}#pfpWp;6t*twPntkY-(&I=64R| z@$*K6gA~hw&821p|Jx{Ah#1K>U~fEh(oqI6^e@v%YlOo|$#xlhPrc;&9Tha?9mqop zwH;5p5ycL{rt=k(AHbAoqSU;^0a>WrtEwjZHi*x zl`q*y45thIT3q)NMP%#ryDEbKv2DRN036tG636Th#Zg4>5DL2gu2mKAx99Z+WCDhV zW!GQgoUAM)*-4VmSM$$SYbl!#3AkMnkRx?K((0~xV^t{lAnS}JQ*+zyqKNG?w&OEQ zrj>xxRlm+;`UKOh2G3%G0!nmMN)WykC8z<74L=^_+&JW0J*7>-H8%ogr@22(qC)+N zO6vP^XRCalFt24=w5dhU-`ez)xJ84zc}~G=J%d#5XN7l^uaQmXHi8cUJns{TT#XHW zn+c`I)fnWIu0m)fR-a$URI8F}uZm7P!``k$vYCLZR*&i<6Go!NMRav@d-gtmTe9Y# zvH=b0feh6XPuoOXXyq0h4S3k;hC51o!OX7{__%I$VmAl1n!U2^=smIaU}nT zicN!{qUy9sOm(7cKuv#*7as?a#i0fS+R_e=DHaG8jdF=w4%Dltrxz{gcB<#M8@0fF zA`A4u3%QqQDMktNDP^P{E(N4TlsL9sk+`q2I>Ix6A$ zQ5u(LLGswt;rGI4dsFdK?R>Ct-3%0mF#dZWO0e+I0gyO7h|*i;v%GDLUU8r>+W`iT zw@e2&zU6LBy)mhv{OSMC0$^G|35YODLz2aQZ}B-IC|r^?Pz*9odkhnsCn5il$T4fE zFj+X7W+6=n68k*%jo5!1;p}m)i%ua5G5hWAq6L7omK!UCJJoIiAxMd<24sg<2R`bx z6??|;JjSPedoSc5om9+ODom!xJtN*!MsR;dQ4FwdmVnqcIwvhj>DM-IcB&RieenI$?hU4naUK+$Yhh2*KAYxOY zGFQol*UMe0UH04cBoDDWwSZ?Gt5EAsK^Ly=vL^tIFl@Z^j*ZLjwphp!iHB|@9W7Z% zThMXbE=0W3&HYWz!M%~Rgeuj|9KZo-QDJlIn;hK)Ik@GTuYEcg7;wDy8AK+ zk1wk2Hgm;K@a4S5U|fXTz<~GQ>$Di~WRK)W+ayJVFDm~ydX2Zkb8fE|w9nhr8ea6R z&YS7m;{GpDXjN-uQy{BZM*d0P%g{qZMq4lt^xegcBNvf_{|cLWlvbOS z7B@)Np#m&R^<@=#?lCtMRzp4mHhRU-IwY&*%i9wQ!fRhqvGf@)`pwVB-TO}_c$_@O ziZ>~<5>E?eyEwk=^~G8D9lM{=06^bXh?Q_Py|0_Fs_=6D74QwG|7u249=Hfitjf`FAV)33YDLVaJ$zww=7i0DGKjP2Po)Sk#V(+MgyA?jU*bIb} zq{2^w>>S-zu)mm61W*W21nQ;-$bt0nz9;22E-T{mM63@lkr&;u2AU7rtHG>|0= z)6KXRe*Lt3_%rgHiwxwFJFkT;iKduY(ZIgZT0lXYAeo;g4v_-^#7EmgHwx!sUfBB? z+iYa$=pr<(9`NeY>B?!26x z&zK+I`h>~&^6KJ!$qrq|N;u~=jVCP=EV|y(J{>HDXC0iOgNtm7lPmWy%ybaB<+rYN z80WA$;QW^UmeZAtms5iWA&G9Kq38M}2&NhfkjD^rbtkg<_tccy)V@@330Ownr--3l zA!KFD37sA(6JFXx-a5Cq{P<{laajikhLJ>X#!T*b;@A2s`ksUfe`mlI-%K+4>n6bM zNeK(t@1_HhgbJDX7}RD55sb9s!}#zCB=w_j59XrfHI;r-&nL#W8;Xj+u8>VLSn9I; z`I5m4O~ZpkHd+r!empsn@Cdk;xMMvV%yD=uv;Dpr+1j2G;JR%m9ooeO+H*hkj2K?o~ z3z0E%36*{pw=KWb?s*FkDx9w^3nC0lCy+iqfp-N?iiG9DkAgwb_Pg0_hXlpEVS>X8 zw_`1u+dH6xeBU9O`GdMz9u8o>n0@}_hl~di{$uiVAjYn@5f^2H&$b^cLTYUR2>U*L zd)=vNasrR&MCtWF8hRPJ9{Ud=V%?v%H1G&bsK@1< zn~5k;VMM}SORTN6VQgB{Ak z6b7RNLv9;{AQ4lLQ0UXZ+o5{#!@0N>e%Uh;+_=L{LUC9vV?#6s#y1=t9lw3c*JkwH z$~>_7tY1ij-s@jhi?oDV%#PUTf5%G%3PCS;*mLFQqm7 zNbI!H--j*KaB9#HIr4(BITJ1^Y9^kT6=ZR+3hSi?g5~RjD@p574OMvlPrv5i*l>&t zw&H>TgzCuh*=toVEeO{+@q}sYe)Ic0bJ&bt8Aw+3-WJtg;pfM@W!I!tWV(Om5#J^` z9u}Bh+6w-D!8)dPTz&es(nwI+M&?DG0JeGkh#vOm=EfOln)&}WfPDs-rkE_3a-;iv z-ze&>r{rIy>1|LHms6fbXC)+KVL@V)@d}V}kooaPSeiK?QjLO8_EL@VhnI?eTI+-& z8ij%b&DI*iXoyMq9Mb!C z;dnsEvNQ^t*o+CF1$MyIOOwJ~FyKyri^{|5{0ltlttfC`hy4~30eVE3h3R>P8~OX!xzGJL~ddwE8J@HbRQ#za?Q)cMM!+w~9Jn9?Dqf05R7X)eB0pi$O|c=B6Hgr9)QUj8g+kSI2r?@(E$zP^!$Nf5^1X!2K6DiS z?us5fBixrOo<&Hz1&XCX2M}e#@aywE4SJXfJ6_D7)=qnTs2f6b@l2ydO&p!qWmZ9H zTgDDYvQyW>=X}v4t7J)*@W|z%7on&Ibg~OeamM;H^Kr*jf&YNQ%<+p6*0%#ec zsRO;VK4#mKP^qSU=SY+3c~Azq<{uf?VPtvFJ`7rNOf(}T$XKYGVuuPiMX}XXFjLwU zSc?lfLqy~tqXLs2dqe)~Pj%Q(yRA@SAW%ea{=~ZpR&(FaQs;WmO5V+KF?=yK}T zDwc_g{c8_Uo=Qn+>2TB>Fo&0a@y!;<$R5BI2%Gla?n$<+7HdSJAHo~iN&RWN^V}qy znxF?1L*C_Zj$R)6W{2?HNXSu9S5Gg+S3^)?AuEkm75ae22W*R8>RIvv>(~Yby5Y1k z7Fy&u&KN3q!0MV}k|A#{!`$p^b}+oV6Ew+cAd7I5Zt-UGhy$UyxA$t)958Y>b6CI9 z;XtOQOo{&Wd_@1x4sX@dMWn!BWu=H609eH*s7Um@GCL>2+V4<9kZc+WCIIx|I9! zN9$n#5d~;S154%@7#P4vD~MB3o)R4pR<#`mxOXdVaQUM3C_WNuuHsM`cVfe?q*=TW z#_gyuE+Gpk&S!@3M5w!U7))b#NyX<3JMckJ8x3uywqc zqM)JAG0SfP*5)n+rlpVAr=6)Yx$6k*E*Pq-&x)JrYcAf26An5YqkedTjnGOU36k-I z==X6w#t_bzZQr>kQUp|3XBgz4husV;r7atp5k7D)r+TAabAqt4qM~AzDES}_a(k94 z-*fzEFV;pIz;4ai@tVAh$>aWZcr_7JU!O%04hms@Ai>K|HP|o11gUH)=Ru4Whoz&~ zUx|XX2J)cio-R&>Q<3q5cvnHFu>w9sreJ}rUHN5<-T5ff9$Dm zG)$=?V}nVM!Mo$62`#&?v+QZrq+Y(m+HPmELuz_gK(q>VaUVt4^%Y$(@Xmx5p(+q; zw1fo)yx#sLh9Scp-%48fO~5U?~-XAO@2>peN*BP#5hR0Vmpa71X(O3YT)(GLm1OFn2!^zolP*lCCx5Nd)kz3LjR2>B;U z8C5>~cySxu41y)QTkA@#W34Am9kBo6&wktm2hqXgW*Y=4qz#yimEOsOJ&$7(;a^Ns zgh(S!n4G{`p_~|VkZCh#nAPmi!3CX))PrfH2>^M~cT*S(#=LR*8j*}}eTJbjrM6)fpd*xAJyXfvt(>k@(} zwh0Ir);D@n9_}y)1B?6d{G%dKHDt{uyc@SJt-~Z?8R2;>(HwDbD2)%)G}>fiIk{(M zDs~4aj7CoOhvq3>&N0W&KpWBS+ID4YrDmpjf#L%^*6b}peQS~+?QXK|$^Uy|Fxz+r z!tSI?#pM1;JsxsM4rc5IZ-Gk)JsZ#$%cHUr)Muy)$wf>40#6uxDcI?Xb*d^j9l5_e z#Sa~^Tr#!mr2SCi9|qgiz{l=Gtpz=G?`TcU36e<$Os_3=1ZMIIq`zvGn&-(0SX;nu& z)C;a@k*=v7fsBt@|)Ypnc1o$0rpSE zKu|brpV)NZ3QRm0a#oiOA1HR7Exr#!@jD#Z;ox^-IFZ&Pve?HX`~X7(^h&gs*Q8G; zknbvH&h1ITN|!9II|gTBC${1pb#+d_GEs|E?UFTfihQ9O1O!AxObuhG0qn7db|aya zAr4qKU5}!bD#FCf&kjO}Iro%77V^iMi${7(?Mz(^PFVI|-T9uCT;FsSw&98p)(8@Y z{{b|etL|BDcK?W-s5xdo^Pm5##;%S|FJKw(OswGmM-z+>L7l<S84PzNJ9$RI0!k*WeW9V`7s}(6;7QgAhdi+o9eEo>;fj&q+k@)w>-K1jAL5GVJ#$gNq%g#U&)pBi&mwVbl?e&l~UQAFII zBL0&-|Gv!(9}62P;7}$b3N~=&Ypx=dc}6r8&_N;*_n#_|j|9w;LlbGiyr zAt)#0pBY2<<1pI;jD$qH4!rzhoS?+wZfjWo3_Pu~L|vxUI#KX5y%QU-8zCN|ZeX5? zxI~p!H58w;JHh{72zp>OR2~tCGz4`W>M<`OORaQHy#378F45E@&rk>$Q~^T!zTC>; zY|AWF@r~u#{OHe7>>B*nsPJEuKC+5);+8TAoNdD5YkqWJuN=a%?1FK3K z6D62J#KLcYr{*??TXB8#*30?|F@5j3GKpYJ0T-roKyP+9HuOz}i{w1Q(r0p1&#q^Ho((IbM z5V3)u)*YYiZQ}RC5GRorr6&QN5gu!^(RjkoeW%lR_{vc-l2ZTre}HmVJcpSN8{Zbj z^!i%1VlgdM^@OpX|6X72YaRZ#ZB%wSfcdtfd84%Hi7yPd(id6+t2vudK%Y;A*cBKU zma`0rg&`0ilVo@}xB`lY&db}Ml@Z-O^3C{`rh&HAZ(L1|FK%qx{ zH6{6nlhYloJbJZKc>rd`p#-cIN$1b-%ENl4rijIQuQnQnsR<&X%%;IvPmSlC#u{Od zV@rF5?fUpEAbJ1O2bL^?!kwqcjmOkOs+d~9^k9}YhRhFPhsEe0fj<;@CpjCbMW84HMKON#663fwc`UwRFk9t|26_ z31+KD}+{OhB$`rxW9~$+k1=`kz1EKSX#?52=|NCYUEvTw=6|PO|lRob{6L^3LzC zA@}Xd$G5~GH1bwDwH@(HR#YBXv?Gv|X5ny%q+;ZQJ^%jB@~vs#zBLE+fGDB-QxCJj zj-1@>TkYx<1kyJk*_+U$$DP z{bp;YYO`fxnCC5?5u}$c*0f(PCcj;iY&%KhC*WgxbaOt0-n+t+|nd}=G)>OAW{)85a~rnlH?g!4FIE8Ne=WOVmDKSO0eH$qD(d`UG7jid++ zZdH*iF?y!Qe+p>ADf*)`_?Ll&m-_~v1Q?o#zW%>g+TUFASv7|4Oz})>)`36B=ZJOR z0(Qqt`&dvg;_7XzFpl0FbZQtT5k(Tp_uhW*pq$5S`0b($nFCcdoiOlFdazl*NF=*!S<@v~=YsE0&(6iR zm&?pmG&MEn5j-r zl9JRVP$9|>KCggnN-)^dhs^S2P8gj7(Dm0$e`az@i3HR{GBioeA#m_3a!XnZ^}m=p z7|asG*^iTXCH&e%gP#_1c>?d7C}<0gYgZf%`eDfcc}RfV++D&2($1T>Pvi&aA>gy& zma>%qb18nHazXsVM6o4N3M;fuYa~XC55=;)ofL7amz>ri)#~d=Y+VB2%hmeKI?NnQ)y1?s zfOQp0Q)(0S9pQprLckGWXzC7Fwhi(7qzF^N$zWw-ArHtQ1AhnRB7$0fl&HmI>40ft z21kTPWkRLoed{x_rwiw%4Pwlv2-Rzy!tOr8T@KX7lG?;C?d|-ggtxR`11^9!-fAk^=Ay67FCaza^8_3%m)@;5h#F@eAObe`6FvqdPh|d_q8mQw5HW(WM5ETDA#QhJ3k^ip>tb%V&aUg9UG8K~ z^bmmuwIwB?TUEc&Rj5&vlt^;EUgvRjHc#fr%HHF_h_?e=@$O%0hwhK|}$Hc}@=GipAfsA)NHKa<>3SXvg1G7hqBo-F3+FoBn z*M8@rBJnj!NXCu7Ql~Nv9cCiB;u%nWNeKnV*f53n>v{D5Oo|fuiZS3De(wWEL}EK8 z!&{Y?d^lQb+qgFe?wCskVVJlJbM=;J07sk82%m45Ji)ZkB$sT}<~pA2AOST1e-V0s{}AWd#LO2|j&!`QFu4zSQjXsftN6MbX2@9|aZ+f`a$5 z3AR$)U0*0WWd}RqwC7Z0?De-HHa^yBRQu&fih(M)91yETVp)`vj5}(k7o}%E%?|oH zGx~7aXr1hhk1x$G?T83x3nXL+a<;q`9D@N<5s=%s$RO~1Db7V_qFLY{tTb{n8RqW|S zI7ZXUtaEjiS&YxGF<0P6E;vXGYR$+Q5^b6kwPIgykR@`4j_^SpGx{5s%ElyVO1u`z zPuq?3a|;gLgk+pmlpN&t3$wotMgoEIvR1u=KJFNh2)eUhY;>*fHve&z^%{A2=unq54D1F8-df%qi`cg8w!WxWOHqgw z)7f_DvAqK9TBqFy47fg+0mNTf`}D2OBG&Fr-iCRoH>RkBint8h5UENkmK!WL9|IC% zvNga*iVT)9Ps6}zqp@SW&qL8Q8hu@@nuXf;B&;0G9nG_aXT992-C%T58bYP@;X#m{ z&C0P*M=Iw*OVH)V$X}ShGNi8hh(y(|LhTw~LUsuwsgq#%; zy3dqi{`YIYHPA%djql!{{tjvRO+5|NZ2CQadCyaS1MG4~Xz-H?dV~ZaM69V-n47! zD&xKIy^AoF-`?qYyq2}vi_ZXD72E6V=&+^Sd~cN{?Xm9uY(2yGyl9DHI{RRvYh}3G ztf>x`6UO!}$jL`P!79P+?J=vaDR@~tU{BQAqtEqhg{S7+@X1gG@l9^FdTbQpD%*%~ zup^=*e4)GL-QCizc^l5;>!)8}=c|1f_+)=?->fOWm$PS$&_BliqE%2oAX;%`;I{-@ zYXCGXG5s0YG);#~n8GWX)-H~1*)47K_23^eIVg1JQ5SDN2l+Np8HIr-Q0=w;afS64 zXxt0Oy5xEL*1zbt$}YSX+CKumxzN2T-^?(mZ{rH-_F{Prh`Scr5x?y*>{O@P>RZmQ zN4ML=jX`~aT{psLZE2cpX?Qn(?O8C)ZCSq+Nw!kdEG9noJCS*kXj+lDb}-Hw!fbWB-;Rr`mC`UT?6C36!0nz0$@liTaw(rOqMpiV z82$RVijw^ZUEjq#uuXvu!dS(G9yV4|6167;Ab!5eJCta&atmow?@XlU z{$72?V5V77N};|YTz6W_ZPX!NWTmuN1cMOt+V2}>L89dQ;8dA&4R_thnG6GL2JMXl z3nn=pdueB9w#2JAKNbQ-QRr`x&!Xk2Ipo;4WzZo|k@(Acuc&0>(v%B8kZ~U6@*Q7K zY9+DK_?f{%kI}(lAyIM33=vCHUk7SL850HV>0{}JE@L@3^L&5<(EFUkQ$b6@iv|nz zMfMkn`3qCW6e1}Kr%eE1#W{x4DtRs4@5B3Lzw`O+a^>9|&(0ffz1&KMIjqHPGA@nx zp6^EEfMkQ7hBnnG&NY{vMfRdt2g6FkAj1wsf57zB_wlOA`|1t66%VbODi4KIAdV68 z%c^lw9O+*tvJ!01BE}u>5zXb{?P#D{Jn znKOjC-em6Uyrz)jfZu&|1?_L2PeGazUslvxe0@|~Gov!AFrgg%?I1k;kgir5+qRpn zhVeJjHJ{4#$eY?fd!Gs%o}VzC&r=Eg`oT@f!}*wg#21f5vO!vUE>wEt@cQa^^TrVN zmO`sOnmLkFwmcs;A~|1rXW4*En!v+{s z4*BiI*)~#x%tb=Oil>l&9o^SAN5vwa`r3k=9f<4L9JWxR4M+=7vw|;_T&}vs`}NT@@yVZX*@9_D`^93*;{LuHZpIh z0C@k~>wMOp{$A^xOPYXY8oU0r_L=s4)xwFcDB?k&uhqYW7#flFqDH10Rv;newaqqV zPXovsSqEItR?}oIvd<89#(3-xx_XJk!C^sBs~GkcwE^t05aFVRRGxlBR=!=+#@o$O z#b20}6%`egl-BM0kU-I&W02D%ly|e`^bXOPc2B-cGr5MenyM-t4VPfgQ|XfiG9Q)I zYoydqIHm!K&=PaoSmpA3pw19(T4vm6#$ySljn=ZJ*y&8`S=4$P-|rS+j=d*qr}^=I zfWS`hc1~Tu^`!ZBL5~19CCmoaJN3xZo{JbVB{Ik#peU9vt&rR*kno~-sQEH$;aE9R zqcHeFjL~|GfC}Y59iRcd>&S;6<@+?7lf3Kne>7cXSR75WU7VncYjAf75Zv9}Ap{Ff zaCZ&v?(XjH!Gi_2;2whe9p3M`{N355r@Okky6V(9lk1_A+tOAJgM^p)ozjzmNr68~ zgBEHTehPEr&X5^Vo(|pl5yI0&cu%&-uBWR)DSf9CZ#ZOY`GSo!lFC`kxLB^UK-E;H zZef$0p(nMa2ROnH&y!YRj&2fj%*E^`Gsew+sA>IiF68eZ|BP1W3l5SY! zSbtFL?&V9CQZBrjAHEVy>W^YTXjOX9wRdsqWTnk2ldCFQp`@$RHk}H<>}SdprB5Ni zZjySXtUC-(Elm)yh5l1`)w(q%ckV;n6t$ ze6$-J7YD??OSzkz7;RKDSd%&Gldare2rCqlSc^sEY0I#SOsnk9=)BdX5X6hVX(5H~ z)&6Srj{VOlgb4+GyZ{DjtHtWBi|(g)Fgir=@my8sN^l?;=hA`R-YqsRQfi%r-v(8#x?eJwj_I$l z*y2pdtOAM=B8vWnzPo?yG2;oSnpGNe2OZlX1h$=*!;W{j_nei4AwD2>Urr2L7-Sc3-1q?00!Dby9rc_3 zUNsdUnMSXE_sW2Y08&%W%2Ktnw3MMri2Ar2e*7U2KX8BR6fHswoXIhCbdvtS8=^zXG+Q7lrK`F4#?6t3&^pY21KHY`gLd(T@TFaMR!Dx!RUS``3Z zY+OoF#AlKd^)$-du6&;O6!|IgL*iqsAgCqeG^3W91PYqO4=KzK3Eq$EhyemUm$Ov8 z6LHBeWv0SBCe=K!!<%#PWIfhNjFYq-CQm)~8NSLtSEyrtlWTa%+Uu_S;mtHeXwWYHk@bS$5U9?_Ic1Hp$AobxkR{|`fr8%+^a|dvA71ugDHuaqQ3p# zWhHYKc6m$I(3$eb5p~b=Ww~yINu;Sqj&N4SEL7%9t1yWQhR@#v#z{k`dC_&Clmk=d zU$Q{p_4;oF6$BxyPlDe)Ja`gD)hg6$I7Y0wqs&=f6?c|=P zX5G&I+XNnNr*$JJA9)&q5m;4mnAB-y@|FmA^6-M;Cx)+qx&rlRa;Z!a8^ND0#AH(l zu=w}p%whVf55dP>17s~u?gXTh$$f6Cq`@M2Z5%AmT*oVefxIK%Z&>*FIss}dKnn_R z-0j#t^I1l?4S4Gjrv~u}rrc?A#VTdXoz)gP1#sh&4Ju`yxCRv!6?vnfgp?Bz_jlZ{ z+-#X-j&>h9DVZ+ayljyt7GCy8^%02HxT7l)Dw;Sbj3*+F8aP-s+N?nh7{?pIKv!8E z+)g!Jo8Ht3FSqB|(9^^M@TLcD8+@-TCh7ZY_^D1F#qehVXR&VN%v6MI7brTDO`9`AFxmRSwFSdjShYQAAWNZtr(by%)DCQh+Suan-h?YR0&YZ^Nv}aWTomCjLMn%Oi=U z^8w$LwiAP6;vjIZv$ed1|xUZzYf8wstd#%AL6$|?=y%E#1O3SIR{Gu1!%=xHn|a5@^II*&w~}s3P6D zya&X*PS(~Z>MPq=y#YI_;JRtIo&IC9*g9lwd*xQsIDB%&C_TG2br~-9wOhxV-4Bq- z8rJIGMN#++wR3AFX&EvUoymG|?#8P+ENaI2Gm4WQ)aX|VBgSkZnLg#I2sTBJG~Cs# z)BbKndAGJeSB06mT+u8{?_QGWXq^Db&igQBl94w4O$)w)9>i2qi7&Hku zc$|rs4m$#{hRz>U>gor-dx0$XxTjKdhY8>v*B1O(%~tI7G}u#j>eHne30{l=*apy= zavip(l33wnG6qW`Gx(H?RhSmTpxpkqK{k>3)?#>z=b+0|&uzgh(!U+4x132`RmwF2 zDVLG*ks~jj+iR;=w`Hx<=EOMz;*f4;J~%xwJ?itu?&GOhQJt2xt=2)rKr3ar7J~r` zvEVA7kL|(zxDAmZJ8hBFf&PdQx$4w5`+gjIv4ydHKRP9uj2J*wEJos?H17rJ_eJCb zB?YM5Pz_(XwI6p(d$nA-Km;NY2#Jl70%Y~gG7^WDmnIgTUKX8S0v_&LxMIwa(gG6bXV?pFe+AhrpEeap zv`NUqVo{>Y&;-EqQ&_f_J`M@VkwNE+sl9!Db2Y(h%miXl8q>W@Roc%IqeV>Ybk*8L zjNi)|#4UeF^H+_PGl{E9IqJ zg+?p5>9xZp>z9$nI@WX-_W}8Z@ULMMw1cu63lxzRnN>H^k3mNX%bJWY)-zcuwlGjCKUYVYu+`*_ zuyX{`hX5GwR1mr5snGRVHRn+cz?hz{7hj#r!daDsR$0$XVz2wN>MFqqQ;agHt3Vq{ zVVa`<7#9NwVs`19^)nX6n4HrzgH*?OG@|y0OwwBRH`HiTv|H2%{E(era9{&%$a%!MK+ZKchzA^X*B3Knw1G2 z8jC(U#eKwrTBPHJS%4dx-qvW0lde&x_DZ#xAx=z74HNwqkPN#!q0?@Vvyj)jk8=mY z`vhvmsk1DujCqW3F}kEb2Q}Qb*hNmwj?eO3>l8oo&uUXp7qZ=&*aXhx4%Qu_V0Ro? zsDf2xXlOkfjsif!ot6YjY_KDR^QOtdWf3zw3o?D9@><(|B(jAK(%s$_cBUou`GFVH zy^IL&d-+ciZR^{s*F(4_eNj0gcp$&raNg_dfk#hatda^<5YWL-YEoBnEi0lwjEf6Z zz`*_$tK@90Ra3|L(fiH=j(vC2}bMUkqEJZH2If@|nYohoM*s`nJUBl`1c z%AR)-MK~MfSmmFoq=M zk4$m_fk*XavBOk%!SHyfWvD_1m3XCkcuPe+nV2qC+Vn|h!bE8j9!CXC35%&SWg!9A zG4JmadR})lx{By>97 zIj=H%!&OH{j+VV)<+}-hj_k@*$C&-iFyQ4lmUOA3F8B=iSWOlfk`I+KJg@B&Dj%`E zP$F5|3uSlkg0-D1#9jZ%+3dPCwa71b%B(v(<~D@id2O{`?T(+{<d5Dsi~W z-#fzU=t04!20<%8HTQhwX1;q&(>GO++XN>5-!Vb|nUz;xYbQ9VcyBb%KgAdQ%s>=xfqFm*jl?v3m&&qu7lZp_g%>N((fNT)nFhTTf|ile61lqc)OH*_%X`4iJ{xg zafm3L->8JFEV1Ec_PizgarGQs3{B{EV*3(`x!JBqHgSrcnH3?8tLH_t+J-9GPA~R5 z1JD&$PdBKOsI$!P(tqDKHx!-NSQ(WvX-|kdkfwa{q?n?mwP7!*HWLhcU@%tyA{i-C zeDE8!$T+OcT9D_&gZG-_U)pla<3Sjo)a-%Egje6YSq^pSO~hvn~~(I zym|iT0$;Zq;#U)sH})X-xG5}TYoa|HUMvfZF>dp(Yc8~$*L0m}SenFMLj)rn!!tf7 z+XrLeF3tG~nN|Ei+sudcu#_{=W&3if$xn=su5}p@sEE^3( zAma%-9LqM^V;&ERykHCoR@Lzm$^{(jV<(#eHvYW(Knc&+LCFHx`oO`!8m_S$I@%JZ>3mmh&{{xZoX1Bbc!BX?;q5( zS!M0jUI?o4@R(F}a8!Q!_SSR-1`C_a!xX)mtnSBnz5W{T%{dZetG_6lz5lZ6+@eV6 z!?DuT?miG@_p*v}rqkv;UWFlPfXDkc{|{=^+1s*n&hx;ZZ#mjy%Bwm^HvNtGw#{D&XFCEkrb`*5;!$X{L(CCg$(Jn{P*3sT^cspsRFt+43nGXPc|* zxy=f>n1z291+m(Wno^9E%nMyVPJ3<7tG*=@^BHN%x>Wt^Hhd`9zu_I;@G#mc zTA#1eUtPH^6a3J0!*D&0M7d|00Yz;{|FYLo|MtR_K>9`|MMt>!xqAFj@=U7&U4bcH zOIl35AX;7@PH4P1Bj))@P(EkPaJ*!3?XAK_*Vglj*Ej2kw=fvPjJ4%v&KKSKm_@eD z(o6(#L|mO6A+7j^D`?dNN7V9;f@l5`YHwQ_$Y50q+?U{waP$I^>qtnYNr_I*Jc>{( z=1A#M(+}4qWduJkq{uAwZ3|$uz%s~xT-6*`R2|_&&|c((Ggwh2Jk$NYD9I&oy*hbf zM}w4At`JkR{6Nc}ehLWd=I5ss={3JeO*0a&-2bv0_lR9dR-S0=x^VHWZ@O3}{w%@a z{nfX%%5?xLN7v^mu)apYG`GyQ$}_OXcfx18%F;VKZU>uDM!8Z+nJT~WGXg+ep|;+{ zxL5}fR{uw_If*K?%0U=eEQ};br`;+zQk@YYz7nQ@B%l&bZ&ik2v+;Q<22*mH(0!Nq zF~@h%6HXWDI##WEM#Z@HMi5giLjw(c9;H*HAnuTL#5n|x~oEiTM=40 zQ5_Q9`drU>liJhvLA*kv*~*j*EF4eR!0G&aQ|!Fxy58FG;_WKNtGOqsAnEzrWz)+S zn4}nDfLNPIo>EhP(R*%caBMPw;zK;4ZgchBEgWz2W&!~p)6XB+(J|c*&ws5HA60EU zD70H}2*RYJ$A@PX*5BWmT3D!;S_y7mAM@ibJZXHn>PUVxa&MFTNGWVaN1{+G%gRWp zF1-olC?{j4J!8RVfh`>gi?3k6Kd8=|t&RhMIkMG0hL7{QX55>HDQx8IUmFLDnki}w zw~m9}%D?MDITa=v8z*ZQsC2C~QfpZA{M+$mh`tS8^?=w7RSd7shbAY1Z(&SP1DwOW zP>^y87>xvQ9NJgZtDXH$ux7h+V&E{6dkn^C3qRH&Vt{07w_$xPjN~}35I-zPr$c`g zUCd$uP5|v=G3Tjbdi{p_jqqGcIR}TpLIvPvz-v0baw2T`R`%ns|Hp3MSBtvT zW{i)PT^-Fm>?&zQ#A_XrDou4z%&amUE^8+`!+FHd>%Zt@)Mt$sz5k$+ozX*<-Qv97 zUgcM|CZiqc@H?O048(XbuC4Go|A{JYTE+4$ovDEY(U?NP(O2-O%WGr$Hmo)I0l|xv zpHwUh>`3`0VJfylp@!W@uZNOXv5LZnX}-6e1>$E@;Y2a*ymDASuy7(4VErHoG3iSf z#}`TCbt|g}CwEJVy03G+vK{OtD8(^7ae8gyw{Vo|IHpNq`CM^SQuQRjr9w;`PDp>G zY2u6Q;>we+^KO*+Kk||j>@~%1ookE!tkstrcc7)MQ4C_SW-iCK!R555KV+3WZhv^u zNH$$jZGM!zMy8zTV!ie`8t&#>Ibb-rMMnvC)yp?W$?{x?@txawo3|w^vO7@o&bZEj zlUY?68#!kHQg;6du&}ON`gLaIs>5veio{5n9B-2Pc3m5Q@6Jkm$M=T&9RGUsssBk) z0hzd}v^y8OR5Goj@#Xdd@}&Br^A!q2!AL^KBNRsRvpcu&Fh2i7 zK0{geZIx@b$MGgrbf*k-o$+ec*+oaeg*j@^?TsLLe&efX4i>cZ2Qe{e(hUkC()#ne ze?2r6mL!nFA$R=T?QiBJ6f13XZ4R;@4XFHdMnCc^>n>m^ixx5I--h-A6>vTrj#+WSx4 zn+<01!WWYp@1EISqv^dB2435n9`z|j9n>|nwbslMmueq3;`i0J7ozCBs?q2L%Z%M< zaY=+>M-I0ymTtQ_4DFxay#c-h^s`-Xty?dKB8*5{BmK1$S*#^$;mUwb zSJvX@T-^&1B{;! zfVu3fDpa94L_PvR63O@jhMv&1iZ=0R(_8TFxi4Litf_i_Rg*b8O9l^HlJe9vk16Aj z{Sh^>Li|AU9MSh*w|#-+;P(jG>O-HGnSNvDl&0LoQ>6|r7`06@`OK#0>lxoSYU!)c zRgXuX+k&Z+3+?X*lK9=`mfQzOAFEA9^$dhSvjZI}tZFEA+Qx)yqahYf^GKEzSi>%ZS5S+b zPV{M5VSzA^hYI;2=w$JUsFS?c)pQ^KJz=Jc>GMzJq0Bppy`UL4@sEuq4J};0iudm- zChll)dhU_B|?jS^@wQj=Zn zG-&)ZmJrG+)oozA1sZ4Vrb9KvYHjBd*hrZTi*VTtjc@Ybzdz|jO(WVPkGy9=u!Gsw zJ!>Dw&~_FEI982DnHYcP-}kFDYNMG7K%gG8jOQk0CJ=GXiH1mRrAT?otkfCw7zO@r zzgM^eZlC7Mr-QK^NzMk`*1NLj1S5a|i+|}UYQztw;T23_lGoD0Z<;n?B~0uUjhRi8 zbdyoK(E~Dgt3a}b+S;(h^*t>zmTo&VJuPk@0R=?dEv>4@l8SrzODNxBjJ zG`T(w1|GIO!jqQalB@ymeYfGuU@?)fe8lcpTm^u!Qbc;0So>d;MiqXOrBi*+{z_$P zoqmQk$MMnx=h1%B%FRimo0hfwn2j_mAsChLbFPJsqod>JiIh&qsQ>0oq6op67A2b# zC7UhByC9vut)32^Of0;xonw+&LO1ctvt_n1licz`06YKJWVU7-){(+UQhcz>#%|9I zkMB?Bpyz-I&0L2yuZEBNtrITxUw^In_D^7~QyWx)A%!VOz|i@}BAxQeP-K2u5$*7c z%?7>YGdeRcu{ms47|o`$GE+uK)dRh$)d=g1|8AXiTq8QWCDl#xe~Mv}z_Z&i$MD}S zS-a#6iSjMdyeA6K?MtWm+*Sy28w~iA3NSZ9D=HDfUBnT8Y!{;2sfPPC=#s`!&YXPN z?+Rrd?!_gHNM={?SYj|eT??Xw2g8f`g9G;M+oZkrqE}tkyvNfeV$yf2#dq)yqKqXL za_zF%6p?h2<-54ZMuN{+7N`$}S#cA@!^7A<44d-P(6z(&o^%Ni1VH%t!8_LY!{fLQ zd_}@B!IFT0t#M~8nBe`hUX|Jmp@yhnHt+NiSdBzyu{f|$GKs7h7)V*ki5DehjU}re zr$^X$@O=LKnVXxN_5Ckyd=K;&Jk9ZbTWd)K5-Q~86Xl~stGX_F8kH&|!V9^3_)(u| zyJO*diR1d^5lCZAgu&Y!rE!@4@TDUPiWh@*sf(q3thCM$y%id8N{rmW(&NrrloyBP zxnmTEI3hkq;-RzXDV)_xtMLvl9!@}Q8YtSmK3&{BU@H!IMt5MVTVCJ$CDFHm6k-5& z+Gd-Eba8qP8Cn|AHVOF%ZB8g~q;x#lguXfR*dPv{rZu_L-(V&cPh*1l%Gox_iE=Bv z`3j{PY(l$nlM%BZk}V9-y_zsO+BIUn&~tk%d_6pS)kD!^-}NSUm!}AO){zjh?2GP60}=<=hJ_F9zuYMrEkN)lLP~V zn3(dhY7l;c4B_aPx4Ozsaqz8QF0dwj4Fs_leB*8zBKynR9AlJll35)GpAwyI_O&pD znhqiDtu>}rnzgzIi~kcNy18$t{c5GjKcR$c3$`&RxdJ{B{ag6wM3dWSB@{eYQJeUN*A-t=nhs;2y&VcO?AqZKm)1@lZA8cIDYvb#Cl;ovkhZ+ zy5`mdFYxdhqOSIPOA(n9J+F*FdZF%)XJ@o&;Cp9MY|MCNWpydZgvv3IUdaFfQamim zxIq!%JC1E@0L0?s$a0gFCR<5q{jeu7j6h^#+JEgXZ48zDKhHi+VeZwq*@^|&rD_2e}@gE9@vgq zJOsLq0m!}qdvd(+b@-XywZ`?e?K+Fd2}PY$|KLId{a5hs-H8u}SRd=T;F5nxgS^r~ zEYcJWh&^5@oBFnZZiS-2!|u(Zq3^0qi~jjEQ0-oT0REZC`ypG+eR`T-?fUtLYx_|a zG0a6R^zCV0Lrbl@9<^2aK2RaA8!*F=zzmNt;!!JP0uB0i zM4M+)ccrXBD z16P5eZs#iRCccKwzKZVvXzG-ymCp=pe~!*DcNBfz-7Rb}2F5}7-$11S9pilrMZP+K ze|y!gr)$O-curTyv14um`Lf|dcIdqo!ha9)C!3yabY--J?0!B^|8us)15`d8@PUf9 zOi?HF=IkswLNGqRoGrxr4R9^q381nBhFz)G7XRNj@ULx2ea_|hP%kx!-%E_Tqy@81kx0=%Z0D()sK|}ff3c+RgczDZQo~{hoJ5{9I(K~#= zC+q)x^1&03Ut1R%j1!7pu9&wxj~a=H-n%-%xbs z)9Xt>a#|SJ4SM@#r$~OC2`#BGz4;n_v=cAO_*F@3v*I~qOe5kG(093*^FfY%{3Os` z`OKu$&}82NlH*lbY4dkiz^+F|+PcI&QcG>7ulI1X(f!>Z{V z$FzRaScuhx0RYuX*B?*U9xIg+)BnXGoB$NJNMPR?xmJptZLaMoNQ7BiM|)_QMm7f! zYY6^Z0-jQ2dQ^}L(L5~3vR}YgV7RKkOz$}_@w3@<<`^mbSX;&}2{f{fgF)yNVBEO+ zp9TS%R#-^?oGbVe%Mt^I&U>@H$;>QX<4mJ3iOM)kxHR9yq7L&>0;0c2>cv2XS$$_N z!vKSVz!&|eagIM%qdSqIpm^VoA6nRkI|GxgOrxwfCJ3VYda1?})Jt?~5g?&!W<&hK z0$TNSeMApo^?%tRt+(nKz7oC4;9&k|gaX6RnfP=s_Ex3xkU}=l^Zr)3oDiVl&!sRR z1(^M7cR?#0v;LRqgA33UtSiTdQP*=SN)%c@Asiu+hdio0F41`*ihG`1v0R2a)e2zA zQ}Q(`0EpbAOB$egG@iojyX6npsY_eH*-+7_Q?wAc7YN8mnw*caS}|PgejqI`MURa| z|2O{HN@R!f3F@zOx8L)X$lKRgc1Pnq*5TBnbmP6ccy$K==R|niI`U`pU-w+rS_@Ghj0? zL^|F6WcU!vbQ_5+bfCup;X0*GU=O;`t0)yg5JK_)NdlQjLqRM?EJBagg#w!Y{B<>V zcz^rCf9JF9OzDE<#;51#kGu#9+iGX?tsDZjQN-0m8=7m>Kk}spbI}vUxyvOe$!^3v zF@@W{nU4R_Y#yImun6UzTR7@WtKm@xwh}o`a{nqMaGpCf+1=o8;)^Ts%tt?>#{BmN zq)${-IT9|!mKZeI&@`nVMnE*B$jD#_$RLniQXEQb!y5$Pd(b-v+~*@QwPBW4tLt0V zk10LjYW?uHAdyNTvA;kCKq^B4@~`t~>yi7sq>sP6Z~`LE=jleiuX!pJG>PtshE{}z zPUJ2As4-oOWIAGHESB|%=n+RtY9-PXSI6F!h;ho(nx{(_&sf1o`Y_%!+vL>8pmsV| z+)I_S)xquLShLYF+rq{Wa>7aRpV3Q22DIf;>0unDC<#Puhbr@-&_iWbsVhU^!GktF zsKaPI=Rm6W(pR4x0WK1A3fJ5x{l((< z=sEKlal>$cjJ>#ZFkLw-<9>qIkJ8fol|$Cw8RKj9>ebvF<4unU-ba=zE~i16Qe&g2 z!vgmamxh(o|HF40X>lhi6tIPjfvK{42UWp(@b3^M6nG(|*klp89vX~N5N0U|b}N(r z&`NUd<6l?OI;gw_Fvnq46cIfzRUP;ol06x(=Rg;bjIDGWX3wc1w!v?LqXmj6KRu51 zUp2AvHlaM+1yKkZBR^iQIB(L#`cx`b~JoLEvFrw6IDpYgih)eMuSeC+fS^ zd4n_Emxt!*n%|mFVw;rDho0{x=kHe(zVHPx`J6vS&6RnOha>=)9F`KqCHn7318==v zNQPdRe?nL!-w$oztA*}Heq9O`i~t@S4kSq@`D*k`Y(U$Et^~>Wn%s2R^nqWw#oRnm z{$n;Ii4-6wC^Uw#_l`yPHGbl))@J)Rtm=D>i55okA$t2>^>y|2Vime94nu^=5mlb} zc>3;O@;NGxz_;bhb#=Zu*e&1cZ(t$-d)45HQZ?-ROU^O}wwA)yVM$oo{C;`ZG{C!> z3k3=Q!Ia}gn#T%;T_b+JG_8D7{j|AosO&)KdPes-xa3OF*YRJ*+|>2T{mQw$>sZRa z$Mi+y0_%&-Q;vTUCfY%MVdXy%Q5bHB*Y zxTv}ALOeHRdTvzCDI;`TB`>=9y*#DT4<^6414qm`LaIgPGlGH-%>E~MFjTsKQG?ki z?~Yc9dcj7x9#$A6M=ne7B`u#LSNcVNbB|;$PNy62V(m}c*QhALZ2ZB$0&Ulo-aX@n?_1K?|$tPTQ(U{}$3;k^3pRQ|5Gu~FNU6RjCz*dm8 zl-12Wb2`7?jC__KrS;A~!nk_Ed_QOJ3``A1`ULw1cVhiDw(jx}mLzpO88Lq} zNa?TPwN-T2`GViLcSlo<>*X$%<0{6b4*nKzC-g$cdLnda=0By>?bYOREO=4?#y6la zufUh#+sruMT;;B-^nuf!!b7cPOk*x2?XI^E2R2*^lq!C;$K2g{#?@SAEp^R1% zEtlo~7#YW&{aR3R75HFn*vzK=p((UjQO@pR9ve*fG{XwA5@;+YWu_p3gWMKs=y9J; z<3}|oGC0z0<8SpQBF=etflN6`Lx)6!uQjDNq!3~dz5_B}C8(MN-z3Z@!STu&;7>zU zifdeLl?$zhsO?PLoLg5`Ovl7){A9mi2mM*UZ0Xv|Gdw}7veEl0O6WvUK}CFAI8N3ymOu44{$v0iBy%B~P5=!noM9HnS)xYLiziFaOZ@ zymVq*w^ygrys!93zK&M#CDZ5GX*!GlweW559OEM|el5qWp1`Q9;v#YgSR6|`Hq&q$EyH$qM+m>_S+T+H!5mX0q#%xF z6hkN-e{k#*(d@MG_-5|Y4l*GMFm(6`9n+Rhx@MUa{O`@zkkDcz^TnXXFb!NLw~O)W zJ+?7uZIYm{dMWs$?xIzWwd=U+WJMd+f5Y{>$xSwP4HdU1hMwNflb3_#LF)A@&5S?$ ze~tf1@Ye6E?i%VMmht-5CSXT!^?9~)?6 zKaD+&r%xlCI5SW;l57Env$?UJa|@Y+UHul5jh;3Vc(?PYzd+|4;mO@aC-(pisfZ{J zr-dKvy&pTqd%s(axRWFK$iVkC4w8#qxJZA-8O8{s6IHU7S&9T2pUl{%CxN(#>Hwc=HCSN5F zD?|TSZ?@<^$k}+DU=Y_EXb3~Ar5pN+JmTOoESMuw(2G`B) z@A`LHe|--!bxT~o{F2VE^^<4Fmnu(BHd&4rp8@U#tKr5aXJ!obi`9mG1ch(-_g%N$WH$IB!31D3%CPwfbLWi2WT%a% z@%H#DcRQY6WX{2wphfzB2&nZs5KM{wqp&vahS@a;O^%g|fN)5}Gsz5d`*zIL4o++TKFH|R>WB3U$OqqKx9jEYXd~^E4xf4FUAq`0;*ZUUoK0nwo zD?2HbOIZtH=ffQ_7BVWvF?8uGwlLf0)}<+rC^xwIs^HH9NIJ2C4Swo_-twRJE@$o{ zeP8F+-!_T$Ryrs>zYAGeuu$}$pli&Kl(cuDh}%R_#z+i6++B;?b&H*^#Py{<@y(lt zZMeat2M0i~_+>#UYz`K{2!l7eQwcj5-7-vdr;!9yk90^@uy4ewPdRnE+IX5d_c61| zqtsUgnryBIzgd(w-ga44W$vX{6V2SjR^MYX7D}fFfgwSP^9h}_w4S@)tT49`;9OCj zy^g&KX74YLW2kor3A5Y&rJzF#Ysn;nzp>WB<@K}k)QBI+anS6RycFP@{&cCWuGjiy zii8|lb{R{L#uPVR)PWf#SDMIJjOGd}1hEVHayhOI4tfX%t>d&^s9nzYl?5_KbvCj# z1ES7lB0XNmc4awTm`HJ>9XrJ#7@VvgSNyW@QCHu3nE{>knJeJ@IEqO)Q4n``ND@gYyON zJ_E;6R8ttN@rn6z1HaR`skyykej(|C?lTMuUn%TNK7f*=!W>4>7d*9WZ=hWv)W6r9 z)>%Gxx;rYH(?6;I0o@q$E z*ZsP662pR$Nv^WoL;~RlrQ{a@3V|kggI;;F3O)fgTkv*oN7Q-2L&0X+vqE|ixkn-6 z8usFjfa#PAO1j-q_Vtl3ch}91?h6NEdzxAwlaqP-lj92>{f=;UhluN0%$ebZwxA+2 zbwCFRyq*3lI^mnBR1UN&I38p)<8tTn9Yl}|Vu8=4$lZRa-Hs7f)M&3PDsR|?^ixYN zs%HWz!SWBBpTgl{6X14SrjIQs(;jwo+N<vO#S!hfOD-+VbmELJF z6rI@ecLqo0sDm zlTBd)*u!%GZncMJpPuRnnDrXAxMK1I1@j&ot>L{JFTT3Mv$O##!}LS{nG_rr2} z4ow9bwE1p{s8A_3Du~{F?1h5u-yv;!4ccJ3y({vZxAR?B8?%lriJNa-JwBq=P_U6` zRH+PY66uCSJCTkG-12y|87m{y(Ipd!0f|kIE4hTvljWOhTkEwT)37Zj`2N+QkEwi+ z1&Tt`f{?@z%tE-mdtX~qLK+fFu zxlA=bqzE#wVkAsHaB@^2FVt%e;08(#rMLh26J6^RwM0JhZ-fWoW66&aYqOYTV>Cwe zIpZjQiKJ4Wp%}E^6j8b2%{3!yd714Kj6CAQ%ioMXS(%T>?r76jkarnW)o7GoAg#N5 z{=I!TG<_2n1CZ3)KudhyCnSEuP{$l7JU`GqL_AryAu5y<6edUpgbkX_^AY^yi!PEO z^kEVS9TgcF3nAD`z_2yl#;{2m(7>sQ`NwYJ&T3=*L}h|FU-XOpbP0tx)1C=sg?}J= z@9*WOBrJ+Dtt<2(5Zdksu=oII3t4&(v-(&|h5lD-KX+n%wek1WT#(X4Yor6YqJF5Z z_!zGJa2452xtn}dWkoA1?E>X)ZH`#L=R?ZNzx7eP{cLk_7c_OVvTZ3Lm3feiPWV}z z4OTBr2pau5pL3xhWkBSFN|5D^yOJ1ki-nodDZ{h{+VoZ`j-8**l}79%&AQqYsv@M~ zsH%>dw`>+;Lc1l^rEEMxd-3Pow^%jt z!dhZ#FSqfb2Q`5vas5=-=+ftD=g z;-(DbLHRmPm(w;JdIJuOAgQ#n&MYoHa`OY40$TQ=&vS7A103%QZ`ac5sfDc)L3v_1 z=z~=0S5Z~6R>T07l6vzme^`({2Ao=aK}k*6g82oJ55g6K6atxOm$;+!LJ)#rm7r-L z5+xL&dI$serUPfS@rpCxV#|7K5}D zqO=4Oc79Ap0?RnFB5c*Yl)@P++VqGZ3wnMXLPpeT^GZ4H533W!ktzx&i99{Kn}^G- zlRY*~%{meeN(ks;PMtKx1mW-A;u-f}jB6vPICR01Un z_xK_9Ldbv!dm-&196(6D%A~C**Z9BwfLEYzE}-lNM1J2qeiFnulr5S)l_U$=$W8O9 zruwOa;=BLt@|PlF0qvp-?jHCDeP0k^nKIP(G^tX)0~>c{qiI|?lt_oEyo-geJ}YVX zjTDf$1>gKS4>UH5&1?oNSqId$;w4Vw4jQJ-*DJ@@2igYoC2;5@<)PUVhPdrPv9*bR zDV~39(i`Fp{T=Q0Lr-lxiQ^OIxF4=btz!c+tO9JNa?2ChqkAA01HzKbWUdHCL0D2~ zLa+$oz0R}_@$EW#Ytj0gLBVgeLWuoIj6QuJ=mGkRmf#eKW=BXJ@qc*7_P{^b#)9S- z13D0Ldzy(lyD`&u#tV)>UqDMBCO?>7h#w#%p&$O}A;+$uOQA1}L0tX@a2{A{=d;Hr zti#nA`{QzRnJ-(5im_SzX1)U->LZ0`Ob(t-?F8c(wL8rR`=DWV{*_M}NDuihp`Q%p zQ19^Xi{+#dHGGUvPPy19eA|c0D-YY9NxliiHG%FA$NtrcaaPdpD%cgqQnaqQgDsj&8gNJyo{=|JDK2H-uzTZC;uehVv> zSQRIHCn72|WejzDuHt}qH1bbm8z5SSp+z$P|f;oeV?tam`mE6i=}^ zKg8I=?q%#dOo%;!PQ{v=seJni`Y6=lp=JP+x~@TD=zZ5N2lBXy`(qV&h~js%61QyS zV(3WT{xJ+E{!Yk^{XV@<6%igH9whCTe8wQU+FTR$~st zUKeaDcK_O|gmabF@u=T0RSV|0kY*fnXRS51%m(Xi0|olLIr87Te&Sc>)lrX(1ULF; z?Zsg+JOQ<{jQO%H0VE9UqN1YS|NRXN41kn0HO;ku?@b|yeKC6`uSX_Zt@bdx<@>BH z)rAC7!iP16FII$X@ME`Us3qKLaNu&R9<-P6*XN+{^45aza`qZL-a~~86M87OYOBzV z^7ozGBMXP?*A=dTv3p^@RM+mu6c3ju0E)pkZzj0I9HRe1eKhVj9NXeBqkfl1Sv4vp zll^Yz(CWb7=JHrS{acg}^L%!?Wsr*N#7M5T*$!GTNGaU< z0ttuV(5XBgxhy%AqTrN1r~UXV>uUnLu-4K00c{j5FDG|>cb6i$Oj`u>6#<#(sHi9) z*Kg-S+P}pE@>{C5ikU;-_3Xuk;Pu|i<%ZQb{%6C5I^<7~v$+Vpc$%_p2T=(E(V+cG z0D=0D$GxI=GiL$eZlLuR1*D4ixF>ovP=YkKuX_;?H7tJe4ZA zoO;d=2YM~{$nR9PcV#R{#Lw_9yb8B74Q1MRNMkOLG32`prnFO<^(wrQIw$r?<-c!u z&hceyZr7O5#R^K2g?1GN?@MrI0E*f4lD8^lm`Jc()=R$tRe+_X!%MgQeU30Vku$Jm zPDaCrD?dlKt!1(vYk`C)V9+2z z^L5;gXvtv|(~%>NQ>Dfj(zaa(qVvt*{!I3Lo=jFb3WiZouU;q*XTRJ2PcKp2uQ!&J z0s>xrpYKHW9XC^7|CCe|4K3JE!1wo~y*oO?A4a$@HPR(>?bRu8iv$D&qIpV16&To< z#?K43Cl3ilD;kO?lZb1JeRJM8EODBfb#Li$|N1nudERz>|3o&OJ}nfl-*HP^?vnem zuX{4BEj4fVDWXfmf{wM0UZ)&myiEc8B_Xe8Aq%Jd74;jL^W}UnvF`wfY+pz+@|`av zs6EHssdPu1fnNQ@rSanJEO_+Xw8`q`xsiX?{ADhNt;feuDS2>@L|7~QzwqtsOXOr^ zO-xJ-h6p|ZL5ubB?EHM96a}6Bx^C?B!Hdrf4oC!d_Mb9E~OpY`>xSh+-yF#drG1NpxqEpo}7Cs zWi|fH+~y>_b}1W2V3bqe)Ss%SMtYRHj8Y2Sho`&OJf=g@`puYzN;_ivK7xL4p!4mR zL}zi?t^cvG0VA^q)S~})xazX=@#&o#5)%?a`>m|30K6Jp92^Ua%yqOGfS}}mnjrs* zGi=M97{`Nl{x)=JG%9=;#PM==31WJ?uw2fQ&8(a3c_f}#18!JPUKSo+*Yn%My60A1 zPonY1qfyteRvFypHLoXcV^P<(e1AJUXrd|cFhlST5ZmKYNZ=!a|4Vz&0^QNPfkuAEMl}X997TI43Ulq&jP6tE*`=fhiTV4A(yU1E!5|*rOn(j%3;)AeUbMO0>u!#5{jbf3jo3uSTBq#p@DYT7S|r9%!FP9<3WVkcvvoZ^ zJz5MvjU6CoNxo`dJn_b$*6Pfk`R3?&MPJi7yT0D#^YSQ@(m+T8T^=*)!I@Cjq1J_iL`t8h;1MzvtoSKStHb+rLRP-xf_)algM!o(5`No; z_{Df?DJ}4=!(}x~Oc?@@y)PHs4OeSfe~OzQQXT1j&?F$b7wdGk>U5SZw0J4=eG>U@ zIcV5ayR-3sRDESslu;M%ASj3+A)O-K-K7Wu(%lTwGL+QN7$71g-5}i{F?0xsG)Q-s zFofjL+{5>M_pWtW{!$n3d(PSK*?T|x+0UkW)flcL=;E68H-;dP`1Rd2QPxpe;v#)F z^!50-x~Pa>OBIZs&Mi*i2jZ?agQ;8F+k|a?s(;y90?JYB(!IH#ONs<3em@fXz&FuU zXm>pr;pFS_V|7~7E>=u;R+2WPWP!{8vE0dh6-Dvo^LC14R8a%*3{B;rBd`g{u{lnH#Jv9IGQ)#Gc7c_+?&9?B(BBEp3`Q|E4lfUktpSvQdk zd!p>%6{&Z=TiI*}E7^-b^4<@2Ty2zYeyly@ z`a6Zsq*;(DcM?=!p;Nk8u{Tc}THgHd3G0IQ6UbpFOmFe@yY%#5rLn>rERB=TY5OG$ z)$$V(x>9L#F2&n;1O_LaFoaobw_THasIcxQD`KU?A|qN`|E^1&fJ7EH_Yzs;#5i0k z=c41$`5xcuX=k=qD@MRsTQ>#o3KteT@k$fn{1;$UeA(IA!1N*Cl$mTkPqCZKTy1Y{ ziGpU|&$yHeCuMM*hIp&2)uwZJr0OP%ENrZ3+>oc@Sd(dU=P)@s)fJ*WTv}(G5^lnW zIY<&pj(W0>>-TT(`TbA=jLb@KhXoRI#=Rccaj~2A5THowL4K_~KAf06nzD#IL7}9N z|GWfaIO58zM1N3A@$5+*Xf7|Q9c8lRo&X&QyIf!H0nWiU-cu9}>d7<}#V^(EYj_nbL<6+EC%GgKZTd+;0d-2Wvizsq03cg%8P|bX)SMqLQ`IfUjF|%t z+rDvR2Kb4=cMi5Zn`dg+zk7Fn&Tx9+I8r|qr4~6Ic9Xm)jOe394}} zjJmZGPfADcy))1yU^1UN6D#N|>KLLMIj055N> z$jHc88n3R2i6s9o)9G`MP?ZXO3D18|bC1DrclI9!wr^4!Y@0oc#-{hf@>0XvnqROQ z7QbdYl(%$J&~!82x<{I9@V%_VRZEo>X~-B)gDAP@P^RaBKhz*7+Qd;;rX{`4${&6F_v&uxjFFm#G{*Z#WJ+pk zEW=xCMS0%wLr$-~`ppO`(ZfA>Yh!bB^9Z6uWFGx=_{f?~DMLbYEmiA5D!P@irgOFG zcoP}q8N!aI>?y{3v%K*~Z-9!oOi1k&Gw5ubUZ>ZMigzJ`@L70x_j@So_BLSAhrP$g z@>bLe_w9St%*yIuN0QJAkk9`dI-|X_^N-ZY;NW1i?`36Wh5z}fsi_&s@AsPluMYIKNoy7g~|S05Uh z65Vykd-x7*r}F7TzRv_wov!BPH2KF>Ht2G^vV`2kTOphLx@0}e}~_@4=Mgt&`0o5U*R64 z6|)%o>-`Fj0-`t4hKdt0z;s@5#-Mt+7w7myYIpt>poCkf^JRnwY zDAQ|bu*#~fMJ=^`LQa%60-+-|lTc^Byn)aM1H_`abGhHxE3 ziVO>sXdIOMMLO`Dsyx18vr~$LnEWc#zss`Ofcn$-6X=9 zI{Bl3+*ebl2KOGz*blqL@N>Z9?$)7l+a})$WhQkjCS)qBZELJa(W?-o3{h#tLZ4fYhkfQ)M>0*RmJkf$W=d@n+}!vp@3S;$9FZ6T4A|6lYOLRHUWXlOW5 zVlWEgBQT_0_L;_(3&sn4jAcH8xuDzum$U91@wD7D^ct(91%fV*q&J6I2BwV3@w66( zR1n`c47VoUQJA$^}YdS}o}thbJiEpA(y zaCq%qFpAZ_LdTSkt)#}Lq~-!4P0~ETh zDFTBD3xfaPYG(cTFlyQ~V2vX6rPrG}s9VA?d#IQVGgX&)ZpkCaIcso(g!nrCM{V*r zn7S1aUR0@rA;a?-invq31k^P-4b9^q8PjrjM2mI1krrFrV;YISB7-mSBpFW2Kxqx1 zBqUdOMOAeDC-sK&64Bp&f|#VVTvfXssXEcj{Al#O4+Bj=^KsVj-SY1p5jAr649CX37!VAK%QFEr>66^ z^R=*b5GXUaeHvnW>`KHP*kI+d0 z8|{7A+7BY#A5)I2oWRbdR7OQ-ByGdhMs38u))RJ-3A6_CcwWh#e3Q*)D)c0`58l(~ z5Z{|(VpkTQR_v-EbFX*c**^5~@Ny?Eh31wOYPk{Xa9;~I2Ih=zeZs`sZt!3FiFW75 zBEX8Ca`Y|%Ap*RaPphYOZDB89Jo_8+J5euSf6RWz^5+t$v=c%w#sG#2`K~1P0)u`h z#t*U-C5b@*u*J0~$*Q3eGr1VYADz|96ptG#|CDbf3n6Uw496-9)8L1xt_h8Ku;j8W zK2pe6)!{c0a;1T(`njd|FlcrRa!c*TC}44h4;9_*O!NsuQS(2S>RelfXei*~gOn!d zH7j(LUnO4jkVX*^%OeG!wJ8T*9CnZsjg;wRoyS^Ga_}$L39(zxjU!$Qe1VrtPLylD z^w)gy7)cgxv|A8Ni9e7mnFpMiy9g)-HllA8^LeVUwoN0O*&J~O9=yoJx0 zlgMe)8>-{JI>v$&$l|iS`1lawX;uDu?6B>tKtXKqf`eT`@EY!ulu3s3w*`yhplT)sG6?aGYUVIn2G9tg4~8$tQqQ3|=l=@yE}zG-7n9 z6xpJ`y0vOMekycJdc>Il*py15$tf-)79LXT0+a0icr9L^JchWSf0!>SHzxo7{hRqR zxTv_8*86Yf{}w=uyXPe=ZHwCy8?cq1lwo~`_(}}S&OK&9Bkx06Aa$}nkKw=4Z`Z8f zx}VMXM^;tTy+CVE-y<=mW`sV7AfZ0HbGRh#gs}W05j7HFw`-EwXcwED;wua&^eU;I zUTn!bo6KQdP>$npk=PF_%nRSN8z)vn70BohmC8T2NYn|zIY4K|rtG_>$$z#iH1T__ zBDoaPAx2a$kRZ( zCPCBbS(3Mp3eX~}?X~RNSaCKU;7*E2y`zGNY*L9pe48#-HCQih&Mpa_2I60I#!x3D zB@9tO{WyHyc0YJ;X6)E3s&0z;$`ie&jp?#9J;sY(&5!0PnD)zDz2Edrx3)19x(K!p z__oFCJ-A*23Ani5GCl+^V?GVxhrn zoGm>mtxKhpvK4JqS!lwjxBG8@>d92qLRHIagAF5#yvpOop$*z|MOEDj>1X4mCk)8~ z90SwLB!fv7M7&W9Iss4cTH6t?J$Q$xDElf)F0BU8L){eOGQ3#U4RkR>A%Qx$v*q$k%9l+^PUZV(Qt3g;u1BSd3|BW1}^^w0wg3vX@%u<(p&n&T4d|2c|_h+wUXPIWC&aPf>{TE1!(pHf@yRGj>jRz?XW}A=h9A zo$}e62!+vxB-KRa+aR~ab6hm$lvsb4y-Q^C#FfZ+6HIb6p=d z%IezH&J!C|MQPNc&iB>aGZ?;-m{jprIQlr&+5A|2tGxEv1hv+6kx_Y5{djfN# zaQ&6;yKy_tRP7Q%pPKBki2^Cl#>5J-1fJgjUP<6G*}j8UOz<&Y6nsDbI(&OG(kh)S zT}0>(8=pW#A=orXt@q{GZB)`zlpU1_lOPahk?Zcac0k%-*5wnkb!pF0%nikDlKhbU zFUpF*Aqj7$dcm#o1McV3Rf_s-!UQ@##a&-5xFed*&XK=%aH;(aabH>K2#-EtzF7~@oW&NdNxL1Ewm%=gT?(I! z_gM+=&mjqW0Mi?yf!f5Xde8)v9RazCB6o3ormmZ<)`UFfl~SWYzuRIX>EjHhL3pav zS?dRMcjayU+%elB*G2lGy!+YQ{>!7$MSV24-3Ob;&Q0E{Mz%9v#YEIj_2Rxe@`cQi zL>`Xnunn)vskpq{-1Yt>{`D6qbr$XaM2CUIc6*c%RU*|nzl*&H8Tr!I)3y!FT80|i z=o&Nen*0XM;MMb3m?BYQo2mVArE={n|+lxK}w&Bv4e5ao0`G*(^dp+ag19Y!kuWZIsnOp2gF!)b*1Uo7G61)lfVh!{n3U##Snhbr__%dI*M%kSp$(I0m1 z;;Gyw%L*^QxVX30e?UfWGPyXTDR&oK@-T1kNn6eJX9LZA?zBbSs#4K0iC`Q5BchB- z>&4`ZfYZ$<`OI0I!&^$D2Z(o_*{N5*dz7T>WjTAv7g5uG@0ZS7y``GOQuh=m?ThP= zhW1h=q`kJ76KeeJ*`KoDRnrIZwEfJy?3&NNU9UFzK_IhBYrlBb7M{p)tZAXk zgx_yt>v(iOv{mg@0wvuPN37~J`ICoq zU>`lCw8&`xy^2Xa8aXDj>8Dh(Yh#HgQU*+!>o*)drSJfjhK6~dqw_)al}Uc==9pj= z>xP)V27yefRv?dtwlWsvZxq`gxhwUv;-iZ)htSs;TSbZIlBo7&XCF6A^Hx6yR>*@z;EG;gZ?o1bZQO-;I}YhH12adR_usNfM`X9nIEPH6M{MdO9|x1HV~*`VEn?EVS`&8G7q z0V2GXhBM>xmsR(tpxvdr&vkq)KFc`Uh+SD1olYu3%GgHdUe!nY%z0i*8$8 z7JoBULpPbjKor&|U;8xdvnh=X2B&`OjUWTZRw2PBB-X3Eu z8+%Av-}%k>TXEOb1Ygoi5ATdU788kNJvXYvp@*?pbev@4AETUCXHKs(8vbPmaD?Fr z?X_?Zdpr^S=hJn2ev7#T+Y?c*I`QBzxncctZy15{JKnK?ZuzdHWH!W)*Gj4*{F$SO zpiS`#2}*J9`xlr}?{+ez#OHk+Pj)XUJ?1G*st%@vr6(_sy6z!hJLakUCOZQf|*P(7))MX9u9|tNIAEU03^%0 zsr5K}QY(P1o0^s#rt2}?6%R*HU5^a&N2Wg%!jOEY#;S7)Dem!hmpS z)|NZG;=K;*4FaqN(p>@w5ARsWvL_lLbJ~S?xS;FN1DwysH^i<2n4~oomjb7 zKJCj6@yzN;y7#PDc;{mGR*KfCDy-pZq~hx5wB}SW-dz13A`D10lVXv8w{JDL-#ixfF5XObR}gGewvl3vCX5u85g}My*^l-PJ#Nf5Rt9cT zR(my*Q!l(zQpO`�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 Konp;Lul@%N)9xMs literal 0 HcmV?d00001 diff --git a/app/e2e/visual/templates.visual.spec.ts-snapshots/process-flow-darwin.png b/app/e2e/visual/templates.visual.spec.ts-snapshots/process-flow-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..62ff48b9c8b466dc7051b5a5b71e17fe0ee429d1 GIT binary patch literal 57400 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 literal 0 HcmV?d00001 diff --git a/app/package.json b/app/package.json index b777eaa99..40d7c8df3 100644 --- a/app/package.json +++ b/app/package.json @@ -22,6 +22,9 @@ "e2e": "playwright test --config=playwright.config.ts", "e2e:debug": "DEBUG=1 pnpm run e2e --workers 1 --ui", "e2e:generate": "npx playwright codegen localhost:3000", + "visual": "playwright test --config=playwright.visual.config.ts", + "visual:update": "playwright test --config=playwright.visual.config.ts --update-snapshots", + "visual:fixtures": "node scripts/generate-frozen-fixtures.mjs", "generate:types": "export $(cat .env.local | xargs) && supabase gen types typescript --project-id \"${PROJECT_ID}\" > src/types/database.types.ts", "analyze": "source-map-explorer 'build/static/js/*.js'", "autotranslations": "node scripts/autotranslations.mjs", diff --git a/app/playwright.config.ts b/app/playwright.config.ts index 5dbc2044a..fa6655500 100644 --- a/app/playwright.config.ts +++ b/app/playwright.config.ts @@ -13,6 +13,11 @@ dotenv.config({ path: envPath }); const config: PlaywrightTestConfig = { testDir: "e2e", + // Visual-regression specs live under e2e/visual and run via their own + // playwright.visual.config.ts (local-only, platform-specific goldens). Keep + // them OUT of the e2e suite — they'd otherwise run against the Linux preview + // in CI with no matching goldens and fail. + testIgnore: "**/visual/**", timeout: 120000, workers: 12, use: { diff --git a/app/playwright.visual.config.ts b/app/playwright.visual.config.ts new file mode 100644 index 000000000..ace94fcdd --- /dev/null +++ b/app/playwright.visual.config.ts @@ -0,0 +1,45 @@ +import { PlaywrightTestConfig } from "@playwright/test"; + +/** + * Visual-regression config — SEPARATE from the e2e config. + * + * Unlike e2e (which runs against a Vercel preview), this runs against the LOCAL + * dev server on :3000 and pixel-diffs the rendered graph for every template + * against committed golden images. It is the rendering half of the migration + * safety net: a refactor or framework move that changes how a chart looks will + * fail here loudly. + * + * Chromium-only, single worker, no retries — we want to SEE flakiness, not mask + * it. Goldens are platform-specific (Playwright suffixes them); these are + * generated on macOS for now. CI wiring (Linux goldens via Docker) is a + * deliberate follow-up, not yet covered. + * + * pnpm -F app visual # compare against goldens (requires dev server on :3000) + * pnpm -F app visual:update # (re)generate goldens + */ +const config: PlaywrightTestConfig = { + testDir: "e2e/visual", + testMatch: /.*\.visual\.spec\.ts$/, + timeout: 120000, + workers: 1, + fullyParallel: false, + retries: 0, + reporter: [["list"]], + use: { + baseURL: process.env.E2E_START_URL || "http://localhost:3000", + viewport: { width: 1000, height: 1000 }, + browserName: "chromium", + }, + expect: { + toHaveScreenshot: { + // Small tolerance for anti-aliasing differences. Tuned after the + // empirical stability check (capture twice, confirm ~zero diff). + maxDiffPixelRatio: 0.01, + threshold: 0.2, + animations: "disabled", + caret: "hide", + }, + }, +}; + +export default config; diff --git a/app/scripts/generate-frozen-fixtures.mjs b/app/scripts/generate-frozen-fixtures.mjs new file mode 100644 index 000000000..3e6b7ff28 --- /dev/null +++ b/app/scripts/generate-frozen-fixtures.mjs @@ -0,0 +1,86 @@ +/** + * Generates frozen-position fixtures for the visual-regression templates whose + * layouts are non-deterministic (force-directed). For each, it loads the + * template, lets the layout settle, captures the node positions from the live + * cytoscape instance (window.__cy), and writes the full flowchart.fun document + * string with meta.nodePositions baked in to e2e/visual/fixtures/{name}.doc.txt. + * + * The visual test then renders these via a deterministic `preset` layout, so the + * geometry is fixed and the test checks RENDERING rather than (random) layout. + * + * Re-run if a frozen template's content/theme changes: + * E2E_START_URL=http://localhost:3001 pnpm -F app visual:fixtures + * + * Requires the dev server running (see E2E_START_URL, default :3000). + */ +import path from "path"; +import fs from "fs"; +import { chromium } from "playwright"; +import lzString from "lz-string"; + +const { decompressFromEncodedURIComponent } = lzString; + +const __dirname = path.dirname(import.meta.url.slice(7)); +const fixturesDir = path.join(__dirname, "../e2e/visual/fixtures"); +const ORIGIN = process.env.E2E_START_URL || "http://localhost:3000"; + +// Empirically non-deterministic templates (confirmed via the stability check). +// Keep in sync with FROZEN_TEMPLATES in e2e/visual/frozen-templates.ts. +const FROZEN = ["mindmap", "playful-mindmap", "mindmap-dark"]; + +const DELIM = "====="; + +/** Rebuild the canonical docToString format with nodePositions injected. */ +function injectPositions(docString, positions) { + const parts = docString.split(DELIM); + const text = parts[0].replace(/\n$/, ""); + const meta = JSON.parse((parts[1] || "{}").trim()); + meta.nodePositions = positions; + return [text, DELIM, JSON.stringify(meta), DELIM].join("\n"); +} + +async function main() { + fs.mkdirSync(fixturesDir, { recursive: true }); + const browser = await chromium.launch(); + + for (const name of FROZEN) { + const page = await browser.newPage(); + await page.setViewportSize({ width: 1000, height: 1000 }); + await page.goto(`${ORIGIN}/?isE2E=true`); + await page.waitForFunction( + () => typeof window.__load_template__ === "function", + null, + { timeout: 30000 } + ); + await page.evaluate((n) => window.__load_template__(n, true), name); + await page.waitForFunction(() => !!window.__cy, null, { timeout: 30000 }); + await page.waitForTimeout(3500); + + const positions = await page.evaluate(() => { + const nodes = (window.__cy.json().elements.nodes || []); + const p = {}; + for (const n of nodes) { + if (n.data && n.data.id && n.position) { + p[n.data.id] = { x: n.position.x, y: n.position.y }; + } + } + return p; + }); + + const link = await page.evaluate(() => window.__get_screenshot_link__()); + const hash = link.split("#")[1]; + const docString = decompressFromEncodedURIComponent(hash); + const frozen = injectPositions(docString, positions); + + fs.writeFileSync(path.join(fixturesDir, `${name}.doc.txt`), frozen, "utf8"); + console.log(`✅ ${name}: froze ${Object.keys(positions).length} positions`); + await page.close(); + } + + await browser.close(); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); From 5f0109599cf0b650fe6a741ab580f5c1c412c80d Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Fri, 29 May 2026 15:11:28 +0900 Subject: [PATCH 08/10] test: stabilize flaky pro CSV-import e2e (#806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pro.spec.ts:118 ("Create chart from imported data") flaked ~4x across recent PRs, always in the import->confirm flow against the Vercel preview: sometimes the "9 nodes and 10 edges" confirmation didn't appear within the 5s default (line 158), sometimes the confirm click hung to the 120s test timeout (line 160). Both are preview-timing issues, not product bugs. - Bump the confirmation toBeVisible timeout to 30s and wait for the confirm button to be actionable before clicking. - Add CI retries (retries: isCI ? 2 : 0) — the standard mitigation for e2e against a live preview. Each failure was a single-attempt flake, so a retry absorbs it; a real break still fails every attempt. Local retries stay off so flakes remain visible while developing. Note: can't be proven in one run (it only flakes against CI/preview, passes locally); verification is a reduced flake rate over subsequent CI runs. Co-authored-by: Claude Opus 4.8 (1M context) --- app/e2e/pro.spec.ts | 11 +++++++++-- app/playwright.config.ts | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/e2e/pro.spec.ts b/app/e2e/pro.spec.ts index d929b05ed..2e2f6256d 100644 --- a/app/e2e/pro.spec.ts +++ b/app/e2e/pro.spec.ts @@ -153,11 +153,18 @@ test("Create chart from imported data", async () => { .selectOption("Connector Label"); await page.getByTestId("import-submit-button").click(); + // Import parsing + preview can be slow against the Vercel preview, so give + // the confirmation dialog generous time rather than the 5s default (this + // assertion has flaked at the default timeout). await expect( page.getByText("You are about to add 9 nodes and 10 edges to your graph.") - ).toBeVisible(); + ).toBeVisible({ timeout: 30000 }); - await page.getByTestId("import-confirm-button").click(); + // Wait for the confirm button to be actionable before clicking — this click + // has hung to the test timeout when the dialog was still settling. + const confirmButton = page.getByTestId("import-confirm-button"); + await confirmButton.waitFor({ state: "visible", timeout: 30000 }); + await confirmButton.click(); } catch (error) { console.error(error); throw error; diff --git a/app/playwright.config.ts b/app/playwright.config.ts index fa6655500..958a49f3e 100644 --- a/app/playwright.config.ts +++ b/app/playwright.config.ts @@ -33,6 +33,11 @@ const config: PlaywrightTestConfig = { }, }, maxFailures: 3, + // E2E runs against a live Vercel preview; some flows (notably the CSV-import + // confirmation in pro.spec) are timing-sensitive there. Retry in CI so a + // one-off flake doesn't redden the whole PR — a real break still fails every + // attempt. Locally retries stay off so flakes stay visible while developing. + retries: isCI ? 2 : 0, projects: isDebug ? [ { From 2558ed91f6d0df20e01ebdb370e4535bcc5a9222 Mon Sep 17 00:00:00 2001 From: Rob Gordon Date: Thu, 16 Jul 2026 09:48:39 -0400 Subject: [PATCH 09/10] feat: cross-link other Tone Row apps (TeamSort, Docugram) (#807) Adds outbound links to teamsort.world and docugram.app in crawlable, human-sensible places: - Sandbox homepage: credit line in the tab row above the canvas (desktop); hidden-but-in-DOM on mobile, with visible entries in the mobile menu - Pricing page: new footer with made-by + project links, plus a page title and meta description via Helmet - Settings: "More from Tone Row" section with link cards - sitemap.xml: add /pricing, /blog, /roadmap, /changelog, /s (was homepage-only since 2021); robots.txt now declares the sitemap Shared data lives in lib/toneRowProjects.ts. Co-authored-by: Claude Fable 5 --- app/public/robots.txt | 4 +- app/public/sitemap.xml | 34 ++++- app/src/components/Header.tsx | 13 ++ app/src/components/MoreFromToneRow.tsx | 46 ++++++ app/src/components/Settings.tsx | 52 +++++++ app/src/lib/toneRowProjects.ts | 22 +++ app/src/locales/de/messages.js | 2 +- app/src/locales/de/messages.po | 194 +++++++++++++++---------- app/src/locales/en/messages.js | 2 +- app/src/locales/en/messages.po | 194 +++++++++++++++---------- app/src/locales/es/messages.js | 2 +- app/src/locales/es/messages.po | 194 +++++++++++++++---------- app/src/locales/fr/messages.js | 2 +- app/src/locales/fr/messages.po | 194 +++++++++++++++---------- app/src/locales/hi/messages.js | 2 +- app/src/locales/hi/messages.po | 194 +++++++++++++++---------- app/src/locales/ko/messages.js | 2 +- app/src/locales/ko/messages.po | 194 +++++++++++++++---------- app/src/locales/pt-br/messages.js | 2 +- app/src/locales/pt-br/messages.po | 194 +++++++++++++++---------- app/src/locales/zh/messages.js | 2 +- app/src/locales/zh/messages.po | 194 +++++++++++++++---------- app/src/pages/Pricing2.tsx | 44 ++++++ app/src/pages/Sandbox.tsx | 2 + 24 files changed, 1137 insertions(+), 648 deletions(-) create mode 100644 app/src/components/MoreFromToneRow.tsx create mode 100644 app/src/lib/toneRowProjects.ts diff --git a/app/public/robots.txt b/app/public/robots.txt index 14267e903..c420ffb78 100644 --- a/app/public/robots.txt +++ b/app/public/robots.txt @@ -1,2 +1,4 @@ User-agent: * -Allow: / \ No newline at end of file +Allow: / + +Sitemap: https://flowchart.fun/sitemap.xml diff --git a/app/public/sitemap.xml b/app/public/sitemap.xml index 1cd99c37f..b2c85703d 100644 --- a/app/public/sitemap.xml +++ b/app/public/sitemap.xml @@ -1,7 +1,27 @@ - - - -https://flowchart.fun/ -2021-04-16 - - \ No newline at end of file + + + +https://flowchart.fun/ +2026-07-16 + + +https://flowchart.fun/pricing +2026-07-16 + + +https://flowchart.fun/blog +2026-07-16 + + +https://flowchart.fun/roadmap +2026-07-16 + + +https://flowchart.fun/changelog +2026-07-16 + + +https://flowchart.fun/s +2026-07-16 + + diff --git a/app/src/components/Header.tsx b/app/src/components/Header.tsx index 7eec86bc2..aa1665998 100644 --- a/app/src/components/Header.tsx +++ b/app/src/components/Header.tsx @@ -5,6 +5,7 @@ import * as Dialog from "@radix-ui/react-dialog"; import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; import * as NavigationMenu from "@radix-ui/react-navigation-menu"; import { + ArrowSquareOut, Chat, DiscordLogo, Folder, @@ -39,6 +40,7 @@ import { } from "../lib/hooks"; import { track } from "../lib/track"; import { useLastChart } from "../lib/useLastChart"; +import { toneRowProjects } from "../lib/toneRowProjects"; import { ReactComponent as BrandSvg } from "./brand.svg"; export const Header = memo(function SharedHeader() { @@ -456,6 +458,17 @@ function MobileHeader({ className="mobile-only" to="/privacy-policy" /> + {toneRowProjects.map((project) => ( + } + href={project.href} + target="_blank" + rel="noopener" + className="mobile-only" + /> + ))} diff --git a/app/src/components/MoreFromToneRow.tsx b/app/src/components/MoreFromToneRow.tsx new file mode 100644 index 000000000..a0d399544 --- /dev/null +++ b/app/src/components/MoreFromToneRow.tsx @@ -0,0 +1,46 @@ +import { Trans } from "@lingui/macro"; +import { Fragment } from "react"; +import { useLocation } from "react-router-dom"; +import classNames from "classnames"; + +import { TONE_ROW_URL, toneRowProjects } from "../lib/toneRowProjects"; + +const linkClasses = + "hover:text-blue-600 dark:hover:text-blue-400 transition-colors"; + +/** + * A discreet credit line for the sandbox homepage, shown in the tab row + * above the graph canvas on desktop. On mobile it stays in the DOM but + * hidden (like the rest of the desktop nav), which is enough for crawlers + * to follow the outbound links; the visible mobile placement is the links + * in the mobile menu (Header.tsx). + */ +export function MoreFromToneRow({ className }: { className?: string }) { + const { pathname } = useLocation(); + if (pathname !== "/") return null; + return ( +

+ + Made by{" "} + + Tone Row + + + {" · "} + More tools:{" "} + {toneRowProjects.map((project, i) => ( + + {i > 0 && " · "} + + {project.name} + + + ))} +
+ ); +} diff --git a/app/src/components/Settings.tsx b/app/src/components/Settings.tsx index 08ca96936..b6d08f93d 100644 --- a/app/src/components/Settings.tsx +++ b/app/src/components/Settings.tsx @@ -8,6 +8,7 @@ import { PageTitle, SectionTitle } from "../ui/Typography"; import { AppContext } from "./AppContextProvider"; import styles from "./Settings.module.css"; import { DISCORD_URL } from "../lib/constants"; +import { toneRowProjects } from "../lib/toneRowProjects"; const Settings = memo(() => { const { updateUserSettings, mode, language } = useContext(AppContext); @@ -128,6 +129,22 @@ const Settings = memo(() => { +
+ + More from Tone Row + +
+ {toneRowProjects.map((project) => ( + + ))} +
+
Support @@ -194,3 +211,38 @@ const GroupButton = memo( ); GroupButton.displayName = "GroupButton"; + +const ToneRowProject = memo( + ({ + href, + name, + domain, + description, + }: { + href: string; + name: string; + domain: string; + description: string; + }) => { + return ( + + + {name}{" "} + + {domain} + + + + {description} + + + ); + } +); + +ToneRowProject.displayName = "ToneRowProject"; diff --git a/app/src/lib/toneRowProjects.ts b/app/src/lib/toneRowProjects.ts new file mode 100644 index 000000000..8aa008e89 --- /dev/null +++ b/app/src/lib/toneRowProjects.ts @@ -0,0 +1,22 @@ +import { t } from "@lingui/macro"; + +export const TONE_ROW_URL = "https://tone-row.com"; + +/** + * Other Tone Row apps, cross-linked from the homepage, pricing page, and + * settings page. Descriptions are lazy so they resolve in the active locale. + */ +export const toneRowProjects = [ + { + name: "TeamSort", + domain: "teamsort.world", + href: "https://teamsort.world", + description: () => t`Group ranking and ranked-choice voting, free`, + }, + { + name: "Docugram", + domain: "docugram.app", + href: "https://docugram.app", + description: () => t`Turn documents into diagrams with AI`, + }, +]; diff --git a/app/src/locales/de/messages.js b/app/src/locales/de/messages.js index 93df5ec82..d439e73b7 100644 --- a/app/src/locales/de/messages.js +++ b/app/src/locales/de/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"48€/Jahr (33% sparen) · Jederzeit kündbar","$6/mo":"6€/Monat","1 Temporary Flowchart":"1 Vorläufiger Flussdiagramm","1 diagram at a time":"1 Diagramm zur gleichen Zeit","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Nur benutzerdefiniertes CSS ist aktiviert. Nur die Layout- und Erweiterten Einstellungen werden angewandt.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun ist ein Open-Source-Projekt von <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Anmelden / <1>Registrieren mit E-Mail und Passwort","A new version of the app is available. Please reload to update.":"Eine neue Version der App ist verfügbar. Bitte neu laden, um zu aktualisieren.","AI Creation & Editing":"KI-Erstellung & Bearbeitung","AI generation & editing":"KI-Generierung & Bearbeitung","AI-Powered Flowchart Creation":"KI-unterstützte Erstellung von Flussdiagrammen","AI-generated from plain text in under 5 seconds.":"In unter 5 Sekunden aus einfachem Text generiert.","AI-powered editing to supercharge your workflow":"KI-unterstützte Bearbeitung zur Beschleunigung Ihres Arbeitsablaufs","About":"Über","Account":"Konto","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Fügen Sie einen Backslash (<0>\\\\) vor jedem Sonderzeichen ein: <1>(, <2>:, <3>#, oder <4>.`","Add some steps":"Füge einige Schritte hinzu","Advanced":"Fortgeschritten","Align Horizontally":"Horizontal ausrichten","Align Nodes":"Ausrichten von Knoten","Align Vertically":"Vertikal ausrichten","All this for just $6/month - less than your daily coffee ☕":"All dies für nur $6/Monat - weniger als Ihr täglicher Kaffee ☕","Always presentation-ready":"Immer präsentationsbereit","Amount":"Betrag","An error occurred. Try resubmitting or email {0} directly.":["Es ist ein Fehler aufgetreten. Versuchen Sie, es erneut einzureichen oder senden Sie eine E-Mail direkt an ",["0"],"."],"Appearance":"Erscheinungsbild","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Sind Sie sicher, dass Sie den Flussdiagramm löschen möchten? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Sind Sie sicher, dass Sie den Ordner löschen möchten? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Sind Sie sicher, dass Sie den Ordner löschen möchten? ","Are you sure?":"Bist du sicher?","Arrow Size":"Größe des Pfeils","Attributes":"Attribute","August 2023":"August 2023","Back":"Zurück","Back To Editor":"Zurück zum Editor","Background Color":"Hintergrundfarbe","Basic Flowchart":"Grundlegender Flussdiagramm","Become a Github Sponsor":"Werden Sie ein Github-Sponsor","Become a Pro User":"Werden Sie ein Pro-Benutzer","Begin your journey":"Beginne deine Reise","Billed annually at $48":"Jährlich abgerechnet für $48","Billed monthly at $6":"Monatlich für $6 berechnet","Blog":"Blog","Book a Meeting":"Ein Treffen buchen","Border Color":"Rahmenfarbe","Border Width":"Rahmenbreite","Bottom to Top":"Von unten nach oben","Breadthfirst":"In die Breite","Build your personal flowchart library":"Erstellen Sie Ihre persönliche Flussdiagramm-Bibliothek","Can I import my existing diagrams?":"Kann ich meine bestehenden Diagramme importieren?","Cancel":"Abbrechen","Cancel anytime":"Jederzeit kündbar","Cancel your subscription. Your hosted charts will become read-only.":"Kündigen Sie Ihr Abonnement. Ihre gehosteten Diagramme werden schreibgeschützt.","Certain attributes can be used to customize the appearance or functionality of elements.":"Bestimmte Attribute können verwendet werden, um das Aussehen oder die Funktionalität von Elementen anzupassen.","Change Email Address":"E-Mail Adresse ändern","Changelog":"Änderungsprotokoll","Charts":"Diagramme","Check out the guide:":"Schau dir die Anleitung an:","Check your email for a link to log in.<0/>You can close this window.":"Überprüfen Sie Ihre E-Mail auf einen Link zum Einloggen. Sie können dieses Fenster schließen.","Choose":"Wählen","Choose Template":"Vorlage auswählen","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Wählen Sie aus einer Vielzahl von Pfeilformen für die Quelle und das Ziel einer Kante aus. Formen beinhalten Dreieck, Dreieck-Tee, Kreis-Dreieck, Dreieck-Kreuz, Dreieck-Rückbiegung, Vee, Tee, Quadrat, Kreis, Diamant, Chevron und keine.","Choose how edges connect between nodes":"Wählen Sie, wie Kanten zwischen Knoten verbunden werden","Choose how nodes are automatically arranged in your flowchart":"Wählen Sie aus, wie Knoten automatisch in Ihrem Flussdiagramm angeordnet werden","Circle":"Kreis","Classes":"Klassen","Clear":"Löschen","Clear text?":"Text löschen?","Clone":"Klon","Clone Flowchart":"Flussdiagramm klonen ","Close":"Schließen","Color":"Farbe","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Farben beinhalten Rot, Orange, Gelb, Blau, Violett, Schwarz, Weiß und Grau.","Column":"Spalte","Comment":"Kommentar","Community templates":"Community-Vorlagen","Compare our plans and find the perfect fit for your flowcharting needs":"Vergleichen Sie unsere Pläne und finden Sie die perfekte Lösung für Ihre Flussdiagramm-Bedürfnisse","Concentric":"Konzentrisch","Confirm New Email":"Neue E-Mail bestätigen","Confirm your email address to sign in.":"Bestätigen Sie Ihre E-Mail-Adresse, um sich anzumelden.","Connect your Data":"Verbinden Sie Ihre Daten","Containers":"Behälter","Containers are nodes that contain other nodes. They are declared using curly braces.":"Container sind Knoten, die andere Knoten enthalten. Sie werden mit geschweiften Klammern deklariert.","Continue":"Weiter","Continue in Sandbox (Resets daily, work not saved)":"Weiter im Sandbox-Modus (wird täglich zurückgesetzt, Arbeit wird nicht gespeichert)","Controls the flow direction of hierarchical layouts":"Steuert die Flussrichtung von hierarchischen Layouts","Convert":"Umwandeln","Convert to Flowchart":"In Flussdiagramm konvertieren","Convert to hosted chart?":"In gehostetes Diagramm konvertieren?","Cookie Policy":"Cookie-Richtlinie","Copied SVG code to clipboard":"SVG-Code in Zwischenablage kopiert","Copied {format} to clipboard":[["Format"]," in Zwischenablage kopiert"],"Copy":"Kopieren","Copy PNG Image":"PNG-Bild kopieren","Copy SVG Code":"Kopieren Sie den SVG-Code","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Kopiere deinen Excalidraw-Code und füge ihn in <0>excalidraw.com ein, um ihn zu bearbeiten. Diese Funktion ist experimentell und funktioniert möglicherweise nicht mit allen Diagrammen. Wenn du einen Fehler findest, <1>lass es uns wissen.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Kopieren Sie Ihren mermaid.js-Code oder öffnen Sie ihn direkt im mermaid.js Live-Editor.","Create":"Erstellen","Create Flowcharts using AI":"Erstellen Sie Flussdiagramme mit KI","Create Unlimited Flowcharts":"Erstellen Sie unbegrenzte Flussdiagramme","Create a New Chart":"Nein Diagramm erstellen","Create a flowchart showing the steps of planning and executing a school fundraising event":"Erstelle einen Flussdiagramm, das die Schritte zur Planung und Durchführung eines Schul-Fundraising-Events zeigt","Create a new flowchart to get started or organize your work with folders.":"Erstellen Sie ein neues Flussdiagramm, um zu beginnen oder organisieren Sie Ihre Arbeit mit Ordnern. ","Create flowcharts instantly: Type or paste text, see it visualized.":"Erstellen Sie sofort Flussdiagramme: Tippen oder fügen Sie Text ein, sehen Sie ihn visualisiert.","Create unlimited diagrams for just $6/month!":"Erstellen Sie unbegrenzt Diagramme für nur $6/Monat!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Erstellen Sie unbegrenzte Flussdiagramme, die in der Cloud gespeichert sind und überall zugänglich sind!","Create with AI":"Erstellen mit KI","Created Date":"Erstellungsdatum","Creating an edge between two nodes is done by indenting the second node below the first":"Eine Kante zwischen zwei Knoten wird erstellt, indem der zweite Knoten unter dem ersten eingerückt wird","Curve Style":"Kurvenstil","Custom CSS":"Benutzerdefiniertes CSS","Custom Sharing Options":"Benutzerdefinierte Freigabeoptionen","Custom sharing & public links":"Individuelle Freigabe und öffentliche Links","Customer Portal":"Kundenportal","Daily Sandbox Editor":"Täglicher Sandbox-Editor","Dark":"Dunkel","Dark Mode":"Dunkelmodus","Data Import (Visio, Lucidchart, CSV)":"Datenimport (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Datenimportfunktion für komplexe Diagramme","Date":"Datum","Delete":"Löschen","Delete {0}":["Lösche ",["0"]],"Describe it and it appears":"Beschreiben Sie es und es erscheint","Describe your idea. Get a diagram worth presenting.":"Beschreiben Sie Ihre Idee. Erhalten Sie ein präsentationswürdiges Diagramm.","Design a software development lifecycle flowchart for an agile team":"Entwerfe einen Software-Entwicklungs-Lebenszyklus-Flussdiagramm für ein agiles Team","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Entwickle einen Entscheidungsbaum für einen CEO, um potenzielle neue Marktmöglichkeiten zu bewerten.","Direction":"Richtung","Dismiss":"Entlassen","Do you offer discounts for students or nonprofits?":"Bieten Sie Rabatte für Studenten oder gemeinnützige Organisationen an?","Do you want to delete this?":"Möchten Sie dies löschen?","Document":"Document","Don\'t Lose Your Work":"Verliere deine Arbeit nicht","Download":"Herunterladen","Download JPG":"JPG herunterladen","Download PNG":"PNG herunterladen","Download SVG":"SVG herunterladen","Drag and drop a CSV file here, or click to select a file":"Ziehen Sie eine CSV-Datei hierher oder klicken Sie, um eine Datei auszuwählen","Draw an edge from multiple nodes by beginning the line with a reference":"Zeichnen Sie eine Kante von mehreren Knoten, indem Sie die Zeile mit einer Referenz beginnen.","Drop the file here ...":"Datei hier ablegen ...","Each line becomes a node":"Jede Zeile wird zu einem Knoten","Edge ID, Classes, Attributes":"Kante-ID, Klassen, Attribute","Edge Label":"Kantenbeschriftung","Edge Label Column":"Spalte mit Kantenbeschriftung","Edge Style":"Kantenstil","Edge Text Size":"Kanten Textgröße","Edge missing indentation":"Kante fehlende Einrückung","Edges":"Kanten","Edges are declared in the same row as their source node":"Kanten werden in der gleichen Zeile wie ihr Quellknoten deklariert","Edges are declared in the same row as their target node":"Kanten werden in der gleichen Zeile wie ihr Zielknoten deklariert","Edges are declared in their own row":"Kanten werden in ihrer eigenen Zeile deklariert","Edges can also have ID\'s, classes, and attributes before the label":"Kanten können auch ID\'s, Klassen und Attribute vor der Bezeichnung haben","Edges can be styled with dashed, dotted, or solid lines":"Kanten können mit gestrichelten, punktierten oder soliden Linien gestaltet werden","Edges in Separate Rows":"Kanten in separaten Zeilen","Edges in Source Node Row":"Kanten in Quellknotenzeile","Edges in Target Node Row":"Kanten in Zielknotenzeile","Edit":"Bearbeiten","Edit with AI":"Mit KI bearbeiten","Editable":"Editierbar","Editor":"Editor","Email":"E-Mail","Empty":"Leer","Enable to set a consistent height for all nodes":"Aktivieren Sie die Einstellung einer einheitlichen Höhe für alle Knoten","Enter a name for the cloned flowchart.":"Geben Sie einen Namen für den geklonten Flussdiagramm ein.","Enter a name for the new folder.":"Geben Sie einen Namen für den neuen Ordner ein.","Enter a new name for the {0}.":["Geben Sie einen neuen Namen für den ",["0"]," ein."],"Enter your email address and we\'ll send you a magic link to sign in.":"Geben Sie Ihre E-Mail-Adresse ein, und wir senden Ihnen einen magischen Link, um sich anzumelden.","Enter your email address below and we\'ll send you a link to reset your password.":"Geben Sie unten Ihre E-Mail-Adresse ein, und wir senden Ihnen einen Link, um Ihr Passwort zurückzusetzen.","Equal To":"Gleich","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Jedes Diagramm wird als gestochen scharfes PNG, SVG oder teilbarer Link exportiert - bereit für das Meeting, das Dokument oder die Präsentation.","Everything you need to know about Flowchart Fun Pro":"Alles, was du über Flowchart Fun Pro wissen musst","Examples":"Beispiele","Excalidraw":"Excalidraw","Exclusive Office Hours":"Exklusive Bürozeiten","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Erleben Sie die Effizienz und Sicherheit des direkten Ladens lokaler Dateien in Ihre Flussdiagramme, ideal für die Verwaltung von Arbeitsdokumenten offline. Entsperren Sie diese exklusive Pro-Funktion und mehr mit Flowchart Fun Pro, erhältlich für nur $6/Monat.","Explore Pro":"Erkunde Pro","Explore more":"Erkunde mehr","Export":"Exportieren","Export clean diagrams without branding":"Exportieren Sie saubere Diagramme ohne Branding","Export to PNG & JPG":"Exportieren Sie nach PNG & JPG","Export to PNG, JPG, and SVG":"Exportieren Sie nach PNG, JPG und SVG","Feature Breakdown":"Funktionsübersicht","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Fühlen Sie sich frei, zu erkunden und uns über die <0>Feedback-Seite zu kontaktieren, sollten Sie irgendwelche Bedenken haben.","Fine-tune layouts and visual styles":"Feinabstimmung von Layouts und visuellen Stilen","Fixed Height":"Feste Höhe","Fixed Node Height":"Fester Knotenhöhe","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Mit Flowchart Fun Pro erhalten Sie unbegrenzte Flussdiagramme, unbegrenzte Mitarbeiter und unbegrenzten Speicherplatz für nur $6/Monat.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun wird von einem Entwickler gebaut und gepflegt. Deine Unterstützung hält es am Laufen.","Follow Us on Twitter":"Folgen Sie uns auf Twitter","Font Family":"Schriftfamilie","Forgot your password?":"Haben Sie Ihr Passwort vergessen?","Free":"Kostenlos","Free users: charts in the sandbox expire after 7 days.":"Kostenlose Benutzer: Diagramme im Sandbox-Modus laufen nach 7 Tagen ab.","Frequently Asked Questions":"Häufig gestellte Fragen","Full-screen, read-only, and template sharing":"Vollbild, Nur-Lesen und Vorlagenfreigabe","Fullscreen":"Vollbild","General":"Allgemein","Generate flowcharts from text automatically":"Generieren Sie automatisch Flussdiagramme aus Texten","Get Pro Access Now":"Erhalten Sie jetzt Pro-Zugang","Get Unlimited AI Requests":"Erhalten Sie unbegrenzte KI-Anfragen","Get rapid responses to your questions":"Erhalten Sie schnelle Antworten auf Ihre Fragen","Get unlimited flowcharts and premium features":"Erhalten Sie unbegrenzte Flussdiagramme und Premium-Funktionen","Go back home":"Geh zurück nach Hause","Go to the Editor":"Gehe zum Editor","Go to your Sandbox":"Gehe zu deinem Sandkasten","Graph":"Diagramm","Green?":"Grün?","Grid":"Raster","Have complex questions or issues? We\'re here to help.":"Haben Sie komplexe Fragen oder Probleme? Wir sind hier, um zu helfen.","Here are some Pro features you can now enjoy.":"Hier sind einige Pro-Funktionen, die Sie jetzt genießen können.","High-quality exports with embedded fonts":"Hochwertige Exporte mit eingebetteten Schriftarten","History":"Verlauf","Home":"Startseite","How are edges declared in this data?":"Wie werden Kanten in diesen Daten deklariert?","How fast can I actually make something?":"Wie schnell kann ich tatsächlich etwas erstellen?","How would you like to save your chart?":"Wie möchten Sie Ihren Chart speichern?","I would like to request a new template:":"Ich möchte gerne eine neue Vorlage anfordern:","ID\'s":"IDs","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Wenn ein Konto mit dieser E-Mail vorhanden ist, haben wir Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts gesendet.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Wenn Sie eine Kante erstellen möchten, rücken Sie diese Zeile ein. Wenn nicht, entkomme dem Doppelpunkt mit einem Backslash <0>\\\\:","Images":"Bilder","Import Data":"Daten importieren","Import data from a CSV file.":"Daten aus einer CSV-Datei importieren.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Daten aus jeder CSV-Datei importieren und auf einem neuen Flussdiagramm abbilden. Dies ist eine großartige Möglichkeit, Daten aus anderen Quellen wie Lucidchart, Google Sheets und Visio zu importieren.","Import from CSV":"Importieren Sie aus CSV","Import from Visio, Lucidchart, CSV":"Importiere aus Visio, Lucidchart, CSV.","Import from Visio, Lucidchart, and CSV":"Importieren Sie von Visio, Lucidchart und CSV","Import from anywhere":"Aus beliebiger Quelle importieren","Import from popular diagram tools":"Importieren Sie aus beliebten Diagramm-Tools","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importieren Sie Ihr Diagramm mithilfe einer dieser CSV-Dateien in Microsoft Visio.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Der Import von Daten ist eine Pro-Funktion. Sie können auf Flowchart Fun Pro für nur $6/Monat upgraden.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Fügen Sie einen Titel mit einem <0>title-Attribut ein. Um die Visio-Farbgebung zu verwenden, fügen Sie ein <1>roleType-Attribut gleich einem der folgenden hinzu:","Indent to connect nodes":"Rücke ein, um Knoten zu verbinden","Info":"Info","Is":"Ist","Is my data private?":"Ist meine Daten privat?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas ist eine JSON-Repräsentation Ihres Diagramms, die von <0>Obsidian Canvas und anderen Anwendungen verwendet wird.","Join 2000+ professionals who\'ve upgraded their workflow":"Werden Sie Teil von über 2000 Fachleuten, die ihren Arbeitsablauf verbessert haben","Join thousands of happy users who love Flowchart Fun":"Werde Teil von Tausenden zufriedenen Nutzern, die Flowchart Fun lieben","Keep Things Private":"Halte Dinge privat","Keep changes?":"Änderungen speichern?","Keep practicing":"Übe weiter","Keep your data private on your computer":"Halten Sie Ihre Daten privat auf Ihrem Computer","Language":"Sprache","Layout":"Layout","Layout Algorithm":"Layout-Algorithmus","Layout Frozen":"Layout eingefroren","Leading References":"Führende Referenzen","Learn More":"Mehr erfahren","Learn Syntax":"Syntax lernen","Learn about Flowchart Fun Pro":"Erfahren Sie mehr über Flowchart Fun Pro","Left to Right":"Von links nach rechts","Let us know why you\'re canceling. We\'re always looking to improve.":"Lassen Sie uns wissen, warum Sie stornieren. Wir sind immer auf der Suche nach Verbesserungen.","Light":"Hell","Light Mode":"Heller Modus","Link":"Link","Link back":"Verlinke zurück","Load":"Laden","Load Chart":"Chart laden","Load File":"Datei laden","Load Files":"Dateien laden","Load default content":"Standardinhalt laden","Load from link?":"Von Link laden?","Load layout and styles":"Layout und Stile laden","Loading...":"Wird geladen...","Local File Support":"Lokale Dateiunterstützung","Local saving for offline access":"Lokales Speichern für den Offline-Zugriff","Lock Zoom to Graph":"Zoom an Graph anpassen","Log In":"Anmelden","Log Out":"Abmelden","Log in to Save":"Einloggen, um zu speichern","Log in to upgrade your account":"Melde dich an, um dein Konto zu aktualisieren","Make a One-Time Donation":"Machen Sie eine einmalige Spende","Make it yours":"Mach es zu deinem","Make publicly accessible":"Öffentlich zugänglich machen","Manage Billing":"Abrechnung verwalten","Map Data":"Daten abbilden","Maximum width of text inside nodes":"Maximale Breite des Textes innerhalb der Knoten","Monthly":"Monatlich","Move":"Verschieben","Move {0}":["Verschieben ",["0"]],"Multiple pointers on same line":"Mehrere Zeiger auf derselben Zeile","My dog ate my credit card!":"Mein Hund hat meine Kreditkarte gefressen!","Name":"Name","Name Chart":"Diagramm benennen","Name your chart":"Benennen Sie Ihren Chart","New":"Neues","New Email":"Neue e-mail","New Flowchart":"Neue Flussdiagramm","New Folder":"Neuer Ordner","Next charge":"Nächste Gebühr","No Edges":"Keine Kanten","No Folder (Root)":"Kein Ordner (Hauptverzeichnis)","No Watermarks!":"Keine Wasserzeichen!","No charts yet":"Keine Diagramme vorhanden","No items in this folder":"Keine Elemente in diesem Ordner","No matching charts found":"Keine übereinstimmenden Diagramme gefunden","Node Border Style":"Knotenrahmenstil","Node Colors":"Knotenfarben","Node ID":"Knoten-ID","Node ID, Classes, Attributes":"Knoten-ID, Klassen, Attribute","Node Label":"Knotenbeschriftung","Node Shape":"Knotenform","Node Shapes":"Knotenformen","Nodes":"Knoten","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Knoten können mit gestrichelt, punktiert oder doppelt gestaltet werden. Grenzen können auch mit border_none entfernt werden.","Not Empty":"Nicht leer","Now you\'re thinking with flowcharts!":"Jetzt denkst du mit Flussdiagrammen!","Office Hours":"Geschäftszeiten","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"legentlich landet der magische Link in Ihrem Spam-Ordner. Wenn Sie ihn nach ein paar Minuten nicht sehen, überprüfen Sie dort oder fordern Sie einen neuen Link an.","One on One Support":"Eins-zu-eins-Unterstützung","One-on-One Support":"One-on-One-Support","Open Customer Portal":"Öffnen Sie das Kundenportal","Operation canceled":"Operation abgebrochen","Or maybe blue!":"Oder vielleicht blau!","Organization Chart":"Organigramm","PNG & JPG export":"PNG- und JPG-Export","Padding":"Polsterung","Page not found":"Seite nicht gefunden","Password":"Passwort","Past Due":"Überfällig","Paste a document to convert it":"Füge ein Dokument ein, um es zu konvertieren","Paste your document or outline here to convert it into an organized flowchart.":"Fügen Sie Ihr Dokument oder Ihre Gliederung hier ein, um es in einen organisierten Flussdiagramm umzuwandeln.","Pasted content detected. Convert to Flowchart Fun syntax?":"Eingefügter Inhalt erkannt. In Flowchart Fun-Syntax konvertieren?","Perfect for docs and quick sharing":"Perfekt für Dokumente und schnelles Teilen","Permanent Charts are a Pro Feature":"Permanente Diagramme sind eine Pro-Funktion","Playbook":"Spielbuch","Pointer and container on same line":"Zeiger und Container auf derselben Zeile","Priority One-on-One Support":"Priorisierte Einzelunterstützung","Priority support":"Prioritätssupport","Privacy Policy":"Datenschutzerklärung","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro beginnt bei $4/Monat jährlich abgerechnet. Jederzeit kündbar.","Pro tip: Right-click any node to customize its shape and color":"Pro-Tipp: Klicken Sie mit der rechten Maustaste auf einen Knoten, um seine Form und Farbe anzupassen.","Processing Data":"Datenverarbeitung","Processing...":"Verarbeitung...","Prompt":"Aufforderung","Public":"Öffentlich","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Daten von Visio, Lucidchart, CSV importieren oder mit einer Vorlage beginnen. Kein erneutes Erstellen von bereits vorhandenen Inhalten.","Quick experimentation space that resets daily":"Schneller Experimentierraum, der täglich zurückgesetzt wird","Random":"Zufällig","Rapid Deployment Templates":"Schnellbereitstellungsvorlagen","Rapid Templates":"Schnelle Vorlagen","Raster Export (PNG, JPG)":"Raster-Export (PNG, JPG)","Rate limit exceeded. Please try again later.":"Die Rate-Limit wurde überschritten. Bitte versuchen Sie es später erneut.","Read-only":"Schreibgeschützt","Reference by Class":"Referenz nach Klasse","Reference by ID":"Referenz nach ID","Reference by Label":"Referenz nach Label","References":"Referenzen","References are used to create edges between nodes that are created elsewhere in the document":"Referenzen werden verwendet, um Kanten zwischen Knoten zu erstellen, die anderswo im Dokument erstellt werden","Referencing a node by its exact label":"Referenzierung eines Knotens durch sein exaktes Label","Referencing a node by its unique ID":"Referenzierung eines Knotens durch seine eindeutige ID","Referencing multiple nodes with the same assigned class":"Mehrere Knoten mit der selben zugewiesenen Klasse referenzieren","Refresh Page":"Seite aktualisieren","Reload to Update":"Neu laden, um zu aktualisieren","Rename":"Umbenennen","Rename {0}":[["0"]," umbenennen"],"Request Magic Link":"Magic-Link anfordern","Request Password Reset":"Passwort zurücksetzen anfordern","Reset":"Zurücksetzen","Reset Password":"Passwort zurücksetzen","Resume Subscription":"Abonnement fortsetzen","Return":"Zurückkehren","Right to Left":"Von rechts nach links","Right-click nodes for options":"Klicke mit der rechten Maustaste auf Knoten für Optionen","Roadmap":"Fahrplan","Rotate Label":"Label drehen","SVG Export is a Pro Feature":"SVG-Export ist eine Pro-Funktion","SVG, PDF & all export formats":"SVG, PDF und alle Exportformate","Satisfaction guaranteed or first payment refunded":"Zufriedenheitsgarantie oder erste Zahlung erstattet","Save":"Speichern","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Lokal speichern, offline arbeiten und genau kontrollieren, wer was sieht. Keine Daten verlassen Ihren Computer, es sei denn, Sie sagen es.","Save time with AI and dictation, making it easy to create diagrams.":"Sparen Sie Zeit mit KI und Diktat, um Diagramme einfach zu erstellen.","Save to Cloud":"In die Cloud speichern","Save to File":"In Datei speichern","Save your Work":"Speichern Sie Ihre Arbeit","Schedule personal consultation sessions":"Persönliche Beratungssitzungen planen","Secure payment":"Sichere Zahlung","See more reviews on Product Hunt":"Schau dir weitere Bewertungen auf Product Hunt an","See what\'s possible":"Sehen, was möglich ist","Select a destination folder for \\"{0}\\".":"Wählen Sie einen Zielordner für \\\\","Send us a message":"Schreiben Sie uns eine Nachricht","Set a consistent height for all nodes":"Legen Sie eine einheitliche Höhe für alle Knoten fest","Settings":"Einstellungen","Share":"Teilen","Sign In":"Anmelden","Sign in with <0>GitHub":"Anmelden mit <0>GitHub","Sign in with <0>Google":"Anmelden mit <0>Google","Sorry! This page is only available in English.":"Entschuldigung! Diese Seite ist nur auf Englisch verfügbar.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Entschuldigung, es gab einen Fehler bei der Konvertierung des Textes in einen Flussdiagramm. Versuchen Sie es später erneut.","Sort Ascending":"Aufsteigend sortieren","Sort Descending":"Absteigend sortieren","Sort by {0}":["Sortieren nach ",["0"]],"Source Arrow Shape":"Pfeilform der Quelle","Source Column":"Quellspalte","Source Delimiter":"Quell-Trennzeichen","Source Distance From Node":"Abstand der Quelle vom Knoten","Source/Target Arrow Shape":"Quelle/Ziel-Pfeilform","Spacing":"Abstand","Special Attributes":"Spezielle Attribute","Start":"Start","Start Over":"Von vorne anfangen","Start faster with use-case specific templates":"Schnellerer Einstieg mit anwendungsspezifischen Vorlagen","Start for free":"Kostenlos starten","Status":"Status","Step 1":"Schritt 1","Step 2":"Schritt 2","Step 3":"Schritt 3","Store any data associated to a node":"Speichern Sie alle Daten, die einem Knoten zugeordnet sind","Style Classes":"Stil-Klassen","Style with classes":"Mit Klassen gestalten","Submit":"Einsenden","Subscription":"Abonnement","Subscription Successful!":"Abonnement erfolgreich!","Subscription will end":"Abonnement wird beendet","Support":"Unterstützung","Target Arrow Shape":"Pfeilform des Ziels","Target Column":"Ziel-Spalte","Target Delimiter":"Ziel-Trennzeichen","Target Distance From Node":"Zielabstand vom Knoten ","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Sage dem AI in einfachem Englisch, was du brauchst. Dein Diagramm wird in Sekundenschnelle erstellt.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Sag uns, was funktioniert und was nicht. Jede Nachricht wird vom Entwickler gelesen.","Text Color":"Textfarbe ","Text Horizontal Offset":"Text Horizontaler Versatz","Text Leading":"Textführung ","Text Max Width":"Text Max Breite","Text Vertical Offset":"Textvertikaler Abstand ","Text followed by colon+space creates an edge with the text as the label":"Text gefolgt von Doppelpunkt + Leerzeichen erstellt eine Kante mit dem Text als Label","Text on a line creates a node with the text as the label":"Text in einer Zeile erstellt einen Knoten mit dem Text als Label","Thank you for your feedback!":"Danke für Ihr Feedback!","The beauty and magic reside in the minimalism.":"Die Schönheit und Magie stecken im Minimalismus.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"Der beste Weg, um Stile zu ändern, besteht darin, mit der rechten Maustaste auf einen Knoten oder eine Kante zu klicken und den gewünschten Stil auszuwählen.","The column that contains the edge label(s)":"Die Spalte, die die Kantenbeschriftung(en) enthält","The column that contains the source node ID(s)":"Die Spalte, die die Quellknoten-ID(en) enthält","The column that contains the target node ID(s)":"Die Spalte, die die Zielknoten-ID(en) enthält","The delimiter used to separate multiple source nodes":"Der Trennzeichen, das verwendet wird, um mehrere Quellknoten zu trennen","The delimiter used to separate multiple target nodes":"Der Trennzeichen, das verwendet wird, um mehrere Zielknoten zu trennen","The fastest way to turn what\'s in your head into something everyone else can understand.":"Der schnellste Weg, um das, was in deinem Kopf ist, in etwas zu verwandeln, das jeder andere verstehen kann.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"Der kostenlose Plan eignet sich hervorragend für den täglichen Gebrauch. Wenn du Pro-Funktionen benötigst, ist es monatlich für $6 erhältlich - jederzeit kündbar ohne Verpflichtung.","The possible shapes are:":"Die möglichen Formen sind:","Theme":"Thema ","Theme Customization Editor":"Theme-Anpassungseditor","Theme Editor":"Themen-Editor","Theme editor":"Design-Editor","There are no edges in this data":"Es gibt keine Kanten in diesen Daten","This action cannot be undone.":"Diese Aktion kann nicht rückgängig gemacht werden.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Diese Funktion ist nur für Pro-Benutzer verfügbar. <0>Werden Sie Pro-Nutzer, um es freizuschalten.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Dies kann je nach Länge Ihrer Eingabe zwischen 30 Sekunden und 2 Minuten dauern.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Diese Sandbox ist perfekt zum Experimentieren, aber denk daran - sie wird täglich zurückgesetzt. Upgrade jetzt und behalte deine aktuelle Arbeit!","This will replace the current content.":"Dies ersetzt den aktuellen Inhalt.","This will replace your current chart content with the template content.":"Dies ersetzt den aktuellen Inhalt deines Diagramms mit dem Vorlageneinhalt.","This will replace your current sandbox.":"Dies ersetzt deine aktuelle Sandbox.","Time to decide":"Zeit zum Entscheiden","Tip":"Tipp","To fix this change one of the edge IDs":"Um dies zu beheben, ändern Sie eine der Kanten-IDs","To fix this change one of the node IDs":"Um das zu beheben, ändern Sie eine der Knoten-IDs","To fix this move one pointer to the next line":"Um das zu beheben, verschieben Sie einen Zeiger auf die nächste Zeile","To fix this start the container <0/> on a different line":"Um dies zu beheben, starten Sie den Container <0/> auf einer anderen Zeile.","To learn more about why we require you to log in, please read <0>this blog post.":"Um mehr darüber zu erfahren, warum wir Sie zum Anmelden auffordern, lesen Sie bitte <0>diesen Blog-Beitrag.","Top to Bottom":"Von oben nach unten","Transform Your Ideas into Professional Diagrams in Seconds":"Transformieren Sie Ihre Ideen in professionelle Diagramme in Sekunden","Transform text into diagrams instantly":"Verwandeln Sie Texte sofort in Diagramme","Try AI":"Probieren Sie KI","Try adjusting your search or filters to find what you\'re looking for.":"Versuche, deine Suche oder Filter anzupassen, um das Gewünschte zu finden.","Try again":"Erneut versuchen","Try it free":"Kostenlos ausprobieren","Two edges have the same ID":"Zwei Kanten haben die gleiche ID","Two nodes have the same ID":"Zwei Knoten haben die gleiche ID","Type it. See it.":"Schreib es. Sieh es.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Oh oh, du hast keine kostenlosen Anfragen mehr! Upgrade auf Flowchart Fun Pro für unbegrenzte Diagramm-Konvertierungen und verwandle Text weiterhin mühelos in klare, visuelle Flussdiagramme wie durch Kopieren und Einfügen.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Unter 60 Sekunden. Tippe ein paar Zeilen Text ein oder beschreibe der KI, was du brauchst, und dein Diagramm erscheint sofort. Exportiere oder teile es mit nur einem Klick.","Undo":"Rückgängig","Unescaped special character":"Nicht maskiertes Sonderzeichen","Unique text value to identify a node":"Einzigartiger Textwert, um einen Knoten zu identifizieren","Unknown":"Unbekannt","Unknown Parsing Error":"Unbekannter Parser-Fehler","Unlimited Flowcharts":"Unbegrenzte Flowcharts","Unlimited Permanent Flowcharts":"Unbegrenzte permanente Flowcharts","Unlimited cloud-saved flowcharts":"Unbegrenzte in der Cloud gespeicherte Flussdiagramme","Unlimited saved diagrams":"Unbegrenzt gespeicherte Diagramme","Unlock AI Features and never lose your work with a Pro account.":"Entsperren Sie KI-Funktionen und verlieren Sie nie wieder Ihre Arbeit mit einem Pro-Konto.","Unlock Unlimited AI Flowcharts":"Entsperren Sie unbegrenzte AI-Flussdiagramme","Unpaid":"Unbezahlt","Update Email":"E-Mail aktualisieren","Updated Date":"Aktualisierungsdatum ","Upgrade Now - Save My Work":"Jetzt upgraden - Meine Arbeit speichern","Upgrade to Flowchart Fun Pro and unlock:":"Upgrade auf Flowchart Fun Pro und schalte frei:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Upgrade auf Flowchart Fun Pro, um SVG-Export freizuschalten und mehr fortschrittliche Funktionen für Ihre Diagramme zu nutzen.","Upgrade to Pro":"Auf Pro upgraden","Upgrade to Pro for permanent charts.":"Upgrade auf Pro für dauerhafte Charts.","Upload your File":"Laden Sie Ihre Datei hoch","Use Custom CSS Only":"Nur benutzerdefinierte CSS verwenden","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Verwenden Sie Lucidchart oder Visio? Der CSV-Import erleichtert das Abrufen von Daten aus jeder Quelle!","Use classes to group nodes":"Verwenden Sie Klassen, um Knoten zu gruppieren","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Verwenden Sie das Attribut <0>href, um einem Knoten einen Link zu setzen, der in einem neuen Tab geöffnet wird.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Verwenden Sie das Attribut <0>src, um das Bild eines Knotens zu setzen. Das Bild wird an den Knoten angepasst, sodass Sie möglicherweise die Breite und Höhe des Knotens anpassen müssen, um das gewünschte Ergebnis zu erzielen. Es werden nur öffentliche Bilder (nicht von CORS blockiert) unterstützt.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Verwenden Sie die Attribute <0>w und <1>h, um die Breite und Höhe eines Knotens explizit festzulegen.","Use the customer portal to change your billing information.":"Verwenden Sie das Kundenportal, um Ihre Rechnungsinformationen zu ändern.","Use these settings to adapt the look and behavior of your flowcharts":"Verwenden Sie diese Einstellungen, um das Aussehen und Verhalten Ihrer Flussdiagramme anzupassen","Use this file for org charts, hierarchies, and other organizational structures.":"Verwenden Sie diese Datei für Organigramme, Hierarchien und andere Organisationsstrukturen.","Use this file for sequences, processes, and workflows.":"Verwenden Sie diese Datei für Sequenzen, Prozesse und Workflows.","Use this mode to modify and enhance your current chart.":"Verwenden Sie diesen Modus, um Ihre aktuelle Tabelle zu ändern und zu verbessern.","Used at":"Verwendet bei","User":"Benutzer","Vector Export (SVG)":"Vektor-Export (SVG)","View on Github":"Auf Github ansehen","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Möchten Sie ein Flussdiagramm aus einem Dokument erstellen? Fügen Sie es in den Editor ein und klicken Sie auf \\"In Flussdiagramm umwandeln\\".","Watermark-Free Diagrams":"Wasserzeichenfreie Diagramme","Watermarks":"Wasserzeichen","Welcome to Flowchart Fun":"Willkommen bei Flowchart Spaß","What if I just need it for one project?":"Was ist, wenn ich es nur für ein Projekt brauche?","What our users are saying":"Was unsere Nutzer sagen","What\'s next?":"Was kommt als Nächstes?","What\'s this?":"Was ist das?","Width":"Breite","Width and Height":"Breite und Höhe","Will my diagrams actually look professional?":"Werden meine Diagramme tatsächlich professionell aussehen?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Mit der Pro-Version von Flowchart Fun können Sie natürliche Sprachbefehle verwenden, um schnell Ihre Flussdiagrammdetails auszuarbeiten, ideal für die Erstellung von Diagrammen unterwegs. Für 6 $/Monat erhalten Sie die Leichtigkeit der zugänglichen KI-Bearbeitung, um Ihre Flussdiagrammerfahrung zu verbessern.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Mit der Pro-Version können Sie lokale Dateien speichern und laden. Es ist perfekt für die Verwaltung von Arbeitsdokumenten offline.","Would you like to continue?":"Möchten Sie fortfahren?","Would you like to suggest a new example?":"Möchtest du ein neues Beispiel vorschlagen?","Wrap text in parentheses to connect to any node":"Verwenden Sie Klammern, um mit jedem Knoten zu verbinden","Write like an outline":"Schreiben Sie wie eine Gliederung","Write your prompt here or click to enable the microphone, then press and hold to record.":"Schreiben Sie hier Ihre Aufforderung oder klicken Sie auf das Mikrofon, um es zu aktivieren, dann halten Sie es gedrückt, um aufzunehmen.","Yearly":"Jährlich","Yes — send us a message and we\'ll set you up with a discounted rate.":"Ja - schicken Sie uns eine Nachricht und wir werden Ihnen einen ermäßigten Preis anbieten.","Yes, Replace Content":"Ja, Inhalt ersetzen","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Ja. Jedes Diagramm verwendet ausgewogene, automatische Layouts mit sauberer Typografie. Sie können Themen, Farben und Stile anpassen - und als scharfes SVG oder hochauflösendes PNG exportieren, das in jeder Präsentation oder jedem Dokument großartig aussieht.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Ja. Pro unterstützt den Import von Visio, Lucidchart und CSV - so können Sie bereits vorhandene Diagramme ohne Neuerstellung importieren.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Ja. Du kannst Dateien lokal speichern und laden, komplett offline arbeiten und genau kontrollieren, wer deine Diagramme sehen kann. Keine Daten verlassen deine Maschine, es sei denn, du entscheidest dich für eine Freigabe.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Sie sind dabei, ",["numNodes"]," Knoten und ",["numEdges"]," Kanten zu Ihrem Graphen hinzuzufügen."],"You need to log in to access this page.":"Sie müssen sich anmelden, um auf diese Seite zuzugreifen.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Sie sind bereits ein Pro-Benutzer. <0>Abonnement verwalten<1/>Haben Sie Fragen oder Feature-Anfragen? <2>Lassen Sie es uns wissen","You\'re doing great!":"Du machst das super!","You\'re on the free plan.":"Du bist auf dem kostenlosen Plan.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Sie haben alle Ihre kostenlosen KI-Konvertierungen verwendet. Upgrade auf Pro für unbegrenzte KI-Nutzung, individuelle Themen, private Freigabe und mehr. Erstellen Sie mühelos weiterhin erstaunliche Flussdiagramme!","Your Charts":"Ihre Diagramme","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Dein Sandkasten ist ein Raum, um frei mit unseren Flussdiagramm-Tools zu experimentieren, die jeden Tag zurückgesetzt werden, damit du einen frischen Start hast.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Ihre Diagramme sind schreibgeschützt, da Ihr Konto nicht mehr aktiv ist. Besuchen Sie Ihre <0>Kontoseite, um mehr zu erfahren.","Your next diagram should be your best one.":"Dein nächstes Diagramm sollte dein bestes sein.","Your subscription is <0>{statusDisplay}.":["Ihre Abonnement ist <0>",["statusDisplay"],"."],"Your work stays yours":"Deine Arbeit bleibt deine Eigene.","Zoom In":"Vergrößern","Zoom Out":"Verkleinern","month":"Monat","or":"oder","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"48€/Jahr (33% sparen) · Jederzeit kündbar","$6/mo":"6€/Monat","1 Temporary Flowchart":"1 Vorläufiger Flussdiagramm","1 diagram at a time":"1 Diagramm zur gleichen Zeit","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Nur benutzerdefiniertes CSS ist aktiviert. Nur die Layout- und Erweiterten Einstellungen werden angewandt.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun ist ein Open-Source-Projekt von <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Anmelden / <1>Registrieren mit E-Mail und Passwort","A new version of the app is available. Please reload to update.":"Eine neue Version der App ist verfügbar. Bitte neu laden, um zu aktualisieren.","AI Creation & Editing":"KI-Erstellung & Bearbeitung","AI generation & editing":"KI-Generierung & Bearbeitung","AI-Powered Flowchart Creation":"KI-unterstützte Erstellung von Flussdiagrammen","AI-generated from plain text in under 5 seconds.":"In unter 5 Sekunden aus einfachem Text generiert.","AI-powered editing to supercharge your workflow":"KI-unterstützte Bearbeitung zur Beschleunigung Ihres Arbeitsablaufs","About":"Über","Account":"Konto","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Fügen Sie einen Backslash (<0>\\\\) vor jedem Sonderzeichen ein: <1>(, <2>:, <3>#, oder <4>.`","Add some steps":"Füge einige Schritte hinzu","Advanced":"Fortgeschritten","Align Horizontally":"Horizontal ausrichten","Align Nodes":"Ausrichten von Knoten","Align Vertically":"Vertikal ausrichten","All this for just $6/month - less than your daily coffee ☕":"All dies für nur $6/Monat - weniger als Ihr täglicher Kaffee ☕","Always presentation-ready":"Immer präsentationsbereit","Amount":"Betrag","An error occurred. Try resubmitting or email {0} directly.":["Es ist ein Fehler aufgetreten. Versuchen Sie, es erneut einzureichen oder senden Sie eine E-Mail direkt an ",["0"],"."],"Appearance":"Erscheinungsbild","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Sind Sie sicher, dass Sie den Flussdiagramm löschen möchten? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Sind Sie sicher, dass Sie den Ordner löschen möchten? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Sind Sie sicher, dass Sie den Ordner löschen möchten? ","Are you sure?":"Bist du sicher?","Arrow Size":"Größe des Pfeils","Attributes":"Attribute","August 2023":"August 2023","Back":"Zurück","Back To Editor":"Zurück zum Editor","Background Color":"Hintergrundfarbe","Basic Flowchart":"Grundlegender Flussdiagramm","Become a Github Sponsor":"Werden Sie ein Github-Sponsor","Become a Pro User":"Werden Sie ein Pro-Benutzer","Begin your journey":"Beginne deine Reise","Billed annually at $48":"Jährlich abgerechnet für $48","Billed monthly at $6":"Monatlich für $6 berechnet","Blog":"Blog","Book a Meeting":"Ein Treffen buchen","Border Color":"Rahmenfarbe","Border Width":"Rahmenbreite","Bottom to Top":"Von unten nach oben","Breadthfirst":"In die Breite","Build your personal flowchart library":"Erstellen Sie Ihre persönliche Flussdiagramm-Bibliothek","Can I import my existing diagrams?":"Kann ich meine bestehenden Diagramme importieren?","Cancel":"Abbrechen","Cancel anytime":"Jederzeit kündbar","Cancel your subscription. Your hosted charts will become read-only.":"Kündigen Sie Ihr Abonnement. Ihre gehosteten Diagramme werden schreibgeschützt.","Certain attributes can be used to customize the appearance or functionality of elements.":"Bestimmte Attribute können verwendet werden, um das Aussehen oder die Funktionalität von Elementen anzupassen.","Change Email Address":"E-Mail Adresse ändern","Changelog":"Änderungsprotokoll","Charts":"Diagramme","Check out the guide:":"Schau dir die Anleitung an:","Check your email for a link to log in.<0/>You can close this window.":"Überprüfen Sie Ihre E-Mail auf einen Link zum Einloggen. Sie können dieses Fenster schließen.","Choose":"Wählen","Choose Template":"Vorlage auswählen","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Wählen Sie aus einer Vielzahl von Pfeilformen für die Quelle und das Ziel einer Kante aus. Formen beinhalten Dreieck, Dreieck-Tee, Kreis-Dreieck, Dreieck-Kreuz, Dreieck-Rückbiegung, Vee, Tee, Quadrat, Kreis, Diamant, Chevron und keine.","Choose how edges connect between nodes":"Wählen Sie, wie Kanten zwischen Knoten verbunden werden","Choose how nodes are automatically arranged in your flowchart":"Wählen Sie aus, wie Knoten automatisch in Ihrem Flussdiagramm angeordnet werden","Circle":"Kreis","Classes":"Klassen","Clear":"Löschen","Clear text?":"Text löschen?","Clone":"Klon","Clone Flowchart":"Flussdiagramm klonen ","Close":"Schließen","Color":"Farbe","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Farben beinhalten Rot, Orange, Gelb, Blau, Violett, Schwarz, Weiß und Grau.","Column":"Spalte","Comment":"Kommentar","Community templates":"Community-Vorlagen","Compare our plans and find the perfect fit for your flowcharting needs":"Vergleichen Sie unsere Pläne und finden Sie die perfekte Lösung für Ihre Flussdiagramm-Bedürfnisse","Concentric":"Konzentrisch","Confirm New Email":"Neue E-Mail bestätigen","Confirm your email address to sign in.":"Bestätigen Sie Ihre E-Mail-Adresse, um sich anzumelden.","Connect your Data":"Verbinden Sie Ihre Daten","Containers":"Behälter","Containers are nodes that contain other nodes. They are declared using curly braces.":"Container sind Knoten, die andere Knoten enthalten. Sie werden mit geschweiften Klammern deklariert.","Continue":"Weiter","Continue in Sandbox (Resets daily, work not saved)":"Weiter im Sandbox-Modus (wird täglich zurückgesetzt, Arbeit wird nicht gespeichert)","Controls the flow direction of hierarchical layouts":"Steuert die Flussrichtung von hierarchischen Layouts","Convert":"Umwandeln","Convert to Flowchart":"In Flussdiagramm konvertieren","Convert to hosted chart?":"In gehostetes Diagramm konvertieren?","Cookie Policy":"Cookie-Richtlinie","Copied SVG code to clipboard":"SVG-Code in Zwischenablage kopiert","Copied {format} to clipboard":[["Format"]," in Zwischenablage kopiert"],"Copy":"Kopieren","Copy PNG Image":"PNG-Bild kopieren","Copy SVG Code":"Kopieren Sie den SVG-Code","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Kopiere deinen Excalidraw-Code und füge ihn in <0>excalidraw.com ein, um ihn zu bearbeiten. Diese Funktion ist experimentell und funktioniert möglicherweise nicht mit allen Diagrammen. Wenn du einen Fehler findest, <1>lass es uns wissen.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Kopieren Sie Ihren mermaid.js-Code oder öffnen Sie ihn direkt im mermaid.js Live-Editor.","Create":"Erstellen","Create Flowcharts using AI":"Erstellen Sie Flussdiagramme mit KI","Create Unlimited Flowcharts":"Erstellen Sie unbegrenzte Flussdiagramme","Create a New Chart":"Nein Diagramm erstellen","Create a flowchart showing the steps of planning and executing a school fundraising event":"Erstelle einen Flussdiagramm, das die Schritte zur Planung und Durchführung eines Schul-Fundraising-Events zeigt","Create a new flowchart to get started or organize your work with folders.":"Erstellen Sie ein neues Flussdiagramm, um zu beginnen oder organisieren Sie Ihre Arbeit mit Ordnern. ","Create flowcharts instantly: Type or paste text, see it visualized.":"Erstellen Sie sofort Flussdiagramme: Tippen oder fügen Sie Text ein, sehen Sie ihn visualisiert.","Create unlimited diagrams for just $6/month!":"Erstellen Sie unbegrenzt Diagramme für nur $6/Monat!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Erstellen Sie unbegrenzte Flussdiagramme, die in der Cloud gespeichert sind und überall zugänglich sind!","Create with AI":"Erstellen mit KI","Created Date":"Erstellungsdatum","Creating an edge between two nodes is done by indenting the second node below the first":"Eine Kante zwischen zwei Knoten wird erstellt, indem der zweite Knoten unter dem ersten eingerückt wird","Curve Style":"Kurvenstil","Custom CSS":"Benutzerdefiniertes CSS","Custom Sharing Options":"Benutzerdefinierte Freigabeoptionen","Custom sharing & public links":"Individuelle Freigabe und öffentliche Links","Customer Portal":"Kundenportal","Daily Sandbox Editor":"Täglicher Sandbox-Editor","Dark":"Dunkel","Dark Mode":"Dunkelmodus","Data Import (Visio, Lucidchart, CSV)":"Datenimport (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Datenimportfunktion für komplexe Diagramme","Date":"Datum","Delete":"Löschen","Delete {0}":["Lösche ",["0"]],"Describe it and it appears":"Beschreiben Sie es und es erscheint","Describe your idea. Get a diagram worth presenting.":"Beschreiben Sie Ihre Idee. Erhalten Sie ein präsentationswürdiges Diagramm.","Design a software development lifecycle flowchart for an agile team":"Entwerfe einen Software-Entwicklungs-Lebenszyklus-Flussdiagramm für ein agiles Team","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Entwickle einen Entscheidungsbaum für einen CEO, um potenzielle neue Marktmöglichkeiten zu bewerten.","Direction":"Richtung","Dismiss":"Entlassen","Do you offer discounts for students or nonprofits?":"Bieten Sie Rabatte für Studenten oder gemeinnützige Organisationen an?","Do you want to delete this?":"Möchten Sie dies löschen?","Document":"Document","Don\'t Lose Your Work":"Verliere deine Arbeit nicht","Download":"Herunterladen","Download JPG":"JPG herunterladen","Download PNG":"PNG herunterladen","Download SVG":"SVG herunterladen","Drag and drop a CSV file here, or click to select a file":"Ziehen Sie eine CSV-Datei hierher oder klicken Sie, um eine Datei auszuwählen","Draw an edge from multiple nodes by beginning the line with a reference":"Zeichnen Sie eine Kante von mehreren Knoten, indem Sie die Zeile mit einer Referenz beginnen.","Drop the file here ...":"Datei hier ablegen ...","Each line becomes a node":"Jede Zeile wird zu einem Knoten","Edge ID, Classes, Attributes":"Kante-ID, Klassen, Attribute","Edge Label":"Kantenbeschriftung","Edge Label Column":"Spalte mit Kantenbeschriftung","Edge Style":"Kantenstil","Edge Text Size":"Kanten Textgröße","Edge missing indentation":"Kante fehlende Einrückung","Edges":"Kanten","Edges are declared in the same row as their source node":"Kanten werden in der gleichen Zeile wie ihr Quellknoten deklariert","Edges are declared in the same row as their target node":"Kanten werden in der gleichen Zeile wie ihr Zielknoten deklariert","Edges are declared in their own row":"Kanten werden in ihrer eigenen Zeile deklariert","Edges can also have ID\'s, classes, and attributes before the label":"Kanten können auch ID\'s, Klassen und Attribute vor der Bezeichnung haben","Edges can be styled with dashed, dotted, or solid lines":"Kanten können mit gestrichelten, punktierten oder soliden Linien gestaltet werden","Edges in Separate Rows":"Kanten in separaten Zeilen","Edges in Source Node Row":"Kanten in Quellknotenzeile","Edges in Target Node Row":"Kanten in Zielknotenzeile","Edit":"Bearbeiten","Edit with AI":"Mit KI bearbeiten","Editable":"Editierbar","Editor":"Editor","Email":"E-Mail","Empty":"Leer","Enable to set a consistent height for all nodes":"Aktivieren Sie die Einstellung einer einheitlichen Höhe für alle Knoten","Enter a name for the cloned flowchart.":"Geben Sie einen Namen für den geklonten Flussdiagramm ein.","Enter a name for the new folder.":"Geben Sie einen Namen für den neuen Ordner ein.","Enter a new name for the {0}.":["Geben Sie einen neuen Namen für den ",["0"]," ein."],"Enter your email address and we\'ll send you a magic link to sign in.":"Geben Sie Ihre E-Mail-Adresse ein, und wir senden Ihnen einen magischen Link, um sich anzumelden.","Enter your email address below and we\'ll send you a link to reset your password.":"Geben Sie unten Ihre E-Mail-Adresse ein, und wir senden Ihnen einen Link, um Ihr Passwort zurückzusetzen.","Equal To":"Gleich","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Jedes Diagramm wird als gestochen scharfes PNG, SVG oder teilbarer Link exportiert - bereit für das Meeting, das Dokument oder die Präsentation.","Everything you need to know about Flowchart Fun Pro":"Alles, was du über Flowchart Fun Pro wissen musst","Examples":"Beispiele","Excalidraw":"Excalidraw","Exclusive Office Hours":"Exklusive Bürozeiten","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Erleben Sie die Effizienz und Sicherheit des direkten Ladens lokaler Dateien in Ihre Flussdiagramme, ideal für die Verwaltung von Arbeitsdokumenten offline. Entsperren Sie diese exklusive Pro-Funktion und mehr mit Flowchart Fun Pro, erhältlich für nur $6/Monat.","Explore Pro":"Erkunde Pro","Explore more":"Erkunde mehr","Export":"Exportieren","Export clean diagrams without branding":"Exportieren Sie saubere Diagramme ohne Branding","Export to PNG & JPG":"Exportieren Sie nach PNG & JPG","Export to PNG, JPG, and SVG":"Exportieren Sie nach PNG, JPG und SVG","Feature Breakdown":"Funktionsübersicht","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Fühlen Sie sich frei, zu erkunden und uns über die <0>Feedback-Seite zu kontaktieren, sollten Sie irgendwelche Bedenken haben.","Fine-tune layouts and visual styles":"Feinabstimmung von Layouts und visuellen Stilen","Fixed Height":"Feste Höhe","Fixed Node Height":"Fester Knotenhöhe","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Mit Flowchart Fun Pro erhalten Sie unbegrenzte Flussdiagramme, unbegrenzte Mitarbeiter und unbegrenzten Speicherplatz für nur $6/Monat.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Spaß ist ein Open-Source-Projekt von <0>Tone\xA0Row","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun wird von einem Entwickler gebaut und gepflegt. Deine Unterstützung hält es am Laufen.","Follow Us on Twitter":"Folgen Sie uns auf Twitter","Font Family":"Schriftfamilie","Forgot your password?":"Haben Sie Ihr Passwort vergessen?","Free":"Kostenlos","Free users: charts in the sandbox expire after 7 days.":"Kostenlose Benutzer: Diagramme im Sandbox-Modus laufen nach 7 Tagen ab.","Frequently Asked Questions":"Häufig gestellte Fragen","Full-screen, read-only, and template sharing":"Vollbild, Nur-Lesen und Vorlagenfreigabe","Fullscreen":"Vollbild","General":"Allgemein","Generate flowcharts from text automatically":"Generieren Sie automatisch Flussdiagramme aus Texten","Get Pro Access Now":"Erhalten Sie jetzt Pro-Zugang","Get Unlimited AI Requests":"Erhalten Sie unbegrenzte KI-Anfragen","Get rapid responses to your questions":"Erhalten Sie schnelle Antworten auf Ihre Fragen","Get unlimited flowcharts and premium features":"Erhalten Sie unbegrenzte Flussdiagramme und Premium-Funktionen","Go back home":"Geh zurück nach Hause","Go to the Editor":"Gehe zum Editor","Go to your Sandbox":"Gehe zu deinem Sandkasten","Graph":"Diagramm","Green?":"Grün?","Grid":"Raster","Group ranking and ranked-choice voting, free":"Gruppen-Ranking und Rangfolge-Wahl, kostenlos","Have complex questions or issues? We\'re here to help.":"Haben Sie komplexe Fragen oder Probleme? Wir sind hier, um zu helfen.","Here are some Pro features you can now enjoy.":"Hier sind einige Pro-Funktionen, die Sie jetzt genießen können.","High-quality exports with embedded fonts":"Hochwertige Exporte mit eingebetteten Schriftarten","History":"Verlauf","Home":"Startseite","How are edges declared in this data?":"Wie werden Kanten in diesen Daten deklariert?","How fast can I actually make something?":"Wie schnell kann ich tatsächlich etwas erstellen?","How would you like to save your chart?":"Wie möchten Sie Ihren Chart speichern?","I would like to request a new template:":"Ich möchte gerne eine neue Vorlage anfordern:","ID\'s":"IDs","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Wenn ein Konto mit dieser E-Mail vorhanden ist, haben wir Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts gesendet.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Wenn Sie eine Kante erstellen möchten, rücken Sie diese Zeile ein. Wenn nicht, entkomme dem Doppelpunkt mit einem Backslash <0>\\\\:","Images":"Bilder","Import Data":"Daten importieren","Import data from a CSV file.":"Daten aus einer CSV-Datei importieren.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Daten aus jeder CSV-Datei importieren und auf einem neuen Flussdiagramm abbilden. Dies ist eine großartige Möglichkeit, Daten aus anderen Quellen wie Lucidchart, Google Sheets und Visio zu importieren.","Import from CSV":"Importieren Sie aus CSV","Import from Visio, Lucidchart, CSV":"Importiere aus Visio, Lucidchart, CSV.","Import from Visio, Lucidchart, and CSV":"Importieren Sie von Visio, Lucidchart und CSV","Import from anywhere":"Aus beliebiger Quelle importieren","Import from popular diagram tools":"Importieren Sie aus beliebten Diagramm-Tools","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importieren Sie Ihr Diagramm mithilfe einer dieser CSV-Dateien in Microsoft Visio.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Der Import von Daten ist eine Pro-Funktion. Sie können auf Flowchart Fun Pro für nur $6/Monat upgraden.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Fügen Sie einen Titel mit einem <0>title-Attribut ein. Um die Visio-Farbgebung zu verwenden, fügen Sie ein <1>roleType-Attribut gleich einem der folgenden hinzu:","Indent to connect nodes":"Rücke ein, um Knoten zu verbinden","Info":"Info","Is":"Ist","Is my data private?":"Ist meine Daten privat?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas ist eine JSON-Repräsentation Ihres Diagramms, die von <0>Obsidian Canvas und anderen Anwendungen verwendet wird.","Join 2000+ professionals who\'ve upgraded their workflow":"Werden Sie Teil von über 2000 Fachleuten, die ihren Arbeitsablauf verbessert haben","Join thousands of happy users who love Flowchart Fun":"Werde Teil von Tausenden zufriedenen Nutzern, die Flowchart Fun lieben","Keep Things Private":"Halte Dinge privat","Keep changes?":"Änderungen speichern?","Keep practicing":"Übe weiter","Keep your data private on your computer":"Halten Sie Ihre Daten privat auf Ihrem Computer","Language":"Sprache","Layout":"Layout","Layout Algorithm":"Layout-Algorithmus","Layout Frozen":"Layout eingefroren","Leading References":"Führende Referenzen","Learn More":"Mehr erfahren","Learn Syntax":"Syntax lernen","Learn about Flowchart Fun Pro":"Erfahren Sie mehr über Flowchart Fun Pro","Left to Right":"Von links nach rechts","Let us know why you\'re canceling. We\'re always looking to improve.":"Lassen Sie uns wissen, warum Sie stornieren. Wir sind immer auf der Suche nach Verbesserungen.","Light":"Hell","Light Mode":"Heller Modus","Link":"Link","Link back":"Verlinke zurück","Load":"Laden","Load Chart":"Chart laden","Load File":"Datei laden","Load Files":"Dateien laden","Load default content":"Standardinhalt laden","Load from link?":"Von Link laden?","Load layout and styles":"Layout und Stile laden","Loading...":"Wird geladen...","Local File Support":"Lokale Dateiunterstützung","Local saving for offline access":"Lokales Speichern für den Offline-Zugriff","Lock Zoom to Graph":"Zoom an Graph anpassen","Log In":"Anmelden","Log Out":"Abmelden","Log in to Save":"Einloggen, um zu speichern","Log in to upgrade your account":"Melde dich an, um dein Konto zu aktualisieren","Made by <0>Tone\xA0Row":"Hergestellt von <0>Tone\xA0Row","Make a One-Time Donation":"Machen Sie eine einmalige Spende","Make it yours":"Mach es zu deinem","Make publicly accessible":"Öffentlich zugänglich machen","Manage Billing":"Abrechnung verwalten","Map Data":"Daten abbilden","Maximum width of text inside nodes":"Maximale Breite des Textes innerhalb der Knoten","Monthly":"Monatlich","More from Tone Row":"Mehr von Tone Row","More from Tone Row:":"Mehr von Tone Row:","More tools:":"Weitere Werkzeuge:","Move":"Verschieben","Move {0}":["Verschieben ",["0"]],"Multiple pointers on same line":"Mehrere Zeiger auf derselben Zeile","My dog ate my credit card!":"Mein Hund hat meine Kreditkarte gefressen!","Name":"Name","Name Chart":"Diagramm benennen","Name your chart":"Benennen Sie Ihren Chart","New":"Neues","New Email":"Neue e-mail","New Flowchart":"Neue Flussdiagramm","New Folder":"Neuer Ordner","Next charge":"Nächste Gebühr","No Edges":"Keine Kanten","No Folder (Root)":"Kein Ordner (Hauptverzeichnis)","No Watermarks!":"Keine Wasserzeichen!","No charts yet":"Keine Diagramme vorhanden","No items in this folder":"Keine Elemente in diesem Ordner","No matching charts found":"Keine übereinstimmenden Diagramme gefunden","Node Border Style":"Knotenrahmenstil","Node Colors":"Knotenfarben","Node ID":"Knoten-ID","Node ID, Classes, Attributes":"Knoten-ID, Klassen, Attribute","Node Label":"Knotenbeschriftung","Node Shape":"Knotenform","Node Shapes":"Knotenformen","Nodes":"Knoten","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Knoten können mit gestrichelt, punktiert oder doppelt gestaltet werden. Grenzen können auch mit border_none entfernt werden.","Not Empty":"Nicht leer","Now you\'re thinking with flowcharts!":"Jetzt denkst du mit Flussdiagrammen!","Office Hours":"Geschäftszeiten","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"legentlich landet der magische Link in Ihrem Spam-Ordner. Wenn Sie ihn nach ein paar Minuten nicht sehen, überprüfen Sie dort oder fordern Sie einen neuen Link an.","One on One Support":"Eins-zu-eins-Unterstützung","One-on-One Support":"One-on-One-Support","Open Customer Portal":"Öffnen Sie das Kundenportal","Operation canceled":"Operation abgebrochen","Or maybe blue!":"Oder vielleicht blau!","Organization Chart":"Organigramm","PNG & JPG export":"PNG- und JPG-Export","Padding":"Polsterung","Page not found":"Seite nicht gefunden","Password":"Passwort","Past Due":"Überfällig","Paste a document to convert it":"Füge ein Dokument ein, um es zu konvertieren","Paste your document or outline here to convert it into an organized flowchart.":"Fügen Sie Ihr Dokument oder Ihre Gliederung hier ein, um es in einen organisierten Flussdiagramm umzuwandeln.","Pasted content detected. Convert to Flowchart Fun syntax?":"Eingefügter Inhalt erkannt. In Flowchart Fun-Syntax konvertieren?","Perfect for docs and quick sharing":"Perfekt für Dokumente und schnelles Teilen","Permanent Charts are a Pro Feature":"Permanente Diagramme sind eine Pro-Funktion","Playbook":"Spielbuch","Pointer and container on same line":"Zeiger und Container auf derselben Zeile","Pricing":"Preisgestaltung","Priority One-on-One Support":"Priorisierte Einzelunterstützung","Priority support":"Prioritätssupport","Privacy Policy":"Datenschutzerklärung","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro beginnt bei $4/Monat jährlich abgerechnet. Jederzeit kündbar.","Pro tip: Right-click any node to customize its shape and color":"Pro-Tipp: Klicken Sie mit der rechten Maustaste auf einen Knoten, um seine Form und Farbe anzupassen.","Processing Data":"Datenverarbeitung","Processing...":"Verarbeitung...","Prompt":"Aufforderung","Public":"Öffentlich","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Daten von Visio, Lucidchart, CSV importieren oder mit einer Vorlage beginnen. Kein erneutes Erstellen von bereits vorhandenen Inhalten.","Quick experimentation space that resets daily":"Schneller Experimentierraum, der täglich zurückgesetzt wird","Random":"Zufällig","Rapid Deployment Templates":"Schnellbereitstellungsvorlagen","Rapid Templates":"Schnelle Vorlagen","Raster Export (PNG, JPG)":"Raster-Export (PNG, JPG)","Rate limit exceeded. Please try again later.":"Die Rate-Limit wurde überschritten. Bitte versuchen Sie es später erneut.","Read-only":"Schreibgeschützt","Reference by Class":"Referenz nach Klasse","Reference by ID":"Referenz nach ID","Reference by Label":"Referenz nach Label","References":"Referenzen","References are used to create edges between nodes that are created elsewhere in the document":"Referenzen werden verwendet, um Kanten zwischen Knoten zu erstellen, die anderswo im Dokument erstellt werden","Referencing a node by its exact label":"Referenzierung eines Knotens durch sein exaktes Label","Referencing a node by its unique ID":"Referenzierung eines Knotens durch seine eindeutige ID","Referencing multiple nodes with the same assigned class":"Mehrere Knoten mit der selben zugewiesenen Klasse referenzieren","Refresh Page":"Seite aktualisieren","Reload to Update":"Neu laden, um zu aktualisieren","Rename":"Umbenennen","Rename {0}":[["0"]," umbenennen"],"Request Magic Link":"Magic-Link anfordern","Request Password Reset":"Passwort zurücksetzen anfordern","Reset":"Zurücksetzen","Reset Password":"Passwort zurücksetzen","Resume Subscription":"Abonnement fortsetzen","Return":"Zurückkehren","Right to Left":"Von rechts nach links","Right-click nodes for options":"Klicke mit der rechten Maustaste auf Knoten für Optionen","Roadmap":"Fahrplan","Rotate Label":"Label drehen","SVG Export is a Pro Feature":"SVG-Export ist eine Pro-Funktion","SVG, PDF & all export formats":"SVG, PDF und alle Exportformate","Satisfaction guaranteed or first payment refunded":"Zufriedenheitsgarantie oder erste Zahlung erstattet","Save":"Speichern","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Lokal speichern, offline arbeiten und genau kontrollieren, wer was sieht. Keine Daten verlassen Ihren Computer, es sei denn, Sie sagen es.","Save time with AI and dictation, making it easy to create diagrams.":"Sparen Sie Zeit mit KI und Diktat, um Diagramme einfach zu erstellen.","Save to Cloud":"In die Cloud speichern","Save to File":"In Datei speichern","Save your Work":"Speichern Sie Ihre Arbeit","Schedule personal consultation sessions":"Persönliche Beratungssitzungen planen","Secure payment":"Sichere Zahlung","See more reviews on Product Hunt":"Schau dir weitere Bewertungen auf Product Hunt an","See what\'s possible":"Sehen, was möglich ist","Select a destination folder for \\"{0}\\".":"Wählen Sie einen Zielordner für \\\\","Send us a message":"Schreiben Sie uns eine Nachricht","Set a consistent height for all nodes":"Legen Sie eine einheitliche Höhe für alle Knoten fest","Settings":"Einstellungen","Share":"Teilen","Sign In":"Anmelden","Sign in with <0>GitHub":"Anmelden mit <0>GitHub","Sign in with <0>Google":"Anmelden mit <0>Google","Sorry! This page is only available in English.":"Entschuldigung! Diese Seite ist nur auf Englisch verfügbar.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Entschuldigung, es gab einen Fehler bei der Konvertierung des Textes in einen Flussdiagramm. Versuchen Sie es später erneut.","Sort Ascending":"Aufsteigend sortieren","Sort Descending":"Absteigend sortieren","Sort by {0}":["Sortieren nach ",["0"]],"Source Arrow Shape":"Pfeilform der Quelle","Source Column":"Quellspalte","Source Delimiter":"Quell-Trennzeichen","Source Distance From Node":"Abstand der Quelle vom Knoten","Source/Target Arrow Shape":"Quelle/Ziel-Pfeilform","Spacing":"Abstand","Special Attributes":"Spezielle Attribute","Start":"Start","Start Over":"Von vorne anfangen","Start faster with use-case specific templates":"Schnellerer Einstieg mit anwendungsspezifischen Vorlagen","Start for free":"Kostenlos starten","Status":"Status","Step 1":"Schritt 1","Step 2":"Schritt 2","Step 3":"Schritt 3","Store any data associated to a node":"Speichern Sie alle Daten, die einem Knoten zugeordnet sind","Style Classes":"Stil-Klassen","Style with classes":"Mit Klassen gestalten","Submit":"Einsenden","Subscription":"Abonnement","Subscription Successful!":"Abonnement erfolgreich!","Subscription will end":"Abonnement wird beendet","Support":"Unterstützung","Target Arrow Shape":"Pfeilform des Ziels","Target Column":"Ziel-Spalte","Target Delimiter":"Ziel-Trennzeichen","Target Distance From Node":"Zielabstand vom Knoten ","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Sage dem AI in einfachem Englisch, was du brauchst. Dein Diagramm wird in Sekundenschnelle erstellt.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Sag uns, was funktioniert und was nicht. Jede Nachricht wird vom Entwickler gelesen.","Text Color":"Textfarbe ","Text Horizontal Offset":"Text Horizontaler Versatz","Text Leading":"Textführung ","Text Max Width":"Text Max Breite","Text Vertical Offset":"Textvertikaler Abstand ","Text followed by colon+space creates an edge with the text as the label":"Text gefolgt von Doppelpunkt + Leerzeichen erstellt eine Kante mit dem Text als Label","Text on a line creates a node with the text as the label":"Text in einer Zeile erstellt einen Knoten mit dem Text als Label","Thank you for your feedback!":"Danke für Ihr Feedback!","The beauty and magic reside in the minimalism.":"Die Schönheit und Magie stecken im Minimalismus.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"Der beste Weg, um Stile zu ändern, besteht darin, mit der rechten Maustaste auf einen Knoten oder eine Kante zu klicken und den gewünschten Stil auszuwählen.","The column that contains the edge label(s)":"Die Spalte, die die Kantenbeschriftung(en) enthält","The column that contains the source node ID(s)":"Die Spalte, die die Quellknoten-ID(en) enthält","The column that contains the target node ID(s)":"Die Spalte, die die Zielknoten-ID(en) enthält","The delimiter used to separate multiple source nodes":"Der Trennzeichen, das verwendet wird, um mehrere Quellknoten zu trennen","The delimiter used to separate multiple target nodes":"Der Trennzeichen, das verwendet wird, um mehrere Zielknoten zu trennen","The fastest way to turn what\'s in your head into something everyone else can understand.":"Der schnellste Weg, um das, was in deinem Kopf ist, in etwas zu verwandeln, das jeder andere verstehen kann.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"Der kostenlose Plan eignet sich hervorragend für den täglichen Gebrauch. Wenn du Pro-Funktionen benötigst, ist es monatlich für $6 erhältlich - jederzeit kündbar ohne Verpflichtung.","The possible shapes are:":"Die möglichen Formen sind:","Theme":"Thema ","Theme Customization Editor":"Theme-Anpassungseditor","Theme Editor":"Themen-Editor","Theme editor":"Design-Editor","There are no edges in this data":"Es gibt keine Kanten in diesen Daten","This action cannot be undone.":"Diese Aktion kann nicht rückgängig gemacht werden.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Diese Funktion ist nur für Pro-Benutzer verfügbar. <0>Werden Sie Pro-Nutzer, um es freizuschalten.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Dies kann je nach Länge Ihrer Eingabe zwischen 30 Sekunden und 2 Minuten dauern.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Diese Sandbox ist perfekt zum Experimentieren, aber denk daran - sie wird täglich zurückgesetzt. Upgrade jetzt und behalte deine aktuelle Arbeit!","This will replace the current content.":"Dies ersetzt den aktuellen Inhalt.","This will replace your current chart content with the template content.":"Dies ersetzt den aktuellen Inhalt deines Diagramms mit dem Vorlageneinhalt.","This will replace your current sandbox.":"Dies ersetzt deine aktuelle Sandbox.","Time to decide":"Zeit zum Entscheiden","Tip":"Tipp","To fix this change one of the edge IDs":"Um dies zu beheben, ändern Sie eine der Kanten-IDs","To fix this change one of the node IDs":"Um das zu beheben, ändern Sie eine der Knoten-IDs","To fix this move one pointer to the next line":"Um das zu beheben, verschieben Sie einen Zeiger auf die nächste Zeile","To fix this start the container <0/> on a different line":"Um dies zu beheben, starten Sie den Container <0/> auf einer anderen Zeile.","To learn more about why we require you to log in, please read <0>this blog post.":"Um mehr darüber zu erfahren, warum wir Sie zum Anmelden auffordern, lesen Sie bitte <0>diesen Blog-Beitrag.","Top to Bottom":"Von oben nach unten","Transform Your Ideas into Professional Diagrams in Seconds":"Transformieren Sie Ihre Ideen in professionelle Diagramme in Sekunden","Transform text into diagrams instantly":"Verwandeln Sie Texte sofort in Diagramme","Try AI":"Probieren Sie KI","Try adjusting your search or filters to find what you\'re looking for.":"Versuche, deine Suche oder Filter anzupassen, um das Gewünschte zu finden.","Try again":"Erneut versuchen","Try it free":"Kostenlos ausprobieren","Turn documents into diagrams with AI":"Dokumente mit KI in Diagramme umwandeln","Two edges have the same ID":"Zwei Kanten haben die gleiche ID","Two nodes have the same ID":"Zwei Knoten haben die gleiche ID","Type it. See it.":"Schreib es. Sieh es.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Oh oh, du hast keine kostenlosen Anfragen mehr! Upgrade auf Flowchart Fun Pro für unbegrenzte Diagramm-Konvertierungen und verwandle Text weiterhin mühelos in klare, visuelle Flussdiagramme wie durch Kopieren und Einfügen.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Unter 60 Sekunden. Tippe ein paar Zeilen Text ein oder beschreibe der KI, was du brauchst, und dein Diagramm erscheint sofort. Exportiere oder teile es mit nur einem Klick.","Undo":"Rückgängig","Unescaped special character":"Nicht maskiertes Sonderzeichen","Unique text value to identify a node":"Einzigartiger Textwert, um einen Knoten zu identifizieren","Unknown":"Unbekannt","Unknown Parsing Error":"Unbekannter Parser-Fehler","Unlimited Flowcharts":"Unbegrenzte Flowcharts","Unlimited Permanent Flowcharts":"Unbegrenzte permanente Flowcharts","Unlimited cloud-saved flowcharts":"Unbegrenzte in der Cloud gespeicherte Flussdiagramme","Unlimited saved diagrams":"Unbegrenzt gespeicherte Diagramme","Unlock AI Features and never lose your work with a Pro account.":"Entsperren Sie KI-Funktionen und verlieren Sie nie wieder Ihre Arbeit mit einem Pro-Konto.","Unlock Unlimited AI Flowcharts":"Entsperren Sie unbegrenzte AI-Flussdiagramme","Unpaid":"Unbezahlt","Update Email":"E-Mail aktualisieren","Updated Date":"Aktualisierungsdatum ","Upgrade Now - Save My Work":"Jetzt upgraden - Meine Arbeit speichern","Upgrade to Flowchart Fun Pro and unlock:":"Upgrade auf Flowchart Fun Pro und schalte frei:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"Upgrade auf Flowchart Fun Pro für unbegrenzte gehostete Diagramme, wasserzeichenfreie hochauflösende Exporte, KI-Bearbeitung und mehr. 4€/Monat jährlich in Rechnung gestellt.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Upgrade auf Flowchart Fun Pro, um SVG-Export freizuschalten und mehr fortschrittliche Funktionen für Ihre Diagramme zu nutzen.","Upgrade to Pro":"Auf Pro upgraden","Upgrade to Pro for permanent charts.":"Upgrade auf Pro für dauerhafte Charts.","Upload your File":"Laden Sie Ihre Datei hoch","Use Custom CSS Only":"Nur benutzerdefinierte CSS verwenden","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Verwenden Sie Lucidchart oder Visio? Der CSV-Import erleichtert das Abrufen von Daten aus jeder Quelle!","Use classes to group nodes":"Verwenden Sie Klassen, um Knoten zu gruppieren","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Verwenden Sie das Attribut <0>href, um einem Knoten einen Link zu setzen, der in einem neuen Tab geöffnet wird.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Verwenden Sie das Attribut <0>src, um das Bild eines Knotens zu setzen. Das Bild wird an den Knoten angepasst, sodass Sie möglicherweise die Breite und Höhe des Knotens anpassen müssen, um das gewünschte Ergebnis zu erzielen. Es werden nur öffentliche Bilder (nicht von CORS blockiert) unterstützt.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Verwenden Sie die Attribute <0>w und <1>h, um die Breite und Höhe eines Knotens explizit festzulegen.","Use the customer portal to change your billing information.":"Verwenden Sie das Kundenportal, um Ihre Rechnungsinformationen zu ändern.","Use these settings to adapt the look and behavior of your flowcharts":"Verwenden Sie diese Einstellungen, um das Aussehen und Verhalten Ihrer Flussdiagramme anzupassen","Use this file for org charts, hierarchies, and other organizational structures.":"Verwenden Sie diese Datei für Organigramme, Hierarchien und andere Organisationsstrukturen.","Use this file for sequences, processes, and workflows.":"Verwenden Sie diese Datei für Sequenzen, Prozesse und Workflows.","Use this mode to modify and enhance your current chart.":"Verwenden Sie diesen Modus, um Ihre aktuelle Tabelle zu ändern und zu verbessern.","Used at":"Verwendet bei","User":"Benutzer","Vector Export (SVG)":"Vektor-Export (SVG)","View on Github":"Auf Github ansehen","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Möchten Sie ein Flussdiagramm aus einem Dokument erstellen? Fügen Sie es in den Editor ein und klicken Sie auf \\"In Flussdiagramm umwandeln\\".","Watermark-Free Diagrams":"Wasserzeichenfreie Diagramme","Watermarks":"Wasserzeichen","Welcome to Flowchart Fun":"Willkommen bei Flowchart Spaß","What if I just need it for one project?":"Was ist, wenn ich es nur für ein Projekt brauche?","What our users are saying":"Was unsere Nutzer sagen","What\'s next?":"Was kommt als Nächstes?","What\'s this?":"Was ist das?","Width":"Breite","Width and Height":"Breite und Höhe","Will my diagrams actually look professional?":"Werden meine Diagramme tatsächlich professionell aussehen?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Mit der Pro-Version von Flowchart Fun können Sie natürliche Sprachbefehle verwenden, um schnell Ihre Flussdiagrammdetails auszuarbeiten, ideal für die Erstellung von Diagrammen unterwegs. Für 6 $/Monat erhalten Sie die Leichtigkeit der zugänglichen KI-Bearbeitung, um Ihre Flussdiagrammerfahrung zu verbessern.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Mit der Pro-Version können Sie lokale Dateien speichern und laden. Es ist perfekt für die Verwaltung von Arbeitsdokumenten offline.","Would you like to continue?":"Möchten Sie fortfahren?","Would you like to suggest a new example?":"Möchtest du ein neues Beispiel vorschlagen?","Wrap text in parentheses to connect to any node":"Verwenden Sie Klammern, um mit jedem Knoten zu verbinden","Write like an outline":"Schreiben Sie wie eine Gliederung","Write your prompt here or click to enable the microphone, then press and hold to record.":"Schreiben Sie hier Ihre Aufforderung oder klicken Sie auf das Mikrofon, um es zu aktivieren, dann halten Sie es gedrückt, um aufzunehmen.","Yearly":"Jährlich","Yes — send us a message and we\'ll set you up with a discounted rate.":"Ja - schicken Sie uns eine Nachricht und wir werden Ihnen einen ermäßigten Preis anbieten.","Yes, Replace Content":"Ja, Inhalt ersetzen","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Ja. Jedes Diagramm verwendet ausgewogene, automatische Layouts mit sauberer Typografie. Sie können Themen, Farben und Stile anpassen - und als scharfes SVG oder hochauflösendes PNG exportieren, das in jeder Präsentation oder jedem Dokument großartig aussieht.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Ja. Pro unterstützt den Import von Visio, Lucidchart und CSV - so können Sie bereits vorhandene Diagramme ohne Neuerstellung importieren.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Ja. Du kannst Dateien lokal speichern und laden, komplett offline arbeiten und genau kontrollieren, wer deine Diagramme sehen kann. Keine Daten verlassen deine Maschine, es sei denn, du entscheidest dich für eine Freigabe.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Sie sind dabei, ",["numNodes"]," Knoten und ",["numEdges"]," Kanten zu Ihrem Graphen hinzuzufügen."],"You need to log in to access this page.":"Sie müssen sich anmelden, um auf diese Seite zuzugreifen.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Sie sind bereits ein Pro-Benutzer. <0>Abonnement verwalten<1/>Haben Sie Fragen oder Feature-Anfragen? <2>Lassen Sie es uns wissen","You\'re doing great!":"Du machst das super!","You\'re on the free plan.":"Du bist auf dem kostenlosen Plan.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Sie haben alle Ihre kostenlosen KI-Konvertierungen verwendet. Upgrade auf Pro für unbegrenzte KI-Nutzung, individuelle Themen, private Freigabe und mehr. Erstellen Sie mühelos weiterhin erstaunliche Flussdiagramme!","Your Charts":"Ihre Diagramme","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Dein Sandkasten ist ein Raum, um frei mit unseren Flussdiagramm-Tools zu experimentieren, die jeden Tag zurückgesetzt werden, damit du einen frischen Start hast.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Ihre Diagramme sind schreibgeschützt, da Ihr Konto nicht mehr aktiv ist. Besuchen Sie Ihre <0>Kontoseite, um mehr zu erfahren.","Your next diagram should be your best one.":"Dein nächstes Diagramm sollte dein bestes sein.","Your subscription is <0>{statusDisplay}.":["Ihre Abonnement ist <0>",["statusDisplay"],"."],"Your work stays yours":"Deine Arbeit bleibt deine Eigene.","Zoom In":"Vergrößern","Zoom Out":"Verkleinern","month":"Monat","or":"oder","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/de/messages.po b/app/src/locales/de/messages.po index 1a60118a2..2b9850183 100644 --- a/app/src/locales/de/messages.po +++ b/app/src/locales/de/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "48€/Jahr (33% sparen) · Jederzeit kündbar" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "6€/Monat" @@ -25,7 +25,7 @@ msgstr "6€/Monat" msgid "1 Temporary Flowchart" msgstr "1 Vorläufiger Flussdiagramm" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "1 Diagramm zur gleichen Zeit" @@ -33,7 +33,7 @@ msgstr "1 Diagramm zur gleichen Zeit" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>Nur benutzerdefiniertes CSS ist aktiviert. Nur die Layout- und Erweiterten Einstellungen werden angewandt." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun ist ein Open-Source-Projekt von <1>Tone Row" @@ -49,7 +49,7 @@ msgstr "Eine neue Version der App ist verfügbar. Bitte neu laden, um zu aktuali msgid "AI Creation & Editing" msgstr "KI-Erstellung & Bearbeitung" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "KI-Generierung & Bearbeitung" @@ -57,7 +57,7 @@ msgstr "KI-Generierung & Bearbeitung" msgid "AI-Powered Flowchart Creation" msgstr "KI-unterstützte Erstellung von Flussdiagrammen" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "In unter 5 Sekunden aus einfachem Text generiert." @@ -65,12 +65,12 @@ msgstr "In unter 5 Sekunden aus einfachem Text generiert." msgid "AI-powered editing to supercharge your workflow" msgstr "KI-unterstützte Bearbeitung zur Beschleunigung Ihres Arbeitsablaufs" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "Über" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "Konto" @@ -106,7 +106,7 @@ msgstr "Vertikal ausrichten" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "All dies für nur $6/Monat - weniger als Ihr täglicher Kaffee ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "Immer präsentationsbereit" @@ -118,7 +118,7 @@ msgstr "Betrag" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "Es ist ein Fehler aufgetreten. Versuchen Sie, es erneut einzureichen oder senden Sie eine E-Mail direkt an {0}." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "Erscheinungsbild" @@ -170,11 +170,11 @@ msgstr "Hintergrundfarbe" msgid "Basic Flowchart" msgstr "Grundlegender Flussdiagramm" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "Werden Sie ein Github-Sponsor" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "Werden Sie ein Pro-Benutzer" @@ -191,8 +191,8 @@ msgstr "Jährlich abgerechnet für $48" msgid "Billed monthly at $6" msgstr "Monatlich für $6 berechnet" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "Blog" @@ -260,14 +260,14 @@ msgstr "Bestimmte Attribute können verwendet werden, um das Aussehen oder die F msgid "Change Email Address" msgstr "E-Mail Adresse ändern" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "Änderungsprotokoll" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "Diagramme" @@ -346,7 +346,7 @@ msgstr "Spalte" msgid "Comment" msgstr "Kommentar" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "Community-Vorlagen" @@ -403,7 +403,7 @@ msgstr "In Flussdiagramm konvertieren" msgid "Convert to hosted chart?" msgstr "In gehostetes Diagramm konvertieren?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Cookie-Richtlinie" @@ -500,7 +500,7 @@ msgstr "Benutzerdefiniertes CSS" msgid "Custom Sharing Options" msgstr "Benutzerdefinierte Freigabeoptionen" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "Individuelle Freigabe und öffentliche Links" @@ -516,8 +516,8 @@ msgstr "Täglicher Sandbox-Editor" msgid "Dark" msgstr "Dunkel" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "Dunkelmodus" @@ -542,11 +542,11 @@ msgstr "Löschen" msgid "Delete {0}" msgstr "Lösche {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "Beschreiben Sie es und es erscheint" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "Beschreiben Sie Ihre Idee. Erhalten Sie ein präsentationswürdiges Diagramm." @@ -696,8 +696,8 @@ msgstr "Mit KI bearbeiten" msgid "Editable" msgstr "Editierbar" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "Editor" @@ -742,7 +742,7 @@ msgstr "Geben Sie unten Ihre E-Mail-Adresse ein, und wir senden Ihnen einen Link msgid "Equal To" msgstr "Gleich" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "Jedes Diagramm wird als gestochen scharfes PNG, SVG oder teilbarer Link exportiert - bereit für das Meeting, das Dokument oder die Präsentation." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "Funktionsübersicht" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "Feedback" @@ -823,11 +823,15 @@ msgstr "Fester Knotenhöhe" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Mit Flowchart Fun Pro erhalten Sie unbegrenzte Flussdiagramme, unbegrenzte Mitarbeiter und unbegrenzten Speicherplatz für nur $6/Monat." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Spaß ist ein Open-Source-Projekt von <0>Tone Row" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun wird von einem Entwickler gebaut und gepflegt. Deine Unterstützung hält es am Laufen." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "Folgen Sie uns auf Twitter" @@ -909,6 +913,10 @@ msgstr "Grün?" msgid "Grid" msgstr "Raster" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "Gruppen-Ranking und Rangfolge-Wahl, kostenlos" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "Haben Sie komplexe Fragen oder Probleme? Wir sind hier, um zu helfen." @@ -980,7 +988,7 @@ msgstr "Daten aus jeder CSV-Datei importieren und auf einem neuen Flussdiagramm msgid "Import from CSV" msgstr "Importieren Sie aus CSV" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Importiere aus Visio, Lucidchart, CSV." @@ -988,7 +996,7 @@ msgstr "Importiere aus Visio, Lucidchart, CSV." msgid "Import from Visio, Lucidchart, and CSV" msgstr "Importieren Sie von Visio, Lucidchart und CSV" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "Aus beliebiger Quelle importieren" @@ -1012,7 +1020,7 @@ msgstr "Fügen Sie einen Titel mit einem <0>title-Attribut ein. Um die Visio msgid "Indent to connect nodes" msgstr "Rücke ein, um Knoten zu verbinden" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "Info" @@ -1052,7 +1060,7 @@ msgstr "Übe weiter" msgid "Keep your data private on your computer" msgstr "Halten Sie Ihre Daten privat auf Ihrem Computer" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "Sprache" @@ -1101,8 +1109,8 @@ msgstr "Lassen Sie uns wissen, warum Sie stornieren. Wir sind immer auf der Such msgid "Light" msgstr "Hell" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "Heller Modus" @@ -1160,8 +1168,8 @@ msgstr "Lokales Speichern für den Offline-Zugriff" msgid "Lock Zoom to Graph" msgstr "Zoom an Graph anpassen" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "Anmelden" @@ -1177,11 +1185,15 @@ msgstr "Einloggen, um zu speichern" msgid "Log in to upgrade your account" msgstr "Melde dich an, um dein Konto zu aktualisieren" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "Hergestellt von <0>Tone Row" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "Machen Sie eine einmalige Spende" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "Mach es zu deinem" @@ -1205,6 +1217,18 @@ msgstr "Maximale Breite des Textes innerhalb der Knoten" msgid "Monthly" msgstr "Monatlich" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "Mehr von Tone Row" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "Mehr von Tone Row:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "Weitere Werkzeuge:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "Diagramm benennen" msgid "Name your chart" msgstr "Benennen Sie Ihren Chart" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "Neues" @@ -1363,7 +1387,7 @@ msgstr "Oder vielleicht blau!" msgid "Organization Chart" msgstr "Organigramm" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "PNG- und JPG-Export" @@ -1412,21 +1436,25 @@ msgstr "Spielbuch" msgid "Pointer and container on same line" msgstr "Zeiger und Container auf derselben Zeile" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "Preisgestaltung" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "Priorisierte Einzelunterstützung" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "Prioritätssupport" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "Datenschutzerklärung" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "Pro beginnt bei $4/Monat jährlich abgerechnet. Jederzeit kündbar." @@ -1451,7 +1479,7 @@ msgstr "Aufforderung" msgid "Public" msgstr "Öffentlich" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Daten von Visio, Lucidchart, CSV importieren oder mit einer Vorlage beginnen. Kein erneutes Erstellen von bereits vorhandenen Inhalten." @@ -1575,8 +1603,8 @@ msgstr "Von rechts nach links" msgid "Right-click nodes for options" msgstr "Klicke mit der rechten Maustaste auf Knoten für Optionen" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "Fahrplan" @@ -1590,7 +1618,7 @@ msgstr "Label drehen" msgid "SVG Export is a Pro Feature" msgstr "SVG-Export ist eine Pro-Funktion" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, PDF und alle Exportformate" @@ -1603,7 +1631,7 @@ msgstr "Zufriedenheitsgarantie oder erste Zahlung erstattet" msgid "Save" msgstr "Speichern" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "Lokal speichern, offline arbeiten und genau kontrollieren, wer was sieht. Keine Daten verlassen Ihren Computer, es sei denn, Sie sagen es." @@ -1635,7 +1663,7 @@ msgstr "Sichere Zahlung" msgid "See more reviews on Product Hunt" msgstr "Schau dir weitere Bewertungen auf Product Hunt an" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "Sehen, was möglich ist" @@ -1651,9 +1679,9 @@ msgstr "Schreiben Sie uns eine Nachricht" msgid "Set a consistent height for all nodes" msgstr "Legen Sie eine einheitliche Höhe für alle Knoten fest" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "Einstellungen" @@ -1738,7 +1766,7 @@ msgstr "Von vorne anfangen" msgid "Start faster with use-case specific templates" msgstr "Schnellerer Einstieg mit anwendungsspezifischen Vorlagen" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "Kostenlos starten" @@ -1789,7 +1817,7 @@ msgstr "Abonnement erfolgreich!" msgid "Subscription will end" msgstr "Abonnement wird beendet" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "Unterstützung" @@ -1812,7 +1840,7 @@ msgstr "Ziel-Trennzeichen" msgid "Target Distance From Node" msgstr "Zielabstand vom Knoten " -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "Sage dem AI in einfachem Englisch, was du brauchst. Dein Diagramm wird in Sekundenschnelle erstellt." @@ -1856,7 +1884,7 @@ msgstr "Text in einer Zeile erstellt einen Knoten mit dem Text als Label" msgid "Thank you for your feedback!" msgstr "Danke für Ihr Feedback!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "Die Schönheit und Magie stecken im Minimalismus." @@ -1884,7 +1912,7 @@ msgstr "Der Trennzeichen, das verwendet wird, um mehrere Quellknoten zu trennen" msgid "The delimiter used to separate multiple target nodes" msgstr "Der Trennzeichen, das verwendet wird, um mehrere Zielknoten zu trennen" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "Der schnellste Weg, um das, was in deinem Kopf ist, in etwas zu verwandeln, das jeder andere verstehen kann." @@ -1911,7 +1939,7 @@ msgstr "Theme-Anpassungseditor" msgid "Theme Editor" msgstr "Themen-Editor" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "Design-Editor" @@ -2000,10 +2028,14 @@ msgstr "Versuche, deine Suche oder Filter anzupassen, um das Gewünschte zu find msgid "Try again" msgstr "Erneut versuchen" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "Kostenlos ausprobieren" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "Dokumente mit KI in Diagramme umwandeln" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "Zwei Kanten haben die gleiche ID" @@ -2012,7 +2044,7 @@ msgstr "Zwei Kanten haben die gleiche ID" msgid "Two nodes have the same ID" msgstr "Zwei Knoten haben die gleiche ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "Schreib es. Sieh es." @@ -2057,7 +2089,7 @@ msgstr "Unbegrenzte permanente Flowcharts" msgid "Unlimited cloud-saved flowcharts" msgstr "Unbegrenzte in der Cloud gespeicherte Flussdiagramme" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "Unbegrenzt gespeicherte Diagramme" @@ -2089,13 +2121,17 @@ msgstr "Jetzt upgraden - Meine Arbeit speichern" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Upgrade auf Flowchart Fun Pro und schalte frei:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "Upgrade auf Flowchart Fun Pro für unbegrenzte gehostete Diagramme, wasserzeichenfreie hochauflösende Exporte, KI-Bearbeitung und mehr. 4€/Monat jährlich in Rechnung gestellt." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Upgrade auf Flowchart Fun Pro, um SVG-Export freizuschalten und mehr fortschrittliche Funktionen für Ihre Diagramme zu nutzen." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "Auf Pro upgraden" @@ -2152,7 +2188,7 @@ msgstr "Verwenden Sie diese Datei für Sequenzen, Prozesse und Workflows." msgid "Use this mode to modify and enhance your current chart." msgstr "Verwenden Sie diesen Modus, um Ihre aktuelle Tabelle zu ändern und zu verbessern." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "Verwendet bei" @@ -2164,7 +2200,7 @@ msgstr "Benutzer" msgid "Vector Export (SVG)" msgstr "Vektor-Export (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Auf Github ansehen" @@ -2302,7 +2338,7 @@ msgstr "Dein Sandkasten ist ein Raum, um frei mit unseren Flussdiagramm-Tools zu msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "Ihre Diagramme sind schreibgeschützt, da Ihr Konto nicht mehr aktiv ist. Besuchen Sie Ihre <0>Kontoseite, um mehr zu erfahren." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "Dein nächstes Diagramm sollte dein bestes sein." @@ -2310,7 +2346,7 @@ msgstr "Dein nächstes Diagramm sollte dein bestes sein." msgid "Your subscription is <0>{statusDisplay}." msgstr "Ihre Abonnement ist <0>{statusDisplay}." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "Deine Arbeit bleibt deine Eigene." @@ -2333,10 +2369,10 @@ msgid "or" msgstr "oder" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/en/messages.js b/app/src/locales/en/messages.js index a2add32bf..3e824544d 100644 --- a/app/src/locales/en/messages.js +++ b/app/src/locales/en/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"$48/year (save 33%) · Cancel anytime","$6/mo":"$6/mo","1 Temporary Flowchart":"1 Temporary Flowchart","1 diagram at a time":"1 diagram at a time","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Sign In / <1>Sign Up with email and password","A new version of the app is available. Please reload to update.":"A new version of the app is available. Please reload to update.","AI Creation & Editing":"AI Creation & Editing","AI generation & editing":"AI generation & editing","AI-Powered Flowchart Creation":"AI-Powered Flowchart Creation","AI-generated from plain text in under 5 seconds.":"AI-generated from plain text in under 5 seconds.","AI-powered editing to supercharge your workflow":"AI-powered editing to supercharge your workflow","About":"About","Account":"Account","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`","Add some steps":"Add some steps","Advanced":"Advanced","Align Horizontally":"Align Horizontally","Align Nodes":"Align Nodes","Align Vertically":"Align Vertically","All this for just $6/month - less than your daily coffee ☕":"All this for just $6/month - less than your daily coffee ☕","Always presentation-ready":"Always presentation-ready","Amount":"Amount","An error occurred. Try resubmitting or email {0} directly.":["An error occurred. Try resubmitting or email ",["0"]," directly."],"Appearance":"Appearance","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":["Are you sure you want to delete the flowchart \\"",["0"],"\\"? This action cannot be undone."],"Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":["Are you sure you want to delete the folder \\"",["0"],"\\" and all its contents? This action cannot be undone."],"Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":["Are you sure you want to delete the folder \\"",["0"],"\\"? This action cannot be undone."],"Are you sure?":"Are you sure?","Arrow Size":"Arrow Size","Attributes":"Attributes","August 2023":"August 2023","Back":"Back","Back To Editor":"Back To Editor","Background Color":"Background Color","Basic Flowchart":"Basic Flowchart","Become a Github Sponsor":"Become a Github Sponsor","Become a Pro User":"Become a Pro User","Begin your journey":"Begin your journey","Billed annually at $48":"Billed annually at $48","Billed monthly at $6":"Billed monthly at $6","Blog":"Blog","Book a Meeting":"Book a Meeting","Border Color":"Border Color","Border Width":"Border Width","Bottom to Top":"Bottom to Top","Breadthfirst":"Breadthfirst","Build your personal flowchart library":"Build your personal flowchart library","Can I import my existing diagrams?":"Can I import my existing diagrams?","Cancel":"Cancel","Cancel anytime":"Cancel anytime","Cancel your subscription. Your hosted charts will become read-only.":"Cancel your subscription. Your hosted charts will become read-only.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certain attributes can be used to customize the appearance or functionality of elements.","Change Email Address":"Change Email Address","Changelog":"Changelog","Charts":"Charts","Check out the guide:":"Check out the guide:","Check your email for a link to log in.<0/>You can close this window.":"Check your email for a link to log in.<0/>You can close this window.","Choose":"Choose","Choose Template":"Choose Template","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .","Choose how edges connect between nodes":"Choose how edges connect between nodes","Choose how nodes are automatically arranged in your flowchart":"Choose how nodes are automatically arranged in your flowchart","Circle":"Circle","Classes":"Classes","Clear":"Clear","Clear text?":"Clear text?","Clone":"Clone","Clone Flowchart":"Clone Flowchart","Close":"Close","Color":"Color","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Colors include red, orange, yellow, blue, purple, black, white, and gray.","Column":"Column","Comment":"Comment","Community templates":"Community templates","Compare our plans and find the perfect fit for your flowcharting needs":"Compare our plans and find the perfect fit for your flowcharting needs","Concentric":"Concentric","Confirm New Email":"Confirm New Email","Confirm your email address to sign in.":"Confirm your email address to sign in.","Connect your Data":"Connect your Data","Containers":"Containers","Containers are nodes that contain other nodes. They are declared using curly braces.":"Containers are nodes that contain other nodes. They are declared using curly braces.","Continue":"Continue","Continue in Sandbox (Resets daily, work not saved)":"Continue in Sandbox (Resets daily, work not saved)","Controls the flow direction of hierarchical layouts":"Controls the flow direction of hierarchical layouts","Convert":"Convert","Convert to Flowchart":"Convert to Flowchart","Convert to hosted chart?":"Convert to hosted chart?","Cookie Policy":"Cookie Policy","Copied SVG code to clipboard":"Copied SVG code to clipboard","Copied {format} to clipboard":["Copied ",["format"]," to clipboard"],"Copy":"Copy","Copy PNG Image":"Copy PNG Image","Copy SVG Code":"Copy SVG Code","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copy your mermaid.js code or open it directly in the mermaid.js live editor.","Create":"Create","Create Flowcharts using AI":"Create Flowcharts using AI","Create Unlimited Flowcharts":"Create Unlimited Flowcharts","Create a New Chart":"Create a New Chart","Create a flowchart showing the steps of planning and executing a school fundraising event":"Create a flowchart showing the steps of planning and executing a school fundraising event","Create a new flowchart to get started or organize your work with folders.":"Create a new flowchart to get started or organize your work with folders.","Create flowcharts instantly: Type or paste text, see it visualized.":"Create flowcharts instantly: Type or paste text, see it visualized.","Create unlimited diagrams for just $6/month!":"Create unlimited diagrams for just $6/month!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Create unlimited flowcharts stored in the cloud– accessible anywhere!","Create with AI":"Create with AI","Created Date":"Created Date","Creating an edge between two nodes is done by indenting the second node below the first":"Creating an edge between two nodes is done by indenting the second node below the first","Curve Style":"Curve Style","Custom CSS":"Custom CSS","Custom Sharing Options":"Custom Sharing Options","Custom sharing & public links":"Custom sharing & public links","Customer Portal":"Customer Portal","Daily Sandbox Editor":"Daily Sandbox Editor","Dark":"Dark","Dark Mode":"Dark Mode","Data Import (Visio, Lucidchart, CSV)":"Data Import (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Data import feature for complex diagrams","Date":"Date","Delete":"Delete","Delete {0}":["Delete ",["0"]],"Describe it and it appears":"Describe it and it appears","Describe your idea. Get a diagram worth presenting.":"Describe your idea. Get a diagram worth presenting.","Design a software development lifecycle flowchart for an agile team":"Design a software development lifecycle flowchart for an agile team","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Develop a decision tree for a CEO to evaluate potential new market opportunities","Direction":"Direction","Dismiss":"Dismiss","Do you offer discounts for students or nonprofits?":"Do you offer discounts for students or nonprofits?","Do you want to delete this?":"Do you want to delete this?","Document":"Document","Don\'t Lose Your Work":"Don\'t Lose Your Work","Download":"Download","Download JPG":"Download JPG","Download PNG":"Download PNG","Download SVG":"Download SVG","Drag and drop a CSV file here, or click to select a file":"Drag and drop a CSV file here, or click to select a file","Draw an edge from multiple nodes by beginning the line with a reference":"Draw an edge from multiple nodes by beginning the line with a reference","Drop the file here ...":"Drop the file here ...","Each line becomes a node":"Each line becomes a node","Edge ID, Classes, Attributes":"Edge ID, Classes, Attributes","Edge Label":"Edge Label","Edge Label Column":"Edge Label Column","Edge Style":"Edge Style","Edge Text Size":"Edge Text Size","Edge missing indentation":"Edge missing indentation","Edges":"Edges","Edges are declared in the same row as their source node":"Edges are declared in the same row as their source node","Edges are declared in the same row as their target node":"Edges are declared in the same row as their target node","Edges are declared in their own row":"Edges are declared in their own row","Edges can also have ID\'s, classes, and attributes before the label":"Edges can also have ID\'s, classes, and attributes before the label","Edges can be styled with dashed, dotted, or solid lines":"Edges can be styled with dashed, dotted, or solid lines","Edges in Separate Rows":"Edges in Separate Rows","Edges in Source Node Row":"Edges in Source Node Row","Edges in Target Node Row":"Edges in Target Node Row","Edit":"Edit","Edit with AI":"Edit with AI","Editable":"Editable","Editor":"Editor","Email":"Email","Empty":"Empty","Enable to set a consistent height for all nodes":"Enable to set a consistent height for all nodes","Enter a name for the cloned flowchart.":"Enter a name for the cloned flowchart.","Enter a name for the new folder.":"Enter a name for the new folder.","Enter a new name for the {0}.":["Enter a new name for the ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Enter your email address and we\'ll send you a magic link to sign in.","Enter your email address below and we\'ll send you a link to reset your password.":"Enter your email address below and we\'ll send you a link to reset your password.","Equal To":"Equal To","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.","Everything you need to know about Flowchart Fun Pro":"Everything you need to know about Flowchart Fun Pro","Examples":"Examples","Excalidraw":"Excalidraw","Exclusive Office Hours":"Exclusive Office Hours","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month","Explore Pro":"Explore Pro","Explore more":"Explore more","Export":"Export","Export clean diagrams without branding":"Export clean diagrams without branding","Export to PNG & JPG":"Export to PNG & JPG","Export to PNG, JPG, and SVG":"Export to PNG, JPG, and SVG","Feature Breakdown":"Feature Breakdown","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.","Fine-tune layouts and visual styles":"Fine-tune layouts and visual styles","Fixed Height":"Fixed Height","Fixed Node Height":"Fixed Node Height","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun is built and maintained by one developer. Your support keeps it going.","Follow Us on Twitter":"Follow Us on Twitter","Font Family":"Font Family","Forgot your password?":"Forgot your password?","Free":"Free","Free users: charts in the sandbox expire after 7 days.":"Free users: charts in the sandbox expire after 7 days.","Frequently Asked Questions":"Frequently Asked Questions","Full-screen, read-only, and template sharing":"Full-screen, read-only, and template sharing","Fullscreen":"Fullscreen","General":"General","Generate flowcharts from text automatically":"Generate flowcharts from text automatically","Get Pro Access Now":"Get Pro Access Now","Get Unlimited AI Requests":"Get Unlimited AI Requests","Get rapid responses to your questions":"Get rapid responses to your questions","Get unlimited flowcharts and premium features":"Get unlimited flowcharts and premium features","Go back home":"Go back home","Go to the Editor":"Go to the Editor","Go to your Sandbox":"Go to your Sandbox","Graph":"Graph","Green?":"Green?","Grid":"Grid","Have complex questions or issues? We\'re here to help.":"Have complex questions or issues? We\'re here to help.","Here are some Pro features you can now enjoy.":"Here are some Pro features you can now enjoy.","High-quality exports with embedded fonts":"High-quality exports with embedded fonts","History":"History","Home":"Home","How are edges declared in this data?":"How are edges declared in this data?","How fast can I actually make something?":"How fast can I actually make something?","How would you like to save your chart?":"How would you like to save your chart?","I would like to request a new template:":"I would like to request a new template:","ID\'s":"ID\'s","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:","Images":"Images","Import Data":"Import Data","Import data from a CSV file.":"Import data from a CSV file.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.","Import from CSV":"Import from CSV","Import from Visio, Lucidchart, CSV":"Import from Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Import from Visio, Lucidchart, and CSV","Import from anywhere":"Import from anywhere","Import from popular diagram tools":"Import from popular diagram tools","Import your diagram it into Microsoft Visio using one of these CSV files.":"Import your diagram it into Microsoft Visio using one of these CSV files.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:","Indent to connect nodes":"Indent to connect nodes","Info":"Info","Is":"Is","Is my data private?":"Is my data private?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.","Join 2000+ professionals who\'ve upgraded their workflow":"Join 2000+ professionals who\'ve upgraded their workflow","Join thousands of happy users who love Flowchart Fun":"Join thousands of happy users who love Flowchart Fun","Keep Things Private":"Keep Things Private","Keep changes?":"Keep changes?","Keep practicing":"Keep practicing","Keep your data private on your computer":"Keep your data private on your computer","Language":"Language","Layout":"Layout","Layout Algorithm":"Layout Algorithm","Layout Frozen":"Layout Frozen","Leading References":"Leading References","Learn More":"Learn More","Learn Syntax":"Learn Syntax","Learn about Flowchart Fun Pro":"Learn about Flowchart Fun Pro","Left to Right":"Left to Right","Let us know why you\'re canceling. We\'re always looking to improve.":"Let us know why you\'re canceling. We\'re always looking to improve.","Light":"Light","Light Mode":"Light Mode","Link":"Link","Link back":"Link back","Load":"Load","Load Chart":"Load Chart","Load File":"Load File","Load Files":"Load Files","Load default content":"Load default content","Load from link?":"Load from link?","Load layout and styles":"Load layout and styles","Loading...":"Loading...","Local File Support":"Local File Support","Local saving for offline access":"Local saving for offline access","Lock Zoom to Graph":"Lock Zoom to Graph","Log In":"Log In","Log Out":"Log Out","Log in to Save":"Log in to Save","Log in to upgrade your account":"Log in to upgrade your account","Make a One-Time Donation":"Make a One-Time Donation","Make it yours":"Make it yours","Make publicly accessible":"Make publicly accessible","Manage Billing":"Manage Billing","Map Data":"Map Data","Maximum width of text inside nodes":"Maximum width of text inside nodes","Monthly":"Monthly","Move":"Move","Move {0}":["Move ",["0"]],"Multiple pointers on same line":"Multiple pointers on same line","My dog ate my credit card!":"My dog ate my credit card!","Name":"Name","Name Chart":"Name Chart","Name your chart":"Name your chart","New":"New","New Email":"New Email","New Flowchart":"New Flowchart","New Folder":"New Folder","Next charge":"Next charge","No Edges":"No Edges","No Folder (Root)":"No Folder (Root)","No Watermarks!":"No Watermarks!","No charts yet":"No charts yet","No items in this folder":"No items in this folder","No matching charts found":"No matching charts found","Node Border Style":"Node Border Style","Node Colors":"Node Colors","Node ID":"Node ID","Node ID, Classes, Attributes":"Node ID, Classes, Attributes","Node Label":"Node Label","Node Shape":"Node Shape","Node Shapes":"Node Shapes","Nodes":"Nodes","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.","Not Empty":"Not Empty","Now you\'re thinking with flowcharts!":"Now you\'re thinking with flowcharts!","Office Hours":"Office Hours","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.","One on One Support":"One on One Support","One-on-One Support":"One-on-One Support","Open Customer Portal":"Open Customer Portal","Operation canceled":"Operation canceled","Or maybe blue!":"Or maybe blue!","Organization Chart":"Organization Chart","PNG & JPG export":"PNG & JPG export","Padding":"Padding","Page not found":"Page not found","Password":"Password","Past Due":"Past Due","Paste a document to convert it":"Paste a document to convert it","Paste your document or outline here to convert it into an organized flowchart.":"Paste your document or outline here to convert it into an organized flowchart.","Pasted content detected. Convert to Flowchart Fun syntax?":"Pasted content detected. Convert to Flowchart Fun syntax?","Perfect for docs and quick sharing":"Perfect for docs and quick sharing","Permanent Charts are a Pro Feature":"Permanent Charts are a Pro Feature","Playbook":"Playbook","Pointer and container on same line":"Pointer and container on same line","Priority One-on-One Support":"Priority One-on-One Support","Priority support":"Priority support","Privacy Policy":"Privacy Policy","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro starts at $4/mo billed yearly. Cancel anytime.","Pro tip: Right-click any node to customize its shape and color":"Pro tip: Right-click any node to customize its shape and color","Processing Data":"Processing Data","Processing...":"Processing...","Prompt":"Prompt","Public":"Public","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.","Quick experimentation space that resets daily":"Quick experimentation space that resets daily","Random":"Random","Rapid Deployment Templates":"Rapid Deployment Templates","Rapid Templates":"Rapid Templates","Raster Export (PNG, JPG)":"Raster Export (PNG, JPG)","Rate limit exceeded. Please try again later.":"Rate limit exceeded. Please try again later.","Read-only":"Read-only","Reference by Class":"Reference by Class","Reference by ID":"Reference by ID","Reference by Label":"Reference by Label","References":"References","References are used to create edges between nodes that are created elsewhere in the document":"References are used to create edges between nodes that are created elsewhere in the document","Referencing a node by its exact label":"Referencing a node by its exact label","Referencing a node by its unique ID":"Referencing a node by its unique ID","Referencing multiple nodes with the same assigned class":"Referencing multiple nodes with the same assigned class","Refresh Page":"Refresh Page","Reload to Update":"Reload to Update","Rename":"Rename","Rename {0}":["Rename ",["0"]],"Request Magic Link":"Request Magic Link","Request Password Reset":"Request Password Reset","Reset":"Reset","Reset Password":"Reset Password","Resume Subscription":"Resume Subscription","Return":"Return","Right to Left":"Right to Left","Right-click nodes for options":"Right-click nodes for options","Roadmap":"Roadmap","Rotate Label":"Rotate Label","SVG Export is a Pro Feature":"SVG Export is a Pro Feature","SVG, PDF & all export formats":"SVG, PDF & all export formats","Satisfaction guaranteed or first payment refunded":"Satisfaction guaranteed or first payment refunded","Save":"Save","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.","Save time with AI and dictation, making it easy to create diagrams.":"Save time with AI and dictation, making it easy to create diagrams.","Save to Cloud":"Save to Cloud","Save to File":"Save to File","Save your Work":"Save your Work","Schedule personal consultation sessions":"Schedule personal consultation sessions","Secure payment":"Secure payment","See more reviews on Product Hunt":"See more reviews on Product Hunt","See what\'s possible":"See what\'s possible","Select a destination folder for \\"{0}\\".":["Select a destination folder for \\"",["0"],"\\"."],"Send us a message":"Send us a message","Set a consistent height for all nodes":"Set a consistent height for all nodes","Settings":"Settings","Share":"Share","Sign In":"Sign In","Sign in with <0>GitHub":"Sign in with <0>GitHub","Sign in with <0>Google":"Sign in with <0>Google","Sorry! This page is only available in English.":"Sorry! This page is only available in English.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Sorry, there was an error converting the text to a flowchart. Try again later.","Sort Ascending":"Sort Ascending","Sort Descending":"Sort Descending","Sort by {0}":["Sort by ",["0"]],"Source Arrow Shape":"Source Arrow Shape","Source Column":"Source Column","Source Delimiter":"Source Delimiter","Source Distance From Node":"Source Distance From Node","Source/Target Arrow Shape":"Source/Target Arrow Shape","Spacing":"Spacing","Special Attributes":"Special Attributes","Start":"Start","Start Over":"Start Over","Start faster with use-case specific templates":"Start faster with use-case specific templates","Start for free":"Start for free","Status":"Status","Step 1":"Step 1","Step 2":"Step 2","Step 3":"Step 3","Store any data associated to a node":"Store any data associated to a node","Style Classes":"Style Classes","Style with classes":"Style with classes","Submit":"Submit","Subscription":"Subscription","Subscription Successful!":"Subscription Successful!","Subscription will end":"Subscription will end","Support":"Support","Target Arrow Shape":"Target Arrow Shape","Target Column":"Target Column","Target Delimiter":"Target Delimiter","Target Distance From Node":"Target Distance From Node","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Tell the AI what you need in plain English. Your diagram builds itself in seconds.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Tell us what\'s working and what isn\'t. Every message is read by the developer.","Text Color":"Text Color","Text Horizontal Offset":"Text Horizontal Offset","Text Leading":"Text Leading","Text Max Width":"Text Max Width","Text Vertical Offset":"Text Vertical Offset","Text followed by colon+space creates an edge with the text as the label":"Text followed by colon+space creates an edge with the text as the label","Text on a line creates a node with the text as the label":"Text on a line creates a node with the text as the label","Thank you for your feedback!":"Thank you for your feedback!","The beauty and magic reside in the minimalism.":"The beauty and magic reside in the minimalism.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"The best way to change styles is to right-click on a node or an edge and select the style you want.","The column that contains the edge label(s)":"The column that contains the edge label(s)","The column that contains the source node ID(s)":"The column that contains the source node ID(s)","The column that contains the target node ID(s)":"The column that contains the target node ID(s)","The delimiter used to separate multiple source nodes":"The delimiter used to separate multiple source nodes","The delimiter used to separate multiple target nodes":"The delimiter used to separate multiple target nodes","The fastest way to turn what\'s in your head into something everyone else can understand.":"The fastest way to turn what\'s in your head into something everyone else can understand.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.","The possible shapes are:":"The possible shapes are:","Theme":"Theme","Theme Customization Editor":"Theme Customization Editor","Theme Editor":"Theme Editor","Theme editor":"Theme editor","There are no edges in this data":"There are no edges in this data","This action cannot be undone.":"This action cannot be undone.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"This feature is only available to pro users. <0>Become a pro user to unlock it.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"This may take between 30 seconds and 2 minutes depending on the length of your input.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!","This will replace the current content.":"This will replace the current content.","This will replace your current chart content with the template content.":"This will replace your current chart content with the template content.","This will replace your current sandbox.":"This will replace your current sandbox.","Time to decide":"Time to decide","Tip":"Tip","To fix this change one of the edge IDs":"To fix this change one of the edge IDs","To fix this change one of the node IDs":"To fix this change one of the node IDs","To fix this move one pointer to the next line":"To fix this move one pointer to the next line","To fix this start the container <0/> on a different line":"To fix this start the container <0/> on a different line","To learn more about why we require you to log in, please read <0>this blog post.":"To learn more about why we require you to log in, please read <0>this blog post.","Top to Bottom":"Top to Bottom","Transform Your Ideas into Professional Diagrams in Seconds":"Transform Your Ideas into Professional Diagrams in Seconds","Transform text into diagrams instantly":"Transform text into diagrams instantly","Try AI":"Try AI","Try adjusting your search or filters to find what you\'re looking for.":"Try adjusting your search or filters to find what you\'re looking for.","Try again":"Try again","Try it free":"Try it free","Two edges have the same ID":"Two edges have the same ID","Two nodes have the same ID":"Two nodes have the same ID","Type it. See it.":"Type it. See it.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.","Undo":"Undo","Unescaped special character":"Unescaped special character","Unique text value to identify a node":"Unique text value to identify a node","Unknown":"Unknown","Unknown Parsing Error":"Unknown Parsing Error","Unlimited Flowcharts":"Unlimited Flowcharts","Unlimited Permanent Flowcharts":"Unlimited Permanent Flowcharts","Unlimited cloud-saved flowcharts":"Unlimited cloud-saved flowcharts","Unlimited saved diagrams":"Unlimited saved diagrams","Unlock AI Features and never lose your work with a Pro account.":"Unlock AI Features and never lose your work with a Pro account.","Unlock Unlimited AI Flowcharts":"Unlock Unlimited AI Flowcharts","Unpaid":"Unpaid","Update Email":"Update Email","Updated Date":"Updated Date","Upgrade Now - Save My Work":"Upgrade Now - Save My Work","Upgrade to Flowchart Fun Pro and unlock:":"Upgrade to Flowchart Fun Pro and unlock:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.","Upgrade to Pro":"Upgrade to Pro","Upgrade to Pro for permanent charts.":"Upgrade to Pro for permanent charts.","Upload your File":"Upload your File","Use Custom CSS Only":"Use Custom CSS Only","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!","Use classes to group nodes":"Use classes to group nodes","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Use the attribute <0>href to set a link on a node that opens in a new tab.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Use the attributes <0>w and <1>h to explicitly set the width and height of a node.","Use the customer portal to change your billing information.":"Use the customer portal to change your billing information.","Use these settings to adapt the look and behavior of your flowcharts":"Use these settings to adapt the look and behavior of your flowcharts","Use this file for org charts, hierarchies, and other organizational structures.":"Use this file for org charts, hierarchies, and other organizational structures.","Use this file for sequences, processes, and workflows.":"Use this file for sequences, processes, and workflows.","Use this mode to modify and enhance your current chart.":"Use this mode to modify and enhance your current chart.","Used at":"Used at","User":"User","Vector Export (SVG)":"Vector Export (SVG)","View on Github":"View on Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'","Watermark-Free Diagrams":"Watermark-Free Diagrams","Watermarks":"Watermarks","Welcome to Flowchart Fun":"Welcome to Flowchart Fun","What if I just need it for one project?":"What if I just need it for one project?","What our users are saying":"What our users are saying","What\'s next?":"What\'s next?","What\'s this?":"What\'s this?","Width":"Width","Width and Height":"Width and Height","Will my diagrams actually look professional?":"Will my diagrams actually look professional?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.","Would you like to continue?":"Would you like to continue?","Would you like to suggest a new example?":"Would you like to suggest a new example?","Wrap text in parentheses to connect to any node":"Wrap text in parentheses to connect to any node","Write like an outline":"Write like an outline","Write your prompt here or click to enable the microphone, then press and hold to record.":"Write your prompt here or click to enable the microphone, then press and hold to record.","Yearly":"Yearly","Yes — send us a message and we\'ll set you up with a discounted rate.":"Yes — send us a message and we\'ll set you up with a discounted rate.","Yes, Replace Content":"Yes, Replace Content","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["You are about to add ",["numNodes"]," nodes and ",["numEdges"]," edges to your graph."],"You need to log in to access this page.":"You need to log in to access this page.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know","You\'re doing great!":"You\'re doing great!","You\'re on the free plan.":"You\'re on the free plan.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!","Your Charts":"Your Charts","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.","Your next diagram should be your best one.":"Your next diagram should be your best one.","Your subscription is <0>{statusDisplay}.":["Your subscription is <0>",["statusDisplay"],"."],"Your work stays yours":"Your work stays yours","Zoom In":"Zoom In","Zoom Out":"Zoom Out","month":"month","or":"or","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"$48/year (save 33%) · Cancel anytime","$6/mo":"$6/mo","1 Temporary Flowchart":"1 Temporary Flowchart","1 diagram at a time":"1 diagram at a time","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Sign In / <1>Sign Up with email and password","A new version of the app is available. Please reload to update.":"A new version of the app is available. Please reload to update.","AI Creation & Editing":"AI Creation & Editing","AI generation & editing":"AI generation & editing","AI-Powered Flowchart Creation":"AI-Powered Flowchart Creation","AI-generated from plain text in under 5 seconds.":"AI-generated from plain text in under 5 seconds.","AI-powered editing to supercharge your workflow":"AI-powered editing to supercharge your workflow","About":"About","Account":"Account","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`","Add some steps":"Add some steps","Advanced":"Advanced","Align Horizontally":"Align Horizontally","Align Nodes":"Align Nodes","Align Vertically":"Align Vertically","All this for just $6/month - less than your daily coffee ☕":"All this for just $6/month - less than your daily coffee ☕","Always presentation-ready":"Always presentation-ready","Amount":"Amount","An error occurred. Try resubmitting or email {0} directly.":["An error occurred. Try resubmitting or email ",["0"]," directly."],"Appearance":"Appearance","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":["Are you sure you want to delete the flowchart \\"",["0"],"\\"? This action cannot be undone."],"Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":["Are you sure you want to delete the folder \\"",["0"],"\\" and all its contents? This action cannot be undone."],"Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":["Are you sure you want to delete the folder \\"",["0"],"\\"? This action cannot be undone."],"Are you sure?":"Are you sure?","Arrow Size":"Arrow Size","Attributes":"Attributes","August 2023":"August 2023","Back":"Back","Back To Editor":"Back To Editor","Background Color":"Background Color","Basic Flowchart":"Basic Flowchart","Become a Github Sponsor":"Become a Github Sponsor","Become a Pro User":"Become a Pro User","Begin your journey":"Begin your journey","Billed annually at $48":"Billed annually at $48","Billed monthly at $6":"Billed monthly at $6","Blog":"Blog","Book a Meeting":"Book a Meeting","Border Color":"Border Color","Border Width":"Border Width","Bottom to Top":"Bottom to Top","Breadthfirst":"Breadthfirst","Build your personal flowchart library":"Build your personal flowchart library","Can I import my existing diagrams?":"Can I import my existing diagrams?","Cancel":"Cancel","Cancel anytime":"Cancel anytime","Cancel your subscription. Your hosted charts will become read-only.":"Cancel your subscription. Your hosted charts will become read-only.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certain attributes can be used to customize the appearance or functionality of elements.","Change Email Address":"Change Email Address","Changelog":"Changelog","Charts":"Charts","Check out the guide:":"Check out the guide:","Check your email for a link to log in.<0/>You can close this window.":"Check your email for a link to log in.<0/>You can close this window.","Choose":"Choose","Choose Template":"Choose Template","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .","Choose how edges connect between nodes":"Choose how edges connect between nodes","Choose how nodes are automatically arranged in your flowchart":"Choose how nodes are automatically arranged in your flowchart","Circle":"Circle","Classes":"Classes","Clear":"Clear","Clear text?":"Clear text?","Clone":"Clone","Clone Flowchart":"Clone Flowchart","Close":"Close","Color":"Color","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Colors include red, orange, yellow, blue, purple, black, white, and gray.","Column":"Column","Comment":"Comment","Community templates":"Community templates","Compare our plans and find the perfect fit for your flowcharting needs":"Compare our plans and find the perfect fit for your flowcharting needs","Concentric":"Concentric","Confirm New Email":"Confirm New Email","Confirm your email address to sign in.":"Confirm your email address to sign in.","Connect your Data":"Connect your Data","Containers":"Containers","Containers are nodes that contain other nodes. They are declared using curly braces.":"Containers are nodes that contain other nodes. They are declared using curly braces.","Continue":"Continue","Continue in Sandbox (Resets daily, work not saved)":"Continue in Sandbox (Resets daily, work not saved)","Controls the flow direction of hierarchical layouts":"Controls the flow direction of hierarchical layouts","Convert":"Convert","Convert to Flowchart":"Convert to Flowchart","Convert to hosted chart?":"Convert to hosted chart?","Cookie Policy":"Cookie Policy","Copied SVG code to clipboard":"Copied SVG code to clipboard","Copied {format} to clipboard":["Copied ",["format"]," to clipboard"],"Copy":"Copy","Copy PNG Image":"Copy PNG Image","Copy SVG Code":"Copy SVG Code","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copy your mermaid.js code or open it directly in the mermaid.js live editor.","Create":"Create","Create Flowcharts using AI":"Create Flowcharts using AI","Create Unlimited Flowcharts":"Create Unlimited Flowcharts","Create a New Chart":"Create a New Chart","Create a flowchart showing the steps of planning and executing a school fundraising event":"Create a flowchart showing the steps of planning and executing a school fundraising event","Create a new flowchart to get started or organize your work with folders.":"Create a new flowchart to get started or organize your work with folders.","Create flowcharts instantly: Type or paste text, see it visualized.":"Create flowcharts instantly: Type or paste text, see it visualized.","Create unlimited diagrams for just $6/month!":"Create unlimited diagrams for just $6/month!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Create unlimited flowcharts stored in the cloud– accessible anywhere!","Create with AI":"Create with AI","Created Date":"Created Date","Creating an edge between two nodes is done by indenting the second node below the first":"Creating an edge between two nodes is done by indenting the second node below the first","Curve Style":"Curve Style","Custom CSS":"Custom CSS","Custom Sharing Options":"Custom Sharing Options","Custom sharing & public links":"Custom sharing & public links","Customer Portal":"Customer Portal","Daily Sandbox Editor":"Daily Sandbox Editor","Dark":"Dark","Dark Mode":"Dark Mode","Data Import (Visio, Lucidchart, CSV)":"Data Import (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Data import feature for complex diagrams","Date":"Date","Delete":"Delete","Delete {0}":["Delete ",["0"]],"Describe it and it appears":"Describe it and it appears","Describe your idea. Get a diagram worth presenting.":"Describe your idea. Get a diagram worth presenting.","Design a software development lifecycle flowchart for an agile team":"Design a software development lifecycle flowchart for an agile team","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Develop a decision tree for a CEO to evaluate potential new market opportunities","Direction":"Direction","Dismiss":"Dismiss","Do you offer discounts for students or nonprofits?":"Do you offer discounts for students or nonprofits?","Do you want to delete this?":"Do you want to delete this?","Document":"Document","Don\'t Lose Your Work":"Don\'t Lose Your Work","Download":"Download","Download JPG":"Download JPG","Download PNG":"Download PNG","Download SVG":"Download SVG","Drag and drop a CSV file here, or click to select a file":"Drag and drop a CSV file here, or click to select a file","Draw an edge from multiple nodes by beginning the line with a reference":"Draw an edge from multiple nodes by beginning the line with a reference","Drop the file here ...":"Drop the file here ...","Each line becomes a node":"Each line becomes a node","Edge ID, Classes, Attributes":"Edge ID, Classes, Attributes","Edge Label":"Edge Label","Edge Label Column":"Edge Label Column","Edge Style":"Edge Style","Edge Text Size":"Edge Text Size","Edge missing indentation":"Edge missing indentation","Edges":"Edges","Edges are declared in the same row as their source node":"Edges are declared in the same row as their source node","Edges are declared in the same row as their target node":"Edges are declared in the same row as their target node","Edges are declared in their own row":"Edges are declared in their own row","Edges can also have ID\'s, classes, and attributes before the label":"Edges can also have ID\'s, classes, and attributes before the label","Edges can be styled with dashed, dotted, or solid lines":"Edges can be styled with dashed, dotted, or solid lines","Edges in Separate Rows":"Edges in Separate Rows","Edges in Source Node Row":"Edges in Source Node Row","Edges in Target Node Row":"Edges in Target Node Row","Edit":"Edit","Edit with AI":"Edit with AI","Editable":"Editable","Editor":"Editor","Email":"Email","Empty":"Empty","Enable to set a consistent height for all nodes":"Enable to set a consistent height for all nodes","Enter a name for the cloned flowchart.":"Enter a name for the cloned flowchart.","Enter a name for the new folder.":"Enter a name for the new folder.","Enter a new name for the {0}.":["Enter a new name for the ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Enter your email address and we\'ll send you a magic link to sign in.","Enter your email address below and we\'ll send you a link to reset your password.":"Enter your email address below and we\'ll send you a link to reset your password.","Equal To":"Equal To","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.","Everything you need to know about Flowchart Fun Pro":"Everything you need to know about Flowchart Fun Pro","Examples":"Examples","Excalidraw":"Excalidraw","Exclusive Office Hours":"Exclusive Office Hours","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month","Explore Pro":"Explore Pro","Explore more":"Explore more","Export":"Export","Export clean diagrams without branding":"Export clean diagrams without branding","Export to PNG & JPG":"Export to PNG & JPG","Export to PNG, JPG, and SVG":"Export to PNG, JPG, and SVG","Feature Breakdown":"Feature Breakdown","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.","Fine-tune layouts and visual styles":"Fine-tune layouts and visual styles","Fixed Height":"Fixed Height","Fixed Node Height":"Fixed Node Height","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun is an open source project made by <0>Tone\xA0Row","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun is built and maintained by one developer. Your support keeps it going.","Follow Us on Twitter":"Follow Us on Twitter","Font Family":"Font Family","Forgot your password?":"Forgot your password?","Free":"Free","Free users: charts in the sandbox expire after 7 days.":"Free users: charts in the sandbox expire after 7 days.","Frequently Asked Questions":"Frequently Asked Questions","Full-screen, read-only, and template sharing":"Full-screen, read-only, and template sharing","Fullscreen":"Fullscreen","General":"General","Generate flowcharts from text automatically":"Generate flowcharts from text automatically","Get Pro Access Now":"Get Pro Access Now","Get Unlimited AI Requests":"Get Unlimited AI Requests","Get rapid responses to your questions":"Get rapid responses to your questions","Get unlimited flowcharts and premium features":"Get unlimited flowcharts and premium features","Go back home":"Go back home","Go to the Editor":"Go to the Editor","Go to your Sandbox":"Go to your Sandbox","Graph":"Graph","Green?":"Green?","Grid":"Grid","Group ranking and ranked-choice voting, free":"Group ranking and ranked-choice voting, free","Have complex questions or issues? We\'re here to help.":"Have complex questions or issues? We\'re here to help.","Here are some Pro features you can now enjoy.":"Here are some Pro features you can now enjoy.","High-quality exports with embedded fonts":"High-quality exports with embedded fonts","History":"History","Home":"Home","How are edges declared in this data?":"How are edges declared in this data?","How fast can I actually make something?":"How fast can I actually make something?","How would you like to save your chart?":"How would you like to save your chart?","I would like to request a new template:":"I would like to request a new template:","ID\'s":"ID\'s","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:","Images":"Images","Import Data":"Import Data","Import data from a CSV file.":"Import data from a CSV file.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.","Import from CSV":"Import from CSV","Import from Visio, Lucidchart, CSV":"Import from Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Import from Visio, Lucidchart, and CSV","Import from anywhere":"Import from anywhere","Import from popular diagram tools":"Import from popular diagram tools","Import your diagram it into Microsoft Visio using one of these CSV files.":"Import your diagram it into Microsoft Visio using one of these CSV files.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:","Indent to connect nodes":"Indent to connect nodes","Info":"Info","Is":"Is","Is my data private?":"Is my data private?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.","Join 2000+ professionals who\'ve upgraded their workflow":"Join 2000+ professionals who\'ve upgraded their workflow","Join thousands of happy users who love Flowchart Fun":"Join thousands of happy users who love Flowchart Fun","Keep Things Private":"Keep Things Private","Keep changes?":"Keep changes?","Keep practicing":"Keep practicing","Keep your data private on your computer":"Keep your data private on your computer","Language":"Language","Layout":"Layout","Layout Algorithm":"Layout Algorithm","Layout Frozen":"Layout Frozen","Leading References":"Leading References","Learn More":"Learn More","Learn Syntax":"Learn Syntax","Learn about Flowchart Fun Pro":"Learn about Flowchart Fun Pro","Left to Right":"Left to Right","Let us know why you\'re canceling. We\'re always looking to improve.":"Let us know why you\'re canceling. We\'re always looking to improve.","Light":"Light","Light Mode":"Light Mode","Link":"Link","Link back":"Link back","Load":"Load","Load Chart":"Load Chart","Load File":"Load File","Load Files":"Load Files","Load default content":"Load default content","Load from link?":"Load from link?","Load layout and styles":"Load layout and styles","Loading...":"Loading...","Local File Support":"Local File Support","Local saving for offline access":"Local saving for offline access","Lock Zoom to Graph":"Lock Zoom to Graph","Log In":"Log In","Log Out":"Log Out","Log in to Save":"Log in to Save","Log in to upgrade your account":"Log in to upgrade your account","Made by <0>Tone\xA0Row":"Made by <0>Tone\xA0Row","Make a One-Time Donation":"Make a One-Time Donation","Make it yours":"Make it yours","Make publicly accessible":"Make publicly accessible","Manage Billing":"Manage Billing","Map Data":"Map Data","Maximum width of text inside nodes":"Maximum width of text inside nodes","Monthly":"Monthly","More from Tone Row":"More from Tone Row","More from Tone Row:":"More from Tone Row:","More tools:":"More tools:","Move":"Move","Move {0}":["Move ",["0"]],"Multiple pointers on same line":"Multiple pointers on same line","My dog ate my credit card!":"My dog ate my credit card!","Name":"Name","Name Chart":"Name Chart","Name your chart":"Name your chart","New":"New","New Email":"New Email","New Flowchart":"New Flowchart","New Folder":"New Folder","Next charge":"Next charge","No Edges":"No Edges","No Folder (Root)":"No Folder (Root)","No Watermarks!":"No Watermarks!","No charts yet":"No charts yet","No items in this folder":"No items in this folder","No matching charts found":"No matching charts found","Node Border Style":"Node Border Style","Node Colors":"Node Colors","Node ID":"Node ID","Node ID, Classes, Attributes":"Node ID, Classes, Attributes","Node Label":"Node Label","Node Shape":"Node Shape","Node Shapes":"Node Shapes","Nodes":"Nodes","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.","Not Empty":"Not Empty","Now you\'re thinking with flowcharts!":"Now you\'re thinking with flowcharts!","Office Hours":"Office Hours","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.","One on One Support":"One on One Support","One-on-One Support":"One-on-One Support","Open Customer Portal":"Open Customer Portal","Operation canceled":"Operation canceled","Or maybe blue!":"Or maybe blue!","Organization Chart":"Organization Chart","PNG & JPG export":"PNG & JPG export","Padding":"Padding","Page not found":"Page not found","Password":"Password","Past Due":"Past Due","Paste a document to convert it":"Paste a document to convert it","Paste your document or outline here to convert it into an organized flowchart.":"Paste your document or outline here to convert it into an organized flowchart.","Pasted content detected. Convert to Flowchart Fun syntax?":"Pasted content detected. Convert to Flowchart Fun syntax?","Perfect for docs and quick sharing":"Perfect for docs and quick sharing","Permanent Charts are a Pro Feature":"Permanent Charts are a Pro Feature","Playbook":"Playbook","Pointer and container on same line":"Pointer and container on same line","Pricing":"Pricing","Priority One-on-One Support":"Priority One-on-One Support","Priority support":"Priority support","Privacy Policy":"Privacy Policy","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro starts at $4/mo billed yearly. Cancel anytime.","Pro tip: Right-click any node to customize its shape and color":"Pro tip: Right-click any node to customize its shape and color","Processing Data":"Processing Data","Processing...":"Processing...","Prompt":"Prompt","Public":"Public","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.","Quick experimentation space that resets daily":"Quick experimentation space that resets daily","Random":"Random","Rapid Deployment Templates":"Rapid Deployment Templates","Rapid Templates":"Rapid Templates","Raster Export (PNG, JPG)":"Raster Export (PNG, JPG)","Rate limit exceeded. Please try again later.":"Rate limit exceeded. Please try again later.","Read-only":"Read-only","Reference by Class":"Reference by Class","Reference by ID":"Reference by ID","Reference by Label":"Reference by Label","References":"References","References are used to create edges between nodes that are created elsewhere in the document":"References are used to create edges between nodes that are created elsewhere in the document","Referencing a node by its exact label":"Referencing a node by its exact label","Referencing a node by its unique ID":"Referencing a node by its unique ID","Referencing multiple nodes with the same assigned class":"Referencing multiple nodes with the same assigned class","Refresh Page":"Refresh Page","Reload to Update":"Reload to Update","Rename":"Rename","Rename {0}":["Rename ",["0"]],"Request Magic Link":"Request Magic Link","Request Password Reset":"Request Password Reset","Reset":"Reset","Reset Password":"Reset Password","Resume Subscription":"Resume Subscription","Return":"Return","Right to Left":"Right to Left","Right-click nodes for options":"Right-click nodes for options","Roadmap":"Roadmap","Rotate Label":"Rotate Label","SVG Export is a Pro Feature":"SVG Export is a Pro Feature","SVG, PDF & all export formats":"SVG, PDF & all export formats","Satisfaction guaranteed or first payment refunded":"Satisfaction guaranteed or first payment refunded","Save":"Save","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.","Save time with AI and dictation, making it easy to create diagrams.":"Save time with AI and dictation, making it easy to create diagrams.","Save to Cloud":"Save to Cloud","Save to File":"Save to File","Save your Work":"Save your Work","Schedule personal consultation sessions":"Schedule personal consultation sessions","Secure payment":"Secure payment","See more reviews on Product Hunt":"See more reviews on Product Hunt","See what\'s possible":"See what\'s possible","Select a destination folder for \\"{0}\\".":["Select a destination folder for \\"",["0"],"\\"."],"Send us a message":"Send us a message","Set a consistent height for all nodes":"Set a consistent height for all nodes","Settings":"Settings","Share":"Share","Sign In":"Sign In","Sign in with <0>GitHub":"Sign in with <0>GitHub","Sign in with <0>Google":"Sign in with <0>Google","Sorry! This page is only available in English.":"Sorry! This page is only available in English.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Sorry, there was an error converting the text to a flowchart. Try again later.","Sort Ascending":"Sort Ascending","Sort Descending":"Sort Descending","Sort by {0}":["Sort by ",["0"]],"Source Arrow Shape":"Source Arrow Shape","Source Column":"Source Column","Source Delimiter":"Source Delimiter","Source Distance From Node":"Source Distance From Node","Source/Target Arrow Shape":"Source/Target Arrow Shape","Spacing":"Spacing","Special Attributes":"Special Attributes","Start":"Start","Start Over":"Start Over","Start faster with use-case specific templates":"Start faster with use-case specific templates","Start for free":"Start for free","Status":"Status","Step 1":"Step 1","Step 2":"Step 2","Step 3":"Step 3","Store any data associated to a node":"Store any data associated to a node","Style Classes":"Style Classes","Style with classes":"Style with classes","Submit":"Submit","Subscription":"Subscription","Subscription Successful!":"Subscription Successful!","Subscription will end":"Subscription will end","Support":"Support","Target Arrow Shape":"Target Arrow Shape","Target Column":"Target Column","Target Delimiter":"Target Delimiter","Target Distance From Node":"Target Distance From Node","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Tell the AI what you need in plain English. Your diagram builds itself in seconds.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Tell us what\'s working and what isn\'t. Every message is read by the developer.","Text Color":"Text Color","Text Horizontal Offset":"Text Horizontal Offset","Text Leading":"Text Leading","Text Max Width":"Text Max Width","Text Vertical Offset":"Text Vertical Offset","Text followed by colon+space creates an edge with the text as the label":"Text followed by colon+space creates an edge with the text as the label","Text on a line creates a node with the text as the label":"Text on a line creates a node with the text as the label","Thank you for your feedback!":"Thank you for your feedback!","The beauty and magic reside in the minimalism.":"The beauty and magic reside in the minimalism.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"The best way to change styles is to right-click on a node or an edge and select the style you want.","The column that contains the edge label(s)":"The column that contains the edge label(s)","The column that contains the source node ID(s)":"The column that contains the source node ID(s)","The column that contains the target node ID(s)":"The column that contains the target node ID(s)","The delimiter used to separate multiple source nodes":"The delimiter used to separate multiple source nodes","The delimiter used to separate multiple target nodes":"The delimiter used to separate multiple target nodes","The fastest way to turn what\'s in your head into something everyone else can understand.":"The fastest way to turn what\'s in your head into something everyone else can understand.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.","The possible shapes are:":"The possible shapes are:","Theme":"Theme","Theme Customization Editor":"Theme Customization Editor","Theme Editor":"Theme Editor","Theme editor":"Theme editor","There are no edges in this data":"There are no edges in this data","This action cannot be undone.":"This action cannot be undone.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"This feature is only available to pro users. <0>Become a pro user to unlock it.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"This may take between 30 seconds and 2 minutes depending on the length of your input.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!","This will replace the current content.":"This will replace the current content.","This will replace your current chart content with the template content.":"This will replace your current chart content with the template content.","This will replace your current sandbox.":"This will replace your current sandbox.","Time to decide":"Time to decide","Tip":"Tip","To fix this change one of the edge IDs":"To fix this change one of the edge IDs","To fix this change one of the node IDs":"To fix this change one of the node IDs","To fix this move one pointer to the next line":"To fix this move one pointer to the next line","To fix this start the container <0/> on a different line":"To fix this start the container <0/> on a different line","To learn more about why we require you to log in, please read <0>this blog post.":"To learn more about why we require you to log in, please read <0>this blog post.","Top to Bottom":"Top to Bottom","Transform Your Ideas into Professional Diagrams in Seconds":"Transform Your Ideas into Professional Diagrams in Seconds","Transform text into diagrams instantly":"Transform text into diagrams instantly","Try AI":"Try AI","Try adjusting your search or filters to find what you\'re looking for.":"Try adjusting your search or filters to find what you\'re looking for.","Try again":"Try again","Try it free":"Try it free","Turn documents into diagrams with AI":"Turn documents into diagrams with AI","Two edges have the same ID":"Two edges have the same ID","Two nodes have the same ID":"Two nodes have the same ID","Type it. See it.":"Type it. See it.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.","Undo":"Undo","Unescaped special character":"Unescaped special character","Unique text value to identify a node":"Unique text value to identify a node","Unknown":"Unknown","Unknown Parsing Error":"Unknown Parsing Error","Unlimited Flowcharts":"Unlimited Flowcharts","Unlimited Permanent Flowcharts":"Unlimited Permanent Flowcharts","Unlimited cloud-saved flowcharts":"Unlimited cloud-saved flowcharts","Unlimited saved diagrams":"Unlimited saved diagrams","Unlock AI Features and never lose your work with a Pro account.":"Unlock AI Features and never lose your work with a Pro account.","Unlock Unlimited AI Flowcharts":"Unlock Unlimited AI Flowcharts","Unpaid":"Unpaid","Update Email":"Update Email","Updated Date":"Updated Date","Upgrade Now - Save My Work":"Upgrade Now - Save My Work","Upgrade to Flowchart Fun Pro and unlock:":"Upgrade to Flowchart Fun Pro and unlock:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.","Upgrade to Pro":"Upgrade to Pro","Upgrade to Pro for permanent charts.":"Upgrade to Pro for permanent charts.","Upload your File":"Upload your File","Use Custom CSS Only":"Use Custom CSS Only","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!","Use classes to group nodes":"Use classes to group nodes","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Use the attribute <0>href to set a link on a node that opens in a new tab.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Use the attributes <0>w and <1>h to explicitly set the width and height of a node.","Use the customer portal to change your billing information.":"Use the customer portal to change your billing information.","Use these settings to adapt the look and behavior of your flowcharts":"Use these settings to adapt the look and behavior of your flowcharts","Use this file for org charts, hierarchies, and other organizational structures.":"Use this file for org charts, hierarchies, and other organizational structures.","Use this file for sequences, processes, and workflows.":"Use this file for sequences, processes, and workflows.","Use this mode to modify and enhance your current chart.":"Use this mode to modify and enhance your current chart.","Used at":"Used at","User":"User","Vector Export (SVG)":"Vector Export (SVG)","View on Github":"View on Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'","Watermark-Free Diagrams":"Watermark-Free Diagrams","Watermarks":"Watermarks","Welcome to Flowchart Fun":"Welcome to Flowchart Fun","What if I just need it for one project?":"What if I just need it for one project?","What our users are saying":"What our users are saying","What\'s next?":"What\'s next?","What\'s this?":"What\'s this?","Width":"Width","Width and Height":"Width and Height","Will my diagrams actually look professional?":"Will my diagrams actually look professional?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.","Would you like to continue?":"Would you like to continue?","Would you like to suggest a new example?":"Would you like to suggest a new example?","Wrap text in parentheses to connect to any node":"Wrap text in parentheses to connect to any node","Write like an outline":"Write like an outline","Write your prompt here or click to enable the microphone, then press and hold to record.":"Write your prompt here or click to enable the microphone, then press and hold to record.","Yearly":"Yearly","Yes — send us a message and we\'ll set you up with a discounted rate.":"Yes — send us a message and we\'ll set you up with a discounted rate.","Yes, Replace Content":"Yes, Replace Content","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["You are about to add ",["numNodes"]," nodes and ",["numEdges"]," edges to your graph."],"You need to log in to access this page.":"You need to log in to access this page.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know","You\'re doing great!":"You\'re doing great!","You\'re on the free plan.":"You\'re on the free plan.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!","Your Charts":"Your Charts","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.","Your next diagram should be your best one.":"Your next diagram should be your best one.","Your subscription is <0>{statusDisplay}.":["Your subscription is <0>",["statusDisplay"],"."],"Your work stays yours":"Your work stays yours","Zoom In":"Zoom In","Zoom Out":"Zoom Out","month":"month","or":"or","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/en/messages.po b/app/src/locales/en/messages.po index 646e7c57d..fc1ceb954 100644 --- a/app/src/locales/en/messages.po +++ b/app/src/locales/en/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "$48/year (save 33%) · Cancel anytime" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "$6/mo" @@ -25,7 +25,7 @@ msgstr "$6/mo" msgid "1 Temporary Flowchart" msgstr "1 Temporary Flowchart" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "1 diagram at a time" @@ -33,7 +33,7 @@ msgstr "1 diagram at a time" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun is an open source project made by <1>Tone Row" @@ -49,7 +49,7 @@ msgstr "A new version of the app is available. Please reload to update." msgid "AI Creation & Editing" msgstr "AI Creation & Editing" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "AI generation & editing" @@ -57,7 +57,7 @@ msgstr "AI generation & editing" msgid "AI-Powered Flowchart Creation" msgstr "AI-Powered Flowchart Creation" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "AI-generated from plain text in under 5 seconds." @@ -65,12 +65,12 @@ msgstr "AI-generated from plain text in under 5 seconds." msgid "AI-powered editing to supercharge your workflow" msgstr "AI-powered editing to supercharge your workflow" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "About" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "Account" @@ -106,7 +106,7 @@ msgstr "Align Vertically" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "All this for just $6/month - less than your daily coffee ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "Always presentation-ready" @@ -118,7 +118,7 @@ msgstr "Amount" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "An error occurred. Try resubmitting or email {0} directly." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "Appearance" @@ -170,11 +170,11 @@ msgstr "Background Color" msgid "Basic Flowchart" msgstr "Basic Flowchart" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "Become a Github Sponsor" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "Become a Pro User" @@ -191,8 +191,8 @@ msgstr "Billed annually at $48" msgid "Billed monthly at $6" msgstr "Billed monthly at $6" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "Blog" @@ -260,14 +260,14 @@ msgstr "Certain attributes can be used to customize the appearance or functional msgid "Change Email Address" msgstr "Change Email Address" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "Changelog" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "Charts" @@ -346,7 +346,7 @@ msgstr "Column" msgid "Comment" msgstr "Comment" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "Community templates" @@ -403,7 +403,7 @@ msgstr "Convert to Flowchart" msgid "Convert to hosted chart?" msgstr "Convert to hosted chart?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Cookie Policy" @@ -500,7 +500,7 @@ msgstr "Custom CSS" msgid "Custom Sharing Options" msgstr "Custom Sharing Options" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "Custom sharing & public links" @@ -516,8 +516,8 @@ msgstr "Daily Sandbox Editor" msgid "Dark" msgstr "Dark" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "Dark Mode" @@ -542,11 +542,11 @@ msgstr "Delete" msgid "Delete {0}" msgstr "Delete {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "Describe it and it appears" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "Describe your idea. Get a diagram worth presenting." @@ -696,8 +696,8 @@ msgstr "Edit with AI" msgid "Editable" msgstr "Editable" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "Editor" @@ -742,7 +742,7 @@ msgstr "Enter your email address below and we'll send you a link to reset your p msgid "Equal To" msgstr "Equal To" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "Feature Breakdown" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "Feedback" @@ -823,11 +823,15 @@ msgstr "Fixed Node Height" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun is an open source project made by <0>Tone Row" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun is built and maintained by one developer. Your support keeps it going." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "Follow Us on Twitter" @@ -909,6 +913,10 @@ msgstr "Green?" msgid "Grid" msgstr "Grid" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "Group ranking and ranked-choice voting, free" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "Have complex questions or issues? We're here to help." @@ -980,7 +988,7 @@ msgstr "Import data from any CSV file and map it to a new flowchart. This is a g msgid "Import from CSV" msgstr "Import from CSV" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Import from Visio, Lucidchart, CSV" @@ -988,7 +996,7 @@ msgstr "Import from Visio, Lucidchart, CSV" msgid "Import from Visio, Lucidchart, and CSV" msgstr "Import from Visio, Lucidchart, and CSV" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "Import from anywhere" @@ -1012,7 +1020,7 @@ msgstr "Include a title using a <0>title attribute. To use Visio coloring, a msgid "Indent to connect nodes" msgstr "Indent to connect nodes" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "Info" @@ -1052,7 +1060,7 @@ msgstr "Keep practicing" msgid "Keep your data private on your computer" msgstr "Keep your data private on your computer" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "Language" @@ -1101,8 +1109,8 @@ msgstr "Let us know why you're canceling. We're always looking to improve." msgid "Light" msgstr "Light" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "Light Mode" @@ -1160,8 +1168,8 @@ msgstr "Local saving for offline access" msgid "Lock Zoom to Graph" msgstr "Lock Zoom to Graph" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "Log In" @@ -1177,11 +1185,15 @@ msgstr "Log in to Save" msgid "Log in to upgrade your account" msgstr "Log in to upgrade your account" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "Made by <0>Tone Row" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "Make a One-Time Donation" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "Make it yours" @@ -1205,6 +1217,18 @@ msgstr "Maximum width of text inside nodes" msgid "Monthly" msgstr "Monthly" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "More from Tone Row" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "More from Tone Row:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "More tools:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "Name Chart" msgid "Name your chart" msgstr "Name your chart" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "New" @@ -1363,7 +1387,7 @@ msgstr "Or maybe blue!" msgid "Organization Chart" msgstr "Organization Chart" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "PNG & JPG export" @@ -1412,21 +1436,25 @@ msgstr "Playbook" msgid "Pointer and container on same line" msgstr "Pointer and container on same line" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "Pricing" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "Priority One-on-One Support" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "Priority support" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "Privacy Policy" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "Pro starts at $4/mo billed yearly. Cancel anytime." @@ -1451,7 +1479,7 @@ msgstr "Prompt" msgid "Public" msgstr "Public" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." @@ -1575,8 +1603,8 @@ msgstr "Right to Left" msgid "Right-click nodes for options" msgstr "Right-click nodes for options" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "Roadmap" @@ -1590,7 +1618,7 @@ msgstr "Rotate Label" msgid "SVG Export is a Pro Feature" msgstr "SVG Export is a Pro Feature" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, PDF & all export formats" @@ -1603,7 +1631,7 @@ msgstr "Satisfaction guaranteed or first payment refunded" msgid "Save" msgstr "Save" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." @@ -1635,7 +1663,7 @@ msgstr "Secure payment" msgid "See more reviews on Product Hunt" msgstr "See more reviews on Product Hunt" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "See what's possible" @@ -1651,9 +1679,9 @@ msgstr "Send us a message" msgid "Set a consistent height for all nodes" msgstr "Set a consistent height for all nodes" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "Settings" @@ -1738,7 +1766,7 @@ msgstr "Start Over" msgid "Start faster with use-case specific templates" msgstr "Start faster with use-case specific templates" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "Start for free" @@ -1789,7 +1817,7 @@ msgstr "Subscription Successful!" msgid "Subscription will end" msgstr "Subscription will end" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "Support" @@ -1812,7 +1840,7 @@ msgstr "Target Delimiter" msgid "Target Distance From Node" msgstr "Target Distance From Node" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "Tell the AI what you need in plain English. Your diagram builds itself in seconds." @@ -1856,7 +1884,7 @@ msgstr "Text on a line creates a node with the text as the label" msgid "Thank you for your feedback!" msgstr "Thank you for your feedback!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "The beauty and magic reside in the minimalism." @@ -1884,7 +1912,7 @@ msgstr "The delimiter used to separate multiple source nodes" msgid "The delimiter used to separate multiple target nodes" msgstr "The delimiter used to separate multiple target nodes" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "The fastest way to turn what's in your head into something everyone else can understand." @@ -1911,7 +1939,7 @@ msgstr "Theme Customization Editor" msgid "Theme Editor" msgstr "Theme Editor" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "Theme editor" @@ -2000,10 +2028,14 @@ msgstr "Try adjusting your search or filters to find what you're looking for." msgid "Try again" msgstr "Try again" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "Try it free" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "Turn documents into diagrams with AI" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "Two edges have the same ID" @@ -2012,7 +2044,7 @@ msgstr "Two edges have the same ID" msgid "Two nodes have the same ID" msgstr "Two nodes have the same ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "Type it. See it." @@ -2057,7 +2089,7 @@ msgstr "Unlimited Permanent Flowcharts" msgid "Unlimited cloud-saved flowcharts" msgstr "Unlimited cloud-saved flowcharts" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "Unlimited saved diagrams" @@ -2089,13 +2121,17 @@ msgstr "Upgrade Now - Save My Work" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Upgrade to Flowchart Fun Pro and unlock:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "Upgrade to Pro" @@ -2152,7 +2188,7 @@ msgstr "Use this file for sequences, processes, and workflows." msgid "Use this mode to modify and enhance your current chart." msgstr "Use this mode to modify and enhance your current chart." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "Used at" @@ -2164,7 +2200,7 @@ msgstr "User" msgid "Vector Export (SVG)" msgstr "Vector Export (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "View on Github" @@ -2302,7 +2338,7 @@ msgstr "Your Sandbox is a space to freely experiment with our flowchart tools, r msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "Your next diagram should be your best one." @@ -2310,7 +2346,7 @@ msgstr "Your next diagram should be your best one." msgid "Your subscription is <0>{statusDisplay}." msgstr "Your subscription is <0>{statusDisplay}." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "Your work stays yours" @@ -2333,10 +2369,10 @@ msgid "or" msgstr "or" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/es/messages.js b/app/src/locales/es/messages.js index 4514f547f..411eda232 100644 --- a/app/src/locales/es/messages.js +++ b/app/src/locales/es/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"$48/año (ahorra 33%) · Cancelar en cualquier momento","$6/mo":"$6/mes","1 Temporary Flowchart":"1 Diagrama de Flujo Temporal","1 diagram at a time":"1 diagrama a la vez","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Solo CSS personalizado está habilitado. Solo se aplicarán los ajustes de Diseño y Avanzados.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun es un proyecto de código abierto hecho por <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Iniciar sesión / <1>Registrarse con correo electrónico y contraseña","A new version of the app is available. Please reload to update.":"Una nueva versión de la aplicación está disponible. Por favor, recargue para actualizar.","AI Creation & Editing":"Creación y edición de IA","AI generation & editing":"Generación y edición de IA","AI-Powered Flowchart Creation":"Creación de diagramas de flujo con inteligencia artificial","AI-generated from plain text in under 5 seconds.":"Generado por IA a partir de texto plano en menos de 5 segundos.","AI-powered editing to supercharge your workflow":"Edición impulsada por inteligencia artificial para potenciar tu flujo de trabajo","About":"Acerca de","Account":"Cuenta","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Agregue una barra invertida (<0>\\\\) antes de cualquier carácter especial: <1>(, <2>:, <3>#, o <4>.","Add some steps":"Agrega algunos pasos","Advanced":"Avanzado","Align Horizontally":"Alinear Horizontalmente","Align Nodes":"Alinear nodos","Align Vertically":"Alinear Verticalmente","All this for just $6/month - less than your daily coffee ☕":"Todo esto por solo $6 al mes, menos que tu café diario ☕","Always presentation-ready":"Siempre listo para presentar","Amount":"Cantidad","An error occurred. Try resubmitting or email {0} directly.":["Se ha producido un error. Inténtalo de nuevo o envía un correo electrónico directamente a ",["0"],"."],"Appearance":"Apariencia","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar el diagrama de flujo?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar la carpeta?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar la carpeta?","Are you sure?":"¿Estás seguro?","Arrow Size":"Tamaño de flecha","Attributes":"Atributos","August 2023":"Agosto 2023","Back":"Atrás","Back To Editor":"Volver al Editor","Background Color":"Color de fondo","Basic Flowchart":"Diagrama de Flujo Básico","Become a Github Sponsor":"Convierte en un Patrocinador de Github","Become a Pro User":"Convierte en un Usuario Pro","Begin your journey":"Comienza tu viaje","Billed annually at $48":"Facturado anualmente a $48","Billed monthly at $6":"Facturado mensualmente a $6","Blog":"Blog","Book a Meeting":"Reserva una reunión","Border Color":"Color de borde","Border Width":"Ancho de borde","Bottom to Top":"De abajo a arriba","Breadthfirst":"Primero en amplitud","Build your personal flowchart library":"Construye tu biblioteca personal de diagramas de flujo","Can I import my existing diagrams?":"¿Puedo importar mis diagramas existentes?","Cancel":"Cancelar","Cancel anytime":"Cancelar en cualquier momento","Cancel your subscription. Your hosted charts will become read-only.":"Cancele su suscripción. Sus gráficos alojados se convertirán en solo lectura.","Certain attributes can be used to customize the appearance or functionality of elements.":"Ciertos atributos se pueden usar para personalizar la apariencia o la funcionalidad de los elementos.","Change Email Address":"Cambiar dirección de correo electrónico","Changelog":"Registro de cambios","Charts":"Gráficos","Check out the guide:":"Echa un vistazo a la guía:","Check your email for a link to log in.<0/>You can close this window.":"Revise su correo electrónico para obtener un enlace para iniciar sesión. Puede cerrar esta ventana.","Choose":"Seleccionar","Choose Template":"Elige plantilla","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Elija entre una variedad de formas de flecha para la fuente y el destino de un borde. Las formas incluyen triángulo, triángulo-camiseta, círculo-triángulo, triángulo-cruz, triángulo-curva posterior, vee, camiseta, cuadrado, círculo, diamante, chevron, ninguno.","Choose how edges connect between nodes":"Elija cómo se conectan los bordes entre nodos","Choose how nodes are automatically arranged in your flowchart":"Elija cómo se organizan automáticamente los nodos en su diagrama de flujo","Circle":"Círculo","Classes":"Clases","Clear":"Claridad","Clear text?":"¿Texto claro?","Clone":"Clon","Clone Flowchart":"Clonar diagrama de flujo","Close":"Cerrar","Color":"Color","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Los colores incluyen rojo, naranja, amarillo, azul, morado, negro, blanco y gris.","Column":"Columna","Comment":"Comentario","Community templates":"Plantillas de la comunidad","Compare our plans and find the perfect fit for your flowcharting needs":"Compara nuestros planes y encuentra el ajuste perfecto para tus necesidades de diagramación de flujo","Concentric":"Concéntrico","Confirm New Email":"Confirmar nuevo correo electrónico","Confirm your email address to sign in.":"Confirma tu dirección de correo electrónico para iniciar sesión.","Connect your Data":"Conecta tus datos","Containers":"Contenedores","Containers are nodes that contain other nodes. They are declared using curly braces.":"Los contenedores son nodos que contienen otros nodos. Se declaran usando llaves.","Continue":"Continuar","Continue in Sandbox (Resets daily, work not saved)":"Continuar en el Área de Pruebas (Se reinicia diariamente, el trabajo no se guarda)","Controls the flow direction of hierarchical layouts":"Controla la dirección del flujo de los diseños jerárquicos","Convert":"Convertir","Convert to Flowchart":"Convertir a Diagrama de Flujo","Convert to hosted chart?":"¿Convertir a gráfico hospedado?","Cookie Policy":"Política de cookies","Copied SVG code to clipboard":"Código SVG copiado al portapapeles","Copied {format} to clipboard":[["format"]," copiado al portapapeles"],"Copy":"Copiar","Copy PNG Image":"Copiar imagen PNG","Copy SVG Code":"Copiar código SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copia tu código Excalidraw y pégalo en <0>excalidraw.com para editar. Esta característica es experimental y puede que no funcione con todos los diagramas. Si encuentras un error, <1>háganoslo saber.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copia tu código mermaid.js o abrilo directamente en el editor en vivo de mermaid.js.","Create":"Crear","Create Flowcharts using AI":"Crear diagramas de flujo con IA","Create Unlimited Flowcharts":"Crear diagramas de flujo ilimitados","Create a New Chart":"Crea un nuevo gráfico","Create a flowchart showing the steps of planning and executing a school fundraising event":"Crear un diagrama de flujo que muestre los pasos de planificación y ejecución de un evento de recaudación de fondos escolar","Create a new flowchart to get started or organize your work with folders.":"Crea un nuevo diagrama de flujo para empezar o organiza tu trabajo con carpetas.","Create flowcharts instantly: Type or paste text, see it visualized.":"Crea diagramas de flujo al instante: Escribe o pega texto, míralo visualizado.","Create unlimited diagrams for just $6/month!":"¡Crea diagramas ilimitados por solo $6 al mes!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"¡Crea diagramas de flujo ilimitados almacenados en la nube, accesibles desde cualquier lugar!","Create with AI":"Crear con IA","Created Date":"Fecha de creación","Creating an edge between two nodes is done by indenting the second node below the first":"Crear un borde entre dos nodos se realiza al sangrar el segundo nodo debajo del primero","Curve Style":"Estilo de Curva","Custom CSS":"CSS personalizado","Custom Sharing Options":"Opciones de compartición personalizadas","Custom sharing & public links":"Compartir personalizado y enlaces públicos","Customer Portal":"Portal del cliente","Daily Sandbox Editor":"Editor de Sandbox diario","Dark":"Oscuro","Dark Mode":"Modo oscuro","Data Import (Visio, Lucidchart, CSV)":"Importación de datos (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Función de importación de datos para diagramas complejos","Date":"Fecha","Delete":"Borrar","Delete {0}":["Borrar ",["0"]],"Describe it and it appears":"Descríbelo y aparecerá","Describe your idea. Get a diagram worth presenting.":"Describe tu idea. Obtén un diagrama que valga la pena presentar.","Design a software development lifecycle flowchart for an agile team":"Diseñar un diagrama de flujo del ciclo de vida de desarrollo de software para un equipo ágil","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Desarrollar un árbol de decisiones para que un CEO evalúe posibles nuevas oportunidades de mercado","Direction":"Dirección","Dismiss":"Descartar","Do you offer discounts for students or nonprofits?":"¿Ofrecen descuentos para estudiantes o organizaciones sin fines de lucro?","Do you want to delete this?":"¿Quieres eliminar esto?","Document":"Documento","Don\'t Lose Your Work":"No pierdas tu trabajo","Download":"Descargar","Download JPG":"Descargar JPG","Download PNG":"Descargar PNG","Download SVG":"Descargar SVG","Drag and drop a CSV file here, or click to select a file":"Arrastre y suelte un archivo CSV aquí o haga clic para seleccionar un archivo","Draw an edge from multiple nodes by beginning the line with a reference":"Dibuje un borde desde varios nodos comenzando la línea con una referencia","Drop the file here ...":"Suelta el archivo aquí ...","Each line becomes a node":"Cada línea se convierte en un nodo","Edge ID, Classes, Attributes":"ID de borde, Clases, Atributos","Edge Label":"Etiqueta de borde","Edge Label Column":"Columna de etiqueta de borde","Edge Style":"Estilo de borde","Edge Text Size":"Tamaño de texto de borde","Edge missing indentation":"Falta de sangría de borde","Edges":"Bordes","Edges are declared in the same row as their source node":"Los bordes se declaran en la misma fila que su nodo de origen","Edges are declared in the same row as their target node":"Los bordes se declaran en la misma fila que su nodo de destino","Edges are declared in their own row":"Los bordes se declaran en su propia fila","Edges can also have ID\'s, classes, and attributes before the label":"Los bordes también pueden tener ID, clases y atributos antes de la etiqueta","Edges can be styled with dashed, dotted, or solid lines":"Los bordes se pueden estilizar con líneas discontinuas, punteadas o sólidas","Edges in Separate Rows":"Bordes en filas separadas","Edges in Source Node Row":"Bordes en la fila del nodo de origen","Edges in Target Node Row":"Bordes en la fila del nodo de destino","Edit":"Editar","Edit with AI":"Editar con IA","Editable":"Editable","Editor":"Editor","Email":"Correo electrónico","Empty":"Vacío","Enable to set a consistent height for all nodes":"Activar para establecer una altura consistente para todos los nodos","Enter a name for the cloned flowchart.":"Ingrese un nombre para el diagrama de flujo clonado.","Enter a name for the new folder.":"Ingrese un nombre para la nueva carpeta.","Enter a new name for the {0}.":["Ingrese un nuevo nombre para el ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Introduzca su dirección de correo electrónico y le enviaremos un enlace mágico para iniciar sesión.","Enter your email address below and we\'ll send you a link to reset your password.":"Ingresa tu dirección de correo electrónico a continuación y te enviaremos un enlace para restablecer tu contraseña.","Equal To":"Igual a","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Cada diagrama se exporta como PNG, SVG o enlace compartible, listo para la reunión, el documento o la presentación.","Everything you need to know about Flowchart Fun Pro":"Todo lo que necesitas saber sobre Flowchart Fun Pro","Examples":"Ejemplos","Excalidraw":"Excalidraw","Exclusive Office Hours":"Horario de oficina exclusivo","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experimenta la eficiencia y seguridad de cargar archivos locales directamente en tu diagrama de flujo, perfecto para manejar documentos relacionados con el trabajo sin conexión. Desbloquea esta función exclusiva de Pro y más con Flowchart Fun Pro, disponible por solo $6 al mes.","Explore Pro":"Explorar Pro","Explore more":"Explora más","Export":"Exportar","Export clean diagrams without branding":"Exporta diagramas limpios sin marcas","Export to PNG & JPG":"Exportar a PNG y JPG","Export to PNG, JPG, and SVG":"Exportar a PNG, JPG y SVG","Feature Breakdown":"Desglose de características","Feedback":"Comentarios","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Siéntase libre de explorar y comuníquese con nosotros a través de la página de <0>Comentarios si tiene alguna preocupación.","Fine-tune layouts and visual styles":"Ajusta los diseños y estilos visuales","Fixed Height":"Altura fija","Fixed Node Height":"Altura de Nodo Fija","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro te ofrece diagramas de flujo ilimitados, colaboradores ilimitados y almacenamiento ilimitado por solo $6 al mes.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun está creado y mantenido por un solo desarrollador. Tu apoyo lo mantiene en marcha.","Follow Us on Twitter":"Síguenos en Twitter","Font Family":"Familia de Fuentes","Forgot your password?":"¿Olvidaste tu contraseña?","Free":"Gratis","Free users: charts in the sandbox expire after 7 days.":"Usuarios gratuitos: los diagramas en el área de pruebas caducan después de 7 días.","Frequently Asked Questions":"Preguntas Frecuentes","Full-screen, read-only, and template sharing":"Pantalla completa, solo lectura y compartición de plantillas","Fullscreen":"Pantalla completa","General":"General","Generate flowcharts from text automatically":"Genera diagramas de flujo automáticamente a partir de texto","Get Pro Access Now":"Obtén acceso Pro ahora","Get Unlimited AI Requests":"Obtén solicitudes de IA ilimitadas","Get rapid responses to your questions":"Obtén respuestas rápidas a tus preguntas","Get unlimited flowcharts and premium features":"Obtén flujogramas ilimitados y funciones premium","Go back home":"Vuelve a casa","Go to the Editor":"Ir al editor","Go to your Sandbox":"Ve a tu Sandbox","Graph":"Gráfico","Green?":"¿Verde?","Grid":"Cuadrícula","Have complex questions or issues? We\'re here to help.":"¿Tiene preguntas o problemas complejos? Estamos aquí para ayudar.","Here are some Pro features you can now enjoy.":"Aquí hay algunas características Pro que ahora puedes disfrutar.","High-quality exports with embedded fonts":"Exportaciones de alta calidad con fuentes incrustadas","History":"Historia","Home":"Hogar","How are edges declared in this data?":"¿Cómo se declaran los bordes en estos datos?","How fast can I actually make something?":"¿Qué tan rápido puedo crear algo realmente?","How would you like to save your chart?":"¿Cómo te gustaría guardar tu gráfico?","I would like to request a new template:":"Me gustaría solicitar una nueva plantilla:","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Si una cuenta con ese correo electrónico existe, le hemos enviado un correo electrónico con instrucciones sobre cómo restablecer su contraseña.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Si desea crear un borde, indente esta línea. Si no, escapar el dos puntos con una barra invertida <0>\\\\:","Images":"Imágenes","Import Data":"Importar datos","Import data from a CSV file.":"Importar datos de un archivo CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importar datos de cualquier archivo CSV y asignarlo a un nuevo diagrama de flujo. Esta es una excelente manera de importar datos de otras fuentes como Lucidchart, Google Sheets y Visio.","Import from CSV":"Importar desde CSV","Import from Visio, Lucidchart, CSV":"Importar desde Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importar desde Visio, Lucidchart y CSV","Import from anywhere":"Importar desde cualquier lugar","Import from popular diagram tools":"Importa desde herramientas populares de diagramas","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importa tu diagrama a Microsoft Visio usando uno de estos archivos CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importar datos es una función profesional. Puedes actualizar a Flowchart Fun Pro por solo $6/mes.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Incluye un título usando un atributo <0>title. Para usar el color de Visio, agrega un atributo <1>roleType igual a uno de los siguientes:","Indent to connect nodes":"Indenta para conectar nodos","Info":"Información","Is":"Es","Is my data private?":"¿Es privados mis datos?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas es una representación JSON de tu diagrama utilizada por <0>Obsidian Canvas y otras aplicaciones.","Join 2000+ professionals who\'ve upgraded their workflow":"Únete a más de 2000 profesionales que han mejorado su flujo de trabajo","Join thousands of happy users who love Flowchart Fun":"Únete a miles de usuarios felices que aman Flowchart Fun","Keep Things Private":"Mantener las cosas privadas","Keep changes?":"¿Mantener cambios?","Keep practicing":"Sigue practicando","Keep your data private on your computer":"Mantén tus datos privados en tu computadora","Language":"Idioma","Layout":"Diseño","Layout Algorithm":"Algoritmo de diseño","Layout Frozen":"Diseño Congelado","Leading References":"Referencias principales","Learn More":"Aprender más","Learn Syntax":"Aprender sintaxis","Learn about Flowchart Fun Pro":"Aprende sobre Flowchart Fun Pro","Left to Right":"De izquierda a derecha","Let us know why you\'re canceling. We\'re always looking to improve.":"Háganos saber por qué está cancelando. Siempre estamos buscando mejorar.","Light":"Luz","Light Mode":"Modo de luz","Link":"Enlace","Link back":"Volver al enlace","Load":"Cargar","Load Chart":"Cargar gráfico","Load File":"Cargar archivo","Load Files":"Cargar archivos","Load default content":"Cargar contenido predeterminado","Load from link?":"¿Cargar desde el enlace?","Load layout and styles":"Cargar diseño y estilos","Loading...":"Cargando...","Local File Support":"Soporte de archivos locales","Local saving for offline access":"Guardado local para acceder sin conexión","Lock Zoom to Graph":"Bloquear Zoom al gráfico","Log In":"Iniciar sesión","Log Out":"Cerrar sesión","Log in to Save":"Inicia sesión para guardar","Log in to upgrade your account":"Iniciar sesión para actualizar tu cuenta","Make a One-Time Donation":"Realizar una donación única","Make it yours":"Hazlo tuyo","Make publicly accessible":"Hacerlo accesible al público","Manage Billing":"Administrar facturación","Map Data":"Datos de mapa","Maximum width of text inside nodes":"Ancho máximo del texto dentro de los nodos","Monthly":"Mensual","Move":"Mover","Move {0}":["Mover ",["0"]],"Multiple pointers on same line":"Múltiples punteros en la misma línea","My dog ate my credit card!":"¡Mi perro se comió mi tarjeta de crédito!","Name":"Nombre","Name Chart":"Nombre del gráfico","Name your chart":"Nombre su gráfico","New":"Nuevo","New Email":"Nuevo Correo Electrónico","New Flowchart":"Nuevo Diagrama de Flujo","New Folder":"Nueva Carpeta","Next charge":"Próximo cargo","No Edges":"Sin Bordes","No Folder (Root)":"Sin Carpeta (Raíz)","No Watermarks!":"¡Sin marcas de agua!","No charts yet":"Sin gráficos aún","No items in this folder":"No hay elementos en esta carpeta","No matching charts found":"No se encontraron gráficos coincidentes","Node Border Style":"Estilo de borde de nodo","Node Colors":"Colores de nodo","Node ID":"ID de nodo","Node ID, Classes, Attributes":"ID de nodo, clases, atributos","Node Label":"Etiqueta de nodo","Node Shape":"Forma de Nodo","Node Shapes":"Formas de nodo","Nodes":"Nodos","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Los nodos se pueden estilizar con líneas discontinuas, punteadas o dobles. También se pueden eliminar los bordes con border_none.","Not Empty":"No vacío ","Now you\'re thinking with flowcharts!":"¡Ahora estás pensando con diagramas de flujo!","Office Hours":"Horas de oficina ","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"De vez en cuando, el enlace mágico acabará en tu carpeta de spam. Si no lo ves después de unos minutos, busca allí o solicita un nuevo enlace. ","One on One Support":"Soporte uno a uno","One-on-One Support":"Soporte individual","Open Customer Portal":"Abrir portal de clientes","Operation canceled":"Operación cancelada","Or maybe blue!":"¡O tal vez azul!","Organization Chart":"Organigrama","PNG & JPG export":"Exportar en PNG y JPG","Padding":"Relleno","Page not found":"Página no encontrada","Password":"Contraseña","Past Due":"Vencido","Paste a document to convert it":"Pegue un documento para convertirlo","Paste your document or outline here to convert it into an organized flowchart.":"Pegue su documento o esquema aquí para convertirlo en un diagrama de flujo organizado.","Pasted content detected. Convert to Flowchart Fun syntax?":"Contenido pegado detectado. ¿Convertir a sintaxis de Flowchart Fun?","Perfect for docs and quick sharing":"Perfecto para documentos y compartir rápidamente","Permanent Charts are a Pro Feature":"Los gráficos permanentes son una característica Pro","Playbook":"Libreta de juegos","Pointer and container on same line":"Puntero y contenedor en la misma línea","Priority One-on-One Support":"Soporte prioritario uno a uno","Priority support":"Soporte prioritario","Privacy Policy":"Política de privacidad","Pro starts at $4/mo billed yearly. Cancel anytime.":"La versión Pro comienza en $4/mes facturado anualmente. Cancelar en cualquier momento.","Pro tip: Right-click any node to customize its shape and color":"Consejo profesional: Haz clic derecho en cualquier nodo para personalizar su forma y color","Processing Data":"Procesamiento de datos","Processing...":"Procesando...","Prompt":"Indicación","Public":"Público","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importar datos de Visio, Lucidchart, CSV o comenzar desde una plantilla. No recrees lo que ya existe.","Quick experimentation space that resets daily":"Espacio de experimentación rápida que se reinicia diariamente","Random":"Aleatorio","Rapid Deployment Templates":"Plantillas de implementación rápida","Rapid Templates":"Plantillas rápidas","Raster Export (PNG, JPG)":"Exportación de ráster (PNG, JPG)","Rate limit exceeded. Please try again later.":"Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.","Read-only":"Sólo lectura","Reference by Class":"Referencia por clase","Reference by ID":"Referencia por ID","Reference by Label":"Referencia por etiqueta","References":"Referencias","References are used to create edges between nodes that are created elsewhere in the document":"Las referencias se utilizan para crear bordes entre los nodos creados en otro lugar del documento","Referencing a node by its exact label":"Referenciando un nodo por su etiqueta exacta","Referencing a node by its unique ID":"Referenciando un nodo por su ID único","Referencing multiple nodes with the same assigned class":"Referenciando múltiples nodos con la misma clase asignada","Refresh Page":"Refrescar la página","Reload to Update":"Recargar para actualizar","Rename":"Renombrar","Rename {0}":["Cambiar nombre de ",["0"]],"Request Magic Link":"Solicitar enlace mágico","Request Password Reset":"Solicitar restablecimiento de contraseña","Reset":"Restablecer","Reset Password":"Restablecer la contraseña","Resume Subscription":"Reanudar la suscripción","Return":"Devolver","Right to Left":"De derecha a izquierda","Right-click nodes for options":"Haga clic derecho en los nodos para ver las opciones","Roadmap":"Hoja de ruta","Rotate Label":"Rotar etiqueta","SVG Export is a Pro Feature":"La exportación de SVG es una función Pro","SVG, PDF & all export formats":"SVG, PDF y todos los formatos de exportación","Satisfaction guaranteed or first payment refunded":"Garantía de satisfacción o reembolso del primer pago","Save":"Guardar","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Guardar localmente, trabajar sin conexión y controlar exactamente quién ve qué. Ningún dato sale de tu máquina a menos que lo autorices.","Save time with AI and dictation, making it easy to create diagrams.":"Ahorra tiempo con IA y dictado, lo que facilita la creación de diagramas.","Save to Cloud":"Guardar en la nube","Save to File":"Guardar en archivo","Save your Work":"Guarda tu trabajo","Schedule personal consultation sessions":"Programar sesiones de consulta personal","Secure payment":"Pago seguro","See more reviews on Product Hunt":"Ver más reseñas en Product Hunt","See what\'s possible":"Ver lo que es posible","Select a destination folder for \\"{0}\\".":"Selecciona una carpeta de destino para \\\\","Send us a message":"Envíanos un mensaje","Set a consistent height for all nodes":"Establecer una altura consistente para todos los nodos","Settings":"Configuración","Share":"Compartir","Sign In":"Iniciar sesión","Sign in with <0>GitHub":"Iniciar sesión con <0>GitHub","Sign in with <0>Google":"Iniciar sesión con <0>Google","Sorry! This page is only available in English.":"¡Lo sentimos! Esta página solo está disponible en inglés.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Lo siento, hubo un error al convertir el texto en un diagrama. Inténtalo de nuevo más tarde.","Sort Ascending":"Ordenar de forma ascendente","Sort Descending":"Ordenar de forma descendente","Sort by {0}":["Ordenar por ",["0"]],"Source Arrow Shape":"Forma de flecha de origen","Source Column":"Columna de origen","Source Delimiter":"Delimitador de Origen","Source Distance From Node":"Distancia del origen al nodo","Source/Target Arrow Shape":"Forma de Flecha de Origen/Destino","Spacing":"Espaciado","Special Attributes":"Atributos Especiales","Start":"Comienzo","Start Over":"Empezar de nuevo","Start faster with use-case specific templates":"Comenzar más rápido con plantillas específicas para casos de uso","Start for free":"Comenzar gratis","Status":"Estado","Step 1":"Paso 1","Step 2":"Paso 2","Step 3":"Paso 3","Store any data associated to a node":"Almacenar cualquier dato asociado a un nodo","Style Classes":"Clases de Estilo","Style with classes":"Estilo con clases","Submit":"Enviar","Subscription":"Suscripción","Subscription Successful!":"¡Suscripción exitosa!","Subscription will end":"La suscripción finalizará","Support":"Soporte","Target Arrow Shape":"Forma de flecha de destino","Target Column":"Columna objetivo","Target Delimiter":"Delimitador objetivo","Target Distance From Node":"Distancia objetivo desde el nodo","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Dile al AI lo que necesitas en inglés sencillo. Tu diagrama se construye en segundos.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Cuéntanos qué está funcionando y qué no. Cada mensaje es leído por el desarrollador.","Text Color":"Color del texto","Text Horizontal Offset":"Desplazamiento horizontal del texto","Text Leading":"Texto principal","Text Max Width":"Ancho máximo del texto","Text Vertical Offset":"Desplazamiento vertical del texto","Text followed by colon+space creates an edge with the text as the label":"El texto seguido de dos puntos y un espacio crea un borde con el texto como etiqueta","Text on a line creates a node with the text as the label":"El texto en una línea crea un nodo con el texto como etiqueta","Thank you for your feedback!":"¡Gracias por tu comentario!","The beauty and magic reside in the minimalism.":"La belleza y la magia residen en el minimalismo.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"La mejor manera de cambiar los estilos es hacer clic derecho en un nodo o un borde y seleccionar el estilo deseado.","The column that contains the edge label(s)":"La columna que contiene la etiqueta(s) de borde","The column that contains the source node ID(s)":"La columna que contiene el ID(s) del nodo de origen","The column that contains the target node ID(s)":"La columna que contiene el ID(s) del nodo de destino","The delimiter used to separate multiple source nodes":"El delimitador utilizado para separar múltiples nodos de origen","The delimiter used to separate multiple target nodes":"El delimitador utilizado para separar múltiples nodos de destino","The fastest way to turn what\'s in your head into something everyone else can understand.":"La forma más rápida de convertir lo que tienes en mente en algo que todos puedan entender.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"El plan gratuito funciona muy bien para el uso diario. Si necesitas funciones Pro, es mensual a $6/mes - cancela en cualquier momento sin compromiso.","The possible shapes are:":"Las formas posibles son:","Theme":"Tema","Theme Customization Editor":"Editor de Personalización de Temas","Theme Editor":"Editor de temas","Theme editor":"Editor de tema","There are no edges in this data":"No hay bordes en estos datos","This action cannot be undone.":"Esta acción no se puede deshacer.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Esta característica solo está disponible para usuarios profesionales. <0>Conviértete en un usuario profesional para desbloquearla.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Esto puede tardar entre 30 segundos y 2 minutos dependiendo de la longitud de su entrada.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Esta caja de arena es perfecta para experimentar, pero recuerda: se reinicia diariamente. ¡Actualiza ahora y guarda tu trabajo actual!","This will replace the current content.":"Esto reemplazará el contenido actual.","This will replace your current chart content with the template content.":"Esto reemplazará el contenido actual de tu gráfico con el contenido de la plantilla.","This will replace your current sandbox.":"Esto reemplazará su sandbox actual.","Time to decide":"Hora de decidir","Tip":"Consejo","To fix this change one of the edge IDs":"Para solucionar esto cambia uno de los IDs de borde","To fix this change one of the node IDs":"Para solucionar esto cambia uno de los IDs de nodo","To fix this move one pointer to the next line":"Para solucionar esto mueve un puntero a la siguiente línea","To fix this start the container <0/> on a different line":"Para solucionar esto, inicie el contenedor <0/> en una línea diferente","To learn more about why we require you to log in, please read <0>this blog post.":"Para obtener más información sobre por qué requerimos que inicie sesión, lea <0>esta publicación de blog.","Top to Bottom":"De arriba a abajo","Transform Your Ideas into Professional Diagrams in Seconds":"Transforma tus ideas en diagramas profesionales en segundos","Transform text into diagrams instantly":"Transforma texto en diagramas al instante.","Try AI":"Prueba IA","Try adjusting your search or filters to find what you\'re looking for.":"Prueba a ajustar tu búsqueda o filtros para encontrar lo que estás buscando.","Try again":"Inténtalo de nuevo","Try it free":"Pruébalo gratis","Two edges have the same ID":"Dos bordes tienen el mismo ID","Two nodes have the same ID":"Dos nodos tienen el mismo ID","Type it. See it.":"Escríbelo. Míralo.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"¡Ups, se acabaron tus solicitudes gratuitas! Actualiza a Flowchart Fun Pro para conversiones de diagramas ilimitadas, y sigue transformando texto en claros y visuales flujogramas tan fácilmente como copiar y pegar.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"En menos de 60 segundos. Escribe unas pocas líneas de texto o describe lo que necesitas al AI, y tu diagrama aparece al instante. Exporta o compártelo con un solo clic.","Undo":"Deshacer","Unescaped special character":"Carácter especial sin escape","Unique text value to identify a node":"Valor de texto único para identificar un nodo","Unknown":"Desconocido","Unknown Parsing Error":"Error de análisis desconocido","Unlimited Flowcharts":"Flujos de trabajo ilimitados","Unlimited Permanent Flowcharts":"Flujo de gráficos permanentes ilimitados","Unlimited cloud-saved flowcharts":"Diagramas de flujo guardados en la nube de forma ilimitada","Unlimited saved diagrams":"Diagramas guardados ilimitados","Unlock AI Features and never lose your work with a Pro account.":"Desbloquea las funciones de IA y nunca pierdas tu trabajo con una cuenta Pro.","Unlock Unlimited AI Flowcharts":"Desbloquea diagramas de flujo de IA ilimitados","Unpaid":"Impago","Update Email":"Actualizar correo electrónico","Updated Date":"Fecha actualizada","Upgrade Now - Save My Work":"Actualizar ahora - Guardar mi trabajo","Upgrade to Flowchart Fun Pro and unlock:":"Actualiza a Flowchart Fun Pro y desbloquea:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Actualiza a Flowchart Fun Pro para desbloquear la exportación de SVG y disfrutar de funciones más avanzadas para tus diagramas.","Upgrade to Pro":"Actualizar a Pro","Upgrade to Pro for permanent charts.":"Actualiza a Pro para gráficos permanentes.","Upload your File":"Subir tu archivo","Use Custom CSS Only":"Usar solo CSS personalizado","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"¿Usas Lucidchart o Visio? ¡La importación de CSV facilita obtener datos de cualquier fuente!","Use classes to group nodes":"Usar clases para agrupar nodos","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Utilice el atributo <0>href para establecer un enlace en un nodo que se abra en una nueva pestaña.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Utilice el atributo <0>src para establecer la imagen de un nodo. La imagen se escalará para ajustarse al nodo, por lo que es posible que deba ajustar el ancho y la altura del nodo para obtener el resultado deseado. Solo se admiten imágenes públicas (no bloqueadas por CORS).","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Utilice los atributos <0>w y <1>h para establecer explícitamente el ancho y la altura de un nodo.","Use the customer portal to change your billing information.":"Utilice el portal de clientes para cambiar su información de facturación.","Use these settings to adapt the look and behavior of your flowcharts":"Utilice estos ajustes para adaptar la apariencia y el comportamiento de sus diagramas de flujo","Use this file for org charts, hierarchies, and other organizational structures.":"Utilice este archivo para diagramas de organización, jerarquías y otras estructuras organizativas.","Use this file for sequences, processes, and workflows.":"Utilice este archivo para secuencias, procesos y flujos de trabajo.","Use this mode to modify and enhance your current chart.":"Utilice este modo para modificar y mejorar su gráfico actual.","Used at":"Utilizado en","User":"Usuario ","Vector Export (SVG)":"Exportación de vectores (SVG)","View on Github":"Ver en Github ","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"¿Quieres crear un diagrama a partir de un documento? Pégalo en el editor y haz clic en \\"Convertir a diagrama\\".","Watermark-Free Diagrams":"Diagramas sin marca de agua","Watermarks":"Marcas de agua","Welcome to Flowchart Fun":"Bienvenido a Flowchart Divertido","What if I just need it for one project?":"¿Y si solo lo necesito para un proyecto?","What our users are saying":"Lo que dicen nuestros usuarios","What\'s next?":"¿Qué sigue?","What\'s this?":"¿Qué es esto?","Width":"Ancho","Width and Height":"Ancho y Alto","Will my diagrams actually look professional?":"¿Mis diagramas se verán realmente profesionales?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Con la versión Pro de Flowchart Fun, puedes utilizar comandos de lenguaje natural para completar rápidamente los detalles de tu diagrama, ideal para crear diagramas sobre la marcha. Por $6/mes, obtén la facilidad de la edición de IA accesible para mejorar tu experiencia de creación de diagramas.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Con la versión pro puedes guardar y cargar archivos locales. Es perfecto para gestionar documentos relacionados con el trabajo sin conexión.","Would you like to continue?":"¿Te gustaría continuar?","Would you like to suggest a new example?":"¿Te gustaría sugerir un nuevo ejemplo?","Wrap text in parentheses to connect to any node":"Envuelve el texto entre paréntesis para conectarlo a cualquier nodo","Write like an outline":"Escribe como un esquema","Write your prompt here or click to enable the microphone, then press and hold to record.":"Escribe tu instrucción aquí o haz clic para activar el micrófono, luego mantén presionado para grabar.","Yearly":"Anualmente","Yes — send us a message and we\'ll set you up with a discounted rate.":"Sí - envíanos un mensaje y te proporcionaremos una tarifa con descuento.","Yes, Replace Content":"Sí, Reemplazar Contenido","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Sí. Cada diagrama utiliza diseños equilibrados y automáticos con tipografía limpia. Puedes personalizar temas, colores y estilos, y exportarlos como SVG nítidos o PNG de alta resolución que se vean geniales en cualquier presentación o documento.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Sí. La versión Pro admite la importación desde Visio, Lucidchart y CSV, para que puedas traer lo que ya tienes sin tener que recrearlo desde cero.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Sí. Puedes guardar y cargar archivos localmente, trabajar completamente sin conexión y controlar exactamente quién ve tus diagramas. Ningún dato sale de tu máquina a menos que decidas compartirlo.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Estás a punto de agregar ",["numNodes"]," nodos y ",["numEdges"]," bordes a tu gráfico."],"You need to log in to access this page.":"Necesitas iniciar sesión para acceder a esta página.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Ya eres un usuario Pro. <0>Gestionar suscripción<1/>¿Tienes preguntas o solicitudes de funciones? <2>Háganos saber","You\'re doing great!":"¡Lo estás haciendo genial!","You\'re on the free plan.":"Estás en el plan gratuito.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Has utilizado todas tus conversiones de IA gratuitas. Actualiza a Pro para un uso ilimitado de IA, temas personalizados, uso privado compartido y más. ¡Sigue creando increíbles diagramas de flujo sin esfuerzo!","Your Charts":"Tus gráficos","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Su Sandbox es un espacio para experimentar libremente con nuestras herramientas de diagrama de flujo, reiniciando cada día para comenzar de nuevo.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Tus gráficos son de solo lectura porque tu cuenta ya no está activa. Visita la página de tu <0>cuenta para obtener más información.","Your next diagram should be your best one.":"Tu próximo diagrama debería ser el mejor.","Your subscription is <0>{statusDisplay}.":["Su suscripción es <0>",["statusDisplay"],"."],"Your work stays yours":"Tu trabajo se queda contigo.","Zoom In":"Zoom In","Zoom Out":"Zoom Out","month":"mes","or":"o","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"$48/año (ahorra 33%) · Cancelar en cualquier momento","$6/mo":"$6/mes","1 Temporary Flowchart":"1 Diagrama de Flujo Temporal","1 diagram at a time":"1 diagrama a la vez","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Solo CSS personalizado está habilitado. Solo se aplicarán los ajustes de Diseño y Avanzados.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun es un proyecto de código abierto hecho por <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Iniciar sesión / <1>Registrarse con correo electrónico y contraseña","A new version of the app is available. Please reload to update.":"Una nueva versión de la aplicación está disponible. Por favor, recargue para actualizar.","AI Creation & Editing":"Creación y edición de IA","AI generation & editing":"Generación y edición de IA","AI-Powered Flowchart Creation":"Creación de diagramas de flujo con inteligencia artificial","AI-generated from plain text in under 5 seconds.":"Generado por IA a partir de texto plano en menos de 5 segundos.","AI-powered editing to supercharge your workflow":"Edición impulsada por inteligencia artificial para potenciar tu flujo de trabajo","About":"Acerca de","Account":"Cuenta","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Agregue una barra invertida (<0>\\\\) antes de cualquier carácter especial: <1>(, <2>:, <3>#, o <4>.","Add some steps":"Agrega algunos pasos","Advanced":"Avanzado","Align Horizontally":"Alinear Horizontalmente","Align Nodes":"Alinear nodos","Align Vertically":"Alinear Verticalmente","All this for just $6/month - less than your daily coffee ☕":"Todo esto por solo $6 al mes, menos que tu café diario ☕","Always presentation-ready":"Siempre listo para presentar","Amount":"Cantidad","An error occurred. Try resubmitting or email {0} directly.":["Se ha producido un error. Inténtalo de nuevo o envía un correo electrónico directamente a ",["0"],"."],"Appearance":"Apariencia","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar el diagrama de flujo?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar la carpeta?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"¿Estás seguro/a de que quieres eliminar la carpeta?","Are you sure?":"¿Estás seguro?","Arrow Size":"Tamaño de flecha","Attributes":"Atributos","August 2023":"Agosto 2023","Back":"Atrás","Back To Editor":"Volver al Editor","Background Color":"Color de fondo","Basic Flowchart":"Diagrama de Flujo Básico","Become a Github Sponsor":"Convierte en un Patrocinador de Github","Become a Pro User":"Convierte en un Usuario Pro","Begin your journey":"Comienza tu viaje","Billed annually at $48":"Facturado anualmente a $48","Billed monthly at $6":"Facturado mensualmente a $6","Blog":"Blog","Book a Meeting":"Reserva una reunión","Border Color":"Color de borde","Border Width":"Ancho de borde","Bottom to Top":"De abajo a arriba","Breadthfirst":"Primero en amplitud","Build your personal flowchart library":"Construye tu biblioteca personal de diagramas de flujo","Can I import my existing diagrams?":"¿Puedo importar mis diagramas existentes?","Cancel":"Cancelar","Cancel anytime":"Cancelar en cualquier momento","Cancel your subscription. Your hosted charts will become read-only.":"Cancele su suscripción. Sus gráficos alojados se convertirán en solo lectura.","Certain attributes can be used to customize the appearance or functionality of elements.":"Ciertos atributos se pueden usar para personalizar la apariencia o la funcionalidad de los elementos.","Change Email Address":"Cambiar dirección de correo electrónico","Changelog":"Registro de cambios","Charts":"Gráficos","Check out the guide:":"Echa un vistazo a la guía:","Check your email for a link to log in.<0/>You can close this window.":"Revise su correo electrónico para obtener un enlace para iniciar sesión. Puede cerrar esta ventana.","Choose":"Seleccionar","Choose Template":"Elige plantilla","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Elija entre una variedad de formas de flecha para la fuente y el destino de un borde. Las formas incluyen triángulo, triángulo-camiseta, círculo-triángulo, triángulo-cruz, triángulo-curva posterior, vee, camiseta, cuadrado, círculo, diamante, chevron, ninguno.","Choose how edges connect between nodes":"Elija cómo se conectan los bordes entre nodos","Choose how nodes are automatically arranged in your flowchart":"Elija cómo se organizan automáticamente los nodos en su diagrama de flujo","Circle":"Círculo","Classes":"Clases","Clear":"Claridad","Clear text?":"¿Texto claro?","Clone":"Clon","Clone Flowchart":"Clonar diagrama de flujo","Close":"Cerrar","Color":"Color","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Los colores incluyen rojo, naranja, amarillo, azul, morado, negro, blanco y gris.","Column":"Columna","Comment":"Comentario","Community templates":"Plantillas de la comunidad","Compare our plans and find the perfect fit for your flowcharting needs":"Compara nuestros planes y encuentra el ajuste perfecto para tus necesidades de diagramación de flujo","Concentric":"Concéntrico","Confirm New Email":"Confirmar nuevo correo electrónico","Confirm your email address to sign in.":"Confirma tu dirección de correo electrónico para iniciar sesión.","Connect your Data":"Conecta tus datos","Containers":"Contenedores","Containers are nodes that contain other nodes. They are declared using curly braces.":"Los contenedores son nodos que contienen otros nodos. Se declaran usando llaves.","Continue":"Continuar","Continue in Sandbox (Resets daily, work not saved)":"Continuar en el Área de Pruebas (Se reinicia diariamente, el trabajo no se guarda)","Controls the flow direction of hierarchical layouts":"Controla la dirección del flujo de los diseños jerárquicos","Convert":"Convertir","Convert to Flowchart":"Convertir a Diagrama de Flujo","Convert to hosted chart?":"¿Convertir a gráfico hospedado?","Cookie Policy":"Política de cookies","Copied SVG code to clipboard":"Código SVG copiado al portapapeles","Copied {format} to clipboard":[["format"]," copiado al portapapeles"],"Copy":"Copiar","Copy PNG Image":"Copiar imagen PNG","Copy SVG Code":"Copiar código SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copia tu código Excalidraw y pégalo en <0>excalidraw.com para editar. Esta característica es experimental y puede que no funcione con todos los diagramas. Si encuentras un error, <1>háganoslo saber.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copia tu código mermaid.js o abrilo directamente en el editor en vivo de mermaid.js.","Create":"Crear","Create Flowcharts using AI":"Crear diagramas de flujo con IA","Create Unlimited Flowcharts":"Crear diagramas de flujo ilimitados","Create a New Chart":"Crea un nuevo gráfico","Create a flowchart showing the steps of planning and executing a school fundraising event":"Crear un diagrama de flujo que muestre los pasos de planificación y ejecución de un evento de recaudación de fondos escolar","Create a new flowchart to get started or organize your work with folders.":"Crea un nuevo diagrama de flujo para empezar o organiza tu trabajo con carpetas.","Create flowcharts instantly: Type or paste text, see it visualized.":"Crea diagramas de flujo al instante: Escribe o pega texto, míralo visualizado.","Create unlimited diagrams for just $6/month!":"¡Crea diagramas ilimitados por solo $6 al mes!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"¡Crea diagramas de flujo ilimitados almacenados en la nube, accesibles desde cualquier lugar!","Create with AI":"Crear con IA","Created Date":"Fecha de creación","Creating an edge between two nodes is done by indenting the second node below the first":"Crear un borde entre dos nodos se realiza al sangrar el segundo nodo debajo del primero","Curve Style":"Estilo de Curva","Custom CSS":"CSS personalizado","Custom Sharing Options":"Opciones de compartición personalizadas","Custom sharing & public links":"Compartir personalizado y enlaces públicos","Customer Portal":"Portal del cliente","Daily Sandbox Editor":"Editor de Sandbox diario","Dark":"Oscuro","Dark Mode":"Modo oscuro","Data Import (Visio, Lucidchart, CSV)":"Importación de datos (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Función de importación de datos para diagramas complejos","Date":"Fecha","Delete":"Borrar","Delete {0}":["Borrar ",["0"]],"Describe it and it appears":"Descríbelo y aparecerá","Describe your idea. Get a diagram worth presenting.":"Describe tu idea. Obtén un diagrama que valga la pena presentar.","Design a software development lifecycle flowchart for an agile team":"Diseñar un diagrama de flujo del ciclo de vida de desarrollo de software para un equipo ágil","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Desarrollar un árbol de decisiones para que un CEO evalúe posibles nuevas oportunidades de mercado","Direction":"Dirección","Dismiss":"Descartar","Do you offer discounts for students or nonprofits?":"¿Ofrecen descuentos para estudiantes o organizaciones sin fines de lucro?","Do you want to delete this?":"¿Quieres eliminar esto?","Document":"Documento","Don\'t Lose Your Work":"No pierdas tu trabajo","Download":"Descargar","Download JPG":"Descargar JPG","Download PNG":"Descargar PNG","Download SVG":"Descargar SVG","Drag and drop a CSV file here, or click to select a file":"Arrastre y suelte un archivo CSV aquí o haga clic para seleccionar un archivo","Draw an edge from multiple nodes by beginning the line with a reference":"Dibuje un borde desde varios nodos comenzando la línea con una referencia","Drop the file here ...":"Suelta el archivo aquí ...","Each line becomes a node":"Cada línea se convierte en un nodo","Edge ID, Classes, Attributes":"ID de borde, Clases, Atributos","Edge Label":"Etiqueta de borde","Edge Label Column":"Columna de etiqueta de borde","Edge Style":"Estilo de borde","Edge Text Size":"Tamaño de texto de borde","Edge missing indentation":"Falta de sangría de borde","Edges":"Bordes","Edges are declared in the same row as their source node":"Los bordes se declaran en la misma fila que su nodo de origen","Edges are declared in the same row as their target node":"Los bordes se declaran en la misma fila que su nodo de destino","Edges are declared in their own row":"Los bordes se declaran en su propia fila","Edges can also have ID\'s, classes, and attributes before the label":"Los bordes también pueden tener ID, clases y atributos antes de la etiqueta","Edges can be styled with dashed, dotted, or solid lines":"Los bordes se pueden estilizar con líneas discontinuas, punteadas o sólidas","Edges in Separate Rows":"Bordes en filas separadas","Edges in Source Node Row":"Bordes en la fila del nodo de origen","Edges in Target Node Row":"Bordes en la fila del nodo de destino","Edit":"Editar","Edit with AI":"Editar con IA","Editable":"Editable","Editor":"Editor","Email":"Correo electrónico","Empty":"Vacío","Enable to set a consistent height for all nodes":"Activar para establecer una altura consistente para todos los nodos","Enter a name for the cloned flowchart.":"Ingrese un nombre para el diagrama de flujo clonado.","Enter a name for the new folder.":"Ingrese un nombre para la nueva carpeta.","Enter a new name for the {0}.":["Ingrese un nuevo nombre para el ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Introduzca su dirección de correo electrónico y le enviaremos un enlace mágico para iniciar sesión.","Enter your email address below and we\'ll send you a link to reset your password.":"Ingresa tu dirección de correo electrónico a continuación y te enviaremos un enlace para restablecer tu contraseña.","Equal To":"Igual a","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Cada diagrama se exporta como PNG, SVG o enlace compartible, listo para la reunión, el documento o la presentación.","Everything you need to know about Flowchart Fun Pro":"Todo lo que necesitas saber sobre Flowchart Fun Pro","Examples":"Ejemplos","Excalidraw":"Excalidraw","Exclusive Office Hours":"Horario de oficina exclusivo","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experimenta la eficiencia y seguridad de cargar archivos locales directamente en tu diagrama de flujo, perfecto para manejar documentos relacionados con el trabajo sin conexión. Desbloquea esta función exclusiva de Pro y más con Flowchart Fun Pro, disponible por solo $6 al mes.","Explore Pro":"Explorar Pro","Explore more":"Explora más","Export":"Exportar","Export clean diagrams without branding":"Exporta diagramas limpios sin marcas","Export to PNG & JPG":"Exportar a PNG y JPG","Export to PNG, JPG, and SVG":"Exportar a PNG, JPG y SVG","Feature Breakdown":"Desglose de características","Feedback":"Comentarios","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Siéntase libre de explorar y comuníquese con nosotros a través de la página de <0>Comentarios si tiene alguna preocupación.","Fine-tune layouts and visual styles":"Ajusta los diseños y estilos visuales","Fixed Height":"Altura fija","Fixed Node Height":"Altura de Nodo Fija","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro te ofrece diagramas de flujo ilimitados, colaboradores ilimitados y almacenamiento ilimitado por solo $6 al mes.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun es un proyecto de código abierto creado por <0>Tone\xA0Row","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun está creado y mantenido por un solo desarrollador. Tu apoyo lo mantiene en marcha.","Follow Us on Twitter":"Síguenos en Twitter","Font Family":"Familia de Fuentes","Forgot your password?":"¿Olvidaste tu contraseña?","Free":"Gratis","Free users: charts in the sandbox expire after 7 days.":"Usuarios gratuitos: los diagramas en el área de pruebas caducan después de 7 días.","Frequently Asked Questions":"Preguntas Frecuentes","Full-screen, read-only, and template sharing":"Pantalla completa, solo lectura y compartición de plantillas","Fullscreen":"Pantalla completa","General":"General","Generate flowcharts from text automatically":"Genera diagramas de flujo automáticamente a partir de texto","Get Pro Access Now":"Obtén acceso Pro ahora","Get Unlimited AI Requests":"Obtén solicitudes de IA ilimitadas","Get rapid responses to your questions":"Obtén respuestas rápidas a tus preguntas","Get unlimited flowcharts and premium features":"Obtén flujogramas ilimitados y funciones premium","Go back home":"Vuelve a casa","Go to the Editor":"Ir al editor","Go to your Sandbox":"Ve a tu Sandbox","Graph":"Gráfico","Green?":"¿Verde?","Grid":"Cuadrícula","Group ranking and ranked-choice voting, free":"Clasificación de grupos y votación de elección clasificada, gratis","Have complex questions or issues? We\'re here to help.":"¿Tiene preguntas o problemas complejos? Estamos aquí para ayudar.","Here are some Pro features you can now enjoy.":"Aquí hay algunas características Pro que ahora puedes disfrutar.","High-quality exports with embedded fonts":"Exportaciones de alta calidad con fuentes incrustadas","History":"Historia","Home":"Hogar","How are edges declared in this data?":"¿Cómo se declaran los bordes en estos datos?","How fast can I actually make something?":"¿Qué tan rápido puedo crear algo realmente?","How would you like to save your chart?":"¿Cómo te gustaría guardar tu gráfico?","I would like to request a new template:":"Me gustaría solicitar una nueva plantilla:","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Si una cuenta con ese correo electrónico existe, le hemos enviado un correo electrónico con instrucciones sobre cómo restablecer su contraseña.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Si desea crear un borde, indente esta línea. Si no, escapar el dos puntos con una barra invertida <0>\\\\:","Images":"Imágenes","Import Data":"Importar datos","Import data from a CSV file.":"Importar datos de un archivo CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importar datos de cualquier archivo CSV y asignarlo a un nuevo diagrama de flujo. Esta es una excelente manera de importar datos de otras fuentes como Lucidchart, Google Sheets y Visio.","Import from CSV":"Importar desde CSV","Import from Visio, Lucidchart, CSV":"Importar desde Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importar desde Visio, Lucidchart y CSV","Import from anywhere":"Importar desde cualquier lugar","Import from popular diagram tools":"Importa desde herramientas populares de diagramas","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importa tu diagrama a Microsoft Visio usando uno de estos archivos CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importar datos es una función profesional. Puedes actualizar a Flowchart Fun Pro por solo $6/mes.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Incluye un título usando un atributo <0>title. Para usar el color de Visio, agrega un atributo <1>roleType igual a uno de los siguientes:","Indent to connect nodes":"Indenta para conectar nodos","Info":"Información","Is":"Es","Is my data private?":"¿Es privados mis datos?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas es una representación JSON de tu diagrama utilizada por <0>Obsidian Canvas y otras aplicaciones.","Join 2000+ professionals who\'ve upgraded their workflow":"Únete a más de 2000 profesionales que han mejorado su flujo de trabajo","Join thousands of happy users who love Flowchart Fun":"Únete a miles de usuarios felices que aman Flowchart Fun","Keep Things Private":"Mantener las cosas privadas","Keep changes?":"¿Mantener cambios?","Keep practicing":"Sigue practicando","Keep your data private on your computer":"Mantén tus datos privados en tu computadora","Language":"Idioma","Layout":"Diseño","Layout Algorithm":"Algoritmo de diseño","Layout Frozen":"Diseño Congelado","Leading References":"Referencias principales","Learn More":"Aprender más","Learn Syntax":"Aprender sintaxis","Learn about Flowchart Fun Pro":"Aprende sobre Flowchart Fun Pro","Left to Right":"De izquierda a derecha","Let us know why you\'re canceling. We\'re always looking to improve.":"Háganos saber por qué está cancelando. Siempre estamos buscando mejorar.","Light":"Luz","Light Mode":"Modo de luz","Link":"Enlace","Link back":"Volver al enlace","Load":"Cargar","Load Chart":"Cargar gráfico","Load File":"Cargar archivo","Load Files":"Cargar archivos","Load default content":"Cargar contenido predeterminado","Load from link?":"¿Cargar desde el enlace?","Load layout and styles":"Cargar diseño y estilos","Loading...":"Cargando...","Local File Support":"Soporte de archivos locales","Local saving for offline access":"Guardado local para acceder sin conexión","Lock Zoom to Graph":"Bloquear Zoom al gráfico","Log In":"Iniciar sesión","Log Out":"Cerrar sesión","Log in to Save":"Inicia sesión para guardar","Log in to upgrade your account":"Iniciar sesión para actualizar tu cuenta","Made by <0>Tone\xA0Row":"Creado por <0>Tone\xA0Row","Make a One-Time Donation":"Realizar una donación única","Make it yours":"Hazlo tuyo","Make publicly accessible":"Hacerlo accesible al público","Manage Billing":"Administrar facturación","Map Data":"Datos de mapa","Maximum width of text inside nodes":"Ancho máximo del texto dentro de los nodos","Monthly":"Mensual","More from Tone Row":"Más de Tone Row","More from Tone Row:":"Más de Tone Row:","More tools:":"Más herramientas:","Move":"Mover","Move {0}":["Mover ",["0"]],"Multiple pointers on same line":"Múltiples punteros en la misma línea","My dog ate my credit card!":"¡Mi perro se comió mi tarjeta de crédito!","Name":"Nombre","Name Chart":"Nombre del gráfico","Name your chart":"Nombre su gráfico","New":"Nuevo","New Email":"Nuevo Correo Electrónico","New Flowchart":"Nuevo Diagrama de Flujo","New Folder":"Nueva Carpeta","Next charge":"Próximo cargo","No Edges":"Sin Bordes","No Folder (Root)":"Sin Carpeta (Raíz)","No Watermarks!":"¡Sin marcas de agua!","No charts yet":"Sin gráficos aún","No items in this folder":"No hay elementos en esta carpeta","No matching charts found":"No se encontraron gráficos coincidentes","Node Border Style":"Estilo de borde de nodo","Node Colors":"Colores de nodo","Node ID":"ID de nodo","Node ID, Classes, Attributes":"ID de nodo, clases, atributos","Node Label":"Etiqueta de nodo","Node Shape":"Forma de Nodo","Node Shapes":"Formas de nodo","Nodes":"Nodos","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Los nodos se pueden estilizar con líneas discontinuas, punteadas o dobles. También se pueden eliminar los bordes con border_none.","Not Empty":"No vacío ","Now you\'re thinking with flowcharts!":"¡Ahora estás pensando con diagramas de flujo!","Office Hours":"Horas de oficina ","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"De vez en cuando, el enlace mágico acabará en tu carpeta de spam. Si no lo ves después de unos minutos, busca allí o solicita un nuevo enlace. ","One on One Support":"Soporte uno a uno","One-on-One Support":"Soporte individual","Open Customer Portal":"Abrir portal de clientes","Operation canceled":"Operación cancelada","Or maybe blue!":"¡O tal vez azul!","Organization Chart":"Organigrama","PNG & JPG export":"Exportar en PNG y JPG","Padding":"Relleno","Page not found":"Página no encontrada","Password":"Contraseña","Past Due":"Vencido","Paste a document to convert it":"Pegue un documento para convertirlo","Paste your document or outline here to convert it into an organized flowchart.":"Pegue su documento o esquema aquí para convertirlo en un diagrama de flujo organizado.","Pasted content detected. Convert to Flowchart Fun syntax?":"Contenido pegado detectado. ¿Convertir a sintaxis de Flowchart Fun?","Perfect for docs and quick sharing":"Perfecto para documentos y compartir rápidamente","Permanent Charts are a Pro Feature":"Los gráficos permanentes son una característica Pro","Playbook":"Libreta de juegos","Pointer and container on same line":"Puntero y contenedor en la misma línea","Pricing":"Precios","Priority One-on-One Support":"Soporte prioritario uno a uno","Priority support":"Soporte prioritario","Privacy Policy":"Política de privacidad","Pro starts at $4/mo billed yearly. Cancel anytime.":"La versión Pro comienza en $4/mes facturado anualmente. Cancelar en cualquier momento.","Pro tip: Right-click any node to customize its shape and color":"Consejo profesional: Haz clic derecho en cualquier nodo para personalizar su forma y color","Processing Data":"Procesamiento de datos","Processing...":"Procesando...","Prompt":"Indicación","Public":"Público","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importar datos de Visio, Lucidchart, CSV o comenzar desde una plantilla. No recrees lo que ya existe.","Quick experimentation space that resets daily":"Espacio de experimentación rápida que se reinicia diariamente","Random":"Aleatorio","Rapid Deployment Templates":"Plantillas de implementación rápida","Rapid Templates":"Plantillas rápidas","Raster Export (PNG, JPG)":"Exportación de ráster (PNG, JPG)","Rate limit exceeded. Please try again later.":"Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.","Read-only":"Sólo lectura","Reference by Class":"Referencia por clase","Reference by ID":"Referencia por ID","Reference by Label":"Referencia por etiqueta","References":"Referencias","References are used to create edges between nodes that are created elsewhere in the document":"Las referencias se utilizan para crear bordes entre los nodos creados en otro lugar del documento","Referencing a node by its exact label":"Referenciando un nodo por su etiqueta exacta","Referencing a node by its unique ID":"Referenciando un nodo por su ID único","Referencing multiple nodes with the same assigned class":"Referenciando múltiples nodos con la misma clase asignada","Refresh Page":"Refrescar la página","Reload to Update":"Recargar para actualizar","Rename":"Renombrar","Rename {0}":["Cambiar nombre de ",["0"]],"Request Magic Link":"Solicitar enlace mágico","Request Password Reset":"Solicitar restablecimiento de contraseña","Reset":"Restablecer","Reset Password":"Restablecer la contraseña","Resume Subscription":"Reanudar la suscripción","Return":"Devolver","Right to Left":"De derecha a izquierda","Right-click nodes for options":"Haga clic derecho en los nodos para ver las opciones","Roadmap":"Hoja de ruta","Rotate Label":"Rotar etiqueta","SVG Export is a Pro Feature":"La exportación de SVG es una función Pro","SVG, PDF & all export formats":"SVG, PDF y todos los formatos de exportación","Satisfaction guaranteed or first payment refunded":"Garantía de satisfacción o reembolso del primer pago","Save":"Guardar","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Guardar localmente, trabajar sin conexión y controlar exactamente quién ve qué. Ningún dato sale de tu máquina a menos que lo autorices.","Save time with AI and dictation, making it easy to create diagrams.":"Ahorra tiempo con IA y dictado, lo que facilita la creación de diagramas.","Save to Cloud":"Guardar en la nube","Save to File":"Guardar en archivo","Save your Work":"Guarda tu trabajo","Schedule personal consultation sessions":"Programar sesiones de consulta personal","Secure payment":"Pago seguro","See more reviews on Product Hunt":"Ver más reseñas en Product Hunt","See what\'s possible":"Ver lo que es posible","Select a destination folder for \\"{0}\\".":"Selecciona una carpeta de destino para \\\\","Send us a message":"Envíanos un mensaje","Set a consistent height for all nodes":"Establecer una altura consistente para todos los nodos","Settings":"Configuración","Share":"Compartir","Sign In":"Iniciar sesión","Sign in with <0>GitHub":"Iniciar sesión con <0>GitHub","Sign in with <0>Google":"Iniciar sesión con <0>Google","Sorry! This page is only available in English.":"¡Lo sentimos! Esta página solo está disponible en inglés.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Lo siento, hubo un error al convertir el texto en un diagrama. Inténtalo de nuevo más tarde.","Sort Ascending":"Ordenar de forma ascendente","Sort Descending":"Ordenar de forma descendente","Sort by {0}":["Ordenar por ",["0"]],"Source Arrow Shape":"Forma de flecha de origen","Source Column":"Columna de origen","Source Delimiter":"Delimitador de Origen","Source Distance From Node":"Distancia del origen al nodo","Source/Target Arrow Shape":"Forma de Flecha de Origen/Destino","Spacing":"Espaciado","Special Attributes":"Atributos Especiales","Start":"Comienzo","Start Over":"Empezar de nuevo","Start faster with use-case specific templates":"Comenzar más rápido con plantillas específicas para casos de uso","Start for free":"Comenzar gratis","Status":"Estado","Step 1":"Paso 1","Step 2":"Paso 2","Step 3":"Paso 3","Store any data associated to a node":"Almacenar cualquier dato asociado a un nodo","Style Classes":"Clases de Estilo","Style with classes":"Estilo con clases","Submit":"Enviar","Subscription":"Suscripción","Subscription Successful!":"¡Suscripción exitosa!","Subscription will end":"La suscripción finalizará","Support":"Soporte","Target Arrow Shape":"Forma de flecha de destino","Target Column":"Columna objetivo","Target Delimiter":"Delimitador objetivo","Target Distance From Node":"Distancia objetivo desde el nodo","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Dile al AI lo que necesitas en inglés sencillo. Tu diagrama se construye en segundos.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Cuéntanos qué está funcionando y qué no. Cada mensaje es leído por el desarrollador.","Text Color":"Color del texto","Text Horizontal Offset":"Desplazamiento horizontal del texto","Text Leading":"Texto principal","Text Max Width":"Ancho máximo del texto","Text Vertical Offset":"Desplazamiento vertical del texto","Text followed by colon+space creates an edge with the text as the label":"El texto seguido de dos puntos y un espacio crea un borde con el texto como etiqueta","Text on a line creates a node with the text as the label":"El texto en una línea crea un nodo con el texto como etiqueta","Thank you for your feedback!":"¡Gracias por tu comentario!","The beauty and magic reside in the minimalism.":"La belleza y la magia residen en el minimalismo.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"La mejor manera de cambiar los estilos es hacer clic derecho en un nodo o un borde y seleccionar el estilo deseado.","The column that contains the edge label(s)":"La columna que contiene la etiqueta(s) de borde","The column that contains the source node ID(s)":"La columna que contiene el ID(s) del nodo de origen","The column that contains the target node ID(s)":"La columna que contiene el ID(s) del nodo de destino","The delimiter used to separate multiple source nodes":"El delimitador utilizado para separar múltiples nodos de origen","The delimiter used to separate multiple target nodes":"El delimitador utilizado para separar múltiples nodos de destino","The fastest way to turn what\'s in your head into something everyone else can understand.":"La forma más rápida de convertir lo que tienes en mente en algo que todos puedan entender.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"El plan gratuito funciona muy bien para el uso diario. Si necesitas funciones Pro, es mensual a $6/mes - cancela en cualquier momento sin compromiso.","The possible shapes are:":"Las formas posibles son:","Theme":"Tema","Theme Customization Editor":"Editor de Personalización de Temas","Theme Editor":"Editor de temas","Theme editor":"Editor de tema","There are no edges in this data":"No hay bordes en estos datos","This action cannot be undone.":"Esta acción no se puede deshacer.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Esta característica solo está disponible para usuarios profesionales. <0>Conviértete en un usuario profesional para desbloquearla.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Esto puede tardar entre 30 segundos y 2 minutos dependiendo de la longitud de su entrada.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Esta caja de arena es perfecta para experimentar, pero recuerda: se reinicia diariamente. ¡Actualiza ahora y guarda tu trabajo actual!","This will replace the current content.":"Esto reemplazará el contenido actual.","This will replace your current chart content with the template content.":"Esto reemplazará el contenido actual de tu gráfico con el contenido de la plantilla.","This will replace your current sandbox.":"Esto reemplazará su sandbox actual.","Time to decide":"Hora de decidir","Tip":"Consejo","To fix this change one of the edge IDs":"Para solucionar esto cambia uno de los IDs de borde","To fix this change one of the node IDs":"Para solucionar esto cambia uno de los IDs de nodo","To fix this move one pointer to the next line":"Para solucionar esto mueve un puntero a la siguiente línea","To fix this start the container <0/> on a different line":"Para solucionar esto, inicie el contenedor <0/> en una línea diferente","To learn more about why we require you to log in, please read <0>this blog post.":"Para obtener más información sobre por qué requerimos que inicie sesión, lea <0>esta publicación de blog.","Top to Bottom":"De arriba a abajo","Transform Your Ideas into Professional Diagrams in Seconds":"Transforma tus ideas en diagramas profesionales en segundos","Transform text into diagrams instantly":"Transforma texto en diagramas al instante.","Try AI":"Prueba IA","Try adjusting your search or filters to find what you\'re looking for.":"Prueba a ajustar tu búsqueda o filtros para encontrar lo que estás buscando.","Try again":"Inténtalo de nuevo","Try it free":"Pruébalo gratis","Turn documents into diagrams with AI":"Convierta documentos en diagramas con IA","Two edges have the same ID":"Dos bordes tienen el mismo ID","Two nodes have the same ID":"Dos nodos tienen el mismo ID","Type it. See it.":"Escríbelo. Míralo.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"¡Ups, se acabaron tus solicitudes gratuitas! Actualiza a Flowchart Fun Pro para conversiones de diagramas ilimitadas, y sigue transformando texto en claros y visuales flujogramas tan fácilmente como copiar y pegar.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"En menos de 60 segundos. Escribe unas pocas líneas de texto o describe lo que necesitas al AI, y tu diagrama aparece al instante. Exporta o compártelo con un solo clic.","Undo":"Deshacer","Unescaped special character":"Carácter especial sin escape","Unique text value to identify a node":"Valor de texto único para identificar un nodo","Unknown":"Desconocido","Unknown Parsing Error":"Error de análisis desconocido","Unlimited Flowcharts":"Flujos de trabajo ilimitados","Unlimited Permanent Flowcharts":"Flujo de gráficos permanentes ilimitados","Unlimited cloud-saved flowcharts":"Diagramas de flujo guardados en la nube de forma ilimitada","Unlimited saved diagrams":"Diagramas guardados ilimitados","Unlock AI Features and never lose your work with a Pro account.":"Desbloquea las funciones de IA y nunca pierdas tu trabajo con una cuenta Pro.","Unlock Unlimited AI Flowcharts":"Desbloquea diagramas de flujo de IA ilimitados","Unpaid":"Impago","Update Email":"Actualizar correo electrónico","Updated Date":"Fecha actualizada","Upgrade Now - Save My Work":"Actualizar ahora - Guardar mi trabajo","Upgrade to Flowchart Fun Pro and unlock:":"Actualiza a Flowchart Fun Pro y desbloquea:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"Actualice a Flowchart Fun Pro para obtener gráficos alojados ilimitados, exportaciones de alta resolución sin marcas de agua, edición de IA y más. $4/mes facturado anualmente.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Actualiza a Flowchart Fun Pro para desbloquear la exportación de SVG y disfrutar de funciones más avanzadas para tus diagramas.","Upgrade to Pro":"Actualizar a Pro","Upgrade to Pro for permanent charts.":"Actualiza a Pro para gráficos permanentes.","Upload your File":"Subir tu archivo","Use Custom CSS Only":"Usar solo CSS personalizado","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"¿Usas Lucidchart o Visio? ¡La importación de CSV facilita obtener datos de cualquier fuente!","Use classes to group nodes":"Usar clases para agrupar nodos","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Utilice el atributo <0>href para establecer un enlace en un nodo que se abra en una nueva pestaña.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Utilice el atributo <0>src para establecer la imagen de un nodo. La imagen se escalará para ajustarse al nodo, por lo que es posible que deba ajustar el ancho y la altura del nodo para obtener el resultado deseado. Solo se admiten imágenes públicas (no bloqueadas por CORS).","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Utilice los atributos <0>w y <1>h para establecer explícitamente el ancho y la altura de un nodo.","Use the customer portal to change your billing information.":"Utilice el portal de clientes para cambiar su información de facturación.","Use these settings to adapt the look and behavior of your flowcharts":"Utilice estos ajustes para adaptar la apariencia y el comportamiento de sus diagramas de flujo","Use this file for org charts, hierarchies, and other organizational structures.":"Utilice este archivo para diagramas de organización, jerarquías y otras estructuras organizativas.","Use this file for sequences, processes, and workflows.":"Utilice este archivo para secuencias, procesos y flujos de trabajo.","Use this mode to modify and enhance your current chart.":"Utilice este modo para modificar y mejorar su gráfico actual.","Used at":"Utilizado en","User":"Usuario ","Vector Export (SVG)":"Exportación de vectores (SVG)","View on Github":"Ver en Github ","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"¿Quieres crear un diagrama a partir de un documento? Pégalo en el editor y haz clic en \\"Convertir a diagrama\\".","Watermark-Free Diagrams":"Diagramas sin marca de agua","Watermarks":"Marcas de agua","Welcome to Flowchart Fun":"Bienvenido a Flowchart Divertido","What if I just need it for one project?":"¿Y si solo lo necesito para un proyecto?","What our users are saying":"Lo que dicen nuestros usuarios","What\'s next?":"¿Qué sigue?","What\'s this?":"¿Qué es esto?","Width":"Ancho","Width and Height":"Ancho y Alto","Will my diagrams actually look professional?":"¿Mis diagramas se verán realmente profesionales?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Con la versión Pro de Flowchart Fun, puedes utilizar comandos de lenguaje natural para completar rápidamente los detalles de tu diagrama, ideal para crear diagramas sobre la marcha. Por $6/mes, obtén la facilidad de la edición de IA accesible para mejorar tu experiencia de creación de diagramas.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Con la versión pro puedes guardar y cargar archivos locales. Es perfecto para gestionar documentos relacionados con el trabajo sin conexión.","Would you like to continue?":"¿Te gustaría continuar?","Would you like to suggest a new example?":"¿Te gustaría sugerir un nuevo ejemplo?","Wrap text in parentheses to connect to any node":"Envuelve el texto entre paréntesis para conectarlo a cualquier nodo","Write like an outline":"Escribe como un esquema","Write your prompt here or click to enable the microphone, then press and hold to record.":"Escribe tu instrucción aquí o haz clic para activar el micrófono, luego mantén presionado para grabar.","Yearly":"Anualmente","Yes — send us a message and we\'ll set you up with a discounted rate.":"Sí - envíanos un mensaje y te proporcionaremos una tarifa con descuento.","Yes, Replace Content":"Sí, Reemplazar Contenido","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Sí. Cada diagrama utiliza diseños equilibrados y automáticos con tipografía limpia. Puedes personalizar temas, colores y estilos, y exportarlos como SVG nítidos o PNG de alta resolución que se vean geniales en cualquier presentación o documento.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Sí. La versión Pro admite la importación desde Visio, Lucidchart y CSV, para que puedas traer lo que ya tienes sin tener que recrearlo desde cero.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Sí. Puedes guardar y cargar archivos localmente, trabajar completamente sin conexión y controlar exactamente quién ve tus diagramas. Ningún dato sale de tu máquina a menos que decidas compartirlo.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Estás a punto de agregar ",["numNodes"]," nodos y ",["numEdges"]," bordes a tu gráfico."],"You need to log in to access this page.":"Necesitas iniciar sesión para acceder a esta página.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Ya eres un usuario Pro. <0>Gestionar suscripción<1/>¿Tienes preguntas o solicitudes de funciones? <2>Háganos saber","You\'re doing great!":"¡Lo estás haciendo genial!","You\'re on the free plan.":"Estás en el plan gratuito.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Has utilizado todas tus conversiones de IA gratuitas. Actualiza a Pro para un uso ilimitado de IA, temas personalizados, uso privado compartido y más. ¡Sigue creando increíbles diagramas de flujo sin esfuerzo!","Your Charts":"Tus gráficos","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Su Sandbox es un espacio para experimentar libremente con nuestras herramientas de diagrama de flujo, reiniciando cada día para comenzar de nuevo.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Tus gráficos son de solo lectura porque tu cuenta ya no está activa. Visita la página de tu <0>cuenta para obtener más información.","Your next diagram should be your best one.":"Tu próximo diagrama debería ser el mejor.","Your subscription is <0>{statusDisplay}.":["Su suscripción es <0>",["statusDisplay"],"."],"Your work stays yours":"Tu trabajo se queda contigo.","Zoom In":"Zoom In","Zoom Out":"Zoom Out","month":"mes","or":"o","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/es/messages.po b/app/src/locales/es/messages.po index 5748d9ee4..7bc56e50a 100644 --- a/app/src/locales/es/messages.po +++ b/app/src/locales/es/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "$48/año (ahorra 33%) · Cancelar en cualquier momento" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "$6/mes" @@ -25,7 +25,7 @@ msgstr "$6/mes" msgid "1 Temporary Flowchart" msgstr "1 Diagrama de Flujo Temporal" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "1 diagrama a la vez" @@ -33,7 +33,7 @@ msgstr "1 diagrama a la vez" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>Solo CSS personalizado está habilitado. Solo se aplicarán los ajustes de Diseño y Avanzados." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun es un proyecto de código abierto hecho por <1>Tone Row" @@ -49,7 +49,7 @@ msgstr "Una nueva versión de la aplicación está disponible. Por favor, recarg msgid "AI Creation & Editing" msgstr "Creación y edición de IA" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "Generación y edición de IA" @@ -57,7 +57,7 @@ msgstr "Generación y edición de IA" msgid "AI-Powered Flowchart Creation" msgstr "Creación de diagramas de flujo con inteligencia artificial" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "Generado por IA a partir de texto plano en menos de 5 segundos." @@ -65,12 +65,12 @@ msgstr "Generado por IA a partir de texto plano en menos de 5 segundos." msgid "AI-powered editing to supercharge your workflow" msgstr "Edición impulsada por inteligencia artificial para potenciar tu flujo de trabajo" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "Acerca de" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "Cuenta" @@ -106,7 +106,7 @@ msgstr "Alinear Verticalmente" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "Todo esto por solo $6 al mes, menos que tu café diario ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "Siempre listo para presentar" @@ -118,7 +118,7 @@ msgstr "Cantidad" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "Se ha producido un error. Inténtalo de nuevo o envía un correo electrónico directamente a {0}." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "Apariencia" @@ -170,11 +170,11 @@ msgstr "Color de fondo" msgid "Basic Flowchart" msgstr "Diagrama de Flujo Básico" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "Convierte en un Patrocinador de Github" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "Convierte en un Usuario Pro" @@ -191,8 +191,8 @@ msgstr "Facturado anualmente a $48" msgid "Billed monthly at $6" msgstr "Facturado mensualmente a $6" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "Blog" @@ -260,14 +260,14 @@ msgstr "Ciertos atributos se pueden usar para personalizar la apariencia o la fu msgid "Change Email Address" msgstr "Cambiar dirección de correo electrónico" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "Registro de cambios" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "Gráficos" @@ -346,7 +346,7 @@ msgstr "Columna" msgid "Comment" msgstr "Comentario" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "Plantillas de la comunidad" @@ -403,7 +403,7 @@ msgstr "Convertir a Diagrama de Flujo" msgid "Convert to hosted chart?" msgstr "¿Convertir a gráfico hospedado?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Política de cookies" @@ -500,7 +500,7 @@ msgstr "CSS personalizado" msgid "Custom Sharing Options" msgstr "Opciones de compartición personalizadas" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "Compartir personalizado y enlaces públicos" @@ -516,8 +516,8 @@ msgstr "Editor de Sandbox diario" msgid "Dark" msgstr "Oscuro" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "Modo oscuro" @@ -542,11 +542,11 @@ msgstr "Borrar" msgid "Delete {0}" msgstr "Borrar {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "Descríbelo y aparecerá" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "Describe tu idea. Obtén un diagrama que valga la pena presentar." @@ -696,8 +696,8 @@ msgstr "Editar con IA" msgid "Editable" msgstr "Editable" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "Editor" @@ -742,7 +742,7 @@ msgstr "Ingresa tu dirección de correo electrónico a continuación y te enviar msgid "Equal To" msgstr "Igual a" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "Cada diagrama se exporta como PNG, SVG o enlace compartible, listo para la reunión, el documento o la presentación." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "Desglose de características" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "Comentarios" @@ -823,11 +823,15 @@ msgstr "Altura de Nodo Fija" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Flowchart Fun Pro te ofrece diagramas de flujo ilimitados, colaboradores ilimitados y almacenamiento ilimitado por solo $6 al mes." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun es un proyecto de código abierto creado por <0>Tone Row" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun está creado y mantenido por un solo desarrollador. Tu apoyo lo mantiene en marcha." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "Síguenos en Twitter" @@ -909,6 +913,10 @@ msgstr "¿Verde?" msgid "Grid" msgstr "Cuadrícula" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "Clasificación de grupos y votación de elección clasificada, gratis" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "¿Tiene preguntas o problemas complejos? Estamos aquí para ayudar." @@ -980,7 +988,7 @@ msgstr "Importar datos de cualquier archivo CSV y asignarlo a un nuevo diagrama msgid "Import from CSV" msgstr "Importar desde CSV" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Importar desde Visio, Lucidchart, CSV" @@ -988,7 +996,7 @@ msgstr "Importar desde Visio, Lucidchart, CSV" msgid "Import from Visio, Lucidchart, and CSV" msgstr "Importar desde Visio, Lucidchart y CSV" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "Importar desde cualquier lugar" @@ -1012,7 +1020,7 @@ msgstr "Incluye un título usando un atributo <0>title. Para usar el color d msgid "Indent to connect nodes" msgstr "Indenta para conectar nodos" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "Información" @@ -1052,7 +1060,7 @@ msgstr "Sigue practicando" msgid "Keep your data private on your computer" msgstr "Mantén tus datos privados en tu computadora" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "Idioma" @@ -1101,8 +1109,8 @@ msgstr "Háganos saber por qué está cancelando. Siempre estamos buscando mejor msgid "Light" msgstr "Luz" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "Modo de luz" @@ -1160,8 +1168,8 @@ msgstr "Guardado local para acceder sin conexión" msgid "Lock Zoom to Graph" msgstr "Bloquear Zoom al gráfico" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "Iniciar sesión" @@ -1177,11 +1185,15 @@ msgstr "Inicia sesión para guardar" msgid "Log in to upgrade your account" msgstr "Iniciar sesión para actualizar tu cuenta" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "Creado por <0>Tone Row" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "Realizar una donación única" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "Hazlo tuyo" @@ -1205,6 +1217,18 @@ msgstr "Ancho máximo del texto dentro de los nodos" msgid "Monthly" msgstr "Mensual" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "Más de Tone Row" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "Más de Tone Row:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "Más herramientas:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "Nombre del gráfico" msgid "Name your chart" msgstr "Nombre su gráfico" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "Nuevo" @@ -1363,7 +1387,7 @@ msgstr "¡O tal vez azul!" msgid "Organization Chart" msgstr "Organigrama" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "Exportar en PNG y JPG" @@ -1412,21 +1436,25 @@ msgstr "Libreta de juegos" msgid "Pointer and container on same line" msgstr "Puntero y contenedor en la misma línea" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "Precios" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "Soporte prioritario uno a uno" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "Soporte prioritario" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "Política de privacidad" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "La versión Pro comienza en $4/mes facturado anualmente. Cancelar en cualquier momento." @@ -1451,7 +1479,7 @@ msgstr "Indicación" msgid "Public" msgstr "Público" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Importar datos de Visio, Lucidchart, CSV o comenzar desde una plantilla. No recrees lo que ya existe." @@ -1575,8 +1603,8 @@ msgstr "De derecha a izquierda" msgid "Right-click nodes for options" msgstr "Haga clic derecho en los nodos para ver las opciones" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "Hoja de ruta" @@ -1590,7 +1618,7 @@ msgstr "Rotar etiqueta" msgid "SVG Export is a Pro Feature" msgstr "La exportación de SVG es una función Pro" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, PDF y todos los formatos de exportación" @@ -1603,7 +1631,7 @@ msgstr "Garantía de satisfacción o reembolso del primer pago" msgid "Save" msgstr "Guardar" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "Guardar localmente, trabajar sin conexión y controlar exactamente quién ve qué. Ningún dato sale de tu máquina a menos que lo autorices." @@ -1635,7 +1663,7 @@ msgstr "Pago seguro" msgid "See more reviews on Product Hunt" msgstr "Ver más reseñas en Product Hunt" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "Ver lo que es posible" @@ -1651,9 +1679,9 @@ msgstr "Envíanos un mensaje" msgid "Set a consistent height for all nodes" msgstr "Establecer una altura consistente para todos los nodos" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "Configuración" @@ -1738,7 +1766,7 @@ msgstr "Empezar de nuevo" msgid "Start faster with use-case specific templates" msgstr "Comenzar más rápido con plantillas específicas para casos de uso" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "Comenzar gratis" @@ -1789,7 +1817,7 @@ msgstr "¡Suscripción exitosa!" msgid "Subscription will end" msgstr "La suscripción finalizará" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "Soporte" @@ -1812,7 +1840,7 @@ msgstr "Delimitador objetivo" msgid "Target Distance From Node" msgstr "Distancia objetivo desde el nodo" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "Dile al AI lo que necesitas en inglés sencillo. Tu diagrama se construye en segundos." @@ -1856,7 +1884,7 @@ msgstr "El texto en una línea crea un nodo con el texto como etiqueta" msgid "Thank you for your feedback!" msgstr "¡Gracias por tu comentario!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "La belleza y la magia residen en el minimalismo." @@ -1884,7 +1912,7 @@ msgstr "El delimitador utilizado para separar múltiples nodos de origen" msgid "The delimiter used to separate multiple target nodes" msgstr "El delimitador utilizado para separar múltiples nodos de destino" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "La forma más rápida de convertir lo que tienes en mente en algo que todos puedan entender." @@ -1911,7 +1939,7 @@ msgstr "Editor de Personalización de Temas" msgid "Theme Editor" msgstr "Editor de temas" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "Editor de tema" @@ -2000,10 +2028,14 @@ msgstr "Prueba a ajustar tu búsqueda o filtros para encontrar lo que estás bus msgid "Try again" msgstr "Inténtalo de nuevo" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "Pruébalo gratis" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "Convierta documentos en diagramas con IA" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "Dos bordes tienen el mismo ID" @@ -2012,7 +2044,7 @@ msgstr "Dos bordes tienen el mismo ID" msgid "Two nodes have the same ID" msgstr "Dos nodos tienen el mismo ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "Escríbelo. Míralo." @@ -2057,7 +2089,7 @@ msgstr "Flujo de gráficos permanentes ilimitados" msgid "Unlimited cloud-saved flowcharts" msgstr "Diagramas de flujo guardados en la nube de forma ilimitada" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "Diagramas guardados ilimitados" @@ -2089,13 +2121,17 @@ msgstr "Actualizar ahora - Guardar mi trabajo" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Actualiza a Flowchart Fun Pro y desbloquea:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "Actualice a Flowchart Fun Pro para obtener gráficos alojados ilimitados, exportaciones de alta resolución sin marcas de agua, edición de IA y más. $4/mes facturado anualmente." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Actualiza a Flowchart Fun Pro para desbloquear la exportación de SVG y disfrutar de funciones más avanzadas para tus diagramas." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "Actualizar a Pro" @@ -2152,7 +2188,7 @@ msgstr "Utilice este archivo para secuencias, procesos y flujos de trabajo." msgid "Use this mode to modify and enhance your current chart." msgstr "Utilice este modo para modificar y mejorar su gráfico actual." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "Utilizado en" @@ -2164,7 +2200,7 @@ msgstr "Usuario " msgid "Vector Export (SVG)" msgstr "Exportación de vectores (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Ver en Github " @@ -2302,7 +2338,7 @@ msgstr "Su Sandbox es un espacio para experimentar libremente con nuestras herra msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "Tus gráficos son de solo lectura porque tu cuenta ya no está activa. Visita la página de tu <0>cuenta para obtener más información." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "Tu próximo diagrama debería ser el mejor." @@ -2310,7 +2346,7 @@ msgstr "Tu próximo diagrama debería ser el mejor." msgid "Your subscription is <0>{statusDisplay}." msgstr "Su suscripción es <0>{statusDisplay}." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "Tu trabajo se queda contigo." @@ -2333,10 +2369,10 @@ msgid "or" msgstr "o" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/fr/messages.js b/app/src/locales/fr/messages.js index 508dbf1b1..0b7f1406a 100644 --- a/app/src/locales/fr/messages.js +++ b/app/src/locales/fr/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"48 $/an (économisez 33%) · Annulez à tout moment","$6/mo":"6 $/mois","1 Temporary Flowchart":"1 Organigramme temporaire","1 diagram at a time":"1 diagramme à la fois","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Seul le CSS personnalisé est activé. Seuls les paramètres de mise en page et avancés seront appliqués.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun est un projet open source réalisé par <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Se connecter / <1>S\'inscrire avec email et mot de passe","A new version of the app is available. Please reload to update.":"Une nouvelle version de l\'application est disponible. Veuillez recharger pour mettre à jour.","AI Creation & Editing":"Création et édition d\'IA","AI generation & editing":"Génération et édition par IA","AI-Powered Flowchart Creation":"Création de diagrammes de flux alimentés par l\'IA","AI-generated from plain text in under 5 seconds.":"Généré par IA à partir de texte simple en moins de 5 secondes.","AI-powered editing to supercharge your workflow":"Édition alimentée par l\'IA pour booster votre flux de travail","About":"À propos","Account":"Compte","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Ajoutez un backslash (<0>\\\\) avant tout caractère spécial: <1>(, <2>:, <3>#, ou <4>.","Add some steps":"Ajouter des étapes","Advanced":"Avancé ","Align Horizontally":"Aligner Horizontalement","Align Nodes":"Aligner les nœuds","Align Vertically":"Aligner Verticalement","All this for just $6/month - less than your daily coffee ☕":"Tout cela pour seulement 6 $ par mois - moins que votre café quotidien ☕","Always presentation-ready":"Toujours prêt pour la présentation","Amount":"Montant","An error occurred. Try resubmitting or email {0} directly.":["Une erreur s\'est produite. Essayez de l\'envoyer à nouveau ou bien envoyez un e-mail à l\'adresse ",["0"],"."],"Appearance":"Thème","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le diagramme de flux ?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le dossier ?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le dossier ?","Are you sure?":"Êtes-vous sûr(e) ?","Arrow Size":"Taille de la flèche","Attributes":"Attributs","August 2023":"Août 2023","Back":"Retour","Back To Editor":"Retour à l\'éditeur","Background Color":"Couleur de fond","Basic Flowchart":"Diagramme de flux de base","Become a Github Sponsor":"Devenez un sponsor Github","Become a Pro User":"Devenez un utilisateur Pro","Begin your journey":"Commencez votre voyage","Billed annually at $48":"Facturé annuellement à 48 $","Billed monthly at $6":"Facturé mensuellement à 6 $","Blog":"Blog","Book a Meeting":"Réserver une réunion","Border Color":"Couleur de bordure","Border Width":"Largeur de bordure","Bottom to Top":"De bas en haut","Breadthfirst":"Parcours en largeur","Build your personal flowchart library":"Construisez votre bibliothèque personnelle de diagrammes de flux","Can I import my existing diagrams?":"Puis-je importer mes diagrammes existants?","Cancel":"Annuler","Cancel anytime":"Annulez à tout moment","Cancel your subscription. Your hosted charts will become read-only.":"Résilier votre abonnement. Vos graphiques hébergés seront en lecture seule.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certains attributs peuvent être utilisés pour personnaliser l\'apparence ou la fonctionnalité des éléments.","Change Email Address":"Changer l\'adresse email","Changelog":"Journal des modifications","Charts":"Graphiques","Check out the guide:":"Vérifiez le guide :","Check your email for a link to log in.<0/>You can close this window.":"Vérifiez votre e-mail pour un lien de connexion. Vous pouvez fermer cette fenêtre.","Choose":"Choisir","Choose Template":"Choisir un modèle","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Choisissez parmi une variété de formes de flèches pour la source et la cible d\'un bord. Les formes incluent triangle, triangle-tee, cercle-triangle, triangle-croix, triangle-backcurve, vee, tee, carré, cercle, diamant, chevron, aucun.","Choose how edges connect between nodes":"Choisissez comment les bords se connectent entre les nœuds","Choose how nodes are automatically arranged in your flowchart":"Choisissez comment les nœuds sont automatiquement disposés dans votre organigramme","Circle":"Cercle","Classes":"Classes","Clear":"Effacer","Clear text?":"Effacer le texte?","Clone":"Cloner","Clone Flowchart":"Cloner le diagramme de flux","Close":"Fermer","Color":"Couleur","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Les couleurs incluent le rouge, l\'orange, le jaune, le bleu, le pourpre, le noir, le blanc et le gris.","Column":"Colonne","Comment":"Commenter","Community templates":"Modèles de la communauté","Compare our plans and find the perfect fit for your flowcharting needs":"Comparez nos plans et trouvez celui qui convient parfaitement à vos besoins en matière de flowcharting","Concentric":"Concentrique","Confirm New Email":"Confirmer le nouveau Email","Confirm your email address to sign in.":"Confirmez votre adresse e-mail pour vous connecter.","Connect your Data":"Connectez vos données","Containers":"Conteneurs","Containers are nodes that contain other nodes. They are declared using curly braces.":"Les conteneurs sont des nœuds qui contiennent d\'autres nœuds. Ils sont déclarés à l\'aide de accolades.","Continue":"Continuer","Continue in Sandbox (Resets daily, work not saved)":"Continuer dans le bac à sable (Réinitialisé quotidiennement, travail non sauvegardé)","Controls the flow direction of hierarchical layouts":"Contrôle la direction du flux des mises en page hiérarchiques","Convert":"Convertir","Convert to Flowchart":"Convertir en diagramme","Convert to hosted chart?":"Convertir en graphique hébergé\xA0?","Cookie Policy":"Politique de cookies","Copied SVG code to clipboard":"Code SVG copié dans le presse-papier","Copied {format} to clipboard":[["format"]," copié dans le presse-papier"],"Copy":"Copier","Copy PNG Image":"Copier l\'image PNG","Copy SVG Code":"Copier le code SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copiez votre code Excalidraw et collez-le sur <0>excalidraw.com pour le modifier. Cette fonctionnalité est expérimentale et peut ne pas fonctionner avec tous les diagrammes. Si vous trouvez un bug, <1>faites-le nous savoir.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copiez votre code mermaid.js ou ouvrez-le directement dans l\'éditeur en direct mermaid.js.","Create":"Créer","Create Flowcharts using AI":"Créer des organigrammes à l\'aide de l\'IA","Create Unlimited Flowcharts":"Créer des diagrammes illimités","Create a New Chart":"Créer un nouveau graphique","Create a flowchart showing the steps of planning and executing a school fundraising event":"Créer un organigramme montrant les étapes de la planification et de l\'exécution d\'un événement de collecte de fonds scolaire","Create a new flowchart to get started or organize your work with folders.":"Créez un nouveau diagramme de flux pour commencer ou organisez votre travail avec des dossiers.","Create flowcharts instantly: Type or paste text, see it visualized.":"Créez des organigrammes instantanément : Tapez ou collez du texte, visualisez-le.","Create unlimited diagrams for just $6/month!":"Créez des diagrammes illimités pour seulement 6 $/mois !","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Créez des diagrammes de flux illimités stockés dans le cloud, accessibles partout !","Create with AI":"Créer avec l\'intelligence artificielle","Created Date":"Date de création","Creating an edge between two nodes is done by indenting the second node below the first":"Créer une arête entre deux nœuds est fait en indentant le second nœud sous le premier","Curve Style":"Style de courbe","Custom CSS":"CSS personnalisé","Custom Sharing Options":"Options de partage personnalisées","Custom sharing & public links":"Partage personnalisé et liens publics","Customer Portal":"Portail Clients","Daily Sandbox Editor":"Éditeur Sandbox quotidien","Dark":"Sombre","Dark Mode":"Mode sombre","Data Import (Visio, Lucidchart, CSV)":"Importation de données (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Fonction d\'importation de données pour des diagrammes complexes","Date":"Date","Delete":"Supprimer","Delete {0}":["Supprimer ",["0"]],"Describe it and it appears":"Décrivez-le et il apparaît","Describe your idea. Get a diagram worth presenting.":"Décrivez votre idée. Obtenez un diagramme digne d\'être présenté.","Design a software development lifecycle flowchart for an agile team":"Concevoir un organigramme du cycle de développement de logiciels pour une équipe agile","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Élaborer un arbre de décision pour un PDG afin d\'évaluer de nouvelles opportunités de marché potentielles","Direction":"Direction","Dismiss":"Ignorer","Do you offer discounts for students or nonprofits?":"Offrez-vous des réductions pour les étudiants ou les organisations à but non lucratif?","Do you want to delete this?":"Souhaitez-vous supprimer ceci ?","Document":"Document","Don\'t Lose Your Work":"Ne perdez pas votre travail","Download":"Télécharger","Download JPG":"Télécharger JPG","Download PNG":"Télécharger PNG","Download SVG":"Télécharger SVG","Drag and drop a CSV file here, or click to select a file":"Glissez-déposez un fichier CSV ici, ou cliquez pour sélectionner un fichier","Draw an edge from multiple nodes by beginning the line with a reference":"Dessinez une arête à partir de plusieurs nœuds en commençant la ligne par une référence","Drop the file here ...":"Déposez le fichier ici ...","Each line becomes a node":"Chaque ligne devient un nœud","Edge ID, Classes, Attributes":"ID Edge, Classes, Attributs","Edge Label":"Étiquette Edge","Edge Label Column":"Colonne d\'étiquette Edge","Edge Style":"Style Edge","Edge Text Size":"Taille du texte de bord","Edge missing indentation":"Indentation manquante du bord","Edges":"Bords","Edges are declared in the same row as their source node":"Les bords sont déclarés dans la même ligne que leur nœud source","Edges are declared in the same row as their target node":"Les bords sont déclarés dans la même ligne que leur nœud cible","Edges are declared in their own row":"Les bords sont déclarés dans leur propre ligne","Edges can also have ID\'s, classes, and attributes before the label":"Les bords peuvent également avoir des ID, des classes et des attributs avant l\'étiquette","Edges can be styled with dashed, dotted, or solid lines":"Les bords peuvent être stylisés avec des lignes en pointillés, en pointillés ou en lignes continues","Edges in Separate Rows":"Bordures en Rangs Séparés","Edges in Source Node Row":"Bordures dans la Ligne du Nœud Source","Edges in Target Node Row":"Bordures dans la Ligne du Nœud Cible","Edit":"Modifier","Edit with AI":"Modifier avec l\'IA","Editable":"Modifiable","Editor":"Éditeur","Email":"E-mail","Empty":"Vide","Enable to set a consistent height for all nodes":"Activer pour définir une hauteur constante pour tous les nœuds","Enter a name for the cloned flowchart.":"Entrez un nom pour le flowchart cloné.","Enter a name for the new folder.":"Entrez un nom pour le nouveau dossier.","Enter a new name for the {0}.":["Entrez un nouveau nom pour le ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Entrez votre adresse e-mail et nous vous enverrons un lien magique pour vous connecter.","Enter your email address below and we\'ll send you a link to reset your password.":"Entrez votre adresse e-mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe.","Equal To":"Égal à","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Chaque diagramme s\'exporte en PNG, SVG ou lien partageable de qualité - prêt pour la réunion, le document ou la présentation.","Everything you need to know about Flowchart Fun Pro":"Tout ce que vous devez savoir sur Flowchart Fun Pro","Examples":"Exemples","Excalidraw":"Excalidraw","Exclusive Office Hours":"Heures de bureau exclusives","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Découvrez l\'efficacité et la sécurité du chargement de fichiers locaux directement dans votre organigramme, idéal pour gérer des documents professionnels hors ligne. Débloquez cette fonctionnalité exclusive Pro et bien plus encore avec Flowchart Fun Pro, disponible pour seulement 6 $/mois.","Explore Pro":"Découvrez Pro","Explore more":"Explorez plus","Export":"Exporter","Export clean diagrams without branding":"Exportez des diagrammes propres sans branding","Export to PNG & JPG":"Exporter en PNG et JPG","Export to PNG, JPG, and SVG":"Exporter en PNG, JPG et SVG","Feature Breakdown":"Démontage des fonctionnalités","Feedback":"Commentaire","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"N\'hésitez pas à explorer et à nous contacter via la page <0>Commentaires si vous avez des inquiétudes.","Fine-tune layouts and visual styles":"Affinez les mises en page et les styles visuels","Fixed Height":"Hauteur fixe","Fixed Node Height":"Hauteur de nœud fixe","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro vous offre des organigrammes illimités, des collaborateurs illimités et un stockage illimité pour seulement 6 $/mois.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun est construit et maintenu par un seul développeur. Votre soutien permet de le garder en vie.","Follow Us on Twitter":"Suivez-nous sur Twitter","Font Family":"Famille de polices","Forgot your password?":"Mot de passe oublié ?","Free":"Gratuit ","Free users: charts in the sandbox expire after 7 days.":"Utilisateurs gratuits : les diagrammes dans le bac à sable expirent après 7 jours.","Frequently Asked Questions":"Foire aux questions","Full-screen, read-only, and template sharing":"Partage en plein écran, en lecture seule et de modèles","Fullscreen":"Plein écran","General":"Général ","Generate flowcharts from text automatically":"Générez automatiquement des diagrammes de flux à partir de texte","Get Pro Access Now":"Obtenez un accès Pro maintenant","Get Unlimited AI Requests":"Obtenez des demandes illimitées d\'IA","Get rapid responses to your questions":"Obtenez des réponses rapides à vos questions","Get unlimited flowcharts and premium features":"Obtenez des flux de travail illimités et des fonctionnalités premium","Go back home":"Retournez à la maison","Go to the Editor":"Aller à l\'éditeur","Go to your Sandbox":"Allez à votre bac à sable","Graph":"Graphique","Green?":"Vert?","Grid":"Quadrillage","Have complex questions or issues? We\'re here to help.":"Des questions ou des problèmes complexes ? Nous sommes là pour vous aider. ","Here are some Pro features you can now enjoy.":"Voici quelques fonctionnalités Pro dont vous pouvez maintenant profiter.","High-quality exports with embedded fonts":"Des exports de haute qualité avec des polices intégrées","History":"Historique","Home":"Accueil","How are edges declared in this data?":"Comment les bords sont-ils déclarés dans ces données?","How fast can I actually make something?":"À quelle vitesse puis-je réellement créer quelque chose ?","How would you like to save your chart?":"Comment souhaitez-vous enregistrer votre graphique?","I would like to request a new template:":"Je voudrais demander un nouveau modèle :","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Si un compte avec cet e-mail existe, nous vous avons envoyé un e-mail avec des instructions sur la façon de réinitialiser votre mot de passe.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Si vous souhaitez créer un bord, faites une indentation de cette ligne. Sinon, échappez le deux-points avec une barre oblique <0>\\\\:","Images":"Images","Import Data":"Importer des données","Import data from a CSV file.":"Importer des données à partir d\'un fichier CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importer des données à partir de n\'importe quel fichier CSV et les mapper à un nouveau diagramme. C\'est une excellente façon d\'importer des données à partir d\'autres sources telles que Lucidchart, Google Sheets et Visio.","Import from CSV":"Importer depuis CSV","Import from Visio, Lucidchart, CSV":"Importer depuis Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importer à partir de Visio, Lucidchart et CSV","Import from anywhere":"Importer de n\'importe où","Import from popular diagram tools":"Importez à partir d\'outils de diagrammes populaires","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importez votre diagramme dans Microsoft Visio à l\'aide de l\'un de ces fichiers CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"L\'importation de données est une fonctionnalité professionnelle. Vous pouvez passer à Flowchart Fun Pro pour seulement 6 $ par mois.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Incluez un titre en utilisant un attribut <0>title. Pour utiliser la coloration Visio, ajoutez un attribut <1>roleType égal à l\'un des éléments suivants:","Indent to connect nodes":"Indentez pour connecter les nœuds","Info":"Info","Is":"Est","Is my data private?":"Mes données sont-elles privées?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas est une représentation JSON de votre diagramme utilisée par <0>Obsidian Canvas et d\'autres applications.","Join 2000+ professionals who\'ve upgraded their workflow":"Rejoignez plus de 2000 professionnels qui ont amélioré leur flux de travail","Join thousands of happy users who love Flowchart Fun":"Rejoignez des milliers d\'utilisateurs satisfaits qui adorent Flowchart Fun","Keep Things Private":"Garder les choses privées","Keep changes?":"Conserver les modifications ?","Keep practicing":"Continuez à pratiquer","Keep your data private on your computer":"Gardez vos données privées sur votre ordinateur","Language":"Langue","Layout":"Disposition ","Layout Algorithm":"Algorithme de mise en page","Layout Frozen":"Mise en page gelée","Leading References":"Principales références","Learn More":"En savoir plus","Learn Syntax":"Apprendre la syntaxe","Learn about Flowchart Fun Pro":"En savoir plus sur Flowchart Fun Pro","Left to Right":"De gauche à droite","Let us know why you\'re canceling. We\'re always looking to improve.":"Faites-nous savoir pourquoi vous annulez. Nous cherchons toujours à nous améliorer.","Light":"Lumineux","Light Mode":"Mode lumineux","Link":"Lien","Link back":"Faites un lien en arrière","Load":"Charger","Load Chart":"Charger le graphique","Load File":"Charger le fichier","Load Files":"Charger des fichiers","Load default content":"Charger le contenu par défaut","Load from link?":"Charger à partir du lien?","Load layout and styles":"Charger la mise en page et les styles","Loading...":"Chargement...","Local File Support":"Support de fichier local","Local saving for offline access":"Enregistrement local pour un accès hors ligne","Lock Zoom to Graph":"Verrouiller le Zoom sur le Graphique","Log In":"Connexion","Log Out":"Déconnexion","Log in to Save":"Connectez-vous pour enregistrer","Log in to upgrade your account":"Connectez-vous pour mettre à niveau votre compte","Make a One-Time Donation":"Faites un don unique","Make it yours":"Rendez-le vôtre","Make publicly accessible":"Rendre accessible au public","Manage Billing":"Gérer la facturation","Map Data":"Cartographier les données","Maximum width of text inside nodes":"Largeur maximale du texte à l\'intérieur des nœuds","Monthly":"Mensuel","Move":"Déplacer","Move {0}":["Déplacer ",["0"]],"Multiple pointers on same line":"Plusieurs pointeurs sur la même ligne","My dog ate my credit card!":"Mon chien a mangé ma carte de crédit!","Name":"Nom","Name Chart":"Nommer le graphique","Name your chart":"Nommez votre graphique","New":"Nouveau","New Email":"Nouveau courriel","New Flowchart":"Nouveau Flowchart","New Folder":"Nouveau Dossier","Next charge":"Prochain paiement","No Edges":"Pas de bords","No Folder (Root)":"Aucun Dossier (Racine)","No Watermarks!":"Pas de filigranes !","No charts yet":"Aucun graphique pour le moment","No items in this folder":"Aucun élément dans ce dossier","No matching charts found":"Aucun graphique correspondant trouvé","Node Border Style":"Style de bordure de nœud","Node Colors":"Couleurs de nœud","Node ID":"Identifiant de nœud","Node ID, Classes, Attributes":"Identifiant de nœud, classes, attributs","Node Label":"Étiquette de nœud","Node Shape":"Forme de nœud","Node Shapes":"Formes de nœud","Nodes":"Nœuds","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Les nœuds peuvent être stylisés avec des traits, des points ou des doubles. Les bordures peuvent également être supprimées avec border_none.","Not Empty":"Pas vide","Now you\'re thinking with flowcharts!":"Maintenant vous pensez avec des organigrammes !","Office Hours":"Heures de travail","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":" temps en temps, le lien magique finira par atterrir dans votre dossier de pourriel. Si vous ne le voyez pas après quelques minutes, vérifiez-y ou demandez un nouveau lien.","One on One Support":"Un à un support","One-on-One Support":"Assistance individuelle","Open Customer Portal":"Ouvrir le portail client","Operation canceled":"Opération annulée","Or maybe blue!":"Ou peut-être bleu !","Organization Chart":"Organigramme","PNG & JPG export":"Exporter en PNG et JPG","Padding":"Rembourrage","Page not found":"Page non trouvée","Password":"Mot de passe ","Past Due":"En retard","Paste a document to convert it":"Collez un document pour le convertir","Paste your document or outline here to convert it into an organized flowchart.":"Collez votre document ou votre plan ici pour le convertir en un organigramme organisé.","Pasted content detected. Convert to Flowchart Fun syntax?":"Contenu collé détecté. Convertir en syntaxe de Flowchart Fun ?","Perfect for docs and quick sharing":"Parfait pour les documents et le partage rapide","Permanent Charts are a Pro Feature":"Les diagrammes permanents sont une fonctionnalité Pro","Playbook":"Livre-jeu","Pointer and container on same line":"Pointeur et conteneur sur la même ligne","Priority One-on-One Support":"Support prioritaire en tête-à-tête","Priority support":"Support prioritaire","Privacy Policy":"Politique de confidentialité","Pro starts at $4/mo billed yearly. Cancel anytime.":"La version Pro commence à 4€/mois facturés annuellement. Annulez à tout moment.","Pro tip: Right-click any node to customize its shape and color":"Astuce pro : faites un clic droit sur n\'importe quel noeud pour personnaliser sa forme et sa couleur","Processing Data":"Traitement des données","Processing...":"Traitement en cours...","Prompt":"Invite","Public":"Public","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importer des données depuis Visio, Lucidchart, CSV ou partir d\'un modèle. Pas besoin de recréer ce qui existe déjà.","Quick experimentation space that resets daily":"Espace d\'expérimentation rapide qui se réinitialise quotidiennement","Random":"Aléatoire","Rapid Deployment Templates":"Modèles de déploiement rapide","Rapid Templates":"Modèles rapides","Raster Export (PNG, JPG)":"Exportation de rasters (PNG, JPG)","Rate limit exceeded. Please try again later.":"Limite de taux dépassée. Veuillez réessayer plus tard.","Read-only":"Lecture seulement","Reference by Class":"Référence par classe","Reference by ID":"Référence par ID","Reference by Label":"Référence par étiquette","References":"Références","References are used to create edges between nodes that are created elsewhere in the document":"Les références sont utilisées pour créer des arêtes entre les nœuds créés ailleurs dans le document","Referencing a node by its exact label":"Référencer un nœud par sa étiquette exacte","Referencing a node by its unique ID":"Référencer un nœud par son ID unique","Referencing multiple nodes with the same assigned class":"Référencement de multiples nœuds avec la même classe assignée","Refresh Page":"Rafraîchir la page","Reload to Update":"Recharger pour mettre à jour","Rename":"Renommer","Rename {0}":["Renommer ",["0"]],"Request Magic Link":"Demandez un lien magique","Request Password Reset":"Demandez une réinitialisation du mot de passe ","Reset":"Réinitialiser","Reset Password":"Réinitialiser le mot de passe","Resume Subscription":"Reprendre l\'abonnement","Return":"Retour","Right to Left":"De droite à gauche","Right-click nodes for options":"Cliquez avec le bouton droit sur les nœuds pour voir les options","Roadmap":"Roadmap","Rotate Label":"Faire pivoter l\'étiquette","SVG Export is a Pro Feature":"L\'exportation SVG est une fonctionnalité Pro","SVG, PDF & all export formats":"Formats d\'exportation SVG, PDF et tous les autres formats","Satisfaction guaranteed or first payment refunded":"Satisfaction garantie ou remboursement du premier paiement","Save":"Sauver","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Enregistrer localement, travailler hors ligne et contrôler exactement qui voit quoi. Aucune donnée ne quitte votre machine à moins que vous ne le souhaitiez.","Save time with AI and dictation, making it easy to create diagrams.":"Gagnez du temps avec l\'IA et la dictée, ce qui facilite la création de diagrammes.","Save to Cloud":"Enregistrer dans le Cloud","Save to File":"Enregistrer dans un fichier","Save your Work":"Enregistrer votre travail","Schedule personal consultation sessions":"Planifier des sessions de consultation personnelle","Secure payment":"Paiement sécurisé","See more reviews on Product Hunt":"Voir plus de critiques sur Product Hunt","See what\'s possible":"Découvrez les possibilités","Select a destination folder for \\"{0}\\".":"Sélectionner un dossier de destination pour \\\\","Send us a message":"Envoyez-nous un message","Set a consistent height for all nodes":"Définir une hauteur constante pour tous les nœuds","Settings":"Paramètres","Share":"Partager","Sign In":"Se connecter ","Sign in with <0>GitHub":"Se connecter avec <0>GitHub","Sign in with <0>Google":"Se connecter avec <0>Google","Sorry! This page is only available in English.":"Désolé ! Cette page n\'est disponible qu\'en anglais.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Désolé, une erreur s\'est produite lors de la conversion du texte en diagramme. Veuillez réessayer plus tard.","Sort Ascending":"Trier par ordre croissant","Sort Descending":"Trier par ordre décroissant","Sort by {0}":["Trier par ",["0"]],"Source Arrow Shape":"Forme de la flèche source","Source Column":"Colonne source","Source Delimiter":"Délimiteur source","Source Distance From Node":"Distance de la source du nœud","Source/Target Arrow Shape":"Forme de flèche source / cible","Spacing":"Espacement","Special Attributes":"Attributs spéciaux","Start":"Début","Start Over":"Recommencer","Start faster with use-case specific templates":"Démarrer plus rapidement avec des modèles spécifiques aux cas d\'utilisation","Start for free":"Commencez gratuitement","Status":"État","Step 1":"Étape 1","Step 2":"Étape 2","Step 3":"Étape 3","Store any data associated to a node":"Stocker toutes les données associées à un nœud","Style Classes":"Classes de style","Style with classes":"Style avec des classes","Submit":"Soumettre","Subscription":"Abonnement","Subscription Successful!":"Abonnement réussi !","Subscription will end":"L\'abonnement prendra fin","Support":"Support","Target Arrow Shape":"Forme de la flèche cible","Target Column":"Colonne cible","Target Delimiter":"Délimiteur cible","Target Distance From Node":"Distance cible du nœud","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Dites à l\'IA ce dont vous avez besoin en langage clair. Votre diagramme se construit en quelques secondes.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Dites-nous ce qui fonctionne et ce qui ne fonctionne pas. Chaque message est lu par le développeur.","Text Color":"Couleur du texte","Text Horizontal Offset":"Décalage horizontal du texte","Text Leading":"Texte principal","Text Max Width":"Largeur maximale du texte","Text Vertical Offset":"Décalage vertical du texte","Text followed by colon+space creates an edge with the text as the label":"Texte suivi d\'un deux-points + espace crée un bord avec le texte comme étiquette","Text on a line creates a node with the text as the label":"Texte sur une ligne crée un nœud avec le texte comme étiquette","Thank you for your feedback!":"Merci pour votre commentaire !","The beauty and magic reside in the minimalism.":"La beauté et la magie résident dans le minimalisme.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"La meilleure façon de changer les styles est de cliquer avec le bouton droit sur un nœud ou une arête et de sélectionner le style souhaité.","The column that contains the edge label(s)":"La colonne qui contient les étiquettes de bord","The column that contains the source node ID(s)":"La colonne qui contient les ID de nœud source","The column that contains the target node ID(s)":"La colonne qui contient les ID de nœud cible","The delimiter used to separate multiple source nodes":"Le délimiteur utilisé pour séparer plusieurs nœuds source","The delimiter used to separate multiple target nodes":"Le délimiteur utilisé pour séparer plusieurs nœuds cibles","The fastest way to turn what\'s in your head into something everyone else can understand.":"Le moyen le plus rapide de transformer ce qui se trouve dans votre tête en quelque chose que tout le monde peut comprendre.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"Le plan gratuit fonctionne parfaitement pour une utilisation quotidienne. Si vous avez besoin de fonctionnalités Pro, c\'est mois par mois à 6€/mois - annulez à tout moment sans engagement.","The possible shapes are:":"Les formes possibles sont :","Theme":"Thème","Theme Customization Editor":"Éditeur de personnalisation de thème","Theme Editor":"Éditeur de thème","Theme editor":"Éditeur de thème","There are no edges in this data":"Il n\'y a pas d\'arêtes dans ces données","This action cannot be undone.":"Cette action ne peut pas être annulée.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Cette fonctionnalité est uniquement disponible pour les utilisateurs pro. <0>Devenez un utilisateur pro pour la débloquer.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Cela peut prendre entre 30 secondes et 2 minutes en fonction de la longueur de votre entrée.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Ce bac à sable est parfait pour expérimenter, mais n\'oubliez pas - il se réinitialise quotidiennement. Mettez à niveau maintenant et conservez votre travail actuel!","This will replace the current content.":"Cela remplacera le contenu actuel.","This will replace your current chart content with the template content.":"Cela remplacera le contenu actuel de votre diagramme par le contenu du modèle.","This will replace your current sandbox.":"Cela remplacera votre bac à sable actuel.","Time to decide":"Temps de décider","Tip":"Astuce","To fix this change one of the edge IDs":"Pour corriger cela, changez l\'un des ID de bord","To fix this change one of the node IDs":"Pour corriger ceci, changez l\'un des ID de nœud","To fix this move one pointer to the next line":"Pour corriger ceci, déplacez un pointeur vers la ligne suivante","To fix this start the container <0/> on a different line":"Pour corriger cela, commencez le conteneur <0/> sur une ligne différente.","To learn more about why we require you to log in, please read <0>this blog post.":"Pour en savoir plus sur la raison pour laquelle nous vous demandons de vous connecter, veuillez lire <0>ce message de blog.","Top to Bottom":"De haut en bas","Transform Your Ideas into Professional Diagrams in Seconds":"Transformez vos idées en diagrammes professionnels en quelques secondes","Transform text into diagrams instantly":"Transformez instantanément du texte en diagrammes","Try AI":"Essayez l\'IA","Try adjusting your search or filters to find what you\'re looking for.":"Essayez d\'ajuster votre recherche ou vos filtres pour trouver ce que vous cherchez.","Try again":"Réessayer","Try it free":"Essayez-le gratuitement","Two edges have the same ID":"Deux arêtes ont le même ID","Two nodes have the same ID":"Deux nœuds ont le même ID","Type it. See it.":"Tapez-le. Voyez-le.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Oh oh, vous n\'avez plus de demandes gratuites ! Passez à Flowchart Fun Pro pour des conversions de diagrammes illimitées et continuez à transformer du texte en des flux visuels clairs aussi facilement que copier-coller.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Moins de 60 secondes. Tapez quelques lignes de texte ou décrivez ce dont vous avez besoin à l\'IA, et votre diagramme apparaît instantanément. Exportez-le ou partagez-le en un clic.","Undo":"Annuler","Unescaped special character":"Caractère spécial non échappé","Unique text value to identify a node":"Valeur de texte unique pour identifier un nœud","Unknown":"Inconnu","Unknown Parsing Error":"Erreur d\'analyse inconnue","Unlimited Flowcharts":"Flowcharts illimités","Unlimited Permanent Flowcharts":"Flux de diagrammes permanents illimités","Unlimited cloud-saved flowcharts":"Des organigrammes sauvegardés dans le cloud en illimité","Unlimited saved diagrams":"Diagrammes sauvegardés illimités","Unlock AI Features and never lose your work with a Pro account.":"Débloquez les fonctionnalités de l\'IA et ne perdez jamais votre travail avec un compte Pro.","Unlock Unlimited AI Flowcharts":"Débloquez des organigrammes AI illimités","Unpaid":"Impayé","Update Email":"Mettre à jour l\'e-mail","Updated Date":"Date de mise à jour","Upgrade Now - Save My Work":"Mettre à niveau maintenant - Sauvegarder mon travail","Upgrade to Flowchart Fun Pro and unlock:":"Passez à Flowchart Fun Pro et débloquez:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Mettez à niveau vers Flowchart Fun Pro pour débloquer les exportations SVG et profiter de fonctionnalités avancées pour vos diagrammes.","Upgrade to Pro":"Mettez à niveau vers Pro","Upgrade to Pro for permanent charts.":"Passez à la version Pro pour des diagrammes permanents.","Upload your File":"Téléchargez votre fichier","Use Custom CSS Only":"Utiliser uniquement du CSS personnalisé","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Utilisez Lucidchart ou Visio ? L\'importation CSV facilite l\'obtention de données à partir de n\'importe quelle source !","Use classes to group nodes":"Utilisez des classes pour regrouper les nœuds","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Utilisez l\'attribut <0>href pour créer un lien sur un nœud qui s\'ouvre dans un nouvel onglet.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Utilisez l\'attribut <0>src pour définir l\'image d\'un nœud. L\'image sera mise à l\'échelle pour s\'adapter au nœud, vous devrez donc peut-être ajuster la largeur et la hauteur du nœud pour obtenir le résultat souhaité. Seules les images publiques (non bloquées par CORS) sont prises en charge.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Utilisez les attributs <0>w et <1>h pour définir explicitement la largeur et la hauteur d\'un nœud.","Use the customer portal to change your billing information.":"Utilisez le portail client pour modifier vos informations de facturation.","Use these settings to adapt the look and behavior of your flowcharts":"Utilisez ces paramètres pour adapter l\'apparence et le comportement de vos diagrammes de flux","Use this file for org charts, hierarchies, and other organizational structures.":"Utilisez ce fichier pour les organigrammes, les hiérarchies et autres structures organisationnelles.","Use this file for sequences, processes, and workflows.":"Utilisez ce fichier pour les séquences, les processus et les workflows.","Use this mode to modify and enhance your current chart.":"Utilisez ce mode pour modifier et améliorer votre diagramme actuel.","Used at":"Utilisé à","User":"Utilisateur","Vector Export (SVG)":"Exportation de vecteurs (SVG)","View on Github":"Voir sur Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Vous souhaitez créer un diagramme à partir d\'un document ? Collez-le dans l\'éditeur et cliquez sur \'Convertir en diagramme\'","Watermark-Free Diagrams":"Diagrammes sans filigrane","Watermarks":"Filigranes","Welcome to Flowchart Fun":"Bienvenue dans Flowchart Fun","What if I just need it for one project?":"Et si je n\'en ai besoin que pour un seul projet ?","What our users are saying":"Ce que nos utilisateurs disent","What\'s next?":"Quelle est la prochaine étape ?","What\'s this?":"Qu\'est-ce que c\'est?","Width":"Largeur","Width and Height":"Largeur et hauteur","Will my diagrams actually look professional?":"Est-ce que mes diagrammes auront un aspect professionnel ?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Avec la version Pro de Flowchart Fun, vous pouvez utiliser des commandes en langage naturel pour rapidement détailler votre organigramme, idéal pour créer des diagrammes en déplacement. Pour 6 $ par mois, profitez de la facilité de l\'édition accessible par l\'IA pour améliorer votre expérience de création d\'organigrammes.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Avec la version pro, vous pouvez enregistrer et charger des fichiers locaux. C\'est parfait pour gérer des documents professionnels hors ligne.","Would you like to continue?":"Voulez-vous continuer ?","Would you like to suggest a new example?":"Souhaitez-vous suggérer un nouvel exemple ?","Wrap text in parentheses to connect to any node":"Entourez le texte entre parenthèses pour le connecter à n\'importe quel nœud","Write like an outline":"Écrivez comme un plan","Write your prompt here or click to enable the microphone, then press and hold to record.":"Écrivez votre message ici ou cliquez pour activer le microphone, puis maintenez pour enregistrer.","Yearly":"Annuellement","Yes — send us a message and we\'ll set you up with a discounted rate.":"Oui - envoyez-nous un message et nous vous fournirons un tarif réduit.","Yes, Replace Content":"Oui, remplacer le contenu","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Oui. Chaque diagramme utilise des mises en page équilibrées et automatiques avec une typographie propre. Vous pouvez personnaliser les thèmes, les couleurs et les styles - et exporter en tant que SVG net ou en tant que PNG haute résolution qui sera parfait dans toute présentation ou document.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Oui. La version Pro prend en charge l\'importation depuis Visio, Lucidchart et CSV - vous pouvez donc importer ce que vous avez déjà sans avoir à le recréer à partir de zéro.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Oui. Vous pouvez enregistrer et charger des fichiers localement, travailler entièrement hors ligne et contrôler exactement qui voit vos diagrammes. Aucune donnée ne quitte votre machine à moins que vous ne choisissiez de partager.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Vous êtes sur le point d\'ajouter ",["numNodes"]," nœuds et ",["numEdges"]," arêtes à votre graphe."],"You need to log in to access this page.":"Vous devez vous connecter pour accéder à cette page.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Vous êtes déjà un utilisateur Pro. <0>Gérer l\'abonnement<1/>Vous avez des questions ou des demandes de fonctionnalités? <2>Faites-le nous savoir","You\'re doing great!":"Vous vous en sortez très bien !","You\'re on the free plan.":"Vous êtes sur le plan gratuit.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Vous avez utilisé toutes vos conversions gratuites d\'IA. Passez à la version Pro pour une utilisation illimitée de l\'IA, des thèmes personnalisés, un partage privé et plus encore. Continuez à créer des diagrammes de flux incroyables sans effort !","Your Charts":"Vos diagrammes","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Votre bac à sable est un espace pour expérimenter librement avec nos outils de diagramme, se réinitialisant chaque jour pour un nouveau départ.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Vos graphiques sont en lecture seule car votre compte n\'est plus actif. Visitez votre page <0>compte pour en savoir plus.","Your next diagram should be your best one.":"Votre prochain diagramme devrait être le meilleur.","Your subscription is <0>{statusDisplay}.":["Votre abonnement est <0>",["statusDisplay"],"."],"Your work stays yours":"Votre travail reste le vôtre.","Zoom In":"Zoomer","Zoom Out":"Zoomer vers l\'extérieur","month":"mois","or":"ou","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"48 $/an (économisez 33%) · Annulez à tout moment","$6/mo":"6 $/mois","1 Temporary Flowchart":"1 Organigramme temporaire","1 diagram at a time":"1 diagramme à la fois","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Seul le CSS personnalisé est activé. Seuls les paramètres de mise en page et avancés seront appliqués.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun est un projet open source réalisé par <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Se connecter / <1>S\'inscrire avec email et mot de passe","A new version of the app is available. Please reload to update.":"Une nouvelle version de l\'application est disponible. Veuillez recharger pour mettre à jour.","AI Creation & Editing":"Création et édition d\'IA","AI generation & editing":"Génération et édition par IA","AI-Powered Flowchart Creation":"Création de diagrammes de flux alimentés par l\'IA","AI-generated from plain text in under 5 seconds.":"Généré par IA à partir de texte simple en moins de 5 secondes.","AI-powered editing to supercharge your workflow":"Édition alimentée par l\'IA pour booster votre flux de travail","About":"À propos","Account":"Compte","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Ajoutez un backslash (<0>\\\\) avant tout caractère spécial: <1>(, <2>:, <3>#, ou <4>.","Add some steps":"Ajouter des étapes","Advanced":"Avancé ","Align Horizontally":"Aligner Horizontalement","Align Nodes":"Aligner les nœuds","Align Vertically":"Aligner Verticalement","All this for just $6/month - less than your daily coffee ☕":"Tout cela pour seulement 6 $ par mois - moins que votre café quotidien ☕","Always presentation-ready":"Toujours prêt pour la présentation","Amount":"Montant","An error occurred. Try resubmitting or email {0} directly.":["Une erreur s\'est produite. Essayez de l\'envoyer à nouveau ou bien envoyez un e-mail à l\'adresse ",["0"],"."],"Appearance":"Thème","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le diagramme de flux ?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le dossier ?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Êtes-vous sûr de vouloir supprimer le dossier ?","Are you sure?":"Êtes-vous sûr(e) ?","Arrow Size":"Taille de la flèche","Attributes":"Attributs","August 2023":"Août 2023","Back":"Retour","Back To Editor":"Retour à l\'éditeur","Background Color":"Couleur de fond","Basic Flowchart":"Diagramme de flux de base","Become a Github Sponsor":"Devenez un sponsor Github","Become a Pro User":"Devenez un utilisateur Pro","Begin your journey":"Commencez votre voyage","Billed annually at $48":"Facturé annuellement à 48 $","Billed monthly at $6":"Facturé mensuellement à 6 $","Blog":"Blog","Book a Meeting":"Réserver une réunion","Border Color":"Couleur de bordure","Border Width":"Largeur de bordure","Bottom to Top":"De bas en haut","Breadthfirst":"Parcours en largeur","Build your personal flowchart library":"Construisez votre bibliothèque personnelle de diagrammes de flux","Can I import my existing diagrams?":"Puis-je importer mes diagrammes existants?","Cancel":"Annuler","Cancel anytime":"Annulez à tout moment","Cancel your subscription. Your hosted charts will become read-only.":"Résilier votre abonnement. Vos graphiques hébergés seront en lecture seule.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certains attributs peuvent être utilisés pour personnaliser l\'apparence ou la fonctionnalité des éléments.","Change Email Address":"Changer l\'adresse email","Changelog":"Journal des modifications","Charts":"Graphiques","Check out the guide:":"Vérifiez le guide :","Check your email for a link to log in.<0/>You can close this window.":"Vérifiez votre e-mail pour un lien de connexion. Vous pouvez fermer cette fenêtre.","Choose":"Choisir","Choose Template":"Choisir un modèle","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Choisissez parmi une variété de formes de flèches pour la source et la cible d\'un bord. Les formes incluent triangle, triangle-tee, cercle-triangle, triangle-croix, triangle-backcurve, vee, tee, carré, cercle, diamant, chevron, aucun.","Choose how edges connect between nodes":"Choisissez comment les bords se connectent entre les nœuds","Choose how nodes are automatically arranged in your flowchart":"Choisissez comment les nœuds sont automatiquement disposés dans votre organigramme","Circle":"Cercle","Classes":"Classes","Clear":"Effacer","Clear text?":"Effacer le texte?","Clone":"Cloner","Clone Flowchart":"Cloner le diagramme de flux","Close":"Fermer","Color":"Couleur","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"Les couleurs incluent le rouge, l\'orange, le jaune, le bleu, le pourpre, le noir, le blanc et le gris.","Column":"Colonne","Comment":"Commenter","Community templates":"Modèles de la communauté","Compare our plans and find the perfect fit for your flowcharting needs":"Comparez nos plans et trouvez celui qui convient parfaitement à vos besoins en matière de flowcharting","Concentric":"Concentrique","Confirm New Email":"Confirmer le nouveau Email","Confirm your email address to sign in.":"Confirmez votre adresse e-mail pour vous connecter.","Connect your Data":"Connectez vos données","Containers":"Conteneurs","Containers are nodes that contain other nodes. They are declared using curly braces.":"Les conteneurs sont des nœuds qui contiennent d\'autres nœuds. Ils sont déclarés à l\'aide de accolades.","Continue":"Continuer","Continue in Sandbox (Resets daily, work not saved)":"Continuer dans le bac à sable (Réinitialisé quotidiennement, travail non sauvegardé)","Controls the flow direction of hierarchical layouts":"Contrôle la direction du flux des mises en page hiérarchiques","Convert":"Convertir","Convert to Flowchart":"Convertir en diagramme","Convert to hosted chart?":"Convertir en graphique hébergé\xA0?","Cookie Policy":"Politique de cookies","Copied SVG code to clipboard":"Code SVG copié dans le presse-papier","Copied {format} to clipboard":[["format"]," copié dans le presse-papier"],"Copy":"Copier","Copy PNG Image":"Copier l\'image PNG","Copy SVG Code":"Copier le code SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copiez votre code Excalidraw et collez-le sur <0>excalidraw.com pour le modifier. Cette fonctionnalité est expérimentale et peut ne pas fonctionner avec tous les diagrammes. Si vous trouvez un bug, <1>faites-le nous savoir.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copiez votre code mermaid.js ou ouvrez-le directement dans l\'éditeur en direct mermaid.js.","Create":"Créer","Create Flowcharts using AI":"Créer des organigrammes à l\'aide de l\'IA","Create Unlimited Flowcharts":"Créer des diagrammes illimités","Create a New Chart":"Créer un nouveau graphique","Create a flowchart showing the steps of planning and executing a school fundraising event":"Créer un organigramme montrant les étapes de la planification et de l\'exécution d\'un événement de collecte de fonds scolaire","Create a new flowchart to get started or organize your work with folders.":"Créez un nouveau diagramme de flux pour commencer ou organisez votre travail avec des dossiers.","Create flowcharts instantly: Type or paste text, see it visualized.":"Créez des organigrammes instantanément : Tapez ou collez du texte, visualisez-le.","Create unlimited diagrams for just $6/month!":"Créez des diagrammes illimités pour seulement 6 $/mois !","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Créez des diagrammes de flux illimités stockés dans le cloud, accessibles partout !","Create with AI":"Créer avec l\'intelligence artificielle","Created Date":"Date de création","Creating an edge between two nodes is done by indenting the second node below the first":"Créer une arête entre deux nœuds est fait en indentant le second nœud sous le premier","Curve Style":"Style de courbe","Custom CSS":"CSS personnalisé","Custom Sharing Options":"Options de partage personnalisées","Custom sharing & public links":"Partage personnalisé et liens publics","Customer Portal":"Portail Clients","Daily Sandbox Editor":"Éditeur Sandbox quotidien","Dark":"Sombre","Dark Mode":"Mode sombre","Data Import (Visio, Lucidchart, CSV)":"Importation de données (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Fonction d\'importation de données pour des diagrammes complexes","Date":"Date","Delete":"Supprimer","Delete {0}":["Supprimer ",["0"]],"Describe it and it appears":"Décrivez-le et il apparaît","Describe your idea. Get a diagram worth presenting.":"Décrivez votre idée. Obtenez un diagramme digne d\'être présenté.","Design a software development lifecycle flowchart for an agile team":"Concevoir un organigramme du cycle de développement de logiciels pour une équipe agile","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Élaborer un arbre de décision pour un PDG afin d\'évaluer de nouvelles opportunités de marché potentielles","Direction":"Direction","Dismiss":"Ignorer","Do you offer discounts for students or nonprofits?":"Offrez-vous des réductions pour les étudiants ou les organisations à but non lucratif?","Do you want to delete this?":"Souhaitez-vous supprimer ceci ?","Document":"Document","Don\'t Lose Your Work":"Ne perdez pas votre travail","Download":"Télécharger","Download JPG":"Télécharger JPG","Download PNG":"Télécharger PNG","Download SVG":"Télécharger SVG","Drag and drop a CSV file here, or click to select a file":"Glissez-déposez un fichier CSV ici, ou cliquez pour sélectionner un fichier","Draw an edge from multiple nodes by beginning the line with a reference":"Dessinez une arête à partir de plusieurs nœuds en commençant la ligne par une référence","Drop the file here ...":"Déposez le fichier ici ...","Each line becomes a node":"Chaque ligne devient un nœud","Edge ID, Classes, Attributes":"ID Edge, Classes, Attributs","Edge Label":"Étiquette Edge","Edge Label Column":"Colonne d\'étiquette Edge","Edge Style":"Style Edge","Edge Text Size":"Taille du texte de bord","Edge missing indentation":"Indentation manquante du bord","Edges":"Bords","Edges are declared in the same row as their source node":"Les bords sont déclarés dans la même ligne que leur nœud source","Edges are declared in the same row as their target node":"Les bords sont déclarés dans la même ligne que leur nœud cible","Edges are declared in their own row":"Les bords sont déclarés dans leur propre ligne","Edges can also have ID\'s, classes, and attributes before the label":"Les bords peuvent également avoir des ID, des classes et des attributs avant l\'étiquette","Edges can be styled with dashed, dotted, or solid lines":"Les bords peuvent être stylisés avec des lignes en pointillés, en pointillés ou en lignes continues","Edges in Separate Rows":"Bordures en Rangs Séparés","Edges in Source Node Row":"Bordures dans la Ligne du Nœud Source","Edges in Target Node Row":"Bordures dans la Ligne du Nœud Cible","Edit":"Modifier","Edit with AI":"Modifier avec l\'IA","Editable":"Modifiable","Editor":"Éditeur","Email":"E-mail","Empty":"Vide","Enable to set a consistent height for all nodes":"Activer pour définir une hauteur constante pour tous les nœuds","Enter a name for the cloned flowchart.":"Entrez un nom pour le flowchart cloné.","Enter a name for the new folder.":"Entrez un nom pour le nouveau dossier.","Enter a new name for the {0}.":["Entrez un nouveau nom pour le ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Entrez votre adresse e-mail et nous vous enverrons un lien magique pour vous connecter.","Enter your email address below and we\'ll send you a link to reset your password.":"Entrez votre adresse e-mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe.","Equal To":"Égal à","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Chaque diagramme s\'exporte en PNG, SVG ou lien partageable de qualité - prêt pour la réunion, le document ou la présentation.","Everything you need to know about Flowchart Fun Pro":"Tout ce que vous devez savoir sur Flowchart Fun Pro","Examples":"Exemples","Excalidraw":"Excalidraw","Exclusive Office Hours":"Heures de bureau exclusives","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Découvrez l\'efficacité et la sécurité du chargement de fichiers locaux directement dans votre organigramme, idéal pour gérer des documents professionnels hors ligne. Débloquez cette fonctionnalité exclusive Pro et bien plus encore avec Flowchart Fun Pro, disponible pour seulement 6 $/mois.","Explore Pro":"Découvrez Pro","Explore more":"Explorez plus","Export":"Exporter","Export clean diagrams without branding":"Exportez des diagrammes propres sans branding","Export to PNG & JPG":"Exporter en PNG et JPG","Export to PNG, JPG, and SVG":"Exporter en PNG, JPG et SVG","Feature Breakdown":"Démontage des fonctionnalités","Feedback":"Commentaire","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"N\'hésitez pas à explorer et à nous contacter via la page <0>Commentaires si vous avez des inquiétudes.","Fine-tune layouts and visual styles":"Affinez les mises en page et les styles visuels","Fixed Height":"Hauteur fixe","Fixed Node Height":"Hauteur de nœud fixe","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro vous offre des organigrammes illimités, des collaborateurs illimités et un stockage illimité pour seulement 6 $/mois.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun est un projet open source réalisé par <0>Tone\xA0Row","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun est construit et maintenu par un seul développeur. Votre soutien permet de le garder en vie.","Follow Us on Twitter":"Suivez-nous sur Twitter","Font Family":"Famille de polices","Forgot your password?":"Mot de passe oublié ?","Free":"Gratuit ","Free users: charts in the sandbox expire after 7 days.":"Utilisateurs gratuits : les diagrammes dans le bac à sable expirent après 7 jours.","Frequently Asked Questions":"Foire aux questions","Full-screen, read-only, and template sharing":"Partage en plein écran, en lecture seule et de modèles","Fullscreen":"Plein écran","General":"Général ","Generate flowcharts from text automatically":"Générez automatiquement des diagrammes de flux à partir de texte","Get Pro Access Now":"Obtenez un accès Pro maintenant","Get Unlimited AI Requests":"Obtenez des demandes illimitées d\'IA","Get rapid responses to your questions":"Obtenez des réponses rapides à vos questions","Get unlimited flowcharts and premium features":"Obtenez des flux de travail illimités et des fonctionnalités premium","Go back home":"Retournez à la maison","Go to the Editor":"Aller à l\'éditeur","Go to your Sandbox":"Allez à votre bac à sable","Graph":"Graphique","Green?":"Vert?","Grid":"Quadrillage","Group ranking and ranked-choice voting, free":"Classement de groupe et vote à choix classé, gratuit","Have complex questions or issues? We\'re here to help.":"Des questions ou des problèmes complexes ? Nous sommes là pour vous aider. ","Here are some Pro features you can now enjoy.":"Voici quelques fonctionnalités Pro dont vous pouvez maintenant profiter.","High-quality exports with embedded fonts":"Des exports de haute qualité avec des polices intégrées","History":"Historique","Home":"Accueil","How are edges declared in this data?":"Comment les bords sont-ils déclarés dans ces données?","How fast can I actually make something?":"À quelle vitesse puis-je réellement créer quelque chose ?","How would you like to save your chart?":"Comment souhaitez-vous enregistrer votre graphique?","I would like to request a new template:":"Je voudrais demander un nouveau modèle :","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Si un compte avec cet e-mail existe, nous vous avons envoyé un e-mail avec des instructions sur la façon de réinitialiser votre mot de passe.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Si vous souhaitez créer un bord, faites une indentation de cette ligne. Sinon, échappez le deux-points avec une barre oblique <0>\\\\:","Images":"Images","Import Data":"Importer des données","Import data from a CSV file.":"Importer des données à partir d\'un fichier CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importer des données à partir de n\'importe quel fichier CSV et les mapper à un nouveau diagramme. C\'est une excellente façon d\'importer des données à partir d\'autres sources telles que Lucidchart, Google Sheets et Visio.","Import from CSV":"Importer depuis CSV","Import from Visio, Lucidchart, CSV":"Importer depuis Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importer à partir de Visio, Lucidchart et CSV","Import from anywhere":"Importer de n\'importe où","Import from popular diagram tools":"Importez à partir d\'outils de diagrammes populaires","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importez votre diagramme dans Microsoft Visio à l\'aide de l\'un de ces fichiers CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"L\'importation de données est une fonctionnalité professionnelle. Vous pouvez passer à Flowchart Fun Pro pour seulement 6 $ par mois.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Incluez un titre en utilisant un attribut <0>title. Pour utiliser la coloration Visio, ajoutez un attribut <1>roleType égal à l\'un des éléments suivants:","Indent to connect nodes":"Indentez pour connecter les nœuds","Info":"Info","Is":"Est","Is my data private?":"Mes données sont-elles privées?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON Canvas est une représentation JSON de votre diagramme utilisée par <0>Obsidian Canvas et d\'autres applications.","Join 2000+ professionals who\'ve upgraded their workflow":"Rejoignez plus de 2000 professionnels qui ont amélioré leur flux de travail","Join thousands of happy users who love Flowchart Fun":"Rejoignez des milliers d\'utilisateurs satisfaits qui adorent Flowchart Fun","Keep Things Private":"Garder les choses privées","Keep changes?":"Conserver les modifications ?","Keep practicing":"Continuez à pratiquer","Keep your data private on your computer":"Gardez vos données privées sur votre ordinateur","Language":"Langue","Layout":"Disposition ","Layout Algorithm":"Algorithme de mise en page","Layout Frozen":"Mise en page gelée","Leading References":"Principales références","Learn More":"En savoir plus","Learn Syntax":"Apprendre la syntaxe","Learn about Flowchart Fun Pro":"En savoir plus sur Flowchart Fun Pro","Left to Right":"De gauche à droite","Let us know why you\'re canceling. We\'re always looking to improve.":"Faites-nous savoir pourquoi vous annulez. Nous cherchons toujours à nous améliorer.","Light":"Lumineux","Light Mode":"Mode lumineux","Link":"Lien","Link back":"Faites un lien en arrière","Load":"Charger","Load Chart":"Charger le graphique","Load File":"Charger le fichier","Load Files":"Charger des fichiers","Load default content":"Charger le contenu par défaut","Load from link?":"Charger à partir du lien?","Load layout and styles":"Charger la mise en page et les styles","Loading...":"Chargement...","Local File Support":"Support de fichier local","Local saving for offline access":"Enregistrement local pour un accès hors ligne","Lock Zoom to Graph":"Verrouiller le Zoom sur le Graphique","Log In":"Connexion","Log Out":"Déconnexion","Log in to Save":"Connectez-vous pour enregistrer","Log in to upgrade your account":"Connectez-vous pour mettre à niveau votre compte","Made by <0>Tone\xA0Row":"Réalisé par <0>Tone\xA0Row","Make a One-Time Donation":"Faites un don unique","Make it yours":"Rendez-le vôtre","Make publicly accessible":"Rendre accessible au public","Manage Billing":"Gérer la facturation","Map Data":"Cartographier les données","Maximum width of text inside nodes":"Largeur maximale du texte à l\'intérieur des nœuds","Monthly":"Mensuel","More from Tone Row":"Plus de Tone Row","More from Tone Row:":"Plus de Tone Row :","More tools:":"Plus d\'outils :","Move":"Déplacer","Move {0}":["Déplacer ",["0"]],"Multiple pointers on same line":"Plusieurs pointeurs sur la même ligne","My dog ate my credit card!":"Mon chien a mangé ma carte de crédit!","Name":"Nom","Name Chart":"Nommer le graphique","Name your chart":"Nommez votre graphique","New":"Nouveau","New Email":"Nouveau courriel","New Flowchart":"Nouveau Flowchart","New Folder":"Nouveau Dossier","Next charge":"Prochain paiement","No Edges":"Pas de bords","No Folder (Root)":"Aucun Dossier (Racine)","No Watermarks!":"Pas de filigranes !","No charts yet":"Aucun graphique pour le moment","No items in this folder":"Aucun élément dans ce dossier","No matching charts found":"Aucun graphique correspondant trouvé","Node Border Style":"Style de bordure de nœud","Node Colors":"Couleurs de nœud","Node ID":"Identifiant de nœud","Node ID, Classes, Attributes":"Identifiant de nœud, classes, attributs","Node Label":"Étiquette de nœud","Node Shape":"Forme de nœud","Node Shapes":"Formes de nœud","Nodes":"Nœuds","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Les nœuds peuvent être stylisés avec des traits, des points ou des doubles. Les bordures peuvent également être supprimées avec border_none.","Not Empty":"Pas vide","Now you\'re thinking with flowcharts!":"Maintenant vous pensez avec des organigrammes !","Office Hours":"Heures de travail","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":" temps en temps, le lien magique finira par atterrir dans votre dossier de pourriel. Si vous ne le voyez pas après quelques minutes, vérifiez-y ou demandez un nouveau lien.","One on One Support":"Un à un support","One-on-One Support":"Assistance individuelle","Open Customer Portal":"Ouvrir le portail client","Operation canceled":"Opération annulée","Or maybe blue!":"Ou peut-être bleu !","Organization Chart":"Organigramme","PNG & JPG export":"Exporter en PNG et JPG","Padding":"Rembourrage","Page not found":"Page non trouvée","Password":"Mot de passe ","Past Due":"En retard","Paste a document to convert it":"Collez un document pour le convertir","Paste your document or outline here to convert it into an organized flowchart.":"Collez votre document ou votre plan ici pour le convertir en un organigramme organisé.","Pasted content detected. Convert to Flowchart Fun syntax?":"Contenu collé détecté. Convertir en syntaxe de Flowchart Fun ?","Perfect for docs and quick sharing":"Parfait pour les documents et le partage rapide","Permanent Charts are a Pro Feature":"Les diagrammes permanents sont une fonctionnalité Pro","Playbook":"Livre-jeu","Pointer and container on same line":"Pointeur et conteneur sur la même ligne","Pricing":"Tarification","Priority One-on-One Support":"Support prioritaire en tête-à-tête","Priority support":"Support prioritaire","Privacy Policy":"Politique de confidentialité","Pro starts at $4/mo billed yearly. Cancel anytime.":"La version Pro commence à 4€/mois facturés annuellement. Annulez à tout moment.","Pro tip: Right-click any node to customize its shape and color":"Astuce pro : faites un clic droit sur n\'importe quel noeud pour personnaliser sa forme et sa couleur","Processing Data":"Traitement des données","Processing...":"Traitement en cours...","Prompt":"Invite","Public":"Public","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importer des données depuis Visio, Lucidchart, CSV ou partir d\'un modèle. Pas besoin de recréer ce qui existe déjà.","Quick experimentation space that resets daily":"Espace d\'expérimentation rapide qui se réinitialise quotidiennement","Random":"Aléatoire","Rapid Deployment Templates":"Modèles de déploiement rapide","Rapid Templates":"Modèles rapides","Raster Export (PNG, JPG)":"Exportation de rasters (PNG, JPG)","Rate limit exceeded. Please try again later.":"Limite de taux dépassée. Veuillez réessayer plus tard.","Read-only":"Lecture seulement","Reference by Class":"Référence par classe","Reference by ID":"Référence par ID","Reference by Label":"Référence par étiquette","References":"Références","References are used to create edges between nodes that are created elsewhere in the document":"Les références sont utilisées pour créer des arêtes entre les nœuds créés ailleurs dans le document","Referencing a node by its exact label":"Référencer un nœud par sa étiquette exacte","Referencing a node by its unique ID":"Référencer un nœud par son ID unique","Referencing multiple nodes with the same assigned class":"Référencement de multiples nœuds avec la même classe assignée","Refresh Page":"Rafraîchir la page","Reload to Update":"Recharger pour mettre à jour","Rename":"Renommer","Rename {0}":["Renommer ",["0"]],"Request Magic Link":"Demandez un lien magique","Request Password Reset":"Demandez une réinitialisation du mot de passe ","Reset":"Réinitialiser","Reset Password":"Réinitialiser le mot de passe","Resume Subscription":"Reprendre l\'abonnement","Return":"Retour","Right to Left":"De droite à gauche","Right-click nodes for options":"Cliquez avec le bouton droit sur les nœuds pour voir les options","Roadmap":"Roadmap","Rotate Label":"Faire pivoter l\'étiquette","SVG Export is a Pro Feature":"L\'exportation SVG est une fonctionnalité Pro","SVG, PDF & all export formats":"Formats d\'exportation SVG, PDF et tous les autres formats","Satisfaction guaranteed or first payment refunded":"Satisfaction garantie ou remboursement du premier paiement","Save":"Sauver","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Enregistrer localement, travailler hors ligne et contrôler exactement qui voit quoi. Aucune donnée ne quitte votre machine à moins que vous ne le souhaitiez.","Save time with AI and dictation, making it easy to create diagrams.":"Gagnez du temps avec l\'IA et la dictée, ce qui facilite la création de diagrammes.","Save to Cloud":"Enregistrer dans le Cloud","Save to File":"Enregistrer dans un fichier","Save your Work":"Enregistrer votre travail","Schedule personal consultation sessions":"Planifier des sessions de consultation personnelle","Secure payment":"Paiement sécurisé","See more reviews on Product Hunt":"Voir plus de critiques sur Product Hunt","See what\'s possible":"Découvrez les possibilités","Select a destination folder for \\"{0}\\".":"Sélectionner un dossier de destination pour \\\\","Send us a message":"Envoyez-nous un message","Set a consistent height for all nodes":"Définir une hauteur constante pour tous les nœuds","Settings":"Paramètres","Share":"Partager","Sign In":"Se connecter ","Sign in with <0>GitHub":"Se connecter avec <0>GitHub","Sign in with <0>Google":"Se connecter avec <0>Google","Sorry! This page is only available in English.":"Désolé ! Cette page n\'est disponible qu\'en anglais.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Désolé, une erreur s\'est produite lors de la conversion du texte en diagramme. Veuillez réessayer plus tard.","Sort Ascending":"Trier par ordre croissant","Sort Descending":"Trier par ordre décroissant","Sort by {0}":["Trier par ",["0"]],"Source Arrow Shape":"Forme de la flèche source","Source Column":"Colonne source","Source Delimiter":"Délimiteur source","Source Distance From Node":"Distance de la source du nœud","Source/Target Arrow Shape":"Forme de flèche source / cible","Spacing":"Espacement","Special Attributes":"Attributs spéciaux","Start":"Début","Start Over":"Recommencer","Start faster with use-case specific templates":"Démarrer plus rapidement avec des modèles spécifiques aux cas d\'utilisation","Start for free":"Commencez gratuitement","Status":"État","Step 1":"Étape 1","Step 2":"Étape 2","Step 3":"Étape 3","Store any data associated to a node":"Stocker toutes les données associées à un nœud","Style Classes":"Classes de style","Style with classes":"Style avec des classes","Submit":"Soumettre","Subscription":"Abonnement","Subscription Successful!":"Abonnement réussi !","Subscription will end":"L\'abonnement prendra fin","Support":"Support","Target Arrow Shape":"Forme de la flèche cible","Target Column":"Colonne cible","Target Delimiter":"Délimiteur cible","Target Distance From Node":"Distance cible du nœud","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Dites à l\'IA ce dont vous avez besoin en langage clair. Votre diagramme se construit en quelques secondes.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Dites-nous ce qui fonctionne et ce qui ne fonctionne pas. Chaque message est lu par le développeur.","Text Color":"Couleur du texte","Text Horizontal Offset":"Décalage horizontal du texte","Text Leading":"Texte principal","Text Max Width":"Largeur maximale du texte","Text Vertical Offset":"Décalage vertical du texte","Text followed by colon+space creates an edge with the text as the label":"Texte suivi d\'un deux-points + espace crée un bord avec le texte comme étiquette","Text on a line creates a node with the text as the label":"Texte sur une ligne crée un nœud avec le texte comme étiquette","Thank you for your feedback!":"Merci pour votre commentaire !","The beauty and magic reside in the minimalism.":"La beauté et la magie résident dans le minimalisme.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"La meilleure façon de changer les styles est de cliquer avec le bouton droit sur un nœud ou une arête et de sélectionner le style souhaité.","The column that contains the edge label(s)":"La colonne qui contient les étiquettes de bord","The column that contains the source node ID(s)":"La colonne qui contient les ID de nœud source","The column that contains the target node ID(s)":"La colonne qui contient les ID de nœud cible","The delimiter used to separate multiple source nodes":"Le délimiteur utilisé pour séparer plusieurs nœuds source","The delimiter used to separate multiple target nodes":"Le délimiteur utilisé pour séparer plusieurs nœuds cibles","The fastest way to turn what\'s in your head into something everyone else can understand.":"Le moyen le plus rapide de transformer ce qui se trouve dans votre tête en quelque chose que tout le monde peut comprendre.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"Le plan gratuit fonctionne parfaitement pour une utilisation quotidienne. Si vous avez besoin de fonctionnalités Pro, c\'est mois par mois à 6€/mois - annulez à tout moment sans engagement.","The possible shapes are:":"Les formes possibles sont :","Theme":"Thème","Theme Customization Editor":"Éditeur de personnalisation de thème","Theme Editor":"Éditeur de thème","Theme editor":"Éditeur de thème","There are no edges in this data":"Il n\'y a pas d\'arêtes dans ces données","This action cannot be undone.":"Cette action ne peut pas être annulée.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Cette fonctionnalité est uniquement disponible pour les utilisateurs pro. <0>Devenez un utilisateur pro pour la débloquer.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Cela peut prendre entre 30 secondes et 2 minutes en fonction de la longueur de votre entrée.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Ce bac à sable est parfait pour expérimenter, mais n\'oubliez pas - il se réinitialise quotidiennement. Mettez à niveau maintenant et conservez votre travail actuel!","This will replace the current content.":"Cela remplacera le contenu actuel.","This will replace your current chart content with the template content.":"Cela remplacera le contenu actuel de votre diagramme par le contenu du modèle.","This will replace your current sandbox.":"Cela remplacera votre bac à sable actuel.","Time to decide":"Temps de décider","Tip":"Astuce","To fix this change one of the edge IDs":"Pour corriger cela, changez l\'un des ID de bord","To fix this change one of the node IDs":"Pour corriger ceci, changez l\'un des ID de nœud","To fix this move one pointer to the next line":"Pour corriger ceci, déplacez un pointeur vers la ligne suivante","To fix this start the container <0/> on a different line":"Pour corriger cela, commencez le conteneur <0/> sur une ligne différente.","To learn more about why we require you to log in, please read <0>this blog post.":"Pour en savoir plus sur la raison pour laquelle nous vous demandons de vous connecter, veuillez lire <0>ce message de blog.","Top to Bottom":"De haut en bas","Transform Your Ideas into Professional Diagrams in Seconds":"Transformez vos idées en diagrammes professionnels en quelques secondes","Transform text into diagrams instantly":"Transformez instantanément du texte en diagrammes","Try AI":"Essayez l\'IA","Try adjusting your search or filters to find what you\'re looking for.":"Essayez d\'ajuster votre recherche ou vos filtres pour trouver ce que vous cherchez.","Try again":"Réessayer","Try it free":"Essayez-le gratuitement","Turn documents into diagrams with AI":"Transformez des documents en diagrammes avec l\'IA","Two edges have the same ID":"Deux arêtes ont le même ID","Two nodes have the same ID":"Deux nœuds ont le même ID","Type it. See it.":"Tapez-le. Voyez-le.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Oh oh, vous n\'avez plus de demandes gratuites ! Passez à Flowchart Fun Pro pour des conversions de diagrammes illimitées et continuez à transformer du texte en des flux visuels clairs aussi facilement que copier-coller.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Moins de 60 secondes. Tapez quelques lignes de texte ou décrivez ce dont vous avez besoin à l\'IA, et votre diagramme apparaît instantanément. Exportez-le ou partagez-le en un clic.","Undo":"Annuler","Unescaped special character":"Caractère spécial non échappé","Unique text value to identify a node":"Valeur de texte unique pour identifier un nœud","Unknown":"Inconnu","Unknown Parsing Error":"Erreur d\'analyse inconnue","Unlimited Flowcharts":"Flowcharts illimités","Unlimited Permanent Flowcharts":"Flux de diagrammes permanents illimités","Unlimited cloud-saved flowcharts":"Des organigrammes sauvegardés dans le cloud en illimité","Unlimited saved diagrams":"Diagrammes sauvegardés illimités","Unlock AI Features and never lose your work with a Pro account.":"Débloquez les fonctionnalités de l\'IA et ne perdez jamais votre travail avec un compte Pro.","Unlock Unlimited AI Flowcharts":"Débloquez des organigrammes AI illimités","Unpaid":"Impayé","Update Email":"Mettre à jour l\'e-mail","Updated Date":"Date de mise à jour","Upgrade Now - Save My Work":"Mettre à niveau maintenant - Sauvegarder mon travail","Upgrade to Flowchart Fun Pro and unlock:":"Passez à Flowchart Fun Pro et débloquez:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"Passez à Flowchart Fun Pro pour des diagrammes hébergés illimités, des exports haute résolution sans filigrane, l\'édition avec l\'IA, et plus encore. 4 €/mois facturés annuellement.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Mettez à niveau vers Flowchart Fun Pro pour débloquer les exportations SVG et profiter de fonctionnalités avancées pour vos diagrammes.","Upgrade to Pro":"Mettez à niveau vers Pro","Upgrade to Pro for permanent charts.":"Passez à la version Pro pour des diagrammes permanents.","Upload your File":"Téléchargez votre fichier","Use Custom CSS Only":"Utiliser uniquement du CSS personnalisé","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Utilisez Lucidchart ou Visio ? L\'importation CSV facilite l\'obtention de données à partir de n\'importe quelle source !","Use classes to group nodes":"Utilisez des classes pour regrouper les nœuds","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Utilisez l\'attribut <0>href pour créer un lien sur un nœud qui s\'ouvre dans un nouvel onglet.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Utilisez l\'attribut <0>src pour définir l\'image d\'un nœud. L\'image sera mise à l\'échelle pour s\'adapter au nœud, vous devrez donc peut-être ajuster la largeur et la hauteur du nœud pour obtenir le résultat souhaité. Seules les images publiques (non bloquées par CORS) sont prises en charge.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Utilisez les attributs <0>w et <1>h pour définir explicitement la largeur et la hauteur d\'un nœud.","Use the customer portal to change your billing information.":"Utilisez le portail client pour modifier vos informations de facturation.","Use these settings to adapt the look and behavior of your flowcharts":"Utilisez ces paramètres pour adapter l\'apparence et le comportement de vos diagrammes de flux","Use this file for org charts, hierarchies, and other organizational structures.":"Utilisez ce fichier pour les organigrammes, les hiérarchies et autres structures organisationnelles.","Use this file for sequences, processes, and workflows.":"Utilisez ce fichier pour les séquences, les processus et les workflows.","Use this mode to modify and enhance your current chart.":"Utilisez ce mode pour modifier et améliorer votre diagramme actuel.","Used at":"Utilisé à","User":"Utilisateur","Vector Export (SVG)":"Exportation de vecteurs (SVG)","View on Github":"Voir sur Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Vous souhaitez créer un diagramme à partir d\'un document ? Collez-le dans l\'éditeur et cliquez sur \'Convertir en diagramme\'","Watermark-Free Diagrams":"Diagrammes sans filigrane","Watermarks":"Filigranes","Welcome to Flowchart Fun":"Bienvenue dans Flowchart Fun","What if I just need it for one project?":"Et si je n\'en ai besoin que pour un seul projet ?","What our users are saying":"Ce que nos utilisateurs disent","What\'s next?":"Quelle est la prochaine étape ?","What\'s this?":"Qu\'est-ce que c\'est?","Width":"Largeur","Width and Height":"Largeur et hauteur","Will my diagrams actually look professional?":"Est-ce que mes diagrammes auront un aspect professionnel ?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Avec la version Pro de Flowchart Fun, vous pouvez utiliser des commandes en langage naturel pour rapidement détailler votre organigramme, idéal pour créer des diagrammes en déplacement. Pour 6 $ par mois, profitez de la facilité de l\'édition accessible par l\'IA pour améliorer votre expérience de création d\'organigrammes.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Avec la version pro, vous pouvez enregistrer et charger des fichiers locaux. C\'est parfait pour gérer des documents professionnels hors ligne.","Would you like to continue?":"Voulez-vous continuer ?","Would you like to suggest a new example?":"Souhaitez-vous suggérer un nouvel exemple ?","Wrap text in parentheses to connect to any node":"Entourez le texte entre parenthèses pour le connecter à n\'importe quel nœud","Write like an outline":"Écrivez comme un plan","Write your prompt here or click to enable the microphone, then press and hold to record.":"Écrivez votre message ici ou cliquez pour activer le microphone, puis maintenez pour enregistrer.","Yearly":"Annuellement","Yes — send us a message and we\'ll set you up with a discounted rate.":"Oui - envoyez-nous un message et nous vous fournirons un tarif réduit.","Yes, Replace Content":"Oui, remplacer le contenu","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Oui. Chaque diagramme utilise des mises en page équilibrées et automatiques avec une typographie propre. Vous pouvez personnaliser les thèmes, les couleurs et les styles - et exporter en tant que SVG net ou en tant que PNG haute résolution qui sera parfait dans toute présentation ou document.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Oui. La version Pro prend en charge l\'importation depuis Visio, Lucidchart et CSV - vous pouvez donc importer ce que vous avez déjà sans avoir à le recréer à partir de zéro.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Oui. Vous pouvez enregistrer et charger des fichiers localement, travailler entièrement hors ligne et contrôler exactement qui voit vos diagrammes. Aucune donnée ne quitte votre machine à moins que vous ne choisissiez de partager.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Vous êtes sur le point d\'ajouter ",["numNodes"]," nœuds et ",["numEdges"]," arêtes à votre graphe."],"You need to log in to access this page.":"Vous devez vous connecter pour accéder à cette page.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Vous êtes déjà un utilisateur Pro. <0>Gérer l\'abonnement<1/>Vous avez des questions ou des demandes de fonctionnalités? <2>Faites-le nous savoir","You\'re doing great!":"Vous vous en sortez très bien !","You\'re on the free plan.":"Vous êtes sur le plan gratuit.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Vous avez utilisé toutes vos conversions gratuites d\'IA. Passez à la version Pro pour une utilisation illimitée de l\'IA, des thèmes personnalisés, un partage privé et plus encore. Continuez à créer des diagrammes de flux incroyables sans effort !","Your Charts":"Vos diagrammes","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Votre bac à sable est un espace pour expérimenter librement avec nos outils de diagramme, se réinitialisant chaque jour pour un nouveau départ.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Vos graphiques sont en lecture seule car votre compte n\'est plus actif. Visitez votre page <0>compte pour en savoir plus.","Your next diagram should be your best one.":"Votre prochain diagramme devrait être le meilleur.","Your subscription is <0>{statusDisplay}.":["Votre abonnement est <0>",["statusDisplay"],"."],"Your work stays yours":"Votre travail reste le vôtre.","Zoom In":"Zoomer","Zoom Out":"Zoomer vers l\'extérieur","month":"mois","or":"ou","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/fr/messages.po b/app/src/locales/fr/messages.po index 579d33f91..1531844ee 100644 --- a/app/src/locales/fr/messages.po +++ b/app/src/locales/fr/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "48 $/an (économisez 33%) · Annulez à tout moment" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "6 $/mois" @@ -25,7 +25,7 @@ msgstr "6 $/mois" msgid "1 Temporary Flowchart" msgstr "1 Organigramme temporaire" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "1 diagramme à la fois" @@ -33,7 +33,7 @@ msgstr "1 diagramme à la fois" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>Seul le CSS personnalisé est activé. Seuls les paramètres de mise en page et avancés seront appliqués." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun est un projet open source réalisé par <1>Tone Row" @@ -49,7 +49,7 @@ msgstr "Une nouvelle version de l'application est disponible. Veuillez recharger msgid "AI Creation & Editing" msgstr "Création et édition d'IA" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "Génération et édition par IA" @@ -57,7 +57,7 @@ msgstr "Génération et édition par IA" msgid "AI-Powered Flowchart Creation" msgstr "Création de diagrammes de flux alimentés par l'IA" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "Généré par IA à partir de texte simple en moins de 5 secondes." @@ -65,12 +65,12 @@ msgstr "Généré par IA à partir de texte simple en moins de 5 secondes." msgid "AI-powered editing to supercharge your workflow" msgstr "Édition alimentée par l'IA pour booster votre flux de travail" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "À propos" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "Compte" @@ -106,7 +106,7 @@ msgstr "Aligner Verticalement" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "Tout cela pour seulement 6 $ par mois - moins que votre café quotidien ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "Toujours prêt pour la présentation" @@ -118,7 +118,7 @@ msgstr "Montant" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "Une erreur s'est produite. Essayez de l'envoyer à nouveau ou bien envoyez un e-mail à l'adresse {0}." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "Thème" @@ -170,11 +170,11 @@ msgstr "Couleur de fond" msgid "Basic Flowchart" msgstr "Diagramme de flux de base" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "Devenez un sponsor Github" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "Devenez un utilisateur Pro" @@ -191,8 +191,8 @@ msgstr "Facturé annuellement à 48 $" msgid "Billed monthly at $6" msgstr "Facturé mensuellement à 6 $" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "Blog" @@ -260,14 +260,14 @@ msgstr "Certains attributs peuvent être utilisés pour personnaliser l'apparenc msgid "Change Email Address" msgstr "Changer l'adresse email" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "Journal des modifications" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "Graphiques" @@ -346,7 +346,7 @@ msgstr "Colonne" msgid "Comment" msgstr "Commenter" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "Modèles de la communauté" @@ -403,7 +403,7 @@ msgstr "Convertir en diagramme" msgid "Convert to hosted chart?" msgstr "Convertir en graphique hébergé ?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Politique de cookies" @@ -500,7 +500,7 @@ msgstr "CSS personnalisé" msgid "Custom Sharing Options" msgstr "Options de partage personnalisées" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "Partage personnalisé et liens publics" @@ -516,8 +516,8 @@ msgstr "Éditeur Sandbox quotidien" msgid "Dark" msgstr "Sombre" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "Mode sombre" @@ -542,11 +542,11 @@ msgstr "Supprimer" msgid "Delete {0}" msgstr "Supprimer {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "Décrivez-le et il apparaît" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "Décrivez votre idée. Obtenez un diagramme digne d'être présenté." @@ -696,8 +696,8 @@ msgstr "Modifier avec l'IA" msgid "Editable" msgstr "Modifiable" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "Éditeur" @@ -742,7 +742,7 @@ msgstr "Entrez votre adresse e-mail ci-dessous et nous vous enverrons un lien po msgid "Equal To" msgstr "Égal à" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "Chaque diagramme s'exporte en PNG, SVG ou lien partageable de qualité - prêt pour la réunion, le document ou la présentation." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "Démontage des fonctionnalités" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "Commentaire" @@ -823,11 +823,15 @@ msgstr "Hauteur de nœud fixe" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Flowchart Fun Pro vous offre des organigrammes illimités, des collaborateurs illimités et un stockage illimité pour seulement 6 $/mois." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun est un projet open source réalisé par <0>Tone Row" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun est construit et maintenu par un seul développeur. Votre soutien permet de le garder en vie." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "Suivez-nous sur Twitter" @@ -909,6 +913,10 @@ msgstr "Vert?" msgid "Grid" msgstr "Quadrillage" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "Classement de groupe et vote à choix classé, gratuit" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "Des questions ou des problèmes complexes ? Nous sommes là pour vous aider. " @@ -980,7 +988,7 @@ msgstr "Importer des données à partir de n'importe quel fichier CSV et les map msgid "Import from CSV" msgstr "Importer depuis CSV" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Importer depuis Visio, Lucidchart, CSV" @@ -988,7 +996,7 @@ msgstr "Importer depuis Visio, Lucidchart, CSV" msgid "Import from Visio, Lucidchart, and CSV" msgstr "Importer à partir de Visio, Lucidchart et CSV" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "Importer de n'importe où" @@ -1012,7 +1020,7 @@ msgstr "Incluez un titre en utilisant un attribut <0>title. Pour utiliser la msgid "Indent to connect nodes" msgstr "Indentez pour connecter les nœuds" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "Info" @@ -1052,7 +1060,7 @@ msgstr "Continuez à pratiquer" msgid "Keep your data private on your computer" msgstr "Gardez vos données privées sur votre ordinateur" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "Langue" @@ -1101,8 +1109,8 @@ msgstr "Faites-nous savoir pourquoi vous annulez. Nous cherchons toujours à nou msgid "Light" msgstr "Lumineux" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "Mode lumineux" @@ -1160,8 +1168,8 @@ msgstr "Enregistrement local pour un accès hors ligne" msgid "Lock Zoom to Graph" msgstr "Verrouiller le Zoom sur le Graphique" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "Connexion" @@ -1177,11 +1185,15 @@ msgstr "Connectez-vous pour enregistrer" msgid "Log in to upgrade your account" msgstr "Connectez-vous pour mettre à niveau votre compte" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "Réalisé par <0>Tone Row" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "Faites un don unique" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "Rendez-le vôtre" @@ -1205,6 +1217,18 @@ msgstr "Largeur maximale du texte à l'intérieur des nœuds" msgid "Monthly" msgstr "Mensuel" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "Plus de Tone Row" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "Plus de Tone Row :" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "Plus d'outils :" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "Nommer le graphique" msgid "Name your chart" msgstr "Nommez votre graphique" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "Nouveau" @@ -1363,7 +1387,7 @@ msgstr "Ou peut-être bleu !" msgid "Organization Chart" msgstr "Organigramme" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "Exporter en PNG et JPG" @@ -1412,21 +1436,25 @@ msgstr "Livre-jeu" msgid "Pointer and container on same line" msgstr "Pointeur et conteneur sur la même ligne" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "Tarification" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "Support prioritaire en tête-à-tête" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "Support prioritaire" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "Politique de confidentialité" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "La version Pro commence à 4€/mois facturés annuellement. Annulez à tout moment." @@ -1451,7 +1479,7 @@ msgstr "Invite" msgid "Public" msgstr "Public" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Importer des données depuis Visio, Lucidchart, CSV ou partir d'un modèle. Pas besoin de recréer ce qui existe déjà." @@ -1575,8 +1603,8 @@ msgstr "De droite à gauche" msgid "Right-click nodes for options" msgstr "Cliquez avec le bouton droit sur les nœuds pour voir les options" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "Roadmap" @@ -1590,7 +1618,7 @@ msgstr "Faire pivoter l'étiquette" msgid "SVG Export is a Pro Feature" msgstr "L'exportation SVG est une fonctionnalité Pro" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "Formats d'exportation SVG, PDF et tous les autres formats" @@ -1603,7 +1631,7 @@ msgstr "Satisfaction garantie ou remboursement du premier paiement" msgid "Save" msgstr "Sauver" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "Enregistrer localement, travailler hors ligne et contrôler exactement qui voit quoi. Aucune donnée ne quitte votre machine à moins que vous ne le souhaitiez." @@ -1635,7 +1663,7 @@ msgstr "Paiement sécurisé" msgid "See more reviews on Product Hunt" msgstr "Voir plus de critiques sur Product Hunt" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "Découvrez les possibilités" @@ -1651,9 +1679,9 @@ msgstr "Envoyez-nous un message" msgid "Set a consistent height for all nodes" msgstr "Définir une hauteur constante pour tous les nœuds" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "Paramètres" @@ -1738,7 +1766,7 @@ msgstr "Recommencer" msgid "Start faster with use-case specific templates" msgstr "Démarrer plus rapidement avec des modèles spécifiques aux cas d'utilisation" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "Commencez gratuitement" @@ -1789,7 +1817,7 @@ msgstr "Abonnement réussi !" msgid "Subscription will end" msgstr "L'abonnement prendra fin" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "Support" @@ -1812,7 +1840,7 @@ msgstr "Délimiteur cible" msgid "Target Distance From Node" msgstr "Distance cible du nœud" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "Dites à l'IA ce dont vous avez besoin en langage clair. Votre diagramme se construit en quelques secondes." @@ -1856,7 +1884,7 @@ msgstr "Texte sur une ligne crée un nœud avec le texte comme étiquette" msgid "Thank you for your feedback!" msgstr "Merci pour votre commentaire !" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "La beauté et la magie résident dans le minimalisme." @@ -1884,7 +1912,7 @@ msgstr "Le délimiteur utilisé pour séparer plusieurs nœuds source" msgid "The delimiter used to separate multiple target nodes" msgstr "Le délimiteur utilisé pour séparer plusieurs nœuds cibles" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "Le moyen le plus rapide de transformer ce qui se trouve dans votre tête en quelque chose que tout le monde peut comprendre." @@ -1911,7 +1939,7 @@ msgstr "Éditeur de personnalisation de thème" msgid "Theme Editor" msgstr "Éditeur de thème" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "Éditeur de thème" @@ -2000,10 +2028,14 @@ msgstr "Essayez d'ajuster votre recherche ou vos filtres pour trouver ce que vou msgid "Try again" msgstr "Réessayer" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "Essayez-le gratuitement" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "Transformez des documents en diagrammes avec l'IA" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "Deux arêtes ont le même ID" @@ -2012,7 +2044,7 @@ msgstr "Deux arêtes ont le même ID" msgid "Two nodes have the same ID" msgstr "Deux nœuds ont le même ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "Tapez-le. Voyez-le." @@ -2057,7 +2089,7 @@ msgstr "Flux de diagrammes permanents illimités" msgid "Unlimited cloud-saved flowcharts" msgstr "Des organigrammes sauvegardés dans le cloud en illimité" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "Diagrammes sauvegardés illimités" @@ -2089,13 +2121,17 @@ msgstr "Mettre à niveau maintenant - Sauvegarder mon travail" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Passez à Flowchart Fun Pro et débloquez:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "Passez à Flowchart Fun Pro pour des diagrammes hébergés illimités, des exports haute résolution sans filigrane, l'édition avec l'IA, et plus encore. 4 €/mois facturés annuellement." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Mettez à niveau vers Flowchart Fun Pro pour débloquer les exportations SVG et profiter de fonctionnalités avancées pour vos diagrammes." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "Mettez à niveau vers Pro" @@ -2152,7 +2188,7 @@ msgstr "Utilisez ce fichier pour les séquences, les processus et les workflows. msgid "Use this mode to modify and enhance your current chart." msgstr "Utilisez ce mode pour modifier et améliorer votre diagramme actuel." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "Utilisé à" @@ -2164,7 +2200,7 @@ msgstr "Utilisateur" msgid "Vector Export (SVG)" msgstr "Exportation de vecteurs (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Voir sur Github" @@ -2302,7 +2338,7 @@ msgstr "Votre bac à sable est un espace pour expérimenter librement avec nos o msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "Vos graphiques sont en lecture seule car votre compte n'est plus actif. Visitez votre page <0>compte pour en savoir plus." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "Votre prochain diagramme devrait être le meilleur." @@ -2310,7 +2346,7 @@ msgstr "Votre prochain diagramme devrait être le meilleur." msgid "Your subscription is <0>{statusDisplay}." msgstr "Votre abonnement est <0>{statusDisplay}." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "Votre travail reste le vôtre." @@ -2333,10 +2369,10 @@ msgid "or" msgstr "ou" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/hi/messages.js b/app/src/locales/hi/messages.js index 71bbacbc7..d8f96ad18 100644 --- a/app/src/locales/hi/messages.js +++ b/app/src/locales/hi/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"$48/वर्ष (33% बचाएं) · कभी भी रद्द करें","$6/mo":"$6/महीना","1 Temporary Flowchart":"1 अस्थायी फ्लोचार्ट","1 diagram at a time":"एक डायग्राम एक समय में","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>कस्टम CSS केवल सक्षम है। केवल लेआउट और एडवांस्ड सेटिंग्स लागू की जाएगी।","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun <1>Tone Row द्वारा बनाई गई एक खुला स्रोत परियोजना है ","<0>Sign In / <1>Sign Up with email and password":"<0>साइन इन / <1>साइन अप ईमेल और पासवर्ड के साथ","A new version of the app is available. Please reload to update.":"एप्प का एक नया वर्जन उपलब्ध है। अपडेट करने के लिए रीलोड करें।","AI Creation & Editing":"एआई निर्माण और संपादन","AI generation & editing":"एआई उत्पादन और संपादन","AI-Powered Flowchart Creation":"एआई-पावर्ड फ्लोचार्ट निर्माण","AI-generated from plain text in under 5 seconds.":"एआई द्वारा सादा पाठ से 5 सेकंड के अंदर उत्पन्न किया गया।","AI-powered editing to supercharge your workflow":"एआई पावर्ड संपादन आपके वर्कफ्लो को तेज करने के लिए","About":"के बारे में","Account":"खाता","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"किसी भी विशेष वर्ण के पहले एक बैकस्लैश (<0>\\\\) जोड़ें: <1>(, <2>:, <3>#, या <4>.","Add some steps":"कुछ चरण जोड़ें","Advanced":"उन्नत","Align Horizontally":"आड़े सारी तरफ","Align Nodes":"नोड्स को संरेखित करें","Align Vertically":"ऊपर-नीचे सारी तरफ","All this for just $6/month - less than your daily coffee ☕":"सिर्फ $6/महीने में यह सब - आपके दैनिक कॉफ़ी से कम ☕","Always presentation-ready":"हमेशा प्रस्तुति के लिए तैयार","Amount":"रकम","An error occurred. Try resubmitting or email {0} directly.":["एक एरर हो गया. फिर से सबमिट करने की कोशिश करें या सीधे ",["0"]," ईमेल करें."],"Appearance":"दिखावट","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"क्या आप वाकई फ्लोचार्ट को हटाना चाहते हैं? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"क्या आप वाकई फ़ोल्डर को हटाना चाहते हैं? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"क्या आप वाकई फ़ोल्डर को हटाना चाहते हैं? ","Are you sure?":"क्या आप निश्चित हैं?","Arrow Size":"तीर आकार","Attributes":"गुण","August 2023":"2023 अगस्त","Back":"वापस","Back To Editor":"संपादक पर वापस जाएं","Background Color":"पृष्ठभूमि रंग","Basic Flowchart":"बेसिक फ्लोचार्ट","Become a Github Sponsor":"गिटहब स्पॉन्सर बनें","Become a Pro User":"प्रो उपयोगकर्ता बनें","Begin your journey":"अपनी यात्रा शुरू करें","Billed annually at $48":"वार्षिक रूप से $48 का बिल बनाया जाएगा","Billed monthly at $6":"मासिक रूप से $6 पर बिल किया जाता है","Blog":"ब्लॉग","Book a Meeting":"एक बैठक बुक करें","Border Color":"सीमा रंग","Border Width":"सीमा चौड़ाई","Bottom to Top":"नीचे से शीर्ष तक","Breadthfirst":"चौड़ाई पहले","Build your personal flowchart library":"अपनी निजी फ्लोचार्ट लाइब्रेरी बनाएं","Can I import my existing diagrams?":"क्या मैं अपने मौजूदा आरेखों को आयात कर सकता हूं?","Cancel":"रद्द करें","Cancel anytime":"कभी भी रद्द करें","Cancel your subscription. Your hosted charts will become read-only.":"अपनी सदस्यता रद्द करें. आपके होस्ट किये गए चार्ट सिर्फ़ पढ़े जा सकेंगे.","Certain attributes can be used to customize the appearance or functionality of elements.":"कुछ गुण तत्वों की दिखता या कार्यक्षमता को अनुकूलित करने के लिए उपयोग किए जा सकते हैं।","Change Email Address":"ईमेल पता बदलें","Changelog":"बदलाव का","Charts":"चार्ट","Check out the guide:":"गाइड की जाँच करें:","Check your email for a link to log in.<0/>You can close this window.":"लॉग इन करने के लिए अपने ईमेल की जाँच करें। आप इस विंडो को बंद कर सकते हैं।","Choose":"चुनें","Choose Template":"टेम्पलेट चुनें","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"एक किनारे के स्रोत और लक्ष्य के लिए विभिन्न तीर आकारों से चुनें। आकार शामिल हैं त्रिकोण, त्रिकोण-टी, सर्कल-त्रिकोण, त्रिकोण-क्रॉस, त्रिकोण-बैककर्व, वी, टी, चौकोर, हीरा, चेवरॉन और कोई नहीं।","Choose how edges connect between nodes":"नोड्स के बीच एज कैसे कनेक्ट करें चुनें","Choose how nodes are automatically arranged in your flowchart":"अपने फ्लोचार्ट में नोडों को स्वचालित रूप से व्यवस्थित कैसे करें चुनें","Circle":"परिधि","Classes":"वर्ग","Clear":"साफ़","Clear text?":"पाठ साफ़ करें?","Clone":"क्लोन करें","Clone Flowchart":"फ्लोचार्ट को क्लोन करें ","Close":"बंद करें","Color":"रंग","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"रंग में लाल, नारंगी, पीला, नीला, बैंगनी, काला, सफेद, और ग्रे शामिल हैं।","Column":"स्तंभ","Comment":"टिप्पणी","Community templates":"समुदाय टेम्पलेट","Compare our plans and find the perfect fit for your flowcharting needs":"हमारे प्लानों की तुलना करें और अपनी फ्लोचार्टिंग की आवश्यकताओं के लिए सही विकल्प खोजें","Concentric":"गाढ़ा","Confirm New Email":"नई ईमेल की पुष्टि करें","Confirm your email address to sign in.":"साइन इन करने के लिए अपना ईमेल पता पुष्टि करें।","Connect your Data":"अपने डेटा को कनेक्ट करें","Containers":"कंटेनर","Containers are nodes that contain other nodes. They are declared using curly braces.":"कंटेनर उन नोड्स हैं जो अन्य नोड्स को सम्मिलित करते हैं। वे कर्ली ब्रेस का उपयोग करके घोषित किया जाता है।","Continue":"जारी रखें","Continue in Sandbox (Resets daily, work not saved)":"सैंडबॉक्स में जारी रखें (दैनिक रूप से रीसेट होता है, काम सहेजा नहीं जाता)","Controls the flow direction of hierarchical layouts":"वर्गीकृत लेआउट की धारा को नियंत्रित करता है","Convert":"परिवर्तन करें","Convert to Flowchart":"फ्लोचार्ट में बदलें","Convert to hosted chart?":"होस्टेड चार्ट में कनवर्ट करें?","Cookie Policy":"कुकी नीति","Copied SVG code to clipboard":"क्लिपबोर्ड पर SVG कोड कॉपी किया गया","Copied {format} to clipboard":["क्लिपबोर्ड पर ",["प्रारूप"]," कॉपी किया गया"],"Copy":"कॉपी करें","Copy PNG Image":"PNG छवि कॉपी करें","Copy SVG Code":"SVG कोड कॉपी करें","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"अपने Excalidraw कोड को कॉपी करें और <0>excalidraw.com में पेस्ट करें ताकि आप संपादित कर सकें। यह सुविधा प्रयोगात्मक है और सभी आरेखों के साथ काम नहीं कर सकती। यदि आपको कोई बग मिलता है, तो <1>हमें जानकारी दें।","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"अपना मर्मेड.जेएस कोड कॉपी करें या मर्मेड.जेएस लाइव एडिटर में सीधे खोलें।","Create":"बनाएं","Create Flowcharts using AI":"एआई का उपयोग करके फ्लोचार्ट बनाएं","Create Unlimited Flowcharts":"असीमित पारितकथाओं बनाएं","Create a New Chart":"एक नया चार्ट बनाएं","Create a flowchart showing the steps of planning and executing a school fundraising event":"एक स्कूल रेस्ट्रोइज़िंग इवेंट की योजना और निष्पादन के चरणों को दिखाने वाला फ्लोचार्ट बनाएं","Create a new flowchart to get started or organize your work with folders.":"शुरू करने के लिए एक नया फ्लोचार्ट बनाएं या फ़ोल्डर के साथ अपना काम संगठित करें। ","Create flowcharts instantly: Type or paste text, see it visualized.":"तुरंत फ्लोचार्ट बनाएं: पाठ लिखें या पेस्ट करें, उसे दृश्यीकृत करें।","Create unlimited diagrams for just $6/month!":"सिर्फ $6/महीने में असीमित आरेख बनाएं!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"आकार में असीमित फ्लोचार्ट को क्लाउड में संग्रहीत करें - किसी भी जगह से उपलब्ध!","Create with AI":"AI के साथ बनाएं","Created Date":"बनाई गई तारीख","Creating an edge between two nodes is done by indenting the second node below the first":"दो नोड्स के बीच एक एज बनाने के लिए दूसरा नोड पहले वाले के नीचे इंडेंट करना होता है","Curve Style":"वक्र शैली","Custom CSS":"कस्टम CSS","Custom Sharing Options":"कस्टम शेयरिंग विकल्प","Custom sharing & public links":"कस्टम साझा करने और सार्वजनिक लिंक","Customer Portal":"ग्राहक पोर्टल","Daily Sandbox Editor":"दैनिक सैंडबॉक्स संपादक","Dark":"डार्क","Dark Mode":"डार्क मोड","Data Import (Visio, Lucidchart, CSV)":"डेटा आयात (विशियो, ल्यूसिडचार्ट, सीएसवी)","Data import feature for complex diagrams":"जटिल आरेखों के लिए डेटा आयात सुविधा","Date":"तारीख़","Delete":"हटाएँ","Delete {0}":["हटाएँ ",["0"]],"Describe it and it appears":"इसे वर्णन करें और वह दिखाई देगा","Describe your idea. Get a diagram worth presenting.":"अपनी विचारों का वर्णन करें। प्रस्तुत करने योग्य आरेख प्राप्त करें।","Design a software development lifecycle flowchart for an agile team":"एक एजाइल टीम के लिए सॉफ्टवेयर विकास जीवनचक्र फ्लोचार्ट डिज़ाइन करें","Develop a decision tree for a CEO to evaluate potential new market opportunities":"एक सीईओ के लिए नए बाजार के अवसरों का मूल्यांकन करने के लिए एक फैसले का पेड़ विकसित करें","Direction":"दिशा","Dismiss":"खारिज करें","Do you offer discounts for students or nonprofits?":"क्या आप छात्रों या गैर-लाभकारी संगठनों के लिए छूट प्रदान करते हैं?","Do you want to delete this?":"क्या आप इसे डिलीट करना चाहते हैं?","Document":"दस्तावेज़","Don\'t Lose Your Work":"अपना काम न खो दें","Download":"डाउनलोड","Download JPG":"JPG डाउनलोड करें","Download PNG":"PNG डाउनलोड करें","Download SVG":"SVG डाउनलोड करें","Drag and drop a CSV file here, or click to select a file":"CSV फ़ाइल यहां ड्रैग और ड्रॉप करें, या फ़ाइल का चयन करने के लिए क्लिक करें","Draw an edge from multiple nodes by beginning the line with a reference":"एक से अधिक नोड्स से एज ड्रा करने के लिए लाइन को एक संदर्भ के साथ शुरू करें","Drop the file here ...":"फाइल यहाँ ड्रॉप करें ...","Each line becomes a node":"प्रत्येक पंक्ति एक नोड बन जाती है","Edge ID, Classes, Attributes":"किनारे आईडी, वर्ग, गुण","Edge Label":"किनारे लेबल","Edge Label Column":"किनारे लेबल कॉलम","Edge Style":"किनारे शैली","Edge Text Size":"एड्ज टेक्स्ट आकार","Edge missing indentation":"एड्ज अंतराल गुम है","Edges":"किन्तुओं","Edges are declared in the same row as their source node":"उनके स्रोत नोड के ही पंक्ति में किन्तुओं की घोषणा की जाती है","Edges are declared in the same row as their target node":"उनके लक्ष्य नोड के ही पंक्ति में किन्तुओं की घोषणा की जाती है","Edges are declared in their own row":"किन्तुओं को अपनी खुद की पंक्ति में घोषणा की जाती है","Edges can also have ID\'s, classes, and attributes before the label":"लेबल से पहले, किन्तुओं को आईडीज़, क्लासेज़ और गुण देने की अनुमति होती है","Edges can be styled with dashed, dotted, or solid lines":"किन्तुओं को डैश्ड, डॉटेड या सॉलिड लाइन्स के साथ स्टाइल किया जा सकता है","Edges in Separate Rows":"अलग पंक्तियों में किन्हें","Edges in Source Node Row":"स्रोत नोड पंक्ति में किन्हें","Edges in Target Node Row":"लक्ष्य नोड पंक्ति में किन्हें","Edit":"संपादित करें","Edit with AI":"एआई के साथ संपादित करें","Editable":"संपादन योग्य","Editor":"संपादक","Email":"ईमेल","Empty":"खाली","Enable to set a consistent height for all nodes":"सभी नोड्स के लिए एक समान ऊंचाई सेट करने के लिए सक्षम करें","Enter a name for the cloned flowchart.":"क्लोन फ्लोचार्ट के लिए एक नाम दर्ज करें।","Enter a name for the new folder.":"नए फोल्डर के लिए एक नाम दर्ज करें।","Enter a new name for the {0}.":[["0"]," के लिए एक नया नाम दर्ज करें।"],"Enter your email address and we\'ll send you a magic link to sign in.":"अपना ईमेल पता दर्ज करें और हम आपको साइन इन करने के लिए एक जादूगरी लिंक भेजेंगे।","Enter your email address below and we\'ll send you a link to reset your password.":"नीचे अपना ईमेल पता दर्ज करें और हम आपको अपना पासवर्ड रीसेट करने के लिए एक लिंक भेजेंगे।","Equal To":"बराबर","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"हर चित्र ताजगी से PNG, SVG या साझा करने योग्य लिंक के रूप में निर्यात किया जाता है - मीटिंग, दस्तावेज़, या डेक के लिए तैयार है।","Everything you need to know about Flowchart Fun Pro":"Flowchart Fun Pro के बारे में आपको सब कुछ जानने की जरूरत है","Examples":"उदाहरण","Excalidraw":"Excalidraw","Exclusive Office Hours":"अनन्य ऑफिस घंटे","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"अपने फ्लोचार्ट में स्थानीय फाइलों को सीधे लोड करने की क्षमता का अनुभव करें, जो काम से संबंधित दस्तावेजों को ऑफ़लाइन प्रबंधित करने के लिए उत्कृष्ट है। फ्लोचार्ट फन प्रो के साथ इस अनूठे प्रो फीचर को और भी खोलें, सिर्फ $6/महीने में उपलब्ध है।","Explore Pro":"प्रो खोजें","Explore more":"और ज्ञान प्राप्त करें","Export":"एक्सपोर्ट करें","Export clean diagrams without branding":"ब्रांडिंग के बिना साफ आरेख निर्यात करें","Export to PNG & JPG":"PNG और JPG में निर्यात करें","Export to PNG, JPG, and SVG":"PNG, JPG और SVG में निर्यात करें","Feature Breakdown":"विशेषता विभाजन","Feedback":"फ़ीडबैक","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"किसी भी चिंता के लिए हमसे फीडबैक पेज के माध्यम से संपर्क करने के लिए स्वतंत्रता से अन्वेषण करें और प्रवेश करें।","Fine-tune layouts and visual styles":"लेआउट और दृश्य शैलियों को समायोजित करें","Fixed Height":"निश्चित ऊंचाई","Fixed Node Height":"निर्धारित नोड ऊंचाई","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"फ्लोचार्ट फन प्रो आपको सिर्फ $6/महीने में असीमित फ्लोचार्ट, असीमित सहयोगी और असीमित स्टोरेज प्रदान करता है।","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"फ्लोचार्ट फन एक डेवलपर द्वारा बनाया और रखा जाता है। आपका समर्थन इसे चलाने में सहायता करता है।","Follow Us on Twitter":"हमारे साथ ट्विटर पर फॉलो करें","Font Family":"फॉन्ट परिवार","Forgot your password?":"अपना पासवर्ड भूल गए?","Free":"मुफ्त","Free users: charts in the sandbox expire after 7 days.":"नि: शुल्क उपयोगकर्ताओं: सैंडबॉक्स में चार्ट 7 दिनों के बाद समाप्त हो जाते हैं।","Frequently Asked Questions":"अक्सर पूछे जाने वाले सवाल","Full-screen, read-only, and template sharing":"पूर्ण स्क्रीन, केवल पढ़ने के लिए और टेम्पलेट साझा करें","Fullscreen":"फ़ुलस्क्रीन","General":"सामान्य","Generate flowcharts from text automatically":"पाठ से स्वचालित रूप से फ्लोचार्ट उत्पन्न करें","Get Pro Access Now":"अब प्रो एक्सेस प्राप्त करें","Get Unlimited AI Requests":"असीमित एआई अनुरोध प्राप्त करें","Get rapid responses to your questions":"अपने सवालों के लिए त्वरित प्रतिक्रियाएं प्राप्त करें","Get unlimited flowcharts and premium features":"असीमित फ्लोचार्ट और प्रीमियम सुविधाओं का लाभ लें","Go back home":"घर वापस जाओ","Go to the Editor":"संपादक पर जाएं","Go to your Sandbox":"अपने सैंडबॉक्स पर जाएं","Graph":"ग्राफ़","Green?":"हरा?","Grid":"ग्रिड","Have complex questions or issues? We\'re here to help.":"जटिल सवाल या समस्याएं हैं? हम यहां आपकी मदद के लिए हैं।","Here are some Pro features you can now enjoy.":"यहाँ आपको कुछ प्रो फीचर आनंद लेने को मिल रहे हैं।","High-quality exports with embedded fonts":"एम्बेडेड फोंट के साथ उच्च गुणवत्ता वाले निर्यात","History":"हिस्ट्री","Home":"होम","How are edges declared in this data?":"इस डेटा में कैसे किन्हीं कड़ियाँ घोषित होती हैं?","How fast can I actually make something?":"मैं कितनी तेजी से कुछ बना सकता हूँ?","How would you like to save your chart?":"आप अपने चार्ट को कैसे सहेजना चाहेंगे?","I would like to request a new template:":"मैं एक नया टेम्पलेट अनुरोध करना चाहता हूँ:","ID\'s":"आईडीज़","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"अगर उस ईमेल के साथ एक खाता मौजूद है, तो हमने आपको पासवर्ड रीसेट करने के लिए निर्देशों के साथ एक ईमेल भेजा है।","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"यदि आप एक एड्ज बनाने के लिए मतलब है, तो इस लाइन को इंडेंट करें। यदि नहीं, तो कॉलन को बैक स्लैश के साथ भागो <0> \\\\: ","Images":"छवियाँ","Import Data":"डेटा आयात करें","Import data from a CSV file.":"CSV फ़ाइल से डेटा आयात करें।","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"किसी भी CSV फ़ाइल से डेटा आयात करें और इसे एक नए प्रक्रिया चार्ट में मैप करें। यह अन्य स्रोतों जैसे लुसिडचार्ट, गूगल शीट्स और विसिओ से डेटा आयात करने के लिए एक अच्छा तरीका है।","Import from CSV":"CSV से आयात करें","Import from Visio, Lucidchart, CSV":"विसियो, लुसिडचार्ट, सीएसवी से आयात करें","Import from Visio, Lucidchart, and CSV":"Visio, Lucidchart और CSV से आयात करें","Import from anywhere":"कहीं से आयात करें","Import from popular diagram tools":"प्रसिद्ध आरेख उपकरणों से आयात करें","Import your diagram it into Microsoft Visio using one of these CSV files.":"इन CSV फ़ाइलों में से एक का उपयोग करके अपनी आरेख Microsoft Visio में आयात करें।","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"डेटा आयात करना एक पेशेवर सुविधा है। आप केवल $6/माह के लिए Flowchart Fun Pro पर अपग्रेड कर सकते हैं।","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"एक <0>title विशेषता का उपयोग करके एक शीर्षक शामिल करें। Visio रंगीनी का उपयोग करने के लिए, निम्नलिखित में से किसी एक के बराबर एक <1>roleType विशेषता जोड़ें:","Indent to connect nodes":"नोड को जोड़ने के लिए इंडेंट करें","Info":"जानकारी","Is":"हाँ","Is my data private?":"क्या मेरा डेटा निजी है?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON कैनवास आपके द्वारा बनाई गई आपकी आरेख का एक JSON प्रतिनिधि है, जो <0>Obsidian कैनवास और अन्य एप्लिकेशनों द्वारा उपयोग किया जाता है।","Join 2000+ professionals who\'ve upgraded their workflow":"अपने वर्कफ्लो को अपग्रेड कर चुके 2000+ पेशेवरों में शामिल हों","Join thousands of happy users who love Flowchart Fun":"हजारों खुश उपयोगकर्ताओं के साथ शामिल हों जो Flowchart Fun से प्यार करते हैं","Keep Things Private":"चीजों को निजी रखें","Keep changes?":"परिवर्तन रखें?","Keep practicing":"अभ्यास जारी रखें","Keep your data private on your computer":"अपने डेटा को अपने कंप्यूटर पर निजी रखें","Language":"भाषा","Layout":"रूपरेखा","Layout Algorithm":"लेआउट एल्गोरिदम","Layout Frozen":"लेआउट फ्रोज़न","Leading References":"प्रमुख संदर्भ","Learn More":"और अधिक जानें","Learn Syntax":"सिंटैक्स सीखें","Learn about Flowchart Fun Pro":"Flowchart Fun Pro के बारे में जानें","Left to Right":"बाएं से दाएं","Let us know why you\'re canceling. We\'re always looking to improve.":"हमें बताएं कि आप क्यों रद्द कर रहे हैं। हम हमेशा सुधार करने की कोशिश कर रहे हैं।","Light":"लाइट","Light Mode":"लाइट मोड","Link":"लिंक","Link back":"वापस लिंक करें","Load":"लोड","Load Chart":"चार्ट लोड करें","Load File":"फ़ाइल लोड करें","Load Files":"फ़ाइलें लोड करें","Load default content":"डिफ़ॉल्ट सामग्री लोड करें","Load from link?":"लिंक से लोड करें?","Load layout and styles":"लोड लेआउट और शैलियां","Loading...":"लोड हो रहा है...","Local File Support":"स्थानीय फ़ाइल समर्थन","Local saving for offline access":"ऑफ़लाइन उपयोग के लिए स्थानीय सहेजना","Lock Zoom to Graph":"ग्राफ पर जूम लॉक करें","Log In":"लॉग इन करें","Log Out":"लॉग आउट","Log in to Save":"सेव में लॉग इन करें","Log in to upgrade your account":"अपने खाते को अपग्रेड करने के लिए लॉग इन करें","Make a One-Time Donation":"एक बार दान करें","Make it yours":"अपना बनाएं","Make publicly accessible":"सार्वजनिक रूप से एक्सेस दें","Manage Billing":"बिलिंग प्रबंधित करें","Map Data":"डेटा मैप","Maximum width of text inside nodes":"नोड्स के अंदर टेक्स्ट की अधिकतम चौड़ाई","Monthly":"मासिक","Move":"चलो","Move {0}":["चलो ",["0"]],"Multiple pointers on same line":"एक ही लाइन पर कई प्रतीक","My dog ate my credit card!":"मेरा कुत्ता मेरा क्रेडिट कार्ड खा गया!","Name":"नाम","Name Chart":"चार्ट का नाम","Name your chart":"अपने चार्ट को नाम दें","New":"नया","New Email":"नई ईमेल","New Flowchart":"नया फ्लोचार्ट","New Folder":"नया फोल्डर","Next charge":"अगला चार्ज","No Edges":"कोई किनारे नहीं","No Folder (Root)":"कोई फोल्डर नहीं (मूल)","No Watermarks!":"कोई वॉटरमार्क्स नहीं!","No charts yet":"अभी तक कोई चार्ट नहीं","No items in this folder":"इस फोल्डर में कोई आइटम नहीं","No matching charts found":"कोई मिलते जुलते चार्ट नहीं मिले","Node Border Style":"नोड सीमा शैली","Node Colors":"नोड रंग","Node ID":"नोड आईडी","Node ID, Classes, Attributes":"नोड आईडी, वर्ग, गुण","Node Label":"नोड लेबल","Node Shape":"नोड आकार","Node Shapes":"नोड आकार","Nodes":"नोड्स","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"नोड्स को डैश्ड, डॉट्ड, या डबल के साथ शैलीयित किया जा सकता है। सीमाओं को बॉर्डर_नोन के साथ हटाया जा सकता है।","Not Empty":"खाली नहीं","Now you\'re thinking with flowcharts!":"अब आप फ्लोचार्ट के साथ सोच रहे हैं!","Office Hours":"कार्यालय अवधि","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"कभी-कभी मैजिक लिंक आपके स्पैम फोल्डर में खत्म हो जाता है। अगर आप कुछ मिनट बाद उसे नहीं देख रहे हैं, तो वहां जाकर देखें या एक नया लिंक अनुरोध करें।","One on One Support":"एक प्रति एक समर्थन","One-on-One Support":"एक-पर-एक समर्थन","Open Customer Portal":"ग्राहक पोर्टल खोलें","Operation canceled":"ऑपरेशन रद्द किया गया है","Or maybe blue!":"या शायद नीला!","Organization Chart":"संगठन चार्ट","PNG & JPG export":"PNG और JPG निर्यात","Padding":"पैडिंग","Page not found":"पृष्ठ नहीं मिला","Password":"पासवर्ड","Past Due":"पिछले दौरान","Paste a document to convert it":"एक दस्तावेज़ को पेस्ट करें और उसे रूपांतरित करें","Paste your document or outline here to convert it into an organized flowchart.":"अपने दस्तावेज़ या रूपरेखा को यहां पेस्ट करें ताकि इसे एक व्यवस्थित फ्लोचार्ट में बदला जा सके।","Pasted content detected. Convert to Flowchart Fun syntax?":"पेस्ट की गई सामग्री का पता लगाया गया है। फ्लोचार्ट फन सिंटैक्स में रूपांतरित करें?","Perfect for docs and quick sharing":"दस्तावेज़ और त्वरित साझाकरण के लिए उपयुक्त","Permanent Charts are a Pro Feature":"स्थायी चार्ट एक प्रो सुविधा हैं","Playbook":"प्लेबुक","Pointer and container on same line":"प्रतीक और कंटेनर एक ही लाइन पर","Priority One-on-One Support":"प्राथमिकता वाला एक-से-एक समर्थन","Priority support":"प्राथमिकता समर्थन","Privacy Policy":"गोपनीयता नीति ","Pro starts at $4/mo billed yearly. Cancel anytime.":"प्रो शुरू होता है $4/माह वार्षिक बिल किया जाता है। कभी भी रद्द करें।","Pro tip: Right-click any node to customize its shape and color":"प्रो टिप: किसी भी नोड पर दायां-तीर क्लिक करें और उसकी आकृति और रंग को अनुकूलित करें।","Processing Data":"डेटा प्रसंस्करण","Processing...":"प्रसंस्करण हो रहा है...","Prompt":"प्रश्न","Public":"पब्लिक","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"विशियो, लुसिडचार्ट, सीएसवी से डेटा लाएं या टेम्पलेट से शुरू करें। पहले से मौजूद चीज़ों को दोहराना नहीं।","Quick experimentation space that resets daily":"रोजाना रीसेट होने वाला त्वरित प्रयोग क्षेत्र","Random":"अनियमित","Rapid Deployment Templates":"त्वरित डिप्लॉयमेंट टेम्पलेट्स","Rapid Templates":"त्वरित टेम्पलेट्स","Raster Export (PNG, JPG)":"रास्टर निर्यात (PNG, JPG)","Rate limit exceeded. Please try again later.":"रेट लिमिट पार हो गई है। कृपया बाद में पुनः प्रयास करें।","Read-only":"केवल पढ़ने के लिए","Reference by Class":"क्लास के द्वारा संदर्भ","Reference by ID":"आईडी द्वारा संदर्भ","Reference by Label":"लेबल द्वारा संदर्भ","References":"संदर्भ","References are used to create edges between nodes that are created elsewhere in the document":"संदर्भ दस्तावेज के अन्य भागों में बनाए गए नोड्स के बीच कड़ियाँ बनाने के लिए उपयोग किए जाते हैं","Referencing a node by its exact label":"सटीक लेबल द्वारा नोड का संदर्भ करना","Referencing a node by its unique ID":"अद्वितीय आईडी द्वारा नोड का संदर्भ करना","Referencing multiple nodes with the same assigned class":"एक ही निर्धारित कक्षा के साथ कई नोड का उल्लेख करना","Refresh Page":"पृष्ठ को ताज़ा करें","Reload to Update":"अपडेट करने के लिए रीलोड करें","Rename":"फिर से नाम बदलें","Rename {0}":["नाम बदलें ",["0"]],"Request Magic Link":"अनुरोध जादू लिंक","Request Password Reset":"पासवर्ड रीसेट का अनुरोध करें","Reset":"रीसेट करें","Reset Password":"पासवर्ड रीसेट करें","Resume Subscription":"सदस्यता फिर से शुरू करें","Return":"वापसी","Right to Left":"दाएं से बाएं","Right-click nodes for options":"विकल्पों के लिए नोड को दायां-बांयां क्लिक करें","Roadmap":"रोडमैप","Rotate Label":"लेबल को घुमाएँ","SVG Export is a Pro Feature":"SVG निर्यात एक प्रो सुविधा है","SVG, PDF & all export formats":"SVG, पीडीएफ और सभी निर्यात प्रारूप","Satisfaction guaranteed or first payment refunded":"संतुष्टि की गारंटी या पहली भुगतान की राशि वापस कर दी जाएगी","Save":"सहेजें","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"स्थानीय रूप से सहेजें, ऑफ़लाइन में काम करें, और साफ़ करें कि कौन क्या देख सकता है। जब तक आप नहीं कहते, कोई डेटा आपकी मशीन से बाहर नहीं जाता है।","Save time with AI and dictation, making it easy to create diagrams.":"एआई और बोलने की सुविधा के साथ समय बचाएं, जो आसान डायग्राम बनाने को बनाता है।","Save to Cloud":"क्लौड में सेव करें","Save to File":"फाइल में सेव करें","Save your Work":"अपनी कार्यवाही सुरक्षित करें","Schedule personal consultation sessions":"निजी परामर्श सत्रों की अनुसूची बनाएं","Secure payment":"सुरक्षित भुगतान","See more reviews on Product Hunt":"Product Hunt पर अधिक समीक्षा देखें","See what\'s possible":"क्या संभव है देखें","Select a destination folder for \\"{0}\\".":"के लिए एक लक्षित फोल्डर का चयन करें \\\\","Send us a message":"हमें एक संदेश भेजें","Set a consistent height for all nodes":"सभी नोड्स के लिए एक समान ऊंचाई सेट करें","Settings":"सेटिंग","Share":"साझा करें","Sign In":"साइन इन करें","Sign in with <0>GitHub":"<0>GitHub के साथ साइन इन करें","Sign in with <0>Google":"<0>Google के साथ साइन इन करें","Sorry! This page is only available in English.":"माफ़ करें! यह पेज केवल अंग्रेजी में उपलब्ध है।","Sorry, there was an error converting the text to a flowchart. Try again later.":"क्षमा करें, टेक्स्ट को फ्लोचार्ट में रूपांतरित करने में एक त्रुटि हुई। बाद में पुनः प्रयास करें।","Sort Ascending":"आरोही क्रम में छाँटें","Sort Descending":"अवरोहण करें","Sort by {0}":[["0"]," द्वारा क्रमबद्ध करें"],"Source Arrow Shape":"स्रोत तीर आकार","Source Column":"स्रोत स्तंभ","Source Delimiter":"स्रोत डिलिमिटर","Source Distance From Node":"नोड से स्रोत दूरी","Source/Target Arrow Shape":"स्रोत / लक्ष्य तीर आकार","Spacing":"अंतराल","Special Attributes":"विशेष गुण","Start":"शुरू","Start Over":"शुरू करें","Start faster with use-case specific templates":"उपयोग मामले विशिष्ट टेम्पलेट के साथ तेजी से शुरू करें","Start for free":"मुफ़्त शुरू करें","Status":"स्टेटस","Step 1":"कदम 1","Step 2":"कदम 2","Step 3":"कदम 3","Store any data associated to a node":"किसी नोड से संबंधित किसी भी डेटा स्टोर करें","Style Classes":"शैली क्लासेज","Style with classes":"क्लासेस के साथ स्टाइल","Submit":"भेजना","Subscription":"सदस्यता","Subscription Successful!":"सदस्यता सफल हुआ!","Subscription will end":"सदस्यता समाप्त हो जाएगी","Support":"समर्थन","Target Arrow Shape":"लक्ष्य तीर आकार","Target Column":"लक्ष्य कॉलम","Target Delimiter":"लक्ष्य डेलीमीटर","Target Distance From Node":"नोड से लक्ष्य दूरी","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"एआई को सादा अंग्रेजी में बताएं कि आपको क्या चाहिए। आपका डायग्राम कुछ ही सेकंड में बन जाएगा।","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"हमें बताएं कि क्या काम कर रहा है और क्या नहीं। हर संदेश डेवलपर द्वारा पढ़ा जाता है।","Text Color":"पाठ रंग","Text Horizontal Offset":"टेक्स्ट की क्षैतिज ओफसेट","Text Leading":"पाठ प्रमुख","Text Max Width":"टेक्स्ट की अधिकतम चौड़ाई","Text Vertical Offset":"पाठ लंबाई ऑफसेट","Text followed by colon+space creates an edge with the text as the label":"स्क्लीन के बाद कोलन + स्पेस एक किरदार बनाता है जिसका पाठ लेबल है","Text on a line creates a node with the text as the label":"एक पंक्ति पर पाठ एक नोड बनाता है जिसका पाठ लेबल है","Thank you for your feedback!":"आपके फ़ीडबैक के लिए धन्यवाद!","The beauty and magic reside in the minimalism.":"सुंदरता और जादू संक्षेपता में हैं।","The best way to change styles is to right-click on a node or an edge and select the style you want.":"शैलीयित करने के लिए सर्वश्रेष्ठ तरीका नोड या एड्ज पर राइट-क्लिक करके आपके द्वारा चाहिए शैली का चयन करना है।","The column that contains the edge label(s)":"कॉलम जो एड्ज लेबल (ओं) को शामिल करता है","The column that contains the source node ID(s)":"कॉलम जो स्रोत नोड आईडी (ओं) को शामिल करता है","The column that contains the target node ID(s)":"कॉलम जो लक्ष्य नोड आईडी (ओं) को शामिल करता है","The delimiter used to separate multiple source nodes":"कई स्रोत नोड्स को अलग करने के लिए उपयोग किया गया डिलिमिटर","The delimiter used to separate multiple target nodes":"कई लक्ष्य नोड्स को अलग करने के लिए उपयोग किया गया डिलिमिटर","The fastest way to turn what\'s in your head into something everyone else can understand.":"अपने दिमाग में क्या है उसे कुछ ऐसा बनाएं कि सभी उसे समझ सकें।","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"फ्री प्लान दैनिक उपयोग के लिए बहुत अच्छा काम करता है। अगर आपको प्रो फीचर्स की आवश्यकता है, तो महीने-ब्य-महीने $6 का खर्चा होगा - कोई बाध्यता के साथ कभी भी रद्द कर सकते हैं।","The possible shapes are:":"संभव आकृतियाँ हैं:","Theme":"थीम","Theme Customization Editor":"थीम कस्टमाइज़ेशन संपादक","Theme Editor":"थीम संपादक","Theme editor":"थीम संपादक","There are no edges in this data":"इस डेटा में कोई एड्ज नहीं है","This action cannot be undone.":"इस क्रिया को पूर्ववत नहीं किया जा सकता।","This feature is only available to pro users. <0>Become a pro user to unlock it.":"यह सुविधा केवल प्रो उपयोगकर्ताओं के लिए उपलब्ध है। <0>प्रो उपयोगकर्ता बनें इसे अनलॉक करने के लिए।","This may take between 30 seconds and 2 minutes depending on the length of your input.":"आपके इनपुट की लंबाई के आधार पर, यह 30 सेकंड से 2 मिनट तक लग सकता है।","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"यह सैंडबॉक्स प्रयोग करने के लिए परफेक्ट है, लेकिन ध्यान रखें - यह दैनिक रूप से रीसेट होता है। अभी अपग्रेड करें और अपना वर्तमान काम रखें!","This will replace the current content.":"यह वर्तमान सामग्री को बदल देगा।","This will replace your current chart content with the template content.":"यह आपके मौजूदा चार्ट की सामग्री को टेम्पलेट की सामग्री से बदल देगा।","This will replace your current sandbox.":"यह आपके वर्तमान सैंडबॉक्स को बदल देगा।","Time to decide":"फैसला लेने का समय","Tip":"सुझाव","To fix this change one of the edge IDs":"इसे ठीक करने के लिए एड्ज आईडी के एक को बदलें","To fix this change one of the node IDs":"इसे ठीक करने के लिए नोड आईडी के एक को बदलें","To fix this move one pointer to the next line":"इसे ठीक करने के लिए प्रतीक को अगली पंक्ति पर ले जाएं","To fix this start the container <0/> on a different line":"इसे ठीक करने के लिए कंटेनर <0/> को एक अलग पंक्ति पर शुरू करें","To learn more about why we require you to log in, please read <0>this blog post.":"हमें आपको लॉगिन करने के लिए आवश्यक क्यों है, कृपया <0>यह ब्लॉग पोस्ट पढ़ें।","Top to Bottom":"ऊपर से नीचे","Transform Your Ideas into Professional Diagrams in Seconds":"अपने विचारों को सेकंड में प्रोफेशनल डायरेक्टरी में रूपांतरित करें","Transform text into diagrams instantly":"पाठ को तुरंत आरेख में बदलें","Try AI":"एआई को आजमाएं","Try adjusting your search or filters to find what you\'re looking for.":"अपनी खोज या फ़िल्टरों को समायोजित करने का प्रयास करें ताकि आप जो ढूंढ रहे हैं उसे ढूंढ सकें।","Try again":"फिर से कोशिश करें","Try it free":"इसे मुफ्त में आज़माएं","Two edges have the same ID":"दो किनारे उसी आईडी के हैं","Two nodes have the same ID":"दो नोड उसी आईडी के हैं","Type it. See it.":"इसे टाइप करें। देखें।","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"उह ओह, आपके पास मुफ्त अनुरोधों की सीमा पूरी हो गई है! असीमित डायग्राम परिवर्तन के लिए Flowchart Fun Pro पर अपग्रेड करें, और पाठ को स्पष्ट, दृश्यमान फ्लोचार्ट में आसानी से कॉपी और पेस्ट करते रहें।","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"60 सेकंड से कम समय में। कुछ पंक्तियां टाइप करें या AI को बताएं, और आपका आरेख तुरंत दिखाई देगा। एक क्लिक से निर्यात या साझा करें।","Undo":"वापस ले जाएं","Unescaped special character":"अस्केप्ड विशेष वर्ण","Unique text value to identify a node":"एक नोड को पहचानने के लिए अद्वितीय पाठ मूल्य","Unknown":"अज्ञात","Unknown Parsing Error":"अज्ञात पार्सिंग त्रुटि","Unlimited Flowcharts":"असीमित फ्लोचार्ट्स","Unlimited Permanent Flowcharts":"असीमित स्थायी प्रवाहगतीं ","Unlimited cloud-saved flowcharts":"असीमित क्लाउड-सहेजे फ्लोचार्ट्स","Unlimited saved diagrams":"असीमित सहेजे गए आरेख","Unlock AI Features and never lose your work with a Pro account.":"प्रो खाते से AI फीचर्स खोलें और कभी भी अपना काम न खोएं।","Unlock Unlimited AI Flowcharts":"असीमित AI फ्लोचार्ट्स को अनलॉक करें","Unpaid":"अवैतनिक","Update Email":"ईमेल अपडेट करें","Updated Date":"अपडेट की गई तारीख","Upgrade Now - Save My Work":"अपग्रेड करें अब - मेरा काम सहेजें","Upgrade to Flowchart Fun Pro and unlock:":"फ्लोचार्ट फन प्रो पर अपग्रेड करें और अनलॉक करें:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"अपने डायग्राम के लिए एसवीजी निर्यात और अधिक उन्नत सुविधाओं का आनंद लेने के लिए फ्लोचार्ट फन प्रो पर अपग्रेड करें।","Upgrade to Pro":"प्रो को अपग्रेड करें","Upgrade to Pro for permanent charts.":"प्रो अपग्रेड करें और स्थायी चार्ट प्राप्त करें।","Upload your File":"अपनी फाइल अपलोड करें","Use Custom CSS Only":"केवल कस्टम CSS का उपयोग करें","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"क्या आप Lucidchart या Visio का उपयोग करते हैं? CSV आयात किसी भी स्रोत से डेटा प्राप्त करने को आसान बनाता है!","Use classes to group nodes":"नोड्स को समूहों में सम्मिलित करने के लिए वर्ग उपयोग करें","Use the attribute <0>href to set a link on a node that opens in a new tab.":"नोड पर एक लिंक सेट करने के लिए गुण <0>href उपयोग करें जो एक नये टैब में खुलेगा।","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"नोड की छवि सेट करने के लिए <0>src गुण का उपयोग करें। छवि नोड के आकार में स्केल की जाएगी, इसलिए आपको आवश्यक प्रतिस्थापित करने के लिए नोड की चौड़ाई और ऊँचाई को समायोजित करना होगा। केवल सार्वजनिक छवियाँ (CORS द्वारा ब्लॉक नहीं की गई) समर्थित हैं।","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"नोड की विशिष्ट चौड़ाई और ऊँचाई सेट करने के लिए <0>w और <1>h गुण का उपयोग करें।","Use the customer portal to change your billing information.":"अपनी बिलिंग जानकारी बदलने के लिए ग्राहक पोर्टल का उपयोग करें।","Use these settings to adapt the look and behavior of your flowcharts":"अपने फ्लोचार्ट की दिखता और व्यवहार को अनुकूलित करने के लिए इन सेटिंग्स का उपयोग करें","Use this file for org charts, hierarchies, and other organizational structures.":"संगठनात्मक चार्ट, पदानुक्रमों और अन्य संगठनात्मक संरचनाओं के लिए इस फ़ाइल का उपयोग करें।","Use this file for sequences, processes, and workflows.":"अनुक्रमों, प्रक्रियाओं और कार्यप्रवाहों के लिए इस फ़ाइल का उपयोग करें।","Use this mode to modify and enhance your current chart.":"अपने मौजूदा चार्ट को संशोधित और सुधारित करने के लिए इस मोड का उपयोग करें।","Used at":"इस्तेमाल किया गया","User":"यूज़र","Vector Export (SVG)":"वेक्टर निर्यात (SVG)","View on Github":"Github पर देखें","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"क्या आप एक दस्तावेज़ से फ्लोचार्ट बनाना चाहते हैं? संपादक में इसे पेस्ट करें और \'फ्लोचार्ट में परिवर्तित करें\' पर क्लिक करें।","Watermark-Free Diagrams":"वॉटरमार्क-मुक्त आरेख","Watermarks":"वॉटरमार्क","Welcome to Flowchart Fun":"फ्लोचार्ट फन में आपका स्वागत है","What if I just need it for one project?":"क्या मुझे केवल एक प्रोजेक्ट के लिए ही इसकी आवश्यकता है?","What our users are saying":"हमारे उपयोगकर्ताओं के क्या कहने हैं","What\'s next?":"अगला क्या है?","What\'s this?":"यह क्या है?","Width":"चौड़ाई","Width and Height":"चौड़ाई और ऊँचाई","Will my diagrams actually look professional?":"क्या मेरे डायग्राम वास्तव में पेशेवर दिखेंगे?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"फ्लोचार्ट फन के प्रो संस्करण के साथ, आप प्राकृतिक भाषा के आदेशों का उपयोग करके अपने फ्लोचार्ट विवरणों को त्वरित रूप से समाप्त कर सकते हैं, यात्रा पर आरेख बनाने के लिए आदर्श। $6/महीने के लिए, अपने फ्लोचार्टिंग अनुभव को बढ़ाने के लिए पहुंचने योग्य AI संपादन की सुविधा प्राप्त करें।","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"प्रो संस्करण के साथ आप स्थानीय फ़ाइलों को सहेज और लोड कर सकते हैं। यह ऑफ़लाइन काम से जुड़े दस्तावेज़ों को प्रबंधित करने के लिए उपयुक्त है।","Would you like to continue?":"क्या आप जारी रखना चाहते हैं?","Would you like to suggest a new example?":"क्या आप एक नया उदाहरण सुझाना चाहेंगे?","Wrap text in parentheses to connect to any node":"किसी भी नोड से जुड़ने के लिए ब्रैकेट में लिखें","Write like an outline":"आउटलाइन की तरह लिखें","Write your prompt here or click to enable the microphone, then press and hold to record.":"अपना प्रॉम्प्ट यहां लिखें या माइक्रोफोन को सक्षम करने के लिए क्लिक करें, फिर रिकॉर्ड करने के लिए दबाएं और रखें।","Yearly":"वार्षिक","Yes — send us a message and we\'ll set you up with a discounted rate.":"हाँ - हमें एक संदेश भेजें और हम आपको छूट दर से सेट कर देंगे।","Yes, Replace Content":"हाँ, सामग्री को बदलें","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"हाँ। हर डायग्राम बैलेंस्ड, स्वचालित लेआउट का उपयोग करता है जो साफ टाइपोग्राफी के साथ होता है। आप थीम, रंग और स्टाइल को अनुकूलित कर सकते हैं - और क्रिस्प SVG या हाई-रेज़ोल्यूशन PNG के रूप में निर्यात कर सकते हैं जो किसी भी प्रस्तुति या दस्तावेज़ में बेहतर दिखता है।","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"हाँ। प्रो विशियो, लुसिडचार्ट और सीएसवी से आयात का समर्थन करता है - इसलिए आप उसे बिना एकदम से फिर से बनाए बिना अपने पास लाए सकते हैं।","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"हाँ। आप स्थानीय रूप से फ़ाइलें सहेज सकते हैं, पूरी तरह से ऑफ़लाइन काम कर सकते हैं, और अपनी डायग्राम को किसी भी व्यक्ति को दिखाने के लिए नियंत्रित कर सकते हैं। डेटा आपकी मशीन से नहीं जाता है जब तक आप शेयर करने के लिए नहीं चुनते हैं।","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["आप अपने ग्राफ में ",["numNodes"]," नोड्स और ",["numEdges"]," एड्ज़ जोड़ने वाले हैं।"],"You need to log in to access this page.":"इस पृष्ठ तक पहुँचने के लिए आपको लॉग इन करना होगा।","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"आप पहले से ही एक प्रो उपयोगकर्ता हैं। <0>सदस्यता प्रबंधित करें<1/>क्या आपके पास कोई सवाल या सुविधा अनुरोध है? <2>हमें बताएं","You\'re doing great!":"आप बहुत अच्छा कर रहे हैं!","You\'re on the free plan.":"आप मुफ़्त योजना पर हैं।","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"आपने अपने सभी नि: शुल्क एआई रूपांतरण का उपयोग किया है। असीमित एआई उपयोग, कस्टम थीम, निजी साझाकरण और अधिक के लिए प्रो पर अपग्रेड करें। अब आसानी से शानदार फ्लोचार्ट बनाते रहें!","Your Charts":"आपके चार्ट","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"आपका सैंडबॉक्स हमारी फ्लोचार्ट टूल के साथ निःशुल्क प्रयोग करने के लिए एक स्थान है, जो हर दिन एक नए शुरुआत के लिए रीसेट होता है।","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"आपके चार्ट रीड-ओनली हैं क्योंकि आपका खाता अब सक्रिय नहीं है। अपने <0>खाता पेज पर जाकर अधिक जानकारी प्राप्त करें।","Your next diagram should be your best one.":"आपकी अगली डायग्राम आपकी सबसे अच्छी होनी चाहिए।","Your subscription is <0>{statusDisplay}.":["आपका सदस्यता <0>",["statusDisplay"]," है।"],"Your work stays yours":"आपका काम आपका ही रहता है।","Zoom In":"ज़ूम इन करें","Zoom Out":"आउट ज़ूम करें","month":"महीना","or":"या","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"$48/वर्ष (33% बचाएं) · कभी भी रद्द करें","$6/mo":"$6/महीना","1 Temporary Flowchart":"1 अस्थायी फ्लोचार्ट","1 diagram at a time":"एक डायग्राम एक समय में","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>कस्टम CSS केवल सक्षम है। केवल लेआउट और एडवांस्ड सेटिंग्स लागू की जाएगी।","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun <1>Tone Row द्वारा बनाई गई एक खुला स्रोत परियोजना है ","<0>Sign In / <1>Sign Up with email and password":"<0>साइन इन / <1>साइन अप ईमेल और पासवर्ड के साथ","A new version of the app is available. Please reload to update.":"एप्प का एक नया वर्जन उपलब्ध है। अपडेट करने के लिए रीलोड करें।","AI Creation & Editing":"एआई निर्माण और संपादन","AI generation & editing":"एआई उत्पादन और संपादन","AI-Powered Flowchart Creation":"एआई-पावर्ड फ्लोचार्ट निर्माण","AI-generated from plain text in under 5 seconds.":"एआई द्वारा सादा पाठ से 5 सेकंड के अंदर उत्पन्न किया गया।","AI-powered editing to supercharge your workflow":"एआई पावर्ड संपादन आपके वर्कफ्लो को तेज करने के लिए","About":"के बारे में","Account":"खाता","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"किसी भी विशेष वर्ण के पहले एक बैकस्लैश (<0>\\\\) जोड़ें: <1>(, <2>:, <3>#, या <4>.","Add some steps":"कुछ चरण जोड़ें","Advanced":"उन्नत","Align Horizontally":"आड़े सारी तरफ","Align Nodes":"नोड्स को संरेखित करें","Align Vertically":"ऊपर-नीचे सारी तरफ","All this for just $6/month - less than your daily coffee ☕":"सिर्फ $6/महीने में यह सब - आपके दैनिक कॉफ़ी से कम ☕","Always presentation-ready":"हमेशा प्रस्तुति के लिए तैयार","Amount":"रकम","An error occurred. Try resubmitting or email {0} directly.":["एक एरर हो गया. फिर से सबमिट करने की कोशिश करें या सीधे ",["0"]," ईमेल करें."],"Appearance":"दिखावट","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"क्या आप वाकई फ्लोचार्ट को हटाना चाहते हैं? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"क्या आप वाकई फ़ोल्डर को हटाना चाहते हैं? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"क्या आप वाकई फ़ोल्डर को हटाना चाहते हैं? ","Are you sure?":"क्या आप निश्चित हैं?","Arrow Size":"तीर आकार","Attributes":"गुण","August 2023":"2023 अगस्त","Back":"वापस","Back To Editor":"संपादक पर वापस जाएं","Background Color":"पृष्ठभूमि रंग","Basic Flowchart":"बेसिक फ्लोचार्ट","Become a Github Sponsor":"गिटहब स्पॉन्सर बनें","Become a Pro User":"प्रो उपयोगकर्ता बनें","Begin your journey":"अपनी यात्रा शुरू करें","Billed annually at $48":"वार्षिक रूप से $48 का बिल बनाया जाएगा","Billed monthly at $6":"मासिक रूप से $6 पर बिल किया जाता है","Blog":"ब्लॉग","Book a Meeting":"एक बैठक बुक करें","Border Color":"सीमा रंग","Border Width":"सीमा चौड़ाई","Bottom to Top":"नीचे से शीर्ष तक","Breadthfirst":"चौड़ाई पहले","Build your personal flowchart library":"अपनी निजी फ्लोचार्ट लाइब्रेरी बनाएं","Can I import my existing diagrams?":"क्या मैं अपने मौजूदा आरेखों को आयात कर सकता हूं?","Cancel":"रद्द करें","Cancel anytime":"कभी भी रद्द करें","Cancel your subscription. Your hosted charts will become read-only.":"अपनी सदस्यता रद्द करें. आपके होस्ट किये गए चार्ट सिर्फ़ पढ़े जा सकेंगे.","Certain attributes can be used to customize the appearance or functionality of elements.":"कुछ गुण तत्वों की दिखता या कार्यक्षमता को अनुकूलित करने के लिए उपयोग किए जा सकते हैं।","Change Email Address":"ईमेल पता बदलें","Changelog":"बदलाव का","Charts":"चार्ट","Check out the guide:":"गाइड की जाँच करें:","Check your email for a link to log in.<0/>You can close this window.":"लॉग इन करने के लिए अपने ईमेल की जाँच करें। आप इस विंडो को बंद कर सकते हैं।","Choose":"चुनें","Choose Template":"टेम्पलेट चुनें","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"एक किनारे के स्रोत और लक्ष्य के लिए विभिन्न तीर आकारों से चुनें। आकार शामिल हैं त्रिकोण, त्रिकोण-टी, सर्कल-त्रिकोण, त्रिकोण-क्रॉस, त्रिकोण-बैककर्व, वी, टी, चौकोर, हीरा, चेवरॉन और कोई नहीं।","Choose how edges connect between nodes":"नोड्स के बीच एज कैसे कनेक्ट करें चुनें","Choose how nodes are automatically arranged in your flowchart":"अपने फ्लोचार्ट में नोडों को स्वचालित रूप से व्यवस्थित कैसे करें चुनें","Circle":"परिधि","Classes":"वर्ग","Clear":"साफ़","Clear text?":"पाठ साफ़ करें?","Clone":"क्लोन करें","Clone Flowchart":"फ्लोचार्ट को क्लोन करें ","Close":"बंद करें","Color":"रंग","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"रंग में लाल, नारंगी, पीला, नीला, बैंगनी, काला, सफेद, और ग्रे शामिल हैं।","Column":"स्तंभ","Comment":"टिप्पणी","Community templates":"समुदाय टेम्पलेट","Compare our plans and find the perfect fit for your flowcharting needs":"हमारे प्लानों की तुलना करें और अपनी फ्लोचार्टिंग की आवश्यकताओं के लिए सही विकल्प खोजें","Concentric":"गाढ़ा","Confirm New Email":"नई ईमेल की पुष्टि करें","Confirm your email address to sign in.":"साइन इन करने के लिए अपना ईमेल पता पुष्टि करें।","Connect your Data":"अपने डेटा को कनेक्ट करें","Containers":"कंटेनर","Containers are nodes that contain other nodes. They are declared using curly braces.":"कंटेनर उन नोड्स हैं जो अन्य नोड्स को सम्मिलित करते हैं। वे कर्ली ब्रेस का उपयोग करके घोषित किया जाता है।","Continue":"जारी रखें","Continue in Sandbox (Resets daily, work not saved)":"सैंडबॉक्स में जारी रखें (दैनिक रूप से रीसेट होता है, काम सहेजा नहीं जाता)","Controls the flow direction of hierarchical layouts":"वर्गीकृत लेआउट की धारा को नियंत्रित करता है","Convert":"परिवर्तन करें","Convert to Flowchart":"फ्लोचार्ट में बदलें","Convert to hosted chart?":"होस्टेड चार्ट में कनवर्ट करें?","Cookie Policy":"कुकी नीति","Copied SVG code to clipboard":"क्लिपबोर्ड पर SVG कोड कॉपी किया गया","Copied {format} to clipboard":["क्लिपबोर्ड पर ",["प्रारूप"]," कॉपी किया गया"],"Copy":"कॉपी करें","Copy PNG Image":"PNG छवि कॉपी करें","Copy SVG Code":"SVG कोड कॉपी करें","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"अपने Excalidraw कोड को कॉपी करें और <0>excalidraw.com में पेस्ट करें ताकि आप संपादित कर सकें। यह सुविधा प्रयोगात्मक है और सभी आरेखों के साथ काम नहीं कर सकती। यदि आपको कोई बग मिलता है, तो <1>हमें जानकारी दें।","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"अपना मर्मेड.जेएस कोड कॉपी करें या मर्मेड.जेएस लाइव एडिटर में सीधे खोलें।","Create":"बनाएं","Create Flowcharts using AI":"एआई का उपयोग करके फ्लोचार्ट बनाएं","Create Unlimited Flowcharts":"असीमित पारितकथाओं बनाएं","Create a New Chart":"एक नया चार्ट बनाएं","Create a flowchart showing the steps of planning and executing a school fundraising event":"एक स्कूल रेस्ट्रोइज़िंग इवेंट की योजना और निष्पादन के चरणों को दिखाने वाला फ्लोचार्ट बनाएं","Create a new flowchart to get started or organize your work with folders.":"शुरू करने के लिए एक नया फ्लोचार्ट बनाएं या फ़ोल्डर के साथ अपना काम संगठित करें। ","Create flowcharts instantly: Type or paste text, see it visualized.":"तुरंत फ्लोचार्ट बनाएं: पाठ लिखें या पेस्ट करें, उसे दृश्यीकृत करें।","Create unlimited diagrams for just $6/month!":"सिर्फ $6/महीने में असीमित आरेख बनाएं!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"आकार में असीमित फ्लोचार्ट को क्लाउड में संग्रहीत करें - किसी भी जगह से उपलब्ध!","Create with AI":"AI के साथ बनाएं","Created Date":"बनाई गई तारीख","Creating an edge between two nodes is done by indenting the second node below the first":"दो नोड्स के बीच एक एज बनाने के लिए दूसरा नोड पहले वाले के नीचे इंडेंट करना होता है","Curve Style":"वक्र शैली","Custom CSS":"कस्टम CSS","Custom Sharing Options":"कस्टम शेयरिंग विकल्प","Custom sharing & public links":"कस्टम साझा करने और सार्वजनिक लिंक","Customer Portal":"ग्राहक पोर्टल","Daily Sandbox Editor":"दैनिक सैंडबॉक्स संपादक","Dark":"डार्क","Dark Mode":"डार्क मोड","Data Import (Visio, Lucidchart, CSV)":"डेटा आयात (विशियो, ल्यूसिडचार्ट, सीएसवी)","Data import feature for complex diagrams":"जटिल आरेखों के लिए डेटा आयात सुविधा","Date":"तारीख़","Delete":"हटाएँ","Delete {0}":["हटाएँ ",["0"]],"Describe it and it appears":"इसे वर्णन करें और वह दिखाई देगा","Describe your idea. Get a diagram worth presenting.":"अपनी विचारों का वर्णन करें। प्रस्तुत करने योग्य आरेख प्राप्त करें।","Design a software development lifecycle flowchart for an agile team":"एक एजाइल टीम के लिए सॉफ्टवेयर विकास जीवनचक्र फ्लोचार्ट डिज़ाइन करें","Develop a decision tree for a CEO to evaluate potential new market opportunities":"एक सीईओ के लिए नए बाजार के अवसरों का मूल्यांकन करने के लिए एक फैसले का पेड़ विकसित करें","Direction":"दिशा","Dismiss":"खारिज करें","Do you offer discounts for students or nonprofits?":"क्या आप छात्रों या गैर-लाभकारी संगठनों के लिए छूट प्रदान करते हैं?","Do you want to delete this?":"क्या आप इसे डिलीट करना चाहते हैं?","Document":"दस्तावेज़","Don\'t Lose Your Work":"अपना काम न खो दें","Download":"डाउनलोड","Download JPG":"JPG डाउनलोड करें","Download PNG":"PNG डाउनलोड करें","Download SVG":"SVG डाउनलोड करें","Drag and drop a CSV file here, or click to select a file":"CSV फ़ाइल यहां ड्रैग और ड्रॉप करें, या फ़ाइल का चयन करने के लिए क्लिक करें","Draw an edge from multiple nodes by beginning the line with a reference":"एक से अधिक नोड्स से एज ड्रा करने के लिए लाइन को एक संदर्भ के साथ शुरू करें","Drop the file here ...":"फाइल यहाँ ड्रॉप करें ...","Each line becomes a node":"प्रत्येक पंक्ति एक नोड बन जाती है","Edge ID, Classes, Attributes":"किनारे आईडी, वर्ग, गुण","Edge Label":"किनारे लेबल","Edge Label Column":"किनारे लेबल कॉलम","Edge Style":"किनारे शैली","Edge Text Size":"एड्ज टेक्स्ट आकार","Edge missing indentation":"एड्ज अंतराल गुम है","Edges":"किन्तुओं","Edges are declared in the same row as their source node":"उनके स्रोत नोड के ही पंक्ति में किन्तुओं की घोषणा की जाती है","Edges are declared in the same row as their target node":"उनके लक्ष्य नोड के ही पंक्ति में किन्तुओं की घोषणा की जाती है","Edges are declared in their own row":"किन्तुओं को अपनी खुद की पंक्ति में घोषणा की जाती है","Edges can also have ID\'s, classes, and attributes before the label":"लेबल से पहले, किन्तुओं को आईडीज़, क्लासेज़ और गुण देने की अनुमति होती है","Edges can be styled with dashed, dotted, or solid lines":"किन्तुओं को डैश्ड, डॉटेड या सॉलिड लाइन्स के साथ स्टाइल किया जा सकता है","Edges in Separate Rows":"अलग पंक्तियों में किन्हें","Edges in Source Node Row":"स्रोत नोड पंक्ति में किन्हें","Edges in Target Node Row":"लक्ष्य नोड पंक्ति में किन्हें","Edit":"संपादित करें","Edit with AI":"एआई के साथ संपादित करें","Editable":"संपादन योग्य","Editor":"संपादक","Email":"ईमेल","Empty":"खाली","Enable to set a consistent height for all nodes":"सभी नोड्स के लिए एक समान ऊंचाई सेट करने के लिए सक्षम करें","Enter a name for the cloned flowchart.":"क्लोन फ्लोचार्ट के लिए एक नाम दर्ज करें।","Enter a name for the new folder.":"नए फोल्डर के लिए एक नाम दर्ज करें।","Enter a new name for the {0}.":[["0"]," के लिए एक नया नाम दर्ज करें।"],"Enter your email address and we\'ll send you a magic link to sign in.":"अपना ईमेल पता दर्ज करें और हम आपको साइन इन करने के लिए एक जादूगरी लिंक भेजेंगे।","Enter your email address below and we\'ll send you a link to reset your password.":"नीचे अपना ईमेल पता दर्ज करें और हम आपको अपना पासवर्ड रीसेट करने के लिए एक लिंक भेजेंगे।","Equal To":"बराबर","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"हर चित्र ताजगी से PNG, SVG या साझा करने योग्य लिंक के रूप में निर्यात किया जाता है - मीटिंग, दस्तावेज़, या डेक के लिए तैयार है।","Everything you need to know about Flowchart Fun Pro":"Flowchart Fun Pro के बारे में आपको सब कुछ जानने की जरूरत है","Examples":"उदाहरण","Excalidraw":"Excalidraw","Exclusive Office Hours":"अनन्य ऑफिस घंटे","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"अपने फ्लोचार्ट में स्थानीय फाइलों को सीधे लोड करने की क्षमता का अनुभव करें, जो काम से संबंधित दस्तावेजों को ऑफ़लाइन प्रबंधित करने के लिए उत्कृष्ट है। फ्लोचार्ट फन प्रो के साथ इस अनूठे प्रो फीचर को और भी खोलें, सिर्फ $6/महीने में उपलब्ध है।","Explore Pro":"प्रो खोजें","Explore more":"और ज्ञान प्राप्त करें","Export":"एक्सपोर्ट करें","Export clean diagrams without branding":"ब्रांडिंग के बिना साफ आरेख निर्यात करें","Export to PNG & JPG":"PNG और JPG में निर्यात करें","Export to PNG, JPG, and SVG":"PNG, JPG और SVG में निर्यात करें","Feature Breakdown":"विशेषता विभाजन","Feedback":"फ़ीडबैक","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"किसी भी चिंता के लिए हमसे फीडबैक पेज के माध्यम से संपर्क करने के लिए स्वतंत्रता से अन्वेषण करें और प्रवेश करें।","Fine-tune layouts and visual styles":"लेआउट और दृश्य शैलियों को समायोजित करें","Fixed Height":"निश्चित ऊंचाई","Fixed Node Height":"निर्धारित नोड ऊंचाई","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"फ्लोचार्ट फन प्रो आपको सिर्फ $6/महीने में असीमित फ्लोचार्ट, असीमित सहयोगी और असीमित स्टोरेज प्रदान करता है।","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"फ्लोचार्ट फन एक ओपन सोर्स प्रोजेक्ट है जो <0>टोन रो द्वारा बनाया गया है","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"फ्लोचार्ट फन एक डेवलपर द्वारा बनाया और रखा जाता है। आपका समर्थन इसे चलाने में सहायता करता है।","Follow Us on Twitter":"हमारे साथ ट्विटर पर फॉलो करें","Font Family":"फॉन्ट परिवार","Forgot your password?":"अपना पासवर्ड भूल गए?","Free":"मुफ्त","Free users: charts in the sandbox expire after 7 days.":"नि: शुल्क उपयोगकर्ताओं: सैंडबॉक्स में चार्ट 7 दिनों के बाद समाप्त हो जाते हैं।","Frequently Asked Questions":"अक्सर पूछे जाने वाले सवाल","Full-screen, read-only, and template sharing":"पूर्ण स्क्रीन, केवल पढ़ने के लिए और टेम्पलेट साझा करें","Fullscreen":"फ़ुलस्क्रीन","General":"सामान्य","Generate flowcharts from text automatically":"पाठ से स्वचालित रूप से फ्लोचार्ट उत्पन्न करें","Get Pro Access Now":"अब प्रो एक्सेस प्राप्त करें","Get Unlimited AI Requests":"असीमित एआई अनुरोध प्राप्त करें","Get rapid responses to your questions":"अपने सवालों के लिए त्वरित प्रतिक्रियाएं प्राप्त करें","Get unlimited flowcharts and premium features":"असीमित फ्लोचार्ट और प्रीमियम सुविधाओं का लाभ लें","Go back home":"घर वापस जाओ","Go to the Editor":"संपादक पर जाएं","Go to your Sandbox":"अपने सैंडबॉक्स पर जाएं","Graph":"ग्राफ़","Green?":"हरा?","Grid":"ग्रिड","Group ranking and ranked-choice voting, free":"समूह रैंकिंग और रैंक चुनाव, मुफ्त","Have complex questions or issues? We\'re here to help.":"जटिल सवाल या समस्याएं हैं? हम यहां आपकी मदद के लिए हैं।","Here are some Pro features you can now enjoy.":"यहाँ आपको कुछ प्रो फीचर आनंद लेने को मिल रहे हैं।","High-quality exports with embedded fonts":"एम्बेडेड फोंट के साथ उच्च गुणवत्ता वाले निर्यात","History":"हिस्ट्री","Home":"होम","How are edges declared in this data?":"इस डेटा में कैसे किन्हीं कड़ियाँ घोषित होती हैं?","How fast can I actually make something?":"मैं कितनी तेजी से कुछ बना सकता हूँ?","How would you like to save your chart?":"आप अपने चार्ट को कैसे सहेजना चाहेंगे?","I would like to request a new template:":"मैं एक नया टेम्पलेट अनुरोध करना चाहता हूँ:","ID\'s":"आईडीज़","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"अगर उस ईमेल के साथ एक खाता मौजूद है, तो हमने आपको पासवर्ड रीसेट करने के लिए निर्देशों के साथ एक ईमेल भेजा है।","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"यदि आप एक एड्ज बनाने के लिए मतलब है, तो इस लाइन को इंडेंट करें। यदि नहीं, तो कॉलन को बैक स्लैश के साथ भागो <0> \\\\: ","Images":"छवियाँ","Import Data":"डेटा आयात करें","Import data from a CSV file.":"CSV फ़ाइल से डेटा आयात करें।","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"किसी भी CSV फ़ाइल से डेटा आयात करें और इसे एक नए प्रक्रिया चार्ट में मैप करें। यह अन्य स्रोतों जैसे लुसिडचार्ट, गूगल शीट्स और विसिओ से डेटा आयात करने के लिए एक अच्छा तरीका है।","Import from CSV":"CSV से आयात करें","Import from Visio, Lucidchart, CSV":"विसियो, लुसिडचार्ट, सीएसवी से आयात करें","Import from Visio, Lucidchart, and CSV":"Visio, Lucidchart और CSV से आयात करें","Import from anywhere":"कहीं से आयात करें","Import from popular diagram tools":"प्रसिद्ध आरेख उपकरणों से आयात करें","Import your diagram it into Microsoft Visio using one of these CSV files.":"इन CSV फ़ाइलों में से एक का उपयोग करके अपनी आरेख Microsoft Visio में आयात करें।","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"डेटा आयात करना एक पेशेवर सुविधा है। आप केवल $6/माह के लिए Flowchart Fun Pro पर अपग्रेड कर सकते हैं।","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"एक <0>title विशेषता का उपयोग करके एक शीर्षक शामिल करें। Visio रंगीनी का उपयोग करने के लिए, निम्नलिखित में से किसी एक के बराबर एक <1>roleType विशेषता जोड़ें:","Indent to connect nodes":"नोड को जोड़ने के लिए इंडेंट करें","Info":"जानकारी","Is":"हाँ","Is my data private?":"क्या मेरा डेटा निजी है?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON कैनवास आपके द्वारा बनाई गई आपकी आरेख का एक JSON प्रतिनिधि है, जो <0>Obsidian कैनवास और अन्य एप्लिकेशनों द्वारा उपयोग किया जाता है।","Join 2000+ professionals who\'ve upgraded their workflow":"अपने वर्कफ्लो को अपग्रेड कर चुके 2000+ पेशेवरों में शामिल हों","Join thousands of happy users who love Flowchart Fun":"हजारों खुश उपयोगकर्ताओं के साथ शामिल हों जो Flowchart Fun से प्यार करते हैं","Keep Things Private":"चीजों को निजी रखें","Keep changes?":"परिवर्तन रखें?","Keep practicing":"अभ्यास जारी रखें","Keep your data private on your computer":"अपने डेटा को अपने कंप्यूटर पर निजी रखें","Language":"भाषा","Layout":"रूपरेखा","Layout Algorithm":"लेआउट एल्गोरिदम","Layout Frozen":"लेआउट फ्रोज़न","Leading References":"प्रमुख संदर्भ","Learn More":"और अधिक जानें","Learn Syntax":"सिंटैक्स सीखें","Learn about Flowchart Fun Pro":"Flowchart Fun Pro के बारे में जानें","Left to Right":"बाएं से दाएं","Let us know why you\'re canceling. We\'re always looking to improve.":"हमें बताएं कि आप क्यों रद्द कर रहे हैं। हम हमेशा सुधार करने की कोशिश कर रहे हैं।","Light":"लाइट","Light Mode":"लाइट मोड","Link":"लिंक","Link back":"वापस लिंक करें","Load":"लोड","Load Chart":"चार्ट लोड करें","Load File":"फ़ाइल लोड करें","Load Files":"फ़ाइलें लोड करें","Load default content":"डिफ़ॉल्ट सामग्री लोड करें","Load from link?":"लिंक से लोड करें?","Load layout and styles":"लोड लेआउट और शैलियां","Loading...":"लोड हो रहा है...","Local File Support":"स्थानीय फ़ाइल समर्थन","Local saving for offline access":"ऑफ़लाइन उपयोग के लिए स्थानीय सहेजना","Lock Zoom to Graph":"ग्राफ पर जूम लॉक करें","Log In":"लॉग इन करें","Log Out":"लॉग आउट","Log in to Save":"सेव में लॉग इन करें","Log in to upgrade your account":"अपने खाते को अपग्रेड करने के लिए लॉग इन करें","Made by <0>Tone\xA0Row":"<0>टोन रो द्वारा बनाया गया है","Make a One-Time Donation":"एक बार दान करें","Make it yours":"अपना बनाएं","Make publicly accessible":"सार्वजनिक रूप से एक्सेस दें","Manage Billing":"बिलिंग प्रबंधित करें","Map Data":"डेटा मैप","Maximum width of text inside nodes":"नोड्स के अंदर टेक्स्ट की अधिकतम चौड़ाई","Monthly":"मासिक","More from Tone Row":"टोन रो से अधिक","More from Tone Row:":"टोन रो से अधिक:","More tools:":"अधिक उपकरण:","Move":"चलो","Move {0}":["चलो ",["0"]],"Multiple pointers on same line":"एक ही लाइन पर कई प्रतीक","My dog ate my credit card!":"मेरा कुत्ता मेरा क्रेडिट कार्ड खा गया!","Name":"नाम","Name Chart":"चार्ट का नाम","Name your chart":"अपने चार्ट को नाम दें","New":"नया","New Email":"नई ईमेल","New Flowchart":"नया फ्लोचार्ट","New Folder":"नया फोल्डर","Next charge":"अगला चार्ज","No Edges":"कोई किनारे नहीं","No Folder (Root)":"कोई फोल्डर नहीं (मूल)","No Watermarks!":"कोई वॉटरमार्क्स नहीं!","No charts yet":"अभी तक कोई चार्ट नहीं","No items in this folder":"इस फोल्डर में कोई आइटम नहीं","No matching charts found":"कोई मिलते जुलते चार्ट नहीं मिले","Node Border Style":"नोड सीमा शैली","Node Colors":"नोड रंग","Node ID":"नोड आईडी","Node ID, Classes, Attributes":"नोड आईडी, वर्ग, गुण","Node Label":"नोड लेबल","Node Shape":"नोड आकार","Node Shapes":"नोड आकार","Nodes":"नोड्स","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"नोड्स को डैश्ड, डॉट्ड, या डबल के साथ शैलीयित किया जा सकता है। सीमाओं को बॉर्डर_नोन के साथ हटाया जा सकता है।","Not Empty":"खाली नहीं","Now you\'re thinking with flowcharts!":"अब आप फ्लोचार्ट के साथ सोच रहे हैं!","Office Hours":"कार्यालय अवधि","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"कभी-कभी मैजिक लिंक आपके स्पैम फोल्डर में खत्म हो जाता है। अगर आप कुछ मिनट बाद उसे नहीं देख रहे हैं, तो वहां जाकर देखें या एक नया लिंक अनुरोध करें।","One on One Support":"एक प्रति एक समर्थन","One-on-One Support":"एक-पर-एक समर्थन","Open Customer Portal":"ग्राहक पोर्टल खोलें","Operation canceled":"ऑपरेशन रद्द किया गया है","Or maybe blue!":"या शायद नीला!","Organization Chart":"संगठन चार्ट","PNG & JPG export":"PNG और JPG निर्यात","Padding":"पैडिंग","Page not found":"पृष्ठ नहीं मिला","Password":"पासवर्ड","Past Due":"पिछले दौरान","Paste a document to convert it":"एक दस्तावेज़ को पेस्ट करें और उसे रूपांतरित करें","Paste your document or outline here to convert it into an organized flowchart.":"अपने दस्तावेज़ या रूपरेखा को यहां पेस्ट करें ताकि इसे एक व्यवस्थित फ्लोचार्ट में बदला जा सके।","Pasted content detected. Convert to Flowchart Fun syntax?":"पेस्ट की गई सामग्री का पता लगाया गया है। फ्लोचार्ट फन सिंटैक्स में रूपांतरित करें?","Perfect for docs and quick sharing":"दस्तावेज़ और त्वरित साझाकरण के लिए उपयुक्त","Permanent Charts are a Pro Feature":"स्थायी चार्ट एक प्रो सुविधा हैं","Playbook":"प्लेबुक","Pointer and container on same line":"प्रतीक और कंटेनर एक ही लाइन पर","Pricing":"मूल्य निर्धारण","Priority One-on-One Support":"प्राथमिकता वाला एक-से-एक समर्थन","Priority support":"प्राथमिकता समर्थन","Privacy Policy":"गोपनीयता नीति ","Pro starts at $4/mo billed yearly. Cancel anytime.":"प्रो शुरू होता है $4/माह वार्षिक बिल किया जाता है। कभी भी रद्द करें।","Pro tip: Right-click any node to customize its shape and color":"प्रो टिप: किसी भी नोड पर दायां-तीर क्लिक करें और उसकी आकृति और रंग को अनुकूलित करें।","Processing Data":"डेटा प्रसंस्करण","Processing...":"प्रसंस्करण हो रहा है...","Prompt":"प्रश्न","Public":"पब्लिक","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"विशियो, लुसिडचार्ट, सीएसवी से डेटा लाएं या टेम्पलेट से शुरू करें। पहले से मौजूद चीज़ों को दोहराना नहीं।","Quick experimentation space that resets daily":"रोजाना रीसेट होने वाला त्वरित प्रयोग क्षेत्र","Random":"अनियमित","Rapid Deployment Templates":"त्वरित डिप्लॉयमेंट टेम्पलेट्स","Rapid Templates":"त्वरित टेम्पलेट्स","Raster Export (PNG, JPG)":"रास्टर निर्यात (PNG, JPG)","Rate limit exceeded. Please try again later.":"रेट लिमिट पार हो गई है। कृपया बाद में पुनः प्रयास करें।","Read-only":"केवल पढ़ने के लिए","Reference by Class":"क्लास के द्वारा संदर्भ","Reference by ID":"आईडी द्वारा संदर्भ","Reference by Label":"लेबल द्वारा संदर्भ","References":"संदर्भ","References are used to create edges between nodes that are created elsewhere in the document":"संदर्भ दस्तावेज के अन्य भागों में बनाए गए नोड्स के बीच कड़ियाँ बनाने के लिए उपयोग किए जाते हैं","Referencing a node by its exact label":"सटीक लेबल द्वारा नोड का संदर्भ करना","Referencing a node by its unique ID":"अद्वितीय आईडी द्वारा नोड का संदर्भ करना","Referencing multiple nodes with the same assigned class":"एक ही निर्धारित कक्षा के साथ कई नोड का उल्लेख करना","Refresh Page":"पृष्ठ को ताज़ा करें","Reload to Update":"अपडेट करने के लिए रीलोड करें","Rename":"फिर से नाम बदलें","Rename {0}":["नाम बदलें ",["0"]],"Request Magic Link":"अनुरोध जादू लिंक","Request Password Reset":"पासवर्ड रीसेट का अनुरोध करें","Reset":"रीसेट करें","Reset Password":"पासवर्ड रीसेट करें","Resume Subscription":"सदस्यता फिर से शुरू करें","Return":"वापसी","Right to Left":"दाएं से बाएं","Right-click nodes for options":"विकल्पों के लिए नोड को दायां-बांयां क्लिक करें","Roadmap":"रोडमैप","Rotate Label":"लेबल को घुमाएँ","SVG Export is a Pro Feature":"SVG निर्यात एक प्रो सुविधा है","SVG, PDF & all export formats":"SVG, पीडीएफ और सभी निर्यात प्रारूप","Satisfaction guaranteed or first payment refunded":"संतुष्टि की गारंटी या पहली भुगतान की राशि वापस कर दी जाएगी","Save":"सहेजें","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"स्थानीय रूप से सहेजें, ऑफ़लाइन में काम करें, और साफ़ करें कि कौन क्या देख सकता है। जब तक आप नहीं कहते, कोई डेटा आपकी मशीन से बाहर नहीं जाता है।","Save time with AI and dictation, making it easy to create diagrams.":"एआई और बोलने की सुविधा के साथ समय बचाएं, जो आसान डायग्राम बनाने को बनाता है।","Save to Cloud":"क्लौड में सेव करें","Save to File":"फाइल में सेव करें","Save your Work":"अपनी कार्यवाही सुरक्षित करें","Schedule personal consultation sessions":"निजी परामर्श सत्रों की अनुसूची बनाएं","Secure payment":"सुरक्षित भुगतान","See more reviews on Product Hunt":"Product Hunt पर अधिक समीक्षा देखें","See what\'s possible":"क्या संभव है देखें","Select a destination folder for \\"{0}\\".":"के लिए एक लक्षित फोल्डर का चयन करें \\\\","Send us a message":"हमें एक संदेश भेजें","Set a consistent height for all nodes":"सभी नोड्स के लिए एक समान ऊंचाई सेट करें","Settings":"सेटिंग","Share":"साझा करें","Sign In":"साइन इन करें","Sign in with <0>GitHub":"<0>GitHub के साथ साइन इन करें","Sign in with <0>Google":"<0>Google के साथ साइन इन करें","Sorry! This page is only available in English.":"माफ़ करें! यह पेज केवल अंग्रेजी में उपलब्ध है।","Sorry, there was an error converting the text to a flowchart. Try again later.":"क्षमा करें, टेक्स्ट को फ्लोचार्ट में रूपांतरित करने में एक त्रुटि हुई। बाद में पुनः प्रयास करें।","Sort Ascending":"आरोही क्रम में छाँटें","Sort Descending":"अवरोहण करें","Sort by {0}":[["0"]," द्वारा क्रमबद्ध करें"],"Source Arrow Shape":"स्रोत तीर आकार","Source Column":"स्रोत स्तंभ","Source Delimiter":"स्रोत डिलिमिटर","Source Distance From Node":"नोड से स्रोत दूरी","Source/Target Arrow Shape":"स्रोत / लक्ष्य तीर आकार","Spacing":"अंतराल","Special Attributes":"विशेष गुण","Start":"शुरू","Start Over":"शुरू करें","Start faster with use-case specific templates":"उपयोग मामले विशिष्ट टेम्पलेट के साथ तेजी से शुरू करें","Start for free":"मुफ़्त शुरू करें","Status":"स्टेटस","Step 1":"कदम 1","Step 2":"कदम 2","Step 3":"कदम 3","Store any data associated to a node":"किसी नोड से संबंधित किसी भी डेटा स्टोर करें","Style Classes":"शैली क्लासेज","Style with classes":"क्लासेस के साथ स्टाइल","Submit":"भेजना","Subscription":"सदस्यता","Subscription Successful!":"सदस्यता सफल हुआ!","Subscription will end":"सदस्यता समाप्त हो जाएगी","Support":"समर्थन","Target Arrow Shape":"लक्ष्य तीर आकार","Target Column":"लक्ष्य कॉलम","Target Delimiter":"लक्ष्य डेलीमीटर","Target Distance From Node":"नोड से लक्ष्य दूरी","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"एआई को सादा अंग्रेजी में बताएं कि आपको क्या चाहिए। आपका डायग्राम कुछ ही सेकंड में बन जाएगा।","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"हमें बताएं कि क्या काम कर रहा है और क्या नहीं। हर संदेश डेवलपर द्वारा पढ़ा जाता है।","Text Color":"पाठ रंग","Text Horizontal Offset":"टेक्स्ट की क्षैतिज ओफसेट","Text Leading":"पाठ प्रमुख","Text Max Width":"टेक्स्ट की अधिकतम चौड़ाई","Text Vertical Offset":"पाठ लंबाई ऑफसेट","Text followed by colon+space creates an edge with the text as the label":"स्क्लीन के बाद कोलन + स्पेस एक किरदार बनाता है जिसका पाठ लेबल है","Text on a line creates a node with the text as the label":"एक पंक्ति पर पाठ एक नोड बनाता है जिसका पाठ लेबल है","Thank you for your feedback!":"आपके फ़ीडबैक के लिए धन्यवाद!","The beauty and magic reside in the minimalism.":"सुंदरता और जादू संक्षेपता में हैं।","The best way to change styles is to right-click on a node or an edge and select the style you want.":"शैलीयित करने के लिए सर्वश्रेष्ठ तरीका नोड या एड्ज पर राइट-क्लिक करके आपके द्वारा चाहिए शैली का चयन करना है।","The column that contains the edge label(s)":"कॉलम जो एड्ज लेबल (ओं) को शामिल करता है","The column that contains the source node ID(s)":"कॉलम जो स्रोत नोड आईडी (ओं) को शामिल करता है","The column that contains the target node ID(s)":"कॉलम जो लक्ष्य नोड आईडी (ओं) को शामिल करता है","The delimiter used to separate multiple source nodes":"कई स्रोत नोड्स को अलग करने के लिए उपयोग किया गया डिलिमिटर","The delimiter used to separate multiple target nodes":"कई लक्ष्य नोड्स को अलग करने के लिए उपयोग किया गया डिलिमिटर","The fastest way to turn what\'s in your head into something everyone else can understand.":"अपने दिमाग में क्या है उसे कुछ ऐसा बनाएं कि सभी उसे समझ सकें।","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"फ्री प्लान दैनिक उपयोग के लिए बहुत अच्छा काम करता है। अगर आपको प्रो फीचर्स की आवश्यकता है, तो महीने-ब्य-महीने $6 का खर्चा होगा - कोई बाध्यता के साथ कभी भी रद्द कर सकते हैं।","The possible shapes are:":"संभव आकृतियाँ हैं:","Theme":"थीम","Theme Customization Editor":"थीम कस्टमाइज़ेशन संपादक","Theme Editor":"थीम संपादक","Theme editor":"थीम संपादक","There are no edges in this data":"इस डेटा में कोई एड्ज नहीं है","This action cannot be undone.":"इस क्रिया को पूर्ववत नहीं किया जा सकता।","This feature is only available to pro users. <0>Become a pro user to unlock it.":"यह सुविधा केवल प्रो उपयोगकर्ताओं के लिए उपलब्ध है। <0>प्रो उपयोगकर्ता बनें इसे अनलॉक करने के लिए।","This may take between 30 seconds and 2 minutes depending on the length of your input.":"आपके इनपुट की लंबाई के आधार पर, यह 30 सेकंड से 2 मिनट तक लग सकता है।","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"यह सैंडबॉक्स प्रयोग करने के लिए परफेक्ट है, लेकिन ध्यान रखें - यह दैनिक रूप से रीसेट होता है। अभी अपग्रेड करें और अपना वर्तमान काम रखें!","This will replace the current content.":"यह वर्तमान सामग्री को बदल देगा।","This will replace your current chart content with the template content.":"यह आपके मौजूदा चार्ट की सामग्री को टेम्पलेट की सामग्री से बदल देगा।","This will replace your current sandbox.":"यह आपके वर्तमान सैंडबॉक्स को बदल देगा।","Time to decide":"फैसला लेने का समय","Tip":"सुझाव","To fix this change one of the edge IDs":"इसे ठीक करने के लिए एड्ज आईडी के एक को बदलें","To fix this change one of the node IDs":"इसे ठीक करने के लिए नोड आईडी के एक को बदलें","To fix this move one pointer to the next line":"इसे ठीक करने के लिए प्रतीक को अगली पंक्ति पर ले जाएं","To fix this start the container <0/> on a different line":"इसे ठीक करने के लिए कंटेनर <0/> को एक अलग पंक्ति पर शुरू करें","To learn more about why we require you to log in, please read <0>this blog post.":"हमें आपको लॉगिन करने के लिए आवश्यक क्यों है, कृपया <0>यह ब्लॉग पोस्ट पढ़ें।","Top to Bottom":"ऊपर से नीचे","Transform Your Ideas into Professional Diagrams in Seconds":"अपने विचारों को सेकंड में प्रोफेशनल डायरेक्टरी में रूपांतरित करें","Transform text into diagrams instantly":"पाठ को तुरंत आरेख में बदलें","Try AI":"एआई को आजमाएं","Try adjusting your search or filters to find what you\'re looking for.":"अपनी खोज या फ़िल्टरों को समायोजित करने का प्रयास करें ताकि आप जो ढूंढ रहे हैं उसे ढूंढ सकें।","Try again":"फिर से कोशिश करें","Try it free":"इसे मुफ्त में आज़माएं","Turn documents into diagrams with AI":"एआई के साथ दस्तावेज़ों को आरेखण में बदलें","Two edges have the same ID":"दो किनारे उसी आईडी के हैं","Two nodes have the same ID":"दो नोड उसी आईडी के हैं","Type it. See it.":"इसे टाइप करें। देखें।","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"उह ओह, आपके पास मुफ्त अनुरोधों की सीमा पूरी हो गई है! असीमित डायग्राम परिवर्तन के लिए Flowchart Fun Pro पर अपग्रेड करें, और पाठ को स्पष्ट, दृश्यमान फ्लोचार्ट में आसानी से कॉपी और पेस्ट करते रहें।","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"60 सेकंड से कम समय में। कुछ पंक्तियां टाइप करें या AI को बताएं, और आपका आरेख तुरंत दिखाई देगा। एक क्लिक से निर्यात या साझा करें।","Undo":"वापस ले जाएं","Unescaped special character":"अस्केप्ड विशेष वर्ण","Unique text value to identify a node":"एक नोड को पहचानने के लिए अद्वितीय पाठ मूल्य","Unknown":"अज्ञात","Unknown Parsing Error":"अज्ञात पार्सिंग त्रुटि","Unlimited Flowcharts":"असीमित फ्लोचार्ट्स","Unlimited Permanent Flowcharts":"असीमित स्थायी प्रवाहगतीं ","Unlimited cloud-saved flowcharts":"असीमित क्लाउड-सहेजे फ्लोचार्ट्स","Unlimited saved diagrams":"असीमित सहेजे गए आरेख","Unlock AI Features and never lose your work with a Pro account.":"प्रो खाते से AI फीचर्स खोलें और कभी भी अपना काम न खोएं।","Unlock Unlimited AI Flowcharts":"असीमित AI फ्लोचार्ट्स को अनलॉक करें","Unpaid":"अवैतनिक","Update Email":"ईमेल अपडेट करें","Updated Date":"अपडेट की गई तारीख","Upgrade Now - Save My Work":"अपग्रेड करें अब - मेरा काम सहेजें","Upgrade to Flowchart Fun Pro and unlock:":"फ्लोचार्ट फन प्रो पर अपग्रेड करें और अनलॉक करें:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"असीमित होस्ट किए गए आरेखण, जल-छाप मुक्त उच्च रिज़ॉल्यूशन निर्यात, एआई संपादन, और अधिक के लिए फ्लोचार्ट फन प्रो पर अपग्रेड करें। $4/माह वार्षिक बिल किया जाता है।","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"अपने डायग्राम के लिए एसवीजी निर्यात और अधिक उन्नत सुविधाओं का आनंद लेने के लिए फ्लोचार्ट फन प्रो पर अपग्रेड करें।","Upgrade to Pro":"प्रो को अपग्रेड करें","Upgrade to Pro for permanent charts.":"प्रो अपग्रेड करें और स्थायी चार्ट प्राप्त करें।","Upload your File":"अपनी फाइल अपलोड करें","Use Custom CSS Only":"केवल कस्टम CSS का उपयोग करें","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"क्या आप Lucidchart या Visio का उपयोग करते हैं? CSV आयात किसी भी स्रोत से डेटा प्राप्त करने को आसान बनाता है!","Use classes to group nodes":"नोड्स को समूहों में सम्मिलित करने के लिए वर्ग उपयोग करें","Use the attribute <0>href to set a link on a node that opens in a new tab.":"नोड पर एक लिंक सेट करने के लिए गुण <0>href उपयोग करें जो एक नये टैब में खुलेगा।","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"नोड की छवि सेट करने के लिए <0>src गुण का उपयोग करें। छवि नोड के आकार में स्केल की जाएगी, इसलिए आपको आवश्यक प्रतिस्थापित करने के लिए नोड की चौड़ाई और ऊँचाई को समायोजित करना होगा। केवल सार्वजनिक छवियाँ (CORS द्वारा ब्लॉक नहीं की गई) समर्थित हैं।","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"नोड की विशिष्ट चौड़ाई और ऊँचाई सेट करने के लिए <0>w और <1>h गुण का उपयोग करें।","Use the customer portal to change your billing information.":"अपनी बिलिंग जानकारी बदलने के लिए ग्राहक पोर्टल का उपयोग करें।","Use these settings to adapt the look and behavior of your flowcharts":"अपने फ्लोचार्ट की दिखता और व्यवहार को अनुकूलित करने के लिए इन सेटिंग्स का उपयोग करें","Use this file for org charts, hierarchies, and other organizational structures.":"संगठनात्मक चार्ट, पदानुक्रमों और अन्य संगठनात्मक संरचनाओं के लिए इस फ़ाइल का उपयोग करें।","Use this file for sequences, processes, and workflows.":"अनुक्रमों, प्रक्रियाओं और कार्यप्रवाहों के लिए इस फ़ाइल का उपयोग करें।","Use this mode to modify and enhance your current chart.":"अपने मौजूदा चार्ट को संशोधित और सुधारित करने के लिए इस मोड का उपयोग करें।","Used at":"इस्तेमाल किया गया","User":"यूज़र","Vector Export (SVG)":"वेक्टर निर्यात (SVG)","View on Github":"Github पर देखें","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"क्या आप एक दस्तावेज़ से फ्लोचार्ट बनाना चाहते हैं? संपादक में इसे पेस्ट करें और \'फ्लोचार्ट में परिवर्तित करें\' पर क्लिक करें।","Watermark-Free Diagrams":"वॉटरमार्क-मुक्त आरेख","Watermarks":"वॉटरमार्क","Welcome to Flowchart Fun":"फ्लोचार्ट फन में आपका स्वागत है","What if I just need it for one project?":"क्या मुझे केवल एक प्रोजेक्ट के लिए ही इसकी आवश्यकता है?","What our users are saying":"हमारे उपयोगकर्ताओं के क्या कहने हैं","What\'s next?":"अगला क्या है?","What\'s this?":"यह क्या है?","Width":"चौड़ाई","Width and Height":"चौड़ाई और ऊँचाई","Will my diagrams actually look professional?":"क्या मेरे डायग्राम वास्तव में पेशेवर दिखेंगे?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"फ्लोचार्ट फन के प्रो संस्करण के साथ, आप प्राकृतिक भाषा के आदेशों का उपयोग करके अपने फ्लोचार्ट विवरणों को त्वरित रूप से समाप्त कर सकते हैं, यात्रा पर आरेख बनाने के लिए आदर्श। $6/महीने के लिए, अपने फ्लोचार्टिंग अनुभव को बढ़ाने के लिए पहुंचने योग्य AI संपादन की सुविधा प्राप्त करें।","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"प्रो संस्करण के साथ आप स्थानीय फ़ाइलों को सहेज और लोड कर सकते हैं। यह ऑफ़लाइन काम से जुड़े दस्तावेज़ों को प्रबंधित करने के लिए उपयुक्त है।","Would you like to continue?":"क्या आप जारी रखना चाहते हैं?","Would you like to suggest a new example?":"क्या आप एक नया उदाहरण सुझाना चाहेंगे?","Wrap text in parentheses to connect to any node":"किसी भी नोड से जुड़ने के लिए ब्रैकेट में लिखें","Write like an outline":"आउटलाइन की तरह लिखें","Write your prompt here or click to enable the microphone, then press and hold to record.":"अपना प्रॉम्प्ट यहां लिखें या माइक्रोफोन को सक्षम करने के लिए क्लिक करें, फिर रिकॉर्ड करने के लिए दबाएं और रखें।","Yearly":"वार्षिक","Yes — send us a message and we\'ll set you up with a discounted rate.":"हाँ - हमें एक संदेश भेजें और हम आपको छूट दर से सेट कर देंगे।","Yes, Replace Content":"हाँ, सामग्री को बदलें","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"हाँ। हर डायग्राम बैलेंस्ड, स्वचालित लेआउट का उपयोग करता है जो साफ टाइपोग्राफी के साथ होता है। आप थीम, रंग और स्टाइल को अनुकूलित कर सकते हैं - और क्रिस्प SVG या हाई-रेज़ोल्यूशन PNG के रूप में निर्यात कर सकते हैं जो किसी भी प्रस्तुति या दस्तावेज़ में बेहतर दिखता है।","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"हाँ। प्रो विशियो, लुसिडचार्ट और सीएसवी से आयात का समर्थन करता है - इसलिए आप उसे बिना एकदम से फिर से बनाए बिना अपने पास लाए सकते हैं।","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"हाँ। आप स्थानीय रूप से फ़ाइलें सहेज सकते हैं, पूरी तरह से ऑफ़लाइन काम कर सकते हैं, और अपनी डायग्राम को किसी भी व्यक्ति को दिखाने के लिए नियंत्रित कर सकते हैं। डेटा आपकी मशीन से नहीं जाता है जब तक आप शेयर करने के लिए नहीं चुनते हैं।","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["आप अपने ग्राफ में ",["numNodes"]," नोड्स और ",["numEdges"]," एड्ज़ जोड़ने वाले हैं।"],"You need to log in to access this page.":"इस पृष्ठ तक पहुँचने के लिए आपको लॉग इन करना होगा।","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"आप पहले से ही एक प्रो उपयोगकर्ता हैं। <0>सदस्यता प्रबंधित करें<1/>क्या आपके पास कोई सवाल या सुविधा अनुरोध है? <2>हमें बताएं","You\'re doing great!":"आप बहुत अच्छा कर रहे हैं!","You\'re on the free plan.":"आप मुफ़्त योजना पर हैं।","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"आपने अपने सभी नि: शुल्क एआई रूपांतरण का उपयोग किया है। असीमित एआई उपयोग, कस्टम थीम, निजी साझाकरण और अधिक के लिए प्रो पर अपग्रेड करें। अब आसानी से शानदार फ्लोचार्ट बनाते रहें!","Your Charts":"आपके चार्ट","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"आपका सैंडबॉक्स हमारी फ्लोचार्ट टूल के साथ निःशुल्क प्रयोग करने के लिए एक स्थान है, जो हर दिन एक नए शुरुआत के लिए रीसेट होता है।","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"आपके चार्ट रीड-ओनली हैं क्योंकि आपका खाता अब सक्रिय नहीं है। अपने <0>खाता पेज पर जाकर अधिक जानकारी प्राप्त करें।","Your next diagram should be your best one.":"आपकी अगली डायग्राम आपकी सबसे अच्छी होनी चाहिए।","Your subscription is <0>{statusDisplay}.":["आपका सदस्यता <0>",["statusDisplay"]," है।"],"Your work stays yours":"आपका काम आपका ही रहता है।","Zoom In":"ज़ूम इन करें","Zoom Out":"आउट ज़ूम करें","month":"महीना","or":"या","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/hi/messages.po b/app/src/locales/hi/messages.po index df7ae36bb..de73cd954 100644 --- a/app/src/locales/hi/messages.po +++ b/app/src/locales/hi/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "$48/वर्ष (33% बचाएं) · कभी भी रद्द करें" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "$6/महीना" @@ -25,7 +25,7 @@ msgstr "$6/महीना" msgid "1 Temporary Flowchart" msgstr "1 अस्थायी फ्लोचार्ट" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "एक डायग्राम एक समय में" @@ -33,7 +33,7 @@ msgstr "एक डायग्राम एक समय में" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>कस्टम CSS केवल सक्षम है। केवल लेआउट और एडवांस्ड सेटिंग्स लागू की जाएगी।" -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun <1>Tone Row द्वारा बनाई गई एक खुला स्रोत परियोजना है " @@ -49,7 +49,7 @@ msgstr "एप्प का एक नया वर्जन उपलब्ध msgid "AI Creation & Editing" msgstr "एआई निर्माण और संपादन" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "एआई उत्पादन और संपादन" @@ -57,7 +57,7 @@ msgstr "एआई उत्पादन और संपादन" msgid "AI-Powered Flowchart Creation" msgstr "एआई-पावर्ड फ्लोचार्ट निर्माण" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "एआई द्वारा सादा पाठ से 5 सेकंड के अंदर उत्पन्न किया गया।" @@ -65,12 +65,12 @@ msgstr "एआई द्वारा सादा पाठ से 5 सेक msgid "AI-powered editing to supercharge your workflow" msgstr "एआई पावर्ड संपादन आपके वर्कफ्लो को तेज करने के लिए" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "के बारे में" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "खाता" @@ -106,7 +106,7 @@ msgstr "ऊपर-नीचे सारी तरफ" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "सिर्फ $6/महीने में यह सब - आपके दैनिक कॉफ़ी से कम ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "हमेशा प्रस्तुति के लिए तैयार" @@ -118,7 +118,7 @@ msgstr "रकम" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "एक एरर हो गया. फिर से सबमिट करने की कोशिश करें या सीधे {0} ईमेल करें." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "दिखावट" @@ -170,11 +170,11 @@ msgstr "पृष्ठभूमि रंग" msgid "Basic Flowchart" msgstr "बेसिक फ्लोचार्ट" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "गिटहब स्पॉन्सर बनें" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "प्रो उपयोगकर्ता बनें" @@ -191,8 +191,8 @@ msgstr "वार्षिक रूप से $48 का बिल बनाय msgid "Billed monthly at $6" msgstr "मासिक रूप से $6 पर बिल किया जाता है" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "ब्लॉग" @@ -260,14 +260,14 @@ msgstr "कुछ गुण तत्वों की दिखता या क msgid "Change Email Address" msgstr "ईमेल पता बदलें" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "बदलाव का" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "चार्ट" @@ -346,7 +346,7 @@ msgstr "स्तंभ" msgid "Comment" msgstr "टिप्पणी" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "समुदाय टेम्पलेट" @@ -403,7 +403,7 @@ msgstr "फ्लोचार्ट में बदलें" msgid "Convert to hosted chart?" msgstr "होस्टेड चार्ट में कनवर्ट करें?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "कुकी नीति" @@ -500,7 +500,7 @@ msgstr "कस्टम CSS" msgid "Custom Sharing Options" msgstr "कस्टम शेयरिंग विकल्प" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "कस्टम साझा करने और सार्वजनिक लिंक" @@ -516,8 +516,8 @@ msgstr "दैनिक सैंडबॉक्स संपादक" msgid "Dark" msgstr "डार्क" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "डार्क मोड" @@ -542,11 +542,11 @@ msgstr "हटाएँ" msgid "Delete {0}" msgstr "हटाएँ {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "इसे वर्णन करें और वह दिखाई देगा" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "अपनी विचारों का वर्णन करें। प्रस्तुत करने योग्य आरेख प्राप्त करें।" @@ -696,8 +696,8 @@ msgstr "एआई के साथ संपादित करें" msgid "Editable" msgstr "संपादन योग्य" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "संपादक" @@ -742,7 +742,7 @@ msgstr "नीचे अपना ईमेल पता दर्ज करे msgid "Equal To" msgstr "बराबर" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "हर चित्र ताजगी से PNG, SVG या साझा करने योग्य लिंक के रूप में निर्यात किया जाता है - मीटिंग, दस्तावेज़, या डेक के लिए तैयार है।" @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "विशेषता विभाजन" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "फ़ीडबैक" @@ -823,11 +823,15 @@ msgstr "निर्धारित नोड ऊंचाई" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "फ्लोचार्ट फन प्रो आपको सिर्फ $6/महीने में असीमित फ्लोचार्ट, असीमित सहयोगी और असीमित स्टोरेज प्रदान करता है।" -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "फ्लोचार्ट फन एक ओपन सोर्स प्रोजेक्ट है जो <0>टोन रो द्वारा बनाया गया है" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "फ्लोचार्ट फन एक डेवलपर द्वारा बनाया और रखा जाता है। आपका समर्थन इसे चलाने में सहायता करता है।" -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "हमारे साथ ट्विटर पर फॉलो करें" @@ -909,6 +913,10 @@ msgstr "हरा?" msgid "Grid" msgstr "ग्रिड" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "समूह रैंकिंग और रैंक चुनाव, मुफ्त" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "जटिल सवाल या समस्याएं हैं? हम यहां आपकी मदद के लिए हैं।" @@ -980,7 +988,7 @@ msgstr "किसी भी CSV फ़ाइल से डेटा आयात msgid "Import from CSV" msgstr "CSV से आयात करें" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "विसियो, लुसिडचार्ट, सीएसवी से आयात करें" @@ -988,7 +996,7 @@ msgstr "विसियो, लुसिडचार्ट, सीएसवी msgid "Import from Visio, Lucidchart, and CSV" msgstr "Visio, Lucidchart और CSV से आयात करें" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "कहीं से आयात करें" @@ -1012,7 +1020,7 @@ msgstr "एक <0>title विशेषता का उपयोग कर msgid "Indent to connect nodes" msgstr "नोड को जोड़ने के लिए इंडेंट करें" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "जानकारी" @@ -1052,7 +1060,7 @@ msgstr "अभ्यास जारी रखें" msgid "Keep your data private on your computer" msgstr "अपने डेटा को अपने कंप्यूटर पर निजी रखें" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "भाषा" @@ -1101,8 +1109,8 @@ msgstr "हमें बताएं कि आप क्यों रद्द msgid "Light" msgstr "लाइट" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "लाइट मोड" @@ -1160,8 +1168,8 @@ msgstr "ऑफ़लाइन उपयोग के लिए स्थान msgid "Lock Zoom to Graph" msgstr "ग्राफ पर जूम लॉक करें" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "लॉग इन करें" @@ -1177,11 +1185,15 @@ msgstr "सेव में लॉग इन करें" msgid "Log in to upgrade your account" msgstr "अपने खाते को अपग्रेड करने के लिए लॉग इन करें" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "<0>टोन रो द्वारा बनाया गया है" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "एक बार दान करें" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "अपना बनाएं" @@ -1205,6 +1217,18 @@ msgstr "नोड्स के अंदर टेक्स्ट की अध msgid "Monthly" msgstr "मासिक" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "टोन रो से अधिक" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "टोन रो से अधिक:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "अधिक उपकरण:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "चार्ट का नाम" msgid "Name your chart" msgstr "अपने चार्ट को नाम दें" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "नया" @@ -1363,7 +1387,7 @@ msgstr "या शायद नीला!" msgid "Organization Chart" msgstr "संगठन चार्ट" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "PNG और JPG निर्यात" @@ -1412,21 +1436,25 @@ msgstr "प्लेबुक" msgid "Pointer and container on same line" msgstr "प्रतीक और कंटेनर एक ही लाइन पर" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "मूल्य निर्धारण" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "प्राथमिकता वाला एक-से-एक समर्थन" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "प्राथमिकता समर्थन" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "गोपनीयता नीति " -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "प्रो शुरू होता है $4/माह वार्षिक बिल किया जाता है। कभी भी रद्द करें।" @@ -1451,7 +1479,7 @@ msgstr "प्रश्न" msgid "Public" msgstr "पब्लिक" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "विशियो, लुसिडचार्ट, सीएसवी से डेटा लाएं या टेम्पलेट से शुरू करें। पहले से मौजूद चीज़ों को दोहराना नहीं।" @@ -1575,8 +1603,8 @@ msgstr "दाएं से बाएं" msgid "Right-click nodes for options" msgstr "विकल्पों के लिए नोड को दायां-बांयां क्लिक करें" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "रोडमैप" @@ -1590,7 +1618,7 @@ msgstr "लेबल को घुमाएँ" msgid "SVG Export is a Pro Feature" msgstr "SVG निर्यात एक प्रो सुविधा है" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, पीडीएफ और सभी निर्यात प्रारूप" @@ -1603,7 +1631,7 @@ msgstr "संतुष्टि की गारंटी या पहली msgid "Save" msgstr "सहेजें" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "स्थानीय रूप से सहेजें, ऑफ़लाइन में काम करें, और साफ़ करें कि कौन क्या देख सकता है। जब तक आप नहीं कहते, कोई डेटा आपकी मशीन से बाहर नहीं जाता है।" @@ -1635,7 +1663,7 @@ msgstr "सुरक्षित भुगतान" msgid "See more reviews on Product Hunt" msgstr "Product Hunt पर अधिक समीक्षा देखें" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "क्या संभव है देखें" @@ -1651,9 +1679,9 @@ msgstr "हमें एक संदेश भेजें" msgid "Set a consistent height for all nodes" msgstr "सभी नोड्स के लिए एक समान ऊंचाई सेट करें" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "सेटिंग" @@ -1738,7 +1766,7 @@ msgstr "शुरू करें" msgid "Start faster with use-case specific templates" msgstr "उपयोग मामले विशिष्ट टेम्पलेट के साथ तेजी से शुरू करें" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "मुफ़्त शुरू करें" @@ -1789,7 +1817,7 @@ msgstr "सदस्यता सफल हुआ!" msgid "Subscription will end" msgstr "सदस्यता समाप्त हो जाएगी" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "समर्थन" @@ -1812,7 +1840,7 @@ msgstr "लक्ष्य डेलीमीटर" msgid "Target Distance From Node" msgstr "नोड से लक्ष्य दूरी" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "एआई को सादा अंग्रेजी में बताएं कि आपको क्या चाहिए। आपका डायग्राम कुछ ही सेकंड में बन जाएगा।" @@ -1856,7 +1884,7 @@ msgstr "एक पंक्ति पर पाठ एक नोड बनात msgid "Thank you for your feedback!" msgstr "आपके फ़ीडबैक के लिए धन्यवाद!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "सुंदरता और जादू संक्षेपता में हैं।" @@ -1884,7 +1912,7 @@ msgstr "कई स्रोत नोड्स को अलग करने क msgid "The delimiter used to separate multiple target nodes" msgstr "कई लक्ष्य नोड्स को अलग करने के लिए उपयोग किया गया डिलिमिटर" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "अपने दिमाग में क्या है उसे कुछ ऐसा बनाएं कि सभी उसे समझ सकें।" @@ -1911,7 +1939,7 @@ msgstr "थीम कस्टमाइज़ेशन संपादक" msgid "Theme Editor" msgstr "थीम संपादक" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "थीम संपादक" @@ -2000,10 +2028,14 @@ msgstr "अपनी खोज या फ़िल्टरों को सम msgid "Try again" msgstr "फिर से कोशिश करें" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "इसे मुफ्त में आज़माएं" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "एआई के साथ दस्तावेज़ों को आरेखण में बदलें" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "दो किनारे उसी आईडी के हैं" @@ -2012,7 +2044,7 @@ msgstr "दो किनारे उसी आईडी के हैं" msgid "Two nodes have the same ID" msgstr "दो नोड उसी आईडी के हैं" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "इसे टाइप करें। देखें।" @@ -2057,7 +2089,7 @@ msgstr "असीमित स्थायी प्रवाहगतीं " msgid "Unlimited cloud-saved flowcharts" msgstr "असीमित क्लाउड-सहेजे फ्लोचार्ट्स" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "असीमित सहेजे गए आरेख" @@ -2089,13 +2121,17 @@ msgstr "अपग्रेड करें अब - मेरा काम स msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "फ्लोचार्ट फन प्रो पर अपग्रेड करें और अनलॉक करें:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "असीमित होस्ट किए गए आरेखण, जल-छाप मुक्त उच्च रिज़ॉल्यूशन निर्यात, एआई संपादन, और अधिक के लिए फ्लोचार्ट फन प्रो पर अपग्रेड करें। $4/माह वार्षिक बिल किया जाता है।" + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "अपने डायग्राम के लिए एसवीजी निर्यात और अधिक उन्नत सुविधाओं का आनंद लेने के लिए फ्लोचार्ट फन प्रो पर अपग्रेड करें।" #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "प्रो को अपग्रेड करें" @@ -2152,7 +2188,7 @@ msgstr "अनुक्रमों, प्रक्रियाओं और msgid "Use this mode to modify and enhance your current chart." msgstr "अपने मौजूदा चार्ट को संशोधित और सुधारित करने के लिए इस मोड का उपयोग करें।" -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "इस्तेमाल किया गया" @@ -2164,7 +2200,7 @@ msgstr "यूज़र" msgid "Vector Export (SVG)" msgstr "वेक्टर निर्यात (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Github पर देखें" @@ -2302,7 +2338,7 @@ msgstr "आपका सैंडबॉक्स हमारी फ्लोच msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "आपके चार्ट रीड-ओनली हैं क्योंकि आपका खाता अब सक्रिय नहीं है। अपने <0>खाता पेज पर जाकर अधिक जानकारी प्राप्त करें।" -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "आपकी अगली डायग्राम आपकी सबसे अच्छी होनी चाहिए।" @@ -2310,7 +2346,7 @@ msgstr "आपकी अगली डायग्राम आपकी सब msgid "Your subscription is <0>{statusDisplay}." msgstr "आपका सदस्यता <0>{statusDisplay} है।" -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "आपका काम आपका ही रहता है।" @@ -2333,10 +2369,10 @@ msgid "or" msgstr "या" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/ko/messages.js b/app/src/locales/ko/messages.js index 3b18ea769..d5e1b2200 100644 --- a/app/src/locales/ko/messages.js +++ b/app/src/locales/ko/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"연간 $48 (33% 할인) · 언제든지 취소 가능","$6/mo":"월 $6","1 Temporary Flowchart":"1 임시 플로차트","1 diagram at a time":"한 번에 1개의 다이어그램","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>사용자 정의 CSS만이 활성화되었습니다. 레이아웃과 고급 설정만 적용됩니다.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun은 <1>Tone Row가 만든 오픈 소스 프로젝트입니다.","<0>Sign In / <1>Sign Up with email and password":"<0>로그인 / <1>회원가입 이메일과 비밀번호로","A new version of the app is available. Please reload to update.":"새로운 버전의 앱이 사용 가능합니다. 업데이트하려면 다시로드하십시오.","AI Creation & Editing":"AI 생성 및 편집","AI generation & editing":"AI 생성 및 편집","AI-Powered Flowchart Creation":"인공지능 기반 플로우차트 생성","AI-generated from plain text in under 5 seconds.":"일반 텍스트에서 5초 이내에 AI로 생성됨.","AI-powered editing to supercharge your workflow":"워크플로우를 강화하기 위한 AI 기반 편집 기능","About":"소개","Account":"계정","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"특수 문자 앞에는 역슬래시 (<0>\\\\)를 추가하세요: <1>(, <2>:, <3>#, 또는 <4>.","Add some steps":"몇 가지 단계를 추가하세요.","Advanced":"고급","Align Horizontally":"수평 정렬","Align Nodes":"노드 정렬하기","Align Vertically":"수직 정렬","All this for just $6/month - less than your daily coffee ☕":"하루 커피 값보다 저렴한 월 $6로 이 모든 것을 이용하세요 ☕","Always presentation-ready":"항상 프레젠테이션용으로 준비됨","Amount":"금액","An error occurred. Try resubmitting or email {0} directly.":["오류가 발생하였습니다. 다시 제출하거나 ",["0"],"으로 직접 이메일을 보내주십시오."],"Appearance":"외관","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"플로우차트를 삭제하시겠습니까?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"폴더를 삭제하시겠습니까?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"폴더를 복제하시겠습니까?","Are you sure?":"확실합니까?","Arrow Size":"화살표 크기","Attributes":"속성","August 2023":"2023년 8월","Back":"뒤로","Back To Editor":"편집기로 돌아가기","Background Color":"배경색","Basic Flowchart":"기본 플로우 차트","Become a Github Sponsor":"깃허브 스폰서가 되기","Become a Pro User":"프로 사용자가 되기","Begin your journey":"여정을 시작하세요.","Billed annually at $48":"매년 $48로 청구됩니다","Billed monthly at $6":"매달 $6에 청구됩니다.","Blog":"블로그","Book a Meeting":"미팅 예약","Border Color":"테두리 색","Border Width":"테두리 너비","Bottom to Top":"아래에서 위로","Breadthfirst":"폭 우선","Build your personal flowchart library":"개인용 플로우차트 라이브러리 만들기","Can I import my existing diagrams?":"기존 다이어그램을 가져올 수 있나요?","Cancel":"취소","Cancel anytime":"언제든 취소 가능","Cancel your subscription. Your hosted charts will become read-only.":"구독을 취소하십시오. 귀하의 호스트 차트가 읽기 전용이 됩니다.","Certain attributes can be used to customize the appearance or functionality of elements.":"일부 속성은 요소의 모양 또는 기능을 사용자 정의하기 위해 사용할 수 있습니다.","Change Email Address":"이메일 주소 변경","Changelog":"변경 로그","Charts":"차트","Check out the guide:":"가이드를 확인하세요:","Check your email for a link to log in.<0/>You can close this window.":"로그인할 링크가 들어있는 이메일을 확인하세요. 이 창은 닫을 수 있습니다.","Choose":"선택하세요","Choose Template":"템플릿 선택","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"에지의 소스와 목적지를 위한 다양한 화살표 모양을 선택합니다. 모양에는 삼각형, 삼각형-티, 원-삼각형, 삼각형-가위형, 삼각형-뒤곡선, 베이, 티, 사각형, 원, 다이아몬드, 쉐브론, 없음이 포함됩니다.","Choose how edges connect between nodes":"노드 간 연결 방식 선택","Choose how nodes are automatically arranged in your flowchart":"플로우차트에서 노드가 자동으로 정렬되는 방식을 선택하세요.","Circle":"원","Classes":"클래스","Clear":"지우다","Clear text?":"텍스트를 지우시겠습니까?","Clone":"클론","Clone Flowchart":"플로우차트 복제","Close":"닫기","Color":"색상","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"색상에는 빨강, 주황, 노랑, 파랑, 보라, 검정, 흰색, 회색이 포함됩니다.","Column":"열","Comment":"댓글 달기","Community templates":"커뮤니티 템플릿","Compare our plans and find the perfect fit for your flowcharting needs":"우리의 요금제를 비교하고 당신의 플로우차트 작성 요구에 맞는 완벽한 선택을 찾으세요","Concentric":"동심","Confirm New Email":"새 이메일 확인","Confirm your email address to sign in.":"로그인하려면 이메일 주소를 확인하세요.","Connect your Data":"데이터 연결","Containers":"컨테이너","Containers are nodes that contain other nodes. They are declared using curly braces.":"컨테이너는 다른 노드를 포함하는 노드입니다. 중괄호를 사용하여 선언됩니다.","Continue":"계속하기","Continue in Sandbox (Resets daily, work not saved)":"샌드박스에서 계속하기 (매일 초기화되며 작업은 저장되지 않음)","Controls the flow direction of hierarchical layouts":"계층적 레이아웃의 흐름 방향을 제어합니다.","Convert":"변환하기","Convert to Flowchart":"흐름도로 변환","Convert to hosted chart?":"호스팅 차트로 변환하시겠습니까?","Cookie Policy":"쿠키 정책","Copied SVG code to clipboard":"클립보드에 SVG 코드 복사","Copied {format} to clipboard":["클립보드에 ",["format"]," 복사"],"Copy":"복사","Copy PNG Image":"PNG 이미지 복사","Copy SVG Code":"SVG 코드 복사","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Excalidraw 코드를 복사해서 <0>excalidraw.com에 붙여넣어서 편집하세요. 이 기능은 실험적이며 모든 다이어그램과 작동하지 않을 수 있습니다. 버그를 발견하면 <1>알려주세요.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"mermaid.js 코드를 복사하거나 mermaid.js 라이브 편집기에서 직접 열어주세요.","Create":"만들기","Create Flowcharts using AI":"AI를 사용하여 플로차트를 만들어보세요","Create Unlimited Flowcharts":"무제한 플로차트 만들기","Create a New Chart":"새 차트 만들기","Create a flowchart showing the steps of planning and executing a school fundraising event":"학교 모금 행사를 계획하고 실행하는 단계를 보여주는 플로우차트를 작성하십시오.","Create a new flowchart to get started or organize your work with folders.":"새로운 플로우차트를 만들어 시작하거나 폴더로 작업을 정리하세요.","Create flowcharts instantly: Type or paste text, see it visualized.":"즉시 플로우차트 생성: 텍스트를 입력하거나 붙여넣고 시각화해보세요.","Create unlimited diagrams for just $6/month!":"매달 $6로 무제한 다이어그램을 생성하세요!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"클라우드에 저장된 무한 플로우 차트 생성 - 어디서나 액세스 가능!","Create with AI":"AI로 만들기","Created Date":"생성일자","Creating an edge between two nodes is done by indenting the second node below the first":"두 노드 사이에 엣지를 만드는 것은 첫 번째 노드 아래에 두 번째 노드를 들여 쓰는 것으로 합니다.","Curve Style":"곡선 스타일","Custom CSS":"사용자 정의 CSS","Custom Sharing Options":"커스텀 공유 옵션","Custom sharing & public links":"사용자 정의 공유 및 공개 링크","Customer Portal":"고객 포털","Daily Sandbox Editor":"매일 샌드박스 편집기","Dark":"다크","Dark Mode":"다크 모드","Data Import (Visio, Lucidchart, CSV)":"데이터 가져오기 (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"복잡한 다이어그램을 위한 데이터 가져오기 기능","Date":"날짜","Delete":"삭제","Delete {0}":[["0"]," 삭제"],"Describe it and it appears":"설명하면 나타납니다","Describe your idea. Get a diagram worth presenting.":"아이디어를 설명하세요. 발표할 가치가 있는 다이어그램을 얻으세요.","Design a software development lifecycle flowchart for an agile team":"애자일 팀을 위한 소프트웨어 개발 라이프사이클 플로우차트를 디자인하십시오.","Develop a decision tree for a CEO to evaluate potential new market opportunities":"CEO가 잠재적인 새 시장 기회를 평가하기 위해 사용할 수 있는 의사결정 트리를 개발하십시오.","Direction":"방향","Dismiss":"해지","Do you offer discounts for students or nonprofits?":"학생이나 비영리 단체에 할인을 제공하나요?","Do you want to delete this?":"본 항목을 삭제하시겠습니까?","Document":"문서","Don\'t Lose Your Work":"당신의 작업을 잃지 마세요","Download":"다운로드","Download JPG":"JPG 다운로드","Download PNG":"PNG 다운로드","Download SVG":"SVG 다운로드","Drag and drop a CSV file here, or click to select a file":"CSV 파일을 여기에 드래그 앤 드롭하거나 파일을 선택하려면 클릭하세요.","Draw an edge from multiple nodes by beginning the line with a reference":"참조를 시작하여 여러 노드로부터 엣지를 그립니다.","Drop the file here ...":"파일을 여기에 드롭하세요 ...","Each line becomes a node":"각 줄은 노드가 됩니다.","Edge ID, Classes, Attributes":"가장자리 ID, 클래스, 속성","Edge Label":"가장자리 라벨","Edge Label Column":"가장자리 라벨 열","Edge Style":"가장자리 스타일","Edge Text Size":"가장자리 텍스트 크기","Edge missing indentation":"들여쓰기가 누락된 가장자리","Edges":"가장자리","Edges are declared in the same row as their source node":"가장자리는 소스 노드가 있는 같은 행에 선언됩니다.","Edges are declared in the same row as their target node":"가장자리는 목표 노드가 있는 같은 행에 선언됩니다.","Edges are declared in their own row":"가장자리는 자신의 행에 선언됩니다.","Edges can also have ID\'s, classes, and attributes before the label":"라벨 앞에 ID, 클래스 및 속성도 가질 수 있습니다.","Edges can be styled with dashed, dotted, or solid lines":"가장자리는 점선, 점선 또는 실선으로 스타일이 지정될 수 있습니다.","Edges in Separate Rows":"각 행별로 간선","Edges in Source Node Row":"출발 노드 행에 간선","Edges in Target Node Row":"도착 노드 행에 간선","Edit":"편집하기","Edit with AI":"AI로 편집하기","Editable":"편집 가능","Editor":"에디터","Email":"이메일","Empty":"비어 있음","Enable to set a consistent height for all nodes":"모든 노드의 일관된 높이 설정 가능","Enter a name for the cloned flowchart.":"복제된 플로우차트의 이름을 입력하세요.","Enter a name for the new folder.":"새 폴더의 이름을 입력하세요.","Enter a new name for the {0}.":[["0"],"의 새 이름을 입력하세요."],"Enter your email address and we\'ll send you a magic link to sign in.":"이메일 주소를 입력하면 자동으로 로그인할 수 있는 링크를 보내드립니다.","Enter your email address below and we\'ll send you a link to reset your password.":"아래에 이메일 주소를 입력하면 비밀번호 재설정을 위한 링크를 보내드립니다.","Equal To":"같음","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"모든 다이어그램은 선명한 PNG, SVG 또는 공유 가능한 링크로 내보낼 수 있습니다 - 회의, 문서 또는 프레젠테이션에 준비 완료.","Everything you need to know about Flowchart Fun Pro":"Flowchart Fun Pro에 대해 알아야 할 모든 것","Examples":"예시","Excalidraw":"Excalidraw","Exclusive Office Hours":"독점 오피스 시간","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"로컬 파일을 직접 플로우차트에 로드하여 효율성과 보안성을 경험해보세요. 오프라인에서 업무 관련 문서를 관리하기에 완벽한 기능입니다. Flowchart Fun Pro를 구독하면 이 독점적인 프로 기능과 더 많은 기능을 이용할 수 있습니다. 매달 $6로 이용 가능합니다.","Explore Pro":"Pro 모드 탐색","Explore more":"더 탐험하세요.","Export":"내보내기","Export clean diagrams without branding":"브랜딩 없이 깔끔한 다이어그램 내보내기","Export to PNG & JPG":"PNG 및 JPG로 내보내기","Export to PNG, JPG, and SVG":"PNG, JPG 및 SVG로 내보내기","Feature Breakdown":"기능 분해","Feedback":"피드백","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"우리에게 연락하고 자유롭게 탐색하시고 <0>피드백 페이지를 통해 의견을 제시하실 수 있습니다.","Fine-tune layouts and visual styles":"레이아웃과 시각적 스타일을 세밀하게 조정하기","Fixed Height":"고정 높이","Fixed Node Height":"고정된 노드 높이","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro는 매달 $6로 무제한 플로우차트, 무제한 공동 작업자 및 무제한 저장 공간을 제공합니다.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun은 한 명의 개발자가 만들고 유지보수합니다. 당신의 지원으로 계속 운영됩니다.","Follow Us on Twitter":"트위터에서 우리를 팔로우하기","Font Family":"글꼴 가족","Forgot your password?":"비밀번호를 잊으셨나요?","Free":"무료","Free users: charts in the sandbox expire after 7 days.":"무료 사용자: 샌드박스에 있는 차트는 7일 후에 만료됩니다.","Frequently Asked Questions":"자주 묻는 질문들","Full-screen, read-only, and template sharing":"전체 화면, 읽기 전용, 그리고 템플릿 공유","Fullscreen":"전체 화면","General":"일반","Generate flowcharts from text automatically":"텍스트로부터 자동으로 플로우차트 생성하기","Get Pro Access Now":"지금 프로 액세스 받기","Get Unlimited AI Requests":"무제한 AI 요청 받기","Get rapid responses to your questions":"귀하의 질문에 신속한 답변 받기","Get unlimited flowcharts and premium features":"무제한 플로우차트 및 프리미엄 기능 이용하기","Go back home":"집으로 돌아가기","Go to the Editor":"편집기로 가기","Go to your Sandbox":"너의 샌드박스로 가기","Graph":"그래프","Green?":"초록색?","Grid":"그리드","Have complex questions or issues? We\'re here to help.":"복잡한 문제가 있나요? 여기에서 도와드리겠습니다.","Here are some Pro features you can now enjoy.":"이제 즐길 수 있는 Pro 기능들이 있습니다.","High-quality exports with embedded fonts":"내장된 글꼴로 고품질의 내보내기","History":"기록","Home":"집","How are edges declared in this data?":"이 데이터에서 간선은 어떻게 선언됩니까?","How fast can I actually make something?":"실제로 얼마나 빨리 무언가를 만들 수 있을까요?","How would you like to save your chart?":"당신의 차트를 저장하려면 어떻게 하시겠습니까?","I would like to request a new template:":"새로운 템플릿을 요청하고 싶습니다:","ID\'s":"식별자","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"해당 이메일로 계정이 있다면 비밀번호 재설정을 위한 안내를 포함한 이메일을 보내드립니다.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"만약 가장자리를 만들려면, 이 줄을 들여쓰기하십시오. 만약 그렇지 않다면, 콜론을 백슬래시로 이스케이프하십시오 <0>\\\\:","Images":"이미지","Import Data":"데이터 가져오기","Import data from a CSV file.":"CSV 파일에서 데이터를 가져옵니다.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"CSV 파일에서 데이터를 가져와 새로운 플로우 차트로 매핑합니다. 이것은 Lucidchart, Google Sheets, Visio 등의 다른 소스에서 데이터를 가져오는 데 좋은 방법입니다.","Import from CSV":"CSV로 가져오기","Import from Visio, Lucidchart, CSV":"Visio, Lucidchart, CSV에서 가져오기","Import from Visio, Lucidchart, and CSV":"Visio, Lucidchart 및 CSV에서 가져오기","Import from anywhere":"어디에서든 가져오기","Import from popular diagram tools":"인기 있는 다이어그램 도구에서 가져오기","Import your diagram it into Microsoft Visio using one of these CSV files.":"이러한 CSV 파일 중 하나를 사용하여 다이어그램을 Microsoft Visio로 가져옵니다.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"데이터를 가져오는 것은 프로 기능입니다. Flowchart Fun Pro로 업그레이드하면 매월 $6에 이용할 수 있습니다.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"<0>title 속성을 사용하여 제목을 포함시키십시오. Visio 색상을 사용하려면 다음 중 하나와 같은 <1>roleType 속성을 추가하십시오:","Indent to connect nodes":"노드를 연결하기 위해 들여쓰기하세요.","Info":"정보","Is":"있다","Is my data private?":"내 데이터는 개인 정보로 보호되나요?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON 캔버스는 <0>Obsidian 캔버스 및 다른 응용 프로그램에서 사용되는 다이어그램의 JSON 표현입니다.","Join 2000+ professionals who\'ve upgraded their workflow":"워크플로우를 업그레이드한 2000명 이상의 전문가들과 함께하세요","Join thousands of happy users who love Flowchart Fun":"플로우 차트 어플을 사랑하는 수천 명의 행복한 사용자들과 함께하세요","Keep Things Private":"개인 정보 유지하기","Keep changes?":"변경 사항을 유지하시겠습니까?","Keep practicing":"계속 연습하세요","Keep your data private on your computer":"컴퓨터에서 데이터를 개인적으로 보호하기","Language":"언어","Layout":"레이아웃","Layout Algorithm":"레이아웃 알고리즘","Layout Frozen":"레이아웃 동결","Leading References":"주목할만한 참고","Learn More":"더 알아보기","Learn Syntax":"구문 배우기","Learn about Flowchart Fun Pro":"Flowchart Fun Pro에 대해 알아보기","Left to Right":"왼쪽에서 오른쪽으로","Let us know why you\'re canceling. We\'re always looking to improve.":"취소하는 이유를 알려주세요. 우리는 항상 개선하고 있습니다.","Light":"라이트","Light Mode":"라이트 모드","Link":"링크","Link back":"링크를 걸어 돌아가세요","Load":"로드","Load Chart":"로드 차트","Load File":"로드 파일","Load Files":"로드 파일","Load default content":"기본 내용 로드","Load from link?":"링크에서 불러오기?","Load layout and styles":"레이아웃과 스타일 로드","Loading...":"로딩 중...","Local File Support":"로컬 파일 지원","Local saving for offline access":"오프라인 접속을 위한 로컬 저장 기능","Lock Zoom to Graph":"그래프에 룩 줌을 고정하다","Log In":"로그인","Log Out":"로그아웃","Log in to Save":"로그인하여 저장하기","Log in to upgrade your account":"계정 업그레이드를 위해 로그인","Make a One-Time Donation":"한 번 선물하기","Make it yours":"나만의 것으로 만들기","Make publicly accessible":"공개적으로 액세스 가능하게 만들기","Manage Billing":"청구 관리","Map Data":"데이터 지도","Maximum width of text inside nodes":"노드 내부 텍스트의 최대 너비","Monthly":"월간","Move":"이동","Move {0}":["이동 ",["0"]],"Multiple pointers on same line":"같은 줄에 여러 포인터","My dog ate my credit card!":"내 개가 내 신용 카드를 먹었어요!","Name":"이름","Name Chart":"차트 이름","Name your chart":"차트 이름 지정","New":"신규","New Email":"새 이메일","New Flowchart":"새 플로우차트","New Folder":"새 폴더","Next charge":"다음 청구 금액","No Edges":"노드 없음","No Folder (Root)":"폴더 없음 (루트)","No Watermarks!":"물방울 없음!","No charts yet":"아직 차트가 없습니다","No items in this folder":"이 폴더에 항목이 없습니다","No matching charts found":"일치하는 차트를 찾을 수 없습니다","Node Border Style":"노드 경계 스타일","Node Colors":"노드 색상","Node ID":"노드 ID","Node ID, Classes, Attributes":"노드 ID, 클래스, 속성","Node Label":"노드 라벨","Node Shape":"노드 모양","Node Shapes":"노드 모양","Nodes":"노드","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"노드는 점선, 점점선 또는 이중 선으로 스타일링 할 수 있습니다. 또한 border_none을 사용하여 테두리를 제거할 수도 있습니다.","Not Empty":"비어 있지 않음","Now you\'re thinking with flowcharts!":"이제 플로우차트로 생각하고 있어요!","Office Hours":"근무 시간","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"가끔 마술 링크가 스팸 폴더에 도착할 수도 있습니다. 몇 분 후에도 보이지 않으면 거기를 확인하거나 새로운 링크를 요청하십시오.","One on One Support":"1:1 지원","One-on-One Support":"일대일 지원","Open Customer Portal":"고객 포털 열기","Operation canceled":"작업이 취소되었습니다.","Or maybe blue!":"아니면 파란색으로!","Organization Chart":"조직도","PNG & JPG export":"PNG 및 JPG 내보내기","Padding":"채우기","Page not found":"페이지를 찾을 수 없습니다.","Password":"비밀번호","Past Due":"연체","Paste a document to convert it":"문서를 붙여서 변환하세요","Paste your document or outline here to convert it into an organized flowchart.":"문서나 개요를 여기에 붙여넣어 조직화된 플로우차트로 변환하세요.","Pasted content detected. Convert to Flowchart Fun syntax?":"붙여넣은 내용이 감지되었습니다. Flowchart Fun 구문으로 변환하시겠습니까?","Perfect for docs and quick sharing":"문서 작성 및 빠른 공유에 완벽함","Permanent Charts are a Pro Feature":"영구 차트는 프로 기능입니다","Playbook":"플레이북","Pointer and container on same line":"같은 줄에 포인터와 컨테이너","Priority One-on-One Support":"우선순위 일대일 지원","Priority support":"우선순위 지원","Privacy Policy":"개인정보보호정책","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro는 연간 $4에 시작합니다. 언제든지 취소할 수 있습니다.","Pro tip: Right-click any node to customize its shape and color":"팁: 노드를 우클릭하여 모양과 색상을 사용자 정의할 수 있습니다.","Processing Data":"데이터 처리","Processing...":"처리 중...","Prompt":"프롬프트","Public":"공용","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Visio, Lucidchart, CSV에서 데이터 가져오기 또는 템플릿에서 시작하기. 이미 존재하는 것을 다시 만들 필요 없음.","Quick experimentation space that resets daily":"매일 초기화되는 빠른 실험 공간","Random":"무작위","Rapid Deployment Templates":"빠른 배포 템플릿","Rapid Templates":"급변화 템플릿","Raster Export (PNG, JPG)":"래스터 내보내기 (PNG, JPG)","Rate limit exceeded. Please try again later.":"요청 제한이 초과되었습니다. 나중에 다시 시도해주세요.","Read-only":"읽기 전용","Reference by Class":"클래스로 참조","Reference by ID":"ID로 참조","Reference by Label":"레이블로 참조","References":"참조","References are used to create edges between nodes that are created elsewhere in the document":"참조는 문서 내부에서 만들어진 노드 사이에 간선을 만들기 위해 사용됩니다.","Referencing a node by its exact label":"정확한 레이블로 노드를 참조하기","Referencing a node by its unique ID":"고유한 ID로 노드를 참조하기","Referencing multiple nodes with the same assigned class":"동일한 할당 된 클래스로 여러 노드를 참조하기 ","Refresh Page":"페이지 새로 고침 ","Reload to Update":"업데이트하려면 다시 로드하기 ","Rename":"이름 바꾸기","Rename {0}":[["0"],"의 이름 바꾸기"],"Request Magic Link":"마법 링크 요청","Request Password Reset":"비밀번호 재설정 요청","Reset":"재설정","Reset Password":"비밀번호 재설정","Resume Subscription":"구독 재개","Return":"반품","Right to Left":"오른쪽에서 왼쪽으로","Right-click nodes for options":"옵션을 위해 노드를 오른쪽 클릭하세요","Roadmap":"로드맵","Rotate Label":"라벨 회전","SVG Export is a Pro Feature":"SVG 내보내기는 프로 기능입니다","SVG, PDF & all export formats":"SVG, PDF 및 모든 내보내기 형식","Satisfaction guaranteed or first payment refunded":"만족도 보장 또는 첫 번째 결제 환불","Save":"구하다","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"로컬에 저장하고 오프라인에서 작업하며 정확히 누가 무엇을 볼 수 있는지 제어합니다. 데이터는 사용자가 허용하지 않는 한 컴퓨터를 벗어나지 않습니다.","Save time with AI and dictation, making it easy to create diagrams.":"인공지능과 딕테이션을 통해 시간을 절약하고 쉽게 다이어그램을 작성할 수 있습니다.","Save to Cloud":"클라우드에 저장하기","Save to File":"파일에 저장하기","Save your Work":"작업 저장","Schedule personal consultation sessions":"개인 상담 세션 일정 잡기","Secure payment":"안전한 결제","See more reviews on Product Hunt":"Product Hunt에서 더 많은 리뷰를 확인하세요","See what\'s possible":"가능한 것을 확인하세요","Select a destination folder for \\"{0}\\".":"\\\\에 대한 대상 폴더 선택","Send us a message":"메시지 보내기","Set a consistent height for all nodes":"모든 노드의 일관된 높이 설정하기","Settings":"설정","Share":"공유하기","Sign In":"로그인","Sign in with <0>GitHub":"<0>GitHub으로 로그인","Sign in with <0>Google":"<0>Google으로 로그인","Sorry! This page is only available in English.":"죄송합니다! 이 페이지는 영어로만 제공됩니다.","Sorry, there was an error converting the text to a flowchart. Try again later.":"죄송합니다, 텍스트를 플로우차트로 변환하는 중에 오류가 발생했습니다. 나중에 다시 시도해주세요.","Sort Ascending":"오름차순 정렬하기","Sort Descending":"내림차순 정렬","Sort by {0}":[["0"],"로 정렬"],"Source Arrow Shape":"소스 화살표 모양","Source Column":"소스 열","Source Delimiter":"소스 구분자","Source Distance From Node":"노드에서 소스 거리","Source/Target Arrow Shape":"소스/대상 화살표 모양","Spacing":"간격","Special Attributes":"특별한 속성","Start":"시작","Start Over":"처음부터 다시 시작하기","Start faster with use-case specific templates":"사용 사례에 맞는 템플릿으로 더 빠르게 시작하기","Start for free":"무료로 시작하기","Status":"상태","Step 1":"단계 1","Step 2":"단계 2","Step 3":"단계 3","Store any data associated to a node":"노드에 관련된 모든 데이터 저장하기","Style Classes":"스타일 클래스","Style with classes":"클래스로 스타일링","Submit":"보내다","Subscription":"구독","Subscription Successful!":"구독 성공!","Subscription will end":"구독이 종료될 예정입니다.","Support":"지원","Target Arrow Shape":"대상 화살표 모양","Target Column":"대상 열","Target Delimiter":"대상 구분자","Target Distance From Node":"노드로부터의 목표 거리","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"AI에게 필요한 것을 평문으로 말해주세요. 당신의 다이어그램은 몇 초만에 자동으로 생성됩니다.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"잘 작동하는 부분과 문제가 있는 부분을 알려주세요. 모든 메시지는 개발자가 읽습니다.","Text Color":"텍스트 색상","Text Horizontal Offset":"텍스트 수평 오프셋","Text Leading":"텍스트 리딩","Text Max Width":"텍스트 최대 너비","Text Vertical Offset":"텍스트 수직 오프셋","Text followed by colon+space creates an edge with the text as the label":"콜론 뒤에 공백이 따라오는 텍스트는 텍스트를 레이블로 하는 엣지를 만듭니다.","Text on a line creates a node with the text as the label":"한 줄에 있는 텍스트는 텍스트를 레이블로 하는 노드를 만듭니다.","Thank you for your feedback!":"피드백을 해주셔서 감사합니다!","The beauty and magic reside in the minimalism.":"아름다움과 마법은 최소주의에 있습니다.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"스타일을 변경하는 가장 좋은 방법은 노드 또는 엣지를 오른쪽 클릭하고 원하는 스타일을 선택하는 것입니다.","The column that contains the edge label(s)":"엣지 레이블이 포함된 열","The column that contains the source node ID(s)":"소스 노드 ID가 포함된 열","The column that contains the target node ID(s)":"타겟 노드 ID가 포함된 열","The delimiter used to separate multiple source nodes":"여러 개의 소스 노드를 구분하기 위해 사용되는 구분 기호","The delimiter used to separate multiple target nodes":"여러 개의 목표 노드를 구분하기 위해 사용되는 구분 기호","The fastest way to turn what\'s in your head into something everyone else can understand.":"머리 속에 있는 것을 다른 사람들이 이해할 수 있는 것으로 바꾸는 가장 빠른 방법입니다.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"무료 요금제는 일상적인 사용에 적합합니다. Pro 기능이 필요한 경우 매월 $6로 이용 가능하며, 언제든지 해지할 수 있습니다.","The possible shapes are:":"가능한 모양은 다음과 같습니다:","Theme":"테마","Theme Customization Editor":"테마 커스터마이즈 편집기","Theme Editor":"테마 편집기","Theme editor":"테마 편집기","There are no edges in this data":"이 데이터에는 엣지가 없습니다.","This action cannot be undone.":"이 작업은 취소할 수 없습니다.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"이 기능은 프로 사용자에게만 제공됩니다. <0>프로 사용자가 되어 이 기능을 사용할 수 있게 하세요.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"입력 길이에 따라 30초에서 2분 사이의 시간이 소요될 수 있습니다.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"이 모래상자는 실험하기에 완벽하지만 기억하세요 - 매일 초기화됩니다. 지금 업그레이드하고 현재 작업을 유지하세요!","This will replace the current content.":"이것은 현재 내용을 대체합니다.","This will replace your current chart content with the template content.":"이것은 템플릿 콘텐츠로 현재 차트 콘텐츠를 대체합니다.","This will replace your current sandbox.":"이것은 현재 샌드 박스를 대체합니다.","Time to decide":"결정할 시간","Tip":"팁","To fix this change one of the edge IDs":"이를 수정하려면, 가장자리 ID 중 하나를 변경하십시오.","To fix this change one of the node IDs":"이것을 수정하려면 노드 ID 중 하나를 변경하십시오","To fix this move one pointer to the next line":"이것을 수정하려면 포인터를 다음 줄로 이동하십시오","To fix this start the container <0/> on a different line":"이것을 수정하려면 컨테이너 <0/>을 다른 줄에 시작하십시오","To learn more about why we require you to log in, please read <0>this blog post.":"왜 로그인을 해야하는지 자세히 알아보려면 <0>이 블로그 글을 읽어보세요.","Top to Bottom":"위에서 아래로","Transform Your Ideas into Professional Diagrams in Seconds":"초 내에 전문 다이어그램으로 생각을 변형하세요.","Transform text into diagrams instantly":"텍스트를 즉시 다이어그램으로 변환하세요.","Try AI":"AI 시도해보기","Try adjusting your search or filters to find what you\'re looking for.":"검색 또는 필터를 조정하여 원하는 내용을 찾아보세요.","Try again":"다시 시도하세요","Try it free":"무료로 시도해보세요","Two edges have the same ID":"두 개의 간선이 같은 ID를 가지고 있습니다","Two nodes have the same ID":"두 개의 노드가 같은 ID를 가지고 있습니다","Type it. See it.":"입력하고 보세요.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"이런, 무료 요청이 모두 소진되었습니다! 무제한 다이어그램 변환을 위해 Flowchart Fun Pro로 업그레이드하고 텍스트를 복사하여 쉽게 명확한 시각적 흐름도로 변환하세요.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"60초 이내에. 몇 줄의 텍스트를 입력하거나 인공지능에게 필요한 것을 설명하면 즉시 다이어그램이 나타납니다. 한 번의 클릭으로 내보내거나 공유하세요.","Undo":"취소","Unescaped special character":"이스케이프되지 않은 특수 문자","Unique text value to identify a node":"노드를 식별하기 위한 고유한 텍스트 값","Unknown":"알 수 없음","Unknown Parsing Error":"알 수 없는 구문 분석 오류","Unlimited Flowcharts":"무제한 다이어그램","Unlimited Permanent Flowcharts":"무제한 영구 플로차트","Unlimited cloud-saved flowcharts":"무제한 클라우드 저장 플로우차트","Unlimited saved diagrams":"무제한 저장된 다이어그램","Unlock AI Features and never lose your work with a Pro account.":"AI 기능 잠금 해제 및 프로 계정으로 작업을 절대 잃지 않습니다.","Unlock Unlimited AI Flowcharts":"무제한 AI 플로우차트 잠금 해제","Unpaid":"미납","Update Email":"이메일 업데이트","Updated Date":"업데이트 날짜","Upgrade Now - Save My Work":"지금 업그레이드 - 내 작업 저장","Upgrade to Flowchart Fun Pro and unlock:":"Flowchart Fun Pro로 업그레이드하고 다음을 잠금 해제하세요:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Flowchart Fun Pro로 업그레이드하여 SVG 내보내기를 잠금 해제하고 다이어그램에 대한 더 고급 기능을 즐기세요.","Upgrade to Pro":"프로로 업그레이드","Upgrade to Pro for permanent charts.":"프로로 업그레이드하면 영구적인 차트를 사용할 수 있습니다.","Upload your File":"파일을 업로드하세요.","Use Custom CSS Only":"사용자 정의 CSS만 사용","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Lucidchart나 Visio를 사용하고 계신가요? CSV 가져오기를 통해 모든 소스에서 데이터를 쉽게 가져올 수 있습니다!","Use classes to group nodes":"노드를 그룹화하기 위해 클래스를 사용하십시오.","Use the attribute <0>href to set a link on a node that opens in a new tab.":"새 탭에서 링크를 설정하기 위해 속성 <0>href을 사용하십시오.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"노드의 이미지를 설정하려면 <0>src 속성을 사용하세요. 이미지는 노드에 맞게 크기가 조정되므로 노드의 너비와 높이를 조절해야 할 수도 있습니다. CORS로 차단되지 않은 공개 이미지만 지원됩니다.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"노드의 너비와 높이를 명시적으로 설정하려면 <0>w 및 <1>h 속성을 사용하세요.","Use the customer portal to change your billing information.":"청구 정보를 변경하려면 고객 포털을 사용하십시오.","Use these settings to adapt the look and behavior of your flowcharts":"이 설정을 사용하여 흐름 도표의 모양과 동작을 조정하십시오","Use this file for org charts, hierarchies, and other organizational structures.":"조직도, 계층 구조 및 기타 조직 구조를 위해 이 파일을 사용하십시오.","Use this file for sequences, processes, and workflows.":"시퀀스, 프로세스 및 워크플로우에 대해 이 파일을 사용하십시오.","Use this mode to modify and enhance your current chart.":"현재 차트를 수정하고 개선하는 데 이 모드를 사용하세요.","Used at":"사용처","User":"사용자","Vector Export (SVG)":"벡터 내보내기 (SVG)","View on Github":"Github에서 보기","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"문서에서 플로우차트를 만들고 싶으세요? 편집기에 붙여넣고 \'플로우차트로 변환\'을 클릭하세요.","Watermark-Free Diagrams":"워터마크 없는 다이어그램","Watermarks":"물감","Welcome to Flowchart Fun":"Flowchart Fun에 오신 것을 환영합니다","What if I just need it for one project?":"한 프로젝트에만 필요한 경우 어떻게 해야 하나요?","What our users are saying":"우리 사용자들의 이야기","What\'s next?":"다음은 무엇인가요?","What\'s this?":"이것이 무엇인가요?","Width":"너비","Width and Height":"너비와 높이","Will my diagrams actually look professional?":"내 다이어그램이 전문적으로 보일까요?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Flowchart Fun의 Pro 버전을 사용하면 자연어 명령을 사용하여 흐름도 세부 정보를 빠르게 완성할 수 있으며, 이동 중에 다이어그램을 만드는 데 이상적입니다. 매월 $6로 접근 가능한 AI 편집의 편리함을 느껴보세요.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"프로 버전으로는 로컬 파일을 저장하고 불러올 수 있습니다. 오프라인에서 작업 관련 문서를 관리하는 데 최적입니다.","Would you like to continue?":"계속하시겠습니까?","Would you like to suggest a new example?":"새로운 예시를 제안하시겠습니까?","Wrap text in parentheses to connect to any node":"괄호 안에 텍스트를 감싸서 어떤 노드에 연결하세요","Write like an outline":"아웃라인처럼 작성하세요","Write your prompt here or click to enable the microphone, then press and hold to record.":"여기에 프롬프트를 작성하거나 마이크를 활성화하려면 클릭한 다음 눌러서 녹음하세요.","Yearly":"연간","Yes — send us a message and we\'ll set you up with a discounted rate.":"네 - 메시지를 보내주세요, 그리고 할인된 가격으로 설정해드릴게요.","Yes, Replace Content":"예, 콘텐츠 대체하기","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"네. 모든 다이어그램은 균형 잡힌, 자동 레이아웃과 깔끔한 타이포그래피를 사용합니다. 테마, 색상, 스타일을 사용자 정의할 수 있으며, 선명한 SVG 또는 고해상도 PNG로 내보낼 수 있어서 어떤 프레젠테이션이나 문서에서도 멋지게 보입니다.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"네. Pro는 Visio, Lucidchart, CSV에서 가져오기를 지원합니다 - 따라서 처음부터 다시 만들지 않고 이미 있는 것을 가져올 수 있습니다.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"예. 로컬로 파일을 저장하고 불러올 수 있으며 완전히 오프라인에서 작업할 수 있으며 다이어그램을 볼 수 있는 사람을 정확하게 제어할 수 있습니다. 데이터는 공유하지 않는 한 기기를 떠나지 않습니다.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["그래프에 ",["numNodes"],"개의 노드와 ",["numEdges"],"개의 간선을 추가하려고 합니다."],"You need to log in to access this page.":"페이지에 접근하려면 로그인해야합니다.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"이미 프로 사용자입니다. <0>구독 관리<1/>질문이나 기능 요청이 있으신가요? <2>문의하기","You\'re doing great!":"잘하고 있어요!","You\'re on the free plan.":"무료 요금제를 사용 중입니다.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"모든 무료 AI 변환을 사용하셨습니다. 무제한 AI 사용, 사용자 정의 테마, 개인 공유 등을 위해 Pro로 업그레이드하세요. 쉽게 멋진 플로우차트를 만들어 나가세요!","Your Charts":"당신의 차트","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"당신의 샌드박스는 우리의 플로우차트 도구로 자유롭게 실험할 수 있는 공간으로, 매일 새로운 시작을 위해 재설정됩니다.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"당신의 차트는 계정이 더 이상 활성화되지 않았기 때문에 읽기 전용입니다. <0>계정 페이지를 방문하여 자세한 내용을 알아보세요.","Your next diagram should be your best one.":"다음 다이어그램은 최고의 작품이 되어야 합니다.","Your subscription is <0>{statusDisplay}.":["귀하의 구독 상태는 <0>",["statusDisplay"],"입니다."],"Your work stays yours":"작업물은 당신의 것으로 남습니다.","Zoom In":"확대","Zoom Out":"축소하기","month":"월","or":"또는","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"연간 $48 (33% 할인) · 언제든지 취소 가능","$6/mo":"월 $6","1 Temporary Flowchart":"1 임시 플로차트","1 diagram at a time":"한 번에 1개의 다이어그램","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>사용자 정의 CSS만이 활성화되었습니다. 레이아웃과 고급 설정만 적용됩니다.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun은 <1>Tone Row가 만든 오픈 소스 프로젝트입니다.","<0>Sign In / <1>Sign Up with email and password":"<0>로그인 / <1>회원가입 이메일과 비밀번호로","A new version of the app is available. Please reload to update.":"새로운 버전의 앱이 사용 가능합니다. 업데이트하려면 다시로드하십시오.","AI Creation & Editing":"AI 생성 및 편집","AI generation & editing":"AI 생성 및 편집","AI-Powered Flowchart Creation":"인공지능 기반 플로우차트 생성","AI-generated from plain text in under 5 seconds.":"일반 텍스트에서 5초 이내에 AI로 생성됨.","AI-powered editing to supercharge your workflow":"워크플로우를 강화하기 위한 AI 기반 편집 기능","About":"소개","Account":"계정","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"특수 문자 앞에는 역슬래시 (<0>\\\\)를 추가하세요: <1>(, <2>:, <3>#, 또는 <4>.","Add some steps":"몇 가지 단계를 추가하세요.","Advanced":"고급","Align Horizontally":"수평 정렬","Align Nodes":"노드 정렬하기","Align Vertically":"수직 정렬","All this for just $6/month - less than your daily coffee ☕":"하루 커피 값보다 저렴한 월 $6로 이 모든 것을 이용하세요 ☕","Always presentation-ready":"항상 프레젠테이션용으로 준비됨","Amount":"금액","An error occurred. Try resubmitting or email {0} directly.":["오류가 발생하였습니다. 다시 제출하거나 ",["0"],"으로 직접 이메일을 보내주십시오."],"Appearance":"외관","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"플로우차트를 삭제하시겠습니까?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"폴더를 삭제하시겠습니까?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"폴더를 복제하시겠습니까?","Are you sure?":"확실합니까?","Arrow Size":"화살표 크기","Attributes":"속성","August 2023":"2023년 8월","Back":"뒤로","Back To Editor":"편집기로 돌아가기","Background Color":"배경색","Basic Flowchart":"기본 플로우 차트","Become a Github Sponsor":"깃허브 스폰서가 되기","Become a Pro User":"프로 사용자가 되기","Begin your journey":"여정을 시작하세요.","Billed annually at $48":"매년 $48로 청구됩니다","Billed monthly at $6":"매달 $6에 청구됩니다.","Blog":"블로그","Book a Meeting":"미팅 예약","Border Color":"테두리 색","Border Width":"테두리 너비","Bottom to Top":"아래에서 위로","Breadthfirst":"폭 우선","Build your personal flowchart library":"개인용 플로우차트 라이브러리 만들기","Can I import my existing diagrams?":"기존 다이어그램을 가져올 수 있나요?","Cancel":"취소","Cancel anytime":"언제든 취소 가능","Cancel your subscription. Your hosted charts will become read-only.":"구독을 취소하십시오. 귀하의 호스트 차트가 읽기 전용이 됩니다.","Certain attributes can be used to customize the appearance or functionality of elements.":"일부 속성은 요소의 모양 또는 기능을 사용자 정의하기 위해 사용할 수 있습니다.","Change Email Address":"이메일 주소 변경","Changelog":"변경 로그","Charts":"차트","Check out the guide:":"가이드를 확인하세요:","Check your email for a link to log in.<0/>You can close this window.":"로그인할 링크가 들어있는 이메일을 확인하세요. 이 창은 닫을 수 있습니다.","Choose":"선택하세요","Choose Template":"템플릿 선택","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"에지의 소스와 목적지를 위한 다양한 화살표 모양을 선택합니다. 모양에는 삼각형, 삼각형-티, 원-삼각형, 삼각형-가위형, 삼각형-뒤곡선, 베이, 티, 사각형, 원, 다이아몬드, 쉐브론, 없음이 포함됩니다.","Choose how edges connect between nodes":"노드 간 연결 방식 선택","Choose how nodes are automatically arranged in your flowchart":"플로우차트에서 노드가 자동으로 정렬되는 방식을 선택하세요.","Circle":"원","Classes":"클래스","Clear":"지우다","Clear text?":"텍스트를 지우시겠습니까?","Clone":"클론","Clone Flowchart":"플로우차트 복제","Close":"닫기","Color":"색상","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"색상에는 빨강, 주황, 노랑, 파랑, 보라, 검정, 흰색, 회색이 포함됩니다.","Column":"열","Comment":"댓글 달기","Community templates":"커뮤니티 템플릿","Compare our plans and find the perfect fit for your flowcharting needs":"우리의 요금제를 비교하고 당신의 플로우차트 작성 요구에 맞는 완벽한 선택을 찾으세요","Concentric":"동심","Confirm New Email":"새 이메일 확인","Confirm your email address to sign in.":"로그인하려면 이메일 주소를 확인하세요.","Connect your Data":"데이터 연결","Containers":"컨테이너","Containers are nodes that contain other nodes. They are declared using curly braces.":"컨테이너는 다른 노드를 포함하는 노드입니다. 중괄호를 사용하여 선언됩니다.","Continue":"계속하기","Continue in Sandbox (Resets daily, work not saved)":"샌드박스에서 계속하기 (매일 초기화되며 작업은 저장되지 않음)","Controls the flow direction of hierarchical layouts":"계층적 레이아웃의 흐름 방향을 제어합니다.","Convert":"변환하기","Convert to Flowchart":"흐름도로 변환","Convert to hosted chart?":"호스팅 차트로 변환하시겠습니까?","Cookie Policy":"쿠키 정책","Copied SVG code to clipboard":"클립보드에 SVG 코드 복사","Copied {format} to clipboard":["클립보드에 ",["format"]," 복사"],"Copy":"복사","Copy PNG Image":"PNG 이미지 복사","Copy SVG Code":"SVG 코드 복사","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Excalidraw 코드를 복사해서 <0>excalidraw.com에 붙여넣어서 편집하세요. 이 기능은 실험적이며 모든 다이어그램과 작동하지 않을 수 있습니다. 버그를 발견하면 <1>알려주세요.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"mermaid.js 코드를 복사하거나 mermaid.js 라이브 편집기에서 직접 열어주세요.","Create":"만들기","Create Flowcharts using AI":"AI를 사용하여 플로차트를 만들어보세요","Create Unlimited Flowcharts":"무제한 플로차트 만들기","Create a New Chart":"새 차트 만들기","Create a flowchart showing the steps of planning and executing a school fundraising event":"학교 모금 행사를 계획하고 실행하는 단계를 보여주는 플로우차트를 작성하십시오.","Create a new flowchart to get started or organize your work with folders.":"새로운 플로우차트를 만들어 시작하거나 폴더로 작업을 정리하세요.","Create flowcharts instantly: Type or paste text, see it visualized.":"즉시 플로우차트 생성: 텍스트를 입력하거나 붙여넣고 시각화해보세요.","Create unlimited diagrams for just $6/month!":"매달 $6로 무제한 다이어그램을 생성하세요!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"클라우드에 저장된 무한 플로우 차트 생성 - 어디서나 액세스 가능!","Create with AI":"AI로 만들기","Created Date":"생성일자","Creating an edge between two nodes is done by indenting the second node below the first":"두 노드 사이에 엣지를 만드는 것은 첫 번째 노드 아래에 두 번째 노드를 들여 쓰는 것으로 합니다.","Curve Style":"곡선 스타일","Custom CSS":"사용자 정의 CSS","Custom Sharing Options":"커스텀 공유 옵션","Custom sharing & public links":"사용자 정의 공유 및 공개 링크","Customer Portal":"고객 포털","Daily Sandbox Editor":"매일 샌드박스 편집기","Dark":"다크","Dark Mode":"다크 모드","Data Import (Visio, Lucidchart, CSV)":"데이터 가져오기 (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"복잡한 다이어그램을 위한 데이터 가져오기 기능","Date":"날짜","Delete":"삭제","Delete {0}":[["0"]," 삭제"],"Describe it and it appears":"설명하면 나타납니다","Describe your idea. Get a diagram worth presenting.":"아이디어를 설명하세요. 발표할 가치가 있는 다이어그램을 얻으세요.","Design a software development lifecycle flowchart for an agile team":"애자일 팀을 위한 소프트웨어 개발 라이프사이클 플로우차트를 디자인하십시오.","Develop a decision tree for a CEO to evaluate potential new market opportunities":"CEO가 잠재적인 새 시장 기회를 평가하기 위해 사용할 수 있는 의사결정 트리를 개발하십시오.","Direction":"방향","Dismiss":"해지","Do you offer discounts for students or nonprofits?":"학생이나 비영리 단체에 할인을 제공하나요?","Do you want to delete this?":"본 항목을 삭제하시겠습니까?","Document":"문서","Don\'t Lose Your Work":"당신의 작업을 잃지 마세요","Download":"다운로드","Download JPG":"JPG 다운로드","Download PNG":"PNG 다운로드","Download SVG":"SVG 다운로드","Drag and drop a CSV file here, or click to select a file":"CSV 파일을 여기에 드래그 앤 드롭하거나 파일을 선택하려면 클릭하세요.","Draw an edge from multiple nodes by beginning the line with a reference":"참조를 시작하여 여러 노드로부터 엣지를 그립니다.","Drop the file here ...":"파일을 여기에 드롭하세요 ...","Each line becomes a node":"각 줄은 노드가 됩니다.","Edge ID, Classes, Attributes":"가장자리 ID, 클래스, 속성","Edge Label":"가장자리 라벨","Edge Label Column":"가장자리 라벨 열","Edge Style":"가장자리 스타일","Edge Text Size":"가장자리 텍스트 크기","Edge missing indentation":"들여쓰기가 누락된 가장자리","Edges":"가장자리","Edges are declared in the same row as their source node":"가장자리는 소스 노드가 있는 같은 행에 선언됩니다.","Edges are declared in the same row as their target node":"가장자리는 목표 노드가 있는 같은 행에 선언됩니다.","Edges are declared in their own row":"가장자리는 자신의 행에 선언됩니다.","Edges can also have ID\'s, classes, and attributes before the label":"라벨 앞에 ID, 클래스 및 속성도 가질 수 있습니다.","Edges can be styled with dashed, dotted, or solid lines":"가장자리는 점선, 점선 또는 실선으로 스타일이 지정될 수 있습니다.","Edges in Separate Rows":"각 행별로 간선","Edges in Source Node Row":"출발 노드 행에 간선","Edges in Target Node Row":"도착 노드 행에 간선","Edit":"편집하기","Edit with AI":"AI로 편집하기","Editable":"편집 가능","Editor":"에디터","Email":"이메일","Empty":"비어 있음","Enable to set a consistent height for all nodes":"모든 노드의 일관된 높이 설정 가능","Enter a name for the cloned flowchart.":"복제된 플로우차트의 이름을 입력하세요.","Enter a name for the new folder.":"새 폴더의 이름을 입력하세요.","Enter a new name for the {0}.":[["0"],"의 새 이름을 입력하세요."],"Enter your email address and we\'ll send you a magic link to sign in.":"이메일 주소를 입력하면 자동으로 로그인할 수 있는 링크를 보내드립니다.","Enter your email address below and we\'ll send you a link to reset your password.":"아래에 이메일 주소를 입력하면 비밀번호 재설정을 위한 링크를 보내드립니다.","Equal To":"같음","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"모든 다이어그램은 선명한 PNG, SVG 또는 공유 가능한 링크로 내보낼 수 있습니다 - 회의, 문서 또는 프레젠테이션에 준비 완료.","Everything you need to know about Flowchart Fun Pro":"Flowchart Fun Pro에 대해 알아야 할 모든 것","Examples":"예시","Excalidraw":"Excalidraw","Exclusive Office Hours":"독점 오피스 시간","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"로컬 파일을 직접 플로우차트에 로드하여 효율성과 보안성을 경험해보세요. 오프라인에서 업무 관련 문서를 관리하기에 완벽한 기능입니다. Flowchart Fun Pro를 구독하면 이 독점적인 프로 기능과 더 많은 기능을 이용할 수 있습니다. 매달 $6로 이용 가능합니다.","Explore Pro":"Pro 모드 탐색","Explore more":"더 탐험하세요.","Export":"내보내기","Export clean diagrams without branding":"브랜딩 없이 깔끔한 다이어그램 내보내기","Export to PNG & JPG":"PNG 및 JPG로 내보내기","Export to PNG, JPG, and SVG":"PNG, JPG 및 SVG로 내보내기","Feature Breakdown":"기능 분해","Feedback":"피드백","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"우리에게 연락하고 자유롭게 탐색하시고 <0>피드백 페이지를 통해 의견을 제시하실 수 있습니다.","Fine-tune layouts and visual styles":"레이아웃과 시각적 스타일을 세밀하게 조정하기","Fixed Height":"고정 높이","Fixed Node Height":"고정된 노드 높이","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro는 매달 $6로 무제한 플로우차트, 무제한 공동 작업자 및 무제한 저장 공간을 제공합니다.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun은 <0>Tone\xA0Row가 만든 오픈 소스 프로젝트입니다.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun은 한 명의 개발자가 만들고 유지보수합니다. 당신의 지원으로 계속 운영됩니다.","Follow Us on Twitter":"트위터에서 우리를 팔로우하기","Font Family":"글꼴 가족","Forgot your password?":"비밀번호를 잊으셨나요?","Free":"무료","Free users: charts in the sandbox expire after 7 days.":"무료 사용자: 샌드박스에 있는 차트는 7일 후에 만료됩니다.","Frequently Asked Questions":"자주 묻는 질문들","Full-screen, read-only, and template sharing":"전체 화면, 읽기 전용, 그리고 템플릿 공유","Fullscreen":"전체 화면","General":"일반","Generate flowcharts from text automatically":"텍스트로부터 자동으로 플로우차트 생성하기","Get Pro Access Now":"지금 프로 액세스 받기","Get Unlimited AI Requests":"무제한 AI 요청 받기","Get rapid responses to your questions":"귀하의 질문에 신속한 답변 받기","Get unlimited flowcharts and premium features":"무제한 플로우차트 및 프리미엄 기능 이용하기","Go back home":"집으로 돌아가기","Go to the Editor":"편집기로 가기","Go to your Sandbox":"너의 샌드박스로 가기","Graph":"그래프","Green?":"초록색?","Grid":"그리드","Group ranking and ranked-choice voting, free":"그룹 순위 및 순위 선택 투표, 무료","Have complex questions or issues? We\'re here to help.":"복잡한 문제가 있나요? 여기에서 도와드리겠습니다.","Here are some Pro features you can now enjoy.":"이제 즐길 수 있는 Pro 기능들이 있습니다.","High-quality exports with embedded fonts":"내장된 글꼴로 고품질의 내보내기","History":"기록","Home":"집","How are edges declared in this data?":"이 데이터에서 간선은 어떻게 선언됩니까?","How fast can I actually make something?":"실제로 얼마나 빨리 무언가를 만들 수 있을까요?","How would you like to save your chart?":"당신의 차트를 저장하려면 어떻게 하시겠습니까?","I would like to request a new template:":"새로운 템플릿을 요청하고 싶습니다:","ID\'s":"식별자","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"해당 이메일로 계정이 있다면 비밀번호 재설정을 위한 안내를 포함한 이메일을 보내드립니다.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"만약 가장자리를 만들려면, 이 줄을 들여쓰기하십시오. 만약 그렇지 않다면, 콜론을 백슬래시로 이스케이프하십시오 <0>\\\\:","Images":"이미지","Import Data":"데이터 가져오기","Import data from a CSV file.":"CSV 파일에서 데이터를 가져옵니다.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"CSV 파일에서 데이터를 가져와 새로운 플로우 차트로 매핑합니다. 이것은 Lucidchart, Google Sheets, Visio 등의 다른 소스에서 데이터를 가져오는 데 좋은 방법입니다.","Import from CSV":"CSV로 가져오기","Import from Visio, Lucidchart, CSV":"Visio, Lucidchart, CSV에서 가져오기","Import from Visio, Lucidchart, and CSV":"Visio, Lucidchart 및 CSV에서 가져오기","Import from anywhere":"어디에서든 가져오기","Import from popular diagram tools":"인기 있는 다이어그램 도구에서 가져오기","Import your diagram it into Microsoft Visio using one of these CSV files.":"이러한 CSV 파일 중 하나를 사용하여 다이어그램을 Microsoft Visio로 가져옵니다.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"데이터를 가져오는 것은 프로 기능입니다. Flowchart Fun Pro로 업그레이드하면 매월 $6에 이용할 수 있습니다.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"<0>title 속성을 사용하여 제목을 포함시키십시오. Visio 색상을 사용하려면 다음 중 하나와 같은 <1>roleType 속성을 추가하십시오:","Indent to connect nodes":"노드를 연결하기 위해 들여쓰기하세요.","Info":"정보","Is":"있다","Is my data private?":"내 데이터는 개인 정보로 보호되나요?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON 캔버스는 <0>Obsidian 캔버스 및 다른 응용 프로그램에서 사용되는 다이어그램의 JSON 표현입니다.","Join 2000+ professionals who\'ve upgraded their workflow":"워크플로우를 업그레이드한 2000명 이상의 전문가들과 함께하세요","Join thousands of happy users who love Flowchart Fun":"플로우 차트 어플을 사랑하는 수천 명의 행복한 사용자들과 함께하세요","Keep Things Private":"개인 정보 유지하기","Keep changes?":"변경 사항을 유지하시겠습니까?","Keep practicing":"계속 연습하세요","Keep your data private on your computer":"컴퓨터에서 데이터를 개인적으로 보호하기","Language":"언어","Layout":"레이아웃","Layout Algorithm":"레이아웃 알고리즘","Layout Frozen":"레이아웃 동결","Leading References":"주목할만한 참고","Learn More":"더 알아보기","Learn Syntax":"구문 배우기","Learn about Flowchart Fun Pro":"Flowchart Fun Pro에 대해 알아보기","Left to Right":"왼쪽에서 오른쪽으로","Let us know why you\'re canceling. We\'re always looking to improve.":"취소하는 이유를 알려주세요. 우리는 항상 개선하고 있습니다.","Light":"라이트","Light Mode":"라이트 모드","Link":"링크","Link back":"링크를 걸어 돌아가세요","Load":"로드","Load Chart":"로드 차트","Load File":"로드 파일","Load Files":"로드 파일","Load default content":"기본 내용 로드","Load from link?":"링크에서 불러오기?","Load layout and styles":"레이아웃과 스타일 로드","Loading...":"로딩 중...","Local File Support":"로컬 파일 지원","Local saving for offline access":"오프라인 접속을 위한 로컬 저장 기능","Lock Zoom to Graph":"그래프에 룩 줌을 고정하다","Log In":"로그인","Log Out":"로그아웃","Log in to Save":"로그인하여 저장하기","Log in to upgrade your account":"계정 업그레이드를 위해 로그인","Made by <0>Tone\xA0Row":"<0>Tone\xA0Row가 만들었습니다.","Make a One-Time Donation":"한 번 선물하기","Make it yours":"나만의 것으로 만들기","Make publicly accessible":"공개적으로 액세스 가능하게 만들기","Manage Billing":"청구 관리","Map Data":"데이터 지도","Maximum width of text inside nodes":"노드 내부 텍스트의 최대 너비","Monthly":"월간","More from Tone Row":"Tone Row에서 더 보기","More from Tone Row:":"Tone Row에서 더 보기:","More tools:":"더 많은 도구:","Move":"이동","Move {0}":["이동 ",["0"]],"Multiple pointers on same line":"같은 줄에 여러 포인터","My dog ate my credit card!":"내 개가 내 신용 카드를 먹었어요!","Name":"이름","Name Chart":"차트 이름","Name your chart":"차트 이름 지정","New":"신규","New Email":"새 이메일","New Flowchart":"새 플로우차트","New Folder":"새 폴더","Next charge":"다음 청구 금액","No Edges":"노드 없음","No Folder (Root)":"폴더 없음 (루트)","No Watermarks!":"물방울 없음!","No charts yet":"아직 차트가 없습니다","No items in this folder":"이 폴더에 항목이 없습니다","No matching charts found":"일치하는 차트를 찾을 수 없습니다","Node Border Style":"노드 경계 스타일","Node Colors":"노드 색상","Node ID":"노드 ID","Node ID, Classes, Attributes":"노드 ID, 클래스, 속성","Node Label":"노드 라벨","Node Shape":"노드 모양","Node Shapes":"노드 모양","Nodes":"노드","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"노드는 점선, 점점선 또는 이중 선으로 스타일링 할 수 있습니다. 또한 border_none을 사용하여 테두리를 제거할 수도 있습니다.","Not Empty":"비어 있지 않음","Now you\'re thinking with flowcharts!":"이제 플로우차트로 생각하고 있어요!","Office Hours":"근무 시간","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"가끔 마술 링크가 스팸 폴더에 도착할 수도 있습니다. 몇 분 후에도 보이지 않으면 거기를 확인하거나 새로운 링크를 요청하십시오.","One on One Support":"1:1 지원","One-on-One Support":"일대일 지원","Open Customer Portal":"고객 포털 열기","Operation canceled":"작업이 취소되었습니다.","Or maybe blue!":"아니면 파란색으로!","Organization Chart":"조직도","PNG & JPG export":"PNG 및 JPG 내보내기","Padding":"채우기","Page not found":"페이지를 찾을 수 없습니다.","Password":"비밀번호","Past Due":"연체","Paste a document to convert it":"문서를 붙여서 변환하세요","Paste your document or outline here to convert it into an organized flowchart.":"문서나 개요를 여기에 붙여넣어 조직화된 플로우차트로 변환하세요.","Pasted content detected. Convert to Flowchart Fun syntax?":"붙여넣은 내용이 감지되었습니다. Flowchart Fun 구문으로 변환하시겠습니까?","Perfect for docs and quick sharing":"문서 작성 및 빠른 공유에 완벽함","Permanent Charts are a Pro Feature":"영구 차트는 프로 기능입니다","Playbook":"플레이북","Pointer and container on same line":"같은 줄에 포인터와 컨테이너","Pricing":"가격 정책","Priority One-on-One Support":"우선순위 일대일 지원","Priority support":"우선순위 지원","Privacy Policy":"개인정보보호정책","Pro starts at $4/mo billed yearly. Cancel anytime.":"Pro는 연간 $4에 시작합니다. 언제든지 취소할 수 있습니다.","Pro tip: Right-click any node to customize its shape and color":"팁: 노드를 우클릭하여 모양과 색상을 사용자 정의할 수 있습니다.","Processing Data":"데이터 처리","Processing...":"처리 중...","Prompt":"프롬프트","Public":"공용","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Visio, Lucidchart, CSV에서 데이터 가져오기 또는 템플릿에서 시작하기. 이미 존재하는 것을 다시 만들 필요 없음.","Quick experimentation space that resets daily":"매일 초기화되는 빠른 실험 공간","Random":"무작위","Rapid Deployment Templates":"빠른 배포 템플릿","Rapid Templates":"급변화 템플릿","Raster Export (PNG, JPG)":"래스터 내보내기 (PNG, JPG)","Rate limit exceeded. Please try again later.":"요청 제한이 초과되었습니다. 나중에 다시 시도해주세요.","Read-only":"읽기 전용","Reference by Class":"클래스로 참조","Reference by ID":"ID로 참조","Reference by Label":"레이블로 참조","References":"참조","References are used to create edges between nodes that are created elsewhere in the document":"참조는 문서 내부에서 만들어진 노드 사이에 간선을 만들기 위해 사용됩니다.","Referencing a node by its exact label":"정확한 레이블로 노드를 참조하기","Referencing a node by its unique ID":"고유한 ID로 노드를 참조하기","Referencing multiple nodes with the same assigned class":"동일한 할당 된 클래스로 여러 노드를 참조하기 ","Refresh Page":"페이지 새로 고침 ","Reload to Update":"업데이트하려면 다시 로드하기 ","Rename":"이름 바꾸기","Rename {0}":[["0"],"의 이름 바꾸기"],"Request Magic Link":"마법 링크 요청","Request Password Reset":"비밀번호 재설정 요청","Reset":"재설정","Reset Password":"비밀번호 재설정","Resume Subscription":"구독 재개","Return":"반품","Right to Left":"오른쪽에서 왼쪽으로","Right-click nodes for options":"옵션을 위해 노드를 오른쪽 클릭하세요","Roadmap":"로드맵","Rotate Label":"라벨 회전","SVG Export is a Pro Feature":"SVG 내보내기는 프로 기능입니다","SVG, PDF & all export formats":"SVG, PDF 및 모든 내보내기 형식","Satisfaction guaranteed or first payment refunded":"만족도 보장 또는 첫 번째 결제 환불","Save":"구하다","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"로컬에 저장하고 오프라인에서 작업하며 정확히 누가 무엇을 볼 수 있는지 제어합니다. 데이터는 사용자가 허용하지 않는 한 컴퓨터를 벗어나지 않습니다.","Save time with AI and dictation, making it easy to create diagrams.":"인공지능과 딕테이션을 통해 시간을 절약하고 쉽게 다이어그램을 작성할 수 있습니다.","Save to Cloud":"클라우드에 저장하기","Save to File":"파일에 저장하기","Save your Work":"작업 저장","Schedule personal consultation sessions":"개인 상담 세션 일정 잡기","Secure payment":"안전한 결제","See more reviews on Product Hunt":"Product Hunt에서 더 많은 리뷰를 확인하세요","See what\'s possible":"가능한 것을 확인하세요","Select a destination folder for \\"{0}\\".":"\\\\에 대한 대상 폴더 선택","Send us a message":"메시지 보내기","Set a consistent height for all nodes":"모든 노드의 일관된 높이 설정하기","Settings":"설정","Share":"공유하기","Sign In":"로그인","Sign in with <0>GitHub":"<0>GitHub으로 로그인","Sign in with <0>Google":"<0>Google으로 로그인","Sorry! This page is only available in English.":"죄송합니다! 이 페이지는 영어로만 제공됩니다.","Sorry, there was an error converting the text to a flowchart. Try again later.":"죄송합니다, 텍스트를 플로우차트로 변환하는 중에 오류가 발생했습니다. 나중에 다시 시도해주세요.","Sort Ascending":"오름차순 정렬하기","Sort Descending":"내림차순 정렬","Sort by {0}":[["0"],"로 정렬"],"Source Arrow Shape":"소스 화살표 모양","Source Column":"소스 열","Source Delimiter":"소스 구분자","Source Distance From Node":"노드에서 소스 거리","Source/Target Arrow Shape":"소스/대상 화살표 모양","Spacing":"간격","Special Attributes":"특별한 속성","Start":"시작","Start Over":"처음부터 다시 시작하기","Start faster with use-case specific templates":"사용 사례에 맞는 템플릿으로 더 빠르게 시작하기","Start for free":"무료로 시작하기","Status":"상태","Step 1":"단계 1","Step 2":"단계 2","Step 3":"단계 3","Store any data associated to a node":"노드에 관련된 모든 데이터 저장하기","Style Classes":"스타일 클래스","Style with classes":"클래스로 스타일링","Submit":"보내다","Subscription":"구독","Subscription Successful!":"구독 성공!","Subscription will end":"구독이 종료될 예정입니다.","Support":"지원","Target Arrow Shape":"대상 화살표 모양","Target Column":"대상 열","Target Delimiter":"대상 구분자","Target Distance From Node":"노드로부터의 목표 거리","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"AI에게 필요한 것을 평문으로 말해주세요. 당신의 다이어그램은 몇 초만에 자동으로 생성됩니다.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"잘 작동하는 부분과 문제가 있는 부분을 알려주세요. 모든 메시지는 개발자가 읽습니다.","Text Color":"텍스트 색상","Text Horizontal Offset":"텍스트 수평 오프셋","Text Leading":"텍스트 리딩","Text Max Width":"텍스트 최대 너비","Text Vertical Offset":"텍스트 수직 오프셋","Text followed by colon+space creates an edge with the text as the label":"콜론 뒤에 공백이 따라오는 텍스트는 텍스트를 레이블로 하는 엣지를 만듭니다.","Text on a line creates a node with the text as the label":"한 줄에 있는 텍스트는 텍스트를 레이블로 하는 노드를 만듭니다.","Thank you for your feedback!":"피드백을 해주셔서 감사합니다!","The beauty and magic reside in the minimalism.":"아름다움과 마법은 최소주의에 있습니다.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"스타일을 변경하는 가장 좋은 방법은 노드 또는 엣지를 오른쪽 클릭하고 원하는 스타일을 선택하는 것입니다.","The column that contains the edge label(s)":"엣지 레이블이 포함된 열","The column that contains the source node ID(s)":"소스 노드 ID가 포함된 열","The column that contains the target node ID(s)":"타겟 노드 ID가 포함된 열","The delimiter used to separate multiple source nodes":"여러 개의 소스 노드를 구분하기 위해 사용되는 구분 기호","The delimiter used to separate multiple target nodes":"여러 개의 목표 노드를 구분하기 위해 사용되는 구분 기호","The fastest way to turn what\'s in your head into something everyone else can understand.":"머리 속에 있는 것을 다른 사람들이 이해할 수 있는 것으로 바꾸는 가장 빠른 방법입니다.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"무료 요금제는 일상적인 사용에 적합합니다. Pro 기능이 필요한 경우 매월 $6로 이용 가능하며, 언제든지 해지할 수 있습니다.","The possible shapes are:":"가능한 모양은 다음과 같습니다:","Theme":"테마","Theme Customization Editor":"테마 커스터마이즈 편집기","Theme Editor":"테마 편집기","Theme editor":"테마 편집기","There are no edges in this data":"이 데이터에는 엣지가 없습니다.","This action cannot be undone.":"이 작업은 취소할 수 없습니다.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"이 기능은 프로 사용자에게만 제공됩니다. <0>프로 사용자가 되어 이 기능을 사용할 수 있게 하세요.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"입력 길이에 따라 30초에서 2분 사이의 시간이 소요될 수 있습니다.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"이 모래상자는 실험하기에 완벽하지만 기억하세요 - 매일 초기화됩니다. 지금 업그레이드하고 현재 작업을 유지하세요!","This will replace the current content.":"이것은 현재 내용을 대체합니다.","This will replace your current chart content with the template content.":"이것은 템플릿 콘텐츠로 현재 차트 콘텐츠를 대체합니다.","This will replace your current sandbox.":"이것은 현재 샌드 박스를 대체합니다.","Time to decide":"결정할 시간","Tip":"팁","To fix this change one of the edge IDs":"이를 수정하려면, 가장자리 ID 중 하나를 변경하십시오.","To fix this change one of the node IDs":"이것을 수정하려면 노드 ID 중 하나를 변경하십시오","To fix this move one pointer to the next line":"이것을 수정하려면 포인터를 다음 줄로 이동하십시오","To fix this start the container <0/> on a different line":"이것을 수정하려면 컨테이너 <0/>을 다른 줄에 시작하십시오","To learn more about why we require you to log in, please read <0>this blog post.":"왜 로그인을 해야하는지 자세히 알아보려면 <0>이 블로그 글을 읽어보세요.","Top to Bottom":"위에서 아래로","Transform Your Ideas into Professional Diagrams in Seconds":"초 내에 전문 다이어그램으로 생각을 변형하세요.","Transform text into diagrams instantly":"텍스트를 즉시 다이어그램으로 변환하세요.","Try AI":"AI 시도해보기","Try adjusting your search or filters to find what you\'re looking for.":"검색 또는 필터를 조정하여 원하는 내용을 찾아보세요.","Try again":"다시 시도하세요","Try it free":"무료로 시도해보세요","Turn documents into diagrams with AI":"문서를 AI로 다이어그램으로 변환","Two edges have the same ID":"두 개의 간선이 같은 ID를 가지고 있습니다","Two nodes have the same ID":"두 개의 노드가 같은 ID를 가지고 있습니다","Type it. See it.":"입력하고 보세요.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"이런, 무료 요청이 모두 소진되었습니다! 무제한 다이어그램 변환을 위해 Flowchart Fun Pro로 업그레이드하고 텍스트를 복사하여 쉽게 명확한 시각적 흐름도로 변환하세요.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"60초 이내에. 몇 줄의 텍스트를 입력하거나 인공지능에게 필요한 것을 설명하면 즉시 다이어그램이 나타납니다. 한 번의 클릭으로 내보내거나 공유하세요.","Undo":"취소","Unescaped special character":"이스케이프되지 않은 특수 문자","Unique text value to identify a node":"노드를 식별하기 위한 고유한 텍스트 값","Unknown":"알 수 없음","Unknown Parsing Error":"알 수 없는 구문 분석 오류","Unlimited Flowcharts":"무제한 다이어그램","Unlimited Permanent Flowcharts":"무제한 영구 플로차트","Unlimited cloud-saved flowcharts":"무제한 클라우드 저장 플로우차트","Unlimited saved diagrams":"무제한 저장된 다이어그램","Unlock AI Features and never lose your work with a Pro account.":"AI 기능 잠금 해제 및 프로 계정으로 작업을 절대 잃지 않습니다.","Unlock Unlimited AI Flowcharts":"무제한 AI 플로우차트 잠금 해제","Unpaid":"미납","Update Email":"이메일 업데이트","Updated Date":"업데이트 날짜","Upgrade Now - Save My Work":"지금 업그레이드 - 내 작업 저장","Upgrade to Flowchart Fun Pro and unlock:":"Flowchart Fun Pro로 업그레이드하고 다음을 잠금 해제하세요:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"무제한 호스팅 차트, 워터마크 없는 고해상도 내보내기, AI 편집 등을 위한 Flowchart Fun Pro 업그레이드. 매년 $4에 청구됩니다.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Flowchart Fun Pro로 업그레이드하여 SVG 내보내기를 잠금 해제하고 다이어그램에 대한 더 고급 기능을 즐기세요.","Upgrade to Pro":"프로로 업그레이드","Upgrade to Pro for permanent charts.":"프로로 업그레이드하면 영구적인 차트를 사용할 수 있습니다.","Upload your File":"파일을 업로드하세요.","Use Custom CSS Only":"사용자 정의 CSS만 사용","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Lucidchart나 Visio를 사용하고 계신가요? CSV 가져오기를 통해 모든 소스에서 데이터를 쉽게 가져올 수 있습니다!","Use classes to group nodes":"노드를 그룹화하기 위해 클래스를 사용하십시오.","Use the attribute <0>href to set a link on a node that opens in a new tab.":"새 탭에서 링크를 설정하기 위해 속성 <0>href을 사용하십시오.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"노드의 이미지를 설정하려면 <0>src 속성을 사용하세요. 이미지는 노드에 맞게 크기가 조정되므로 노드의 너비와 높이를 조절해야 할 수도 있습니다. CORS로 차단되지 않은 공개 이미지만 지원됩니다.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"노드의 너비와 높이를 명시적으로 설정하려면 <0>w 및 <1>h 속성을 사용하세요.","Use the customer portal to change your billing information.":"청구 정보를 변경하려면 고객 포털을 사용하십시오.","Use these settings to adapt the look and behavior of your flowcharts":"이 설정을 사용하여 흐름 도표의 모양과 동작을 조정하십시오","Use this file for org charts, hierarchies, and other organizational structures.":"조직도, 계층 구조 및 기타 조직 구조를 위해 이 파일을 사용하십시오.","Use this file for sequences, processes, and workflows.":"시퀀스, 프로세스 및 워크플로우에 대해 이 파일을 사용하십시오.","Use this mode to modify and enhance your current chart.":"현재 차트를 수정하고 개선하는 데 이 모드를 사용하세요.","Used at":"사용처","User":"사용자","Vector Export (SVG)":"벡터 내보내기 (SVG)","View on Github":"Github에서 보기","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"문서에서 플로우차트를 만들고 싶으세요? 편집기에 붙여넣고 \'플로우차트로 변환\'을 클릭하세요.","Watermark-Free Diagrams":"워터마크 없는 다이어그램","Watermarks":"물감","Welcome to Flowchart Fun":"Flowchart Fun에 오신 것을 환영합니다","What if I just need it for one project?":"한 프로젝트에만 필요한 경우 어떻게 해야 하나요?","What our users are saying":"우리 사용자들의 이야기","What\'s next?":"다음은 무엇인가요?","What\'s this?":"이것이 무엇인가요?","Width":"너비","Width and Height":"너비와 높이","Will my diagrams actually look professional?":"내 다이어그램이 전문적으로 보일까요?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Flowchart Fun의 Pro 버전을 사용하면 자연어 명령을 사용하여 흐름도 세부 정보를 빠르게 완성할 수 있으며, 이동 중에 다이어그램을 만드는 데 이상적입니다. 매월 $6로 접근 가능한 AI 편집의 편리함을 느껴보세요.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"프로 버전으로는 로컬 파일을 저장하고 불러올 수 있습니다. 오프라인에서 작업 관련 문서를 관리하는 데 최적입니다.","Would you like to continue?":"계속하시겠습니까?","Would you like to suggest a new example?":"새로운 예시를 제안하시겠습니까?","Wrap text in parentheses to connect to any node":"괄호 안에 텍스트를 감싸서 어떤 노드에 연결하세요","Write like an outline":"아웃라인처럼 작성하세요","Write your prompt here or click to enable the microphone, then press and hold to record.":"여기에 프롬프트를 작성하거나 마이크를 활성화하려면 클릭한 다음 눌러서 녹음하세요.","Yearly":"연간","Yes — send us a message and we\'ll set you up with a discounted rate.":"네 - 메시지를 보내주세요, 그리고 할인된 가격으로 설정해드릴게요.","Yes, Replace Content":"예, 콘텐츠 대체하기","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"네. 모든 다이어그램은 균형 잡힌, 자동 레이아웃과 깔끔한 타이포그래피를 사용합니다. 테마, 색상, 스타일을 사용자 정의할 수 있으며, 선명한 SVG 또는 고해상도 PNG로 내보낼 수 있어서 어떤 프레젠테이션이나 문서에서도 멋지게 보입니다.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"네. Pro는 Visio, Lucidchart, CSV에서 가져오기를 지원합니다 - 따라서 처음부터 다시 만들지 않고 이미 있는 것을 가져올 수 있습니다.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"예. 로컬로 파일을 저장하고 불러올 수 있으며 완전히 오프라인에서 작업할 수 있으며 다이어그램을 볼 수 있는 사람을 정확하게 제어할 수 있습니다. 데이터는 공유하지 않는 한 기기를 떠나지 않습니다.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["그래프에 ",["numNodes"],"개의 노드와 ",["numEdges"],"개의 간선을 추가하려고 합니다."],"You need to log in to access this page.":"페이지에 접근하려면 로그인해야합니다.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"이미 프로 사용자입니다. <0>구독 관리<1/>질문이나 기능 요청이 있으신가요? <2>문의하기","You\'re doing great!":"잘하고 있어요!","You\'re on the free plan.":"무료 요금제를 사용 중입니다.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"모든 무료 AI 변환을 사용하셨습니다. 무제한 AI 사용, 사용자 정의 테마, 개인 공유 등을 위해 Pro로 업그레이드하세요. 쉽게 멋진 플로우차트를 만들어 나가세요!","Your Charts":"당신의 차트","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"당신의 샌드박스는 우리의 플로우차트 도구로 자유롭게 실험할 수 있는 공간으로, 매일 새로운 시작을 위해 재설정됩니다.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"당신의 차트는 계정이 더 이상 활성화되지 않았기 때문에 읽기 전용입니다. <0>계정 페이지를 방문하여 자세한 내용을 알아보세요.","Your next diagram should be your best one.":"다음 다이어그램은 최고의 작품이 되어야 합니다.","Your subscription is <0>{statusDisplay}.":["귀하의 구독 상태는 <0>",["statusDisplay"],"입니다."],"Your work stays yours":"작업물은 당신의 것으로 남습니다.","Zoom In":"확대","Zoom Out":"축소하기","month":"월","or":"또는","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/ko/messages.po b/app/src/locales/ko/messages.po index 53a714b75..83f64e580 100644 --- a/app/src/locales/ko/messages.po +++ b/app/src/locales/ko/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "연간 $48 (33% 할인) · 언제든지 취소 가능" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "월 $6" @@ -25,7 +25,7 @@ msgstr "월 $6" msgid "1 Temporary Flowchart" msgstr "1 임시 플로차트" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "한 번에 1개의 다이어그램" @@ -33,7 +33,7 @@ msgstr "한 번에 1개의 다이어그램" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>사용자 정의 CSS만이 활성화되었습니다. 레이아웃과 고급 설정만 적용됩니다." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun은 <1>Tone Row가 만든 오픈 소스 프로젝트입니다." @@ -49,7 +49,7 @@ msgstr "새로운 버전의 앱이 사용 가능합니다. 업데이트하려면 msgid "AI Creation & Editing" msgstr "AI 생성 및 편집" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "AI 생성 및 편집" @@ -57,7 +57,7 @@ msgstr "AI 생성 및 편집" msgid "AI-Powered Flowchart Creation" msgstr "인공지능 기반 플로우차트 생성" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "일반 텍스트에서 5초 이내에 AI로 생성됨." @@ -65,12 +65,12 @@ msgstr "일반 텍스트에서 5초 이내에 AI로 생성됨." msgid "AI-powered editing to supercharge your workflow" msgstr "워크플로우를 강화하기 위한 AI 기반 편집 기능" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "소개" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "계정" @@ -106,7 +106,7 @@ msgstr "수직 정렬" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "하루 커피 값보다 저렴한 월 $6로 이 모든 것을 이용하세요 ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "항상 프레젠테이션용으로 준비됨" @@ -118,7 +118,7 @@ msgstr "금액" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "오류가 발생하였습니다. 다시 제출하거나 {0}으로 직접 이메일을 보내주십시오." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "외관" @@ -170,11 +170,11 @@ msgstr "배경색" msgid "Basic Flowchart" msgstr "기본 플로우 차트" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "깃허브 스폰서가 되기" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "프로 사용자가 되기" @@ -191,8 +191,8 @@ msgstr "매년 $48로 청구됩니다" msgid "Billed monthly at $6" msgstr "매달 $6에 청구됩니다." -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "블로그" @@ -260,14 +260,14 @@ msgstr "일부 속성은 요소의 모양 또는 기능을 사용자 정의하 msgid "Change Email Address" msgstr "이메일 주소 변경" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "변경 로그" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "차트" @@ -346,7 +346,7 @@ msgstr "열" msgid "Comment" msgstr "댓글 달기" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "커뮤니티 템플릿" @@ -403,7 +403,7 @@ msgstr "흐름도로 변환" msgid "Convert to hosted chart?" msgstr "호스팅 차트로 변환하시겠습니까?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "쿠키 정책" @@ -500,7 +500,7 @@ msgstr "사용자 정의 CSS" msgid "Custom Sharing Options" msgstr "커스텀 공유 옵션" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "사용자 정의 공유 및 공개 링크" @@ -516,8 +516,8 @@ msgstr "매일 샌드박스 편집기" msgid "Dark" msgstr "다크" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "다크 모드" @@ -542,11 +542,11 @@ msgstr "삭제" msgid "Delete {0}" msgstr "{0} 삭제" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "설명하면 나타납니다" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "아이디어를 설명하세요. 발표할 가치가 있는 다이어그램을 얻으세요." @@ -696,8 +696,8 @@ msgstr "AI로 편집하기" msgid "Editable" msgstr "편집 가능" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "에디터" @@ -742,7 +742,7 @@ msgstr "아래에 이메일 주소를 입력하면 비밀번호 재설정을 위 msgid "Equal To" msgstr "같음" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "모든 다이어그램은 선명한 PNG, SVG 또는 공유 가능한 링크로 내보낼 수 있습니다 - 회의, 문서 또는 프레젠테이션에 준비 완료." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "기능 분해" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "피드백" @@ -823,11 +823,15 @@ msgstr "고정된 노드 높이" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Flowchart Fun Pro는 매달 $6로 무제한 플로우차트, 무제한 공동 작업자 및 무제한 저장 공간을 제공합니다." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun은 <0>Tone Row가 만든 오픈 소스 프로젝트입니다." + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun은 한 명의 개발자가 만들고 유지보수합니다. 당신의 지원으로 계속 운영됩니다." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "트위터에서 우리를 팔로우하기" @@ -909,6 +913,10 @@ msgstr "초록색?" msgid "Grid" msgstr "그리드" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "그룹 순위 및 순위 선택 투표, 무료" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "복잡한 문제가 있나요? 여기에서 도와드리겠습니다." @@ -980,7 +988,7 @@ msgstr "CSV 파일에서 데이터를 가져와 새로운 플로우 차트로 msgid "Import from CSV" msgstr "CSV로 가져오기" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Visio, Lucidchart, CSV에서 가져오기" @@ -988,7 +996,7 @@ msgstr "Visio, Lucidchart, CSV에서 가져오기" msgid "Import from Visio, Lucidchart, and CSV" msgstr "Visio, Lucidchart 및 CSV에서 가져오기" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "어디에서든 가져오기" @@ -1012,7 +1020,7 @@ msgstr "<0>title 속성을 사용하여 제목을 포함시키십시오. Vis msgid "Indent to connect nodes" msgstr "노드를 연결하기 위해 들여쓰기하세요." -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "정보" @@ -1052,7 +1060,7 @@ msgstr "계속 연습하세요" msgid "Keep your data private on your computer" msgstr "컴퓨터에서 데이터를 개인적으로 보호하기" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "언어" @@ -1101,8 +1109,8 @@ msgstr "취소하는 이유를 알려주세요. 우리는 항상 개선하고 msgid "Light" msgstr "라이트" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "라이트 모드" @@ -1160,8 +1168,8 @@ msgstr "오프라인 접속을 위한 로컬 저장 기능" msgid "Lock Zoom to Graph" msgstr "그래프에 룩 줌을 고정하다" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "로그인" @@ -1177,11 +1185,15 @@ msgstr "로그인하여 저장하기" msgid "Log in to upgrade your account" msgstr "계정 업그레이드를 위해 로그인" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "<0>Tone Row가 만들었습니다." + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "한 번 선물하기" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "나만의 것으로 만들기" @@ -1205,6 +1217,18 @@ msgstr "노드 내부 텍스트의 최대 너비" msgid "Monthly" msgstr "월간" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "Tone Row에서 더 보기" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "Tone Row에서 더 보기:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "더 많은 도구:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "차트 이름" msgid "Name your chart" msgstr "차트 이름 지정" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "신규" @@ -1363,7 +1387,7 @@ msgstr "아니면 파란색으로!" msgid "Organization Chart" msgstr "조직도" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "PNG 및 JPG 내보내기" @@ -1412,21 +1436,25 @@ msgstr "플레이북" msgid "Pointer and container on same line" msgstr "같은 줄에 포인터와 컨테이너" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "가격 정책" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "우선순위 일대일 지원" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "우선순위 지원" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "개인정보보호정책" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "Pro는 연간 $4에 시작합니다. 언제든지 취소할 수 있습니다." @@ -1451,7 +1479,7 @@ msgstr "프롬프트" msgid "Public" msgstr "공용" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Visio, Lucidchart, CSV에서 데이터 가져오기 또는 템플릿에서 시작하기. 이미 존재하는 것을 다시 만들 필요 없음." @@ -1575,8 +1603,8 @@ msgstr "오른쪽에서 왼쪽으로" msgid "Right-click nodes for options" msgstr "옵션을 위해 노드를 오른쪽 클릭하세요" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "로드맵" @@ -1590,7 +1618,7 @@ msgstr "라벨 회전" msgid "SVG Export is a Pro Feature" msgstr "SVG 내보내기는 프로 기능입니다" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, PDF 및 모든 내보내기 형식" @@ -1603,7 +1631,7 @@ msgstr "만족도 보장 또는 첫 번째 결제 환불" msgid "Save" msgstr "구하다" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "로컬에 저장하고 오프라인에서 작업하며 정확히 누가 무엇을 볼 수 있는지 제어합니다. 데이터는 사용자가 허용하지 않는 한 컴퓨터를 벗어나지 않습니다." @@ -1635,7 +1663,7 @@ msgstr "안전한 결제" msgid "See more reviews on Product Hunt" msgstr "Product Hunt에서 더 많은 리뷰를 확인하세요" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "가능한 것을 확인하세요" @@ -1651,9 +1679,9 @@ msgstr "메시지 보내기" msgid "Set a consistent height for all nodes" msgstr "모든 노드의 일관된 높이 설정하기" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "설정" @@ -1738,7 +1766,7 @@ msgstr "처음부터 다시 시작하기" msgid "Start faster with use-case specific templates" msgstr "사용 사례에 맞는 템플릿으로 더 빠르게 시작하기" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "무료로 시작하기" @@ -1789,7 +1817,7 @@ msgstr "구독 성공!" msgid "Subscription will end" msgstr "구독이 종료될 예정입니다." -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "지원" @@ -1812,7 +1840,7 @@ msgstr "대상 구분자" msgid "Target Distance From Node" msgstr "노드로부터의 목표 거리" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "AI에게 필요한 것을 평문으로 말해주세요. 당신의 다이어그램은 몇 초만에 자동으로 생성됩니다." @@ -1856,7 +1884,7 @@ msgstr "한 줄에 있는 텍스트는 텍스트를 레이블로 하는 노드 msgid "Thank you for your feedback!" msgstr "피드백을 해주셔서 감사합니다!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "아름다움과 마법은 최소주의에 있습니다." @@ -1884,7 +1912,7 @@ msgstr "여러 개의 소스 노드를 구분하기 위해 사용되는 구분 msgid "The delimiter used to separate multiple target nodes" msgstr "여러 개의 목표 노드를 구분하기 위해 사용되는 구분 기호" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "머리 속에 있는 것을 다른 사람들이 이해할 수 있는 것으로 바꾸는 가장 빠른 방법입니다." @@ -1911,7 +1939,7 @@ msgstr "테마 커스터마이즈 편집기" msgid "Theme Editor" msgstr "테마 편집기" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "테마 편집기" @@ -2000,10 +2028,14 @@ msgstr "검색 또는 필터를 조정하여 원하는 내용을 찾아보세요 msgid "Try again" msgstr "다시 시도하세요" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "무료로 시도해보세요" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "문서를 AI로 다이어그램으로 변환" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "두 개의 간선이 같은 ID를 가지고 있습니다" @@ -2012,7 +2044,7 @@ msgstr "두 개의 간선이 같은 ID를 가지고 있습니다" msgid "Two nodes have the same ID" msgstr "두 개의 노드가 같은 ID를 가지고 있습니다" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "입력하고 보세요." @@ -2057,7 +2089,7 @@ msgstr "무제한 영구 플로차트" msgid "Unlimited cloud-saved flowcharts" msgstr "무제한 클라우드 저장 플로우차트" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "무제한 저장된 다이어그램" @@ -2089,13 +2121,17 @@ msgstr "지금 업그레이드 - 내 작업 저장" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Flowchart Fun Pro로 업그레이드하고 다음을 잠금 해제하세요:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "무제한 호스팅 차트, 워터마크 없는 고해상도 내보내기, AI 편집 등을 위한 Flowchart Fun Pro 업그레이드. 매년 $4에 청구됩니다." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Flowchart Fun Pro로 업그레이드하여 SVG 내보내기를 잠금 해제하고 다이어그램에 대한 더 고급 기능을 즐기세요." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "프로로 업그레이드" @@ -2152,7 +2188,7 @@ msgstr "시퀀스, 프로세스 및 워크플로우에 대해 이 파일을 사 msgid "Use this mode to modify and enhance your current chart." msgstr "현재 차트를 수정하고 개선하는 데 이 모드를 사용하세요." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "사용처" @@ -2164,7 +2200,7 @@ msgstr "사용자" msgid "Vector Export (SVG)" msgstr "벡터 내보내기 (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Github에서 보기" @@ -2302,7 +2338,7 @@ msgstr "당신의 샌드박스는 우리의 플로우차트 도구로 자유롭 msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "당신의 차트는 계정이 더 이상 활성화되지 않았기 때문에 읽기 전용입니다. <0>계정 페이지를 방문하여 자세한 내용을 알아보세요." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "다음 다이어그램은 최고의 작품이 되어야 합니다." @@ -2310,7 +2346,7 @@ msgstr "다음 다이어그램은 최고의 작품이 되어야 합니다." msgid "Your subscription is <0>{statusDisplay}." msgstr "귀하의 구독 상태는 <0>{statusDisplay}입니다." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "작업물은 당신의 것으로 남습니다." @@ -2333,10 +2369,10 @@ msgid "or" msgstr "또는" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/pt-br/messages.js b/app/src/locales/pt-br/messages.js index 10467e169..0d7db38fe 100644 --- a/app/src/locales/pt-br/messages.js +++ b/app/src/locales/pt-br/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"R$48/ano (33% de desconto) · Cancelar a qualquer momento","$6/mo":"R$6/mês","1 Temporary Flowchart":"1 Fluxograma Temporário","1 diagram at a time":"1 diagrama por vez","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Somente CSS Personalizado está habilitado. Somente as configurações de Layout e Avançadas serão aplicadas.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun é um projeto de código aberto feito por <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Entrar / <1>Cadastrar com e-mail e senha","A new version of the app is available. Please reload to update.":"Uma nova versão do aplicativo está disponível. Por favor, recarregue para atualizar.","AI Creation & Editing":"Criação e Edição de IA","AI generation & editing":"Geração e edição de IA","AI-Powered Flowchart Creation":"Criação de fluxogramas com Inteligência Artificial","AI-generated from plain text in under 5 seconds.":"Gerado por IA a partir de texto simples em menos de 5 segundos.","AI-powered editing to supercharge your workflow":"Edição com inteligência artificial para turbinar seu fluxo de trabalho","About":"Sobre","Account":"Conta","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Adicione uma barra invertida (<0>\\\\) antes de quaisquer caracteres especiais: <1>(, <2>:, <3>#, ou <4>.","Add some steps":"Adicione alguns passos","Advanced":"Avançado","Align Horizontally":"Alinhar Horizontalmente","Align Nodes":"Alinhar Nós","Align Vertically":"Alinhar Verticalmente","All this for just $6/month - less than your daily coffee ☕":"Tudo isso por apenas $6/mês - menos que o seu café diário ☕","Always presentation-ready":"Sempre pronto para apresentação","Amount":"Total","An error occurred. Try resubmitting or email {0} directly.":["Ocorreu um erro. Tente reenviar ou envie um e-mail direto para ",["0"],"."],"Appearance":"Aparência","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Tem certeza de que deseja excluir o fluxograma? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Tem certeza de que deseja excluir a pasta? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Tem certeza de que deseja excluir a pasta? ","Are you sure?":"Tem certeza?","Arrow Size":"Tamanho da Seta","Attributes":"Atributos","August 2023":"Agosto de 2023","Back":"Voltar","Back To Editor":"Voltar ao editor","Background Color":"Cor de Fundo","Basic Flowchart":"Fluxograma Básico","Become a Github Sponsor":"Seja um patrocinador do Github","Become a Pro User":"Se torne um usuário Pro","Begin your journey":"Comece sua jornada","Billed annually at $48":"Cobrado anualmente a $48","Billed monthly at $6":"Cobrado mensalmente em $6","Blog":"Blog","Book a Meeting":"Reserve uma Reunião","Border Color":"Cor da Borda","Border Width":"Largura da Borda","Bottom to Top":"De baixo para cima","Breadthfirst":"Por extensão","Build your personal flowchart library":"Construa sua biblioteca pessoal de fluxogramas","Can I import my existing diagrams?":"Posso importar meus diagramas existentes?","Cancel":"Cancelar","Cancel anytime":"Cancelar a qualquer momento","Cancel your subscription. Your hosted charts will become read-only.":"Cancele sua inscrição. Seus diagramas hospedados não serão modificáveis.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certos atributos podem ser usados para personalizar a aparência ou funcionalidade dos elementos.","Change Email Address":"Mude o endereço de email","Changelog":"Registro de alterações","Charts":"Diagramas","Check out the guide:":"Confira o guia:","Check your email for a link to log in.<0/>You can close this window.":"Verifique seu e-mail para um link para fazer login. Você pode fechar esta janela.","Choose":"Escolha","Choose Template":"Escolha o Modelo","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Escolha entre uma variedade de formas de seta para a origem e o destino de uma aresta. As formas incluem triângulo, triângulo-tee, triângulo-círculo, triângulo-cruz, triângulo-curva-inversa, vee, tee, quadrado, círculo, diamante, chevron e nenhum.","Choose how edges connect between nodes":"Escolha como as arestas se conectam entre os nós","Choose how nodes are automatically arranged in your flowchart":"Escolha como os nós são automaticamente dispostos em seu fluxograma","Circle":"Círculo","Classes":"Classes","Clear":"Apagar","Clear text?":"Limpar o texto?","Clone":"Clonar","Clone Flowchart":"Clonar Fluxograma","Close":"Fechar","Color":"Cor","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"As cores incluem vermelho, laranja, amarelo, azul, roxo, preto, branco e cinza.","Column":"Coluna","Comment":"Comente","Community templates":"Modelos da comunidade","Compare our plans and find the perfect fit for your flowcharting needs":"Compare nossos planos e encontre o ajuste perfeito para suas necessidades de fluxograma","Concentric":"Concêntrico","Confirm New Email":"Confirme o novo email","Confirm your email address to sign in.":"Confirme seu endereço de e-mail para fazer login.","Connect your Data":"Conecte seus Dados","Containers":"Recipientes","Containers are nodes that contain other nodes. They are declared using curly braces.":"Os containers são nós que contêm outros nós. Eles são declarados usando chaves.","Continue":"Continuar","Continue in Sandbox (Resets daily, work not saved)":"Continuar no Sandbox (Redefine diariamente, trabalho não salvo)","Controls the flow direction of hierarchical layouts":"Controla a direção do fluxo dos layouts hierárquicos","Convert":"Converter","Convert to Flowchart":"Converter para Fluxograma","Convert to hosted chart?":"Converter em diagrama hospedado?","Cookie Policy":"Política de Cookies","Copied SVG code to clipboard":"Código SVG copiado para a área de transferência","Copied {format} to clipboard":[["format"]," copiado para a área de transferência"],"Copy":"Copiar","Copy PNG Image":"Copiar imagem PNG","Copy SVG Code":"Copiar código SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copie o seu código Excalidraw e cole-o em <0>excalidraw.com para editar. Esta funcionalidade é experimental e pode não funcionar com todos os diagramas. Se você encontrar um bug, por favor <1>deixe-nos saber.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copie seu código mermaid.js ou abra diretamente no editor ao vivo mermaid.js.","Create":"Criar","Create Flowcharts using AI":"Criar Fluxogramas usando IA","Create Unlimited Flowcharts":"Crie fluxogramas ilimitados","Create a New Chart":"Criar um Novo Gráfico","Create a flowchart showing the steps of planning and executing a school fundraising event":"Criar um fluxograma mostrando os passos de planejamento e execução de um evento de arrecadação de fundos escolar","Create a new flowchart to get started or organize your work with folders.":"Crie um novo fluxograma para começar ou organize seu trabalho com pastas.","Create flowcharts instantly: Type or paste text, see it visualized.":"Crie fluxogramas instantaneamente: Digite ou cole o texto, veja-o visualizado.","Create unlimited diagrams for just $6/month!":"Crie diagramas ilimitados por apenas $6/mês!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Crie fluxogramas ilimitados armazenados na nuvem - acessíveis em qualquer lugar!","Create with AI":"Crie com IA","Created Date":"Data de Criação","Creating an edge between two nodes is done by indenting the second node below the first":"Criar uma aresta entre dois nós é feito indentando o segundo nó abaixo do primeiro","Curve Style":"Estilo de Curva","Custom CSS":"CSS Personalizado","Custom Sharing Options":"Opções de Compartilhamento Personalizadas","Custom sharing & public links":"Compartilhamento personalizado e links públicos","Customer Portal":"Portal do cliente","Daily Sandbox Editor":"Editor de Sandbox diário","Dark":"Escuro","Dark Mode":"Modo escuro","Data Import (Visio, Lucidchart, CSV)":"Importação de dados (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Funcionalidade de importação de dados para diagramas complexos","Date":"Data","Delete":"Excluir","Delete {0}":["Excluir ",["0"]],"Describe it and it appears":"Descreva e ele aparecerá","Describe your idea. Get a diagram worth presenting.":"Descreva sua ideia. Obtenha um diagrama que vale a pena apresentar.","Design a software development lifecycle flowchart for an agile team":"Projetar um fluxograma do ciclo de vida de desenvolvimento de software para uma equipe ágil","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Desenvolver uma árvore de decisão para um CEO avaliar novas oportunidades de mercado potenciais","Direction":"Direção","Dismiss":"Dispensar","Do you offer discounts for students or nonprofits?":"Vocês oferecem descontos para estudantes ou organizações sem fins lucrativos?","Do you want to delete this?":"Você deseja deletar isso?","Document":"Documento","Don\'t Lose Your Work":"Não Perca Seu Trabalho","Download":"Baixar","Download JPG":"Baixar JPG","Download PNG":"Baixar PNG","Download SVG":"Baixar SVG","Drag and drop a CSV file here, or click to select a file":"Arraste e solte um arquivo CSV aqui ou clique para selecionar um arquivo","Draw an edge from multiple nodes by beginning the line with a reference":"Desenhe uma aresta de vários nós começando a linha com uma referência","Drop the file here ...":"Solte o arquivo aqui ...","Each line becomes a node":"Cada linha se torna um nó","Edge ID, Classes, Attributes":"ID de Borda, Classes, Atributos","Edge Label":"Rótulo de Borda","Edge Label Column":"Coluna de Rótulo de Borda","Edge Style":"Estilo de Borda","Edge Text Size":"Tamanho do Texto da Borda","Edge missing indentation":"Recuo em falta na borda","Edges":"Bordas","Edges are declared in the same row as their source node":"As bordas são declaradas na mesma linha que seu nó de origem","Edges are declared in the same row as their target node":"As bordas são declaradas na mesma linha que seu nó de destino","Edges are declared in their own row":"As bordas são declaradas em sua própria linha","Edges can also have ID\'s, classes, and attributes before the label":"As bordas também podem ter ID\'s, classes e atributos antes da etiqueta","Edges can be styled with dashed, dotted, or solid lines":"As bordas podem ser estilizadas com linhas tracejadas, pontilhadas ou sólidas","Edges in Separate Rows":"Bordas em Linhas Separadas","Edges in Source Node Row":"Bordas na Linha do Nó de Origem","Edges in Target Node Row":"Bordas na Linha do Nó de Destino","Edit":"Editar","Edit with AI":"Edição com IA","Editable":"Editável","Editor":"Editor","Email":"E-mail","Empty":"Vazio","Enable to set a consistent height for all nodes":"Ativar para definir uma altura consistente para todos os nós","Enter a name for the cloned flowchart.":"Insira um nome para o fluxograma clonado.","Enter a name for the new folder.":"Insira um nome para a nova pasta.","Enter a new name for the {0}.":["Insira um novo nome para o ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Digite seu endereço de e-mail e enviaremos um link mágico para fazer login.","Enter your email address below and we\'ll send you a link to reset your password.":"Digite seu endereço de e-mail abaixo e enviaremos um link para redefinir sua senha.","Equal To":"Igual a","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Cada diagrama é exportado em PNG, SVG ou link compartilhável - pronto para a reunião, o documento ou a apresentação.","Everything you need to know about Flowchart Fun Pro":"Tudo o que você precisa saber sobre o Flowchart Fun Pro","Examples":"Exemplos","Excalidraw":"Excalidraw","Exclusive Office Hours":"Horário de atendimento exclusivo","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experimente a eficiência e segurança de carregar arquivos locais diretamente em seu fluxograma, perfeito para gerenciar documentos relacionados ao trabalho offline. Desbloqueie esse recurso exclusivo do Pro e muito mais com o Flowchart Fun Pro, disponível por apenas $6/mês.","Explore Pro":"Explore Pro","Explore more":"Explore mais","Export":"Exportar","Export clean diagrams without branding":"Exporte diagramas limpos sem marcação","Export to PNG & JPG":"Exportar para PNG e JPG","Export to PNG, JPG, and SVG":"Exportar para PNG, JPG e SVG","Feature Breakdown":"Descrição das funcionalidades","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Sinta-se à vontade para explorar e entrar em contato conosco através da página <0>Feedback se tiver alguma preocupação.","Fine-tune layouts and visual styles":"Ajuste layouts e estilos visuais","Fixed Height":"Altura fixa","Fixed Node Height":"Altura do Nó Fixa","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"O Flowchart Fun Pro oferece fluxogramas ilimitados, colaboradores ilimitados e armazenamento ilimitado por apenas $6/mês.","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun é construído e mantido por um único desenvolvedor. Seu apoio mantém ele funcionando.","Follow Us on Twitter":"Siga-nos no Twitter","Font Family":"Família de Fontes","Forgot your password?":"Esqueceu sua senha?","Free":"Grátis ","Free users: charts in the sandbox expire after 7 days.":"Usuários gratuitos: os gráficos no sandbox expiram após 7 dias.","Frequently Asked Questions":"Perguntas frequentes","Full-screen, read-only, and template sharing":"Compartilhamento em tela cheia, somente leitura e modelos","Fullscreen":"Tela cheia","General":"Geral","Generate flowcharts from text automatically":"Gere fluxogramas automaticamente a partir de texto","Get Pro Access Now":"Obtenha acesso Pro agora","Get Unlimited AI Requests":"Obtenha solicitações ilimitadas de IA","Get rapid responses to your questions":"Obtenha respostas rápidas para suas perguntas","Get unlimited flowcharts and premium features":"Obtenha fluxogramas ilimitados e recursos premium","Go back home":"Volte para casa","Go to the Editor":"Vá para o Editor","Go to your Sandbox":"Vá para sua caixa de areia","Graph":"Diagrama","Green?":"Verde?","Grid":"Grade","Have complex questions or issues? We\'re here to help.":"Tem questões ou problemas complexos? Estamos aqui para ajudar.","Here are some Pro features you can now enjoy.":"Aqui estão algumas funcionalidades Pro que você pode desfrutar agora.","High-quality exports with embedded fonts":"Exportações de alta qualidade com fontes incorporadas","History":"Histórico","Home":"Página inicial","How are edges declared in this data?":"Como as arestas são declaradas nestes dados?","How fast can I actually make something?":"Quão rápido posso realmente criar algo?","How would you like to save your chart?":"Como você gostaria de salvar seu gráfico?","I would like to request a new template:":"Eu gostaria de solicitar um novo modelo:","ID\'s":"IDs","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Se uma conta com esse e-mail existir, enviamos um e-mail com instruções sobre como redefinir sua senha.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Se você quiser criar uma borda, indente esta linha. Se não, escape o dois-pontos com uma barra invertida <0>\\\\:","Images":"Imagens","Import Data":"Importar dados","Import data from a CSV file.":"Importar dados de um arquivo CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importar dados de qualquer arquivo CSV e mapeá-los para um novo fluxograma. Esta é uma ótima maneira de importar dados de outras fontes, como Lucidchart, Google Sheets e Visio.","Import from CSV":"Importar do CSV","Import from Visio, Lucidchart, CSV":"Importar do Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importar de Visio, Lucidchart e CSV","Import from anywhere":"Importar de qualquer lugar","Import from popular diagram tools":"Importe de ferramentas populares de diagramas","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importe seu diagrama para o Microsoft Visio usando um desses arquivos CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importar dados é um recurso profissional. Você pode atualizar para o Flowchart Fun Pro por apenas $6/mês.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Inclua um título usando um atributo <0>title. Para usar a coloração do Visio, adicione um atributo <1>roleType igual a uma das seguintes opções:","Indent to connect nodes":"Identar para conectar os nós","Info":"Informações","Is":"É","Is my data private?":"Meus dados são privados?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"O JSON Canvas é uma representação JSON do seu diagrama usado pelo <0>Obsidian Canvas e outras aplicações.","Join 2000+ professionals who\'ve upgraded their workflow":"Junte-se a mais de 2000 profissionais que aprimoraram seu fluxo de trabalho","Join thousands of happy users who love Flowchart Fun":"Junte-se a milhares de usuários felizes que amam o Flowchart Fun","Keep Things Private":"Mantenha as coisas privadas","Keep changes?":"Manter alterações?","Keep practicing":"Continue praticando","Keep your data private on your computer":"Mantenha seus dados privados em seu computador","Language":"Idioma","Layout":"Layout","Layout Algorithm":"Algoritmo de layout","Layout Frozen":"Layout Congelado","Leading References":"Principais Referências","Learn More":"Saber mais","Learn Syntax":"Aprender Sintaxe","Learn about Flowchart Fun Pro":"Saiba mais sobre o Flowchart Fun Pro","Left to Right":"Da esquerda para direita","Let us know why you\'re canceling. We\'re always looking to improve.":"Deixe-nos saber por que você está cancelando. Estamos sempre procurando melhorar.","Light":"Claro","Light Mode":"Modo claro","Link":"Link","Link back":"Voltar ao link","Load":"Carregar","Load Chart":"Carregar Gráfico","Load File":"Carregar Arquivo","Load Files":"Carregar Arquivos","Load default content":"Carregar conteúdo padrão","Load from link?":"Carregar a partir do link?","Load layout and styles":"Carregar layout e estilos","Loading...":"Carregando...","Local File Support":"Suporte de Arquivo Local","Local saving for offline access":"Salvamento local para acesso offline","Lock Zoom to Graph":"Bloquear Zoom para o Gráfico","Log In":"Acessar","Log Out":"Deslogar","Log in to Save":"Faça login para salvar","Log in to upgrade your account":"Faça login para atualizar sua conta","Make a One-Time Donation":"Faça uma Doação Única","Make it yours":"Faça-o seu","Make publicly accessible":"Tornar publicamente acessível","Manage Billing":"Gerenciar Faturamento","Map Data":"Mapear Dados","Maximum width of text inside nodes":"Largura máxima do texto dentro dos nós","Monthly":"Mensal","Move":"Mover","Move {0}":["Mover ",["0"]],"Multiple pointers on same line":"Múltiplos ponteiros na mesma linha","My dog ate my credit card!":"Meu cachorro comeu meu cartão de crédito!","Name":"Nome","Name Chart":"Nome do Gráfico","Name your chart":"Dê um nome ao seu gráfico","New":"Novo","New Email":"Novo Email","New Flowchart":"Novo Fluxograma","New Folder":"Nova Pasta","Next charge":"Próxima cobrança","No Edges":"Sem Bordas","No Folder (Root)":"Sem Pasta (Raiz)","No Watermarks!":"Sem Marca d\'Água!","No charts yet":"Nenhum gráfico ainda","No items in this folder":"Nenhum item nesta pasta","No matching charts found":"Nenhum gráfico correspondente encontrado","Node Border Style":"Estilo de Borda do Nó","Node Colors":"Cores do Nó","Node ID":"ID do Nó","Node ID, Classes, Attributes":"ID do Nó, Classes, Atributos","Node Label":"Rótulo do Nó","Node Shape":"Forma do Nó","Node Shapes":"Formas do Nó","Nodes":"Nós","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Nós podem ser estilizados com traços, pontos ou duplos. Bordas também podem ser removidas com border_none.","Not Empty":"Não Vazio","Now you\'re thinking with flowcharts!":"Agora você está pensando com fluxogramas!","Office Hours":"Horário de trabalho","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":" vez em quando, o link mágico acabará em sua pasta de spam. Se você não o vir após alguns minutos, verifique lá ou solicite um novo link.","One on One Support":"Suporte Um a Um","One-on-One Support":"Suporte Individual","Open Customer Portal":"Abra o portal do cliente","Operation canceled":"Operação cancelada","Or maybe blue!":"Ou talvez azul!","Organization Chart":"Gráfico de Organização","PNG & JPG export":"Exportar PNG e JPG","Padding":"Espaçamento","Page not found":"Página não encontrada","Password":"Senha","Past Due":"Atrasado","Paste a document to convert it":"Cole um documento para convertê-lo","Paste your document or outline here to convert it into an organized flowchart.":"Cole seu documento ou esboço aqui para convertê-lo em um fluxograma organizado.","Pasted content detected. Convert to Flowchart Fun syntax?":"Conteúdo colado detectado. Converter para a sintaxe do Flowchart Fun?","Perfect for docs and quick sharing":"Perfeito para documentos e compartilhamento rápido","Permanent Charts are a Pro Feature":"Gráficos permanentes são um recurso Pro","Playbook":"Cartilha","Pointer and container on same line":"Ponteiro e contêiner na mesma linha","Priority One-on-One Support":"Suporte prioritário um a um","Priority support":"Suporte prioritário","Privacy Policy":"Política de Privacidade","Pro starts at $4/mo billed yearly. Cancel anytime.":"O Pro começa em R$4/mês cobrado anualmente. Cancelar a qualquer momento.","Pro tip: Right-click any node to customize its shape and color":"Dica profissional: Clique com o botão direito em qualquer nó para personalizar sua forma e cor.","Processing Data":"Processando Dados","Processing...":"Processando...","Prompt":"Sugestão","Public":"Público","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importe dados do Visio, Lucidchart, CSV ou comece a partir de um modelo. Não é necessário recriar o que já existe.","Quick experimentation space that resets daily":"Espaço de experimentação rápida que é reiniciado diariamente","Random":"Aleatório","Rapid Deployment Templates":"Modelos de implantação rápida","Rapid Templates":"Modelos Rápidos","Raster Export (PNG, JPG)":"Exportação de Raster (PNG, JPG)","Rate limit exceeded. Please try again later.":"Limite de taxa excedido. Por favor, tente novamente mais tarde.","Read-only":"Somente leitura","Reference by Class":"Referência por Classe","Reference by ID":"Referência por ID","Reference by Label":"Referência por Rótulo","References":"Referências","References are used to create edges between nodes that are created elsewhere in the document":"Referências são usadas para criar arestas entre nós que são criados em outro lugar no documento","Referencing a node by its exact label":"Referenciando um nó pelo seu rótulo exato","Referencing a node by its unique ID":"Referenciando um nó pelo seu ID único","Referencing multiple nodes with the same assigned class":"Referenciando vários nós com a mesma classe atribuída","Refresh Page":"Atualizar Página","Reload to Update":"Recarregar para Atualizar","Rename":"Renomear","Rename {0}":["Renomear ",["0"]],"Request Magic Link":"Solicitar Link Mágico","Request Password Reset":"Solicitar Redefinição de Senha","Reset":"Resetar","Reset Password":"Redefinir Senha","Resume Subscription":"Resumir inscrição","Return":"Retornar","Right to Left":"Da direita para esquerda","Right-click nodes for options":"Clique com o botão direito nos nós para ver as opções","Roadmap":"Roteiro","Rotate Label":"Rotular Rotação","SVG Export is a Pro Feature":"A exportação de SVG é uma funcionalidade Pro","SVG, PDF & all export formats":"SVG, PDF e todos os formatos de exportação","Satisfaction guaranteed or first payment refunded":"Satisfação garantida ou primeiro pagamento reembolsado","Save":"Salvar","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Salve localmente, trabalhe offline e controle exatamente quem vê o quê. Nenhum dado sai da sua máquina a menos que você permita.","Save time with AI and dictation, making it easy to create diagrams.":"Economize tempo com IA e ditado, facilitando a criação de diagramas.","Save to Cloud":"Salvar para Nuvem","Save to File":"Salvar para Arquivo","Save your Work":"Salve seu trabalho","Schedule personal consultation sessions":"Agende sessões de consulta pessoal","Secure payment":"Pagamento seguro","See more reviews on Product Hunt":"Veja mais avaliações no Product Hunt","See what\'s possible":"Veja o que é possível","Select a destination folder for \\"{0}\\".":"Selecione uma pasta de destino para \\\\","Send us a message":"Envie-nos uma mensagem","Set a consistent height for all nodes":"Definir uma altura consistente para todos os nós","Settings":"Configurações","Share":"Compartilhar","Sign In":"Entrar","Sign in with <0>GitHub":"Entrar com <0>GitHub","Sign in with <0>Google":"Entrar com <0>Google","Sorry! This page is only available in English.":"Sinto muito! Esta página só está disponível em inglês.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Desculpe, houve um erro ao converter o texto em um fluxograma. Tente novamente mais tarde.","Sort Ascending":"Ordenar em ordem crescente","Sort Descending":"Classificação Descrescente","Sort by {0}":["Classificar por ",["0"]],"Source Arrow Shape":"Forma da Seta de Origem","Source Column":"Coluna de Origem","Source Delimiter":"Delimitador de Origem","Source Distance From Node":"Distância da Origem ao Nó","Source/Target Arrow Shape":"Forma da Seta de Origem/Destino","Spacing":"Espaçamento","Special Attributes":"Atributos Especiais","Start":"Início","Start Over":"Recomeçar","Start faster with use-case specific templates":"Comece mais rápido com modelos específicos de casos de uso","Start for free":"Comece de graça","Status":"Status","Step 1":"Passo 1","Step 2":"Passo 2","Step 3":"Passo 3","Store any data associated to a node":"Armazenar quaisquer dados associados a um nó","Style Classes":"Classes de Estilo","Style with classes":"Estilizar com classes","Submit":"Enviar","Subscription":"Inscrição","Subscription Successful!":"Assinatura bem-sucedida!","Subscription will end":"Inscrição acabará","Support":"Suporte","Target Arrow Shape":"Forma da Seta de Destino","Target Column":"Coluna Alvo","Target Delimiter":"Delimitador Alvo","Target Distance From Node":"Distância-alvo do Nó","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Diga ao AI o que você precisa em inglês simples. Seu diagrama é criado em segundos.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Nos diga o que está funcionando e o que não está. Cada mensagem é lida pelo desenvolvedor.","Text Color":"Cor do Texto","Text Horizontal Offset":"Deslocamento Horizontal do Texto","Text Leading":"Texto Principal","Text Max Width":"Largura Máxima do Texto","Text Vertical Offset":"Deslocamento Vertical do Texto","Text followed by colon+space creates an edge with the text as the label":"Texto seguido de dois-pontos+espaço cria uma aresta com o texto como rótulo","Text on a line creates a node with the text as the label":"Texto em uma linha cria um nó com o texto como rótulo","Thank you for your feedback!":"Agradecimentos pelo seu feedback!","The beauty and magic reside in the minimalism.":"A beleza e a magia residem no minimalismo.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"A melhor maneira de mudar os estilos é clicar com o botão direito do mouse em um nó ou borda e selecionar o estilo desejado.","The column that contains the edge label(s)":"A coluna que contém o(s) rótulo(s) da aresta","The column that contains the source node ID(s)":"A coluna que contém o(s) ID(s) do nó de origem","The column that contains the target node ID(s)":"A coluna que contém o(s) ID(s) do nó de destino","The delimiter used to separate multiple source nodes":"O delimitador usado para separar vários nós de origem","The delimiter used to separate multiple target nodes":"O delimitador usado para separar vários nós de destino","The fastest way to turn what\'s in your head into something everyone else can understand.":"A maneira mais rápida de transformar o que está em sua cabeça em algo que todos possam entender.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"O plano gratuito funciona muito bem para uso diário. Se você precisar de recursos Pro, é mensal por $6/mês - cancele a qualquer momento sem compromisso.","The possible shapes are:":"As formas possíveis são:","Theme":"Tema","Theme Customization Editor":"Editor de Personalização de Temas","Theme Editor":"Editor de Temas","Theme editor":"Editor de tema","There are no edges in this data":"Não há arestas nestes dados","This action cannot be undone.":"Esta ação não pode ser desfeita.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Esta funcionalidade está disponível apenas para usuários Pro. <0>Torne-se um usuário Pro para desbloqueá-la.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Isso pode levar entre 30 segundos e 2 minutos, dependendo do tamanho da sua entrada.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Esta caixa de areia é perfeita para experimentar, mas lembre-se - ela é resetada diariamente. Faça o upgrade agora e mantenha seu trabalho atual!","This will replace the current content.":"Isso substituirá o conteúdo atual.","This will replace your current chart content with the template content.":"Isso irá substituir o conteúdo atual do seu gráfico pelo conteúdo do modelo.","This will replace your current sandbox.":"Isso substituirá sua sandbox atual.","Time to decide":"Hora de decidir","Tip":"Dica","To fix this change one of the edge IDs":"Para corrigir isso, altere um dos IDs de borda","To fix this change one of the node IDs":"Para corrigir isso, altere um dos IDs de nó","To fix this move one pointer to the next line":"Para corrigir isso, mova um ponteiro para a próxima linha","To fix this start the container <0/> on a different line":"Para corrigir isso, inicie o container <0/> em uma linha diferente","To learn more about why we require you to log in, please read <0>this blog post.":"Para saber mais sobre por que precisamos que você faça login, leia <0>este post no blog.","Top to Bottom":"De cima para baixo","Transform Your Ideas into Professional Diagrams in Seconds":"Transforme Suas Ideias em Diagramas Profissionais em Segundos","Transform text into diagrams instantly":"Transforme texto em diagramas instantaneamente.","Try AI":"Experimente IA","Try adjusting your search or filters to find what you\'re looking for.":"Tente ajustar sua pesquisa ou filtros para encontrar o que procura.","Try again":"Tente novamente","Try it free":"Experimente grátis","Two edges have the same ID":"Dois bordos têm o mesmo ID","Two nodes have the same ID":"Dois nós têm o mesmo ID","Type it. See it.":"Digite. Veja.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Ops, você esgotou suas solicitações gratuitas! Atualize para o Flowchart Fun Pro e tenha conversões ilimitadas de diagramas, e continue transformando textos em fluxogramas claros e visuais com a mesma facilidade de copiar e colar.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Em menos de 60 segundos. Digite algumas linhas de texto ou descreva o que você precisa para o AI, e seu diagrama aparece instantaneamente. Exporte ou compartilhe com um clique.","Undo":"Desfazer","Unescaped special character":"Caractere especial não escapado","Unique text value to identify a node":"Valor de texto único para identificar um nó","Unknown":"Desconhecido","Unknown Parsing Error":"Erro de Análise Desconhecido","Unlimited Flowcharts":"Fluxogramas ilimitados.","Unlimited Permanent Flowcharts":"Fluxogramas Permanentes Ilimitados","Unlimited cloud-saved flowcharts":"Fluxogramas ilimitados salvos na nuvem","Unlimited saved diagrams":"Diagramas salvos ilimitados","Unlock AI Features and never lose your work with a Pro account.":"Desbloqueie recursos de IA e nunca perca seu trabalho com uma conta Pro.","Unlock Unlimited AI Flowcharts":"Desbloqueie Fluxogramas de IA ilimitados","Unpaid":"Não pago","Update Email":"Atualizar e-mail","Updated Date":"Data Atualizada","Upgrade Now - Save My Work":"Faça o upgrade agora - Salve Meu Trabalho","Upgrade to Flowchart Fun Pro and unlock:":"Faça o upgrade para o Flowchart Fun Pro e desbloqueie:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Atualize para o Flowchart Fun Pro para desbloquear a exportação de SVG e aproveitar recursos mais avançados para seus diagramas.","Upgrade to Pro":"Atualize para Pro","Upgrade to Pro for permanent charts.":"Atualize para o Pro para gráficos permanentes.","Upload your File":"Faça o upload do seu arquivo","Use Custom CSS Only":"Usar Somente CSS Personalizado","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Usa o Lucidchart ou o Visio? A importação de CSV torna fácil obter dados de qualquer fonte!","Use classes to group nodes":"Use classes para agrupar nós","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Use o atributo <0>href para definir um link em um nó que abra em uma nova guia.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Use o atributo <0>src para definir a imagem de um nó. A imagem será dimensionada para caber no nó, então você pode precisar ajustar a largura e altura do nó para obter o resultado desejado. Apenas imagens públicas (não bloqueadas por CORS) são suportadas.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Use os atributos <0>w e <1>h para definir explicitamente a largura e altura de um nó.","Use the customer portal to change your billing information.":"Use o portal do cliente para alterar suas informações de cobrança.","Use these settings to adapt the look and behavior of your flowcharts":"Use essas configurações para adaptar a aparência e o comportamento de seus fluxogramas","Use this file for org charts, hierarchies, and other organizational structures.":"Use este arquivo para organogramas, hierarquias e outras estruturas organizacionais.","Use this file for sequences, processes, and workflows.":"Use este arquivo para sequências, processos e fluxos de trabalho.","Use this mode to modify and enhance your current chart.":"Use este modo para modificar e aprimorar seu fluxograma atual.","Used at":"Utilizado em","User":"Usuário","Vector Export (SVG)":"Exportação de Vetor (SVG)","View on Github":"Visualizar no Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Quer criar um fluxograma a partir de um documento? Cole-o no editor e clique em \'Converter em Fluxograma\'.","Watermark-Free Diagrams":"Diagramas sem marca d\'água","Watermarks":"Marca d\'água","Welcome to Flowchart Fun":"Bem-vindo ao Flowchart Fun","What if I just need it for one project?":"E se eu só precisar para um projeto?","What our users are saying":"O que nossos usuários estão dizendo","What\'s next?":"E o próximo passo?","What\'s this?":"O que é isso?","Width":"Largura","Width and Height":"Largura e Altura","Will my diagrams actually look professional?":"Meus diagramas terão um aspecto profissional?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Com a versão Pro do Flowchart Fun, você pode usar comandos em linguagem natural para rapidamente detalhar seu fluxograma, ideal para criar diagramas em qualquer lugar. Por apenas $6 por mês, obtenha a facilidade de edição de IA acessível para aprimorar sua experiência de fluxograma.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Com a versão pro, você pode salvar e carregar arquivos locais. É perfeito para gerenciar documentos relacionados ao trabalho offline.","Would you like to continue?":"Você gostaria de continuar?","Would you like to suggest a new example?":"Gostaria de sugerir um novo exemplo?","Wrap text in parentheses to connect to any node":"Envolver o texto entre parênteses para se conectar a qualquer nó","Write like an outline":"Escreva como um esboço","Write your prompt here or click to enable the microphone, then press and hold to record.":"Escreva sua instrução aqui ou clique para ativar o microfone, depois pressione e segure para gravar.","Yearly":"Anualmente","Yes — send us a message and we\'ll set you up with a discounted rate.":"Sim - nos envie uma mensagem e nós lhe daremos uma taxa com desconto.","Yes, Replace Content":"Sim, Substituir Conteúdo","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Sim. Cada diagrama utiliza layouts equilibrados e automáticos com tipografia limpa. Você pode personalizar temas, cores e estilos - e exportar como SVG nítido ou PNG de alta resolução que fica ótimo em qualquer apresentação ou documento.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Sim. A versão Pro suporta importação de Visio, Lucidchart e CSV - assim você pode trazer o que já tem sem precisar recriá-lo do zero.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Sim. Você pode salvar e carregar arquivos localmente, trabalhar completamente offline e controlar exatamente quem vê seus diagramas. Nenhum dado sai da sua máquina a menos que você escolha compartilhar.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Você está prestes a adicionar ",["numNodes"]," nós e ",["numEdges"]," arestas ao seu gráfico."],"You need to log in to access this page.":"Você precisa fazer login para acessar esta página.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Você já é um usuário Pro. <0>Gerenciar Assinatura<1/>Tem perguntas ou solicitações de recursos? <2>Deixe-nos saber","You\'re doing great!":"Você está indo muito bem!","You\'re on the free plan.":"Você está no plano gratuito.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Você usou todas as suas conversões de IA gratuitas. Faça upgrade para o Pro e tenha uso ilimitado de IA, temas personalizados, compartilhamento privado e muito mais. Continue criando incríveis fluxogramas sem esforço!","Your Charts":"Seus Gráficos","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Sua caixa de areia é um espaço para experimentar livremente com nossas ferramentas de fluxograma, resetando todos os dias para um começo fresco.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Seus gráficos são somente leitura porque sua conta não está mais ativa. Visite sua página de <0>conta para saber mais.","Your next diagram should be your best one.":"Seu próximo diagrama deve ser o melhor.","Your subscription is <0>{statusDisplay}.":["Sua assinatura está <0>",["statusDisplay"],"."],"Your work stays yours":"Seu trabalho permanece seu.","Zoom In":"Zoom In","Zoom Out":"Diminuir o zoom","month":"mês","or":"ou","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"R$48/ano (33% de desconto) · Cancelar a qualquer momento","$6/mo":"R$6/mês","1 Temporary Flowchart":"1 Fluxograma Temporário","1 diagram at a time":"1 diagrama por vez","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>Somente CSS Personalizado está habilitado. Somente as configurações de Layout e Avançadas serão aplicadas.","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun é um projeto de código aberto feito por <1>Tone\xA0Row","<0>Sign In / <1>Sign Up with email and password":"<0>Entrar / <1>Cadastrar com e-mail e senha","A new version of the app is available. Please reload to update.":"Uma nova versão do aplicativo está disponível. Por favor, recarregue para atualizar.","AI Creation & Editing":"Criação e Edição de IA","AI generation & editing":"Geração e edição de IA","AI-Powered Flowchart Creation":"Criação de fluxogramas com Inteligência Artificial","AI-generated from plain text in under 5 seconds.":"Gerado por IA a partir de texto simples em menos de 5 segundos.","AI-powered editing to supercharge your workflow":"Edição com inteligência artificial para turbinar seu fluxo de trabalho","About":"Sobre","Account":"Conta","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"Adicione uma barra invertida (<0>\\\\) antes de quaisquer caracteres especiais: <1>(, <2>:, <3>#, ou <4>.","Add some steps":"Adicione alguns passos","Advanced":"Avançado","Align Horizontally":"Alinhar Horizontalmente","Align Nodes":"Alinhar Nós","Align Vertically":"Alinhar Verticalmente","All this for just $6/month - less than your daily coffee ☕":"Tudo isso por apenas $6/mês - menos que o seu café diário ☕","Always presentation-ready":"Sempre pronto para apresentação","Amount":"Total","An error occurred. Try resubmitting or email {0} directly.":["Ocorreu um erro. Tente reenviar ou envie um e-mail direto para ",["0"],"."],"Appearance":"Aparência","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"Tem certeza de que deseja excluir o fluxograma? ","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"Tem certeza de que deseja excluir a pasta? ","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"Tem certeza de que deseja excluir a pasta? ","Are you sure?":"Tem certeza?","Arrow Size":"Tamanho da Seta","Attributes":"Atributos","August 2023":"Agosto de 2023","Back":"Voltar","Back To Editor":"Voltar ao editor","Background Color":"Cor de Fundo","Basic Flowchart":"Fluxograma Básico","Become a Github Sponsor":"Seja um patrocinador do Github","Become a Pro User":"Se torne um usuário Pro","Begin your journey":"Comece sua jornada","Billed annually at $48":"Cobrado anualmente a $48","Billed monthly at $6":"Cobrado mensalmente em $6","Blog":"Blog","Book a Meeting":"Reserve uma Reunião","Border Color":"Cor da Borda","Border Width":"Largura da Borda","Bottom to Top":"De baixo para cima","Breadthfirst":"Por extensão","Build your personal flowchart library":"Construa sua biblioteca pessoal de fluxogramas","Can I import my existing diagrams?":"Posso importar meus diagramas existentes?","Cancel":"Cancelar","Cancel anytime":"Cancelar a qualquer momento","Cancel your subscription. Your hosted charts will become read-only.":"Cancele sua inscrição. Seus diagramas hospedados não serão modificáveis.","Certain attributes can be used to customize the appearance or functionality of elements.":"Certos atributos podem ser usados para personalizar a aparência ou funcionalidade dos elementos.","Change Email Address":"Mude o endereço de email","Changelog":"Registro de alterações","Charts":"Diagramas","Check out the guide:":"Confira o guia:","Check your email for a link to log in.<0/>You can close this window.":"Verifique seu e-mail para um link para fazer login. Você pode fechar esta janela.","Choose":"Escolha","Choose Template":"Escolha o Modelo","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"Escolha entre uma variedade de formas de seta para a origem e o destino de uma aresta. As formas incluem triângulo, triângulo-tee, triângulo-círculo, triângulo-cruz, triângulo-curva-inversa, vee, tee, quadrado, círculo, diamante, chevron e nenhum.","Choose how edges connect between nodes":"Escolha como as arestas se conectam entre os nós","Choose how nodes are automatically arranged in your flowchart":"Escolha como os nós são automaticamente dispostos em seu fluxograma","Circle":"Círculo","Classes":"Classes","Clear":"Apagar","Clear text?":"Limpar o texto?","Clone":"Clonar","Clone Flowchart":"Clonar Fluxograma","Close":"Fechar","Color":"Cor","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"As cores incluem vermelho, laranja, amarelo, azul, roxo, preto, branco e cinza.","Column":"Coluna","Comment":"Comente","Community templates":"Modelos da comunidade","Compare our plans and find the perfect fit for your flowcharting needs":"Compare nossos planos e encontre o ajuste perfeito para suas necessidades de fluxograma","Concentric":"Concêntrico","Confirm New Email":"Confirme o novo email","Confirm your email address to sign in.":"Confirme seu endereço de e-mail para fazer login.","Connect your Data":"Conecte seus Dados","Containers":"Recipientes","Containers are nodes that contain other nodes. They are declared using curly braces.":"Os containers são nós que contêm outros nós. Eles são declarados usando chaves.","Continue":"Continuar","Continue in Sandbox (Resets daily, work not saved)":"Continuar no Sandbox (Redefine diariamente, trabalho não salvo)","Controls the flow direction of hierarchical layouts":"Controla a direção do fluxo dos layouts hierárquicos","Convert":"Converter","Convert to Flowchart":"Converter para Fluxograma","Convert to hosted chart?":"Converter em diagrama hospedado?","Cookie Policy":"Política de Cookies","Copied SVG code to clipboard":"Código SVG copiado para a área de transferência","Copied {format} to clipboard":[["format"]," copiado para a área de transferência"],"Copy":"Copiar","Copy PNG Image":"Copiar imagem PNG","Copy SVG Code":"Copiar código SVG","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"Copie o seu código Excalidraw e cole-o em <0>excalidraw.com para editar. Esta funcionalidade é experimental e pode não funcionar com todos os diagramas. Se você encontrar um bug, por favor <1>deixe-nos saber.","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"Copie seu código mermaid.js ou abra diretamente no editor ao vivo mermaid.js.","Create":"Criar","Create Flowcharts using AI":"Criar Fluxogramas usando IA","Create Unlimited Flowcharts":"Crie fluxogramas ilimitados","Create a New Chart":"Criar um Novo Gráfico","Create a flowchart showing the steps of planning and executing a school fundraising event":"Criar um fluxograma mostrando os passos de planejamento e execução de um evento de arrecadação de fundos escolar","Create a new flowchart to get started or organize your work with folders.":"Crie um novo fluxograma para começar ou organize seu trabalho com pastas.","Create flowcharts instantly: Type or paste text, see it visualized.":"Crie fluxogramas instantaneamente: Digite ou cole o texto, veja-o visualizado.","Create unlimited diagrams for just $6/month!":"Crie diagramas ilimitados por apenas $6/mês!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"Crie fluxogramas ilimitados armazenados na nuvem - acessíveis em qualquer lugar!","Create with AI":"Crie com IA","Created Date":"Data de Criação","Creating an edge between two nodes is done by indenting the second node below the first":"Criar uma aresta entre dois nós é feito indentando o segundo nó abaixo do primeiro","Curve Style":"Estilo de Curva","Custom CSS":"CSS Personalizado","Custom Sharing Options":"Opções de Compartilhamento Personalizadas","Custom sharing & public links":"Compartilhamento personalizado e links públicos","Customer Portal":"Portal do cliente","Daily Sandbox Editor":"Editor de Sandbox diário","Dark":"Escuro","Dark Mode":"Modo escuro","Data Import (Visio, Lucidchart, CSV)":"Importação de dados (Visio, Lucidchart, CSV)","Data import feature for complex diagrams":"Funcionalidade de importação de dados para diagramas complexos","Date":"Data","Delete":"Excluir","Delete {0}":["Excluir ",["0"]],"Describe it and it appears":"Descreva e ele aparecerá","Describe your idea. Get a diagram worth presenting.":"Descreva sua ideia. Obtenha um diagrama que vale a pena apresentar.","Design a software development lifecycle flowchart for an agile team":"Projetar um fluxograma do ciclo de vida de desenvolvimento de software para uma equipe ágil","Develop a decision tree for a CEO to evaluate potential new market opportunities":"Desenvolver uma árvore de decisão para um CEO avaliar novas oportunidades de mercado potenciais","Direction":"Direção","Dismiss":"Dispensar","Do you offer discounts for students or nonprofits?":"Vocês oferecem descontos para estudantes ou organizações sem fins lucrativos?","Do you want to delete this?":"Você deseja deletar isso?","Document":"Documento","Don\'t Lose Your Work":"Não Perca Seu Trabalho","Download":"Baixar","Download JPG":"Baixar JPG","Download PNG":"Baixar PNG","Download SVG":"Baixar SVG","Drag and drop a CSV file here, or click to select a file":"Arraste e solte um arquivo CSV aqui ou clique para selecionar um arquivo","Draw an edge from multiple nodes by beginning the line with a reference":"Desenhe uma aresta de vários nós começando a linha com uma referência","Drop the file here ...":"Solte o arquivo aqui ...","Each line becomes a node":"Cada linha se torna um nó","Edge ID, Classes, Attributes":"ID de Borda, Classes, Atributos","Edge Label":"Rótulo de Borda","Edge Label Column":"Coluna de Rótulo de Borda","Edge Style":"Estilo de Borda","Edge Text Size":"Tamanho do Texto da Borda","Edge missing indentation":"Recuo em falta na borda","Edges":"Bordas","Edges are declared in the same row as their source node":"As bordas são declaradas na mesma linha que seu nó de origem","Edges are declared in the same row as their target node":"As bordas são declaradas na mesma linha que seu nó de destino","Edges are declared in their own row":"As bordas são declaradas em sua própria linha","Edges can also have ID\'s, classes, and attributes before the label":"As bordas também podem ter ID\'s, classes e atributos antes da etiqueta","Edges can be styled with dashed, dotted, or solid lines":"As bordas podem ser estilizadas com linhas tracejadas, pontilhadas ou sólidas","Edges in Separate Rows":"Bordas em Linhas Separadas","Edges in Source Node Row":"Bordas na Linha do Nó de Origem","Edges in Target Node Row":"Bordas na Linha do Nó de Destino","Edit":"Editar","Edit with AI":"Edição com IA","Editable":"Editável","Editor":"Editor","Email":"E-mail","Empty":"Vazio","Enable to set a consistent height for all nodes":"Ativar para definir uma altura consistente para todos os nós","Enter a name for the cloned flowchart.":"Insira um nome para o fluxograma clonado.","Enter a name for the new folder.":"Insira um nome para a nova pasta.","Enter a new name for the {0}.":["Insira um novo nome para o ",["0"],"."],"Enter your email address and we\'ll send you a magic link to sign in.":"Digite seu endereço de e-mail e enviaremos um link mágico para fazer login.","Enter your email address below and we\'ll send you a link to reset your password.":"Digite seu endereço de e-mail abaixo e enviaremos um link para redefinir sua senha.","Equal To":"Igual a","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"Cada diagrama é exportado em PNG, SVG ou link compartilhável - pronto para a reunião, o documento ou a apresentação.","Everything you need to know about Flowchart Fun Pro":"Tudo o que você precisa saber sobre o Flowchart Fun Pro","Examples":"Exemplos","Excalidraw":"Excalidraw","Exclusive Office Hours":"Horário de atendimento exclusivo","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"Experimente a eficiência e segurança de carregar arquivos locais diretamente em seu fluxograma, perfeito para gerenciar documentos relacionados ao trabalho offline. Desbloqueie esse recurso exclusivo do Pro e muito mais com o Flowchart Fun Pro, disponível por apenas $6/mês.","Explore Pro":"Explore Pro","Explore more":"Explore mais","Export":"Exportar","Export clean diagrams without branding":"Exporte diagramas limpos sem marcação","Export to PNG & JPG":"Exportar para PNG e JPG","Export to PNG, JPG, and SVG":"Exportar para PNG, JPG e SVG","Feature Breakdown":"Descrição das funcionalidades","Feedback":"Feedback","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"Sinta-se à vontade para explorar e entrar em contato conosco através da página <0>Feedback se tiver alguma preocupação.","Fine-tune layouts and visual styles":"Ajuste layouts e estilos visuais","Fixed Height":"Altura fixa","Fixed Node Height":"Altura do Nó Fixa","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"O Flowchart Fun Pro oferece fluxogramas ilimitados, colaboradores ilimitados e armazenamento ilimitado por apenas $6/mês.","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun é um projeto de código aberto feito por <0>Tone\xA0Row","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun é construído e mantido por um único desenvolvedor. Seu apoio mantém ele funcionando.","Follow Us on Twitter":"Siga-nos no Twitter","Font Family":"Família de Fontes","Forgot your password?":"Esqueceu sua senha?","Free":"Grátis ","Free users: charts in the sandbox expire after 7 days.":"Usuários gratuitos: os gráficos no sandbox expiram após 7 dias.","Frequently Asked Questions":"Perguntas frequentes","Full-screen, read-only, and template sharing":"Compartilhamento em tela cheia, somente leitura e modelos","Fullscreen":"Tela cheia","General":"Geral","Generate flowcharts from text automatically":"Gere fluxogramas automaticamente a partir de texto","Get Pro Access Now":"Obtenha acesso Pro agora","Get Unlimited AI Requests":"Obtenha solicitações ilimitadas de IA","Get rapid responses to your questions":"Obtenha respostas rápidas para suas perguntas","Get unlimited flowcharts and premium features":"Obtenha fluxogramas ilimitados e recursos premium","Go back home":"Volte para casa","Go to the Editor":"Vá para o Editor","Go to your Sandbox":"Vá para sua caixa de areia","Graph":"Diagrama","Green?":"Verde?","Grid":"Grade","Group ranking and ranked-choice voting, free":"Classificação em grupo e votação de escolha classificada, grátis","Have complex questions or issues? We\'re here to help.":"Tem questões ou problemas complexos? Estamos aqui para ajudar.","Here are some Pro features you can now enjoy.":"Aqui estão algumas funcionalidades Pro que você pode desfrutar agora.","High-quality exports with embedded fonts":"Exportações de alta qualidade com fontes incorporadas","History":"Histórico","Home":"Página inicial","How are edges declared in this data?":"Como as arestas são declaradas nestes dados?","How fast can I actually make something?":"Quão rápido posso realmente criar algo?","How would you like to save your chart?":"Como você gostaria de salvar seu gráfico?","I would like to request a new template:":"Eu gostaria de solicitar um novo modelo:","ID\'s":"IDs","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"Se uma conta com esse e-mail existir, enviamos um e-mail com instruções sobre como redefinir sua senha.","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"Se você quiser criar uma borda, indente esta linha. Se não, escape o dois-pontos com uma barra invertida <0>\\\\:","Images":"Imagens","Import Data":"Importar dados","Import data from a CSV file.":"Importar dados de um arquivo CSV.","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"Importar dados de qualquer arquivo CSV e mapeá-los para um novo fluxograma. Esta é uma ótima maneira de importar dados de outras fontes, como Lucidchart, Google Sheets e Visio.","Import from CSV":"Importar do CSV","Import from Visio, Lucidchart, CSV":"Importar do Visio, Lucidchart, CSV","Import from Visio, Lucidchart, and CSV":"Importar de Visio, Lucidchart e CSV","Import from anywhere":"Importar de qualquer lugar","Import from popular diagram tools":"Importe de ferramentas populares de diagramas","Import your diagram it into Microsoft Visio using one of these CSV files.":"Importe seu diagrama para o Microsoft Visio usando um desses arquivos CSV.","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"Importar dados é um recurso profissional. Você pode atualizar para o Flowchart Fun Pro por apenas $6/mês.","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"Inclua um título usando um atributo <0>title. Para usar a coloração do Visio, adicione um atributo <1>roleType igual a uma das seguintes opções:","Indent to connect nodes":"Identar para conectar os nós","Info":"Informações","Is":"É","Is my data private?":"Meus dados são privados?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"O JSON Canvas é uma representação JSON do seu diagrama usado pelo <0>Obsidian Canvas e outras aplicações.","Join 2000+ professionals who\'ve upgraded their workflow":"Junte-se a mais de 2000 profissionais que aprimoraram seu fluxo de trabalho","Join thousands of happy users who love Flowchart Fun":"Junte-se a milhares de usuários felizes que amam o Flowchart Fun","Keep Things Private":"Mantenha as coisas privadas","Keep changes?":"Manter alterações?","Keep practicing":"Continue praticando","Keep your data private on your computer":"Mantenha seus dados privados em seu computador","Language":"Idioma","Layout":"Layout","Layout Algorithm":"Algoritmo de layout","Layout Frozen":"Layout Congelado","Leading References":"Principais Referências","Learn More":"Saber mais","Learn Syntax":"Aprender Sintaxe","Learn about Flowchart Fun Pro":"Saiba mais sobre o Flowchart Fun Pro","Left to Right":"Da esquerda para direita","Let us know why you\'re canceling. We\'re always looking to improve.":"Deixe-nos saber por que você está cancelando. Estamos sempre procurando melhorar.","Light":"Claro","Light Mode":"Modo claro","Link":"Link","Link back":"Voltar ao link","Load":"Carregar","Load Chart":"Carregar Gráfico","Load File":"Carregar Arquivo","Load Files":"Carregar Arquivos","Load default content":"Carregar conteúdo padrão","Load from link?":"Carregar a partir do link?","Load layout and styles":"Carregar layout e estilos","Loading...":"Carregando...","Local File Support":"Suporte de Arquivo Local","Local saving for offline access":"Salvamento local para acesso offline","Lock Zoom to Graph":"Bloquear Zoom para o Gráfico","Log In":"Acessar","Log Out":"Deslogar","Log in to Save":"Faça login para salvar","Log in to upgrade your account":"Faça login para atualizar sua conta","Made by <0>Tone\xA0Row":"Feito por <0>Tone\xA0Row","Make a One-Time Donation":"Faça uma Doação Única","Make it yours":"Faça-o seu","Make publicly accessible":"Tornar publicamente acessível","Manage Billing":"Gerenciar Faturamento","Map Data":"Mapear Dados","Maximum width of text inside nodes":"Largura máxima do texto dentro dos nós","Monthly":"Mensal","More from Tone Row":"Mais de Tone Row","More from Tone Row:":"Mais de Tone Row:","More tools:":"Mais ferramentas:","Move":"Mover","Move {0}":["Mover ",["0"]],"Multiple pointers on same line":"Múltiplos ponteiros na mesma linha","My dog ate my credit card!":"Meu cachorro comeu meu cartão de crédito!","Name":"Nome","Name Chart":"Nome do Gráfico","Name your chart":"Dê um nome ao seu gráfico","New":"Novo","New Email":"Novo Email","New Flowchart":"Novo Fluxograma","New Folder":"Nova Pasta","Next charge":"Próxima cobrança","No Edges":"Sem Bordas","No Folder (Root)":"Sem Pasta (Raiz)","No Watermarks!":"Sem Marca d\'Água!","No charts yet":"Nenhum gráfico ainda","No items in this folder":"Nenhum item nesta pasta","No matching charts found":"Nenhum gráfico correspondente encontrado","Node Border Style":"Estilo de Borda do Nó","Node Colors":"Cores do Nó","Node ID":"ID do Nó","Node ID, Classes, Attributes":"ID do Nó, Classes, Atributos","Node Label":"Rótulo do Nó","Node Shape":"Forma do Nó","Node Shapes":"Formas do Nó","Nodes":"Nós","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"Nós podem ser estilizados com traços, pontos ou duplos. Bordas também podem ser removidas com border_none.","Not Empty":"Não Vazio","Now you\'re thinking with flowcharts!":"Agora você está pensando com fluxogramas!","Office Hours":"Horário de trabalho","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":" vez em quando, o link mágico acabará em sua pasta de spam. Se você não o vir após alguns minutos, verifique lá ou solicite um novo link.","One on One Support":"Suporte Um a Um","One-on-One Support":"Suporte Individual","Open Customer Portal":"Abra o portal do cliente","Operation canceled":"Operação cancelada","Or maybe blue!":"Ou talvez azul!","Organization Chart":"Gráfico de Organização","PNG & JPG export":"Exportar PNG e JPG","Padding":"Espaçamento","Page not found":"Página não encontrada","Password":"Senha","Past Due":"Atrasado","Paste a document to convert it":"Cole um documento para convertê-lo","Paste your document or outline here to convert it into an organized flowchart.":"Cole seu documento ou esboço aqui para convertê-lo em um fluxograma organizado.","Pasted content detected. Convert to Flowchart Fun syntax?":"Conteúdo colado detectado. Converter para a sintaxe do Flowchart Fun?","Perfect for docs and quick sharing":"Perfeito para documentos e compartilhamento rápido","Permanent Charts are a Pro Feature":"Gráficos permanentes são um recurso Pro","Playbook":"Cartilha","Pointer and container on same line":"Ponteiro e contêiner na mesma linha","Pricing":"Preços","Priority One-on-One Support":"Suporte prioritário um a um","Priority support":"Suporte prioritário","Privacy Policy":"Política de Privacidade","Pro starts at $4/mo billed yearly. Cancel anytime.":"O Pro começa em R$4/mês cobrado anualmente. Cancelar a qualquer momento.","Pro tip: Right-click any node to customize its shape and color":"Dica profissional: Clique com o botão direito em qualquer nó para personalizar sua forma e cor.","Processing Data":"Processando Dados","Processing...":"Processando...","Prompt":"Sugestão","Public":"Público","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"Importe dados do Visio, Lucidchart, CSV ou comece a partir de um modelo. Não é necessário recriar o que já existe.","Quick experimentation space that resets daily":"Espaço de experimentação rápida que é reiniciado diariamente","Random":"Aleatório","Rapid Deployment Templates":"Modelos de implantação rápida","Rapid Templates":"Modelos Rápidos","Raster Export (PNG, JPG)":"Exportação de Raster (PNG, JPG)","Rate limit exceeded. Please try again later.":"Limite de taxa excedido. Por favor, tente novamente mais tarde.","Read-only":"Somente leitura","Reference by Class":"Referência por Classe","Reference by ID":"Referência por ID","Reference by Label":"Referência por Rótulo","References":"Referências","References are used to create edges between nodes that are created elsewhere in the document":"Referências são usadas para criar arestas entre nós que são criados em outro lugar no documento","Referencing a node by its exact label":"Referenciando um nó pelo seu rótulo exato","Referencing a node by its unique ID":"Referenciando um nó pelo seu ID único","Referencing multiple nodes with the same assigned class":"Referenciando vários nós com a mesma classe atribuída","Refresh Page":"Atualizar Página","Reload to Update":"Recarregar para Atualizar","Rename":"Renomear","Rename {0}":["Renomear ",["0"]],"Request Magic Link":"Solicitar Link Mágico","Request Password Reset":"Solicitar Redefinição de Senha","Reset":"Resetar","Reset Password":"Redefinir Senha","Resume Subscription":"Resumir inscrição","Return":"Retornar","Right to Left":"Da direita para esquerda","Right-click nodes for options":"Clique com o botão direito nos nós para ver as opções","Roadmap":"Roteiro","Rotate Label":"Rotular Rotação","SVG Export is a Pro Feature":"A exportação de SVG é uma funcionalidade Pro","SVG, PDF & all export formats":"SVG, PDF e todos os formatos de exportação","Satisfaction guaranteed or first payment refunded":"Satisfação garantida ou primeiro pagamento reembolsado","Save":"Salvar","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"Salve localmente, trabalhe offline e controle exatamente quem vê o quê. Nenhum dado sai da sua máquina a menos que você permita.","Save time with AI and dictation, making it easy to create diagrams.":"Economize tempo com IA e ditado, facilitando a criação de diagramas.","Save to Cloud":"Salvar para Nuvem","Save to File":"Salvar para Arquivo","Save your Work":"Salve seu trabalho","Schedule personal consultation sessions":"Agende sessões de consulta pessoal","Secure payment":"Pagamento seguro","See more reviews on Product Hunt":"Veja mais avaliações no Product Hunt","See what\'s possible":"Veja o que é possível","Select a destination folder for \\"{0}\\".":"Selecione uma pasta de destino para \\\\","Send us a message":"Envie-nos uma mensagem","Set a consistent height for all nodes":"Definir uma altura consistente para todos os nós","Settings":"Configurações","Share":"Compartilhar","Sign In":"Entrar","Sign in with <0>GitHub":"Entrar com <0>GitHub","Sign in with <0>Google":"Entrar com <0>Google","Sorry! This page is only available in English.":"Sinto muito! Esta página só está disponível em inglês.","Sorry, there was an error converting the text to a flowchart. Try again later.":"Desculpe, houve um erro ao converter o texto em um fluxograma. Tente novamente mais tarde.","Sort Ascending":"Ordenar em ordem crescente","Sort Descending":"Classificação Descrescente","Sort by {0}":["Classificar por ",["0"]],"Source Arrow Shape":"Forma da Seta de Origem","Source Column":"Coluna de Origem","Source Delimiter":"Delimitador de Origem","Source Distance From Node":"Distância da Origem ao Nó","Source/Target Arrow Shape":"Forma da Seta de Origem/Destino","Spacing":"Espaçamento","Special Attributes":"Atributos Especiais","Start":"Início","Start Over":"Recomeçar","Start faster with use-case specific templates":"Comece mais rápido com modelos específicos de casos de uso","Start for free":"Comece de graça","Status":"Status","Step 1":"Passo 1","Step 2":"Passo 2","Step 3":"Passo 3","Store any data associated to a node":"Armazenar quaisquer dados associados a um nó","Style Classes":"Classes de Estilo","Style with classes":"Estilizar com classes","Submit":"Enviar","Subscription":"Inscrição","Subscription Successful!":"Assinatura bem-sucedida!","Subscription will end":"Inscrição acabará","Support":"Suporte","Target Arrow Shape":"Forma da Seta de Destino","Target Column":"Coluna Alvo","Target Delimiter":"Delimitador Alvo","Target Distance From Node":"Distância-alvo do Nó","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"Diga ao AI o que você precisa em inglês simples. Seu diagrama é criado em segundos.","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"Nos diga o que está funcionando e o que não está. Cada mensagem é lida pelo desenvolvedor.","Text Color":"Cor do Texto","Text Horizontal Offset":"Deslocamento Horizontal do Texto","Text Leading":"Texto Principal","Text Max Width":"Largura Máxima do Texto","Text Vertical Offset":"Deslocamento Vertical do Texto","Text followed by colon+space creates an edge with the text as the label":"Texto seguido de dois-pontos+espaço cria uma aresta com o texto como rótulo","Text on a line creates a node with the text as the label":"Texto em uma linha cria um nó com o texto como rótulo","Thank you for your feedback!":"Agradecimentos pelo seu feedback!","The beauty and magic reside in the minimalism.":"A beleza e a magia residem no minimalismo.","The best way to change styles is to right-click on a node or an edge and select the style you want.":"A melhor maneira de mudar os estilos é clicar com o botão direito do mouse em um nó ou borda e selecionar o estilo desejado.","The column that contains the edge label(s)":"A coluna que contém o(s) rótulo(s) da aresta","The column that contains the source node ID(s)":"A coluna que contém o(s) ID(s) do nó de origem","The column that contains the target node ID(s)":"A coluna que contém o(s) ID(s) do nó de destino","The delimiter used to separate multiple source nodes":"O delimitador usado para separar vários nós de origem","The delimiter used to separate multiple target nodes":"O delimitador usado para separar vários nós de destino","The fastest way to turn what\'s in your head into something everyone else can understand.":"A maneira mais rápida de transformar o que está em sua cabeça em algo que todos possam entender.","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"O plano gratuito funciona muito bem para uso diário. Se você precisar de recursos Pro, é mensal por $6/mês - cancele a qualquer momento sem compromisso.","The possible shapes are:":"As formas possíveis são:","Theme":"Tema","Theme Customization Editor":"Editor de Personalização de Temas","Theme Editor":"Editor de Temas","Theme editor":"Editor de tema","There are no edges in this data":"Não há arestas nestes dados","This action cannot be undone.":"Esta ação não pode ser desfeita.","This feature is only available to pro users. <0>Become a pro user to unlock it.":"Esta funcionalidade está disponível apenas para usuários Pro. <0>Torne-se um usuário Pro para desbloqueá-la.","This may take between 30 seconds and 2 minutes depending on the length of your input.":"Isso pode levar entre 30 segundos e 2 minutos, dependendo do tamanho da sua entrada.","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"Esta caixa de areia é perfeita para experimentar, mas lembre-se - ela é resetada diariamente. Faça o upgrade agora e mantenha seu trabalho atual!","This will replace the current content.":"Isso substituirá o conteúdo atual.","This will replace your current chart content with the template content.":"Isso irá substituir o conteúdo atual do seu gráfico pelo conteúdo do modelo.","This will replace your current sandbox.":"Isso substituirá sua sandbox atual.","Time to decide":"Hora de decidir","Tip":"Dica","To fix this change one of the edge IDs":"Para corrigir isso, altere um dos IDs de borda","To fix this change one of the node IDs":"Para corrigir isso, altere um dos IDs de nó","To fix this move one pointer to the next line":"Para corrigir isso, mova um ponteiro para a próxima linha","To fix this start the container <0/> on a different line":"Para corrigir isso, inicie o container <0/> em uma linha diferente","To learn more about why we require you to log in, please read <0>this blog post.":"Para saber mais sobre por que precisamos que você faça login, leia <0>este post no blog.","Top to Bottom":"De cima para baixo","Transform Your Ideas into Professional Diagrams in Seconds":"Transforme Suas Ideias em Diagramas Profissionais em Segundos","Transform text into diagrams instantly":"Transforme texto em diagramas instantaneamente.","Try AI":"Experimente IA","Try adjusting your search or filters to find what you\'re looking for.":"Tente ajustar sua pesquisa ou filtros para encontrar o que procura.","Try again":"Tente novamente","Try it free":"Experimente grátis","Turn documents into diagrams with AI":"Transforme documentos em diagramas com IA","Two edges have the same ID":"Dois bordos têm o mesmo ID","Two nodes have the same ID":"Dois nós têm o mesmo ID","Type it. See it.":"Digite. Veja.","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"Ops, você esgotou suas solicitações gratuitas! Atualize para o Flowchart Fun Pro e tenha conversões ilimitadas de diagramas, e continue transformando textos em fluxogramas claros e visuais com a mesma facilidade de copiar e colar.","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"Em menos de 60 segundos. Digite algumas linhas de texto ou descreva o que você precisa para o AI, e seu diagrama aparece instantaneamente. Exporte ou compartilhe com um clique.","Undo":"Desfazer","Unescaped special character":"Caractere especial não escapado","Unique text value to identify a node":"Valor de texto único para identificar um nó","Unknown":"Desconhecido","Unknown Parsing Error":"Erro de Análise Desconhecido","Unlimited Flowcharts":"Fluxogramas ilimitados.","Unlimited Permanent Flowcharts":"Fluxogramas Permanentes Ilimitados","Unlimited cloud-saved flowcharts":"Fluxogramas ilimitados salvos na nuvem","Unlimited saved diagrams":"Diagramas salvos ilimitados","Unlock AI Features and never lose your work with a Pro account.":"Desbloqueie recursos de IA e nunca perca seu trabalho com uma conta Pro.","Unlock Unlimited AI Flowcharts":"Desbloqueie Fluxogramas de IA ilimitados","Unpaid":"Não pago","Update Email":"Atualizar e-mail","Updated Date":"Data Atualizada","Upgrade Now - Save My Work":"Faça o upgrade agora - Salve Meu Trabalho","Upgrade to Flowchart Fun Pro and unlock:":"Faça o upgrade para o Flowchart Fun Pro e desbloqueie:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"Atualize para o Flowchart Fun Pro para gráficos hospedados ilimitados, exportações de alta resolução sem marca d\'água, edição com IA e muito mais. R$4/mês cobrado anualmente.","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"Atualize para o Flowchart Fun Pro para desbloquear a exportação de SVG e aproveitar recursos mais avançados para seus diagramas.","Upgrade to Pro":"Atualize para Pro","Upgrade to Pro for permanent charts.":"Atualize para o Pro para gráficos permanentes.","Upload your File":"Faça o upload do seu arquivo","Use Custom CSS Only":"Usar Somente CSS Personalizado","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"Usa o Lucidchart ou o Visio? A importação de CSV torna fácil obter dados de qualquer fonte!","Use classes to group nodes":"Use classes para agrupar nós","Use the attribute <0>href to set a link on a node that opens in a new tab.":"Use o atributo <0>href para definir um link em um nó que abra em uma nova guia.","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"Use o atributo <0>src para definir a imagem de um nó. A imagem será dimensionada para caber no nó, então você pode precisar ajustar a largura e altura do nó para obter o resultado desejado. Apenas imagens públicas (não bloqueadas por CORS) são suportadas.","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"Use os atributos <0>w e <1>h para definir explicitamente a largura e altura de um nó.","Use the customer portal to change your billing information.":"Use o portal do cliente para alterar suas informações de cobrança.","Use these settings to adapt the look and behavior of your flowcharts":"Use essas configurações para adaptar a aparência e o comportamento de seus fluxogramas","Use this file for org charts, hierarchies, and other organizational structures.":"Use este arquivo para organogramas, hierarquias e outras estruturas organizacionais.","Use this file for sequences, processes, and workflows.":"Use este arquivo para sequências, processos e fluxos de trabalho.","Use this mode to modify and enhance your current chart.":"Use este modo para modificar e aprimorar seu fluxograma atual.","Used at":"Utilizado em","User":"Usuário","Vector Export (SVG)":"Exportação de Vetor (SVG)","View on Github":"Visualizar no Github","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"Quer criar um fluxograma a partir de um documento? Cole-o no editor e clique em \'Converter em Fluxograma\'.","Watermark-Free Diagrams":"Diagramas sem marca d\'água","Watermarks":"Marca d\'água","Welcome to Flowchart Fun":"Bem-vindo ao Flowchart Fun","What if I just need it for one project?":"E se eu só precisar para um projeto?","What our users are saying":"O que nossos usuários estão dizendo","What\'s next?":"E o próximo passo?","What\'s this?":"O que é isso?","Width":"Largura","Width and Height":"Largura e Altura","Will my diagrams actually look professional?":"Meus diagramas terão um aspecto profissional?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"Com a versão Pro do Flowchart Fun, você pode usar comandos em linguagem natural para rapidamente detalhar seu fluxograma, ideal para criar diagramas em qualquer lugar. Por apenas $6 por mês, obtenha a facilidade de edição de IA acessível para aprimorar sua experiência de fluxograma.","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"Com a versão pro, você pode salvar e carregar arquivos locais. É perfeito para gerenciar documentos relacionados ao trabalho offline.","Would you like to continue?":"Você gostaria de continuar?","Would you like to suggest a new example?":"Gostaria de sugerir um novo exemplo?","Wrap text in parentheses to connect to any node":"Envolver o texto entre parênteses para se conectar a qualquer nó","Write like an outline":"Escreva como um esboço","Write your prompt here or click to enable the microphone, then press and hold to record.":"Escreva sua instrução aqui ou clique para ativar o microfone, depois pressione e segure para gravar.","Yearly":"Anualmente","Yes — send us a message and we\'ll set you up with a discounted rate.":"Sim - nos envie uma mensagem e nós lhe daremos uma taxa com desconto.","Yes, Replace Content":"Sim, Substituir Conteúdo","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"Sim. Cada diagrama utiliza layouts equilibrados e automáticos com tipografia limpa. Você pode personalizar temas, cores e estilos - e exportar como SVG nítido ou PNG de alta resolução que fica ótimo em qualquer apresentação ou documento.","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"Sim. A versão Pro suporta importação de Visio, Lucidchart e CSV - assim você pode trazer o que já tem sem precisar recriá-lo do zero.","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"Sim. Você pode salvar e carregar arquivos localmente, trabalhar completamente offline e controlar exatamente quem vê seus diagramas. Nenhum dado sai da sua máquina a menos que você escolha compartilhar.","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["Você está prestes a adicionar ",["numNodes"]," nós e ",["numEdges"]," arestas ao seu gráfico."],"You need to log in to access this page.":"Você precisa fazer login para acessar esta página.","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"Você já é um usuário Pro. <0>Gerenciar Assinatura<1/>Tem perguntas ou solicitações de recursos? <2>Deixe-nos saber","You\'re doing great!":"Você está indo muito bem!","You\'re on the free plan.":"Você está no plano gratuito.","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"Você usou todas as suas conversões de IA gratuitas. Faça upgrade para o Pro e tenha uso ilimitado de IA, temas personalizados, compartilhamento privado e muito mais. Continue criando incríveis fluxogramas sem esforço!","Your Charts":"Seus Gráficos","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"Sua caixa de areia é um espaço para experimentar livremente com nossas ferramentas de fluxograma, resetando todos os dias para um começo fresco.","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"Seus gráficos são somente leitura porque sua conta não está mais ativa. Visite sua página de <0>conta para saber mais.","Your next diagram should be your best one.":"Seu próximo diagrama deve ser o melhor.","Your subscription is <0>{statusDisplay}.":["Sua assinatura está <0>",["statusDisplay"],"."],"Your work stays yours":"Seu trabalho permanece seu.","Zoom In":"Zoom In","Zoom Out":"Diminuir o zoom","month":"mês","or":"ou","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/pt-br/messages.po b/app/src/locales/pt-br/messages.po index d3747c901..752e70897 100644 --- a/app/src/locales/pt-br/messages.po +++ b/app/src/locales/pt-br/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "R$48/ano (33% de desconto) · Cancelar a qualquer momento" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "R$6/mês" @@ -25,7 +25,7 @@ msgstr "R$6/mês" msgid "1 Temporary Flowchart" msgstr "1 Fluxograma Temporário" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "1 diagrama por vez" @@ -33,7 +33,7 @@ msgstr "1 diagrama por vez" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>Somente CSS Personalizado está habilitado. Somente as configurações de Layout e Avançadas serão aplicadas." -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun é um projeto de código aberto feito por <1>Tone Row" @@ -49,7 +49,7 @@ msgstr "Uma nova versão do aplicativo está disponível. Por favor, recarregue msgid "AI Creation & Editing" msgstr "Criação e Edição de IA" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "Geração e edição de IA" @@ -57,7 +57,7 @@ msgstr "Geração e edição de IA" msgid "AI-Powered Flowchart Creation" msgstr "Criação de fluxogramas com Inteligência Artificial" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "Gerado por IA a partir de texto simples em menos de 5 segundos." @@ -65,12 +65,12 @@ msgstr "Gerado por IA a partir de texto simples em menos de 5 segundos." msgid "AI-powered editing to supercharge your workflow" msgstr "Edição com inteligência artificial para turbinar seu fluxo de trabalho" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "Sobre" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "Conta" @@ -106,7 +106,7 @@ msgstr "Alinhar Verticalmente" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "Tudo isso por apenas $6/mês - menos que o seu café diário ☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "Sempre pronto para apresentação" @@ -118,7 +118,7 @@ msgstr "Total" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "Ocorreu um erro. Tente reenviar ou envie um e-mail direto para {0}." -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "Aparência" @@ -170,11 +170,11 @@ msgstr "Cor de Fundo" msgid "Basic Flowchart" msgstr "Fluxograma Básico" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "Seja um patrocinador do Github" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "Se torne um usuário Pro" @@ -191,8 +191,8 @@ msgstr "Cobrado anualmente a $48" msgid "Billed monthly at $6" msgstr "Cobrado mensalmente em $6" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "Blog" @@ -260,14 +260,14 @@ msgstr "Certos atributos podem ser usados para personalizar a aparência ou func msgid "Change Email Address" msgstr "Mude o endereço de email" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "Registro de alterações" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "Diagramas" @@ -346,7 +346,7 @@ msgstr "Coluna" msgid "Comment" msgstr "Comente" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "Modelos da comunidade" @@ -403,7 +403,7 @@ msgstr "Converter para Fluxograma" msgid "Convert to hosted chart?" msgstr "Converter em diagrama hospedado?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Política de Cookies" @@ -500,7 +500,7 @@ msgstr "CSS Personalizado" msgid "Custom Sharing Options" msgstr "Opções de Compartilhamento Personalizadas" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "Compartilhamento personalizado e links públicos" @@ -516,8 +516,8 @@ msgstr "Editor de Sandbox diário" msgid "Dark" msgstr "Escuro" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "Modo escuro" @@ -542,11 +542,11 @@ msgstr "Excluir" msgid "Delete {0}" msgstr "Excluir {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "Descreva e ele aparecerá" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "Descreva sua ideia. Obtenha um diagrama que vale a pena apresentar." @@ -696,8 +696,8 @@ msgstr "Edição com IA" msgid "Editable" msgstr "Editável" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "Editor" @@ -742,7 +742,7 @@ msgstr "Digite seu endereço de e-mail abaixo e enviaremos um link para redefini msgid "Equal To" msgstr "Igual a" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "Cada diagrama é exportado em PNG, SVG ou link compartilhável - pronto para a reunião, o documento ou a apresentação." @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "Descrição das funcionalidades" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "Feedback" @@ -823,11 +823,15 @@ msgstr "Altura do Nó Fixa" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "O Flowchart Fun Pro oferece fluxogramas ilimitados, colaboradores ilimitados e armazenamento ilimitado por apenas $6/mês." -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun é um projeto de código aberto feito por <0>Tone Row" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun é construído e mantido por um único desenvolvedor. Seu apoio mantém ele funcionando." -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "Siga-nos no Twitter" @@ -909,6 +913,10 @@ msgstr "Verde?" msgid "Grid" msgstr "Grade" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "Classificação em grupo e votação de escolha classificada, grátis" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "Tem questões ou problemas complexos? Estamos aqui para ajudar." @@ -980,7 +988,7 @@ msgstr "Importar dados de qualquer arquivo CSV e mapeá-los para um novo fluxogr msgid "Import from CSV" msgstr "Importar do CSV" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "Importar do Visio, Lucidchart, CSV" @@ -988,7 +996,7 @@ msgstr "Importar do Visio, Lucidchart, CSV" msgid "Import from Visio, Lucidchart, and CSV" msgstr "Importar de Visio, Lucidchart e CSV" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "Importar de qualquer lugar" @@ -1012,7 +1020,7 @@ msgstr "Inclua um título usando um atributo <0>title. Para usar a coloraç msgid "Indent to connect nodes" msgstr "Identar para conectar os nós" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "Informações" @@ -1052,7 +1060,7 @@ msgstr "Continue praticando" msgid "Keep your data private on your computer" msgstr "Mantenha seus dados privados em seu computador" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "Idioma" @@ -1101,8 +1109,8 @@ msgstr "Deixe-nos saber por que você está cancelando. Estamos sempre procurand msgid "Light" msgstr "Claro" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "Modo claro" @@ -1160,8 +1168,8 @@ msgstr "Salvamento local para acesso offline" msgid "Lock Zoom to Graph" msgstr "Bloquear Zoom para o Gráfico" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "Acessar" @@ -1177,11 +1185,15 @@ msgstr "Faça login para salvar" msgid "Log in to upgrade your account" msgstr "Faça login para atualizar sua conta" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "Feito por <0>Tone Row" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "Faça uma Doação Única" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "Faça-o seu" @@ -1205,6 +1217,18 @@ msgstr "Largura máxima do texto dentro dos nós" msgid "Monthly" msgstr "Mensal" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "Mais de Tone Row" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "Mais de Tone Row:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "Mais ferramentas:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "Nome do Gráfico" msgid "Name your chart" msgstr "Dê um nome ao seu gráfico" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "Novo" @@ -1363,7 +1387,7 @@ msgstr "Ou talvez azul!" msgid "Organization Chart" msgstr "Gráfico de Organização" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "Exportar PNG e JPG" @@ -1412,21 +1436,25 @@ msgstr "Cartilha" msgid "Pointer and container on same line" msgstr "Ponteiro e contêiner na mesma linha" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "Preços" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "Suporte prioritário um a um" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "Suporte prioritário" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "Política de Privacidade" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "O Pro começa em R$4/mês cobrado anualmente. Cancelar a qualquer momento." @@ -1451,7 +1479,7 @@ msgstr "Sugestão" msgid "Public" msgstr "Público" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "Importe dados do Visio, Lucidchart, CSV ou comece a partir de um modelo. Não é necessário recriar o que já existe." @@ -1575,8 +1603,8 @@ msgstr "Da direita para esquerda" msgid "Right-click nodes for options" msgstr "Clique com o botão direito nos nós para ver as opções" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "Roteiro" @@ -1590,7 +1618,7 @@ msgstr "Rotular Rotação" msgid "SVG Export is a Pro Feature" msgstr "A exportação de SVG é uma funcionalidade Pro" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "SVG, PDF e todos os formatos de exportação" @@ -1603,7 +1631,7 @@ msgstr "Satisfação garantida ou primeiro pagamento reembolsado" msgid "Save" msgstr "Salvar" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "Salve localmente, trabalhe offline e controle exatamente quem vê o quê. Nenhum dado sai da sua máquina a menos que você permita." @@ -1635,7 +1663,7 @@ msgstr "Pagamento seguro" msgid "See more reviews on Product Hunt" msgstr "Veja mais avaliações no Product Hunt" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "Veja o que é possível" @@ -1651,9 +1679,9 @@ msgstr "Envie-nos uma mensagem" msgid "Set a consistent height for all nodes" msgstr "Definir uma altura consistente para todos os nós" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "Configurações" @@ -1738,7 +1766,7 @@ msgstr "Recomeçar" msgid "Start faster with use-case specific templates" msgstr "Comece mais rápido com modelos específicos de casos de uso" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "Comece de graça" @@ -1789,7 +1817,7 @@ msgstr "Assinatura bem-sucedida!" msgid "Subscription will end" msgstr "Inscrição acabará" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "Suporte" @@ -1812,7 +1840,7 @@ msgstr "Delimitador Alvo" msgid "Target Distance From Node" msgstr "Distância-alvo do Nó" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "Diga ao AI o que você precisa em inglês simples. Seu diagrama é criado em segundos." @@ -1856,7 +1884,7 @@ msgstr "Texto em uma linha cria um nó com o texto como rótulo" msgid "Thank you for your feedback!" msgstr "Agradecimentos pelo seu feedback!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "A beleza e a magia residem no minimalismo." @@ -1884,7 +1912,7 @@ msgstr "O delimitador usado para separar vários nós de origem" msgid "The delimiter used to separate multiple target nodes" msgstr "O delimitador usado para separar vários nós de destino" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "A maneira mais rápida de transformar o que está em sua cabeça em algo que todos possam entender." @@ -1911,7 +1939,7 @@ msgstr "Editor de Personalização de Temas" msgid "Theme Editor" msgstr "Editor de Temas" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "Editor de tema" @@ -2000,10 +2028,14 @@ msgstr "Tente ajustar sua pesquisa ou filtros para encontrar o que procura." msgid "Try again" msgstr "Tente novamente" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "Experimente grátis" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "Transforme documentos em diagramas com IA" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "Dois bordos têm o mesmo ID" @@ -2012,7 +2044,7 @@ msgstr "Dois bordos têm o mesmo ID" msgid "Two nodes have the same ID" msgstr "Dois nós têm o mesmo ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "Digite. Veja." @@ -2057,7 +2089,7 @@ msgstr "Fluxogramas Permanentes Ilimitados" msgid "Unlimited cloud-saved flowcharts" msgstr "Fluxogramas ilimitados salvos na nuvem" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "Diagramas salvos ilimitados" @@ -2089,13 +2121,17 @@ msgstr "Faça o upgrade agora - Salve Meu Trabalho" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "Faça o upgrade para o Flowchart Fun Pro e desbloqueie:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "Atualize para o Flowchart Fun Pro para gráficos hospedados ilimitados, exportações de alta resolução sem marca d'água, edição com IA e muito mais. R$4/mês cobrado anualmente." + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "Atualize para o Flowchart Fun Pro para desbloquear a exportação de SVG e aproveitar recursos mais avançados para seus diagramas." #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "Atualize para Pro" @@ -2152,7 +2188,7 @@ msgstr "Use este arquivo para sequências, processos e fluxos de trabalho." msgid "Use this mode to modify and enhance your current chart." msgstr "Use este modo para modificar e aprimorar seu fluxograma atual." -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "Utilizado em" @@ -2164,7 +2200,7 @@ msgstr "Usuário" msgid "Vector Export (SVG)" msgstr "Exportação de Vetor (SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "Visualizar no Github" @@ -2302,7 +2338,7 @@ msgstr "Sua caixa de areia é um espaço para experimentar livremente com nossas msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "Seus gráficos são somente leitura porque sua conta não está mais ativa. Visite sua página de <0>conta para saber mais." -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "Seu próximo diagrama deve ser o melhor." @@ -2310,7 +2346,7 @@ msgstr "Seu próximo diagrama deve ser o melhor." msgid "Your subscription is <0>{statusDisplay}." msgstr "Sua assinatura está <0>{statusDisplay}." -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "Seu trabalho permanece seu." @@ -2333,10 +2369,10 @@ msgid "or" msgstr "ou" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/locales/zh/messages.js b/app/src/locales/zh/messages.js index 592154967..18b199073 100644 --- a/app/src/locales/zh/messages.js +++ b/app/src/locales/zh/messages.js @@ -1,5 +1,5 @@ /*eslint-disable*/ module.exports = { messages: JSON.parse( - '{"$48/year (save 33%) · Cancel anytime":"每年$48(节省33%)· 随时取消","$6/mo":"每月$6","1 Temporary Flowchart":"1 临时流程图","1 diagram at a time":"同时只能有1个图表","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>仅启用自定义CSS。仅应用布局和高级设置。","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun是由<1>Tone Row制作的开源项目","<0>Sign In / <1>Sign Up with email and password":"<0>登录 / <1>注册 使用电子邮件和密码","A new version of the app is available. Please reload to update.":"一个新版本的应用程序可用。请重新加载以更新。","AI Creation & Editing":"AI创建与编辑","AI generation & editing":"AI生成和编辑","AI-Powered Flowchart Creation":"AI驱动的流程图创建","AI-generated from plain text in under 5 seconds.":"从普通文本中在5秒内生成AI","AI-powered editing to supercharge your workflow":"AI动力编辑,让您的工作流程更加高效","About":"关于","Account":"帐户","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"在任何特殊字符之前添加反斜杠 (<0>\\\\): <1>(、<2>:、<3>#或<4>.","Add some steps":"添加一些步骤","Advanced":"高级","Align Horizontally":"水平对齐","Align Nodes":"对齐节点","Align Vertically":"垂直对齐","All this for just $6/month - less than your daily coffee ☕":"所有这些仅需每月6美元 - 不到您每天的咖啡☕","Always presentation-ready":"总是准备好展示","Amount":"数量","An error occurred. Try resubmitting or email {0} directly.":["发生了一个错误。请尝试重新提交或直接发送电子邮件至",["0"],"。"],"Appearance":"外观","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"您确定要删除流程图吗?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"您确定要删除文件夹吗?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"您确定要删除文件夹吗?","Are you sure?":"你确定吗?","Arrow Size":"箭头大小","Attributes":"属性","August 2023":"2023 年 8 月","Back":"返回","Back To Editor":"返回编辑器","Background Color":"背景颜色","Basic Flowchart":"基本流程图","Become a Github Sponsor":"成为Github赞助商","Become a Pro User":"成为专业用户","Begin your journey":"开始你的旅程","Billed annually at $48":"年度账单为$48","Billed monthly at $6":"每月收费$6","Blog":"博客","Book a Meeting":"预订会议","Border Color":"边框颜色","Border Width":"边框宽度","Bottom to Top":"从下到上","Breadthfirst":"宽度优先","Build your personal flowchart library":"建立您的个人流程图库","Can I import my existing diagrams?":"我能导入我的现有图表吗?","Cancel":"取消","Cancel anytime":"随时取消","Cancel your subscription. Your hosted charts will become read-only.":"取消订阅。您的托管图表将变为只读。","Certain attributes can be used to customize the appearance or functionality of elements.":"某些属性可用于自定义元素的外观或功能。","Change Email Address":"更改电子邮件地址","Changelog":"变更日志","Charts":"图表","Check out the guide:":"查看指南:","Check your email for a link to log in.<0/>You can close this window.":"检查您的电子邮件以获取登录链接。您可以关闭此窗口。","Choose":"選擇","Choose Template":"选择模板","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"为边缘的源和目标选择各种箭头形状。形状包括三角形,三角形-T,圆形-三角形,三角形-十字,三角形-后曲线,V形,T形,正方形,圆形,菱形,雪花形,无。","Choose how edges connect between nodes":"选择节点之间的边缘连接方式","Choose how nodes are automatically arranged in your flowchart":"选择如何自动排列您的流程图中的节点","Circle":"圆圈","Classes":"类","Clear":"清除","Clear text?":"清除文字?","Clone":"克隆","Clone Flowchart":"克隆流程图","Close":"关闭","Color":"颜色","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"颜色包括红色,橙色,黄色,蓝色,紫色,黑色,白色和灰色。","Column":"列","Comment":"评论","Community templates":"社区模板","Compare our plans and find the perfect fit for your flowcharting needs":"比较我们的计划,找到最适合您流程图需求的方案","Concentric":"同心","Confirm New Email":"确认新电子邮件","Confirm your email address to sign in.":"確認您的電子郵件地址以登入。","Connect your Data":"连接您的数据","Containers":"容器","Containers are nodes that contain other nodes. They are declared using curly braces.":"容器是包含其他节点的节点。它们使用大括号声明。","Continue":"继续","Continue in Sandbox (Resets daily, work not saved)":"继续使用沙盒(每天重置,工作不会被保存)","Controls the flow direction of hierarchical layouts":"控制层次布局的流向","Convert":"转换","Convert to Flowchart":"转换为流程图","Convert to hosted chart?":"是否转换为托管图表?","Cookie Policy":"Cookie政策","Copied SVG code to clipboard":"将SVG代码复制到剪贴板","Copied {format} to clipboard":["将",["format"],"复制到剪贴板"],"Copy":"复制","Copy PNG Image":"复制PNG图像","Copy SVG Code":"复制 SVG 代码","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"将你的 Excalidraw 代码复制并粘贴到<0>excalidraw.com以进行编辑。此功能为实验性质,可能无法与所有图表一起使用。如果您发现错误,请<1>告诉我们。","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"复制您的mermaid.js代码或直接在mermaid.js实时编辑器中打开它。","Create":"创建","Create Flowcharts using AI":"使用AI创建流程图","Create Unlimited Flowcharts":"创建无限流程图","Create a New Chart":"创建新图表","Create a flowchart showing the steps of planning and executing a school fundraising event":"创建一个流程图,展示规划和执行学校筹款活动的步骤","Create a new flowchart to get started or organize your work with folders.":"创建一个新的流程图开始或使用文件夹组织您的工作。","Create flowcharts instantly: Type or paste text, see it visualized.":"即时创建流程图:输入或粘贴文本,即可可视化。","Create unlimited diagrams for just $6/month!":"仅需每月$6,即可创建无限的图表!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"在云中存储无限流程图- 随时随地可访问!","Create with AI":"通過AI創建","Created Date":"创建日期","Creating an edge between two nodes is done by indenting the second node below the first":"在两个节点之间创建边缘是通过将第二个节点缩进第一个节点来完成的","Curve Style":"曲线样式","Custom CSS":"自定义CSS","Custom Sharing Options":"自定义分享选项","Custom sharing & public links":"自定义共享和公共链接","Customer Portal":"客户门户","Daily Sandbox Editor":"每日沙盒编辑器","Dark":"深色","Dark Mode":"深色模式","Data Import (Visio, Lucidchart, CSV)":"数据导入(Visio,Lucidchart,CSV)","Data import feature for complex diagrams":"数据导入功能,适用于复杂的图表","Date":"日期","Delete":"删除","Delete {0}":["删除 ",["0"]],"Describe it and it appears":"描述它,它就会出现","Describe your idea. Get a diagram worth presenting.":"描述您的想法。得到一个值得展示的图表。","Design a software development lifecycle flowchart for an agile team":"为敏捷团队设计一个软件开发生命周期流程图","Develop a decision tree for a CEO to evaluate potential new market opportunities":"为CEO设计一个决策树,评估潜在的新市场机会","Direction":"方向","Dismiss":"解散","Do you offer discounts for students or nonprofits?":"是否为学生或非营利组织提供折扣?","Do you want to delete this?":"您要将其删除吗?","Document":"文档","Don\'t Lose Your Work":"不要丢失你的工作","Download":"下载","Download JPG":"下载 JPG","Download PNG":"下载 PNG","Download SVG":"下载 SVG","Drag and drop a CSV file here, or click to select a file":"将CSV文件拖放到此处,或单击以选择文件","Draw an edge from multiple nodes by beginning the line with a reference":"通过引用开始行从多个节点绘制边缘","Drop the file here ...":"將檔案拖放到這裡...","Each line becomes a node":"每一行都变成一个节点","Edge ID, Classes, Attributes":"邊緣ID、類別和屬性","Edge Label":"邊緣標籤","Edge Label Column":"邊緣標籤欄","Edge Style":"邊緣樣式","Edge Text Size":"边缘文本大小","Edge missing indentation":"缺少缩进的边","Edges":"边","Edges are declared in the same row as their source node":"边声明在与源节点相同的行中","Edges are declared in the same row as their target node":"边声明在与目标节点相同的行中","Edges are declared in their own row":"边声明在自己的行中","Edges can also have ID\'s, classes, and attributes before the label":"边在标签之前可以有ID,类和属性","Edges can be styled with dashed, dotted, or solid lines":"边可以用虚线,点线或实线样式","Edges in Separate Rows":"边在单独的行","Edges in Source Node Row":"边在源节点行","Edges in Target Node Row":"边在目标节点行","Edit":"编辑","Edit with AI":"利用AI进行编辑","Editable":"可编辑","Editor":"编辑器","Email":"电子邮件","Empty":"空","Enable to set a consistent height for all nodes":"启用统一设置所有节点的高度","Enter a name for the cloned flowchart.":"为克隆的流程图输入名称。","Enter a name for the new folder.":"为新文件夹输入名称。","Enter a new name for the {0}.":["为 ",["0"]," 输入新名称。"],"Enter your email address and we\'ll send you a magic link to sign in.":"輸入您的電子郵件地址,我們將發送給您一個魔法鏈接以登入。","Enter your email address below and we\'ll send you a link to reset your password.":"在下面輸入您的電子郵件地址,我們將發送給您一個重置密碼的鏈接。","Equal To":"等于","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"每个图表都可以导出为清晰的PNG、SVG或可共享的链接 - 准备好参加会议、文档或演示文稿。","Everything you need to know about Flowchart Fun Pro":"有关流程图乐趣专业版的所有信息","Examples":"示例","Excalidraw":"Excalidraw","Exclusive Office Hours":"专属办公时间","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"体验将本地文件直接加载到流程图中的效率和安全性,非常适合离线管理工作相关文件。解锁这个独有的专业功能以及更多功能,Flowchart Fun Pro仅需每月$6即可使用。","Explore Pro":"探索专业版","Explore more":"探索更多","Export":"导出","Export clean diagrams without branding":"导出无品牌标识的清晰图表","Export to PNG & JPG":"导出为PNG和JPG","Export to PNG, JPG, and SVG":"导出为PNG,JPG和SVG","Feature Breakdown":"功能分解","Feedback":"反馈","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"如果您有任何問題,請隨意探索並通過<0>反饋頁面與我們聯繫。","Fine-tune layouts and visual styles":"调整布局和视觉风格","Fixed Height":"固定高度","Fixed Node Height":"固定节点高度","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro为您提供无限的流程图、无限的协作者和无限的存储空间,仅需每月$6即可享用。","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun由一位开发者构建和维护。您的支持使其持续运行。","Follow Us on Twitter":"在Twitter上关注我们","Font Family":"字体系列","Forgot your password?":"忘記密碼了?","Free":"免费","Free users: charts in the sandbox expire after 7 days.":"免费用户:沙盒中的图表在7天后将过期。","Frequently Asked Questions":"经常问的问题","Full-screen, read-only, and template sharing":"全屏、只读和模板共享","Fullscreen":"全屏","General":"一般","Generate flowcharts from text automatically":"自动从文本生成流程图","Get Pro Access Now":"立即获取专业访问权限","Get Unlimited AI Requests":"获得无限的AI请求","Get rapid responses to your questions":"快速获取您的问题的回答","Get unlimited flowcharts and premium features":"获取无限流程图和高级功能","Go back home":"回家","Go to the Editor":"前往編輯器","Go to your Sandbox":"去你的沙盒","Graph":"图表","Green?":"绿色的?","Grid":"网格","Have complex questions or issues? We\'re here to help.":"有复杂的问题或问题吗?我们在这里帮助你。","Here are some Pro features you can now enjoy.":"現在您可以享受以下專業功能。","High-quality exports with embedded fonts":"高质量的导出,内嵌字体","History":"历史","Home":"主页","How are edges declared in this data?":"在这个数据中如何声明边缘?","How fast can I actually make something?":"我到底能有多快地制作出东西?","How would you like to save your chart?":"您想如何保存您的流程图?","I would like to request a new template:":"我想请求一个新的模板:","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"如果該電子郵件存在該帳戶,我們已經發送給您一封電子郵件,其中包含如何重置您的密碼的說明。","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"如果你想创建一个边,缩进这一行。如果不,用反斜杠转义冒号<0>\\\\:","Images":"图像","Import Data":"导入数据","Import data from a CSV file.":"从CSV文件导入数据。","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"從任何CSV檔案匯入資料並將其映射到新的流程圖。這是從Lucidchart、Google Sheets和Visio等其他來源匯入資料的一個很棒的方法。","Import from CSV":"從CSV導入","Import from Visio, Lucidchart, CSV":"从Visio、Lucidchart、CSV导入","Import from Visio, Lucidchart, and CSV":"从Visio,Lucidchart和CSV导入","Import from anywhere":"从任何地方导入","Import from popular diagram tools":"从流行的图表工具导入","Import your diagram it into Microsoft Visio using one of these CSV files.":"使用其中一个CSV文件将您的图表导入到Microsoft Visio中。","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"导入数据是一项专业功能。您可以升级到Flowchart Fun Pro,仅需每月6美元。","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"使用<0>title属性添加标题。要使用 Visio 颜色,请添加一个等于以下内容之一的<1>roleType属性:","Indent to connect nodes":"缩进以连接节点","Info":"信息","Is":"是","Is my data private?":"我的数据是否私密?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON画布是您的图表的JSON表示,由<0>Obsidian Canvas和其他应用程序使用。","Join 2000+ professionals who\'ve upgraded their workflow":"加入2000多位专业人士,升级他们的工作流程","Join thousands of happy users who love Flowchart Fun":"加入成千上万的快乐用户,他们都爱流程图乐趣","Keep Things Private":"保持事物私密","Keep changes?":"保留更改吗?","Keep practicing":"继续练习","Keep your data private on your computer":"在您的电脑上保护您的数据隐私","Language":"语言","Layout":"布局","Layout Algorithm":"布局算法","Layout Frozen":"布局已冻结","Leading References":"主要參考","Learn More":"学到更多","Learn Syntax":"學習語法","Learn about Flowchart Fun Pro":"了解关于Flowchart Fun Pro","Left to Right":"从左到右","Let us know why you\'re canceling. We\'re always looking to improve.":"让我们知道您为什么要取消。我们一直在努力改进。","Light":"浅色","Light Mode":"浅色模式","Link":"链接","Link back":"链接回来","Load":"載入","Load Chart":"加载流程图","Load File":"加载文件","Load Files":"加载多个文件","Load default content":"載入預設內容","Load from link?":"从链接加载?","Load layout and styles":"載入版面和樣式","Loading...":"加载中...","Local File Support":"本地文件支持","Local saving for offline access":"本地保存,实现离线访问","Lock Zoom to Graph":"锁定缩放到图表","Log In":"登录","Log Out":"登出","Log in to Save":"登录以保存","Log in to upgrade your account":"登录升级您的账户","Make a One-Time Donation":"进行一次性捐赠","Make it yours":"让它成为你的","Make publicly accessible":"设为公开访问","Manage Billing":"付款管理","Map Data":"對應資料","Maximum width of text inside nodes":"节点内文本的最大宽度","Monthly":"每月","Move":"移动","Move {0}":["移动 ",["0"]],"Multiple pointers on same line":"同一行上的多个指针","My dog ate my credit card!":"我的狗吃了我的信用卡!","Name":"名称","Name Chart":"命名图表","Name your chart":"为您的流程图命名","New":"新","New Email":"新邮件","New Flowchart":"新流程图","New Folder":"新文件夹","Next charge":"下次扣费","No Edges":"沒有邊緣","No Folder (Root)":"无文件夹(根目录)","No Watermarks!":"无水印!","No charts yet":"还没有图表","No items in this folder":"此文件夹中没有项目","No matching charts found":"没有找到匹配的图表","Node Border Style":"节点边框样式","Node Colors":"节点颜色","Node ID":"节点ID","Node ID, Classes, Attributes":"节点ID、类、属性","Node Label":"节点标签","Node Shape":"节点形状","Node Shapes":"节点形状","Nodes":"节点","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"节点可以使用虚线、点线或双线样式。边框也可以使用 border_none 来移除。","Not Empty":"不为空","Now you\'re thinking with flowcharts!":"现在你在用流程图思考了!","Office Hours":"工作时间","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"偶尔,魔法链接会被放入您的垃圾邮件文件夹。如果几分钟后仍然没有收到,请检查垃圾邮件文件夹,或者重新请求新的链接。","One on One Support":"一对一支持","One-on-One Support":"一对一支持","Open Customer Portal":"打开客户门户","Operation canceled":"操作已取消","Or maybe blue!":"或者也许是蓝色!","Organization Chart":"组织结构图","PNG & JPG export":"PNG和JPG导出","Padding":"填充","Page not found":"找不到页面","Password":"密碼","Past Due":"过期","Paste a document to convert it":"粘贴一个文档来转换它","Paste your document or outline here to convert it into an organized flowchart.":"将您的文档或大纲粘贴到此处,将其转换为有组织的流程图。","Pasted content detected. Convert to Flowchart Fun syntax?":"检测到粘贴内容。转换为流程图乐趣语法?","Perfect for docs and quick sharing":"适用于文档和快速分享","Permanent Charts are a Pro Feature":"永久图表是专业功能","Playbook":"剧本","Pointer and container on same line":"同一行上的指针和容器","Priority One-on-One Support":"优先一对一支持","Priority support":"优先支持","Privacy Policy":"隱私政策","Pro starts at $4/mo billed yearly. Cancel anytime.":"专业版每月4美元,年付。随时取消。","Pro tip: Right-click any node to customize its shape and color":"专业提示:右键点击任何节点可自定义其形状和颜色","Processing Data":"处理数据","Processing...":"处理中...","Prompt":"提示","Public":"公开","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"从Visio,Lucidchart,CSV中导入数据,或从模板开始。无需重新创建已存在的内容。","Quick experimentation space that resets daily":"每日重置的快速实验空间","Random":"随机","Rapid Deployment Templates":"快速部署模板","Rapid Templates":"快速模板","Raster Export (PNG, JPG)":"光栅导出(PNG,JPG)","Rate limit exceeded. Please try again later.":"速率限制超出。 请稍后再试。","Read-only":"只读","Reference by Class":"按类引用","Reference by ID":"按 ID 参考","Reference by Label":"按标签参考","References":"参考","References are used to create edges between nodes that are created elsewhere in the document":"参考用于在文档中其他位置创建的节点之间创建边","Referencing a node by its exact label":"通过其确切标签引用节点","Referencing a node by its unique ID":"通过其唯一ID引用节点","Referencing multiple nodes with the same assigned class":"使用相同分配的类引用多个节点","Refresh Page":"刷新页面","Reload to Update":"重新加载以更新","Rename":"重命名","Rename {0}":["重命名",["0"]],"Request Magic Link":"請求魔法鏈接","Request Password Reset":"請求密碼重置","Reset":"重置","Reset Password":"重置密碼","Resume Subscription":"恢复订阅","Return":"返回","Right to Left":"从右到左","Right-click nodes for options":"右键点击节点以获得选项","Roadmap":"路线图","Rotate Label":"旋转标签","SVG Export is a Pro Feature":"SVG导出是专业功能","SVG, PDF & all export formats":"支持SVG,PDF和所有导出格式","Satisfaction guaranteed or first payment refunded":"满意保证或第一次付款退款","Save":"救球","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"本地保存,离线工作,并且可以精确控制谁可以看到什么。除非您允许,否则不会将数据传输到其他地方。","Save time with AI and dictation, making it easy to create diagrams.":"使用人工智能和口述功能,节省时间,轻松创建图表。","Save to Cloud":"保存到云","Save to File":"保存到文件","Save your Work":"保存您的工作","Schedule personal consultation sessions":"安排个人咨询会话","Secure payment":"安全付款","See more reviews on Product Hunt":"在Product Hunt上查看更多评论","See what\'s possible":"查看可行性","Select a destination folder for \\"{0}\\".":"选择一个目标文件夹 \\\\","Send us a message":"发送我们消息","Set a consistent height for all nodes":"设置所有节点的统一高度","Settings":"设置","Share":"分享","Sign In":"登錄","Sign in with <0>GitHub":"使用<0>GitHub登录","Sign in with <0>Google":"使用<0>Google登录","Sorry! This page is only available in English.":"抱歉!此页面只有英语版。","Sorry, there was an error converting the text to a flowchart. Try again later.":"抱歉,转换文本为流程图时出错。 请稍后再试。","Sort Ascending":"升序排序","Sort Descending":"倒序排列","Sort by {0}":["按",["0"],"排序"],"Source Arrow Shape":"源箭头形状","Source Column":"源列","Source Delimiter":"源分隔符","Source Distance From Node":"源节点距离","Source/Target Arrow Shape":"源/目标箭头形状","Spacing":"间距","Special Attributes":"特殊属性","Start":"开始","Start Over":"重新開始","Start faster with use-case specific templates":"使用特定用例模板加快启动","Start for free":"免费开始","Status":"状态","Step 1":"步骤1","Step 2":"步骤2","Step 3":"步骤3","Store any data associated to a node":"將任何與節點相關的資料儲存","Style Classes":"樣式類別","Style with classes":"用类别进行样式设置","Submit":"提交","Subscription":"订阅","Subscription Successful!":"訂閱成功!","Subscription will end":"订阅即将到期","Support":"支持","Target Arrow Shape":"目标箭头形状","Target Column":"目標欄","Target Delimiter":"目標分隔符","Target Distance From Node":"目標距離節點","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"用简单的英语告诉AI你需要什么。你的图表将在几秒钟内建立。","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"告诉我们什么是有效的,什么是无效的。每条消息都会被开发者阅读。","Text Color":"文字顏色","Text Horizontal Offset":"文本水平偏移","Text Leading":"文字行距","Text Max Width":"文本最大宽度","Text Vertical Offset":"文字垂直偏移","Text followed by colon+space creates an edge with the text as the label":"以冒号加空格结尾的文本将创建一个边,文本作为标签","Text on a line creates a node with the text as the label":"在一行中的文本将创建一个节点,文本作为标签","Thank you for your feedback!":"感谢您的反馈!","The beauty and magic reside in the minimalism.":"美和魔力都在于简约。","The best way to change styles is to right-click on a node or an edge and select the style you want.":"更改样式的最佳方式是右键单击节点或边缘,然后选择所需的样式。","The column that contains the edge label(s)":"包含边标签的列","The column that contains the source node ID(s)":"包含源节点ID的列","The column that contains the target node ID(s)":"包含目标节点ID的列","The delimiter used to separate multiple source nodes":"用于分隔多个源节点的分隔符","The delimiter used to separate multiple target nodes":"用于分隔多个目标节点的分隔符","The fastest way to turn what\'s in your head into something everyone else can understand.":"将你脑海中的想法快速转化成其他人都能理解的东西。","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"免费计划非常适合日常使用。如果你需要专业功能,每月只需支付6美元 - 随时取消,无需承诺。","The possible shapes are:":"可能的形状是:","Theme":"主題","Theme Customization Editor":"主题定制编辑器","Theme Editor":"主题编辑器","Theme editor":"主题编辑器","There are no edges in this data":"此数据中没有边","This action cannot be undone.":"此操作无法撤销。","This feature is only available to pro users. <0>Become a pro user to unlock it.":"只有专业用户才能使用此功能。 <0>成为专业用户解锁。","This may take between 30 seconds and 2 minutes depending on the length of your input.":"这可能需要30秒到2分钟的时间,取决于您输入的长度。","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"这个沙盒非常适合实验,但请记住 - 它每天都会重置。立即升级,保留您当前的工作!","This will replace the current content.":"這將取代目前的內容。","This will replace your current chart content with the template content.":"这将用模板内容替换您当前的图表内容。","This will replace your current sandbox.":"这将替换您当前的沙盒。","Time to decide":"决定的时间到了","Tip":"提示","To fix this change one of the edge IDs":"为了修复这个,改变其中一个边的ID","To fix this change one of the node IDs":"要修复这个,更改其中一个节点ID","To fix this move one pointer to the next line":"要修复这个,将指针移动到下一行","To fix this start the container <0/> on a different line":"要修复这个,将容器<0/>放在另一行","To learn more about why we require you to log in, please read <0>this blog post.":"要了解更多關於我們為什麼要求您登錄的原因,請閱讀<0>這篇博客文章。","Top to Bottom":"从上到下","Transform Your Ideas into Professional Diagrams in Seconds":"秒转换您的想法成专业图表","Transform text into diagrams instantly":"即时将文本转换为图表","Try AI":"尝试人工智能","Try adjusting your search or filters to find what you\'re looking for.":"尝试调整您的搜索或筛选条件以找到您想要的内容。","Try again":"重试","Try it free":"免费试用","Two edges have the same ID":"两个边有相同的ID","Two nodes have the same ID":"两个节点有相同的ID","Type it. See it.":"输入,即可查看","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"哎呀,你的免费请求用完了!升级到Flowchart Fun Pro,享受无限的图表转换功能,轻松将文本转换成清晰的可视化流程图,就像复制粘贴一样简单。","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"不到60秒。输入几行文字或向AI描述您需要的内容,即可立即显示您的图表。一键导出或分享。","Undo":"撤消","Unescaped special character":"未转义的特殊字符","Unique text value to identify a node":"用于标识节点的唯一文本值","Unknown":"未知","Unknown Parsing Error":"未知的解析错误","Unlimited Flowcharts":"无限制的流程图","Unlimited Permanent Flowcharts":"无限永久流程图","Unlimited cloud-saved flowcharts":"无限云端保存的流程图","Unlimited saved diagrams":"无限保存的图表","Unlock AI Features and never lose your work with a Pro account.":"解锁AI功能,通过专业账户永远不会丢失您的工作。","Unlock Unlimited AI Flowcharts":"解锁无限制使用AI流程图","Unpaid":"未付","Update Email":"更新电子邮件","Updated Date":"更新日期","Upgrade Now - Save My Work":"立即升级 - 保存我的工作","Upgrade to Flowchart Fun Pro and unlock:":"升级到Flowchart Fun Pro并解锁:","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"升级到Flowchart Fun Pro,解锁SVG导出功能,并享受更多高级功能来创建您的图表。","Upgrade to Pro":"升級到專業版","Upgrade to Pro for permanent charts.":"升级至专业版,拥有永久的图表。","Upload your File":"上传您的文件","Use Custom CSS Only":"僅使用自定義CSS","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"使用Lucidchart或Visio?CSV导入使从任何来源获取数据变得容易!","Use classes to group nodes":"使用类来分组节点","Use the attribute <0>href to set a link on a node that opens in a new tab.":"使用属性<0>href在节点上设置一个在新标签页中打开的链接。","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"使用属性<0>src来设置节点的图像,图像将被缩放以适应节点,因此您可能需要调整节点的宽度和高度以获得期望的结果。仅支持公共图像(不受CORS阻止)。","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"使用属性<0>w和<1>h显式设置节点的宽度和高度。","Use the customer portal to change your billing information.":"使用客户门户更改您的账单信息。","Use these settings to adapt the look and behavior of your flowcharts":"使用这些设置来调整流程图的外观和行为","Use this file for org charts, hierarchies, and other organizational structures.":"使用此文件制作组织图、层次结构和其他组织结构。","Use this file for sequences, processes, and workflows.":"使用此文件进行顺序、流程和工作流程。","Use this mode to modify and enhance your current chart.":"使用此模式来修改和增强您当前的图表。","Used at":"使用于","User":"用户","Vector Export (SVG)":"矢量导出(SVG)","View on Github":"在 Github 上查看","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"想要从文档创建流程图吗? 将其粘贴到编辑器中,然后单击“转换为流程图”","Watermark-Free Diagrams":"无水印图表","Watermarks":"水印","Welcome to Flowchart Fun":"欢迎来到流程图乐趣","What if I just need it for one project?":"如果我只需要它来做一个项目怎么办?","What our users are saying":"我们的用户都说什么了","What\'s next?":"接下来是什么?","What\'s this?":"这是什么?","Width":"宽度","Width and Height":"宽度和高度","Will my diagrams actually look professional?":"我的图表会看起来专业吗?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"通过Flowchart Fun的专业版,您可以使用自然语言命令快速完善您的流程图细节,非常适合在旅途中创建图表。每月6美元,享受易于访问的人工智能编辑,提升您的流程图体验。","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"使用专业版,您可以保存和加载本地文件。这对于离线管理工作相关文件非常方便。","Would you like to continue?":"您想继续吗?","Would you like to suggest a new example?":"您想提出一个新的示例吗?","Wrap text in parentheses to connect to any node":"用括号将文本连接到任何节点","Write like an outline":"像写大纲一样","Write your prompt here or click to enable the microphone, then press and hold to record.":"在此处输入您的提示,或点击启用麦克风,然后按住录制。","Yearly":"每年","Yes — send us a message and we\'ll set you up with a discounted rate.":"是的 - 给我们发消息,我们会为您设置折扣率。","Yes, Replace Content":"是的,替换内容。","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"是的。每个图表都使用平衡的、自动的布局和干净的排版。您可以自定义主题、颜色和样式,并导出为清晰的SVG或高分辨率的PNG,在任何演示文稿或文档中都会表现出色。","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"是的。专业版支持从Visio、Lucidchart和CSV导入 - 这样您就可以将现有的内容带入,而不必从头开始重建。","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"是的。您可以在本地保存和加载文件,完全离线工作,并且可以控制谁可以看到您的图表。除非您选择分享,否则不会有任何数据离开您的计算机。","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["您即将为您的图添加",["numNodes"],"个节点和",["numEdges"],"条边。"],"You need to log in to access this page.":"您需要登录才能访问此页面。","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"您已经是专业用户。 <0>管理订阅<1/>有问题或功能请求? <2>告诉我们","You\'re doing great!":"你做得很棒!","You\'re on the free plan.":"您当前使用的是免费计划。","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"您已经使用完了所有的免费AI转换。升级到专业版,享受无限的AI使用、定制主题、私人共享等功能。轻松地创建出令人惊叹的流程图吧!","Your Charts":"您的图表","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"你的沙盒是一个可以自由尝试我们的流程图工具的空间,每天都会重置,以便于重新开始。","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"您的图表是只读的,因为您的帐户已不再活跃。请访问您的<0>帐户页面了解更多信息。","Your next diagram should be your best one.":"您的下一张图表应该是最好的一张。","Your subscription is <0>{statusDisplay}.":["您的訂閱狀態為<0>",["statusDisplay"],"。"],"Your work stays yours":"您的工作始终属于您。","Zoom In":"放大","Zoom Out":"縮小","month":"月份","or":"或","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' + '{"$48/year (save 33%) · Cancel anytime":"每年$48(节省33%)· 随时取消","$6/mo":"每月$6","1 Temporary Flowchart":"1 临时流程图","1 diagram at a time":"同时只能有1个图表","<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied.":"<0>仅启用自定义CSS。仅应用布局和高级设置。","<0>Flowchart Fun is an open source project made by <1>Tone\xA0Row":"<0>Flowchart Fun是由<1>Tone Row制作的开源项目","<0>Sign In / <1>Sign Up with email and password":"<0>登录 / <1>注册 使用电子邮件和密码","A new version of the app is available. Please reload to update.":"一个新版本的应用程序可用。请重新加载以更新。","AI Creation & Editing":"AI创建与编辑","AI generation & editing":"AI生成和编辑","AI-Powered Flowchart Creation":"AI驱动的流程图创建","AI-generated from plain text in under 5 seconds.":"从普通文本中在5秒内生成AI","AI-powered editing to supercharge your workflow":"AI动力编辑,让您的工作流程更加高效","About":"关于","Account":"帐户","Add a backslash (<0>\\\\) before any special characters: <1>(, <2>:, <3>#, or <4>.`":"在任何特殊字符之前添加反斜杠 (<0>\\\\): <1>(、<2>:、<3>#或<4>.","Add some steps":"添加一些步骤","Advanced":"高级","Align Horizontally":"水平对齐","Align Nodes":"对齐节点","Align Vertically":"垂直对齐","All this for just $6/month - less than your daily coffee ☕":"所有这些仅需每月6美元 - 不到您每天的咖啡☕","Always presentation-ready":"总是准备好展示","Amount":"数量","An error occurred. Try resubmitting or email {0} directly.":["发生了一个错误。请尝试重新提交或直接发送电子邮件至",["0"],"。"],"Appearance":"外观","Are you sure you want to delete the flowchart \\"{0}\\"? This action cannot be undone.":"您确定要删除流程图吗?","Are you sure you want to delete the folder \\"{0}\\" and all its contents? This action cannot be undone.":"您确定要删除文件夹吗?","Are you sure you want to delete the folder \\"{0}\\"? This action cannot be undone.":"您确定要删除文件夹吗?","Are you sure?":"你确定吗?","Arrow Size":"箭头大小","Attributes":"属性","August 2023":"2023 年 8 月","Back":"返回","Back To Editor":"返回编辑器","Background Color":"背景颜色","Basic Flowchart":"基本流程图","Become a Github Sponsor":"成为Github赞助商","Become a Pro User":"成为专业用户","Begin your journey":"开始你的旅程","Billed annually at $48":"年度账单为$48","Billed monthly at $6":"每月收费$6","Blog":"博客","Book a Meeting":"预订会议","Border Color":"边框颜色","Border Width":"边框宽度","Bottom to Top":"从下到上","Breadthfirst":"宽度优先","Build your personal flowchart library":"建立您的个人流程图库","Can I import my existing diagrams?":"我能导入我的现有图表吗?","Cancel":"取消","Cancel anytime":"随时取消","Cancel your subscription. Your hosted charts will become read-only.":"取消订阅。您的托管图表将变为只读。","Certain attributes can be used to customize the appearance or functionality of elements.":"某些属性可用于自定义元素的外观或功能。","Change Email Address":"更改电子邮件地址","Changelog":"变更日志","Charts":"图表","Check out the guide:":"查看指南:","Check your email for a link to log in.<0/>You can close this window.":"检查您的电子邮件以获取登录链接。您可以关闭此窗口。","Choose":"選擇","Choose Template":"选择模板","Choose from a variety of arrow shapes for the source and target of an edge. Shapes include triangle, triangle-tee, circle-triangle, triangle-cross, triangle-backcurve, vee, tee, square, circle, diamond, chevron, none. .":"为边缘的源和目标选择各种箭头形状。形状包括三角形,三角形-T,圆形-三角形,三角形-十字,三角形-后曲线,V形,T形,正方形,圆形,菱形,雪花形,无。","Choose how edges connect between nodes":"选择节点之间的边缘连接方式","Choose how nodes are automatically arranged in your flowchart":"选择如何自动排列您的流程图中的节点","Circle":"圆圈","Classes":"类","Clear":"清除","Clear text?":"清除文字?","Clone":"克隆","Clone Flowchart":"克隆流程图","Close":"关闭","Color":"颜色","Colors include red, orange, yellow, blue, purple, black, white, and gray.":"颜色包括红色,橙色,黄色,蓝色,紫色,黑色,白色和灰色。","Column":"列","Comment":"评论","Community templates":"社区模板","Compare our plans and find the perfect fit for your flowcharting needs":"比较我们的计划,找到最适合您流程图需求的方案","Concentric":"同心","Confirm New Email":"确认新电子邮件","Confirm your email address to sign in.":"確認您的電子郵件地址以登入。","Connect your Data":"连接您的数据","Containers":"容器","Containers are nodes that contain other nodes. They are declared using curly braces.":"容器是包含其他节点的节点。它们使用大括号声明。","Continue":"继续","Continue in Sandbox (Resets daily, work not saved)":"继续使用沙盒(每天重置,工作不会被保存)","Controls the flow direction of hierarchical layouts":"控制层次布局的流向","Convert":"转换","Convert to Flowchart":"转换为流程图","Convert to hosted chart?":"是否转换为托管图表?","Cookie Policy":"Cookie政策","Copied SVG code to clipboard":"将SVG代码复制到剪贴板","Copied {format} to clipboard":["将",["format"],"复制到剪贴板"],"Copy":"复制","Copy PNG Image":"复制PNG图像","Copy SVG Code":"复制 SVG 代码","Copy your Excalidraw code and paste it into <0>excalidraw.com to edit. This feature is experimental and may not work with all diagrams. If you find a bug, please <1>let us know.":"将你的 Excalidraw 代码复制并粘贴到<0>excalidraw.com以进行编辑。此功能为实验性质,可能无法与所有图表一起使用。如果您发现错误,请<1>告诉我们。","Copy your mermaid.js code or open it directly in the mermaid.js live editor.":"复制您的mermaid.js代码或直接在mermaid.js实时编辑器中打开它。","Create":"创建","Create Flowcharts using AI":"使用AI创建流程图","Create Unlimited Flowcharts":"创建无限流程图","Create a New Chart":"创建新图表","Create a flowchart showing the steps of planning and executing a school fundraising event":"创建一个流程图,展示规划和执行学校筹款活动的步骤","Create a new flowchart to get started or organize your work with folders.":"创建一个新的流程图开始或使用文件夹组织您的工作。","Create flowcharts instantly: Type or paste text, see it visualized.":"即时创建流程图:输入或粘贴文本,即可可视化。","Create unlimited diagrams for just $6/month!":"仅需每月$6,即可创建无限的图表!","Create unlimited flowcharts stored in the cloud– accessible anywhere!":"在云中存储无限流程图- 随时随地可访问!","Create with AI":"通過AI創建","Created Date":"创建日期","Creating an edge between two nodes is done by indenting the second node below the first":"在两个节点之间创建边缘是通过将第二个节点缩进第一个节点来完成的","Curve Style":"曲线样式","Custom CSS":"自定义CSS","Custom Sharing Options":"自定义分享选项","Custom sharing & public links":"自定义共享和公共链接","Customer Portal":"客户门户","Daily Sandbox Editor":"每日沙盒编辑器","Dark":"深色","Dark Mode":"深色模式","Data Import (Visio, Lucidchart, CSV)":"数据导入(Visio,Lucidchart,CSV)","Data import feature for complex diagrams":"数据导入功能,适用于复杂的图表","Date":"日期","Delete":"删除","Delete {0}":["删除 ",["0"]],"Describe it and it appears":"描述它,它就会出现","Describe your idea. Get a diagram worth presenting.":"描述您的想法。得到一个值得展示的图表。","Design a software development lifecycle flowchart for an agile team":"为敏捷团队设计一个软件开发生命周期流程图","Develop a decision tree for a CEO to evaluate potential new market opportunities":"为CEO设计一个决策树,评估潜在的新市场机会","Direction":"方向","Dismiss":"解散","Do you offer discounts for students or nonprofits?":"是否为学生或非营利组织提供折扣?","Do you want to delete this?":"您要将其删除吗?","Document":"文档","Don\'t Lose Your Work":"不要丢失你的工作","Download":"下载","Download JPG":"下载 JPG","Download PNG":"下载 PNG","Download SVG":"下载 SVG","Drag and drop a CSV file here, or click to select a file":"将CSV文件拖放到此处,或单击以选择文件","Draw an edge from multiple nodes by beginning the line with a reference":"通过引用开始行从多个节点绘制边缘","Drop the file here ...":"將檔案拖放到這裡...","Each line becomes a node":"每一行都变成一个节点","Edge ID, Classes, Attributes":"邊緣ID、類別和屬性","Edge Label":"邊緣標籤","Edge Label Column":"邊緣標籤欄","Edge Style":"邊緣樣式","Edge Text Size":"边缘文本大小","Edge missing indentation":"缺少缩进的边","Edges":"边","Edges are declared in the same row as their source node":"边声明在与源节点相同的行中","Edges are declared in the same row as their target node":"边声明在与目标节点相同的行中","Edges are declared in their own row":"边声明在自己的行中","Edges can also have ID\'s, classes, and attributes before the label":"边在标签之前可以有ID,类和属性","Edges can be styled with dashed, dotted, or solid lines":"边可以用虚线,点线或实线样式","Edges in Separate Rows":"边在单独的行","Edges in Source Node Row":"边在源节点行","Edges in Target Node Row":"边在目标节点行","Edit":"编辑","Edit with AI":"利用AI进行编辑","Editable":"可编辑","Editor":"编辑器","Email":"电子邮件","Empty":"空","Enable to set a consistent height for all nodes":"启用统一设置所有节点的高度","Enter a name for the cloned flowchart.":"为克隆的流程图输入名称。","Enter a name for the new folder.":"为新文件夹输入名称。","Enter a new name for the {0}.":["为 ",["0"]," 输入新名称。"],"Enter your email address and we\'ll send you a magic link to sign in.":"輸入您的電子郵件地址,我們將發送給您一個魔法鏈接以登入。","Enter your email address below and we\'ll send you a link to reset your password.":"在下面輸入您的電子郵件地址,我們將發送給您一個重置密碼的鏈接。","Equal To":"等于","Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck.":"每个图表都可以导出为清晰的PNG、SVG或可共享的链接 - 准备好参加会议、文档或演示文稿。","Everything you need to know about Flowchart Fun Pro":"有关流程图乐趣专业版的所有信息","Examples":"示例","Excalidraw":"Excalidraw","Exclusive Office Hours":"专属办公时间","Experience the efficiency and security of loading local files directly into your flowchart, perfect for managing work-related documents offline. Unlock this exclusive Pro feature and more with Flowchart Fun Pro, available for only $6/month":"体验将本地文件直接加载到流程图中的效率和安全性,非常适合离线管理工作相关文件。解锁这个独有的专业功能以及更多功能,Flowchart Fun Pro仅需每月$6即可使用。","Explore Pro":"探索专业版","Explore more":"探索更多","Export":"导出","Export clean diagrams without branding":"导出无品牌标识的清晰图表","Export to PNG & JPG":"导出为PNG和JPG","Export to PNG, JPG, and SVG":"导出为PNG,JPG和SVG","Feature Breakdown":"功能分解","Feedback":"反馈","Feel free to explore and reach out to us through the <0>Feedback page should you have any concerns.":"如果您有任何問題,請隨意探索並通過<0>反饋頁面與我們聯繫。","Fine-tune layouts and visual styles":"调整布局和视觉风格","Fixed Height":"固定高度","Fixed Node Height":"固定节点高度","Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month.":"Flowchart Fun Pro为您提供无限的流程图、无限的协作者和无限的存储空间,仅需每月$6即可享用。","Flowchart Fun is an open source project made by <0>Tone\xA0Row":"Flowchart Fun是由<0>Tone\xA0Row制作的开源项目","Flowchart Fun is built and maintained by one developer. Your support keeps it going.":"Flowchart Fun由一位开发者构建和维护。您的支持使其持续运行。","Follow Us on Twitter":"在Twitter上关注我们","Font Family":"字体系列","Forgot your password?":"忘記密碼了?","Free":"免费","Free users: charts in the sandbox expire after 7 days.":"免费用户:沙盒中的图表在7天后将过期。","Frequently Asked Questions":"经常问的问题","Full-screen, read-only, and template sharing":"全屏、只读和模板共享","Fullscreen":"全屏","General":"一般","Generate flowcharts from text automatically":"自动从文本生成流程图","Get Pro Access Now":"立即获取专业访问权限","Get Unlimited AI Requests":"获得无限的AI请求","Get rapid responses to your questions":"快速获取您的问题的回答","Get unlimited flowcharts and premium features":"获取无限流程图和高级功能","Go back home":"回家","Go to the Editor":"前往編輯器","Go to your Sandbox":"去你的沙盒","Graph":"图表","Green?":"绿色的?","Grid":"网格","Group ranking and ranked-choice voting, free":"群组排名和排名选择投票,免费","Have complex questions or issues? We\'re here to help.":"有复杂的问题或问题吗?我们在这里帮助你。","Here are some Pro features you can now enjoy.":"現在您可以享受以下專業功能。","High-quality exports with embedded fonts":"高质量的导出,内嵌字体","History":"历史","Home":"主页","How are edges declared in this data?":"在这个数据中如何声明边缘?","How fast can I actually make something?":"我到底能有多快地制作出东西?","How would you like to save your chart?":"您想如何保存您的流程图?","I would like to request a new template:":"我想请求一个新的模板:","ID\'s":"ID","If an account with that email exists, we\'ve sent you an email with instructions on how to reset your password.":"如果該電子郵件存在該帳戶,我們已經發送給您一封電子郵件,其中包含如何重置您的密碼的說明。","If you mean to create an edge, indent this line. If not, escape the colon with a backslash <0>\\\\:":"如果你想创建一个边,缩进这一行。如果不,用反斜杠转义冒号<0>\\\\:","Images":"图像","Import Data":"导入数据","Import data from a CSV file.":"从CSV文件导入数据。","Import data from any CSV file and map it to a new flowchart. This is a great way to import data from other sources like Lucidchart, Google Sheets, and Visio.":"從任何CSV檔案匯入資料並將其映射到新的流程圖。這是從Lucidchart、Google Sheets和Visio等其他來源匯入資料的一個很棒的方法。","Import from CSV":"從CSV導入","Import from Visio, Lucidchart, CSV":"从Visio、Lucidchart、CSV导入","Import from Visio, Lucidchart, and CSV":"从Visio,Lucidchart和CSV导入","Import from anywhere":"从任何地方导入","Import from popular diagram tools":"从流行的图表工具导入","Import your diagram it into Microsoft Visio using one of these CSV files.":"使用其中一个CSV文件将您的图表导入到Microsoft Visio中。","Importing data is a pro feature. You can upgrade to Flowchart Fun Pro for just $6/month.":"导入数据是一项专业功能。您可以升级到Flowchart Fun Pro,仅需每月6美元。","Include a title using a <0>title attribute. To use Visio coloring, add a <1>roleType attribute equal to one of the following:":"使用<0>title属性添加标题。要使用 Visio 颜色,请添加一个等于以下内容之一的<1>roleType属性:","Indent to connect nodes":"缩进以连接节点","Info":"信息","Is":"是","Is my data private?":"我的数据是否私密?","JSON Canvas is a JSON representation of your diagram used by <0>Obsidian Canvas and other applications.":"JSON画布是您的图表的JSON表示,由<0>Obsidian Canvas和其他应用程序使用。","Join 2000+ professionals who\'ve upgraded their workflow":"加入2000多位专业人士,升级他们的工作流程","Join thousands of happy users who love Flowchart Fun":"加入成千上万的快乐用户,他们都爱流程图乐趣","Keep Things Private":"保持事物私密","Keep changes?":"保留更改吗?","Keep practicing":"继续练习","Keep your data private on your computer":"在您的电脑上保护您的数据隐私","Language":"语言","Layout":"布局","Layout Algorithm":"布局算法","Layout Frozen":"布局已冻结","Leading References":"主要參考","Learn More":"学到更多","Learn Syntax":"學習語法","Learn about Flowchart Fun Pro":"了解关于Flowchart Fun Pro","Left to Right":"从左到右","Let us know why you\'re canceling. We\'re always looking to improve.":"让我们知道您为什么要取消。我们一直在努力改进。","Light":"浅色","Light Mode":"浅色模式","Link":"链接","Link back":"链接回来","Load":"載入","Load Chart":"加载流程图","Load File":"加载文件","Load Files":"加载多个文件","Load default content":"載入預設內容","Load from link?":"从链接加载?","Load layout and styles":"載入版面和樣式","Loading...":"加载中...","Local File Support":"本地文件支持","Local saving for offline access":"本地保存,实现离线访问","Lock Zoom to Graph":"锁定缩放到图表","Log In":"登录","Log Out":"登出","Log in to Save":"登录以保存","Log in to upgrade your account":"登录升级您的账户","Made by <0>Tone\xA0Row":"由<0>Tone\xA0Row制作","Make a One-Time Donation":"进行一次性捐赠","Make it yours":"让它成为你的","Make publicly accessible":"设为公开访问","Manage Billing":"付款管理","Map Data":"對應資料","Maximum width of text inside nodes":"节点内文本的最大宽度","Monthly":"每月","More from Tone Row":"来自Tone Row的更多内容","More from Tone Row:":"来自Tone Row的更多内容:","More tools:":"更多工具:","Move":"移动","Move {0}":["移动 ",["0"]],"Multiple pointers on same line":"同一行上的多个指针","My dog ate my credit card!":"我的狗吃了我的信用卡!","Name":"名称","Name Chart":"命名图表","Name your chart":"为您的流程图命名","New":"新","New Email":"新邮件","New Flowchart":"新流程图","New Folder":"新文件夹","Next charge":"下次扣费","No Edges":"沒有邊緣","No Folder (Root)":"无文件夹(根目录)","No Watermarks!":"无水印!","No charts yet":"还没有图表","No items in this folder":"此文件夹中没有项目","No matching charts found":"没有找到匹配的图表","Node Border Style":"节点边框样式","Node Colors":"节点颜色","Node ID":"节点ID","Node ID, Classes, Attributes":"节点ID、类、属性","Node Label":"节点标签","Node Shape":"节点形状","Node Shapes":"节点形状","Nodes":"节点","Nodes can be styled with dashed, dotted, or double. Borders can also be removed with border_none.":"节点可以使用虚线、点线或双线样式。边框也可以使用 border_none 来移除。","Not Empty":"不为空","Now you\'re thinking with flowcharts!":"现在你在用流程图思考了!","Office Hours":"工作时间","Once in a while the magic link will end up in your spam folder. If you don\'t see it after a few minutes, check there or request a new link.":"偶尔,魔法链接会被放入您的垃圾邮件文件夹。如果几分钟后仍然没有收到,请检查垃圾邮件文件夹,或者重新请求新的链接。","One on One Support":"一对一支持","One-on-One Support":"一对一支持","Open Customer Portal":"打开客户门户","Operation canceled":"操作已取消","Or maybe blue!":"或者也许是蓝色!","Organization Chart":"组织结构图","PNG & JPG export":"PNG和JPG导出","Padding":"填充","Page not found":"找不到页面","Password":"密碼","Past Due":"过期","Paste a document to convert it":"粘贴一个文档来转换它","Paste your document or outline here to convert it into an organized flowchart.":"将您的文档或大纲粘贴到此处,将其转换为有组织的流程图。","Pasted content detected. Convert to Flowchart Fun syntax?":"检测到粘贴内容。转换为流程图乐趣语法?","Perfect for docs and quick sharing":"适用于文档和快速分享","Permanent Charts are a Pro Feature":"永久图表是专业功能","Playbook":"剧本","Pointer and container on same line":"同一行上的指针和容器","Pricing":"价格","Priority One-on-One Support":"优先一对一支持","Priority support":"优先支持","Privacy Policy":"隱私政策","Pro starts at $4/mo billed yearly. Cancel anytime.":"专业版每月4美元,年付。随时取消。","Pro tip: Right-click any node to customize its shape and color":"专业提示:右键点击任何节点可自定义其形状和颜色","Processing Data":"处理数据","Processing...":"处理中...","Prompt":"提示","Public":"公开","Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists.":"从Visio,Lucidchart,CSV中导入数据,或从模板开始。无需重新创建已存在的内容。","Quick experimentation space that resets daily":"每日重置的快速实验空间","Random":"随机","Rapid Deployment Templates":"快速部署模板","Rapid Templates":"快速模板","Raster Export (PNG, JPG)":"光栅导出(PNG,JPG)","Rate limit exceeded. Please try again later.":"速率限制超出。 请稍后再试。","Read-only":"只读","Reference by Class":"按类引用","Reference by ID":"按 ID 参考","Reference by Label":"按标签参考","References":"参考","References are used to create edges between nodes that are created elsewhere in the document":"参考用于在文档中其他位置创建的节点之间创建边","Referencing a node by its exact label":"通过其确切标签引用节点","Referencing a node by its unique ID":"通过其唯一ID引用节点","Referencing multiple nodes with the same assigned class":"使用相同分配的类引用多个节点","Refresh Page":"刷新页面","Reload to Update":"重新加载以更新","Rename":"重命名","Rename {0}":["重命名",["0"]],"Request Magic Link":"請求魔法鏈接","Request Password Reset":"請求密碼重置","Reset":"重置","Reset Password":"重置密碼","Resume Subscription":"恢复订阅","Return":"返回","Right to Left":"从右到左","Right-click nodes for options":"右键点击节点以获得选项","Roadmap":"路线图","Rotate Label":"旋转标签","SVG Export is a Pro Feature":"SVG导出是专业功能","SVG, PDF & all export formats":"支持SVG,PDF和所有导出格式","Satisfaction guaranteed or first payment refunded":"满意保证或第一次付款退款","Save":"救球","Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so.":"本地保存,离线工作,并且可以精确控制谁可以看到什么。除非您允许,否则不会将数据传输到其他地方。","Save time with AI and dictation, making it easy to create diagrams.":"使用人工智能和口述功能,节省时间,轻松创建图表。","Save to Cloud":"保存到云","Save to File":"保存到文件","Save your Work":"保存您的工作","Schedule personal consultation sessions":"安排个人咨询会话","Secure payment":"安全付款","See more reviews on Product Hunt":"在Product Hunt上查看更多评论","See what\'s possible":"查看可行性","Select a destination folder for \\"{0}\\".":"选择一个目标文件夹 \\\\","Send us a message":"发送我们消息","Set a consistent height for all nodes":"设置所有节点的统一高度","Settings":"设置","Share":"分享","Sign In":"登錄","Sign in with <0>GitHub":"使用<0>GitHub登录","Sign in with <0>Google":"使用<0>Google登录","Sorry! This page is only available in English.":"抱歉!此页面只有英语版。","Sorry, there was an error converting the text to a flowchart. Try again later.":"抱歉,转换文本为流程图时出错。 请稍后再试。","Sort Ascending":"升序排序","Sort Descending":"倒序排列","Sort by {0}":["按",["0"],"排序"],"Source Arrow Shape":"源箭头形状","Source Column":"源列","Source Delimiter":"源分隔符","Source Distance From Node":"源节点距离","Source/Target Arrow Shape":"源/目标箭头形状","Spacing":"间距","Special Attributes":"特殊属性","Start":"开始","Start Over":"重新開始","Start faster with use-case specific templates":"使用特定用例模板加快启动","Start for free":"免费开始","Status":"状态","Step 1":"步骤1","Step 2":"步骤2","Step 3":"步骤3","Store any data associated to a node":"將任何與節點相關的資料儲存","Style Classes":"樣式類別","Style with classes":"用类别进行样式设置","Submit":"提交","Subscription":"订阅","Subscription Successful!":"訂閱成功!","Subscription will end":"订阅即将到期","Support":"支持","Target Arrow Shape":"目标箭头形状","Target Column":"目標欄","Target Delimiter":"目標分隔符","Target Distance From Node":"目標距離節點","Tell the AI what you need in plain English. Your diagram builds itself in seconds.":"用简单的英语告诉AI你需要什么。你的图表将在几秒钟内建立。","Tell us what\'s working and what isn\'t. Every message is read by the developer.":"告诉我们什么是有效的,什么是无效的。每条消息都会被开发者阅读。","Text Color":"文字顏色","Text Horizontal Offset":"文本水平偏移","Text Leading":"文字行距","Text Max Width":"文本最大宽度","Text Vertical Offset":"文字垂直偏移","Text followed by colon+space creates an edge with the text as the label":"以冒号加空格结尾的文本将创建一个边,文本作为标签","Text on a line creates a node with the text as the label":"在一行中的文本将创建一个节点,文本作为标签","Thank you for your feedback!":"感谢您的反馈!","The beauty and magic reside in the minimalism.":"美和魔力都在于简约。","The best way to change styles is to right-click on a node or an edge and select the style you want.":"更改样式的最佳方式是右键单击节点或边缘,然后选择所需的样式。","The column that contains the edge label(s)":"包含边标签的列","The column that contains the source node ID(s)":"包含源节点ID的列","The column that contains the target node ID(s)":"包含目标节点ID的列","The delimiter used to separate multiple source nodes":"用于分隔多个源节点的分隔符","The delimiter used to separate multiple target nodes":"用于分隔多个目标节点的分隔符","The fastest way to turn what\'s in your head into something everyone else can understand.":"将你脑海中的想法快速转化成其他人都能理解的东西。","The free plan works great for day-to-day use. If you need Pro features, it\'s month-to-month at $6/mo — cancel anytime with no commitment.":"免费计划非常适合日常使用。如果你需要专业功能,每月只需支付6美元 - 随时取消,无需承诺。","The possible shapes are:":"可能的形状是:","Theme":"主題","Theme Customization Editor":"主题定制编辑器","Theme Editor":"主题编辑器","Theme editor":"主题编辑器","There are no edges in this data":"此数据中没有边","This action cannot be undone.":"此操作无法撤销。","This feature is only available to pro users. <0>Become a pro user to unlock it.":"只有专业用户才能使用此功能。 <0>成为专业用户解锁。","This may take between 30 seconds and 2 minutes depending on the length of your input.":"这可能需要30秒到2分钟的时间,取决于您输入的长度。","This sandbox is perfect for experimenting, but remember - it resets daily. Upgrade now and keep your current work!":"这个沙盒非常适合实验,但请记住 - 它每天都会重置。立即升级,保留您当前的工作!","This will replace the current content.":"這將取代目前的內容。","This will replace your current chart content with the template content.":"这将用模板内容替换您当前的图表内容。","This will replace your current sandbox.":"这将替换您当前的沙盒。","Time to decide":"决定的时间到了","Tip":"提示","To fix this change one of the edge IDs":"为了修复这个,改变其中一个边的ID","To fix this change one of the node IDs":"要修复这个,更改其中一个节点ID","To fix this move one pointer to the next line":"要修复这个,将指针移动到下一行","To fix this start the container <0/> on a different line":"要修复这个,将容器<0/>放在另一行","To learn more about why we require you to log in, please read <0>this blog post.":"要了解更多關於我們為什麼要求您登錄的原因,請閱讀<0>這篇博客文章。","Top to Bottom":"从上到下","Transform Your Ideas into Professional Diagrams in Seconds":"秒转换您的想法成专业图表","Transform text into diagrams instantly":"即时将文本转换为图表","Try AI":"尝试人工智能","Try adjusting your search or filters to find what you\'re looking for.":"尝试调整您的搜索或筛选条件以找到您想要的内容。","Try again":"重试","Try it free":"免费试用","Turn documents into diagrams with AI":"使用人工智能将文档转换为图表","Two edges have the same ID":"两个边有相同的ID","Two nodes have the same ID":"两个节点有相同的ID","Type it. See it.":"输入,即可查看","Uh oh, you\'re out of free requests! Upgrade to Flowchart Fun Pro for unlimited diagram conversions, and keep transforming text into clear, visual flowcharts as easily as copy and paste.":"哎呀,你的免费请求用完了!升级到Flowchart Fun Pro,享受无限的图表转换功能,轻松将文本转换成清晰的可视化流程图,就像复制粘贴一样简单。","Under 60 seconds. Type a few lines of text or describe what you need to the AI, and your diagram appears instantly. Export or share it with one click.":"不到60秒。输入几行文字或向AI描述您需要的内容,即可立即显示您的图表。一键导出或分享。","Undo":"撤消","Unescaped special character":"未转义的特殊字符","Unique text value to identify a node":"用于标识节点的唯一文本值","Unknown":"未知","Unknown Parsing Error":"未知的解析错误","Unlimited Flowcharts":"无限制的流程图","Unlimited Permanent Flowcharts":"无限永久流程图","Unlimited cloud-saved flowcharts":"无限云端保存的流程图","Unlimited saved diagrams":"无限保存的图表","Unlock AI Features and never lose your work with a Pro account.":"解锁AI功能,通过专业账户永远不会丢失您的工作。","Unlock Unlimited AI Flowcharts":"解锁无限制使用AI流程图","Unpaid":"未付","Update Email":"更新电子邮件","Updated Date":"更新日期","Upgrade Now - Save My Work":"立即升级 - 保存我的工作","Upgrade to Flowchart Fun Pro and unlock:":"升级到Flowchart Fun Pro并解锁:","Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly.":"升级至Flowchart Fun Pro,享受无限托管图表、无水印高清导出、人工智能编辑等功能。每月$4,年付。","Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams.":"升级到Flowchart Fun Pro,解锁SVG导出功能,并享受更多高级功能来创建您的图表。","Upgrade to Pro":"升級到專業版","Upgrade to Pro for permanent charts.":"升级至专业版,拥有永久的图表。","Upload your File":"上传您的文件","Use Custom CSS Only":"僅使用自定義CSS","Use Lucidchart or Visio? CSV Import makes it easy to get data from any source!":"使用Lucidchart或Visio?CSV导入使从任何来源获取数据变得容易!","Use classes to group nodes":"使用类来分组节点","Use the attribute <0>href to set a link on a node that opens in a new tab.":"使用属性<0>href在节点上设置一个在新标签页中打开的链接。","Use the attribute <0>src to set the image of a node. The image will be scaled to fit the node, so you may need to adjust the width and height of the node to get the desired result. Only public images (not blocked by CORS) are supported.":"使用属性<0>src来设置节点的图像,图像将被缩放以适应节点,因此您可能需要调整节点的宽度和高度以获得期望的结果。仅支持公共图像(不受CORS阻止)。","Use the attributes <0>w and <1>h to explicitly set the width and height of a node.":"使用属性<0>w和<1>h显式设置节点的宽度和高度。","Use the customer portal to change your billing information.":"使用客户门户更改您的账单信息。","Use these settings to adapt the look and behavior of your flowcharts":"使用这些设置来调整流程图的外观和行为","Use this file for org charts, hierarchies, and other organizational structures.":"使用此文件制作组织图、层次结构和其他组织结构。","Use this file for sequences, processes, and workflows.":"使用此文件进行顺序、流程和工作流程。","Use this mode to modify and enhance your current chart.":"使用此模式来修改和增强您当前的图表。","Used at":"使用于","User":"用户","Vector Export (SVG)":"矢量导出(SVG)","View on Github":"在 Github 上查看","Want to create a flowchart from a document? Paste it in the editor and click \'Convert to Flowchart\'":"想要从文档创建流程图吗? 将其粘贴到编辑器中,然后单击“转换为流程图”","Watermark-Free Diagrams":"无水印图表","Watermarks":"水印","Welcome to Flowchart Fun":"欢迎来到流程图乐趣","What if I just need it for one project?":"如果我只需要它来做一个项目怎么办?","What our users are saying":"我们的用户都说什么了","What\'s next?":"接下来是什么?","What\'s this?":"这是什么?","Width":"宽度","Width and Height":"宽度和高度","Will my diagrams actually look professional?":"我的图表会看起来专业吗?","With Flowchart Fun\'s Pro version, you can use natural language comamnds to quickly flesh out your flowchart details, ideal for creating diagrams on the go. For $6/month, get the ease of accessible AI editing to enhance your flowcharting experience.":"通过Flowchart Fun的专业版,您可以使用自然语言命令快速完善您的流程图细节,非常适合在旅途中创建图表。每月6美元,享受易于访问的人工智能编辑,提升您的流程图体验。","With the pro version you can save and load local files. It\'s perfect for managing work-related documents offline.":"使用专业版,您可以保存和加载本地文件。这对于离线管理工作相关文件非常方便。","Would you like to continue?":"您想继续吗?","Would you like to suggest a new example?":"您想提出一个新的示例吗?","Wrap text in parentheses to connect to any node":"用括号将文本连接到任何节点","Write like an outline":"像写大纲一样","Write your prompt here or click to enable the microphone, then press and hold to record.":"在此处输入您的提示,或点击启用麦克风,然后按住录制。","Yearly":"每年","Yes — send us a message and we\'ll set you up with a discounted rate.":"是的 - 给我们发消息,我们会为您设置折扣率。","Yes, Replace Content":"是的,替换内容。","Yes. Every diagram uses balanced, automatic layouts with clean typography. You can customize themes, colors, and styles — and export as crisp SVG or high-resolution PNG that looks great in any presentation or document.":"是的。每个图表都使用平衡的、自动的布局和干净的排版。您可以自定义主题、颜色和样式,并导出为清晰的SVG或高分辨率的PNG,在任何演示文稿或文档中都会表现出色。","Yes. Pro supports importing from Visio, Lucidchart, and CSV — so you can bring in what you already have without recreating it from scratch.":"是的。专业版支持从Visio、Lucidchart和CSV导入 - 这样您就可以将现有的内容带入,而不必从头开始重建。","Yes. You can save and load files locally, work entirely offline, and control exactly who sees your diagrams. No data leaves your machine unless you choose to share.":"是的。您可以在本地保存和加载文件,完全离线工作,并且可以控制谁可以看到您的图表。除非您选择分享,否则不会有任何数据离开您的计算机。","You are about to add {numNodes} nodes and {numEdges} edges to your graph.":["您即将为您的图添加",["numNodes"],"个节点和",["numEdges"],"条边。"],"You need to log in to access this page.":"您需要登录才能访问此页面。","You\'re already a Pro User. <0>Manage Subscription<1/>Have questions or feature requests? <2>Let Us Know":"您已经是专业用户。 <0>管理订阅<1/>有问题或功能请求? <2>告诉我们","You\'re doing great!":"你做得很棒!","You\'re on the free plan.":"您当前使用的是免费计划。","You\'ve used all your free AI conversions. Upgrade to Pro for unlimited AI use, custom themes, private sharing, and more. Keep creating amazing flowcharts effortlessly!":"您已经使用完了所有的免费AI转换。升级到专业版,享受无限的AI使用、定制主题、私人共享等功能。轻松地创建出令人惊叹的流程图吧!","Your Charts":"您的图表","Your Sandbox is a space to freely experiment with our flowchart tools, resetting every day for a fresh start.":"你的沙盒是一个可以自由尝试我们的流程图工具的空间,每天都会重置,以便于重新开始。","Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more.":"您的图表是只读的,因为您的帐户已不再活跃。请访问您的<0>帐户页面了解更多信息。","Your next diagram should be your best one.":"您的下一张图表应该是最好的一张。","Your subscription is <0>{statusDisplay}.":["您的訂閱狀態為<0>",["statusDisplay"],"。"],"Your work stays yours":"您的工作始终属于您。","Zoom In":"放大","Zoom Out":"縮小","month":"月份","or":"或","{0}":[["0"]],"{buttonText}":[["buttonText"]]}' ), }; diff --git a/app/src/locales/zh/messages.po b/app/src/locales/zh/messages.po index 61551fe87..f2e99ae71 100644 --- a/app/src/locales/zh/messages.po +++ b/app/src/locales/zh/messages.po @@ -13,11 +13,11 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Pricing2.tsx:378 +#: src/pages/Pricing2.tsx:387 msgid "$48/year (save 33%) · Cancel anytime" msgstr "每年$48(节省33%)· 随时取消" -#: src/pages/Pricing2.tsx:345 +#: src/pages/Pricing2.tsx:354 msgid "$6/mo" msgstr "每月$6" @@ -25,7 +25,7 @@ msgstr "每月$6" msgid "1 Temporary Flowchart" msgstr "1 临时流程图" -#: src/pages/Pricing2.tsx:102 +#: src/pages/Pricing2.tsx:104 msgid "1 diagram at a time" msgstr "同时只能有1个图表" @@ -33,7 +33,7 @@ msgstr "同时只能有1个图表" msgid "<0>Custom CSS Only is enabled. Only the Layout and Advanced settings will be applied." msgstr "<0>仅启用自定义CSS。仅应用布局和高级设置。" -#: src/components/Settings.tsx:88 +#: src/components/Settings.tsx:89 msgid "<0>Flowchart Fun is an open source project made by <1>Tone Row" msgstr "<0>Flowchart Fun是由<1>Tone Row制作的开源项目" @@ -49,7 +49,7 @@ msgstr "一个新版本的应用程序可用。请重新加载以更新。" msgid "AI Creation & Editing" msgstr "AI创建与编辑" -#: src/pages/Pricing2.tsx:111 +#: src/pages/Pricing2.tsx:113 msgid "AI generation & editing" msgstr "AI生成和编辑" @@ -57,7 +57,7 @@ msgstr "AI生成和编辑" msgid "AI-Powered Flowchart Creation" msgstr "AI驱动的流程图创建" -#: src/pages/Pricing2.tsx:303 +#: src/pages/Pricing2.tsx:312 msgid "AI-generated from plain text in under 5 seconds." msgstr "从普通文本中在5秒内生成AI" @@ -65,12 +65,12 @@ msgstr "从普通文本中在5秒内生成AI" msgid "AI-powered editing to supercharge your workflow" msgstr "AI动力编辑,让您的工作流程更加高效" -#: src/components/Settings.tsx:85 +#: src/components/Settings.tsx:86 msgid "About" msgstr "关于" -#: src/components/Header.tsx:190 -#: src/components/Header.tsx:439 +#: src/components/Header.tsx:192 +#: src/components/Header.tsx:441 #: src/pages/Account.tsx:120 msgid "Account" msgstr "帐户" @@ -106,7 +106,7 @@ msgstr "垂直对齐" msgid "All this for just $6/month - less than your daily coffee ☕" msgstr "所有这些仅需每月6美元 - 不到您每天的咖啡☕" -#: src/pages/Pricing2.tsx:83 +#: src/pages/Pricing2.tsx:85 msgid "Always presentation-ready" msgstr "总是准备好展示" @@ -118,7 +118,7 @@ msgstr "数量" msgid "An error occurred. Try resubmitting or email {0} directly." msgstr "发生了一个错误。请尝试重新提交或直接发送电子邮件至{0}。" -#: src/components/Settings.tsx:60 +#: src/components/Settings.tsx:61 msgid "Appearance" msgstr "外观" @@ -170,11 +170,11 @@ msgstr "背景颜色" msgid "Basic Flowchart" msgstr "基本流程图" -#: src/components/Settings.tsx:158 +#: src/components/Settings.tsx:175 msgid "Become a Github Sponsor" msgstr "成为Github赞助商" -#: src/components/Settings.tsx:146 +#: src/components/Settings.tsx:163 msgid "Become a Pro User" msgstr "成为专业用户" @@ -191,8 +191,8 @@ msgstr "年度账单为$48" msgid "Billed monthly at $6" msgstr "每月收费$6" -#: src/components/Header.tsx:144 -#: src/components/Header.tsx:397 +#: src/components/Header.tsx:146 +#: src/components/Header.tsx:399 #: src/pages/Blog.tsx:30 msgid "Blog" msgstr "博客" @@ -260,14 +260,14 @@ msgstr "某些属性可用于自定义元素的外观或功能。" msgid "Change Email Address" msgstr "更改电子邮件地址" -#: src/components/Header.tsx:155 -#: src/components/Header.tsx:403 +#: src/components/Header.tsx:157 +#: src/components/Header.tsx:405 #: src/pages/Changelog.tsx:26 msgid "Changelog" msgstr "变更日志" -#: src/components/Header.tsx:112 -#: src/components/Header.tsx:375 +#: src/components/Header.tsx:114 +#: src/components/Header.tsx:377 msgid "Charts" msgstr "图表" @@ -346,7 +346,7 @@ msgstr "列" msgid "Comment" msgstr "评论" -#: src/pages/Pricing2.tsx:105 +#: src/pages/Pricing2.tsx:107 msgid "Community templates" msgstr "社区模板" @@ -403,7 +403,7 @@ msgstr "转换为流程图" msgid "Convert to hosted chart?" msgstr "是否转换为托管图表?" -#: src/components/Settings.tsx:127 +#: src/components/Settings.tsx:128 msgid "Cookie Policy" msgstr "Cookie政策" @@ -500,7 +500,7 @@ msgstr "自定义CSS" msgid "Custom Sharing Options" msgstr "自定义分享选项" -#: src/pages/Pricing2.tsx:113 +#: src/pages/Pricing2.tsx:115 msgid "Custom sharing & public links" msgstr "自定义共享和公共链接" @@ -516,8 +516,8 @@ msgstr "每日沙盒编辑器" msgid "Dark" msgstr "深色" -#: src/components/Settings.tsx:76 -#: src/components/Settings.tsx:79 +#: src/components/Settings.tsx:77 +#: src/components/Settings.tsx:80 msgid "Dark Mode" msgstr "深色模式" @@ -542,11 +542,11 @@ msgstr "删除" msgid "Delete {0}" msgstr "删除 {0}" -#: src/pages/Pricing2.tsx:77 +#: src/pages/Pricing2.tsx:79 msgid "Describe it and it appears" msgstr "描述它,它就会出现" -#: src/pages/Pricing2.tsx:169 +#: src/pages/Pricing2.tsx:178 msgid "Describe your idea. Get a diagram worth presenting." msgstr "描述您的想法。得到一个值得展示的图表。" @@ -696,8 +696,8 @@ msgstr "利用AI进行编辑" msgid "Editable" msgstr "可编辑" -#: src/components/Header.tsx:92 -#: src/components/Header.tsx:363 +#: src/components/Header.tsx:94 +#: src/components/Header.tsx:365 #: src/components/MobileTabToggle.tsx:12 msgid "Editor" msgstr "编辑器" @@ -742,7 +742,7 @@ msgstr "在下面輸入您的電子郵件地址,我們將發送給您一個重 msgid "Equal To" msgstr "等于" -#: src/pages/Pricing2.tsx:85 +#: src/pages/Pricing2.tsx:87 msgid "Every diagram exports as crisp PNG, SVG, or shareable link — ready for the meeting, the doc, or the deck." msgstr "每个图表都可以导出为清晰的PNG、SVG或可共享的链接 - 准备好参加会议、文档或演示文稿。" @@ -797,8 +797,8 @@ msgid "Feature Breakdown" msgstr "功能分解" #: src/components/Feedback.tsx:53 -#: src/components/Header.tsx:120 -#: src/components/Header.tsx:389 +#: src/components/Header.tsx:122 +#: src/components/Header.tsx:391 msgid "Feedback" msgstr "反馈" @@ -823,11 +823,15 @@ msgstr "固定节点高度" msgid "Flowchart Fun Pro gives you unlimited flowcharts, unlimited collaborators, and unlimited storage for just $6/month." msgstr "Flowchart Fun Pro为您提供无限的流程图、无限的协作者和无限的存储空间,仅需每月$6即可享用。" -#: src/components/Settings.tsx:136 +#: src/pages/Pricing2.tsx:418 +msgid "Flowchart Fun is an open source project made by <0>Tone Row" +msgstr "Flowchart Fun是由<0>Tone Row制作的开源项目" + +#: src/components/Settings.tsx:153 msgid "Flowchart Fun is built and maintained by one developer. Your support keeps it going." msgstr "Flowchart Fun由一位开发者构建和维护。您的支持使其持续运行。" -#: src/components/Settings.tsx:115 +#: src/components/Settings.tsx:116 msgid "Follow Us on Twitter" msgstr "在Twitter上关注我们" @@ -909,6 +913,10 @@ msgstr "绿色的?" msgid "Grid" msgstr "网格" +#: src/lib/toneRowProjects.ts:14 +msgid "Group ranking and ranked-choice voting, free" +msgstr "群组排名和排名选择投票,免费" + #: src/pages/Account.tsx:142 msgid "Have complex questions or issues? We're here to help." msgstr "有复杂的问题或问题吗?我们在这里帮助你。" @@ -980,7 +988,7 @@ msgstr "從任何CSV檔案匯入資料並將其映射到新的流程圖。這是 msgid "Import from CSV" msgstr "從CSV導入" -#: src/pages/Pricing2.tsx:112 +#: src/pages/Pricing2.tsx:114 msgid "Import from Visio, Lucidchart, CSV" msgstr "从Visio、Lucidchart、CSV导入" @@ -988,7 +996,7 @@ msgstr "从Visio、Lucidchart、CSV导入" msgid "Import from Visio, Lucidchart, and CSV" msgstr "从Visio,Lucidchart和CSV导入" -#: src/pages/Pricing2.tsx:89 +#: src/pages/Pricing2.tsx:91 msgid "Import from anywhere" msgstr "从任何地方导入" @@ -1012,7 +1020,7 @@ msgstr "使用<0>title属性添加标题。要使用 Visio 颜色,请添 msgid "Indent to connect nodes" msgstr "缩进以连接节点" -#: src/components/Header.tsx:133 +#: src/components/Header.tsx:135 msgid "Info" msgstr "信息" @@ -1052,7 +1060,7 @@ msgstr "继续练习" msgid "Keep your data private on your computer" msgstr "在您的电脑上保护您的数据隐私" -#: src/components/Settings.tsx:40 +#: src/components/Settings.tsx:41 msgid "Language" msgstr "语言" @@ -1101,8 +1109,8 @@ msgstr "让我们知道您为什么要取消。我们一直在努力改进。" msgid "Light" msgstr "浅色" -#: src/components/Settings.tsx:67 -#: src/components/Settings.tsx:70 +#: src/components/Settings.tsx:68 +#: src/components/Settings.tsx:71 msgid "Light Mode" msgstr "浅色模式" @@ -1160,8 +1168,8 @@ msgstr "本地保存,实现离线访问" msgid "Lock Zoom to Graph" msgstr "锁定缩放到图表" -#: src/components/Header.tsx:206 -#: src/components/Header.tsx:447 +#: src/components/Header.tsx:208 +#: src/components/Header.tsx:449 msgid "Log In" msgstr "登录" @@ -1177,11 +1185,15 @@ msgstr "登录以保存" msgid "Log in to upgrade your account" msgstr "登录升级您的账户" -#: src/components/Settings.tsx:152 +#: src/components/MoreFromToneRow.tsx:28 +msgid "Made by <0>Tone Row" +msgstr "由<0>Tone Row制作" + +#: src/components/Settings.tsx:169 msgid "Make a One-Time Donation" msgstr "进行一次性捐赠" -#: src/pages/Pricing2.tsx:348 +#: src/pages/Pricing2.tsx:357 msgid "Make it yours" msgstr "让它成为你的" @@ -1205,6 +1217,18 @@ msgstr "节点内文本的最大宽度" msgid "Monthly" msgstr "每月" +#: src/components/Settings.tsx:134 +msgid "More from Tone Row" +msgstr "来自Tone Row的更多内容" + +#: src/pages/Pricing2.tsx:430 +msgid "More from Tone Row:" +msgstr "来自Tone Row的更多内容:" + +#: src/components/MoreFromToneRow.tsx:35 +msgid "More tools:" +msgstr "更多工具:" + #: src/components/charts/ChartListItem.tsx:202 #: src/components/charts/ChartModals.tsx:443 msgid "Move" @@ -1235,8 +1259,8 @@ msgstr "命名图表" msgid "Name your chart" msgstr "为您的流程图命名" -#: src/components/Header.tsx:102 -#: src/components/Header.tsx:369 +#: src/components/Header.tsx:104 +#: src/components/Header.tsx:371 #: src/pages/Charts.tsx:100 msgid "New" msgstr "新" @@ -1363,7 +1387,7 @@ msgstr "或者也许是蓝色!" msgid "Organization Chart" msgstr "组织结构图" -#: src/pages/Pricing2.tsx:103 +#: src/pages/Pricing2.tsx:105 msgid "PNG & JPG export" msgstr "PNG和JPG导出" @@ -1412,21 +1436,25 @@ msgstr "剧本" msgid "Pointer and container on same line" msgstr "同一行上的指针和容器" +#: src/pages/Pricing2.tsx:154 +msgid "Pricing" +msgstr "价格" + #: src/components/FeatureBreakdown.tsx:103 msgid "Priority One-on-One Support" msgstr "优先一对一支持" -#: src/pages/Pricing2.tsx:114 +#: src/pages/Pricing2.tsx:116 msgid "Priority support" msgstr "优先支持" -#: src/components/Header.tsx:175 -#: src/components/Header.tsx:453 -#: src/components/Settings.tsx:121 +#: src/components/Header.tsx:177 +#: src/components/Header.tsx:455 +#: src/components/Settings.tsx:122 msgid "Privacy Policy" msgstr "隱私政策" -#: src/pages/Pricing2.tsx:395 +#: src/pages/Pricing2.tsx:404 msgid "Pro starts at $4/mo billed yearly. Cancel anytime." msgstr "专业版每月4美元,年付。随时取消。" @@ -1451,7 +1479,7 @@ msgstr "提示" msgid "Public" msgstr "公开" -#: src/pages/Pricing2.tsx:91 +#: src/pages/Pricing2.tsx:93 msgid "Pull in data from Visio, Lucidchart, CSV, or start from a template. No recreating what already exists." msgstr "从Visio,Lucidchart,CSV中导入数据,或从模板开始。无需重新创建已存在的内容。" @@ -1575,8 +1603,8 @@ msgstr "从右到左" msgid "Right-click nodes for options" msgstr "右键点击节点以获得选项" -#: src/components/Header.tsx:165 -#: src/components/Header.tsx:409 +#: src/components/Header.tsx:167 +#: src/components/Header.tsx:411 #: src/pages/Roadmap.tsx:31 msgid "Roadmap" msgstr "路线图" @@ -1590,7 +1618,7 @@ msgstr "旋转标签" msgid "SVG Export is a Pro Feature" msgstr "SVG导出是专业功能" -#: src/pages/Pricing2.tsx:110 +#: src/pages/Pricing2.tsx:112 msgid "SVG, PDF & all export formats" msgstr "支持SVG,PDF和所有导出格式" @@ -1603,7 +1631,7 @@ msgstr "满意保证或第一次付款退款" msgid "Save" msgstr "救球" -#: src/pages/Pricing2.tsx:97 +#: src/pages/Pricing2.tsx:99 msgid "Save locally, work offline, and control exactly who sees what. No data leaves your machine unless you say so." msgstr "本地保存,离线工作,并且可以精确控制谁可以看到什么。除非您允许,否则不会将数据传输到其他地方。" @@ -1635,7 +1663,7 @@ msgstr "安全付款" msgid "See more reviews on Product Hunt" msgstr "在Product Hunt上查看更多评论" -#: src/pages/Pricing2.tsx:318 +#: src/pages/Pricing2.tsx:327 msgid "See what's possible" msgstr "查看可行性" @@ -1651,9 +1679,9 @@ msgstr "发送我们消息" msgid "Set a consistent height for all nodes" msgstr "设置所有节点的统一高度" -#: src/components/Header.tsx:183 -#: src/components/Header.tsx:414 -#: src/components/Settings.tsx:34 +#: src/components/Header.tsx:185 +#: src/components/Header.tsx:416 +#: src/components/Settings.tsx:35 msgid "Settings" msgstr "设置" @@ -1738,7 +1766,7 @@ msgstr "重新開始" msgid "Start faster with use-case specific templates" msgstr "使用特定用例模板加快启动" -#: src/pages/Pricing2.tsx:339 +#: src/pages/Pricing2.tsx:348 msgid "Start for free" msgstr "免费开始" @@ -1789,7 +1817,7 @@ msgstr "訂閱成功!" msgid "Subscription will end" msgstr "订阅即将到期" -#: src/components/Settings.tsx:133 +#: src/components/Settings.tsx:150 msgid "Support" msgstr "支持" @@ -1812,7 +1840,7 @@ msgstr "目標分隔符" msgid "Target Distance From Node" msgstr "目標距離節點" -#: src/pages/Pricing2.tsx:79 +#: src/pages/Pricing2.tsx:81 msgid "Tell the AI what you need in plain English. Your diagram builds itself in seconds." msgstr "用简单的英语告诉AI你需要什么。你的图表将在几秒钟内建立。" @@ -1856,7 +1884,7 @@ msgstr "在一行中的文本将创建一个节点,文本作为标签" msgid "Thank you for your feedback!" msgstr "感谢您的反馈!" -#: src/pages/Pricing2.tsx:245 +#: src/pages/Pricing2.tsx:254 msgid "The beauty and magic reside in the minimalism." msgstr "美和魔力都在于简约。" @@ -1884,7 +1912,7 @@ msgstr "用于分隔多个源节点的分隔符" msgid "The delimiter used to separate multiple target nodes" msgstr "用于分隔多个目标节点的分隔符" -#: src/pages/Pricing2.tsx:172 +#: src/pages/Pricing2.tsx:181 msgid "The fastest way to turn what's in your head into something everyone else can understand." msgstr "将你脑海中的想法快速转化成其他人都能理解的东西。" @@ -1911,7 +1939,7 @@ msgstr "主题定制编辑器" msgid "Theme Editor" msgstr "主题编辑器" -#: src/pages/Pricing2.tsx:104 +#: src/pages/Pricing2.tsx:106 msgid "Theme editor" msgstr "主题编辑器" @@ -2000,10 +2028,14 @@ msgstr "尝试调整您的搜索或筛选条件以找到您想要的内容。" msgid "Try again" msgstr "重试" -#: src/pages/Pricing2.tsx:199 +#: src/pages/Pricing2.tsx:208 msgid "Try it free" msgstr "免费试用" +#: src/lib/toneRowProjects.ts:20 +msgid "Turn documents into diagrams with AI" +msgstr "使用人工智能将文档转换为图表" + #: src/lib/parserErrors.tsx:60 msgid "Two edges have the same ID" msgstr "两个边有相同的ID" @@ -2012,7 +2044,7 @@ msgstr "两个边有相同的ID" msgid "Two nodes have the same ID" msgstr "两个节点有相同的ID" -#: src/pages/Pricing2.tsx:286 +#: src/pages/Pricing2.tsx:295 msgid "Type it. See it." msgstr "输入,即可查看" @@ -2057,7 +2089,7 @@ msgstr "无限永久流程图" msgid "Unlimited cloud-saved flowcharts" msgstr "无限云端保存的流程图" -#: src/pages/Pricing2.tsx:109 +#: src/pages/Pricing2.tsx:111 msgid "Unlimited saved diagrams" msgstr "无限保存的图表" @@ -2089,13 +2121,17 @@ msgstr "立即升级 - 保存我的工作" msgid "Upgrade to Flowchart Fun Pro and unlock:" msgstr "升级到Flowchart Fun Pro并解锁:" +#: src/pages/Pricing2.tsx:157 +msgid "Upgrade to Flowchart Fun Pro for unlimited hosted charts, watermark-free high-resolution exports, AI editing, and more. $4/month billed yearly." +msgstr "升级至Flowchart Fun Pro,享受无限托管图表、无水印高清导出、人工智能编辑等功能。每月$4,年付。" + #: src/components/DownloadDropdown.tsx:85 msgid "Upgrade to Flowchart Fun Pro to unlock SVG exports and enjoy more advanced features for your diagrams." msgstr "升级到Flowchart Fun Pro,解锁SVG导出功能,并享受更多高级功能来创建您的图表。" #: src/components/FeatureBreakdown.tsx:305 -#: src/components/Header.tsx:422 -#: src/pages/Pricing2.tsx:373 +#: src/components/Header.tsx:424 +#: src/pages/Pricing2.tsx:382 msgid "Upgrade to Pro" msgstr "升級到專業版" @@ -2152,7 +2188,7 @@ msgstr "使用此文件进行顺序、流程和工作流程。" msgid "Use this mode to modify and enhance your current chart." msgstr "使用此模式来修改和增强您当前的图表。" -#: src/pages/Pricing2.tsx:209 +#: src/pages/Pricing2.tsx:218 msgid "Used at" msgstr "使用于" @@ -2164,7 +2200,7 @@ msgstr "用户" msgid "Vector Export (SVG)" msgstr "矢量导出(SVG)" -#: src/components/Settings.tsx:109 +#: src/components/Settings.tsx:110 msgid "View on Github" msgstr "在 Github 上查看" @@ -2302,7 +2338,7 @@ msgstr "你的沙盒是一个可以自由尝试我们的流程图工具的空间 msgid "Your charts are read-only because your account is no longer active. Visit your <0>account page to learn more." msgstr "您的图表是只读的,因为您的帐户已不再活跃。请访问您的<0>帐户页面了解更多信息。" -#: src/pages/Pricing2.tsx:392 +#: src/pages/Pricing2.tsx:401 msgid "Your next diagram should be your best one." msgstr "您的下一张图表应该是最好的一张。" @@ -2310,7 +2346,7 @@ msgstr "您的下一张图表应该是最好的一张。" msgid "Your subscription is <0>{statusDisplay}." msgstr "您的訂閱狀態為<0>{statusDisplay}。" -#: src/pages/Pricing2.tsx:95 +#: src/pages/Pricing2.tsx:97 msgid "Your work stays yours" msgstr "您的工作始终属于您。" @@ -2333,10 +2369,10 @@ msgid "or" msgstr "或" #: src/components/Checkout.tsx:171 -#: src/pages/Pricing2.tsx:271 -#: src/pages/Pricing2.tsx:274 -#: src/pages/Pricing2.tsx:331 -#: src/pages/Pricing2.tsx:361 +#: src/pages/Pricing2.tsx:280 +#: src/pages/Pricing2.tsx:283 +#: src/pages/Pricing2.tsx:340 +#: src/pages/Pricing2.tsx:370 msgid "{0}" msgstr "{0}" diff --git a/app/src/pages/Pricing2.tsx b/app/src/pages/Pricing2.tsx index 791b93608..39b7af8a6 100644 --- a/app/src/pages/Pricing2.tsx +++ b/app/src/pages/Pricing2.tsx @@ -1,10 +1,12 @@ import classNames from "classnames"; import { Trans, t } from "@lingui/macro"; import { ReactNode } from "react"; +import { Helmet } from "react-helmet"; import { Link } from "react-router-dom"; import { Checkout } from "../components/Checkout"; import FAQ from "../components/FAQ"; import { useFadeIn } from "../lib/useFadeIn"; +import { TONE_ROW_URL, toneRowProjects } from "../lib/toneRowProjects"; import { Sparkle, Export, @@ -148,6 +150,13 @@ function CodeExample() { export default function Pricing2() { return (
+ + {t`Pricing`} - Flowchart Fun + + {/* Hero */}
+ + {/* Footer */} +
+ +

+ + Flowchart Fun is an open source project made by{" "} + + Tone Row + + +

+

+ + More from Tone Row: + + {toneRowProjects.map((project) => ( + + + {project.name} + {" "} + + — {project.description()} + + + ))} +

+
+
); } diff --git a/app/src/pages/Sandbox.tsx b/app/src/pages/Sandbox.tsx index e42068905..1bde10a97 100644 --- a/app/src/pages/Sandbox.tsx +++ b/app/src/pages/Sandbox.tsx @@ -28,6 +28,7 @@ import { FlowchartLayout } from "../components/FlowchartLayout"; import { useEditorStore, isInternalWrite } from "../lib/useEditorStore"; import { getDefaultText } from "../lib/getDefaultText"; import { AiToolbar } from "../components/AiToolbar"; +import { MoreFromToneRow } from "../components/MoreFromToneRow"; import { markUserEditedSinceAi, usePromptStore } from "../lib/usePromptStore"; const isE2E = @@ -144,6 +145,7 @@ const Sandbox = memo(function Edit() {
+
Date: Thu, 16 Jul 2026 09:49:16 -0400 Subject: [PATCH 10/10] chore: version feature --- app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/package.json b/app/package.json index 40d7c8df3..4edc952c8 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "1.64.2", + "version": "1.65.0", "main": "module/module.js", "license": "MIT", "scripts": {