@nice2dev/i18n 1.0.21 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { jsx as B } from "react/jsx-runtime";
2
- import { useMemo as b, useContext as N, createContext as I, useEffect as L, useState as P, useCallback as ee } from "react";
3
- const j = [
1
+ import { jsx as O } from "react/jsx-runtime";
2
+ import { useMemo as b, useContext as B, createContext as I, useEffect as L, useState as T, useCallback as ee } from "react";
3
+ const x = [
4
4
  "en",
5
5
  "pl",
6
6
  "de",
@@ -40,7 +40,9 @@ const j = [
40
40
  // Filipino
41
41
  "ms"
42
42
  // Malay
43
- ], ye = {
43
+ ], ke = {
44
+ "tutorial.viewEditor.intro.title": "View editor",
45
+ "tutorial.viewEditor.intro.content": "Author any view kind from one place: choose the kind (or scaffold from an entity), drag controls from the palette into the grid cells, then configure each cell — data binding, role permissions and event actions. Switch Design / Preview / Source, and Save when valid.",
44
46
  // ── Global / Generic ──
45
47
  ok: "OK",
46
48
  cancel: "Cancel",
@@ -144,6 +146,180 @@ const j = [
144
146
  "navShell.home.sections.openTabs": "Open now",
145
147
  "navShell.home.sections.shortcuts": "Your shortcuts",
146
148
  "navShell.home.sections.allViews": "All views",
149
+ // ── NiceTutorial (autoplay controls) ──
150
+ "tutorial.play": "Play",
151
+ "tutorial.pause": "Pause",
152
+ "tutorial.speed": "Speed",
153
+ "tutorial.close": "Close",
154
+ // ── NiceTutorial launcher (generic) ──
155
+ "tutorial.start": "Tutorial",
156
+ "tutorial.startAria": "Start tutorial",
157
+ "tutorial.next": "Next",
158
+ "tutorial.back": "Back",
159
+ "tutorial.finish": "Finish",
160
+ "tutorial.skip": "Skip",
161
+ "tutorial.stepOf": "of",
162
+ // ── NiceModuleEditor tour ──
163
+ "tutorial.moduleEditor.browser.title": "Module browser",
164
+ "tutorial.moduleEditor.browser.content": "Pick a module here to open its manifest, entities and translations.",
165
+ "tutorial.moduleEditor.validate.title": "Validate",
166
+ "tutorial.moduleEditor.validate.content": "Check the module against the manifest schema. Issues appear in the status bar and output.",
167
+ "tutorial.moduleEditor.save.title": "Save",
168
+ "tutorial.moduleEditor.save.content": "Persist your changes through the configured data provider (e.g. write files back to disk).",
169
+ "tutorial.manifestEditor.intro.title": "Manifest editor",
170
+ "tutorial.manifestEditor.intro.content": "Edit the manifest in schema-driven sections. Toggle Form ⇄ JSON per section; validation appears in the status bar.",
171
+ "tutorial.schemaForm.intro.title": "Schema form",
172
+ "tutorial.schemaForm.intro.content": "This form is generated from a schema. Required fields and validation errors are flagged; use the JSON toggle for raw editing.",
173
+ "tutorial.entityEditor.intro.title": "Entity editor",
174
+ "tutorial.entityEditor.intro.content": "Add entities on the left, then edit each entity’s metadata and its fields (type, keys, constraints) on the right.",
175
+ "tutorial.i18nEditor.intro.title": "Translations",
176
+ "tutorial.i18nEditor.intro.content": "Edit translations as a keys × locales grid. Add keys and locales; amber cells mark missing translations.",
177
+ "tutorial.formBuilder.intro.title": "Form builder",
178
+ "tutorial.formBuilder.intro.content": "Drag fields from the palette onto the canvas, then configure each field in the properties panel. Export the schema when done.",
179
+ "tutorial.formDesigner.intro.title": "Form designer",
180
+ "tutorial.formDesigner.intro.content": "Design data-entry forms with sections, lookups and calculated fields; bind them to your entity and preview live.",
181
+ "tutorial.paymentProviderConfig.intro.title": "Payment provider",
182
+ "tutorial.paymentProviderConfig.intro.content": "Pick a provider, fill its credentials (secrets are masked), choose test/live, enable methods and copy the webhook URL.",
183
+ "tutorial.webhookTester.intro.title": "Webhook tester",
184
+ "tutorial.webhookTester.intro.content": "Pick a saved payload (or write one), optionally sign it, send it to the endpoint and inspect the response.",
185
+ "tutorial.apiDesigner.intro.title": "API designer",
186
+ "tutorial.apiDesigner.intro.content": "Define endpoints, parameters, request/response schemas and security for your OpenAPI document.",
187
+ "tutorial.apiTester.intro.title": "API tester",
188
+ "tutorial.apiTester.intro.content": "Build requests with collections and environment variables, send them and assert on the responses.",
189
+ "tutorial.integrationBuilder.intro.title": "Integration builder",
190
+ "tutorial.integrationBuilder.intro.content": "Wire a flow of nodes (triggers → actions → error handling) and connect them to build an integration.",
191
+ "tutorial.scriptRunner.intro.title": "Script runner",
192
+ "tutorial.scriptRunner.intro.content": "Write a script and sample input, click Run, then inspect the result and captured logs below.",
193
+ "tutorial.lifecycleHooks.intro.title": "Lifecycle hooks",
194
+ "tutorial.lifecycleHooks.intro.content": "Bind handlers to each trigger, set their order and enable flag, and add an optional condition that gates execution.",
195
+ "tutorial.revisionHistory.intro.title": "Revision history",
196
+ "tutorial.revisionHistory.intro.content": "Pick a revision, choose another to compare, review the side-by-side diff, then restore an earlier version if needed.",
197
+ "tutorial.markdownEditor.intro.title": "Markdown editor",
198
+ "tutorial.markdownEditor.intro.content": "Write Markdown with the formatting toolbar; toggle the live preview to see the rendered result, and export to HTML.",
199
+ "tutorial.htmlEditor.intro.title": "Rich text editor",
200
+ "tutorial.htmlEditor.intro.content": "Format text with the toolbar, insert links, images and tables, and switch to HTML or Markdown source when you need it.",
201
+ "tutorial.documentEditor.intro.title": "Document editor",
202
+ "tutorial.documentEditor.intro.content": "Compose a document from blocks: use the toolbar or slash commands to add headings, lists, media and more, then export to HTML.",
203
+ "tutorial.codeEditor.intro.title": "Code editor",
204
+ "tutorial.codeEditor.intro.content": "Edit code with syntax highlighting, IntelliSense and the toolbar. Ctrl+S saves; the status bar shows the cursor position and any problems.",
205
+ "tutorial.kanbanBoard.intro.title": "Kanban board",
206
+ "tutorial.kanbanBoard.intro.content": 'Drag cards between columns to change their status, add cards with the "+" button, and click a card to edit its details.',
207
+ "tutorial.queryBuilder.intro.title": "Query builder",
208
+ "tutorial.queryBuilder.intro.content": "Add tables, pick columns, define joins, conditions and sorting visually — the SQL is generated for you. Switch to the SQL tab to review it.",
209
+ "tutorial.stateDesigner.intro.title": "State designer",
210
+ "tutorial.stateDesigner.intro.content": "Model your store as slices with fields and actions, pick a target (e.g. Zustand) and export ready-to-use state-management code.",
211
+ "tutorial.componentDesigner.intro.title": "Component designer",
212
+ "tutorial.componentDesigner.intro.content": "Name your component, declare its props with types and requirements, and preview the generated TypeScript interface live.",
213
+ "tutorial.pageBuilder.intro.title": "Page builder",
214
+ "tutorial.pageBuilder.intro.content": "Drag components from the sidebar onto the responsive grid, switch the desktop/tablet/mobile preview, and save the layout.",
215
+ "tutorial.lowCodeStudio.intro.title": "Low-code studio",
216
+ "tutorial.lowCodeStudio.intro.content": "Drag components from the sidebar onto the canvas, then switch between Design, Preview and Code tabs to build and export your app.",
217
+ "tutorial.testBuilder.intro.title": "Test builder",
218
+ "tutorial.testBuilder.intro.content": "Build test suites visually: add cases and interaction steps with assertions, run them, and export to a ready-to-run .test.tsx file.",
219
+ "tutorial.workflowDesigner.intro.title": "Workflow designer",
220
+ "tutorial.workflowDesigner.intro.content": "Add states and transitions on the canvas, validate the flow, simulate it, then test or publish your workflow.",
221
+ "tutorial.themeBuilder.intro.title": "Theme builder",
222
+ "tutorial.themeBuilder.intro.content": "Start from a preset, tweak colors, typography and other tokens by section, preview live, then apply or export the theme.",
223
+ "tutorial.filterBuilder.intro.title": "Filter builder",
224
+ "tutorial.filterBuilder.intro.content": "Build complex AND/OR filter trees: add conditions and nested groups, choose fields and operators, and save reusable presets.",
225
+ "tutorial.diagramDesigner.intro.title": "Diagram designer",
226
+ "tutorial.diagramDesigner.intro.content": "Drag shapes from the palette onto the canvas, connect them with connectors, edit properties on the right, then export to SVG, PNG or JSON.",
227
+ "tutorial.reportBuilder.intro.title": "Report builder",
228
+ "tutorial.reportBuilder.intro.content": "Drag sections onto the report, bind them to data sources, arrange the layout, then export to PDF, HTML or XLSX.",
229
+ "tutorial.erpReportDesigner.intro.title": "Report designer",
230
+ "tutorial.erpReportDesigner.intro.content": "Lay out banded reports: drop elements (fields, expressions, charts) into bands, bind data connections, edit properties, then preview and export.",
231
+ "tutorial.recipeEditor.intro.title": "Recipe editor",
232
+ "tutorial.recipeEditor.intro.content": "Edit recipe details, add and reorder ingredients and steps, attach photos, and import or export the recipe as JSON.",
233
+ "tutorial.pipelineEditor.intro.title": "Pipeline editor",
234
+ "tutorial.pipelineEditor.intro.content": "Build a CI/CD pipeline from stages, jobs and steps; set triggers, variables and secrets; then validate, save and run it.",
235
+ "tutorial.mergeRequestBuilder.intro.title": "Merge request builder",
236
+ "tutorial.mergeRequestBuilder.intro.content": "Pick source and target branches, write the title and description, add reviewers, labels and linked issues, then preview and submit.",
237
+ "tutorial.automationRuleEditor.intro.title": "Automation rule editor",
238
+ "tutorial.automationRuleEditor.intro.content": "Define the trigger, add optional conditions, then list the actions to run — switch between the three sections using the tabs.",
239
+ "tutorial.sceneActionBuilder.intro.title": "Scene action builder",
240
+ "tutorial.sceneActionBuilder.intro.content": "Add an action per device, set its target state and an optional delay, reorder them, and preview the scene sequence.",
241
+ "tutorial.backupTagEditor.intro.title": "Backup tags",
242
+ "tutorial.backupTagEditor.intro.content": "Tag this backup for easy retrieval: type a label and pick a color, or add one of the suggested tags; auto-generated tags are protected.",
243
+ "tutorial.dataMergeBuilder.intro.title": "Data merge",
244
+ "tutorial.dataMergeBuilder.intro.content": "Walk through the steps: choose source and target branches, preview changes, resolve conflicts, set options, then confirm the merge.",
245
+ "tutorial.invoiceLineEditor.intro.title": "Invoice lines",
246
+ "tutorial.invoiceLineEditor.intro.content": "Add line items with quantity, unit price, VAT and discount — net, gross and the VAT breakdown are calculated automatically.",
247
+ "tutorial.keyValueEditor.intro.title": "Key/value editor",
248
+ "tutorial.keyValueEditor.intro.content": "Add key/value rows for headers, params, env vars or config; mask secret values, toggle rows on/off, and watch for duplicate keys.",
249
+ "tutorial.imageEditor.intro.title": "Image editor",
250
+ "tutorial.imageEditor.intro.content": "Use the toolbar to crop, rotate, flip, adjust brightness/contrast and annotate; undo/redo your edits, then save the result.",
251
+ "tutorial.cropEditor.intro.title": "Crop editor",
252
+ "tutorial.cropEditor.intro.content": "Drag the crop box over the image, pick an aspect ratio, rotate, flip or zoom, then use the result.",
253
+ "tutorial.pdfAnnotationEditor.intro.title": "PDF annotations",
254
+ "tutorial.pdfAnnotationEditor.intro.content": "Pick a tool from the toolbar (highlight, underline, freehand, text…), mark up the page, navigate pages and zoom as needed.",
255
+ "tutorial.videoEditor.intro.title": "Video editor",
256
+ "tutorial.videoEditor.intro.content": "Add media to the timeline tracks, trim and arrange clips, edit clip properties, preview playback, then export the video.",
257
+ // ── Phase 4: domain-package editors ──
258
+ "tutorial.viewBuilder.intro.title": "View builder",
259
+ "tutorial.viewBuilder.intro.content": "Drag controls from the palette into the grid cells, configure each cell in the properties panel, and import, export or save the view.",
260
+ "tutorial.dashboardDesigner.intro.title": "Dashboard designer",
261
+ "tutorial.dashboardDesigner.intro.content": "Drag widgets from the palette onto the grid, resize and arrange them, configure each in the property panel, then preview or export the dashboard.",
262
+ "tutorial.workflowDesignerCanvas.intro.title": "Workflow designer",
263
+ "tutorial.workflowDesignerCanvas.intro.content": "Add trigger, action and condition nodes to the canvas and connect them; manage variables, validate the flow, then export it.",
264
+ "tutorial.armatureEditor.intro.title": "Armature editor",
265
+ "tutorial.armatureEditor.intro.content": "Select bones to edit their transforms, add or reparent bones, configure IK chains, and save or load poses.",
266
+ "tutorial.morphTargetEditor.intro.title": "Morph target editor",
267
+ "tutorial.morphTargetEditor.intro.content": "Blend the mesh’s morph targets with the per-target influence sliders, create or delete targets, and preview the interpolation.",
268
+ "tutorial.terrainEditor.intro.title": "Terrain editor",
269
+ "tutorial.terrainEditor.intro.content": "Sculpt the heightmap with brushes (raise, lower, flatten, smooth, noise), splat texture layers, generate procedural terrain, and import/export heightmaps.",
270
+ "tutorial.materialEditor.intro.title": "Material editor",
271
+ "tutorial.materialEditor.intro.content": "Build a shader as a node graph: drag nodes from the palette, wire their ports together, edit properties, and preview the compiled material.",
272
+ "tutorial.particleEditor.intro.title": "Particle editor",
273
+ "tutorial.particleEditor.intro.content": "Pick a particle system, tune its emitter and modules in the inspector, and play, pause or stop the live preview.",
274
+ "tutorial.uvEditor.intro.title": "UV editor",
275
+ "tutorial.uvEditor.intro.content": "Edit the mesh’s UV layout over the texture: select and transform UVs with the tools, switch UV channels, and apply your changes.",
276
+ "tutorial.fontEditor.intro.title": "Font editor",
277
+ "tutorial.fontEditor.intro.content": "Edit glyphs on the unicode grid, adjust font metrics and per-glyph paths and bearings, then export the font.",
278
+ "tutorial.iconEditor.intro.title": "Icon editor",
279
+ "tutorial.iconEditor.intro.content": "Draw and edit SVG shapes on the grid, tweak stroke and variant settings, preview on different backgrounds, and export to SVG, React or PNG.",
280
+ "tutorial.uiDesigner.intro.title": "UI designer",
281
+ "tutorial.uiDesigner.intro.content": "Drag components from the palette onto the canvas, edit their props in the panel, preview responsive breakpoints, and export to React/TSX.",
282
+ "tutorial.gameEditor.intro.title": "Game editor",
283
+ "tutorial.gameEditor.intro.content": "Build your scene in the viewport using the hierarchy and asset panels, tweak entities in the inspector, and save the project.",
284
+ "tutorial.levelEditor.intro.title": "Level editor",
285
+ "tutorial.levelEditor.intro.content": "Build the game world: place and snap objects across layers, paint terrain, lay out splines and lights, then bake lightmaps.",
286
+ "tutorial.gameMaterialEditor.intro.title": "Material editor",
287
+ "tutorial.gameMaterialEditor.intro.content": "Author a shader as a node graph: add and connect shader nodes, edit their properties, and compile the material.",
288
+ "tutorial.gameParticleEditor.intro.title": "Particle editor",
289
+ "tutorial.gameParticleEditor.intro.content": "Tune the particle system in the inspector — emitter, lifetime, curves and rendering — and play, pause or restart the live preview.",
290
+ "tutorial.floorPlanEditor.intro.title": "Floor plan editor",
291
+ "tutorial.floorPlanEditor.intro.content": "Draw rooms and zones with the tools, place devices on the plan, switch floors and toggle overlays like dimensions, grid and occupancy.",
292
+ "tutorial.buildingSceneEditor.intro.title": "Scene editor",
293
+ "tutorial.buildingSceneEditor.intro.content": "Create scenes that set multiple devices at once: pick a scene, choose device target states, then save or activate it.",
294
+ "tutorial.buildingAutomationEditor.intro.title": "Automation editor",
295
+ "tutorial.buildingAutomationEditor.intro.content": "Create building automations: pick one from the list, define its triggers, conditions and actions, then save, enable or delete it.",
296
+ "tutorial.spatialEditor.intro.title": "Spatial editor",
297
+ "tutorial.spatialEditor.intro.content": "Lay out floor plans across modes: draw walls, rooms and objects with the tools, manage layers, snap to the grid, then export.",
298
+ "tutorial.decisionTreeEditor.intro.title": "Decision tree editor",
299
+ "tutorial.decisionTreeEditor.intro.content": "Explore the decision tree: click nodes to inspect conditions and outcomes, toggle metrics, probabilities and samples, and highlight a path for an input.",
300
+ "tutorial.diagramEditor.intro.title": "Diagram editor",
301
+ "tutorial.diagramEditor.intro.content": "Pick a tool to add and connect nodes on the canvas, edit them in the property panel, and export the diagram from the toolbar.",
302
+ "tutorial.contractEditor.intro.title": "Contract editor",
303
+ "tutorial.contractEditor.intro.content": "Assemble the contract from the clause library, fill template variables, track versions and approvals, then save or export to PDF/DOCX/HTML.",
304
+ "tutorial.invoiceDesigner.intro.title": "Invoice designer",
305
+ "tutorial.invoiceDesigner.intro.content": "Drag elements onto the invoice canvas, bind them to data fields, align with the grid and rulers, then save or export to PDF.",
306
+ "tutorial.presentationEditor.intro.title": "Presentation editor",
307
+ "tutorial.presentationEditor.intro.content": "Build slides from the thumbnail rail, add and arrange elements on the canvas, edit them in the property panel, then present or export.",
308
+ // ── Phase 4 tail: standalone packages (ui-bi/ui-video/ui-ai/ui-math/ui-audio) ──
309
+ "tutorial.dashboardStudio.intro.title": "Dashboard studio",
310
+ "tutorial.dashboardStudio.intro.content": "Drag widgets from the palette onto the grid, bind them to data sources, add filters, then toggle Edit/View, refresh and save.",
311
+ "tutorial.biReportBuilder.intro.title": "Report builder",
312
+ "tutorial.biReportBuilder.intro.content": "Drag elements from the palette onto the report, bind them to data sources, switch design/preview, then export to PDF or Excel.",
313
+ "tutorial.etlBuilder.intro.title": "ETL builder",
314
+ "tutorial.etlBuilder.intro.content": "Wire sources → transformations → destinations into a pipeline, switch the views, then run it and save the configuration.",
315
+ "tutorial.videoEditorPro.intro.title": "Video editor",
316
+ "tutorial.videoEditorPro.intro.content": "Add media to the timeline, arrange and trim clips, apply effects and transitions, then configure and run the export.",
317
+ "tutorial.mlStudio.intro.title": "ML studio",
318
+ "tutorial.mlStudio.intro.content": "Work through the tabs: prepare datasets, run experiments, compare and pick models, then deploy the best one.",
319
+ "tutorial.mathEditor.intro.title": "Math editor",
320
+ "tutorial.mathEditor.intro.content": "Write equations as LaTeX or insert symbols from the palette; switch to handwriting input, and preview the rendered formula live.",
321
+ "tutorial.dmxEditor.intro.title": "DMX editor",
322
+ "tutorial.dmxEditor.intro.content": "Pick the FTDI device and port, then set each DMX channel’s value with the sliders to control your lighting fixtures live.",
147
323
  // ── Sidebar context menu ──
148
324
  "sidebar.menu.open": "Open",
149
325
  "sidebar.menu.openNewTab": "Open in new tab",
@@ -785,7 +961,9 @@ const j = [
785
961
  "vectorEditor.layers.hide": "Hide",
786
962
  "vectorEditor.layers.lock": "Lock",
787
963
  "vectorEditor.layers.unlock": "Unlock"
788
- }, Ee = {
964
+ }, ye = {
965
+ "tutorial.viewEditor.intro.title": "Edytor widoków",
966
+ "tutorial.viewEditor.intro.content": "Twórz dowolny rodzaj widoku w jednym miejscu: wybierz rodzaj (lub wygeneruj z encji), przeciągaj kontrolki z palety do komórek siatki, a następnie skonfiguruj każdą komórkę — wiązanie danych, uprawnienia ról i akcje zdarzeń. Przełączaj Projekt / Podgląd / Źródło i zapisz, gdy widok jest poprawny.",
789
967
  ok: "OK",
790
968
  cancel: "Anuluj",
791
969
  save: "Zapisz",
@@ -887,6 +1065,180 @@ const j = [
887
1065
  "navShell.home.sections.openTabs": "Otwarte teraz",
888
1066
  "navShell.home.sections.shortcuts": "Twoje skróty",
889
1067
  "navShell.home.sections.allViews": "Wszystkie widoki",
1068
+ // ── NiceTutorial (autoplay controls) ──
1069
+ "tutorial.play": "Odtwórz",
1070
+ "tutorial.pause": "Pauza",
1071
+ "tutorial.speed": "Prędkość",
1072
+ "tutorial.close": "Zamknij",
1073
+ // ── NiceTutorial launcher (generic) ──
1074
+ "tutorial.start": "Samouczek",
1075
+ "tutorial.startAria": "Uruchom samouczek",
1076
+ "tutorial.next": "Dalej",
1077
+ "tutorial.back": "Wstecz",
1078
+ "tutorial.finish": "Zakończ",
1079
+ "tutorial.skip": "Pomiń",
1080
+ "tutorial.stepOf": "z",
1081
+ // ── NiceModuleEditor tour ──
1082
+ "tutorial.moduleEditor.browser.title": "Przeglądarka modułów",
1083
+ "tutorial.moduleEditor.browser.content": "Wybierz moduł, aby otworzyć jego manifest, encje i tłumaczenia.",
1084
+ "tutorial.moduleEditor.validate.title": "Walidacja",
1085
+ "tutorial.moduleEditor.validate.content": "Sprawdź moduł względem schematu manifestu. Problemy pojawią się na pasku statusu i w logach.",
1086
+ "tutorial.moduleEditor.save.title": "Zapis",
1087
+ "tutorial.moduleEditor.save.content": "Zapisz zmiany przez skonfigurowany data provider (np. zapis plików na dysk).",
1088
+ "tutorial.manifestEditor.intro.title": "Edytor manifestu",
1089
+ "tutorial.manifestEditor.intro.content": "Edytuj manifest w sekcjach opartych na schemacie. Przełączaj Formularz ⇄ JSON w sekcji; walidacja widoczna na pasku statusu.",
1090
+ "tutorial.schemaForm.intro.title": "Formularz ze schematu",
1091
+ "tutorial.schemaForm.intro.content": "Ten formularz jest generowany ze schematu. Pola wymagane i błędy walidacji są oznaczane; użyj przełącznika JSON do edycji surowej.",
1092
+ "tutorial.entityEditor.intro.title": "Edytor encji",
1093
+ "tutorial.entityEditor.intro.content": "Dodawaj encje po lewej, a po prawej edytuj metadane encji i jej pola (typ, klucze, ograniczenia).",
1094
+ "tutorial.i18nEditor.intro.title": "Tłumaczenia",
1095
+ "tutorial.i18nEditor.intro.content": "Edytuj tłumaczenia w siatce klucze × locale. Dodawaj klucze i języki; bursztynowe komórki oznaczają braki.",
1096
+ "tutorial.formBuilder.intro.title": "Kreator formularzy",
1097
+ "tutorial.formBuilder.intro.content": "Przeciągaj pola z palety na kanwę, a potem konfiguruj każde pole w panelu właściwości. Na koniec wyeksportuj schemat.",
1098
+ "tutorial.formDesigner.intro.title": "Projektant formularzy",
1099
+ "tutorial.formDesigner.intro.content": "Projektuj formularze z sekcjami, lookupami i polami wyliczanymi; powiąż je z encją i podglądaj na żywo.",
1100
+ "tutorial.paymentProviderConfig.intro.title": "Dostawca płatności",
1101
+ "tutorial.paymentProviderConfig.intro.content": "Wybierz dostawcę, uzupełnij dane (sekrety są maskowane), wybierz test/live, włącz metody i skopiuj URL webhooka.",
1102
+ "tutorial.webhookTester.intro.title": "Tester webhooków",
1103
+ "tutorial.webhookTester.intro.content": "Wybierz zapisany payload (lub napisz własny), opcjonalnie go podpisz, wyślij na endpoint i sprawdź odpowiedź.",
1104
+ "tutorial.apiDesigner.intro.title": "Projektant API",
1105
+ "tutorial.apiDesigner.intro.content": "Zdefiniuj endpointy, parametry, schematy żądań/odpowiedzi i zabezpieczenia dokumentu OpenAPI.",
1106
+ "tutorial.apiTester.intro.title": "Tester API",
1107
+ "tutorial.apiTester.intro.content": "Buduj żądania z kolekcjami i zmiennymi środowiska, wysyłaj je i sprawdzaj asercje na odpowiedziach.",
1108
+ "tutorial.integrationBuilder.intro.title": "Kreator integracji",
1109
+ "tutorial.integrationBuilder.intro.content": "Połącz przepływ węzłów (wyzwalacze → akcje → obsługa błędów), aby zbudować integrację.",
1110
+ "tutorial.scriptRunner.intro.title": "Runner skryptów",
1111
+ "tutorial.scriptRunner.intro.content": "Napisz skrypt i przykładowe dane wejściowe, kliknij Uruchom, a poniżej sprawdź wynik i przechwycone logi.",
1112
+ "tutorial.lifecycleHooks.intro.title": "Haki cyklu życia",
1113
+ "tutorial.lifecycleHooks.intro.content": "Przypisz uchwyty do każdego wyzwalacza, ustaw ich kolejność i flagę włączenia oraz dodaj opcjonalny warunek wykonania.",
1114
+ "tutorial.revisionHistory.intro.title": "Historia wersji",
1115
+ "tutorial.revisionHistory.intro.content": "Wybierz wersję, wskaż drugą do porównania, przejrzyj różnice obok siebie, a w razie potrzeby przywróć wcześniejszą wersję.",
1116
+ "tutorial.markdownEditor.intro.title": "Edytor Markdown",
1117
+ "tutorial.markdownEditor.intro.content": "Pisz w Markdown za pomocą paska formatowania; włącz podgląd na żywo, aby zobaczyć wynik, i eksportuj do HTML.",
1118
+ "tutorial.htmlEditor.intro.title": "Edytor tekstu sformatowanego",
1119
+ "tutorial.htmlEditor.intro.content": "Formatuj tekst paskiem narzędzi, wstawiaj linki, obrazy i tabele oraz przełączaj się na źródło HTML lub Markdown, gdy tego potrzebujesz.",
1120
+ "tutorial.documentEditor.intro.title": "Edytor dokumentów",
1121
+ "tutorial.documentEditor.intro.content": "Twórz dokument z bloków: użyj paska narzędzi lub komend slash, aby dodać nagłówki, listy, media i więcej, a następnie wyeksportuj do HTML.",
1122
+ "tutorial.codeEditor.intro.title": "Edytor kodu",
1123
+ "tutorial.codeEditor.intro.content": "Edytuj kod z podświetlaniem składni, IntelliSense i paskiem narzędzi. Ctrl+S zapisuje; pasek stanu pokazuje pozycję kursora i ewentualne problemy.",
1124
+ "tutorial.kanbanBoard.intro.title": "Tablica Kanban",
1125
+ "tutorial.kanbanBoard.intro.content": 'Przeciągaj karty między kolumnami, aby zmienić ich status, dodawaj karty przyciskiem „+", a kliknij kartę, aby edytować jej szczegóły.',
1126
+ "tutorial.queryBuilder.intro.title": "Kreator zapytań",
1127
+ "tutorial.queryBuilder.intro.content": "Dodawaj tabele, wybieraj kolumny, definiuj złączenia, warunki i sortowanie wizualnie — SQL zostanie wygenerowany automatycznie. Przejdź na kartę SQL, aby go sprawdzić.",
1128
+ "tutorial.stateDesigner.intro.title": "Projektant stanu",
1129
+ "tutorial.stateDesigner.intro.content": "Modeluj magazyn jako wycinki z polami i akcjami, wybierz cel (np. Zustand) i wyeksportuj gotowy kod zarządzania stanem.",
1130
+ "tutorial.componentDesigner.intro.title": "Projektant komponentów",
1131
+ "tutorial.componentDesigner.intro.content": "Nazwij komponent, zadeklaruj jego właściwości wraz z typami i wymaganiami oraz zobacz na żywo wygenerowany interfejs TypeScript.",
1132
+ "tutorial.pageBuilder.intro.title": "Kreator stron",
1133
+ "tutorial.pageBuilder.intro.content": "Przeciągaj komponenty z paska bocznego na responsywną siatkę, przełączaj podgląd desktop/tablet/mobile i zapisz układ.",
1134
+ "tutorial.lowCodeStudio.intro.title": "Studio low-code",
1135
+ "tutorial.lowCodeStudio.intro.content": "Przeciągaj komponenty z paska bocznego na kanwę, a następnie przełączaj się między kartami Projekt, Podgląd i Kod, aby zbudować i wyeksportować aplikację.",
1136
+ "tutorial.testBuilder.intro.title": "Kreator testów",
1137
+ "tutorial.testBuilder.intro.content": "Buduj zestawy testów wizualnie: dodawaj przypadki i kroki interakcji z asercjami, uruchamiaj je i eksportuj do gotowego pliku .test.tsx.",
1138
+ "tutorial.workflowDesigner.intro.title": "Projektant przepływów",
1139
+ "tutorial.workflowDesigner.intro.content": "Dodawaj stany i przejścia na kanwie, sprawdzaj poprawność przepływu, symuluj go, a następnie testuj lub publikuj swój workflow.",
1140
+ "tutorial.themeBuilder.intro.title": "Kreator motywów",
1141
+ "tutorial.themeBuilder.intro.content": "Zacznij od gotowego motywu, dostosuj kolory, typografię i inne tokeny według sekcji, podglądaj na żywo, a następnie zastosuj lub wyeksportuj motyw.",
1142
+ "tutorial.filterBuilder.intro.title": "Kreator filtrów",
1143
+ "tutorial.filterBuilder.intro.content": "Buduj złożone drzewa filtrów AND/OR: dodawaj warunki i zagnieżdżone grupy, wybieraj pola i operatory oraz zapisuj wielokrotnego użytku presety.",
1144
+ "tutorial.diagramDesigner.intro.title": "Projektant diagramów",
1145
+ "tutorial.diagramDesigner.intro.content": "Przeciągaj kształty z palety na kanwę, łącz je konektorami, edytuj właściwości po prawej, a następnie eksportuj do SVG, PNG lub JSON.",
1146
+ "tutorial.reportBuilder.intro.title": "Kreator raportów",
1147
+ "tutorial.reportBuilder.intro.content": "Przeciągaj sekcje na raport, wiąż je ze źródłami danych, układaj układ, a następnie eksportuj do PDF, HTML lub XLSX.",
1148
+ "tutorial.erpReportDesigner.intro.title": "Projektant raportów",
1149
+ "tutorial.erpReportDesigner.intro.content": "Projektuj raporty pasmowe: umieszczaj elementy (pola, wyrażenia, wykresy) w pasmach, wiąż połączenia danych, edytuj właściwości, a następnie podglądaj i eksportuj.",
1150
+ "tutorial.recipeEditor.intro.title": "Edytor przepisów",
1151
+ "tutorial.recipeEditor.intro.content": "Edytuj szczegóły przepisu, dodawaj i zmieniaj kolejność składników i kroków, dołączaj zdjęcia oraz importuj lub eksportuj przepis jako JSON.",
1152
+ "tutorial.pipelineEditor.intro.title": "Edytor pipeline’ów",
1153
+ "tutorial.pipelineEditor.intro.content": "Zbuduj pipeline CI/CD z etapów, zadań i kroków; ustaw wyzwalacze, zmienne i sekrety; następnie sprawdź, zapisz i uruchom go.",
1154
+ "tutorial.mergeRequestBuilder.intro.title": "Kreator merge requestów",
1155
+ "tutorial.mergeRequestBuilder.intro.content": "Wybierz gałąź źródłową i docelową, napisz tytuł i opis, dodaj recenzentów, etykiety i powiązane zgłoszenia, a następnie podejrzyj i wyślij.",
1156
+ "tutorial.automationRuleEditor.intro.title": "Edytor reguł automatyzacji",
1157
+ "tutorial.automationRuleEditor.intro.content": "Zdefiniuj wyzwalacz, dodaj opcjonalne warunki, a następnie wypisz akcje do wykonania — przełączaj się między trzema sekcjami za pomocą kart.",
1158
+ "tutorial.sceneActionBuilder.intro.title": "Kreator akcji sceny",
1159
+ "tutorial.sceneActionBuilder.intro.content": "Dodaj akcję dla każdego urządzenia, ustaw jego stan docelowy i opcjonalne opóźnienie, zmieniaj kolejność i podglądaj sekwencję sceny.",
1160
+ "tutorial.backupTagEditor.intro.title": "Tagi kopii zapasowej",
1161
+ "tutorial.backupTagEditor.intro.content": "Otaguj tę kopię zapasową dla łatwego odnalezienia: wpisz etykietę i wybierz kolor lub dodaj jeden z sugerowanych tagów; tagi automatyczne są chronione.",
1162
+ "tutorial.dataMergeBuilder.intro.title": "Scalanie danych",
1163
+ "tutorial.dataMergeBuilder.intro.content": "Przejdź przez kroki: wybierz gałąź źródłową i docelową, podejrzyj zmiany, rozwiąż konflikty, ustaw opcje, a następnie potwierdź scalanie.",
1164
+ "tutorial.invoiceLineEditor.intro.title": "Pozycje faktury",
1165
+ "tutorial.invoiceLineEditor.intro.content": "Dodawaj pozycje z ilością, ceną jednostkową, VAT i rabatem — kwoty netto, brutto i rozbicie VAT są obliczane automatycznie.",
1166
+ "tutorial.keyValueEditor.intro.title": "Edytor klucz/wartość",
1167
+ "tutorial.keyValueEditor.intro.content": "Dodawaj wiersze klucz/wartość dla nagłówków, parametrów, zmiennych środowiskowych lub konfiguracji; maskuj sekrety, włączaj/wyłączaj wiersze i wykrywaj duplikaty kluczy.",
1168
+ "tutorial.imageEditor.intro.title": "Edytor obrazów",
1169
+ "tutorial.imageEditor.intro.content": "Użyj paska narzędzi, aby przyciąć, obrócić, odbić, dostosować jasność/kontrast i dodać adnotacje; cofaj/ponawiaj zmiany, a następnie zapisz wynik.",
1170
+ "tutorial.cropEditor.intro.title": "Edytor kadrowania",
1171
+ "tutorial.cropEditor.intro.content": "Przeciągnij ramkę kadrowania na obrazie, wybierz proporcje, obróć, odbij lub przybliż, a następnie użyj wyniku.",
1172
+ "tutorial.pdfAnnotationEditor.intro.title": "Adnotacje PDF",
1173
+ "tutorial.pdfAnnotationEditor.intro.content": "Wybierz narzędzie z paska (zakreślacz, podkreślenie, odręczne, tekst…), nanieś adnotacje na stronę, przechodź między stronami i przybliżaj w razie potrzeby.",
1174
+ "tutorial.videoEditor.intro.title": "Edytor wideo",
1175
+ "tutorial.videoEditor.intro.content": "Dodawaj media do ścieżek osi czasu, przycinaj i układaj klipy, edytuj właściwości klipów, podglądaj odtwarzanie, a następnie eksportuj wideo.",
1176
+ // ── Phase 4: edytory pakietów domenowych ──
1177
+ "tutorial.viewBuilder.intro.title": "Kreator widoków",
1178
+ "tutorial.viewBuilder.intro.content": "Przeciągaj kontrolki z palety do komórek siatki, konfiguruj każdą komórkę w panelu właściwości oraz importuj, eksportuj lub zapisz widok.",
1179
+ "tutorial.dashboardDesigner.intro.title": "Projektant dashboardów",
1180
+ "tutorial.dashboardDesigner.intro.content": "Przeciągaj widżety z palety na siatkę, zmieniaj ich rozmiar i układ, konfiguruj każdy w panelu właściwości, a następnie podglądaj lub eksportuj dashboard.",
1181
+ "tutorial.workflowDesignerCanvas.intro.title": "Projektant przepływów",
1182
+ "tutorial.workflowDesignerCanvas.intro.content": "Dodawaj na kanwę węzły wyzwalaczy, akcji i warunków i łącz je; zarządzaj zmiennymi, sprawdzaj poprawność przepływu, a następnie eksportuj.",
1183
+ "tutorial.armatureEditor.intro.title": "Edytor szkieletu",
1184
+ "tutorial.armatureEditor.intro.content": "Zaznaczaj kości, aby edytować ich transformacje, dodawaj lub zmieniaj rodzica kości, konfiguruj łańcuchy IK oraz zapisuj i wczytuj pozy.",
1185
+ "tutorial.morphTargetEditor.intro.title": "Edytor morph targetów",
1186
+ "tutorial.morphTargetEditor.intro.content": "Mieszaj morph targety siatki suwakami wpływu, twórz lub usuwaj cele i podglądaj interpolację.",
1187
+ "tutorial.terrainEditor.intro.title": "Edytor terenu",
1188
+ "tutorial.terrainEditor.intro.content": "Rzeźb mapę wysokości pędzlami (podnieś, obniż, spłaszcz, wygładź, szum), nakładaj warstwy tekstur, generuj teren proceduralnie oraz importuj/eksportuj mapy wysokości.",
1189
+ "tutorial.materialEditor.intro.title": "Edytor materiałów",
1190
+ "tutorial.materialEditor.intro.content": "Zbuduj shader jako graf węzłów: przeciągaj węzły z palety, łącz ich porty, edytuj właściwości i podglądaj skompilowany materiał.",
1191
+ "tutorial.particleEditor.intro.title": "Edytor cząstek",
1192
+ "tutorial.particleEditor.intro.content": "Wybierz system cząstek, dostrój jego emiter i moduły w inspektorze oraz odtwarzaj, pauzuj lub zatrzymuj podgląd na żywo.",
1193
+ "tutorial.uvEditor.intro.title": "Edytor UV",
1194
+ "tutorial.uvEditor.intro.content": "Edytuj układ UV siatki na teksturze: zaznaczaj i przekształcaj UV narzędziami, przełączaj kanały UV i zatwierdzaj zmiany.",
1195
+ "tutorial.fontEditor.intro.title": "Edytor fontów",
1196
+ "tutorial.fontEditor.intro.content": "Edytuj glify na siatce unicode, dostosuj metryki fontu oraz ścieżki i odstępy poszczególnych glifów, a następnie wyeksportuj font.",
1197
+ "tutorial.iconEditor.intro.title": "Edytor ikon",
1198
+ "tutorial.iconEditor.intro.content": "Rysuj i edytuj kształty SVG na siatce, dostosuj ustawienia obrysu i wariantu, podglądaj na różnych tłach i eksportuj do SVG, React lub PNG.",
1199
+ "tutorial.uiDesigner.intro.title": "Projektant UI",
1200
+ "tutorial.uiDesigner.intro.content": "Przeciągaj komponenty z palety na kanwę, edytuj ich właściwości w panelu, podglądaj responsywne punkty i eksportuj do React/TSX.",
1201
+ "tutorial.gameEditor.intro.title": "Edytor gier",
1202
+ "tutorial.gameEditor.intro.content": "Buduj scenę w widoku, korzystając z paneli hierarchii i zasobów, dostrajaj encje w inspektorze i zapisz projekt.",
1203
+ "tutorial.levelEditor.intro.title": "Edytor poziomów",
1204
+ "tutorial.levelEditor.intro.content": "Buduj świat gry: rozmieszczaj i przyciągaj obiekty na warstwach, maluj teren, układaj splajny i światła, a następnie wypiecz lightmapy.",
1205
+ "tutorial.gameMaterialEditor.intro.title": "Edytor materiałów",
1206
+ "tutorial.gameMaterialEditor.intro.content": "Twórz shader jako graf węzłów: dodawaj i łącz węzły shadera, edytuj ich właściwości i kompiluj materiał.",
1207
+ "tutorial.gameParticleEditor.intro.title": "Edytor cząstek",
1208
+ "tutorial.gameParticleEditor.intro.content": "Dostrój system cząstek w inspektorze — emiter, czas życia, krzywe i renderowanie — oraz odtwarzaj, pauzuj lub restartuj podgląd na żywo.",
1209
+ "tutorial.floorPlanEditor.intro.title": "Edytor rzutu kondygnacji",
1210
+ "tutorial.floorPlanEditor.intro.content": "Rysuj pomieszczenia i strefy narzędziami, rozmieszczaj urządzenia na planie, przełączaj kondygnacje i włączaj nakładki, takie jak wymiary, siatka i obłożenie.",
1211
+ "tutorial.buildingSceneEditor.intro.title": "Edytor scen",
1212
+ "tutorial.buildingSceneEditor.intro.content": "Twórz sceny ustawiające wiele urządzeń naraz: wybierz scenę, określ stany docelowe urządzeń, a następnie zapisz lub aktywuj.",
1213
+ "tutorial.buildingAutomationEditor.intro.title": "Edytor automatyzacji",
1214
+ "tutorial.buildingAutomationEditor.intro.content": "Twórz automatyzacje budynku: wybierz jedną z listy, zdefiniuj jej wyzwalacze, warunki i akcje, a następnie zapisz, włącz lub usuń.",
1215
+ "tutorial.spatialEditor.intro.title": "Edytor przestrzenny",
1216
+ "tutorial.spatialEditor.intro.content": "Projektuj rzuty w różnych trybach: rysuj ściany, pomieszczenia i obiekty narzędziami, zarządzaj warstwami, przyciągaj do siatki i eksportuj.",
1217
+ "tutorial.decisionTreeEditor.intro.title": "Edytor drzewa decyzyjnego",
1218
+ "tutorial.decisionTreeEditor.intro.content": "Eksploruj drzewo decyzyjne: klikaj węzły, aby sprawdzić warunki i wyniki, włączaj metryki, prawdopodobieństwa i próbki oraz podświetlaj ścieżkę dla danych wejściowych.",
1219
+ "tutorial.diagramEditor.intro.title": "Edytor diagramów",
1220
+ "tutorial.diagramEditor.intro.content": "Wybierz narzędzie, aby dodawać i łączyć węzły na kanwie, edytuj je w panelu właściwości i eksportuj diagram z paska narzędzi.",
1221
+ "tutorial.contractEditor.intro.title": "Edytor umów",
1222
+ "tutorial.contractEditor.intro.content": "Złóż umowę z biblioteki klauzul, uzupełnij zmienne szablonu, śledź wersje i zatwierdzenia, a następnie zapisz lub wyeksportuj do PDF/DOCX/HTML.",
1223
+ "tutorial.invoiceDesigner.intro.title": "Projektant faktur",
1224
+ "tutorial.invoiceDesigner.intro.content": "Przeciągaj elementy na kanwę faktury, wiąż je z polami danych, wyrównuj do siatki i linijek, a następnie zapisz lub wyeksportuj do PDF.",
1225
+ "tutorial.presentationEditor.intro.title": "Edytor prezentacji",
1226
+ "tutorial.presentationEditor.intro.content": "Buduj slajdy z paska miniatur, dodawaj i układaj elementy na kanwie, edytuj je w panelu właściwości, a następnie prezentuj lub eksportuj.",
1227
+ // ── Phase 4 tail: pakiety samodzielne (ui-bi/ui-video/ui-ai/ui-math/ui-audio) ──
1228
+ "tutorial.dashboardStudio.intro.title": "Studio dashboardów",
1229
+ "tutorial.dashboardStudio.intro.content": "Przeciągaj widżety z palety na siatkę, wiąż je ze źródłami danych, dodawaj filtry, a następnie przełączaj Edycja/Podgląd, odświeżaj i zapisz.",
1230
+ "tutorial.biReportBuilder.intro.title": "Kreator raportów",
1231
+ "tutorial.biReportBuilder.intro.content": "Przeciągaj elementy z palety na raport, wiąż je ze źródłami danych, przełączaj projekt/podgląd, a następnie eksportuj do PDF lub Excela.",
1232
+ "tutorial.etlBuilder.intro.title": "Kreator ETL",
1233
+ "tutorial.etlBuilder.intro.content": "Połącz źródła → transformacje → miejsca docelowe w potok, przełączaj widoki, a następnie uruchom go i zapisz konfigurację.",
1234
+ "tutorial.videoEditorPro.intro.title": "Edytor wideo",
1235
+ "tutorial.videoEditorPro.intro.content": "Dodawaj media na oś czasu, układaj i przycinaj klipy, nakładaj efekty i przejścia, a następnie skonfiguruj i uruchom eksport.",
1236
+ "tutorial.mlStudio.intro.title": "Studio ML",
1237
+ "tutorial.mlStudio.intro.content": "Przejdź przez karty: przygotuj zbiory danych, uruchom eksperymenty, porównaj i wybierz modele, a następnie wdroż najlepszy.",
1238
+ "tutorial.mathEditor.intro.title": "Edytor matematyczny",
1239
+ "tutorial.mathEditor.intro.content": "Pisz równania w LaTeX lub wstawiaj symbole z palety; przełącz się na pismo odręczne i podglądaj renderowany wzór na żywo.",
1240
+ "tutorial.dmxEditor.intro.title": "Edytor DMX",
1241
+ "tutorial.dmxEditor.intro.content": "Wybierz urządzenie i port FTDI, a następnie ustaw wartość każdego kanału DMX suwakami, aby sterować oprawami oświetleniowymi na żywo.",
890
1242
  // ── Sidebar context menu ──
891
1243
  "sidebar.menu.open": "Otwórz",
892
1244
  "sidebar.menu.openNewTab": "Otwórz w nowej karcie",
@@ -1491,7 +1843,9 @@ const j = [
1491
1843
  "vectorEditor.layers.hide": "Ukryj",
1492
1844
  "vectorEditor.layers.lock": "Zablokuj",
1493
1845
  "vectorEditor.layers.unlock": "Odblokuj"
1494
- }, Ce = {
1846
+ }, ze = {
1847
+ "tutorial.viewEditor.intro.title": "Ansichts-Editor",
1848
+ "tutorial.viewEditor.intro.content": "Erstellen Sie jede Ansichtsart an einem Ort: Wählen Sie die Art (oder generieren Sie aus einer Entität), ziehen Sie Steuerelemente aus der Palette in die Rasterzellen und konfigurieren Sie dann jede Zelle — Datenbindung, Rollenberechtigungen und Ereignisaktionen. Wechseln Sie Design / Vorschau / Quelle und speichern Sie, wenn gültig.",
1495
1849
  ok: "OK",
1496
1850
  cancel: "Abbrechen",
1497
1851
  save: "Speichern",
@@ -2193,8 +2547,181 @@ const j = [
2193
2547
  "vectorEditor.layers.show": "Einblenden",
2194
2548
  "vectorEditor.layers.hide": "Ausblenden",
2195
2549
  "vectorEditor.layers.lock": "Sperren",
2196
- "vectorEditor.layers.unlock": "Entsperren"
2197
- }, Se = {
2550
+ "vectorEditor.layers.unlock": "Entsperren",
2551
+ // Tutorials (1.0.22)
2552
+ "tutorial.play": "Abspielen",
2553
+ "tutorial.pause": "Pause",
2554
+ "tutorial.speed": "Geschwindigkeit",
2555
+ "tutorial.close": "Schließen",
2556
+ "tutorial.start": "Tutorial",
2557
+ "tutorial.startAria": "Tutorial starten",
2558
+ "tutorial.next": "Weiter",
2559
+ "tutorial.back": "Zurück",
2560
+ "tutorial.finish": "Fertig",
2561
+ "tutorial.skip": "Überspringen",
2562
+ "tutorial.stepOf": "von",
2563
+ "tutorial.moduleEditor.browser.title": "Modul-Browser",
2564
+ "tutorial.moduleEditor.browser.content": "Wählen Sie hier ein Modul, um sein Manifest, seine Entitäten und Übersetzungen zu öffnen.",
2565
+ "tutorial.moduleEditor.validate.title": "Prüfen",
2566
+ "tutorial.moduleEditor.validate.content": "Prüfen Sie das Modul gegen das Manifest-Schema. Probleme erscheinen in der Statusleiste und in der Ausgabe.",
2567
+ "tutorial.moduleEditor.save.title": "Speichern",
2568
+ "tutorial.moduleEditor.save.content": "Speichern Sie Ihre Änderungen über den konfigurierten Datenanbieter (z. B. Dateien zurück auf die Festplatte schreiben).",
2569
+ "tutorial.manifestEditor.intro.title": "Manifest-Editor",
2570
+ "tutorial.manifestEditor.intro.content": "Bearbeiten Sie das Manifest in schemagesteuerten Abschnitten. Schalten Sie pro Abschnitt zwischen Formular ⇄ JSON um; die Validierung erscheint in der Statusleiste.",
2571
+ "tutorial.schemaForm.intro.title": "Schema-Formular",
2572
+ "tutorial.schemaForm.intro.content": "Dieses Formular wird aus einem Schema erzeugt. Pflichtfelder und Validierungsfehler werden markiert; nutzen Sie den JSON-Umschalter für die Rohbearbeitung.",
2573
+ "tutorial.entityEditor.intro.title": "Entitäten-Editor",
2574
+ "tutorial.entityEditor.intro.content": "Fügen Sie links Entitäten hinzu und bearbeiten Sie rechts die Metadaten jeder Entität sowie ihre Felder (Typ, Schlüssel, Einschränkungen).",
2575
+ "tutorial.i18nEditor.intro.title": "Übersetzungen",
2576
+ "tutorial.i18nEditor.intro.content": "Bearbeiten Sie Übersetzungen als Raster aus Schlüsseln × Sprachen. Fügen Sie Schlüssel und Sprachen hinzu; bernsteinfarbene Zellen markieren fehlende Übersetzungen.",
2577
+ "tutorial.formBuilder.intro.title": "Formular-Builder",
2578
+ "tutorial.formBuilder.intro.content": "Ziehen Sie Felder aus der Palette auf die Arbeitsfläche und konfigurieren Sie jedes Feld im Eigenschaftenbereich. Exportieren Sie das Schema, wenn Sie fertig sind.",
2579
+ "tutorial.formDesigner.intro.title": "Formular-Designer",
2580
+ "tutorial.formDesigner.intro.content": "Gestalten Sie Eingabeformulare mit Abschnitten, Nachschlagefeldern und berechneten Feldern; binden Sie sie an Ihre Entität und sehen Sie eine Live-Vorschau.",
2581
+ "tutorial.paymentProviderConfig.intro.title": "Zahlungsanbieter",
2582
+ "tutorial.paymentProviderConfig.intro.content": "Wählen Sie einen Anbieter, geben Sie seine Zugangsdaten ein (Geheimnisse werden maskiert), wählen Sie Test/Live, aktivieren Sie Methoden und kopieren Sie die Webhook-URL.",
2583
+ "tutorial.webhookTester.intro.title": "Webhook-Tester",
2584
+ "tutorial.webhookTester.intro.content": "Wählen Sie eine gespeicherte Nutzlast (oder schreiben Sie eine), signieren Sie sie optional, senden Sie sie an den Endpunkt und prüfen Sie die Antwort.",
2585
+ "tutorial.apiDesigner.intro.title": "API-Designer",
2586
+ "tutorial.apiDesigner.intro.content": "Definieren Sie Endpunkte, Parameter, Anfrage-/Antwortschemata und Sicherheit für Ihr OpenAPI-Dokument.",
2587
+ "tutorial.apiTester.intro.title": "API-Tester",
2588
+ "tutorial.apiTester.intro.content": "Erstellen Sie Anfragen mit Sammlungen und Umgebungsvariablen, senden Sie sie und prüfen Sie die Antworten.",
2589
+ "tutorial.integrationBuilder.intro.title": "Integrations-Builder",
2590
+ "tutorial.integrationBuilder.intro.content": "Verdrahten Sie einen Ablauf aus Knoten (Auslöser → Aktionen → Fehlerbehandlung) und verbinden Sie sie, um eine Integration zu bauen.",
2591
+ "tutorial.scriptRunner.intro.title": "Skript-Runner",
2592
+ "tutorial.scriptRunner.intro.content": "Schreiben Sie ein Skript und Beispieleingaben, klicken Sie auf Ausführen und prüfen Sie unten das Ergebnis und die erfassten Protokolle.",
2593
+ "tutorial.lifecycleHooks.intro.title": "Lebenszyklus-Hooks",
2594
+ "tutorial.lifecycleHooks.intro.content": "Binden Sie Handler an jeden Auslöser, legen Sie ihre Reihenfolge und das Aktiv-Kennzeichen fest und fügen Sie eine optionale Bedingung hinzu, die die Ausführung steuert.",
2595
+ "tutorial.revisionHistory.intro.title": "Versionsverlauf",
2596
+ "tutorial.revisionHistory.intro.content": "Wählen Sie eine Version, wählen Sie eine weitere zum Vergleich, prüfen Sie den Side-by-Side-Vergleich und stellen Sie bei Bedarf eine frühere Version wieder her.",
2597
+ "tutorial.markdownEditor.intro.title": "Markdown-Editor",
2598
+ "tutorial.markdownEditor.intro.content": "Schreiben Sie Markdown mit der Formatierungsleiste; schalten Sie die Live-Vorschau ein, um das gerenderte Ergebnis zu sehen, und exportieren Sie nach HTML.",
2599
+ "tutorial.htmlEditor.intro.title": "Rich-Text-Editor",
2600
+ "tutorial.htmlEditor.intro.content": "Formatieren Sie Text mit der Symbolleiste, fügen Sie Links, Bilder und Tabellen ein und wechseln Sie bei Bedarf zur HTML- oder Markdown-Quelle.",
2601
+ "tutorial.documentEditor.intro.title": "Dokument-Editor",
2602
+ "tutorial.documentEditor.intro.content": "Erstellen Sie ein Dokument aus Blöcken: Nutzen Sie die Symbolleiste oder Slash-Befehle, um Überschriften, Listen, Medien und mehr hinzuzufügen, und exportieren Sie nach HTML.",
2603
+ "tutorial.codeEditor.intro.title": "Code-Editor",
2604
+ "tutorial.codeEditor.intro.content": "Bearbeiten Sie Code mit Syntaxhervorhebung, IntelliSense und der Symbolleiste. Strg+S speichert; die Statusleiste zeigt die Cursorposition und etwaige Probleme.",
2605
+ "tutorial.kanbanBoard.intro.title": "Kanban-Board",
2606
+ "tutorial.kanbanBoard.intro.content": "Ziehen Sie Karten zwischen Spalten, um ihren Status zu ändern, fügen Sie Karten mit der Schaltfläche „+“ hinzu und klicken Sie auf eine Karte, um ihre Details zu bearbeiten.",
2607
+ "tutorial.queryBuilder.intro.title": "Abfrage-Builder",
2608
+ "tutorial.queryBuilder.intro.content": "Fügen Sie Tabellen hinzu, wählen Sie Spalten, definieren Sie Joins, Bedingungen und Sortierung visuell – das SQL wird für Sie erzeugt. Wechseln Sie zum SQL-Tab, um es zu prüfen.",
2609
+ "tutorial.stateDesigner.intro.title": "State-Designer",
2610
+ "tutorial.stateDesigner.intro.content": "Modellieren Sie Ihren Store als Slices mit Feldern und Aktionen, wählen Sie ein Ziel (z. B. Zustand) und exportieren Sie einsatzfertigen State-Management-Code.",
2611
+ "tutorial.componentDesigner.intro.title": "Komponenten-Designer",
2612
+ "tutorial.componentDesigner.intro.content": "Benennen Sie Ihre Komponente, deklarieren Sie ihre Props mit Typen und Anforderungen und sehen Sie die erzeugte TypeScript-Schnittstelle live in der Vorschau.",
2613
+ "tutorial.pageBuilder.intro.title": "Seiten-Builder",
2614
+ "tutorial.pageBuilder.intro.content": "Ziehen Sie Komponenten aus der Seitenleiste auf das responsive Raster, wechseln Sie die Desktop-/Tablet-/Mobil-Vorschau und speichern Sie das Layout.",
2615
+ "tutorial.lowCodeStudio.intro.title": "Low-Code-Studio",
2616
+ "tutorial.lowCodeStudio.intro.content": "Ziehen Sie Komponenten aus der Seitenleiste auf die Arbeitsfläche und wechseln Sie zwischen den Tabs Design, Vorschau und Code, um Ihre App zu bauen und zu exportieren.",
2617
+ "tutorial.testBuilder.intro.title": "Test-Builder",
2618
+ "tutorial.testBuilder.intro.content": "Erstellen Sie Test-Suiten visuell: Fügen Sie Fälle und Interaktionsschritte mit Assertions hinzu, führen Sie sie aus und exportieren Sie in eine lauffähige .test.tsx-Datei.",
2619
+ "tutorial.workflowDesigner.intro.title": "Workflow-Designer",
2620
+ "tutorial.workflowDesigner.intro.content": "Fügen Sie Zustände und Übergänge auf der Arbeitsfläche hinzu, validieren Sie den Ablauf, simulieren Sie ihn und testen oder veröffentlichen Sie dann Ihren Workflow.",
2621
+ "tutorial.themeBuilder.intro.title": "Theme-Builder",
2622
+ "tutorial.themeBuilder.intro.content": "Starten Sie mit einer Vorlage, passen Sie Farben, Typografie und weitere Tokens abschnittsweise an, sehen Sie eine Live-Vorschau und wenden Sie das Theme an oder exportieren Sie es.",
2623
+ "tutorial.filterBuilder.intro.title": "Filter-Builder",
2624
+ "tutorial.filterBuilder.intro.content": "Bauen Sie komplexe UND/ODER-Filterbäume: Fügen Sie Bedingungen und verschachtelte Gruppen hinzu, wählen Sie Felder und Operatoren und speichern Sie wiederverwendbare Vorlagen.",
2625
+ "tutorial.diagramDesigner.intro.title": "Diagramm-Designer",
2626
+ "tutorial.diagramDesigner.intro.content": "Ziehen Sie Formen aus der Palette auf die Arbeitsfläche, verbinden Sie sie mit Konnektoren, bearbeiten Sie Eigenschaften rechts und exportieren Sie nach SVG, PNG oder JSON.",
2627
+ "tutorial.reportBuilder.intro.title": "Bericht-Builder",
2628
+ "tutorial.reportBuilder.intro.content": "Ziehen Sie Abschnitte auf den Bericht, binden Sie sie an Datenquellen, ordnen Sie das Layout an und exportieren Sie nach PDF, HTML oder XLSX.",
2629
+ "tutorial.erpReportDesigner.intro.title": "Bericht-Designer",
2630
+ "tutorial.erpReportDesigner.intro.content": "Gestalten Sie Bänderberichte: Platzieren Sie Elemente (Felder, Ausdrücke, Diagramme) in Bändern, binden Sie Datenverbindungen, bearbeiten Sie Eigenschaften und sehen Sie dann Vorschau und Export.",
2631
+ "tutorial.recipeEditor.intro.title": "Rezept-Editor",
2632
+ "tutorial.recipeEditor.intro.content": "Bearbeiten Sie die Rezeptdetails, fügen Sie Zutaten und Schritte hinzu und ordnen Sie sie neu, hängen Sie Fotos an und importieren oder exportieren Sie das Rezept als JSON.",
2633
+ "tutorial.pipelineEditor.intro.title": "Pipeline-Editor",
2634
+ "tutorial.pipelineEditor.intro.content": "Bauen Sie eine CI/CD-Pipeline aus Stufen, Jobs und Schritten; legen Sie Auslöser, Variablen und Geheimnisse fest und validieren, speichern und starten Sie sie dann.",
2635
+ "tutorial.mergeRequestBuilder.intro.title": "Merge-Request-Builder",
2636
+ "tutorial.mergeRequestBuilder.intro.content": "Wählen Sie Quell- und Zielbranch, schreiben Sie Titel und Beschreibung, fügen Sie Reviewer, Labels und verknüpfte Issues hinzu und prüfen und senden Sie dann.",
2637
+ "tutorial.automationRuleEditor.intro.title": "Automatisierungsregel-Editor",
2638
+ "tutorial.automationRuleEditor.intro.content": "Definieren Sie den Auslöser, fügen Sie optionale Bedingungen hinzu und listen Sie dann die auszuführenden Aktionen auf – wechseln Sie über die Tabs zwischen den drei Abschnitten.",
2639
+ "tutorial.sceneActionBuilder.intro.title": "Szenen-Aktions-Builder",
2640
+ "tutorial.sceneActionBuilder.intro.content": "Fügen Sie pro Gerät eine Aktion hinzu, legen Sie ihren Zielzustand und eine optionale Verzögerung fest, ordnen Sie sie neu und sehen Sie eine Vorschau der Szenensequenz.",
2641
+ "tutorial.backupTagEditor.intro.title": "Backup-Tags",
2642
+ "tutorial.backupTagEditor.intro.content": "Versehen Sie dieses Backup mit Tags zur einfachen Wiederfindung: Geben Sie eine Bezeichnung ein und wählen Sie eine Farbe, oder fügen Sie einen der vorgeschlagenen Tags hinzu; automatisch erzeugte Tags sind geschützt.",
2643
+ "tutorial.dataMergeBuilder.intro.title": "Daten-Zusammenführung",
2644
+ "tutorial.dataMergeBuilder.intro.content": "Gehen Sie die Schritte durch: Wählen Sie Quell- und Zielbranch, sehen Sie eine Vorschau der Änderungen, lösen Sie Konflikte, legen Sie Optionen fest und bestätigen Sie dann die Zusammenführung.",
2645
+ "tutorial.invoiceLineEditor.intro.title": "Rechnungspositionen",
2646
+ "tutorial.invoiceLineEditor.intro.content": "Fügen Sie Positionen mit Menge, Einzelpreis, MwSt. und Rabatt hinzu – Netto, Brutto und die MwSt.-Aufschlüsselung werden automatisch berechnet.",
2647
+ "tutorial.keyValueEditor.intro.title": "Schlüssel/Wert-Editor",
2648
+ "tutorial.keyValueEditor.intro.content": "Fügen Sie Schlüssel/Wert-Zeilen für Header, Parameter, Umgebungsvariablen oder Konfiguration hinzu; maskieren Sie geheime Werte, schalten Sie Zeilen ein/aus und achten Sie auf doppelte Schlüssel.",
2649
+ "tutorial.imageEditor.intro.title": "Bild-Editor",
2650
+ "tutorial.imageEditor.intro.content": "Nutzen Sie die Symbolleiste zum Zuschneiden, Drehen, Spiegeln, Anpassen von Helligkeit/Kontrast und Annotieren; machen Sie Bearbeitungen rückgängig oder wiederholen Sie sie und speichern Sie das Ergebnis.",
2651
+ "tutorial.cropEditor.intro.title": "Zuschneide-Editor",
2652
+ "tutorial.cropEditor.intro.content": "Ziehen Sie den Zuschneiderahmen über das Bild, wählen Sie ein Seitenverhältnis, drehen, spiegeln oder zoomen Sie und verwenden Sie dann das Ergebnis.",
2653
+ "tutorial.pdfAnnotationEditor.intro.title": "PDF-Anmerkungen",
2654
+ "tutorial.pdfAnnotationEditor.intro.content": "Wählen Sie ein Werkzeug aus der Symbolleiste (Hervorheben, Unterstreichen, Freihand, Text …), kommentieren Sie die Seite und navigieren und zoomen Sie nach Bedarf.",
2655
+ "tutorial.videoEditor.intro.title": "Video-Editor",
2656
+ "tutorial.videoEditor.intro.content": "Fügen Sie Medien zu den Timeline-Spuren hinzu, schneiden und ordnen Sie Clips, bearbeiten Sie Clip-Eigenschaften, sehen Sie eine Wiedergabe-Vorschau und exportieren Sie dann das Video.",
2657
+ "tutorial.viewBuilder.intro.title": "Ansichts-Builder",
2658
+ "tutorial.viewBuilder.intro.content": "Ziehen Sie Steuerelemente aus der Palette in die Rasterzellen, konfigurieren Sie jede Zelle im Eigenschaftenbereich und importieren, exportieren oder speichern Sie die Ansicht.",
2659
+ "tutorial.dashboardDesigner.intro.title": "Dashboard-Designer",
2660
+ "tutorial.dashboardDesigner.intro.content": "Ziehen Sie Widgets aus der Palette auf das Raster, ändern Sie ihre Größe und ordnen Sie sie an, konfigurieren Sie jedes im Eigenschaftenbereich und sehen Sie dann Vorschau oder Export des Dashboards.",
2661
+ "tutorial.workflowDesignerCanvas.intro.title": "Workflow-Designer",
2662
+ "tutorial.workflowDesignerCanvas.intro.content": "Fügen Sie Auslöser-, Aktions- und Bedingungsknoten zur Arbeitsfläche hinzu und verbinden Sie sie; verwalten Sie Variablen, validieren Sie den Ablauf und exportieren Sie ihn dann.",
2663
+ "tutorial.armatureEditor.intro.title": "Armature-Editor",
2664
+ "tutorial.armatureEditor.intro.content": "Wählen Sie Knochen, um ihre Transformationen zu bearbeiten, fügen Sie Knochen hinzu oder ordnen Sie sie neu zu, konfigurieren Sie IK-Ketten und speichern oder laden Sie Posen.",
2665
+ "tutorial.morphTargetEditor.intro.title": "Morph-Target-Editor",
2666
+ "tutorial.morphTargetEditor.intro.content": "Mischen Sie die Morph-Targets des Meshes mit den Einflussreglern pro Target, erstellen oder löschen Sie Targets und sehen Sie eine Vorschau der Interpolation.",
2667
+ "tutorial.terrainEditor.intro.title": "Terrain-Editor",
2668
+ "tutorial.terrainEditor.intro.content": "Formen Sie die Höhenkarte mit Pinseln (Anheben, Absenken, Glätten, Weichzeichnen, Rauschen), tragen Sie Texturebenen auf, erzeugen Sie prozedurales Terrain und importieren/exportieren Sie Höhenkarten.",
2669
+ "tutorial.materialEditor.intro.title": "Material-Editor",
2670
+ "tutorial.materialEditor.intro.content": "Bauen Sie einen Shader als Knotengraph: Ziehen Sie Knoten aus der Palette, verdrahten Sie ihre Ports, bearbeiten Sie Eigenschaften und sehen Sie eine Vorschau des kompilierten Materials.",
2671
+ "tutorial.particleEditor.intro.title": "Partikel-Editor",
2672
+ "tutorial.particleEditor.intro.content": "Wählen Sie ein Partikelsystem, justieren Sie seinen Emitter und seine Module im Inspektor und spielen, pausieren oder stoppen Sie die Live-Vorschau.",
2673
+ "tutorial.uvEditor.intro.title": "UV-Editor",
2674
+ "tutorial.uvEditor.intro.content": "Bearbeiten Sie das UV-Layout des Meshes über der Textur: Wählen und transformieren Sie UVs mit den Werkzeugen, wechseln Sie UV-Kanäle und wenden Sie Ihre Änderungen an.",
2675
+ "tutorial.fontEditor.intro.title": "Schriftart-Editor",
2676
+ "tutorial.fontEditor.intro.content": "Bearbeiten Sie Glyphen im Unicode-Raster, passen Sie Schriftmetriken sowie Pfade und Vorschübe pro Glyphe an und exportieren Sie dann die Schriftart.",
2677
+ "tutorial.iconEditor.intro.title": "Icon-Editor",
2678
+ "tutorial.iconEditor.intro.content": "Zeichnen und bearbeiten Sie SVG-Formen im Raster, passen Sie Kontur- und Varianteneinstellungen an, sehen Sie eine Vorschau auf verschiedenen Hintergründen und exportieren Sie nach SVG, React oder PNG.",
2679
+ "tutorial.uiDesigner.intro.title": "UI-Designer",
2680
+ "tutorial.uiDesigner.intro.content": "Ziehen Sie Komponenten aus der Palette auf die Arbeitsfläche, bearbeiten Sie ihre Props im Bereich, sehen Sie responsive Breakpoints in der Vorschau und exportieren Sie nach React/TSX.",
2681
+ "tutorial.gameEditor.intro.title": "Spiel-Editor",
2682
+ "tutorial.gameEditor.intro.content": "Bauen Sie Ihre Szene im Viewport mithilfe der Hierarchie- und Asset-Bereiche, justieren Sie Entitäten im Inspektor und speichern Sie das Projekt.",
2683
+ "tutorial.levelEditor.intro.title": "Level-Editor",
2684
+ "tutorial.levelEditor.intro.content": "Bauen Sie die Spielwelt: Platzieren und rasten Sie Objekte über Ebenen ein, malen Sie Terrain, legen Sie Splines und Lichter an und backen Sie dann Lightmaps.",
2685
+ "tutorial.gameMaterialEditor.intro.title": "Material-Editor",
2686
+ "tutorial.gameMaterialEditor.intro.content": "Erstellen Sie einen Shader als Knotengraph: Fügen Sie Shader-Knoten hinzu und verbinden Sie sie, bearbeiten Sie ihre Eigenschaften und kompilieren Sie das Material.",
2687
+ "tutorial.gameParticleEditor.intro.title": "Partikel-Editor",
2688
+ "tutorial.gameParticleEditor.intro.content": "Justieren Sie das Partikelsystem im Inspektor – Emitter, Lebensdauer, Kurven und Rendering – und spielen, pausieren oder starten Sie die Live-Vorschau neu.",
2689
+ "tutorial.floorPlanEditor.intro.title": "Grundriss-Editor",
2690
+ "tutorial.floorPlanEditor.intro.content": "Zeichnen Sie Räume und Zonen mit den Werkzeugen, platzieren Sie Geräte im Plan, wechseln Sie Etagen und schalten Sie Overlays wie Maße, Raster und Belegung um.",
2691
+ "tutorial.buildingSceneEditor.intro.title": "Szenen-Editor",
2692
+ "tutorial.buildingSceneEditor.intro.content": "Erstellen Sie Szenen, die mehrere Geräte auf einmal einstellen: Wählen Sie eine Szene, legen Sie die Zielzustände der Geräte fest und speichern oder aktivieren Sie sie.",
2693
+ "tutorial.buildingAutomationEditor.intro.title": "Automatisierungs-Editor",
2694
+ "tutorial.buildingAutomationEditor.intro.content": "Erstellen Sie Gebäudeautomatisierungen: Wählen Sie eine aus der Liste, definieren Sie ihre Auslöser, Bedingungen und Aktionen und speichern, aktivieren oder löschen Sie sie.",
2695
+ "tutorial.spatialEditor.intro.title": "Raum-Editor",
2696
+ "tutorial.spatialEditor.intro.content": "Gestalten Sie Grundrisse über verschiedene Modi: Zeichnen Sie Wände, Räume und Objekte mit den Werkzeugen, verwalten Sie Ebenen, rasten Sie am Raster ein und exportieren Sie.",
2697
+ "tutorial.decisionTreeEditor.intro.title": "Entscheidungsbaum-Editor",
2698
+ "tutorial.decisionTreeEditor.intro.content": "Erkunden Sie den Entscheidungsbaum: Klicken Sie auf Knoten, um Bedingungen und Ergebnisse zu prüfen, schalten Sie Metriken, Wahrscheinlichkeiten und Stichproben um und heben Sie einen Pfad für eine Eingabe hervor.",
2699
+ "tutorial.diagramEditor.intro.title": "Diagramm-Editor",
2700
+ "tutorial.diagramEditor.intro.content": "Wählen Sie ein Werkzeug, um Knoten auf der Arbeitsfläche hinzuzufügen und zu verbinden, bearbeiten Sie sie im Eigenschaftenbereich und exportieren Sie das Diagramm über die Symbolleiste.",
2701
+ "tutorial.contractEditor.intro.title": "Vertrags-Editor",
2702
+ "tutorial.contractEditor.intro.content": "Stellen Sie den Vertrag aus der Klauselbibliothek zusammen, füllen Sie Vorlagenvariablen aus, verfolgen Sie Versionen und Freigaben und speichern oder exportieren Sie nach PDF/DOCX/HTML.",
2703
+ "tutorial.invoiceDesigner.intro.title": "Rechnungs-Designer",
2704
+ "tutorial.invoiceDesigner.intro.content": "Ziehen Sie Elemente auf die Rechnungsfläche, binden Sie sie an Datenfelder, richten Sie sie mit Raster und Linealen aus und speichern oder exportieren Sie nach PDF.",
2705
+ "tutorial.presentationEditor.intro.title": "Präsentations-Editor",
2706
+ "tutorial.presentationEditor.intro.content": "Bauen Sie Folien aus der Miniaturleiste, fügen Sie Elemente auf der Fläche hinzu und ordnen Sie sie an, bearbeiten Sie sie im Eigenschaftenbereich und präsentieren oder exportieren Sie dann.",
2707
+ "tutorial.dashboardStudio.intro.title": "Dashboard-Studio",
2708
+ "tutorial.dashboardStudio.intro.content": "Ziehen Sie Widgets aus der Palette auf das Raster, binden Sie sie an Datenquellen, fügen Sie Filter hinzu und schalten Sie dann zwischen Bearbeiten/Ansicht um, aktualisieren und speichern Sie.",
2709
+ "tutorial.biReportBuilder.intro.title": "Bericht-Builder",
2710
+ "tutorial.biReportBuilder.intro.content": "Ziehen Sie Elemente aus der Palette auf den Bericht, binden Sie sie an Datenquellen, wechseln Sie zwischen Entwurf/Vorschau und exportieren Sie nach PDF oder Excel.",
2711
+ "tutorial.etlBuilder.intro.title": "ETL-Builder",
2712
+ "tutorial.etlBuilder.intro.content": "Verdrahten Sie Quellen → Transformationen → Ziele zu einer Pipeline, wechseln Sie die Ansichten und führen Sie sie dann aus und speichern Sie die Konfiguration.",
2713
+ "tutorial.videoEditorPro.intro.title": "Video-Editor",
2714
+ "tutorial.videoEditorPro.intro.content": "Fügen Sie Medien zur Timeline hinzu, ordnen und schneiden Sie Clips, wenden Sie Effekte und Übergänge an und konfigurieren und starten Sie dann den Export.",
2715
+ "tutorial.mlStudio.intro.title": "ML-Studio",
2716
+ "tutorial.mlStudio.intro.content": "Arbeiten Sie sich durch die Tabs: Bereiten Sie Datensätze vor, führen Sie Experimente durch, vergleichen und wählen Sie Modelle und stellen Sie das beste bereit.",
2717
+ "tutorial.mathEditor.intro.title": "Mathe-Editor",
2718
+ "tutorial.mathEditor.intro.content": "Schreiben Sie Gleichungen als LaTeX oder fügen Sie Symbole aus der Palette ein; wechseln Sie zur Handschrifteingabe und sehen Sie die gerenderte Formel live in der Vorschau.",
2719
+ "tutorial.dmxEditor.intro.title": "DMX-Editor",
2720
+ "tutorial.dmxEditor.intro.content": "Wählen Sie das FTDI-Gerät und den Port und stellen Sie dann den Wert jedes DMX-Kanals mit den Reglern ein, um Ihre Lichtgeräte live zu steuern.",
2721
+ "sidebar.prefs.order.visibilityHint": "Die Reihenfolge gilt für die obersten Einträge innerhalb jeder Quellgruppe. Klappen Sie einen Quell-Header zu, um beim Überprüfen der Änderung nur die obersten Einträge zu sehen."
2722
+ }, Ce = {
2723
+ "tutorial.viewEditor.intro.title": "Éditeur de vues",
2724
+ "tutorial.viewEditor.intro.content": "Concevez n’importe quel type de vue au même endroit : choisissez le type (ou générez depuis une entité), faites glisser des contrôles depuis la palette dans les cellules de la grille, puis configurez chaque cellule — liaison de données, permissions par rôle et actions d’événement. Basculez Conception / Aperçu / Source et enregistrez quand c’est valide.",
2198
2725
  ok: "OK",
2199
2726
  cancel: "Annuler",
2200
2727
  save: "Enregistrer",
@@ -2896,8 +3423,181 @@ const j = [
2896
3423
  "vectorEditor.layers.show": "Afficher",
2897
3424
  "vectorEditor.layers.hide": "Masquer",
2898
3425
  "vectorEditor.layers.lock": "Verrouiller",
2899
- "vectorEditor.layers.unlock": "Déverrouiller"
2900
- }, ze = {
3426
+ "vectorEditor.layers.unlock": "Déverrouiller",
3427
+ // Tutorials (1.0.22)
3428
+ "tutorial.play": "Lecture",
3429
+ "tutorial.pause": "Pause",
3430
+ "tutorial.speed": "Vitesse",
3431
+ "tutorial.close": "Fermer",
3432
+ "tutorial.start": "Tutoriel",
3433
+ "tutorial.startAria": "Démarrer le tutoriel",
3434
+ "tutorial.next": "Suivant",
3435
+ "tutorial.back": "Précédent",
3436
+ "tutorial.finish": "Terminer",
3437
+ "tutorial.skip": "Passer",
3438
+ "tutorial.stepOf": "sur",
3439
+ "tutorial.moduleEditor.browser.title": "Explorateur de modules",
3440
+ "tutorial.moduleEditor.browser.content": "Sélectionnez ici un module pour ouvrir son manifeste, ses entités et ses traductions.",
3441
+ "tutorial.moduleEditor.validate.title": "Valider",
3442
+ "tutorial.moduleEditor.validate.content": "Vérifiez le module par rapport au schéma du manifeste. Les problèmes apparaissent dans la barre d’état et la sortie.",
3443
+ "tutorial.moduleEditor.save.title": "Enregistrer",
3444
+ "tutorial.moduleEditor.save.content": "Enregistrez vos modifications via le fournisseur de données configuré (par ex. réécrire les fichiers sur le disque).",
3445
+ "tutorial.manifestEditor.intro.title": "Éditeur de manifeste",
3446
+ "tutorial.manifestEditor.intro.content": "Modifiez le manifeste par sections pilotées par schéma. Basculez entre Formulaire ⇄ JSON par section ; la validation apparaît dans la barre d’état.",
3447
+ "tutorial.schemaForm.intro.title": "Formulaire de schéma",
3448
+ "tutorial.schemaForm.intro.content": "Ce formulaire est généré à partir d’un schéma. Les champs obligatoires et les erreurs de validation sont signalés ; utilisez le bouton JSON pour l’édition brute.",
3449
+ "tutorial.entityEditor.intro.title": "Éditeur d’entités",
3450
+ "tutorial.entityEditor.intro.content": "Ajoutez des entités à gauche, puis modifiez à droite les métadonnées de chaque entité et ses champs (type, clés, contraintes).",
3451
+ "tutorial.i18nEditor.intro.title": "Traductions",
3452
+ "tutorial.i18nEditor.intro.content": "Modifiez les traductions sous forme de grille clés × langues. Ajoutez des clés et des langues ; les cellules ambrées signalent les traductions manquantes.",
3453
+ "tutorial.formBuilder.intro.title": "Générateur de formulaires",
3454
+ "tutorial.formBuilder.intro.content": "Faites glisser des champs depuis la palette vers le canevas, puis configurez chaque champ dans le panneau des propriétés. Exportez le schéma une fois terminé.",
3455
+ "tutorial.formDesigner.intro.title": "Concepteur de formulaires",
3456
+ "tutorial.formDesigner.intro.content": "Concevez des formulaires de saisie avec sections, listes de recherche et champs calculés ; liez-les à votre entité et prévisualisez en direct.",
3457
+ "tutorial.paymentProviderConfig.intro.title": "Prestataire de paiement",
3458
+ "tutorial.paymentProviderConfig.intro.content": "Choisissez un prestataire, renseignez ses identifiants (les secrets sont masqués), choisissez test/production, activez les méthodes et copiez l’URL du webhook.",
3459
+ "tutorial.webhookTester.intro.title": "Testeur de webhook",
3460
+ "tutorial.webhookTester.intro.content": "Choisissez une charge utile enregistrée (ou écrivez-en une), signez-la éventuellement, envoyez-la au point de terminaison et examinez la réponse.",
3461
+ "tutorial.apiDesigner.intro.title": "Concepteur d’API",
3462
+ "tutorial.apiDesigner.intro.content": "Définissez les points de terminaison, les paramètres, les schémas de requête/réponse et la sécurité de votre document OpenAPI.",
3463
+ "tutorial.apiTester.intro.title": "Testeur d’API",
3464
+ "tutorial.apiTester.intro.content": "Construisez des requêtes avec des collections et des variables d’environnement, envoyez-les et vérifiez les réponses.",
3465
+ "tutorial.integrationBuilder.intro.title": "Générateur d’intégrations",
3466
+ "tutorial.integrationBuilder.intro.content": "Reliez un flux de nœuds (déclencheurs → actions → gestion des erreurs) et connectez-les pour construire une intégration.",
3467
+ "tutorial.scriptRunner.intro.title": "Exécuteur de scripts",
3468
+ "tutorial.scriptRunner.intro.content": "Écrivez un script et un exemple d’entrée, cliquez sur Exécuter, puis examinez le résultat et les journaux capturés ci-dessous.",
3469
+ "tutorial.lifecycleHooks.intro.title": "Hooks de cycle de vie",
3470
+ "tutorial.lifecycleHooks.intro.content": "Associez des gestionnaires à chaque déclencheur, définissez leur ordre et leur indicateur d’activation, et ajoutez une condition facultative qui contrôle l’exécution.",
3471
+ "tutorial.revisionHistory.intro.title": "Historique des révisions",
3472
+ "tutorial.revisionHistory.intro.content": "Choisissez une révision, sélectionnez-en une autre à comparer, examinez la comparaison côte à côte, puis restaurez une version antérieure si nécessaire.",
3473
+ "tutorial.markdownEditor.intro.title": "Éditeur Markdown",
3474
+ "tutorial.markdownEditor.intro.content": "Écrivez du Markdown avec la barre de mise en forme ; activez l’aperçu en direct pour voir le rendu, puis exportez en HTML.",
3475
+ "tutorial.htmlEditor.intro.title": "Éditeur de texte enrichi",
3476
+ "tutorial.htmlEditor.intro.content": "Mettez en forme le texte avec la barre d’outils, insérez des liens, des images et des tableaux, et basculez vers la source HTML ou Markdown au besoin.",
3477
+ "tutorial.documentEditor.intro.title": "Éditeur de documents",
3478
+ "tutorial.documentEditor.intro.content": "Composez un document à partir de blocs : utilisez la barre d’outils ou les commandes slash pour ajouter des titres, des listes, des médias et plus, puis exportez en HTML.",
3479
+ "tutorial.codeEditor.intro.title": "Éditeur de code",
3480
+ "tutorial.codeEditor.intro.content": "Modifiez le code avec coloration syntaxique, IntelliSense et barre d’outils. Ctrl+S enregistre ; la barre d’état indique la position du curseur et les éventuels problèmes.",
3481
+ "tutorial.kanbanBoard.intro.title": "Tableau Kanban",
3482
+ "tutorial.kanbanBoard.intro.content": "Faites glisser les cartes entre les colonnes pour changer leur statut, ajoutez des cartes avec le bouton « + » et cliquez sur une carte pour modifier ses détails.",
3483
+ "tutorial.queryBuilder.intro.title": "Générateur de requêtes",
3484
+ "tutorial.queryBuilder.intro.content": "Ajoutez des tables, choisissez des colonnes, définissez visuellement les jointures, conditions et tris — le SQL est généré pour vous. Passez à l’onglet SQL pour le vérifier.",
3485
+ "tutorial.stateDesigner.intro.title": "Concepteur d’état",
3486
+ "tutorial.stateDesigner.intro.content": "Modélisez votre store en tranches avec des champs et des actions, choisissez une cible (par ex. Zustand) et exportez du code de gestion d’état prêt à l’emploi.",
3487
+ "tutorial.componentDesigner.intro.title": "Concepteur de composants",
3488
+ "tutorial.componentDesigner.intro.content": "Nommez votre composant, déclarez ses props avec leurs types et exigences, et prévisualisez en direct l’interface TypeScript générée.",
3489
+ "tutorial.pageBuilder.intro.title": "Générateur de pages",
3490
+ "tutorial.pageBuilder.intro.content": "Faites glisser des composants depuis la barre latérale sur la grille responsive, changez l’aperçu bureau/tablette/mobile et enregistrez la mise en page.",
3491
+ "tutorial.lowCodeStudio.intro.title": "Studio low-code",
3492
+ "tutorial.lowCodeStudio.intro.content": "Faites glisser des composants depuis la barre latérale sur le canevas, puis basculez entre les onglets Conception, Aperçu et Code pour construire et exporter votre application.",
3493
+ "tutorial.testBuilder.intro.title": "Générateur de tests",
3494
+ "tutorial.testBuilder.intro.content": "Construisez visuellement des suites de tests : ajoutez des cas et des étapes d’interaction avec des assertions, exécutez-les et exportez vers un fichier .test.tsx prêt à l’emploi.",
3495
+ "tutorial.workflowDesigner.intro.title": "Concepteur de workflow",
3496
+ "tutorial.workflowDesigner.intro.content": "Ajoutez des états et des transitions sur le canevas, validez le flux, simulez-le, puis testez ou publiez votre workflow.",
3497
+ "tutorial.themeBuilder.intro.title": "Générateur de thème",
3498
+ "tutorial.themeBuilder.intro.content": "Partez d’un préréglage, ajustez les couleurs, la typographie et d’autres jetons par section, prévisualisez en direct, puis appliquez ou exportez le thème.",
3499
+ "tutorial.filterBuilder.intro.title": "Générateur de filtres",
3500
+ "tutorial.filterBuilder.intro.content": "Construisez des arbres de filtres ET/OU complexes : ajoutez des conditions et des groupes imbriqués, choisissez les champs et opérateurs, et enregistrez des préréglages réutilisables.",
3501
+ "tutorial.diagramDesigner.intro.title": "Concepteur de diagrammes",
3502
+ "tutorial.diagramDesigner.intro.content": "Faites glisser des formes depuis la palette sur le canevas, reliez-les avec des connecteurs, modifiez les propriétés à droite, puis exportez en SVG, PNG ou JSON.",
3503
+ "tutorial.reportBuilder.intro.title": "Générateur de rapports",
3504
+ "tutorial.reportBuilder.intro.content": "Faites glisser des sections sur le rapport, liez-les à des sources de données, organisez la mise en page, puis exportez en PDF, HTML ou XLSX.",
3505
+ "tutorial.erpReportDesigner.intro.title": "Concepteur de rapports",
3506
+ "tutorial.erpReportDesigner.intro.content": "Disposez des rapports en bandes : déposez des éléments (champs, expressions, graphiques) dans les bandes, liez les connexions de données, modifiez les propriétés, puis prévisualisez et exportez.",
3507
+ "tutorial.recipeEditor.intro.title": "Éditeur de recettes",
3508
+ "tutorial.recipeEditor.intro.content": "Modifiez les détails de la recette, ajoutez et réorganisez les ingrédients et les étapes, joignez des photos et importez ou exportez la recette en JSON.",
3509
+ "tutorial.pipelineEditor.intro.title": "Éditeur de pipeline",
3510
+ "tutorial.pipelineEditor.intro.content": "Construisez un pipeline CI/CD à partir d’étapes, de tâches et de pas ; définissez déclencheurs, variables et secrets ; puis validez, enregistrez et exécutez-le.",
3511
+ "tutorial.mergeRequestBuilder.intro.title": "Générateur de merge request",
3512
+ "tutorial.mergeRequestBuilder.intro.content": "Choisissez les branches source et cible, rédigez le titre et la description, ajoutez relecteurs, étiquettes et tickets liés, puis prévisualisez et soumettez.",
3513
+ "tutorial.automationRuleEditor.intro.title": "Éditeur de règles d’automatisation",
3514
+ "tutorial.automationRuleEditor.intro.content": "Définissez le déclencheur, ajoutez des conditions facultatives, puis listez les actions à exécuter — basculez entre les trois sections à l’aide des onglets.",
3515
+ "tutorial.sceneActionBuilder.intro.title": "Générateur d’actions de scène",
3516
+ "tutorial.sceneActionBuilder.intro.content": "Ajoutez une action par appareil, définissez son état cible et un délai facultatif, réorganisez-les et prévisualisez la séquence de la scène.",
3517
+ "tutorial.backupTagEditor.intro.title": "Étiquettes de sauvegarde",
3518
+ "tutorial.backupTagEditor.intro.content": "Étiquetez cette sauvegarde pour la retrouver facilement : saisissez un libellé et choisissez une couleur, ou ajoutez l’une des étiquettes suggérées ; les étiquettes générées automatiquement sont protégées.",
3519
+ "tutorial.dataMergeBuilder.intro.title": "Fusion de données",
3520
+ "tutorial.dataMergeBuilder.intro.content": "Suivez les étapes : choisissez les branches source et cible, prévisualisez les modifications, résolvez les conflits, définissez les options, puis confirmez la fusion.",
3521
+ "tutorial.invoiceLineEditor.intro.title": "Lignes de facture",
3522
+ "tutorial.invoiceLineEditor.intro.content": "Ajoutez des lignes avec quantité, prix unitaire, TVA et remise — le net, le brut et le détail de la TVA sont calculés automatiquement.",
3523
+ "tutorial.keyValueEditor.intro.title": "Éditeur clé/valeur",
3524
+ "tutorial.keyValueEditor.intro.content": "Ajoutez des lignes clé/valeur pour les en-têtes, paramètres, variables d’environnement ou configuration ; masquez les valeurs secrètes, activez/désactivez les lignes et surveillez les clés en double.",
3525
+ "tutorial.imageEditor.intro.title": "Éditeur d’images",
3526
+ "tutorial.imageEditor.intro.content": "Utilisez la barre d’outils pour recadrer, pivoter, retourner, ajuster la luminosité/le contraste et annoter ; annulez/rétablissez vos modifications, puis enregistrez le résultat.",
3527
+ "tutorial.cropEditor.intro.title": "Éditeur de recadrage",
3528
+ "tutorial.cropEditor.intro.content": "Faites glisser le cadre de recadrage sur l’image, choisissez un format, pivotez, retournez ou zoomez, puis utilisez le résultat.",
3529
+ "tutorial.pdfAnnotationEditor.intro.title": "Annotations PDF",
3530
+ "tutorial.pdfAnnotationEditor.intro.content": "Choisissez un outil dans la barre d’outils (surligner, souligner, main levée, texte…), annotez la page, naviguez entre les pages et zoomez au besoin.",
3531
+ "tutorial.videoEditor.intro.title": "Éditeur vidéo",
3532
+ "tutorial.videoEditor.intro.content": "Ajoutez des médias aux pistes de la timeline, découpez et organisez les clips, modifiez leurs propriétés, prévisualisez la lecture, puis exportez la vidéo.",
3533
+ "tutorial.viewBuilder.intro.title": "Générateur de vues",
3534
+ "tutorial.viewBuilder.intro.content": "Faites glisser des contrôles depuis la palette dans les cellules de la grille, configurez chaque cellule dans le panneau des propriétés, et importez, exportez ou enregistrez la vue.",
3535
+ "tutorial.dashboardDesigner.intro.title": "Concepteur de tableau de bord",
3536
+ "tutorial.dashboardDesigner.intro.content": "Faites glisser des widgets depuis la palette sur la grille, redimensionnez-les et organisez-les, configurez chacun dans le panneau des propriétés, puis prévisualisez ou exportez le tableau de bord.",
3537
+ "tutorial.workflowDesignerCanvas.intro.title": "Concepteur de workflow",
3538
+ "tutorial.workflowDesignerCanvas.intro.content": "Ajoutez des nœuds de déclencheur, d’action et de condition sur le canevas et reliez-les ; gérez les variables, validez le flux, puis exportez-le.",
3539
+ "tutorial.armatureEditor.intro.title": "Éditeur d’armature",
3540
+ "tutorial.armatureEditor.intro.content": "Sélectionnez des os pour modifier leurs transformations, ajoutez ou reparentez des os, configurez les chaînes IK et enregistrez ou chargez des poses.",
3541
+ "tutorial.morphTargetEditor.intro.title": "Éditeur de morph targets",
3542
+ "tutorial.morphTargetEditor.intro.content": "Mélangez les morph targets du maillage avec les curseurs d’influence par cible, créez ou supprimez des cibles et prévisualisez l’interpolation.",
3543
+ "tutorial.terrainEditor.intro.title": "Éditeur de terrain",
3544
+ "tutorial.terrainEditor.intro.content": "Sculptez la carte de hauteur avec des pinceaux (élever, abaisser, aplatir, lisser, bruit), appliquez des couches de texture, générez du terrain procédural et importez/exportez des cartes de hauteur.",
3545
+ "tutorial.materialEditor.intro.title": "Éditeur de matériaux",
3546
+ "tutorial.materialEditor.intro.content": "Construisez un shader sous forme de graphe de nœuds : faites glisser des nœuds depuis la palette, reliez leurs ports, modifiez les propriétés et prévisualisez le matériau compilé.",
3547
+ "tutorial.particleEditor.intro.title": "Éditeur de particules",
3548
+ "tutorial.particleEditor.intro.content": "Choisissez un système de particules, ajustez son émetteur et ses modules dans l’inspecteur, et lisez, mettez en pause ou arrêtez l’aperçu en direct.",
3549
+ "tutorial.uvEditor.intro.title": "Éditeur UV",
3550
+ "tutorial.uvEditor.intro.content": "Modifiez la disposition UV du maillage par-dessus la texture : sélectionnez et transformez les UV avec les outils, changez de canal UV et appliquez vos modifications.",
3551
+ "tutorial.fontEditor.intro.title": "Éditeur de police",
3552
+ "tutorial.fontEditor.intro.content": "Modifiez les glyphes sur la grille Unicode, ajustez les métriques de la police ainsi que les tracés et chasses par glyphe, puis exportez la police.",
3553
+ "tutorial.iconEditor.intro.title": "Éditeur d’icônes",
3554
+ "tutorial.iconEditor.intro.content": "Dessinez et modifiez des formes SVG sur la grille, ajustez les réglages de contour et de variante, prévisualisez sur différents arrière-plans et exportez en SVG, React ou PNG.",
3555
+ "tutorial.uiDesigner.intro.title": "Concepteur d’interface",
3556
+ "tutorial.uiDesigner.intro.content": "Faites glisser des composants depuis la palette sur le canevas, modifiez leurs props dans le panneau, prévisualisez les points de rupture responsives et exportez en React/TSX.",
3557
+ "tutorial.gameEditor.intro.title": "Éditeur de jeu",
3558
+ "tutorial.gameEditor.intro.content": "Construisez votre scène dans la fenêtre à l’aide des panneaux de hiérarchie et d’assets, ajustez les entités dans l’inspecteur et enregistrez le projet.",
3559
+ "tutorial.levelEditor.intro.title": "Éditeur de niveau",
3560
+ "tutorial.levelEditor.intro.content": "Construisez le monde du jeu : placez et alignez des objets sur plusieurs couches, peignez le terrain, disposez splines et lumières, puis précalculez les lightmaps.",
3561
+ "tutorial.gameMaterialEditor.intro.title": "Éditeur de matériaux",
3562
+ "tutorial.gameMaterialEditor.intro.content": "Créez un shader sous forme de graphe de nœuds : ajoutez et reliez des nœuds de shader, modifiez leurs propriétés et compilez le matériau.",
3563
+ "tutorial.gameParticleEditor.intro.title": "Éditeur de particules",
3564
+ "tutorial.gameParticleEditor.intro.content": "Ajustez le système de particules dans l’inspecteur — émetteur, durée de vie, courbes et rendu — et lisez, mettez en pause ou redémarrez l’aperçu en direct.",
3565
+ "tutorial.floorPlanEditor.intro.title": "Éditeur de plan",
3566
+ "tutorial.floorPlanEditor.intro.content": "Dessinez des pièces et des zones avec les outils, placez des appareils sur le plan, changez d’étage et activez les superpositions comme les cotes, la grille et l’occupation.",
3567
+ "tutorial.buildingSceneEditor.intro.title": "Éditeur de scènes",
3568
+ "tutorial.buildingSceneEditor.intro.content": "Créez des scènes qui règlent plusieurs appareils à la fois : choisissez une scène, définissez les états cibles des appareils, puis enregistrez-la ou activez-la.",
3569
+ "tutorial.buildingAutomationEditor.intro.title": "Éditeur d’automatisation",
3570
+ "tutorial.buildingAutomationEditor.intro.content": "Créez des automatisations de bâtiment : choisissez-en une dans la liste, définissez ses déclencheurs, conditions et actions, puis enregistrez-la, activez-la ou supprimez-la.",
3571
+ "tutorial.spatialEditor.intro.title": "Éditeur spatial",
3572
+ "tutorial.spatialEditor.intro.content": "Disposez des plans selon différents modes : dessinez murs, pièces et objets avec les outils, gérez les couches, alignez sur la grille, puis exportez.",
3573
+ "tutorial.decisionTreeEditor.intro.title": "Éditeur d’arbre de décision",
3574
+ "tutorial.decisionTreeEditor.intro.content": "Explorez l’arbre de décision : cliquez sur les nœuds pour examiner les conditions et les résultats, affichez métriques, probabilités et échantillons, et mettez en évidence un chemin pour une entrée.",
3575
+ "tutorial.diagramEditor.intro.title": "Éditeur de diagrammes",
3576
+ "tutorial.diagramEditor.intro.content": "Choisissez un outil pour ajouter et relier des nœuds sur le canevas, modifiez-les dans le panneau des propriétés et exportez le diagramme depuis la barre d’outils.",
3577
+ "tutorial.contractEditor.intro.title": "Éditeur de contrats",
3578
+ "tutorial.contractEditor.intro.content": "Assemblez le contrat à partir de la bibliothèque de clauses, remplissez les variables du modèle, suivez les versions et approbations, puis enregistrez ou exportez en PDF/DOCX/HTML.",
3579
+ "tutorial.invoiceDesigner.intro.title": "Concepteur de factures",
3580
+ "tutorial.invoiceDesigner.intro.content": "Faites glisser des éléments sur le canevas de la facture, liez-les à des champs de données, alignez avec la grille et les règles, puis enregistrez ou exportez en PDF.",
3581
+ "tutorial.presentationEditor.intro.title": "Éditeur de présentation",
3582
+ "tutorial.presentationEditor.intro.content": "Construisez des diapositives depuis le rail de miniatures, ajoutez et disposez des éléments sur le canevas, modifiez-les dans le panneau des propriétés, puis présentez ou exportez.",
3583
+ "tutorial.dashboardStudio.intro.title": "Studio de tableau de bord",
3584
+ "tutorial.dashboardStudio.intro.content": "Faites glisser des widgets depuis la palette sur la grille, liez-les à des sources de données, ajoutez des filtres, puis basculez entre Édition/Vue, actualisez et enregistrez.",
3585
+ "tutorial.biReportBuilder.intro.title": "Générateur de rapports",
3586
+ "tutorial.biReportBuilder.intro.content": "Faites glisser des éléments depuis la palette sur le rapport, liez-les à des sources de données, basculez entre conception/aperçu, puis exportez en PDF ou Excel.",
3587
+ "tutorial.etlBuilder.intro.title": "Générateur ETL",
3588
+ "tutorial.etlBuilder.intro.content": "Reliez sources → transformations → destinations en un pipeline, changez de vue, puis exécutez-le et enregistrez la configuration.",
3589
+ "tutorial.videoEditorPro.intro.title": "Éditeur vidéo",
3590
+ "tutorial.videoEditorPro.intro.content": "Ajoutez des médias à la timeline, organisez et découpez les clips, appliquez effets et transitions, puis configurez et lancez l’export.",
3591
+ "tutorial.mlStudio.intro.title": "Studio ML",
3592
+ "tutorial.mlStudio.intro.content": "Parcourez les onglets : préparez les jeux de données, lancez des expériences, comparez et choisissez des modèles, puis déployez le meilleur.",
3593
+ "tutorial.mathEditor.intro.title": "Éditeur mathématique",
3594
+ "tutorial.mathEditor.intro.content": "Écrivez des équations en LaTeX ou insérez des symboles depuis la palette ; passez à la saisie manuscrite et prévisualisez la formule rendue en direct.",
3595
+ "tutorial.dmxEditor.intro.title": "Éditeur DMX",
3596
+ "tutorial.dmxEditor.intro.content": "Choisissez le périphérique FTDI et le port, puis réglez la valeur de chaque canal DMX avec les curseurs pour piloter vos projecteurs en direct.",
3597
+ "sidebar.prefs.order.visibilityHint": "L’ordre s’applique aux éléments de premier niveau dans chaque groupe de source. Repliez un en-tête de source pour ne voir que les entrées de premier niveau lors de la vérification."
3598
+ }, Se = {
3599
+ "tutorial.viewEditor.intro.title": "Editor de vistas",
3600
+ "tutorial.viewEditor.intro.content": "Crea cualquier tipo de vista desde un solo lugar: elige el tipo (o genéralo desde una entidad), arrastra controles desde la paleta a las celdas de la cuadrícula y configura cada celda — enlace de datos, permisos por rol y acciones de eventos. Cambia entre Diseño / Vista previa / Código y guarda cuando sea válido.",
2901
3601
  ok: "OK",
2902
3602
  cancel: "Cancelar",
2903
3603
  save: "Guardar",
@@ -3259,7 +3959,516 @@ const j = [
3259
3959
  "wm.closeAll": "Cerrar todo",
3260
3960
  "wm.minimizeAll": "Minimizar todo",
3261
3961
  "wm.newWindow": "Nueva ventana",
3262
- "wm.moveToFront": "Al frente"
3962
+ "wm.moveToFront": "Al frente",
3963
+ // Tutorials + UI strings (1.0.22)
3964
+ "tutorial.play": "Reproducir",
3965
+ "tutorial.pause": "Pausa",
3966
+ "tutorial.speed": "Velocidad",
3967
+ "tutorial.close": "Cerrar",
3968
+ "tutorial.start": "Tutorial",
3969
+ "tutorial.startAria": "Iniciar el tutorial",
3970
+ "tutorial.next": "Siguiente",
3971
+ "tutorial.back": "Atrás",
3972
+ "tutorial.finish": "Finalizar",
3973
+ "tutorial.skip": "Omitir",
3974
+ "tutorial.stepOf": "de",
3975
+ "tutorial.moduleEditor.browser.title": "Explorador de módulos",
3976
+ "tutorial.moduleEditor.browser.content": "Selecciona aquí un módulo para abrir su manifiesto, sus entidades y sus traducciones.",
3977
+ "tutorial.moduleEditor.validate.title": "Validar",
3978
+ "tutorial.moduleEditor.validate.content": "Comprueba el módulo con el esquema del manifiesto. Los problemas aparecen en la barra de estado y en la salida.",
3979
+ "tutorial.moduleEditor.save.title": "Guardar",
3980
+ "tutorial.moduleEditor.save.content": "Guarda tus cambios mediante el proveedor de datos configurado (p. ej. escribir los archivos de nuevo en el disco).",
3981
+ "tutorial.manifestEditor.intro.title": "Editor de manifiesto",
3982
+ "tutorial.manifestEditor.intro.content": "Edita el manifiesto en secciones basadas en esquema. Cambia entre Formulario ⇄ JSON por sección; la validación aparece en la barra de estado.",
3983
+ "tutorial.schemaForm.intro.title": "Formulario de esquema",
3984
+ "tutorial.schemaForm.intro.content": "Este formulario se genera a partir de un esquema. Los campos obligatorios y los errores de validación se resaltan; usa el conmutador JSON para la edición en bruto.",
3985
+ "tutorial.entityEditor.intro.title": "Editor de entidades",
3986
+ "tutorial.entityEditor.intro.content": "Añade entidades a la izquierda y edita a la derecha los metadatos de cada entidad y sus campos (tipo, claves, restricciones).",
3987
+ "tutorial.i18nEditor.intro.title": "Traducciones",
3988
+ "tutorial.i18nEditor.intro.content": "Edita las traducciones como una cuadrícula de claves × idiomas. Añade claves e idiomas; las celdas ámbar marcan las traducciones que faltan.",
3989
+ "tutorial.formBuilder.intro.title": "Generador de formularios",
3990
+ "tutorial.formBuilder.intro.content": "Arrastra campos desde la paleta al lienzo y configura cada campo en el panel de propiedades. Exporta el esquema cuando termines.",
3991
+ "tutorial.formDesigner.intro.title": "Diseñador de formularios",
3992
+ "tutorial.formDesigner.intro.content": "Diseña formularios de entrada de datos con secciones, campos de búsqueda y campos calculados; vincúlalos a tu entidad y previsualiza en vivo.",
3993
+ "tutorial.paymentProviderConfig.intro.title": "Proveedor de pagos",
3994
+ "tutorial.paymentProviderConfig.intro.content": "Elige un proveedor, rellena sus credenciales (los secretos se enmascaran), elige prueba/producción, activa métodos y copia la URL del webhook.",
3995
+ "tutorial.webhookTester.intro.title": "Probador de webhooks",
3996
+ "tutorial.webhookTester.intro.content": "Elige una carga útil guardada (o escribe una), fírmala opcionalmente, envíala al endpoint e inspecciona la respuesta.",
3997
+ "tutorial.apiDesigner.intro.title": "Diseñador de API",
3998
+ "tutorial.apiDesigner.intro.content": "Define endpoints, parámetros, esquemas de solicitud/respuesta y la seguridad de tu documento OpenAPI.",
3999
+ "tutorial.apiTester.intro.title": "Probador de API",
4000
+ "tutorial.apiTester.intro.content": "Crea solicitudes con colecciones y variables de entorno, envíalas y verifica las respuestas.",
4001
+ "tutorial.integrationBuilder.intro.title": "Generador de integraciones",
4002
+ "tutorial.integrationBuilder.intro.content": "Conecta un flujo de nodos (disparadores → acciones → gestión de errores) para construir una integración.",
4003
+ "tutorial.scriptRunner.intro.title": "Ejecutor de scripts",
4004
+ "tutorial.scriptRunner.intro.content": "Escribe un script y datos de ejemplo, haz clic en Ejecutar y revisa el resultado y los registros capturados abajo.",
4005
+ "tutorial.lifecycleHooks.intro.title": "Hooks de ciclo de vida",
4006
+ "tutorial.lifecycleHooks.intro.content": "Asocia controladores a cada disparador, define su orden y su indicador de activación, y añade una condición opcional que controle la ejecución.",
4007
+ "tutorial.revisionHistory.intro.title": "Historial de revisiones",
4008
+ "tutorial.revisionHistory.intro.content": "Elige una revisión, selecciona otra para comparar, revisa la comparación en paralelo y restaura una versión anterior si es necesario.",
4009
+ "tutorial.markdownEditor.intro.title": "Editor de Markdown",
4010
+ "tutorial.markdownEditor.intro.content": "Escribe Markdown con la barra de formato; activa la vista previa en vivo para ver el resultado y expórtalo a HTML.",
4011
+ "tutorial.htmlEditor.intro.title": "Editor de texto enriquecido",
4012
+ "tutorial.htmlEditor.intro.content": "Da formato al texto con la barra de herramientas, inserta enlaces, imágenes y tablas, y cambia al código HTML o Markdown cuando lo necesites.",
4013
+ "tutorial.documentEditor.intro.title": "Editor de documentos",
4014
+ "tutorial.documentEditor.intro.content": "Compón un documento a partir de bloques: usa la barra de herramientas o los comandos con barra para añadir títulos, listas, multimedia y más, y expórtalo a HTML.",
4015
+ "tutorial.codeEditor.intro.title": "Editor de código",
4016
+ "tutorial.codeEditor.intro.content": "Edita código con resaltado de sintaxis, IntelliSense y barra de herramientas. Ctrl+S guarda; la barra de estado muestra la posición del cursor y los problemas.",
4017
+ "tutorial.kanbanBoard.intro.title": "Tablero Kanban",
4018
+ "tutorial.kanbanBoard.intro.content": "Arrastra tarjetas entre columnas para cambiar su estado, añade tarjetas con el botón «+» y haz clic en una tarjeta para editar sus detalles.",
4019
+ "tutorial.queryBuilder.intro.title": "Generador de consultas",
4020
+ "tutorial.queryBuilder.intro.content": "Añade tablas, elige columnas y define uniones, condiciones y ordenación de forma visual: el SQL se genera por ti. Cambia a la pestaña SQL para revisarlo.",
4021
+ "tutorial.stateDesigner.intro.title": "Diseñador de estado",
4022
+ "tutorial.stateDesigner.intro.content": "Modela tu store como slices con campos y acciones, elige un destino (p. ej. Zustand) y exporta código de gestión de estado listo para usar.",
4023
+ "tutorial.componentDesigner.intro.title": "Diseñador de componentes",
4024
+ "tutorial.componentDesigner.intro.content": "Nombra tu componente, declara sus props con tipos y requisitos, y previsualiza en vivo la interfaz TypeScript generada.",
4025
+ "tutorial.pageBuilder.intro.title": "Generador de páginas",
4026
+ "tutorial.pageBuilder.intro.content": "Arrastra componentes desde la barra lateral a la cuadrícula responsiva, cambia la vista previa de escritorio/tableta/móvil y guarda el diseño.",
4027
+ "tutorial.lowCodeStudio.intro.title": "Estudio low-code",
4028
+ "tutorial.lowCodeStudio.intro.content": "Arrastra componentes desde la barra lateral al lienzo y cambia entre las pestañas Diseño, Vista previa y Código para construir y exportar tu aplicación.",
4029
+ "tutorial.testBuilder.intro.title": "Generador de pruebas",
4030
+ "tutorial.testBuilder.intro.content": "Crea suites de pruebas de forma visual: añade casos y pasos de interacción con aserciones, ejecútalos y exporta a un archivo .test.tsx listo para usar.",
4031
+ "tutorial.workflowDesigner.intro.title": "Diseñador de flujos de trabajo",
4032
+ "tutorial.workflowDesigner.intro.content": "Añade estados y transiciones en el lienzo, valida el flujo, simúlalo y luego prueba o publica tu flujo de trabajo.",
4033
+ "tutorial.themeBuilder.intro.title": "Generador de temas",
4034
+ "tutorial.themeBuilder.intro.content": "Parte de un preajuste, ajusta colores, tipografía y otros tokens por sección, previsualiza en vivo y luego aplica o exporta el tema.",
4035
+ "tutorial.filterBuilder.intro.title": "Generador de filtros",
4036
+ "tutorial.filterBuilder.intro.content": "Construye árboles de filtros Y/O complejos: añade condiciones y grupos anidados, elige campos y operadores y guarda preajustes reutilizables.",
4037
+ "tutorial.diagramDesigner.intro.title": "Diseñador de diagramas",
4038
+ "tutorial.diagramDesigner.intro.content": "Arrastra formas desde la paleta al lienzo, conéctalas con conectores, edita las propiedades a la derecha y exporta a SVG, PNG o JSON.",
4039
+ "tutorial.reportBuilder.intro.title": "Generador de informes",
4040
+ "tutorial.reportBuilder.intro.content": "Arrastra secciones al informe, vincúlalas a fuentes de datos, organiza el diseño y exporta a PDF, HTML o XLSX.",
4041
+ "tutorial.erpReportDesigner.intro.title": "Diseñador de informes",
4042
+ "tutorial.erpReportDesigner.intro.content": "Diseña informes por bandas: coloca elementos (campos, expresiones, gráficos) en las bandas, vincula conexiones de datos, edita propiedades y luego previsualiza y exporta.",
4043
+ "tutorial.recipeEditor.intro.title": "Editor de recetas",
4044
+ "tutorial.recipeEditor.intro.content": "Edita los detalles de la receta, añade y reordena ingredientes y pasos, adjunta fotos e importa o exporta la receta como JSON.",
4045
+ "tutorial.pipelineEditor.intro.title": "Editor de pipeline",
4046
+ "tutorial.pipelineEditor.intro.content": "Construye un pipeline CI/CD a partir de etapas, trabajos y pasos; define disparadores, variables y secretos; y luego valídalo, guárdalo y ejecútalo.",
4047
+ "tutorial.mergeRequestBuilder.intro.title": "Generador de merge request",
4048
+ "tutorial.mergeRequestBuilder.intro.content": "Elige las ramas de origen y destino, escribe el título y la descripción, añade revisores, etiquetas e incidencias vinculadas, y luego previsualiza y envía.",
4049
+ "tutorial.automationRuleEditor.intro.title": "Editor de reglas de automatización",
4050
+ "tutorial.automationRuleEditor.intro.content": "Define el disparador, añade condiciones opcionales y luego enumera las acciones a ejecutar: cambia entre las tres secciones con las pestañas.",
4051
+ "tutorial.sceneActionBuilder.intro.title": "Generador de acciones de escena",
4052
+ "tutorial.sceneActionBuilder.intro.content": "Añade una acción por dispositivo, define su estado objetivo y un retardo opcional, reordénalas y previsualiza la secuencia de la escena.",
4053
+ "tutorial.backupTagEditor.intro.title": "Etiquetas de copia de seguridad",
4054
+ "tutorial.backupTagEditor.intro.content": "Etiqueta esta copia de seguridad para encontrarla fácilmente: escribe una etiqueta y elige un color, o añade una de las etiquetas sugeridas; las etiquetas generadas automáticamente están protegidas.",
4055
+ "tutorial.dataMergeBuilder.intro.title": "Combinación de datos",
4056
+ "tutorial.dataMergeBuilder.intro.content": "Sigue los pasos: elige las ramas de origen y destino, previsualiza los cambios, resuelve los conflictos, define las opciones y luego confirma la combinación.",
4057
+ "tutorial.invoiceLineEditor.intro.title": "Líneas de factura",
4058
+ "tutorial.invoiceLineEditor.intro.content": "Añade líneas con cantidad, precio unitario, IVA y descuento: el neto, el bruto y el desglose del IVA se calculan automáticamente.",
4059
+ "tutorial.keyValueEditor.intro.title": "Editor de clave/valor",
4060
+ "tutorial.keyValueEditor.intro.content": "Añade filas de clave/valor para cabeceras, parámetros, variables de entorno o configuración; enmascara los valores secretos, activa/desactiva filas y vigila las claves duplicadas.",
4061
+ "tutorial.imageEditor.intro.title": "Editor de imágenes",
4062
+ "tutorial.imageEditor.intro.content": "Usa la barra de herramientas para recortar, rotar, voltear, ajustar brillo/contraste y anotar; deshaz/rehaz tus ediciones y guarda el resultado.",
4063
+ "tutorial.cropEditor.intro.title": "Editor de recorte",
4064
+ "tutorial.cropEditor.intro.content": "Arrastra el marco de recorte sobre la imagen, elige una relación de aspecto, rota, voltea o haz zoom y luego usa el resultado.",
4065
+ "tutorial.pdfAnnotationEditor.intro.title": "Anotaciones de PDF",
4066
+ "tutorial.pdfAnnotationEditor.intro.content": "Elige una herramienta de la barra (resaltar, subrayar, mano alzada, texto…), anota la página y navega y haz zoom según necesites.",
4067
+ "tutorial.videoEditor.intro.title": "Editor de vídeo",
4068
+ "tutorial.videoEditor.intro.content": "Añade medios a las pistas de la línea de tiempo, recorta y organiza clips, edita sus propiedades, previsualiza la reproducción y luego exporta el vídeo.",
4069
+ "tutorial.viewBuilder.intro.title": "Generador de vistas",
4070
+ "tutorial.viewBuilder.intro.content": "Arrastra controles desde la paleta a las celdas de la cuadrícula, configura cada celda en el panel de propiedades e importa, exporta o guarda la vista.",
4071
+ "tutorial.dashboardDesigner.intro.title": "Diseñador de paneles",
4072
+ "tutorial.dashboardDesigner.intro.content": "Arrastra widgets desde la paleta a la cuadrícula, cambia su tamaño y organízalos, configura cada uno en el panel de propiedades y luego previsualiza o exporta el panel.",
4073
+ "tutorial.workflowDesignerCanvas.intro.title": "Diseñador de flujos de trabajo",
4074
+ "tutorial.workflowDesignerCanvas.intro.content": "Añade nodos de disparador, acción y condición al lienzo y conéctalos; gestiona las variables, valida el flujo y luego expórtalo.",
4075
+ "tutorial.armatureEditor.intro.title": "Editor de esqueleto",
4076
+ "tutorial.armatureEditor.intro.content": "Selecciona huesos para editar sus transformaciones, añade o reasigna huesos, configura cadenas IK y guarda o carga poses.",
4077
+ "tutorial.morphTargetEditor.intro.title": "Editor de morph targets",
4078
+ "tutorial.morphTargetEditor.intro.content": "Mezcla los morph targets de la malla con los deslizadores de influencia por objetivo, crea o elimina objetivos y previsualiza la interpolación.",
4079
+ "tutorial.terrainEditor.intro.title": "Editor de terreno",
4080
+ "tutorial.terrainEditor.intro.content": "Esculpe el mapa de altura con pinceles (elevar, bajar, aplanar, suavizar, ruido), aplica capas de textura, genera terreno procedural e importa/exporta mapas de altura.",
4081
+ "tutorial.materialEditor.intro.title": "Editor de materiales",
4082
+ "tutorial.materialEditor.intro.content": "Construye un shader como un grafo de nodos: arrastra nodos desde la paleta, conecta sus puertos, edita propiedades y previsualiza el material compilado.",
4083
+ "tutorial.particleEditor.intro.title": "Editor de partículas",
4084
+ "tutorial.particleEditor.intro.content": "Elige un sistema de partículas, ajusta su emisor y sus módulos en el inspector y reproduce, pausa o detén la vista previa en vivo.",
4085
+ "tutorial.uvEditor.intro.title": "Editor de UV",
4086
+ "tutorial.uvEditor.intro.content": "Edita la disposición UV de la malla sobre la textura: selecciona y transforma UVs con las herramientas, cambia de canal UV y aplica tus cambios.",
4087
+ "tutorial.fontEditor.intro.title": "Editor de fuentes",
4088
+ "tutorial.fontEditor.intro.content": "Edita glifos en la cuadrícula Unicode, ajusta las métricas de la fuente y los trazados y espaciados por glifo, y luego exporta la fuente.",
4089
+ "tutorial.iconEditor.intro.title": "Editor de iconos",
4090
+ "tutorial.iconEditor.intro.content": "Dibuja y edita formas SVG en la cuadrícula, ajusta los parámetros de trazo y variante, previsualiza sobre distintos fondos y exporta a SVG, React o PNG.",
4091
+ "tutorial.uiDesigner.intro.title": "Diseñador de interfaz",
4092
+ "tutorial.uiDesigner.intro.content": "Arrastra componentes desde la paleta al lienzo, edita sus props en el panel, previsualiza los breakpoints responsivos y exporta a React/TSX.",
4093
+ "tutorial.gameEditor.intro.title": "Editor de juego",
4094
+ "tutorial.gameEditor.intro.content": "Construye tu escena en el viewport con los paneles de jerarquía y de recursos, ajusta las entidades en el inspector y guarda el proyecto.",
4095
+ "tutorial.levelEditor.intro.title": "Editor de niveles",
4096
+ "tutorial.levelEditor.intro.content": "Construye el mundo del juego: coloca y ajusta objetos por capas, pinta el terreno, dispón splines y luces y luego hornea los lightmaps.",
4097
+ "tutorial.gameMaterialEditor.intro.title": "Editor de materiales",
4098
+ "tutorial.gameMaterialEditor.intro.content": "Crea un shader como un grafo de nodos: añade y conecta nodos de shader, edita sus propiedades y compila el material.",
4099
+ "tutorial.gameParticleEditor.intro.title": "Editor de partículas",
4100
+ "tutorial.gameParticleEditor.intro.content": "Ajusta el sistema de partículas en el inspector (emisor, vida útil, curvas y renderizado) y reproduce, pausa o reinicia la vista previa en vivo.",
4101
+ "tutorial.floorPlanEditor.intro.title": "Editor de planos",
4102
+ "tutorial.floorPlanEditor.intro.content": "Dibuja habitaciones y zonas con las herramientas, coloca dispositivos en el plano, cambia de planta y activa superposiciones como cotas, cuadrícula y ocupación.",
4103
+ "tutorial.buildingSceneEditor.intro.title": "Editor de escenas",
4104
+ "tutorial.buildingSceneEditor.intro.content": "Crea escenas que configuran varios dispositivos a la vez: elige una escena, define los estados objetivo de los dispositivos y luego guárdala o actívala.",
4105
+ "tutorial.buildingAutomationEditor.intro.title": "Editor de automatización",
4106
+ "tutorial.buildingAutomationEditor.intro.content": "Crea automatizaciones del edificio: elige una de la lista, define sus disparadores, condiciones y acciones, y luego guárdala, actívala o elimínala.",
4107
+ "tutorial.spatialEditor.intro.title": "Editor espacial",
4108
+ "tutorial.spatialEditor.intro.content": "Diseña planos en varios modos: dibuja paredes, habitaciones y objetos con las herramientas, gestiona capas, ajusta a la cuadrícula y luego exporta.",
4109
+ "tutorial.decisionTreeEditor.intro.title": "Editor de árbol de decisión",
4110
+ "tutorial.decisionTreeEditor.intro.content": "Explora el árbol de decisión: haz clic en los nodos para revisar condiciones y resultados, muestra métricas, probabilidades y muestras, y resalta una ruta para una entrada.",
4111
+ "tutorial.diagramEditor.intro.title": "Editor de diagramas",
4112
+ "tutorial.diagramEditor.intro.content": "Elige una herramienta para añadir y conectar nodos en el lienzo, edítalos en el panel de propiedades y exporta el diagrama desde la barra de herramientas.",
4113
+ "tutorial.contractEditor.intro.title": "Editor de contratos",
4114
+ "tutorial.contractEditor.intro.content": "Ensambla el contrato a partir de la biblioteca de cláusulas, rellena las variables de la plantilla, controla versiones y aprobaciones, y luego guárdalo o expórtalo a PDF/DOCX/HTML.",
4115
+ "tutorial.invoiceDesigner.intro.title": "Diseñador de facturas",
4116
+ "tutorial.invoiceDesigner.intro.content": "Arrastra elementos al lienzo de la factura, vincúlalos a campos de datos, alinéalos con la cuadrícula y las reglas, y luego guárdala o expórtala a PDF.",
4117
+ "tutorial.presentationEditor.intro.title": "Editor de presentaciones",
4118
+ "tutorial.presentationEditor.intro.content": "Construye diapositivas desde la tira de miniaturas, añade y organiza elementos en el lienzo, edítalos en el panel de propiedades y luego presenta o exporta.",
4119
+ "tutorial.dashboardStudio.intro.title": "Estudio de paneles",
4120
+ "tutorial.dashboardStudio.intro.content": "Arrastra widgets desde la paleta a la cuadrícula, vincúlalos a fuentes de datos, añade filtros y luego cambia entre Editar/Ver, actualiza y guarda.",
4121
+ "tutorial.biReportBuilder.intro.title": "Generador de informes",
4122
+ "tutorial.biReportBuilder.intro.content": "Arrastra elementos desde la paleta al informe, vincúlalos a fuentes de datos, cambia entre diseño/vista previa y exporta a PDF o Excel.",
4123
+ "tutorial.etlBuilder.intro.title": "Generador de ETL",
4124
+ "tutorial.etlBuilder.intro.content": "Conecta orígenes → transformaciones → destinos en un pipeline, cambia las vistas y luego ejecútalo y guarda la configuración.",
4125
+ "tutorial.videoEditorPro.intro.title": "Editor de vídeo",
4126
+ "tutorial.videoEditorPro.intro.content": "Añade medios a la línea de tiempo, organiza y recorta clips, aplica efectos y transiciones, y luego configura y ejecuta la exportación.",
4127
+ "tutorial.mlStudio.intro.title": "Estudio de ML",
4128
+ "tutorial.mlStudio.intro.content": "Avanza por las pestañas: prepara conjuntos de datos, ejecuta experimentos, compara y elige modelos y luego despliega el mejor.",
4129
+ "tutorial.mathEditor.intro.title": "Editor de matemáticas",
4130
+ "tutorial.mathEditor.intro.content": "Escribe ecuaciones en LaTeX o inserta símbolos desde la paleta; cambia a la entrada manuscrita y previsualiza la fórmula renderizada en vivo.",
4131
+ "tutorial.dmxEditor.intro.title": "Editor DMX",
4132
+ "tutorial.dmxEditor.intro.content": "Elige el dispositivo FTDI y el puerto, y luego ajusta el valor de cada canal DMX con los deslizadores para controlar tus luminarias en vivo.",
4133
+ "nav.help": "Ayuda",
4134
+ "navShell.home.title": "Inicio",
4135
+ "navShell.help.next": "Siguiente",
4136
+ "navShell.help.back": "Atrás",
4137
+ "navShell.help.finish": "Finalizar",
4138
+ "navShell.help.skip": "Omitir",
4139
+ "navShell.help.stepOf": "de",
4140
+ "navShell.help.topNav.title": "Navegación superior",
4141
+ "navShell.help.topNav.body": "Usa la barra superior para cambiar de espacio de trabajo, buscar, cambiar el tema o el idioma y abrir las notificaciones.",
4142
+ "navShell.help.sidebar.title": "Barra lateral",
4143
+ "navShell.help.sidebar.body": "Explora las vistas disponibles agrupadas por sección. Elige una vista para abrirla en una pestaña nueva.",
4144
+ "navShell.help.tabs.title": "Pestañas",
4145
+ "navShell.help.tabs.body": "Cada vista abierta vive en su propia pestaña. Fija las que más uses y haz clic derecho para más acciones.",
4146
+ "navShell.help.content.title": "Espacio de trabajo",
4147
+ "navShell.help.content.body": "El área principal muestra la vista activa. Cambiar de pestaña o de entrada de la barra lateral cambia el contenido aquí.",
4148
+ "navShell.home.subtitle": "Retoma donde lo dejaste.",
4149
+ "navShell.home.empty": "Abre una vista desde la barra lateral o las pestañas de arriba para llenar tu espacio de trabajo.",
4150
+ "navShell.home.greeting.morning": "Buenos días",
4151
+ "navShell.home.greeting.afternoon": "Buenas tardes",
4152
+ "navShell.home.greeting.evening": "Buenas noches",
4153
+ "navShell.home.greeting.night": "Hola",
4154
+ "navShell.home.sections.openTabs": "Abiertas ahora",
4155
+ "navShell.home.sections.shortcuts": "Tus accesos directos",
4156
+ "navShell.home.sections.allViews": "Todas las vistas",
4157
+ "sidebar.menu.open": "Abrir",
4158
+ "sidebar.menu.openNewTab": "Abrir en una pestaña nueva",
4159
+ "sidebar.menu.openBrowserTab": "Abrir en una pestaña nueva del navegador",
4160
+ "sidebar.menu.pinFavorite": "Añadir a favoritos",
4161
+ "sidebar.menu.unpinFavorite": "Quitar de favoritos",
4162
+ "sidebar.menu.hide": "Ocultar",
4163
+ "sidebar.menu.copyLink": "Copiar enlace",
4164
+ "sidebar.menu.pinSource": "Fijar origen",
4165
+ "sidebar.menu.unpinSource": "Dejar de fijar origen",
4166
+ "sidebar.menu.hideSource": "Ocultar origen",
4167
+ "sidebar.prefs.general": "General",
4168
+ "sidebar.prefs.display": "Visualización",
4169
+ "sidebar.prefs.order": "Orden",
4170
+ "sidebar.prefs.hidden": "Elementos ocultos",
4171
+ "sidebar.prefs.reset": "Restablecer",
4172
+ "sidebar.prefs.general.title": "General",
4173
+ "sidebar.prefs.general.desc": "Comportamiento del árbol de la barra lateral y qué hace un clic izquierdo.",
4174
+ "sidebar.prefs.general.autoExpand": "Expandir automáticamente todas las ramas",
4175
+ "sidebar.prefs.general.autoExpandHint": "Cuando está desactivado, las ramas empiezan contraídas y recuerdan el último estado por sesión.",
4176
+ "sidebar.prefs.general.leftClickBehavior": "Comportamiento del clic izquierdo",
4177
+ "sidebar.prefs.general.focusExisting": "Enfocar la pestaña existente",
4178
+ "sidebar.prefs.general.openNew": "Abrir siempre en una pestaña nueva",
4179
+ "sidebar.prefs.general.leftClickHint": "Clic derecho → «Abrir en una pestaña nueva» está siempre disponible, independientemente de este ajuste.",
4180
+ "sidebar.prefs.display.title": "Visualización",
4181
+ "sidebar.prefs.display.desc": "Qué modos aparecen en la tira y hasta qué profundidad llega el árbol en cada modo.",
4182
+ "sidebar.prefs.display.enableModeIcons": "Mostrar los iconos del selector de modos",
4183
+ "sidebar.prefs.display.enabledModes": "Modos visibles",
4184
+ "sidebar.prefs.display.preferencesAlwaysOn": "Preferencias se muestra siempre.",
4185
+ "sidebar.prefs.display.maxDepth": "Profundidad del árbol por modo",
4186
+ "sidebar.prefs.order.title": "Ordenar elementos",
4187
+ "sidebar.prefs.order.desc": "Arrastra los elementos para reordenar cómo aparecen en el modo seleccionado.",
4188
+ "sidebar.prefs.order.pickMode": "Modo",
4189
+ "sidebar.prefs.order.visibilityHint": "El orden se aplica a los elementos de nivel superior dentro de cada grupo de origen. Contrae una cabecera de origen para ver solo las entradas de nivel superior al verificar el cambio.",
4190
+ "sidebar.prefs.order.empty": "No hay elementos reordenables en este modo.",
4191
+ "sidebar.prefs.order.resetMode": "Restablecer al orden predeterminado",
4192
+ "sidebar.prefs.hidden.title": "Elementos ocultos",
4193
+ "sidebar.prefs.hidden.desc": "Elementos que ocultaste del árbol. Restáuralos para recuperarlos.",
4194
+ "sidebar.prefs.hidden.empty": "Nada oculto todavía.",
4195
+ "sidebar.prefs.hidden.restore": "Restaurar",
4196
+ "sidebar.prefs.reset.title": "Restablecer",
4197
+ "sidebar.prefs.reset.desc": "Borra todas las personalizaciones y restaura el diseño original de la barra lateral.",
4198
+ "sidebar.prefs.reset.button": "Restablecer todas las preferencias",
4199
+ "sidebar.prefs.reset.confirm": "Esto borrará tus favoritos, los elementos ocultos, el orden personalizado y todas las demás preferencias de la barra lateral. No se puede deshacer.",
4200
+ "sidebar.prefs.reset.confirmYes": "Sí, restablecer todo",
4201
+ "sidebar.prefs.reset.cancel": "Cancelar",
4202
+ "noCode.title": "Estudio No-Code",
4203
+ "noCode.description": "Crea aplicaciones visualmente",
4204
+ "noCode.newProject": "Nuevo proyecto",
4205
+ "noCode.openProject": "Abrir proyecto",
4206
+ "noCode.saveProject": "Guardar proyecto",
4207
+ "noCode.exportProject": "Exportar proyecto",
4208
+ "noCode.importProject": "Importar proyecto",
4209
+ "noCode.projectName": "Nombre del proyecto",
4210
+ "noCode.projectSettings": "Configuración del proyecto",
4211
+ "noCode.recentProjects": "Proyectos recientes",
4212
+ "noCode.templates": "Plantillas",
4213
+ "noCode.preview": "Vista previa",
4214
+ "noCode.codeView": "Vista de código",
4215
+ "noCode.splitView": "Vista dividida",
4216
+ "noCode.visualView": "Vista visual",
4217
+ "noCode.generate": "Generar código",
4218
+ "noCode.deploy": "Desplegar",
4219
+ "noCode.componentDesigner.title": "Diseñador de componentes",
4220
+ "noCode.componentDesigner.newComponent": "Nuevo componente",
4221
+ "noCode.componentDesigner.componentName": "Nombre del componente",
4222
+ "noCode.componentDesigner.addProp": "Añadir prop",
4223
+ "noCode.componentDesigner.editProp": "Editar prop",
4224
+ "noCode.componentDesigner.deleteProp": "Eliminar prop",
4225
+ "noCode.componentDesigner.propName": "Nombre de la prop",
4226
+ "noCode.componentDesigner.propType": "Tipo de prop",
4227
+ "noCode.componentDesigner.propRequired": "Obligatoria",
4228
+ "noCode.componentDesigner.propDefault": "Valor por defecto",
4229
+ "noCode.componentDesigner.addState": "Añadir estado",
4230
+ "noCode.componentDesigner.stateName": "Nombre del estado",
4231
+ "noCode.componentDesigner.stateType": "Tipo de estado",
4232
+ "noCode.componentDesigner.stateDefault": "Valor inicial",
4233
+ "noCode.componentDesigner.addHook": "Añadir hook",
4234
+ "noCode.componentDesigner.hooks": "Hooks",
4235
+ "noCode.componentDesigner.template": "Plantilla",
4236
+ "noCode.componentDesigner.styles": "Estilos",
4237
+ "noCode.componentDesigner.events": "Eventos",
4238
+ "noCode.componentDesigner.palette": "Paleta de componentes",
4239
+ "noCode.componentDesigner.dragDrop": "Arrastra componentes aquí",
4240
+ "noCode.pageBuilder.title": "Generador de páginas",
4241
+ "noCode.pageBuilder.newPage": "Nueva página",
4242
+ "noCode.pageBuilder.pageName": "Nombre de la página",
4243
+ "noCode.pageBuilder.pageRoute": "Ruta",
4244
+ "noCode.pageBuilder.addSection": "Añadir sección",
4245
+ "noCode.pageBuilder.editSection": "Editar sección",
4246
+ "noCode.pageBuilder.deleteSection": "Eliminar sección",
4247
+ "noCode.pageBuilder.sectionLayout": "Diseño de la sección",
4248
+ "noCode.pageBuilder.columns": "Columnas",
4249
+ "noCode.pageBuilder.responsive": "Responsivo",
4250
+ "noCode.pageBuilder.mobile": "Móvil",
4251
+ "noCode.pageBuilder.tablet": "Tableta",
4252
+ "noCode.pageBuilder.desktop": "Escritorio",
4253
+ "noCode.pageBuilder.showGrid": "Mostrar cuadrícula",
4254
+ "noCode.pageBuilder.hideGrid": "Ocultar cuadrícula",
4255
+ "noCode.pageBuilder.metadata": "Metadatos de la página",
4256
+ "noCode.pageBuilder.seo": "Configuración SEO",
4257
+ "noCode.stateDesigner.title": "Diseñador de estado",
4258
+ "noCode.stateDesigner.newStore": "Nuevo store",
4259
+ "noCode.stateDesigner.storeName": "Nombre del store",
4260
+ "noCode.stateDesigner.storeType": "Tipo de store",
4261
+ "noCode.stateDesigner.addState": "Añadir campo de estado",
4262
+ "noCode.stateDesigner.addAction": "Añadir acción",
4263
+ "noCode.stateDesigner.editAction": "Editar acción",
4264
+ "noCode.stateDesigner.deleteAction": "Eliminar acción",
4265
+ "noCode.stateDesigner.actionName": "Nombre de la acción",
4266
+ "noCode.stateDesigner.actionParams": "Parámetros",
4267
+ "noCode.stateDesigner.actionBody": "Cuerpo de la acción",
4268
+ "noCode.stateDesigner.asyncAction": "Acción asíncrona",
4269
+ "noCode.stateDesigner.addSelector": "Añadir selector",
4270
+ "noCode.stateDesigner.selectorName": "Nombre del selector",
4271
+ "noCode.stateDesigner.selectorBody": "Lógica del selector",
4272
+ "noCode.stateDesigner.persistence": "Persistencia",
4273
+ "noCode.stateDesigner.devtools": "DevTools",
4274
+ "noCode.apiFlow.title": "Diseñador de flujos de API",
4275
+ "noCode.apiFlow.newEndpoint": "Nuevo endpoint",
4276
+ "noCode.apiFlow.endpointUrl": "URL del endpoint",
4277
+ "noCode.apiFlow.method": "Método HTTP",
4278
+ "noCode.apiFlow.headers": "Cabeceras",
4279
+ "noCode.apiFlow.body": "Cuerpo de la solicitud",
4280
+ "noCode.apiFlow.response": "Respuesta",
4281
+ "noCode.apiFlow.auth": "Autenticación",
4282
+ "noCode.apiFlow.authType": "Tipo de autenticación",
4283
+ "noCode.apiFlow.bearerToken": "Token Bearer",
4284
+ "noCode.apiFlow.apiKey": "Clave de API",
4285
+ "noCode.apiFlow.testEndpoint": "Probar endpoint",
4286
+ "noCode.apiFlow.mockResponse": "Respuesta simulada",
4287
+ "noCode.apiFlow.errorHandling": "Gestión de errores",
4288
+ "noCode.apiFlow.retry": "Política de reintentos",
4289
+ "noCode.apiFlow.cache": "Almacenamiento en caché",
4290
+ "noCode.dataMapper.title": "Mapeador de datos",
4291
+ "noCode.dataMapper.sourceSchema": "Esquema de origen",
4292
+ "noCode.dataMapper.targetSchema": "Esquema de destino",
4293
+ "noCode.dataMapper.addMapping": "Añadir mapeo",
4294
+ "noCode.dataMapper.editMapping": "Editar mapeo",
4295
+ "noCode.dataMapper.deleteMapping": "Eliminar mapeo",
4296
+ "noCode.dataMapper.sourceField": "Campo de origen",
4297
+ "noCode.dataMapper.targetField": "Campo de destino",
4298
+ "noCode.dataMapper.transform": "Transformar",
4299
+ "noCode.dataMapper.validation": "Validación",
4300
+ "noCode.dataMapper.testData": "Datos de prueba",
4301
+ "noCode.dataMapper.preview": "Previsualizar resultado",
4302
+ "noCode.dataMapper.autoMap": "Mapeo automático",
4303
+ "noCode.eventOrchestrator.title": "Orquestador de eventos",
4304
+ "noCode.eventOrchestrator.newFlow": "Nuevo flujo de eventos",
4305
+ "noCode.eventOrchestrator.flowName": "Nombre del flujo",
4306
+ "noCode.eventOrchestrator.trigger": "Disparador",
4307
+ "noCode.eventOrchestrator.triggerType": "Tipo de disparador",
4308
+ "noCode.eventOrchestrator.addHandler": "Añadir controlador",
4309
+ "noCode.eventOrchestrator.editHandler": "Editar controlador",
4310
+ "noCode.eventOrchestrator.deleteHandler": "Eliminar controlador",
4311
+ "noCode.eventOrchestrator.handlerName": "Nombre del controlador",
4312
+ "noCode.eventOrchestrator.debounce": "Debounce",
4313
+ "noCode.eventOrchestrator.throttle": "Throttle",
4314
+ "noCode.eventOrchestrator.delay": "Retardo",
4315
+ "noCode.eventOrchestrator.condition": "Condición",
4316
+ "noCode.eventOrchestrator.chain": "Encadenar eventos",
4317
+ "noCode.testBuilder.title": "Generador de pruebas",
4318
+ "noCode.testBuilder.newTest": "Nueva prueba",
4319
+ "noCode.testBuilder.testName": "Nombre de la prueba",
4320
+ "noCode.testBuilder.testDescription": "Descripción",
4321
+ "noCode.testBuilder.addScenario": "Añadir escenario",
4322
+ "noCode.testBuilder.editScenario": "Editar escenario",
4323
+ "noCode.testBuilder.deleteScenario": "Eliminar escenario",
4324
+ "noCode.testBuilder.addAssertion": "Añadir aserción",
4325
+ "noCode.testBuilder.assertionType": "Tipo de aserción",
4326
+ "noCode.testBuilder.expected": "Valor esperado",
4327
+ "noCode.testBuilder.actual": "Valor real",
4328
+ "noCode.testBuilder.mock": "Configuración de mock",
4329
+ "noCode.testBuilder.runTests": "Ejecutar pruebas",
4330
+ "noCode.testBuilder.testsPassed": "Pruebas superadas",
4331
+ "noCode.testBuilder.testsFailed": "Pruebas fallidas",
4332
+ "noCode.testBuilder.coverage": "Cobertura",
4333
+ "noCode.testBuilder.accessibility": "Comprobación de accesibilidad",
4334
+ "noCode.codeTemplate.title": "Plantillas de código",
4335
+ "noCode.codeTemplate.newTemplate": "Nueva plantilla",
4336
+ "noCode.codeTemplate.templateName": "Nombre de la plantilla",
4337
+ "noCode.codeTemplate.templateEngine": "Motor de plantillas",
4338
+ "noCode.codeTemplate.variables": "Variables",
4339
+ "noCode.codeTemplate.addVariable": "Añadir variable",
4340
+ "noCode.codeTemplate.variableName": "Nombre de la variable",
4341
+ "noCode.codeTemplate.variableType": "Tipo de variable",
4342
+ "noCode.codeTemplate.variableDefault": "Valor por defecto",
4343
+ "noCode.codeTemplate.generateFiles": "Generar archivos",
4344
+ "noCode.codeTemplate.outputPath": "Ruta de salida",
4345
+ "noCode.codeTemplate.presets": "Preajustes",
4346
+ "noCode.codeTemplate.presetReact": "Componente React",
4347
+ "noCode.codeTemplate.presetNextPage": "Página de Next.js",
4348
+ "noCode.codeTemplate.presetHook": "Hook personalizado",
4349
+ "noCode.codeTemplate.presetStore": "Módulo de store",
4350
+ "noCode.codePreview.title": "Vista previa del código",
4351
+ "noCode.codePreview.showDiff": "Mostrar diferencias",
4352
+ "noCode.codePreview.hideDiff": "Ocultar diferencias",
4353
+ "noCode.codePreview.copyCode": "Copiar código",
4354
+ "noCode.codePreview.downloadCode": "Descargar código",
4355
+ "noCode.codePreview.importCode": "Importar código",
4356
+ "noCode.codePreview.language": "Lenguaje",
4357
+ "noCode.codePreview.format": "Formatear código",
4358
+ "noCode.codePreview.linesChanged": "Líneas cambiadas",
4359
+ "noCode.codePreview.noChanges": "Sin cambios",
4360
+ "vectorEditor.menu.file": "Archivo",
4361
+ "vectorEditor.menu.edit": "Editar",
4362
+ "vectorEditor.menu.object": "Objeto",
4363
+ "vectorEditor.menu.path": "Trazado",
4364
+ "vectorEditor.menu.view": "Ver",
4365
+ "vectorEditor.menu.newCanvas": "Nuevo lienzo",
4366
+ "vectorEditor.menu.openSvg": "Abrir SVG…",
4367
+ "vectorEditor.menu.pasteSvg": "Pegar SVG…",
4368
+ "vectorEditor.menu.exportSvg": "Exportar SVG",
4369
+ "vectorEditor.menu.exportPng": "Exportar PNG",
4370
+ "vectorEditor.menu.exportJpg": "Exportar JPG",
4371
+ "vectorEditor.menu.exportWebp": "Exportar WebP",
4372
+ "vectorEditor.menu.exportBmp": "Exportar BMP",
4373
+ "vectorEditor.menu.saveToLibrary": "📦 Guardar en la biblioteca",
4374
+ "vectorEditor.menu.exportIconSnippet": "📋 Exportar fragmento de icono",
4375
+ "vectorEditor.menu.exportIcon": "📋 Exportar icono",
4376
+ "vectorEditor.menu.undo": "Deshacer (Ctrl+Z)",
4377
+ "vectorEditor.menu.redo": "Rehacer (Ctrl+Y)",
4378
+ "vectorEditor.menu.copy": "Copiar (Ctrl+C)",
4379
+ "vectorEditor.menu.paste": "Pegar (Ctrl+V)",
4380
+ "vectorEditor.menu.duplicate": "Duplicar (Ctrl+D)",
4381
+ "vectorEditor.menu.delete": "Eliminar (Supr)",
4382
+ "vectorEditor.menu.bringToFront": "Traer al frente",
4383
+ "vectorEditor.menu.sendToBack": "Enviar al fondo",
4384
+ "vectorEditor.menu.flipH": "Voltear horizontal",
4385
+ "vectorEditor.menu.flipV": "Voltear vertical",
4386
+ "vectorEditor.menu.alignLeft": "Alinear a la izquierda",
4387
+ "vectorEditor.menu.alignCenter": "Centrar",
4388
+ "vectorEditor.menu.alignRight": "Alinear a la derecha",
4389
+ "vectorEditor.menu.union": "Unión (∪)",
4390
+ "vectorEditor.menu.subtract": "Restar (−)",
4391
+ "vectorEditor.menu.intersect": "Intersecar (∩)",
4392
+ "vectorEditor.menu.exclude": "Excluir (⊕)",
4393
+ "vectorEditor.menu.outlineStroke": "Contornear trazo",
4394
+ "vectorEditor.menu.snapToGrid": "Ajustar a la cuadrícula",
4395
+ "vectorEditor.menu.snap": "Ajustar",
4396
+ "vectorEditor.menu.secondShape": "2.ª forma",
4397
+ "vectorEditor.tabs.properties": "Propiedades",
4398
+ "vectorEditor.tabs.layers": "Capas",
4399
+ "vectorEditor.tabs.library": "Biblioteca",
4400
+ "vectorEditor.tabs.timeline": "Línea de tiempo",
4401
+ "vectorEditor.timeline.preset": "Preajuste",
4402
+ "vectorEditor.timeline.duration": "Duración (ms)",
4403
+ "vectorEditor.timeline.repeat": "Repetir",
4404
+ "vectorEditor.timeline.direction": "Dirección",
4405
+ "vectorEditor.timeline.remove": "Eliminar animación",
4406
+ "vectorEditor.timeline.play": "Reproducir",
4407
+ "vectorEditor.timeline.pause": "Pausa",
4408
+ "vectorEditor.timeline.stop": "Detener",
4409
+ "vectorEditor.timeline.copyCss": "Copiar CSS",
4410
+ "vectorEditor.timeline.keyframes": "Fotogramas clave",
4411
+ "vectorEditor.timeline.addKeyframe": "+ Añadir fotograma clave",
4412
+ "vectorEditor.timeline.noSelection": "Selecciona una forma para animarla.",
4413
+ "vectorEditor.timeline.animationTitle": "Animación",
4414
+ "vectorEditor.timeline.playbackTitle": "Reproducción",
4415
+ "vectorEditor.timeline.attachHint": "Selecciona una forma para adjuntar una animación.",
4416
+ "vectorEditor.timeline.playLabel": "▶ Reproducir",
4417
+ "vectorEditor.timeline.pauseLabel": "⏸ Pausa",
4418
+ "vectorEditor.timeline.stopLabel": "⏹ Detener",
4419
+ "vectorEditor.timeline.copyCssKeyframes": "📋 Copiar fotogramas clave CSS",
4420
+ "vectorEditor.timeline.tLabel": "t",
4421
+ "vectorEditor.layers.empty": "Aún no hay capas. Usa las herramientas para dibujar o inserta desde la pestaña Biblioteca.",
4422
+ "vectorEditor.layers.moveUp": "Subir",
4423
+ "vectorEditor.layers.moveDown": "Bajar",
4424
+ "vectorEditor.library.passProp": "Pasa una prop library a NiceVectorEditor para llenar esta pestaña con iconos insertables.",
4425
+ "vectorEditor.statusBar.zoom": "Zoom",
4426
+ "vectorEditor.statusBar.shapes": "forma(s)",
4427
+ "vectorEditor.statusBar.selected": "Seleccionado",
4428
+ "vectorEditor.statusBar.snap": "Ajuste",
4429
+ "vectorEditor.library.empty": "No hay iconos en la biblioteca.",
4430
+ "vectorEditor.snippet.title": "✅ Fragmento de icono copiado al portapapeles",
4431
+ "vectorEditor.snippet.pasteHint": "Pegar en",
4432
+ "vectorEditor.snippet.copyAgain": "Copiar de nuevo",
4433
+ "vectorEditor.snippet.close": "Cerrar",
4434
+ "vectorEditor.properties.appearance": "Apariencia",
4435
+ "vectorEditor.properties.fill": "Relleno",
4436
+ "vectorEditor.properties.solid": "Sólido",
4437
+ "vectorEditor.properties.gradient": "Degradado",
4438
+ "vectorEditor.properties.hideEditor": "▼ Ocultar editor",
4439
+ "vectorEditor.properties.editGradient": "► Editar degradado",
4440
+ "vectorEditor.properties.type": "Tipo",
4441
+ "vectorEditor.properties.linear": "Lineal",
4442
+ "vectorEditor.properties.radial": "Radial",
4443
+ "vectorEditor.properties.angle": "Ángulo",
4444
+ "vectorEditor.properties.cx": "CX",
4445
+ "vectorEditor.properties.cy": "CY",
4446
+ "vectorEditor.properties.r": "R",
4447
+ "vectorEditor.properties.colorStops": "Paradas de color:",
4448
+ "vectorEditor.properties.addStop": "+ Añadir parada",
4449
+ "vectorEditor.properties.removeStop": "- Eliminar",
4450
+ "vectorEditor.properties.stroke": "Trazo",
4451
+ "vectorEditor.properties.width": "Ancho",
4452
+ "vectorEditor.properties.opacity": "Opacidad",
4453
+ "vectorEditor.properties.rotation": "Rotación",
4454
+ "vectorEditor.properties.toolOptions": "Opciones de la herramienta",
4455
+ "vectorEditor.properties.radius": "Radio",
4456
+ "vectorEditor.properties.sides": "Lados",
4457
+ "vectorEditor.properties.points": "Puntos",
4458
+ "vectorEditor.properties.innerR": "R interior",
4459
+ "vectorEditor.properties.size": "Tamaño",
4460
+ "vectorEditor.properties.font": "Fuente",
4461
+ "vectorEditor.properties.grid": "Cuadrícula",
4462
+ "vectorEditor.properties.transform": "Transformar",
4463
+ "vectorEditor.properties.x": "X",
4464
+ "vectorEditor.properties.y": "Y",
4465
+ "vectorEditor.properties.w": "An",
4466
+ "vectorEditor.properties.h": "Al",
4467
+ "vectorEditor.layers.title": "Capas",
4468
+ "vectorEditor.layers.show": "Mostrar",
4469
+ "vectorEditor.layers.hide": "Ocultar",
4470
+ "vectorEditor.layers.lock": "Bloquear",
4471
+ "vectorEditor.layers.unlock": "Desbloquear"
3263
4472
  }, De = {
3264
4473
  ok: "OK",
3265
4474
  cancel: "Annulla",
@@ -3373,8 +4582,179 @@ const j = [
3373
4582
  "lang.ja": "Giapponese",
3374
4583
  "lang.ko": "Coreano",
3375
4584
  "lang.zh": "Cinese",
3376
- "lang.ar": "Arabo"
3377
- }, Ae = {
4585
+ "lang.ar": "Arabo",
4586
+ "tutorial.viewEditor.intro.title": "Editor di viste",
4587
+ "tutorial.viewEditor.intro.content": "Crea qualsiasi tipo di vista da un unico posto: scegli il tipo (o generala da un’entità), trascina i controlli dalla palette nelle celle della griglia, poi configura ogni cella — binding dei dati, permessi per ruolo e azioni sugli eventi. Passa tra Design / Anteprima / Sorgente e salva quando è valida.",
4588
+ "tutorial.play": "Riproduci",
4589
+ "tutorial.pause": "Pausa",
4590
+ "tutorial.speed": "Velocità",
4591
+ "tutorial.close": "Chiudi",
4592
+ "tutorial.start": "Tutorial",
4593
+ "tutorial.startAria": "Avvia il tutorial",
4594
+ "tutorial.next": "Avanti",
4595
+ "tutorial.back": "Indietro",
4596
+ "tutorial.finish": "Fine",
4597
+ "tutorial.skip": "Salta",
4598
+ "tutorial.stepOf": "di",
4599
+ "tutorial.moduleEditor.browser.title": "Browser dei moduli",
4600
+ "tutorial.moduleEditor.browser.content": "Seleziona qui un modulo per aprirne il manifest, le entità e le traduzioni.",
4601
+ "tutorial.moduleEditor.validate.title": "Convalida",
4602
+ "tutorial.moduleEditor.validate.content": "Verifica il modulo rispetto allo schema del manifest. I problemi compaiono nella barra di stato e nell’output.",
4603
+ "tutorial.moduleEditor.save.title": "Salva",
4604
+ "tutorial.moduleEditor.save.content": "Rendi persistenti le modifiche tramite il data provider configurato (es. riscrivi i file su disco).",
4605
+ "tutorial.manifestEditor.intro.title": "Editor del manifest",
4606
+ "tutorial.manifestEditor.intro.content": "Modifica il manifest in sezioni guidate dallo schema. Alterna Form ⇄ JSON per sezione; la convalida compare nella barra di stato.",
4607
+ "tutorial.schemaForm.intro.title": "Form da schema",
4608
+ "tutorial.schemaForm.intro.content": "Questo form è generato da uno schema. I campi obbligatori e gli errori di convalida sono evidenziati; usa l’interruttore JSON per la modifica grezza.",
4609
+ "tutorial.entityEditor.intro.title": "Editor di entità",
4610
+ "tutorial.entityEditor.intro.content": "Aggiungi le entità a sinistra, poi modifica a destra i metadati di ogni entità e i suoi campi (tipo, chiavi, vincoli).",
4611
+ "tutorial.i18nEditor.intro.title": "Traduzioni",
4612
+ "tutorial.i18nEditor.intro.content": "Modifica le traduzioni come griglia chiavi × lingue. Aggiungi chiavi e lingue; le celle ambra indicano traduzioni mancanti.",
4613
+ "tutorial.formBuilder.intro.title": "Costruttore di form",
4614
+ "tutorial.formBuilder.intro.content": "Trascina i campi dalla palette sul canvas, poi configura ciascun campo nel pannello delle proprietà. Esporta lo schema al termine.",
4615
+ "tutorial.formDesigner.intro.title": "Designer di form",
4616
+ "tutorial.formDesigner.intro.content": "Progetta form di inserimento dati con sezioni, lookup e campi calcolati; collegali alla tua entità e visualizza l’anteprima dal vivo.",
4617
+ "tutorial.paymentProviderConfig.intro.title": "Provider di pagamento",
4618
+ "tutorial.paymentProviderConfig.intro.content": "Scegli un provider, inserisci le credenziali (i segreti sono mascherati), seleziona test/live, abilita i metodi e copia l’URL del webhook.",
4619
+ "tutorial.webhookTester.intro.title": "Tester di webhook",
4620
+ "tutorial.webhookTester.intro.content": "Scegli un payload salvato (o scrivine uno), firmalo facoltativamente, invialo all’endpoint ed esamina la risposta.",
4621
+ "tutorial.apiDesigner.intro.title": "Designer di API",
4622
+ "tutorial.apiDesigner.intro.content": "Definisci endpoint, parametri, schemi di richiesta/risposta e sicurezza per il tuo documento OpenAPI.",
4623
+ "tutorial.apiTester.intro.title": "Tester di API",
4624
+ "tutorial.apiTester.intro.content": "Crea richieste con raccolte e variabili d’ambiente, inviale e verifica le risposte con asserzioni.",
4625
+ "tutorial.integrationBuilder.intro.title": "Costruttore di integrazioni",
4626
+ "tutorial.integrationBuilder.intro.content": "Collega un flusso di nodi (trigger → azioni → gestione errori) per costruire un’integrazione.",
4627
+ "tutorial.scriptRunner.intro.title": "Esecutore di script",
4628
+ "tutorial.scriptRunner.intro.content": "Scrivi uno script e un input di esempio, fai clic su Esegui, poi esamina il risultato e i log catturati qui sotto.",
4629
+ "tutorial.lifecycleHooks.intro.title": "Hook del ciclo di vita",
4630
+ "tutorial.lifecycleHooks.intro.content": "Associa gli handler a ciascun trigger, imposta l’ordine e il flag di abilitazione e aggiungi una condizione facoltativa che vincola l’esecuzione.",
4631
+ "tutorial.revisionHistory.intro.title": "Cronologia revisioni",
4632
+ "tutorial.revisionHistory.intro.content": "Scegli una revisione, selezionane un’altra da confrontare, esamina il diff affiancato, poi ripristina una versione precedente se necessario.",
4633
+ "tutorial.markdownEditor.intro.title": "Editor Markdown",
4634
+ "tutorial.markdownEditor.intro.content": "Scrivi in Markdown con la barra di formattazione; attiva l’anteprima dal vivo per vedere il risultato ed esporta in HTML.",
4635
+ "tutorial.htmlEditor.intro.title": "Editor di testo formattato",
4636
+ "tutorial.htmlEditor.intro.content": "Formatta il testo con la barra degli strumenti, inserisci link, immagini e tabelle e passa al sorgente HTML o Markdown quando serve.",
4637
+ "tutorial.documentEditor.intro.title": "Editor di documenti",
4638
+ "tutorial.documentEditor.intro.content": "Componi un documento a blocchi: usa la barra o i comandi slash per aggiungere titoli, elenchi, media e altro, poi esporta in HTML.",
4639
+ "tutorial.codeEditor.intro.title": "Editor di codice",
4640
+ "tutorial.codeEditor.intro.content": "Modifica il codice con evidenziazione della sintassi, IntelliSense e barra degli strumenti. Ctrl+S salva; la barra di stato mostra la posizione del cursore ed eventuali problemi.",
4641
+ "tutorial.kanbanBoard.intro.title": "Bacheca Kanban",
4642
+ "tutorial.kanbanBoard.intro.content": 'Trascina le schede tra le colonne per cambiarne lo stato, aggiungi schede con il pulsante "+" e fai clic su una scheda per modificarne i dettagli.',
4643
+ "tutorial.queryBuilder.intro.title": "Costruttore di query",
4644
+ "tutorial.queryBuilder.intro.content": "Aggiungi tabelle, scegli colonne, definisci join, condizioni e ordinamento in modo visuale — l’SQL è generato per te. Passa alla scheda SQL per esaminarlo.",
4645
+ "tutorial.stateDesigner.intro.title": "Designer di stato",
4646
+ "tutorial.stateDesigner.intro.content": "Modella lo store come slice con campi e azioni, scegli un target (es. Zustand) ed esporta codice di gestione dello stato pronto all’uso.",
4647
+ "tutorial.componentDesigner.intro.title": "Designer di componenti",
4648
+ "tutorial.componentDesigner.intro.content": "Dai un nome al componente, dichiara le sue prop con tipi e requisiti e visualizza in tempo reale l’interfaccia TypeScript generata.",
4649
+ "tutorial.pageBuilder.intro.title": "Costruttore di pagine",
4650
+ "tutorial.pageBuilder.intro.content": "Trascina i componenti dalla barra laterale sulla griglia responsiva, alterna l’anteprima desktop/tablet/mobile e salva il layout.",
4651
+ "tutorial.lowCodeStudio.intro.title": "Studio low-code",
4652
+ "tutorial.lowCodeStudio.intro.content": "Trascina i componenti dalla barra laterale sul canvas, poi alterna le schede Design, Anteprima e Codice per costruire ed esportare la tua app.",
4653
+ "tutorial.testBuilder.intro.title": "Costruttore di test",
4654
+ "tutorial.testBuilder.intro.content": "Crea suite di test in modo visuale: aggiungi casi e passi di interazione con asserzioni, eseguili ed esporta in un file .test.tsx pronto all’uso.",
4655
+ "tutorial.workflowDesigner.intro.title": "Designer di workflow",
4656
+ "tutorial.workflowDesigner.intro.content": "Aggiungi stati e transizioni sul canvas, convalida il flusso, simulalo, poi testa o pubblica il tuo workflow.",
4657
+ "tutorial.themeBuilder.intro.title": "Costruttore di temi",
4658
+ "tutorial.themeBuilder.intro.content": "Parti da un preset, regola colori, tipografia e altri token per sezione, visualizza l’anteprima dal vivo, poi applica o esporta il tema.",
4659
+ "tutorial.filterBuilder.intro.title": "Costruttore di filtri",
4660
+ "tutorial.filterBuilder.intro.content": "Costruisci alberi di filtri AND/OR complessi: aggiungi condizioni e gruppi annidati, scegli campi e operatori e salva preset riutilizzabili.",
4661
+ "tutorial.diagramDesigner.intro.title": "Designer di diagrammi",
4662
+ "tutorial.diagramDesigner.intro.content": "Trascina le forme dalla palette sul canvas, collegale con i connettori, modifica le proprietà a destra, poi esporta in SVG, PNG o JSON.",
4663
+ "tutorial.reportBuilder.intro.title": "Costruttore di report",
4664
+ "tutorial.reportBuilder.intro.content": "Trascina le sezioni sul report, collegale alle origini dati, disponi il layout, poi esporta in PDF, HTML o XLSX.",
4665
+ "tutorial.erpReportDesigner.intro.title": "Designer di report",
4666
+ "tutorial.erpReportDesigner.intro.content": "Disponi report a bande: inserisci elementi (campi, espressioni, grafici) nelle bande, collega le connessioni dati, modifica le proprietà, poi visualizza ed esporta.",
4667
+ "tutorial.recipeEditor.intro.title": "Editor di ricette",
4668
+ "tutorial.recipeEditor.intro.content": "Modifica i dettagli della ricetta, aggiungi e riordina ingredienti e passaggi, allega foto e importa o esporta la ricetta come JSON.",
4669
+ "tutorial.pipelineEditor.intro.title": "Editor di pipeline",
4670
+ "tutorial.pipelineEditor.intro.content": "Costruisci una pipeline CI/CD con stage, job e step; imposta trigger, variabili e segreti; poi convalida, salva ed esegui.",
4671
+ "tutorial.mergeRequestBuilder.intro.title": "Costruttore di merge request",
4672
+ "tutorial.mergeRequestBuilder.intro.content": "Scegli i branch di origine e destinazione, scrivi titolo e descrizione, aggiungi revisori, etichette e issue collegate, poi visualizza e invia.",
4673
+ "tutorial.automationRuleEditor.intro.title": "Editor di regole di automazione",
4674
+ "tutorial.automationRuleEditor.intro.content": "Definisci il trigger, aggiungi condizioni facoltative, poi elenca le azioni da eseguire — passa tra le tre sezioni usando le schede.",
4675
+ "tutorial.sceneActionBuilder.intro.title": "Costruttore di azioni scena",
4676
+ "tutorial.sceneActionBuilder.intro.content": "Aggiungi un’azione per dispositivo, imposta lo stato di destinazione e un ritardo facoltativo, riordinale e visualizza l’anteprima della sequenza.",
4677
+ "tutorial.backupTagEditor.intro.title": "Tag di backup",
4678
+ "tutorial.backupTagEditor.intro.content": "Etichetta questo backup per recuperarlo facilmente: digita un’etichetta e scegli un colore, o aggiungi uno dei tag suggeriti; i tag generati automaticamente sono protetti.",
4679
+ "tutorial.dataMergeBuilder.intro.title": "Unione dati",
4680
+ "tutorial.dataMergeBuilder.intro.content": "Segui i passaggi: scegli i branch di origine e destinazione, visualizza le modifiche, risolvi i conflitti, imposta le opzioni, poi conferma l’unione.",
4681
+ "tutorial.invoiceLineEditor.intro.title": "Righe fattura",
4682
+ "tutorial.invoiceLineEditor.intro.content": "Aggiungi voci con quantità, prezzo unitario, IVA e sconto — netto, lordo e il dettaglio IVA sono calcolati automaticamente.",
4683
+ "tutorial.keyValueEditor.intro.title": "Editor chiave/valore",
4684
+ "tutorial.keyValueEditor.intro.content": "Aggiungi righe chiave/valore per header, parametri, variabili d’ambiente o configurazioni; maschera i valori segreti, attiva/disattiva le righe e tieni d’occhio le chiavi duplicate.",
4685
+ "tutorial.imageEditor.intro.title": "Editor di immagini",
4686
+ "tutorial.imageEditor.intro.content": "Usa la barra per ritagliare, ruotare, capovolgere, regolare luminosità/contrasto e annotare; annulla/ripristina le modifiche, poi salva il risultato.",
4687
+ "tutorial.cropEditor.intro.title": "Editor di ritaglio",
4688
+ "tutorial.cropEditor.intro.content": "Trascina il riquadro di ritaglio sull’immagine, scegli una proporzione, ruota, capovolgi o zooma, poi usa il risultato.",
4689
+ "tutorial.pdfAnnotationEditor.intro.title": "Annotazioni PDF",
4690
+ "tutorial.pdfAnnotationEditor.intro.content": "Scegli uno strumento dalla barra (evidenzia, sottolinea, mano libera, testo…), annota la pagina, naviga tra le pagine e zooma secondo necessità.",
4691
+ "tutorial.videoEditor.intro.title": "Editor video",
4692
+ "tutorial.videoEditor.intro.content": "Aggiungi media alle tracce della timeline, taglia e disponi le clip, modifica le proprietà delle clip, visualizza l’anteprima, poi esporta il video.",
4693
+ "tutorial.viewBuilder.intro.title": "Costruttore di viste",
4694
+ "tutorial.viewBuilder.intro.content": "Trascina i controlli dalla palette nelle celle della griglia, configura ogni cella nel pannello delle proprietà e importa, esporta o salva la vista.",
4695
+ "tutorial.dashboardDesigner.intro.title": "Designer di dashboard",
4696
+ "tutorial.dashboardDesigner.intro.content": "Trascina i widget dalla palette sulla griglia, ridimensionali e disponili, configura ciascuno nel pannello delle proprietà, poi visualizza o esporta la dashboard.",
4697
+ "tutorial.workflowDesignerCanvas.intro.title": "Designer di workflow",
4698
+ "tutorial.workflowDesignerCanvas.intro.content": "Aggiungi nodi trigger, azione e condizione sul canvas e collegali; gestisci le variabili, convalida il flusso, poi esportalo.",
4699
+ "tutorial.armatureEditor.intro.title": "Editor di armature",
4700
+ "tutorial.armatureEditor.intro.content": "Seleziona le ossa per modificarne le trasformazioni, aggiungi o riassegna ossa, configura le catene IK e salva o carica le pose.",
4701
+ "tutorial.morphTargetEditor.intro.title": "Editor di morph target",
4702
+ "tutorial.morphTargetEditor.intro.content": "Miscela i morph target della mesh con i cursori di influenza per target, crea o elimina target e visualizza l’anteprima dell’interpolazione.",
4703
+ "tutorial.terrainEditor.intro.title": "Editor di terreno",
4704
+ "tutorial.terrainEditor.intro.content": "Scolpisci la heightmap con i pennelli (alza, abbassa, appiattisci, leviga, rumore), applica layer di texture, genera terreno procedurale e importa/esporta heightmap.",
4705
+ "tutorial.materialEditor.intro.title": "Editor di materiali",
4706
+ "tutorial.materialEditor.intro.content": "Crea uno shader come grafo di nodi: trascina i nodi dalla palette, collega le loro porte, modifica le proprietà e visualizza l’anteprima del materiale compilato.",
4707
+ "tutorial.particleEditor.intro.title": "Editor di particelle",
4708
+ "tutorial.particleEditor.intro.content": "Scegli un sistema di particelle, regola l’emettitore e i moduli nell’inspector e riproduci, metti in pausa o ferma l’anteprima dal vivo.",
4709
+ "tutorial.uvEditor.intro.title": "Editor UV",
4710
+ "tutorial.uvEditor.intro.content": "Modifica il layout UV della mesh sopra la texture: seleziona e trasforma le UV con gli strumenti, cambia canale UV e applica le modifiche.",
4711
+ "tutorial.fontEditor.intro.title": "Editor di font",
4712
+ "tutorial.fontEditor.intro.content": "Modifica i glifi sulla griglia unicode, regola le metriche del font e i tracciati e i bearing per glifo, poi esporta il font.",
4713
+ "tutorial.iconEditor.intro.title": "Editor di icone",
4714
+ "tutorial.iconEditor.intro.content": "Disegna e modifica forme SVG sulla griglia, regola il tratto e le varianti, visualizza l’anteprima su sfondi diversi ed esporta in SVG, React o PNG.",
4715
+ "tutorial.uiDesigner.intro.title": "Designer di UI",
4716
+ "tutorial.uiDesigner.intro.content": "Trascina i componenti dalla palette sul canvas, modifica le loro prop nel pannello, visualizza l’anteprima dei breakpoint responsivi ed esporta in React/TSX.",
4717
+ "tutorial.gameEditor.intro.title": "Editor di gioco",
4718
+ "tutorial.gameEditor.intro.content": "Costruisci la scena nel viewport usando i pannelli gerarchia e asset, modifica le entità nell’inspector e salva il progetto.",
4719
+ "tutorial.levelEditor.intro.title": "Editor di livelli",
4720
+ "tutorial.levelEditor.intro.content": "Costruisci il mondo di gioco: posiziona e aggancia oggetti su più layer, dipingi il terreno, disponi spline e luci, poi calcola le lightmap.",
4721
+ "tutorial.gameMaterialEditor.intro.title": "Editor di materiali",
4722
+ "tutorial.gameMaterialEditor.intro.content": "Crea uno shader come grafo di nodi: aggiungi e collega i nodi shader, modifica le loro proprietà e compila il materiale.",
4723
+ "tutorial.gameParticleEditor.intro.title": "Editor di particelle",
4724
+ "tutorial.gameParticleEditor.intro.content": "Regola il sistema di particelle nell’inspector — emettitore, durata, curve e rendering — e riproduci, metti in pausa o riavvia l’anteprima dal vivo.",
4725
+ "tutorial.floorPlanEditor.intro.title": "Editor di planimetrie",
4726
+ "tutorial.floorPlanEditor.intro.content": "Disegna stanze e zone con gli strumenti, posiziona i dispositivi sulla planimetria, cambia piano e attiva overlay come quote, griglia e occupazione.",
4727
+ "tutorial.buildingSceneEditor.intro.title": "Editor di scene",
4728
+ "tutorial.buildingSceneEditor.intro.content": "Crea scene che impostano più dispositivi insieme: scegli una scena, seleziona gli stati di destinazione dei dispositivi, poi salvala o attivala.",
4729
+ "tutorial.buildingAutomationEditor.intro.title": "Editor di automazioni",
4730
+ "tutorial.buildingAutomationEditor.intro.content": "Crea automazioni dell’edificio: scegline una dall’elenco, definisci trigger, condizioni e azioni, poi salvala, abilitala o eliminala.",
4731
+ "tutorial.spatialEditor.intro.title": "Editor spaziale",
4732
+ "tutorial.spatialEditor.intro.content": "Disponi planimetrie in diverse modalità: disegna muri, stanze e oggetti con gli strumenti, gestisci i layer, aggancia alla griglia, poi esporta.",
4733
+ "tutorial.decisionTreeEditor.intro.title": "Editor di alberi decisionali",
4734
+ "tutorial.decisionTreeEditor.intro.content": "Esplora l’albero decisionale: fai clic sui nodi per esaminare condizioni ed esiti, attiva metriche, probabilità e campioni ed evidenzia un percorso per un input.",
4735
+ "tutorial.diagramEditor.intro.title": "Editor di diagrammi",
4736
+ "tutorial.diagramEditor.intro.content": "Scegli uno strumento per aggiungere e collegare i nodi sul canvas, modificali nel pannello delle proprietà ed esporta il diagramma dalla barra.",
4737
+ "tutorial.contractEditor.intro.title": "Editor di contratti",
4738
+ "tutorial.contractEditor.intro.content": "Assembla il contratto dalla libreria di clausole, compila le variabili del modello, traccia versioni e approvazioni, poi salva o esporta in PDF/DOCX/HTML.",
4739
+ "tutorial.invoiceDesigner.intro.title": "Designer di fatture",
4740
+ "tutorial.invoiceDesigner.intro.content": "Trascina gli elementi sul canvas della fattura, collegali ai campi dati, allinea con griglia e righelli, poi salva o esporta in PDF.",
4741
+ "tutorial.presentationEditor.intro.title": "Editor di presentazioni",
4742
+ "tutorial.presentationEditor.intro.content": "Crea le slide dalla barra delle miniature, aggiungi e disponi gli elementi sul canvas, modificali nel pannello delle proprietà, poi presenta o esporta.",
4743
+ "tutorial.dashboardStudio.intro.title": "Studio dashboard",
4744
+ "tutorial.dashboardStudio.intro.content": "Trascina i widget dalla palette sulla griglia, collegali alle origini dati, aggiungi filtri, poi alterna Modifica/Visualizza, aggiorna e salva.",
4745
+ "tutorial.biReportBuilder.intro.title": "Costruttore di report",
4746
+ "tutorial.biReportBuilder.intro.content": "Trascina gli elementi dalla palette sul report, collegali alle origini dati, alterna design/anteprima, poi esporta in PDF o Excel.",
4747
+ "tutorial.etlBuilder.intro.title": "Costruttore ETL",
4748
+ "tutorial.etlBuilder.intro.content": "Collega sorgenti → trasformazioni → destinazioni in una pipeline, alterna le viste, poi eseguila e salva la configurazione.",
4749
+ "tutorial.videoEditorPro.intro.title": "Editor video",
4750
+ "tutorial.videoEditorPro.intro.content": "Aggiungi media alla timeline, disponi e taglia le clip, applica effetti e transizioni, poi configura ed esegui l’esportazione.",
4751
+ "tutorial.mlStudio.intro.title": "Studio ML",
4752
+ "tutorial.mlStudio.intro.content": "Procedi tra le schede: prepara i dataset, esegui esperimenti, confronta e scegli i modelli, poi distribuisci il migliore.",
4753
+ "tutorial.mathEditor.intro.title": "Editor matematico",
4754
+ "tutorial.mathEditor.intro.content": "Scrivi equazioni in LaTeX o inserisci simboli dalla palette; passa all’input a mano libera e visualizza l’anteprima della formula dal vivo.",
4755
+ "tutorial.dmxEditor.intro.title": "Editor DMX",
4756
+ "tutorial.dmxEditor.intro.content": "Scegli il dispositivo FTDI e la porta, poi imposta il valore di ogni canale DMX con i cursori per controllare dal vivo i tuoi fari."
4757
+ }, je = {
3378
4758
  ok: "OK",
3379
4759
  cancel: "Cancelar",
3380
4760
  save: "Salvar",
@@ -3737,7 +5117,7 @@ const j = [
3737
5117
  "wm.minimizeAll": "Minimizar todos",
3738
5118
  "wm.newWindow": "Nova janela",
3739
5119
  "wm.moveToFront": "Trazer para frente"
3740
- }, xe = {
5120
+ }, Ae = {
3741
5121
  ok: "OK",
3742
5122
  cancel: "Annuleren",
3743
5123
  save: "Opslaan",
@@ -3822,7 +5202,7 @@ const j = [
3822
5202
  "lang.ko": "Koreaans",
3823
5203
  "lang.zh": "Chinees",
3824
5204
  "lang.ar": "Arabisch"
3825
- }, Te = {
5205
+ }, Pe = {
3826
5206
  ok: "OK",
3827
5207
  cancel: "Avbryt",
3828
5208
  save: "Spara",
@@ -3892,7 +5272,7 @@ const j = [
3892
5272
  "lang.ko": "Koreanska",
3893
5273
  "lang.zh": "Kinesiska",
3894
5274
  "lang.ar": "Arabiska"
3895
- }, Pe = {
5275
+ }, Te = {
3896
5276
  ok: "OK",
3897
5277
  cancel: "Avbryt",
3898
5278
  save: "Lagre",
@@ -3955,7 +5335,7 @@ const j = [
3955
5335
  "lang.ko": "Koreansk",
3956
5336
  "lang.zh": "Kinesisk",
3957
5337
  "lang.ar": "Arabisk"
3958
- }, je = {
5338
+ }, xe = {
3959
5339
  ok: "OK",
3960
5340
  cancel: "Annuller",
3961
5341
  save: "Gem",
@@ -4018,7 +5398,7 @@ const j = [
4018
5398
  "lang.ko": "Koreansk",
4019
5399
  "lang.zh": "Kinesisk",
4020
5400
  "lang.ar": "Arabisk"
4021
- }, Ne = {
5401
+ }, Be = {
4022
5402
  ok: "OK",
4023
5403
  cancel: "Peruuta",
4024
5404
  save: "Tallenna",
@@ -4081,7 +5461,7 @@ const j = [
4081
5461
  "lang.ko": "Korea",
4082
5462
  "lang.zh": "Kiina",
4083
5463
  "lang.ar": "Arabia"
4084
- }, Fe = {
5464
+ }, Me = {
4085
5465
  ok: "OK",
4086
5466
  cancel: "Zrušit",
4087
5467
  save: "Uložit",
@@ -4444,7 +5824,7 @@ const j = [
4444
5824
  "wm.minimizeAll": "Minimalizovat vše",
4445
5825
  "wm.newWindow": "Nové okno",
4446
5826
  "wm.moveToFront": "Přenést dopředu"
4447
- }, Me = {
5827
+ }, Fe = {
4448
5828
  ok: "OK",
4449
5829
  cancel: "Zrušiť",
4450
5830
  save: "Uložiť",
@@ -4507,7 +5887,7 @@ const j = [
4507
5887
  "lang.ko": "Kórejčina",
4508
5888
  "lang.zh": "Čínština",
4509
5889
  "lang.ar": "Arabčina"
4510
- }, Oe = {
5890
+ }, Ne = {
4511
5891
  ok: "OK",
4512
5892
  cancel: "Mégse",
4513
5893
  save: "Mentés",
@@ -4680,7 +6060,9 @@ const j = [
4680
6060
  "lang.ko": "Корейски",
4681
6061
  "lang.zh": "Китайски",
4682
6062
  "lang.ar": "Арабски"
4683
- }, Be = {
6063
+ }, Oe = {
6064
+ "tutorial.viewEditor.intro.title": "Редактор подань",
6065
+ "tutorial.viewEditor.intro.content": "Створюйте будь-який тип подання в одному місці: виберіть тип (або згенеруйте із сутності), перетягуйте елементи керування з палітри в клітинки сітки, а потім налаштуйте кожну клітинку — прив’язку даних, дозволи за ролями та дії подій. Перемикайте «Дизайн / Перегляд / Код» і зберігайте, коли подання правильне.",
4684
6066
  ok: "OK",
4685
6067
  cancel: "Скасувати",
4686
6068
  save: "Зберегти",
@@ -5042,7 +6424,516 @@ const j = [
5042
6424
  "wm.closeAll": "Закрити всі",
5043
6425
  "wm.minimizeAll": "Згорнути всі",
5044
6426
  "wm.newWindow": "Нове вікно",
5045
- "wm.moveToFront": "На передній план"
6427
+ "wm.moveToFront": "На передній план",
6428
+ // Tutorials + UI strings (1.0.22)
6429
+ "tutorial.play": "Відтворити",
6430
+ "tutorial.pause": "Пауза",
6431
+ "tutorial.speed": "Швидкість",
6432
+ "tutorial.close": "Закрити",
6433
+ "tutorial.start": "Посібник",
6434
+ "tutorial.startAria": "Запустити посібник",
6435
+ "tutorial.next": "Далі",
6436
+ "tutorial.back": "Назад",
6437
+ "tutorial.finish": "Завершити",
6438
+ "tutorial.skip": "Пропустити",
6439
+ "tutorial.stepOf": "з",
6440
+ "tutorial.moduleEditor.browser.title": "Браузер модулів",
6441
+ "tutorial.moduleEditor.browser.content": "Виберіть тут модуль, щоб відкрити його маніфест, сутності та переклади.",
6442
+ "tutorial.moduleEditor.validate.title": "Перевірити",
6443
+ "tutorial.moduleEditor.validate.content": "Перевірте модуль за схемою маніфесту. Проблеми з’являються в рядку стану та у виводі.",
6444
+ "tutorial.moduleEditor.save.title": "Зберегти",
6445
+ "tutorial.moduleEditor.save.content": "Збережіть зміни через налаштований постачальник даних (напр., запис файлів назад на диск).",
6446
+ "tutorial.manifestEditor.intro.title": "Редактор маніфесту",
6447
+ "tutorial.manifestEditor.intro.content": "Редагуйте маніфест у розділах на основі схеми. Перемикайте Форма ⇄ JSON для кожного розділу; перевірка з’являється в рядку стану.",
6448
+ "tutorial.schemaForm.intro.title": "Форма за схемою",
6449
+ "tutorial.schemaForm.intro.content": "Ця форма генерується зі схеми. Обов’язкові поля та помилки перевірки підсвічуються; використовуйте перемикач JSON для прямого редагування.",
6450
+ "tutorial.entityEditor.intro.title": "Редактор сутностей",
6451
+ "tutorial.entityEditor.intro.content": "Додавайте сутності ліворуч, а праворуч редагуйте метадані кожної сутності та її поля (тип, ключі, обмеження).",
6452
+ "tutorial.i18nEditor.intro.title": "Переклади",
6453
+ "tutorial.i18nEditor.intro.content": "Редагуйте переклади як таблицю ключі × мови. Додавайте ключі та мови; бурштинові клітинки позначають відсутні переклади.",
6454
+ "tutorial.formBuilder.intro.title": "Конструктор форм",
6455
+ "tutorial.formBuilder.intro.content": "Перетягуйте поля з палітри на полотно та налаштовуйте кожне поле на панелі властивостей. Експортуйте схему, коли завершите.",
6456
+ "tutorial.formDesigner.intro.title": "Дизайнер форм",
6457
+ "tutorial.formDesigner.intro.content": "Проєктуйте форми введення даних із розділами, полями пошуку та обчислюваними полями; прив’яжіть їх до сутності та переглядайте наживо.",
6458
+ "tutorial.paymentProviderConfig.intro.title": "Платіжний провайдер",
6459
+ "tutorial.paymentProviderConfig.intro.content": "Виберіть провайдера, заповніть облікові дані (секрети приховуються), виберіть тест/робочий режим, увімкніть методи та скопіюйте URL вебхука.",
6460
+ "tutorial.webhookTester.intro.title": "Тестер вебхуків",
6461
+ "tutorial.webhookTester.intro.content": "Виберіть збережене корисне навантаження (або напишіть своє), за потреби підпишіть його, надішліть на endpoint і перегляньте відповідь.",
6462
+ "tutorial.apiDesigner.intro.title": "Дизайнер API",
6463
+ "tutorial.apiDesigner.intro.content": "Визначте endpoint-и, параметри, схеми запиту/відповіді та безпеку вашого документа OpenAPI.",
6464
+ "tutorial.apiTester.intro.title": "Тестер API",
6465
+ "tutorial.apiTester.intro.content": "Створюйте запити з колекціями та змінними середовища, надсилайте їх і перевіряйте відповіді.",
6466
+ "tutorial.integrationBuilder.intro.title": "Конструктор інтеграцій",
6467
+ "tutorial.integrationBuilder.intro.content": "З’єднайте потік вузлів (тригери → дії → обробка помилок), щоб побудувати інтеграцію.",
6468
+ "tutorial.scriptRunner.intro.title": "Запуск скриптів",
6469
+ "tutorial.scriptRunner.intro.content": "Напишіть скрипт і приклад вхідних даних, натисніть «Виконати» та перегляньте результат і зібрані журнали нижче.",
6470
+ "tutorial.lifecycleHooks.intro.title": "Хуки життєвого циклу",
6471
+ "tutorial.lifecycleHooks.intro.content": "Прив’яжіть обробники до кожного тригера, задайте їхній порядок і прапорець активації та додайте необов’язкову умову, що керує виконанням.",
6472
+ "tutorial.revisionHistory.intro.title": "Історія версій",
6473
+ "tutorial.revisionHistory.intro.content": "Виберіть версію, виберіть іншу для порівняння, перегляньте відмінності поряд і за потреби відновіть попередню версію.",
6474
+ "tutorial.markdownEditor.intro.title": "Редактор Markdown",
6475
+ "tutorial.markdownEditor.intro.content": "Пишіть Markdown за допомогою панелі форматування; увімкніть попередній перегляд наживо, щоб бачити результат, і експортуйте у HTML.",
6476
+ "tutorial.htmlEditor.intro.title": "Редактор форматованого тексту",
6477
+ "tutorial.htmlEditor.intro.content": "Форматуйте текст за допомогою панелі інструментів, вставляйте посилання, зображення й таблиці та за потреби переходьте до коду HTML або Markdown.",
6478
+ "tutorial.documentEditor.intro.title": "Редактор документів",
6479
+ "tutorial.documentEditor.intro.content": "Складайте документ із блоків: використовуйте панель інструментів або slash-команди, щоб додавати заголовки, списки, медіа тощо, і експортуйте у HTML.",
6480
+ "tutorial.codeEditor.intro.title": "Редактор коду",
6481
+ "tutorial.codeEditor.intro.content": "Редагуйте код із підсвічуванням синтаксису, IntelliSense та панеллю інструментів. Ctrl+S зберігає; рядок стану показує позицію курсора та проблеми.",
6482
+ "tutorial.kanbanBoard.intro.title": "Дошка Kanban",
6483
+ "tutorial.kanbanBoard.intro.content": "Перетягуйте картки між колонками, щоб змінити їхній статус, додавайте картки кнопкою «+» та клацніть картку, щоб редагувати її деталі.",
6484
+ "tutorial.queryBuilder.intro.title": "Конструктор запитів",
6485
+ "tutorial.queryBuilder.intro.content": "Додавайте таблиці, обирайте стовпці та візуально визначайте з’єднання, умови й сортування — SQL генерується автоматично. Перейдіть на вкладку SQL, щоб переглянути його.",
6486
+ "tutorial.stateDesigner.intro.title": "Дизайнер стану",
6487
+ "tutorial.stateDesigner.intro.content": "Змоделюйте сховище як зрізи з полями та діями, виберіть ціль (напр., Zustand) і експортуйте готовий код керування станом.",
6488
+ "tutorial.componentDesigner.intro.title": "Дизайнер компонентів",
6489
+ "tutorial.componentDesigner.intro.content": "Назвіть компонент, оголосіть його props із типами та вимогами й переглядайте згенерований інтерфейс TypeScript наживо.",
6490
+ "tutorial.pageBuilder.intro.title": "Конструктор сторінок",
6491
+ "tutorial.pageBuilder.intro.content": "Перетягуйте компоненти з бічної панелі на адаптивну сітку, перемикайте перегляд для комп’ютера/планшета/мобільного та зберігайте макет.",
6492
+ "tutorial.lowCodeStudio.intro.title": "Студія low-code",
6493
+ "tutorial.lowCodeStudio.intro.content": "Перетягуйте компоненти з бічної панелі на полотно та перемикайтеся між вкладками «Дизайн», «Перегляд» і «Код», щоб створити та експортувати застосунок.",
6494
+ "tutorial.testBuilder.intro.title": "Конструктор тестів",
6495
+ "tutorial.testBuilder.intro.content": "Створюйте набори тестів візуально: додавайте випадки та кроки взаємодії з перевірками, запускайте їх і експортуйте у готовий файл .test.tsx.",
6496
+ "tutorial.workflowDesigner.intro.title": "Дизайнер робочих процесів",
6497
+ "tutorial.workflowDesigner.intro.content": "Додавайте стани й переходи на полотні, перевіряйте потік, симулюйте його, а потім тестуйте або публікуйте робочий процес.",
6498
+ "tutorial.themeBuilder.intro.title": "Конструктор тем",
6499
+ "tutorial.themeBuilder.intro.content": "Почніть із пресету, налаштовуйте кольори, типографіку та інші токени за розділами, переглядайте наживо, а потім застосуйте або експортуйте тему.",
6500
+ "tutorial.filterBuilder.intro.title": "Конструктор фільтрів",
6501
+ "tutorial.filterBuilder.intro.content": "Будуйте складні дерева фільтрів І/АБО: додавайте умови та вкладені групи, обирайте поля й оператори та зберігайте багаторазові пресети.",
6502
+ "tutorial.diagramDesigner.intro.title": "Дизайнер діаграм",
6503
+ "tutorial.diagramDesigner.intro.content": "Перетягуйте фігури з палітри на полотно, з’єднуйте їх конекторами, редагуйте властивості праворуч і експортуйте у SVG, PNG або JSON.",
6504
+ "tutorial.reportBuilder.intro.title": "Конструктор звітів",
6505
+ "tutorial.reportBuilder.intro.content": "Перетягуйте розділи у звіт, прив’язуйте їх до джерел даних, упорядковуйте макет і експортуйте у PDF, HTML або XLSX.",
6506
+ "tutorial.erpReportDesigner.intro.title": "Дизайнер звітів",
6507
+ "tutorial.erpReportDesigner.intro.content": "Проєктуйте стрічкові звіти: розміщуйте елементи (поля, вирази, діаграми) у стрічках, прив’язуйте з’єднання даних, редагуйте властивості, а потім переглядайте та експортуйте.",
6508
+ "tutorial.recipeEditor.intro.title": "Редактор рецептів",
6509
+ "tutorial.recipeEditor.intro.content": "Редагуйте деталі рецепта, додавайте та змінюйте порядок інгредієнтів і кроків, прикріплюйте фото та імпортуйте чи експортуйте рецепт як JSON.",
6510
+ "tutorial.pipelineEditor.intro.title": "Редактор конвеєра",
6511
+ "tutorial.pipelineEditor.intro.content": "Будуйте конвеєр CI/CD зі стадій, завдань і кроків; задавайте тригери, змінні та секрети; а потім перевіряйте, зберігайте та запускайте його.",
6512
+ "tutorial.mergeRequestBuilder.intro.title": "Конструктор merge request",
6513
+ "tutorial.mergeRequestBuilder.intro.content": "Виберіть гілки джерела й призначення, напишіть заголовок і опис, додайте рецензентів, мітки та пов’язані задачі, а потім перегляньте та надішліть.",
6514
+ "tutorial.automationRuleEditor.intro.title": "Редактор правил автоматизації",
6515
+ "tutorial.automationRuleEditor.intro.content": "Визначте тригер, додайте необов’язкові умови, а потім перелічіть дії для виконання — перемикайтеся між трьома розділами за допомогою вкладок.",
6516
+ "tutorial.sceneActionBuilder.intro.title": "Конструктор дій сцени",
6517
+ "tutorial.sceneActionBuilder.intro.content": "Додайте дію для кожного пристрою, задайте її цільовий стан і необов’язкову затримку, змініть порядок і перегляньте послідовність сцени.",
6518
+ "tutorial.backupTagEditor.intro.title": "Теги резервної копії",
6519
+ "tutorial.backupTagEditor.intro.content": "Позначте цю резервну копію тегами для зручного пошуку: введіть підпис і виберіть колір або додайте один із запропонованих тегів; автоматично створені теги захищені.",
6520
+ "tutorial.dataMergeBuilder.intro.title": "Об’єднання даних",
6521
+ "tutorial.dataMergeBuilder.intro.content": "Пройдіть кроки: виберіть гілки джерела й призначення, перегляньте зміни, вирішіть конфлікти, задайте параметри, а потім підтвердьте об’єднання.",
6522
+ "tutorial.invoiceLineEditor.intro.title": "Рядки рахунка",
6523
+ "tutorial.invoiceLineEditor.intro.content": "Додавайте позиції з кількістю, ціною за одиницю, ПДВ і знижкою — нетто, брутто та розбивку ПДВ обчислюються автоматично.",
6524
+ "tutorial.keyValueEditor.intro.title": "Редактор ключ/значення",
6525
+ "tutorial.keyValueEditor.intro.content": "Додавайте рядки ключ/значення для заголовків, параметрів, змінних середовища чи конфігурації; приховуйте секретні значення, вмикайте/вимикайте рядки та стежте за дублікатами ключів.",
6526
+ "tutorial.imageEditor.intro.title": "Редактор зображень",
6527
+ "tutorial.imageEditor.intro.content": "Використовуйте панель інструментів, щоб обрізати, обертати, віддзеркалювати, налаштовувати яскравість/контраст та робити позначки; скасовуйте/повторюйте зміни та зберігайте результат.",
6528
+ "tutorial.cropEditor.intro.title": "Редактор обрізання",
6529
+ "tutorial.cropEditor.intro.content": "Перетягніть рамку обрізання на зображення, виберіть співвідношення сторін, обертайте, віддзеркалюйте або масштабуйте, а потім використайте результат.",
6530
+ "tutorial.pdfAnnotationEditor.intro.title": "Анотації PDF",
6531
+ "tutorial.pdfAnnotationEditor.intro.content": "Виберіть інструмент на панелі (виділення, підкреслення, від руки, текст…), робіть позначки на сторінці, гортайте сторінки та масштабуйте за потреби.",
6532
+ "tutorial.videoEditor.intro.title": "Відеоредактор",
6533
+ "tutorial.videoEditor.intro.content": "Додавайте медіа на доріжки таймлайну, обрізайте та впорядковуйте кліпи, редагуйте їхні властивості, переглядайте відтворення, а потім експортуйте відео.",
6534
+ "tutorial.viewBuilder.intro.title": "Конструктор подань",
6535
+ "tutorial.viewBuilder.intro.content": "Перетягуйте елементи керування з палітри в клітинки сітки, налаштовуйте кожну клітинку на панелі властивостей та імпортуйте, експортуйте чи зберігайте подання.",
6536
+ "tutorial.dashboardDesigner.intro.title": "Дизайнер дашбордів",
6537
+ "tutorial.dashboardDesigner.intro.content": "Перетягуйте віджети з палітри на сітку, змінюйте їхній розмір і впорядковуйте, налаштовуйте кожен на панелі властивостей, а потім переглядайте або експортуйте дашборд.",
6538
+ "tutorial.workflowDesignerCanvas.intro.title": "Дизайнер робочих процесів",
6539
+ "tutorial.workflowDesignerCanvas.intro.content": "Додавайте на полотно вузли тригерів, дій та умов і з’єднуйте їх; керуйте змінними, перевіряйте потік, а потім експортуйте його.",
6540
+ "tutorial.armatureEditor.intro.title": "Редактор скелета",
6541
+ "tutorial.armatureEditor.intro.content": "Виберіть кістки, щоб редагувати їхні трансформації, додавайте або змінюйте батьківські кістки, налаштовуйте IK-ланцюги та зберігайте чи завантажуйте пози.",
6542
+ "tutorial.morphTargetEditor.intro.title": "Редактор морф-цілей",
6543
+ "tutorial.morphTargetEditor.intro.content": "Змішуйте морф-цілі сітки повзунками впливу для кожної цілі, створюйте чи видаляйте цілі та переглядайте інтерполяцію.",
6544
+ "tutorial.terrainEditor.intro.title": "Редактор ландшафту",
6545
+ "tutorial.terrainEditor.intro.content": "Скульптуруйте карту висот пензлями (підняти, опустити, вирівняти, згладити, шум), накладайте текстурні шари, генеруйте процедурний ландшафт та імпортуйте/експортуйте карти висот.",
6546
+ "tutorial.materialEditor.intro.title": "Редактор матеріалів",
6547
+ "tutorial.materialEditor.intro.content": "Будуйте шейдер як граф вузлів: перетягуйте вузли з палітри, з’єднуйте їхні порти, редагуйте властивості та переглядайте скомпільований матеріал.",
6548
+ "tutorial.particleEditor.intro.title": "Редактор частинок",
6549
+ "tutorial.particleEditor.intro.content": "Виберіть систему частинок, налаштуйте її емітер і модулі в інспекторі та відтворюйте, призупиняйте чи зупиняйте перегляд наживо.",
6550
+ "tutorial.uvEditor.intro.title": "Редактор UV",
6551
+ "tutorial.uvEditor.intro.content": "Редагуйте UV-розгортку сітки поверх текстури: виділяйте та трансформуйте UV інструментами, перемикайте UV-канали та застосовуйте зміни.",
6552
+ "tutorial.fontEditor.intro.title": "Редактор шрифтів",
6553
+ "tutorial.fontEditor.intro.content": "Редагуйте гліфи на сітці Unicode, налаштовуйте метрики шрифту, контури та відступи для кожного гліфа, а потім експортуйте шрифт.",
6554
+ "tutorial.iconEditor.intro.title": "Редактор іконок",
6555
+ "tutorial.iconEditor.intro.content": "Малюйте та редагуйте SVG-фігури на сітці, налаштовуйте параметри обведення та варіанта, переглядайте на різних фонах та експортуйте у SVG, React або PNG.",
6556
+ "tutorial.uiDesigner.intro.title": "Дизайнер інтерфейсу",
6557
+ "tutorial.uiDesigner.intro.content": "Перетягуйте компоненти з палітри на полотно, редагуйте їхні props на панелі, переглядайте адаптивні breakpoint-и та експортуйте у React/TSX.",
6558
+ "tutorial.gameEditor.intro.title": "Редактор гри",
6559
+ "tutorial.gameEditor.intro.content": "Будуйте сцену у вікні перегляду за допомогою панелей ієрархії та ресурсів, налаштовуйте сутності в інспекторі та зберігайте проєкт.",
6560
+ "tutorial.levelEditor.intro.title": "Редактор рівнів",
6561
+ "tutorial.levelEditor.intro.content": "Будуйте ігровий світ: розміщуйте та прив’язуйте об’єкти за шарами, малюйте ландшафт, розставляйте сплайни й світло, а потім запікайте карти освітлення.",
6562
+ "tutorial.gameMaterialEditor.intro.title": "Редактор матеріалів",
6563
+ "tutorial.gameMaterialEditor.intro.content": "Створіть шейдер як граф вузлів: додавайте та з’єднуйте вузли шейдера, редагуйте їхні властивості та компілюйте матеріал.",
6564
+ "tutorial.gameParticleEditor.intro.title": "Редактор частинок",
6565
+ "tutorial.gameParticleEditor.intro.content": "Налаштуйте систему частинок в інспекторі — емітер, час життя, криві та рендеринг — і відтворюйте, призупиняйте чи перезапускайте перегляд наживо.",
6566
+ "tutorial.floorPlanEditor.intro.title": "Редактор планів приміщень",
6567
+ "tutorial.floorPlanEditor.intro.content": "Малюйте кімнати та зони інструментами, розміщуйте пристрої на плані, перемикайте поверхи та вмикайте накладки, як-от розміри, сітку й заповненість.",
6568
+ "tutorial.buildingSceneEditor.intro.title": "Редактор сцен",
6569
+ "tutorial.buildingSceneEditor.intro.content": "Створюйте сцени, що налаштовують кілька пристроїв одночасно: виберіть сцену, задайте цільові стани пристроїв, а потім збережіть чи активуйте її.",
6570
+ "tutorial.buildingAutomationEditor.intro.title": "Редактор автоматизації",
6571
+ "tutorial.buildingAutomationEditor.intro.content": "Створюйте автоматизації будівлі: виберіть одну зі списку, визначте її тригери, умови та дії, а потім збережіть, увімкніть чи видаліть її.",
6572
+ "tutorial.spatialEditor.intro.title": "Просторовий редактор",
6573
+ "tutorial.spatialEditor.intro.content": "Проєктуйте плани в різних режимах: малюйте стіни, кімнати й об’єкти інструментами, керуйте шарами, прив’язуйте до сітки, а потім експортуйте.",
6574
+ "tutorial.decisionTreeEditor.intro.title": "Редактор дерева рішень",
6575
+ "tutorial.decisionTreeEditor.intro.content": "Досліджуйте дерево рішень: клацайте вузли, щоб переглянути умови й результати, вмикайте метрики, ймовірності та вибірки й підсвічуйте шлях для заданого входу.",
6576
+ "tutorial.diagramEditor.intro.title": "Редактор діаграм",
6577
+ "tutorial.diagramEditor.intro.content": "Виберіть інструмент, щоб додавати та з’єднувати вузли на полотні, редагуйте їх на панелі властивостей та експортуйте діаграму з панелі інструментів.",
6578
+ "tutorial.contractEditor.intro.title": "Редактор договорів",
6579
+ "tutorial.contractEditor.intro.content": "Складайте договір із бібліотеки пунктів, заповнюйте змінні шаблону, відстежуйте версії та погодження, а потім зберігайте чи експортуйте у PDF/DOCX/HTML.",
6580
+ "tutorial.invoiceDesigner.intro.title": "Дизайнер рахунків",
6581
+ "tutorial.invoiceDesigner.intro.content": "Перетягуйте елементи на полотно рахунка, прив’язуйте їх до полів даних, вирівнюйте за сіткою та лінійками, а потім зберігайте чи експортуйте у PDF.",
6582
+ "tutorial.presentationEditor.intro.title": "Редактор презентацій",
6583
+ "tutorial.presentationEditor.intro.content": "Створюйте слайди зі стрічки мініатюр, додавайте та впорядковуйте елементи на полотні, редагуйте їх на панелі властивостей, а потім демонструйте чи експортуйте.",
6584
+ "tutorial.dashboardStudio.intro.title": "Студія дашбордів",
6585
+ "tutorial.dashboardStudio.intro.content": "Перетягуйте віджети з палітри на сітку, прив’язуйте їх до джерел даних, додавайте фільтри, а потім перемикайте «Редагування/Перегляд», оновлюйте та зберігайте.",
6586
+ "tutorial.biReportBuilder.intro.title": "Конструктор звітів",
6587
+ "tutorial.biReportBuilder.intro.content": "Перетягуйте елементи з палітри у звіт, прив’язуйте їх до джерел даних, перемикайтеся між дизайном/переглядом та експортуйте у PDF або Excel.",
6588
+ "tutorial.etlBuilder.intro.title": "Конструктор ETL",
6589
+ "tutorial.etlBuilder.intro.content": "З’єднайте джерела → перетворення → призначення в конвеєр, перемикайте подання, а потім запустіть його та збережіть конфігурацію.",
6590
+ "tutorial.videoEditorPro.intro.title": "Відеоредактор",
6591
+ "tutorial.videoEditorPro.intro.content": "Додавайте медіа на таймлайн, упорядковуйте та обрізайте кліпи, застосовуйте ефекти й переходи, а потім налаштуйте та запустіть експорт.",
6592
+ "tutorial.mlStudio.intro.title": "Студія ML",
6593
+ "tutorial.mlStudio.intro.content": "Проходьте по вкладках: готуйте набори даних, запускайте експерименти, порівнюйте та обирайте моделі, а потім розгортайте найкращу.",
6594
+ "tutorial.mathEditor.intro.title": "Математичний редактор",
6595
+ "tutorial.mathEditor.intro.content": "Пишіть рівняння у LaTeX або вставляйте символи з палітри; перемикайтеся на рукописне введення та переглядайте відрендерену формулу наживо.",
6596
+ "tutorial.dmxEditor.intro.title": "Редактор DMX",
6597
+ "tutorial.dmxEditor.intro.content": "Виберіть пристрій FTDI та порт, а потім задавайте значення кожного каналу DMX повзунками, щоб керувати освітлювальними приладами наживо.",
6598
+ "nav.help": "Довідка",
6599
+ "navShell.home.title": "Головна",
6600
+ "navShell.help.next": "Далі",
6601
+ "navShell.help.back": "Назад",
6602
+ "navShell.help.finish": "Завершити",
6603
+ "navShell.help.skip": "Пропустити",
6604
+ "navShell.help.stepOf": "з",
6605
+ "navShell.help.topNav.title": "Верхня навігація",
6606
+ "navShell.help.topNav.body": "Використовуйте верхню панель, щоб перемикати робочі простори, шукати, змінювати тему чи мову та відкривати сповіщення.",
6607
+ "navShell.help.sidebar.title": "Бічна панель",
6608
+ "navShell.help.sidebar.body": "Переглядайте доступні подання, згруповані за розділами. Виберіть подання, щоб відкрити його в новій вкладці.",
6609
+ "navShell.help.tabs.title": "Вкладки",
6610
+ "navShell.help.tabs.body": "Кожне відкрите подання живе в окремій вкладці. Закріплюйте часто використовувані та клацайте правою кнопкою для додаткових дій.",
6611
+ "navShell.help.content.title": "Робочий простір",
6612
+ "navShell.help.content.body": "Головна область показує активне подання. Перемикання вкладок або записів бічної панелі змінює вміст тут.",
6613
+ "navShell.home.subtitle": "Продовжте з того місця, де зупинилися.",
6614
+ "navShell.home.empty": "Відкрийте подання з бічної панелі або вкладок угорі, щоб заповнити робочий простір.",
6615
+ "navShell.home.greeting.morning": "Доброго ранку",
6616
+ "navShell.home.greeting.afternoon": "Доброго дня",
6617
+ "navShell.home.greeting.evening": "Доброго вечора",
6618
+ "navShell.home.greeting.night": "Вітаємо",
6619
+ "navShell.home.sections.openTabs": "Зараз відкрито",
6620
+ "navShell.home.sections.shortcuts": "Ваші ярлики",
6621
+ "navShell.home.sections.allViews": "Усі подання",
6622
+ "sidebar.menu.open": "Відкрити",
6623
+ "sidebar.menu.openNewTab": "Відкрити в новій вкладці",
6624
+ "sidebar.menu.openBrowserTab": "Відкрити в новій вкладці браузера",
6625
+ "sidebar.menu.pinFavorite": "Додати до обраного",
6626
+ "sidebar.menu.unpinFavorite": "Прибрати з обраного",
6627
+ "sidebar.menu.hide": "Сховати",
6628
+ "sidebar.menu.copyLink": "Скопіювати посилання",
6629
+ "sidebar.menu.pinSource": "Закріпити джерело",
6630
+ "sidebar.menu.unpinSource": "Відкріпити джерело",
6631
+ "sidebar.menu.hideSource": "Сховати джерело",
6632
+ "sidebar.prefs.general": "Загальні",
6633
+ "sidebar.prefs.display": "Відображення",
6634
+ "sidebar.prefs.order": "Порядок",
6635
+ "sidebar.prefs.hidden": "Приховані елементи",
6636
+ "sidebar.prefs.reset": "Скинути",
6637
+ "sidebar.prefs.general.title": "Загальні",
6638
+ "sidebar.prefs.general.desc": "Поведінка дерева бічної панелі та що робить лівий клік.",
6639
+ "sidebar.prefs.general.autoExpand": "Автоматично розгортати всі гілки",
6640
+ "sidebar.prefs.general.autoExpandHint": "Коли вимкнено, гілки спочатку згорнуті та запам’ятовують останній стан для сеансу.",
6641
+ "sidebar.prefs.general.leftClickBehavior": "Поведінка лівого кліку",
6642
+ "sidebar.prefs.general.focusExisting": "Перейти до наявної вкладки",
6643
+ "sidebar.prefs.general.openNew": "Завжди відкривати в новій вкладці",
6644
+ "sidebar.prefs.general.leftClickHint": "Правий клік → «Відкрити в новій вкладці» завжди доступний, незалежно від цього налаштування.",
6645
+ "sidebar.prefs.display.title": "Відображення",
6646
+ "sidebar.prefs.display.desc": "Які режими з’являються в смузі та наскільки глибоко сягає дерево в кожному режимі.",
6647
+ "sidebar.prefs.display.enableModeIcons": "Показувати іконки перемикача режимів",
6648
+ "sidebar.prefs.display.enabledModes": "Видимі режими",
6649
+ "sidebar.prefs.display.preferencesAlwaysOn": "«Налаштування» показуються завжди.",
6650
+ "sidebar.prefs.display.maxDepth": "Глибина дерева для кожного режиму",
6651
+ "sidebar.prefs.order.title": "Упорядкувати елементи",
6652
+ "sidebar.prefs.order.desc": "Перетягуйте елементи, щоб змінити порядок їх відображення у вибраному режимі.",
6653
+ "sidebar.prefs.order.pickMode": "Режим",
6654
+ "sidebar.prefs.order.visibilityHint": "Порядок застосовується до елементів верхнього рівня в кожній групі джерела. Згорніть заголовок джерела, щоб під час перевірки зміни бачити лише елементи верхнього рівня.",
6655
+ "sidebar.prefs.order.empty": "У цьому режимі немає елементів для впорядкування.",
6656
+ "sidebar.prefs.order.resetMode": "Скинути до типового порядку",
6657
+ "sidebar.prefs.hidden.title": "Приховані елементи",
6658
+ "sidebar.prefs.hidden.desc": "Елементи, які ви сховали з дерева. Відновіть їх, щоб повернути.",
6659
+ "sidebar.prefs.hidden.empty": "Поки нічого не приховано.",
6660
+ "sidebar.prefs.hidden.restore": "Відновити",
6661
+ "sidebar.prefs.reset.title": "Скинути",
6662
+ "sidebar.prefs.reset.desc": "Очистити всі налаштування та відновити початковий вигляд бічної панелі.",
6663
+ "sidebar.prefs.reset.button": "Скинути всі налаштування",
6664
+ "sidebar.prefs.reset.confirm": "Це зітре ваше обране, приховані елементи, власний порядок та всі інші налаштування бічної панелі. Цю дію не можна скасувати.",
6665
+ "sidebar.prefs.reset.confirmYes": "Так, скинути все",
6666
+ "sidebar.prefs.reset.cancel": "Скасувати",
6667
+ "noCode.title": "Студія No-Code",
6668
+ "noCode.description": "Створюйте застосунки візуально",
6669
+ "noCode.newProject": "Новий проєкт",
6670
+ "noCode.openProject": "Відкрити проєкт",
6671
+ "noCode.saveProject": "Зберегти проєкт",
6672
+ "noCode.exportProject": "Експортувати проєкт",
6673
+ "noCode.importProject": "Імпортувати проєкт",
6674
+ "noCode.projectName": "Назва проєкту",
6675
+ "noCode.projectSettings": "Налаштування проєкту",
6676
+ "noCode.recentProjects": "Останні проєкти",
6677
+ "noCode.templates": "Шаблони",
6678
+ "noCode.preview": "Перегляд",
6679
+ "noCode.codeView": "Перегляд коду",
6680
+ "noCode.splitView": "Розділений перегляд",
6681
+ "noCode.visualView": "Візуальний перегляд",
6682
+ "noCode.generate": "Згенерувати код",
6683
+ "noCode.deploy": "Розгорнути",
6684
+ "noCode.componentDesigner.title": "Дизайнер компонентів",
6685
+ "noCode.componentDesigner.newComponent": "Новий компонент",
6686
+ "noCode.componentDesigner.componentName": "Назва компонента",
6687
+ "noCode.componentDesigner.addProp": "Додати prop",
6688
+ "noCode.componentDesigner.editProp": "Редагувати prop",
6689
+ "noCode.componentDesigner.deleteProp": "Видалити prop",
6690
+ "noCode.componentDesigner.propName": "Назва prop",
6691
+ "noCode.componentDesigner.propType": "Тип prop",
6692
+ "noCode.componentDesigner.propRequired": "Обов’язкова",
6693
+ "noCode.componentDesigner.propDefault": "Значення за замовчуванням",
6694
+ "noCode.componentDesigner.addState": "Додати стан",
6695
+ "noCode.componentDesigner.stateName": "Назва стану",
6696
+ "noCode.componentDesigner.stateType": "Тип стану",
6697
+ "noCode.componentDesigner.stateDefault": "Початкове значення",
6698
+ "noCode.componentDesigner.addHook": "Додати hook",
6699
+ "noCode.componentDesigner.hooks": "Hooks",
6700
+ "noCode.componentDesigner.template": "Шаблон",
6701
+ "noCode.componentDesigner.styles": "Стилі",
6702
+ "noCode.componentDesigner.events": "Події",
6703
+ "noCode.componentDesigner.palette": "Палітра компонентів",
6704
+ "noCode.componentDesigner.dragDrop": "Перетягніть компоненти сюди",
6705
+ "noCode.pageBuilder.title": "Конструктор сторінок",
6706
+ "noCode.pageBuilder.newPage": "Нова сторінка",
6707
+ "noCode.pageBuilder.pageName": "Назва сторінки",
6708
+ "noCode.pageBuilder.pageRoute": "Шлях маршруту",
6709
+ "noCode.pageBuilder.addSection": "Додати розділ",
6710
+ "noCode.pageBuilder.editSection": "Редагувати розділ",
6711
+ "noCode.pageBuilder.deleteSection": "Видалити розділ",
6712
+ "noCode.pageBuilder.sectionLayout": "Макет розділу",
6713
+ "noCode.pageBuilder.columns": "Стовпці",
6714
+ "noCode.pageBuilder.responsive": "Адаптивний",
6715
+ "noCode.pageBuilder.mobile": "Мобільний",
6716
+ "noCode.pageBuilder.tablet": "Планшет",
6717
+ "noCode.pageBuilder.desktop": "Комп’ютер",
6718
+ "noCode.pageBuilder.showGrid": "Показати сітку",
6719
+ "noCode.pageBuilder.hideGrid": "Сховати сітку",
6720
+ "noCode.pageBuilder.metadata": "Метадані сторінки",
6721
+ "noCode.pageBuilder.seo": "Налаштування SEO",
6722
+ "noCode.stateDesigner.title": "Дизайнер стану",
6723
+ "noCode.stateDesigner.newStore": "Нове сховище",
6724
+ "noCode.stateDesigner.storeName": "Назва сховища",
6725
+ "noCode.stateDesigner.storeType": "Тип сховища",
6726
+ "noCode.stateDesigner.addState": "Додати поле стану",
6727
+ "noCode.stateDesigner.addAction": "Додати дію",
6728
+ "noCode.stateDesigner.editAction": "Редагувати дію",
6729
+ "noCode.stateDesigner.deleteAction": "Видалити дію",
6730
+ "noCode.stateDesigner.actionName": "Назва дії",
6731
+ "noCode.stateDesigner.actionParams": "Параметри",
6732
+ "noCode.stateDesigner.actionBody": "Тіло дії",
6733
+ "noCode.stateDesigner.asyncAction": "Асинхронна дія",
6734
+ "noCode.stateDesigner.addSelector": "Додати селектор",
6735
+ "noCode.stateDesigner.selectorName": "Назва селектора",
6736
+ "noCode.stateDesigner.selectorBody": "Логіка селектора",
6737
+ "noCode.stateDesigner.persistence": "Збереження",
6738
+ "noCode.stateDesigner.devtools": "DevTools",
6739
+ "noCode.apiFlow.title": "Дизайнер потоків API",
6740
+ "noCode.apiFlow.newEndpoint": "Новий endpoint",
6741
+ "noCode.apiFlow.endpointUrl": "URL endpoint-а",
6742
+ "noCode.apiFlow.method": "HTTP-метод",
6743
+ "noCode.apiFlow.headers": "Заголовки",
6744
+ "noCode.apiFlow.body": "Тіло запиту",
6745
+ "noCode.apiFlow.response": "Відповідь",
6746
+ "noCode.apiFlow.auth": "Автентифікація",
6747
+ "noCode.apiFlow.authType": "Тип автентифікації",
6748
+ "noCode.apiFlow.bearerToken": "Bearer-токен",
6749
+ "noCode.apiFlow.apiKey": "Ключ API",
6750
+ "noCode.apiFlow.testEndpoint": "Тестувати endpoint",
6751
+ "noCode.apiFlow.mockResponse": "Імітована відповідь",
6752
+ "noCode.apiFlow.errorHandling": "Обробка помилок",
6753
+ "noCode.apiFlow.retry": "Політика повторів",
6754
+ "noCode.apiFlow.cache": "Кешування",
6755
+ "noCode.dataMapper.title": "Маппер даних",
6756
+ "noCode.dataMapper.sourceSchema": "Схема джерела",
6757
+ "noCode.dataMapper.targetSchema": "Схема призначення",
6758
+ "noCode.dataMapper.addMapping": "Додати зіставлення",
6759
+ "noCode.dataMapper.editMapping": "Редагувати зіставлення",
6760
+ "noCode.dataMapper.deleteMapping": "Видалити зіставлення",
6761
+ "noCode.dataMapper.sourceField": "Поле джерела",
6762
+ "noCode.dataMapper.targetField": "Поле призначення",
6763
+ "noCode.dataMapper.transform": "Перетворення",
6764
+ "noCode.dataMapper.validation": "Перевірка",
6765
+ "noCode.dataMapper.testData": "Тестові дані",
6766
+ "noCode.dataMapper.preview": "Переглянути результат",
6767
+ "noCode.dataMapper.autoMap": "Автозіставлення",
6768
+ "noCode.eventOrchestrator.title": "Оркестратор подій",
6769
+ "noCode.eventOrchestrator.newFlow": "Новий потік подій",
6770
+ "noCode.eventOrchestrator.flowName": "Назва потоку",
6771
+ "noCode.eventOrchestrator.trigger": "Тригер",
6772
+ "noCode.eventOrchestrator.triggerType": "Тип тригера",
6773
+ "noCode.eventOrchestrator.addHandler": "Додати обробник",
6774
+ "noCode.eventOrchestrator.editHandler": "Редагувати обробник",
6775
+ "noCode.eventOrchestrator.deleteHandler": "Видалити обробник",
6776
+ "noCode.eventOrchestrator.handlerName": "Назва обробника",
6777
+ "noCode.eventOrchestrator.debounce": "Debounce",
6778
+ "noCode.eventOrchestrator.throttle": "Throttle",
6779
+ "noCode.eventOrchestrator.delay": "Затримка",
6780
+ "noCode.eventOrchestrator.condition": "Умова",
6781
+ "noCode.eventOrchestrator.chain": "Ланцюжок подій",
6782
+ "noCode.testBuilder.title": "Конструктор тестів",
6783
+ "noCode.testBuilder.newTest": "Новий тест",
6784
+ "noCode.testBuilder.testName": "Назва тесту",
6785
+ "noCode.testBuilder.testDescription": "Опис",
6786
+ "noCode.testBuilder.addScenario": "Додати сценарій",
6787
+ "noCode.testBuilder.editScenario": "Редагувати сценарій",
6788
+ "noCode.testBuilder.deleteScenario": "Видалити сценарій",
6789
+ "noCode.testBuilder.addAssertion": "Додати перевірку",
6790
+ "noCode.testBuilder.assertionType": "Тип перевірки",
6791
+ "noCode.testBuilder.expected": "Очікуване значення",
6792
+ "noCode.testBuilder.actual": "Фактичне значення",
6793
+ "noCode.testBuilder.mock": "Налаштування mock",
6794
+ "noCode.testBuilder.runTests": "Запустити тести",
6795
+ "noCode.testBuilder.testsPassed": "Тести пройдено",
6796
+ "noCode.testBuilder.testsFailed": "Тести не пройдено",
6797
+ "noCode.testBuilder.coverage": "Покриття",
6798
+ "noCode.testBuilder.accessibility": "Перевірка доступності",
6799
+ "noCode.codeTemplate.title": "Шаблони коду",
6800
+ "noCode.codeTemplate.newTemplate": "Новий шаблон",
6801
+ "noCode.codeTemplate.templateName": "Назва шаблону",
6802
+ "noCode.codeTemplate.templateEngine": "Рушій шаблонів",
6803
+ "noCode.codeTemplate.variables": "Змінні",
6804
+ "noCode.codeTemplate.addVariable": "Додати змінну",
6805
+ "noCode.codeTemplate.variableName": "Назва змінної",
6806
+ "noCode.codeTemplate.variableType": "Тип змінної",
6807
+ "noCode.codeTemplate.variableDefault": "Значення за замовчуванням",
6808
+ "noCode.codeTemplate.generateFiles": "Згенерувати файли",
6809
+ "noCode.codeTemplate.outputPath": "Шлях виводу",
6810
+ "noCode.codeTemplate.presets": "Пресети",
6811
+ "noCode.codeTemplate.presetReact": "Компонент React",
6812
+ "noCode.codeTemplate.presetNextPage": "Сторінка Next.js",
6813
+ "noCode.codeTemplate.presetHook": "Власний hook",
6814
+ "noCode.codeTemplate.presetStore": "Модуль сховища",
6815
+ "noCode.codePreview.title": "Перегляд коду",
6816
+ "noCode.codePreview.showDiff": "Показати відмінності",
6817
+ "noCode.codePreview.hideDiff": "Сховати відмінності",
6818
+ "noCode.codePreview.copyCode": "Скопіювати код",
6819
+ "noCode.codePreview.downloadCode": "Завантажити код",
6820
+ "noCode.codePreview.importCode": "Імпортувати код",
6821
+ "noCode.codePreview.language": "Мова",
6822
+ "noCode.codePreview.format": "Форматувати код",
6823
+ "noCode.codePreview.linesChanged": "Змінені рядки",
6824
+ "noCode.codePreview.noChanges": "Без змін",
6825
+ "vectorEditor.menu.file": "Файл",
6826
+ "vectorEditor.menu.edit": "Редагувати",
6827
+ "vectorEditor.menu.object": "Об’єкт",
6828
+ "vectorEditor.menu.path": "Контур",
6829
+ "vectorEditor.menu.view": "Вигляд",
6830
+ "vectorEditor.menu.newCanvas": "Нове полотно",
6831
+ "vectorEditor.menu.openSvg": "Відкрити SVG…",
6832
+ "vectorEditor.menu.pasteSvg": "Вставити SVG…",
6833
+ "vectorEditor.menu.exportSvg": "Експортувати SVG",
6834
+ "vectorEditor.menu.exportPng": "Експортувати PNG",
6835
+ "vectorEditor.menu.exportJpg": "Експортувати JPG",
6836
+ "vectorEditor.menu.exportWebp": "Експортувати WebP",
6837
+ "vectorEditor.menu.exportBmp": "Експортувати BMP",
6838
+ "vectorEditor.menu.saveToLibrary": "📦 Зберегти в бібліотеку",
6839
+ "vectorEditor.menu.exportIconSnippet": "📋 Експортувати фрагмент іконки",
6840
+ "vectorEditor.menu.exportIcon": "📋 Експортувати іконку",
6841
+ "vectorEditor.menu.undo": "Скасувати (Ctrl+Z)",
6842
+ "vectorEditor.menu.redo": "Повторити (Ctrl+Y)",
6843
+ "vectorEditor.menu.copy": "Копіювати (Ctrl+C)",
6844
+ "vectorEditor.menu.paste": "Вставити (Ctrl+V)",
6845
+ "vectorEditor.menu.duplicate": "Дублювати (Ctrl+D)",
6846
+ "vectorEditor.menu.delete": "Видалити (Del)",
6847
+ "vectorEditor.menu.bringToFront": "На передній план",
6848
+ "vectorEditor.menu.sendToBack": "На задній план",
6849
+ "vectorEditor.menu.flipH": "Віддзеркалити горизонтально",
6850
+ "vectorEditor.menu.flipV": "Віддзеркалити вертикально",
6851
+ "vectorEditor.menu.alignLeft": "Вирівняти ліворуч",
6852
+ "vectorEditor.menu.alignCenter": "Вирівняти по центру",
6853
+ "vectorEditor.menu.alignRight": "Вирівняти праворуч",
6854
+ "vectorEditor.menu.union": "Об’єднання (∪)",
6855
+ "vectorEditor.menu.subtract": "Віднімання (−)",
6856
+ "vectorEditor.menu.intersect": "Перетин (∩)",
6857
+ "vectorEditor.menu.exclude": "Виключення (⊕)",
6858
+ "vectorEditor.menu.outlineStroke": "Контур обведення",
6859
+ "vectorEditor.menu.snapToGrid": "Прив’язати до сітки",
6860
+ "vectorEditor.menu.snap": "Прив’язка",
6861
+ "vectorEditor.menu.secondShape": "2-га фігура",
6862
+ "vectorEditor.tabs.properties": "Властивості",
6863
+ "vectorEditor.tabs.layers": "Шари",
6864
+ "vectorEditor.tabs.library": "Бібліотека",
6865
+ "vectorEditor.tabs.timeline": "Таймлайн",
6866
+ "vectorEditor.timeline.preset": "Пресет",
6867
+ "vectorEditor.timeline.duration": "Тривалість (мс)",
6868
+ "vectorEditor.timeline.repeat": "Повтор",
6869
+ "vectorEditor.timeline.direction": "Напрямок",
6870
+ "vectorEditor.timeline.remove": "Видалити анімацію",
6871
+ "vectorEditor.timeline.play": "Відтворити",
6872
+ "vectorEditor.timeline.pause": "Пауза",
6873
+ "vectorEditor.timeline.stop": "Зупинити",
6874
+ "vectorEditor.timeline.copyCss": "Скопіювати CSS",
6875
+ "vectorEditor.timeline.keyframes": "Ключові кадри",
6876
+ "vectorEditor.timeline.addKeyframe": "+ Додати ключовий кадр",
6877
+ "vectorEditor.timeline.noSelection": "Виберіть фігуру для анімації.",
6878
+ "vectorEditor.timeline.animationTitle": "Анімація",
6879
+ "vectorEditor.timeline.playbackTitle": "Відтворення",
6880
+ "vectorEditor.timeline.attachHint": "Виберіть фігуру, щоб додати анімацію.",
6881
+ "vectorEditor.timeline.playLabel": "▶ Відтворити",
6882
+ "vectorEditor.timeline.pauseLabel": "⏸ Пауза",
6883
+ "vectorEditor.timeline.stopLabel": "⏹ Зупинити",
6884
+ "vectorEditor.timeline.copyCssKeyframes": "📋 Скопіювати CSS keyframes",
6885
+ "vectorEditor.timeline.tLabel": "t",
6886
+ "vectorEditor.layers.empty": "Поки немає шарів. Використовуйте інструменти для малювання або вставте з вкладки «Бібліотека».",
6887
+ "vectorEditor.layers.moveUp": "Підняти",
6888
+ "vectorEditor.layers.moveDown": "Опустити",
6889
+ "vectorEditor.library.passProp": "Передайте prop library у NiceVectorEditor, щоб заповнити цю вкладку іконками для вставлення.",
6890
+ "vectorEditor.statusBar.zoom": "Масштаб",
6891
+ "vectorEditor.statusBar.shapes": "фігур(и)",
6892
+ "vectorEditor.statusBar.selected": "Вибрано",
6893
+ "vectorEditor.statusBar.snap": "Прив’язка",
6894
+ "vectorEditor.library.empty": "У бібліотеці немає іконок.",
6895
+ "vectorEditor.snippet.title": "✅ Фрагмент іконки скопійовано в буфер обміну",
6896
+ "vectorEditor.snippet.pasteHint": "Вставити в",
6897
+ "vectorEditor.snippet.copyAgain": "Скопіювати ще раз",
6898
+ "vectorEditor.snippet.close": "Закрити",
6899
+ "vectorEditor.properties.appearance": "Вигляд",
6900
+ "vectorEditor.properties.fill": "Заливка",
6901
+ "vectorEditor.properties.solid": "Суцільний",
6902
+ "vectorEditor.properties.gradient": "Градієнт",
6903
+ "vectorEditor.properties.hideEditor": "▼ Сховати редактор",
6904
+ "vectorEditor.properties.editGradient": "► Редагувати градієнт",
6905
+ "vectorEditor.properties.type": "Тип",
6906
+ "vectorEditor.properties.linear": "Лінійний",
6907
+ "vectorEditor.properties.radial": "Радіальний",
6908
+ "vectorEditor.properties.angle": "Кут",
6909
+ "vectorEditor.properties.cx": "CX",
6910
+ "vectorEditor.properties.cy": "CY",
6911
+ "vectorEditor.properties.r": "R",
6912
+ "vectorEditor.properties.colorStops": "Точки кольору:",
6913
+ "vectorEditor.properties.addStop": "+ Додати точку",
6914
+ "vectorEditor.properties.removeStop": "- Видалити",
6915
+ "vectorEditor.properties.stroke": "Обведення",
6916
+ "vectorEditor.properties.width": "Товщина",
6917
+ "vectorEditor.properties.opacity": "Прозорість",
6918
+ "vectorEditor.properties.rotation": "Обертання",
6919
+ "vectorEditor.properties.toolOptions": "Параметри інструмента",
6920
+ "vectorEditor.properties.radius": "Радіус",
6921
+ "vectorEditor.properties.sides": "Сторони",
6922
+ "vectorEditor.properties.points": "Точки",
6923
+ "vectorEditor.properties.innerR": "Внутрішній R",
6924
+ "vectorEditor.properties.size": "Розмір",
6925
+ "vectorEditor.properties.font": "Шрифт",
6926
+ "vectorEditor.properties.grid": "Сітка",
6927
+ "vectorEditor.properties.transform": "Перетворення",
6928
+ "vectorEditor.properties.x": "X",
6929
+ "vectorEditor.properties.y": "Y",
6930
+ "vectorEditor.properties.w": "Ш",
6931
+ "vectorEditor.properties.h": "В",
6932
+ "vectorEditor.layers.title": "Шари",
6933
+ "vectorEditor.layers.show": "Показати",
6934
+ "vectorEditor.layers.hide": "Сховати",
6935
+ "vectorEditor.layers.lock": "Заблокувати",
6936
+ "vectorEditor.layers.unlock": "Розблокувати"
5046
6937
  }, Ie = {
5047
6938
  ok: "OK",
5048
6939
  cancel: "キャンセル",
@@ -5406,7 +7297,7 @@ const j = [
5406
7297
  "wm.minimizeAll": "すべて最小化",
5407
7298
  "wm.newWindow": "新しいウィンドウ",
5408
7299
  "wm.moveToFront": "最前面に移動"
5409
- }, We = {
7300
+ }, Ve = {
5410
7301
  ok: "확인",
5411
7302
  cancel: "취소",
5412
7303
  save: "저장",
@@ -5769,7 +7660,7 @@ const j = [
5769
7660
  "wm.minimizeAll": "모두 최소화",
5770
7661
  "wm.newWindow": "새 창",
5771
7662
  "wm.moveToFront": "맨 앞으로"
5772
- }, Ve = {
7663
+ }, He = {
5773
7664
  ok: "确定",
5774
7665
  cancel: "取消",
5775
7666
  save: "保存",
@@ -6132,7 +8023,7 @@ const j = [
6132
8023
  "wm.minimizeAll": "最小化全部",
6133
8024
  "wm.newWindow": "新建窗口",
6134
8025
  "wm.moveToFront": "置于最前"
6135
- }, Ue = {
8026
+ }, qe = {
6136
8027
  ok: "حسناً",
6137
8028
  cancel: "إلغاء",
6138
8029
  save: "حفظ",
@@ -6495,7 +8386,7 @@ const j = [
6495
8386
  "wm.minimizeAll": "تصغير الكل",
6496
8387
  "wm.newWindow": "نافذة جديدة",
6497
8388
  "wm.moveToFront": "نقل إلى الأمام"
6498
- }, He = {
8389
+ }, We = {
6499
8390
  ok: "ठीक है",
6500
8391
  cancel: "रद्द करें",
6501
8392
  save: "सहेजें",
@@ -6506,7 +8397,7 @@ const j = [
6506
8397
  error: "त्रुटि",
6507
8398
  success: "सफलता",
6508
8399
  search: "खोजें"
6509
- }, Ke = {
8400
+ }, Ue = {
6510
8401
  ok: "ঠিক আছে",
6511
8402
  cancel: "বাতিল",
6512
8403
  save: "সংরক্ষণ",
@@ -6517,7 +8408,7 @@ const j = [
6517
8408
  error: "ত্রুটি",
6518
8409
  success: "সফল",
6519
8410
  search: "অনুসন্ধান"
6520
- }, Ze = {
8411
+ }, Ke = {
6521
8412
  ok: "ตกลง",
6522
8413
  cancel: "ยกเลิก",
6523
8414
  save: "บันทึก",
@@ -6528,7 +8419,7 @@ const j = [
6528
8419
  error: "ข้อผิดพลาด",
6529
8420
  success: "สำเร็จ",
6530
8421
  search: "ค้นหา"
6531
- }, qe = {
8422
+ }, Ge = {
6532
8423
  ok: "OK",
6533
8424
  cancel: "Hủy",
6534
8425
  save: "Lưu",
@@ -6539,7 +8430,7 @@ const j = [
6539
8430
  error: "Lỗi",
6540
8431
  success: "Thành công",
6541
8432
  search: "Tìm kiếm"
6542
- }, Ge = {
8433
+ }, Ze = {
6543
8434
  ok: "OK",
6544
8435
  cancel: "Batal",
6545
8436
  save: "Simpan",
@@ -6561,7 +8452,7 @@ const j = [
6561
8452
  error: "Hitilafu",
6562
8453
  success: "Imefanikiwa",
6563
8454
  search: "Tafuta"
6564
- }, Ye = {
8455
+ }, Xe = {
6565
8456
  ok: "OK",
6566
8457
  cancel: "Kanselahin",
6567
8458
  save: "I-save",
@@ -6572,7 +8463,7 @@ const j = [
6572
8463
  error: "Error",
6573
8464
  success: "Tagumpay",
6574
8465
  search: "Maghanap"
6575
- }, $e = {
8466
+ }, Ye = {
6576
8467
  ok: "OK",
6577
8468
  cancel: "Batal",
6578
8469
  save: "Simpan",
@@ -6583,38 +8474,38 @@ const j = [
6583
8474
  error: "Ralat",
6584
8475
  success: "Berjaya",
6585
8476
  search: "Cari"
6586
- }, k = {
6587
- en: ye,
6588
- pl: Ee,
6589
- de: Ce,
6590
- fr: Se,
6591
- es: ze,
8477
+ }, w = {
8478
+ en: ke,
8479
+ pl: ye,
8480
+ de: ze,
8481
+ fr: Ce,
8482
+ es: Se,
6592
8483
  it: De,
6593
- pt: Ae,
6594
- nl: xe,
6595
- sv: Te,
6596
- no: Pe,
6597
- da: je,
6598
- fi: Ne,
6599
- cs: Fe,
6600
- sk: Me,
6601
- hu: Oe,
8484
+ pt: je,
8485
+ nl: Ae,
8486
+ sv: Pe,
8487
+ no: Te,
8488
+ da: xe,
8489
+ fi: Be,
8490
+ cs: Me,
8491
+ sk: Fe,
8492
+ hu: Ne,
6602
8493
  ro: Re,
6603
8494
  bg: Le,
6604
- uk: Be,
8495
+ uk: Oe,
6605
8496
  ja: Ie,
6606
- ko: We,
6607
- zh: Ve,
6608
- ar: Ue,
6609
- hi: He,
6610
- bn: Ke,
6611
- th: Ze,
6612
- vi: qe,
6613
- id: Ge,
8497
+ ko: Ve,
8498
+ zh: He,
8499
+ ar: qe,
8500
+ hi: We,
8501
+ bn: Ue,
8502
+ th: Ke,
8503
+ vi: Ge,
8504
+ id: Ze,
6614
8505
  sw: Je,
6615
- fil: Ye,
6616
- ms: $e
6617
- }, Y = {
8506
+ fil: Xe,
8507
+ ms: Ye
8508
+ }, X = {
6618
8509
  save: "Zapisz",
6619
8510
  cancel: "Anuluj",
6620
8511
  ok: "OK",
@@ -6638,7 +8529,7 @@ const j = [
6638
8529
  "form.invalidValue": "Proszę podać prawidłową wartość.",
6639
8530
  "auth.signIn": "Proszę się zalogować",
6640
8531
  "auth.signOut": "Proszę się wylogować"
6641
- }, $ = {
8532
+ }, Y = {
6642
8533
  save: "Zapisz",
6643
8534
  cancel: "Anuluj",
6644
8535
  ok: "OK",
@@ -6662,62 +8553,62 @@ const j = [
6662
8553
  "form.invalidValue": "Wpisz prawidłową wartość.",
6663
8554
  "auth.signIn": "Zaloguj się",
6664
8555
  "auth.signOut": "Wyloguj się"
6665
- }, _e = {
6666
- "pl-PL": { formal: Y, informal: $ },
6667
- pl: { formal: Y, informal: $ }
8556
+ }, $e = {
8557
+ "pl-PL": { formal: X, informal: Y },
8558
+ pl: { formal: X, informal: Y }
6668
8559
  };
6669
- function qo(e) {
6670
- var o;
6671
- return { ...k.pl, ...((o = _e.pl) == null ? void 0 : o[e]) ?? {} };
8560
+ function Kt(e) {
8561
+ var t;
8562
+ return { ...w.pl, ...((t = $e.pl) == null ? void 0 : t[e]) ?? {} };
6672
8563
  }
6673
- const Qe = (e, o) => o, oe = I(Qe), Go = ({
8564
+ const _e = (e, t) => t, te = I(_e), Gt = ({
6674
8565
  t: e,
6675
- lang: o = "en",
6676
- overrides: r,
6677
- children: t
8566
+ lang: t = "en",
8567
+ overrides: i,
8568
+ children: o
6678
8569
  }) => {
6679
- const a = b(() => {
8570
+ const r = b(() => {
6680
8571
  if (e)
6681
8572
  return e;
6682
- const n = k[o] ?? k.en, i = r ? { ...n, ...r } : n;
6683
- return (s, d) => i[s] ?? d;
6684
- }, [e, o, r]);
6685
- return /* @__PURE__ */ B(oe.Provider, { value: a, children: t });
8573
+ const a = w[t] ?? w.en, n = i ? { ...a, ...i } : a;
8574
+ return (s, l) => n[s] ?? l;
8575
+ }, [e, t, i]);
8576
+ return /* @__PURE__ */ O(te.Provider, { value: r, children: o });
6686
8577
  };
6687
- function Jo() {
6688
- return { t: N(oe) };
8578
+ function Zt() {
8579
+ return { t: B(te) };
6689
8580
  }
6690
- function Yo(e = "en", o) {
6691
- const r = k[e] ?? k.en, t = o ? { ...r, ...o } : r;
6692
- return (a, n) => t[a] ?? n;
8581
+ function Jt(e = "en", t) {
8582
+ const i = w[e] ?? w.en, o = t ? { ...i, ...t } : i;
8583
+ return (r, a) => o[r] ?? a;
6693
8584
  }
6694
- function $o(e, o = {}) {
6695
- let r = e.replace(/\{(\w+)\}/g, (t, a) => {
6696
- const n = o[a];
6697
- return n !== void 0 ? String(n) : t;
8585
+ function Xt(e, t = {}) {
8586
+ let i = e.replace(/\{(\w+)\}/g, (o, r) => {
8587
+ const a = t[r];
8588
+ return a !== void 0 ? String(a) : o;
6698
8589
  });
6699
- return r = r.replace(
8590
+ return i = i.replace(
6700
8591
  /\{(\w+),\s*plural,\s*one\{([^}]+)\}\s*other\{([^}]+)\}\}/g,
6701
- (t, a, n, i) => {
6702
- const s = o[a];
6703
- return typeof s != "number" ? t : (s === 1 ? n : i).replace(/#/g, String(s));
8592
+ (o, r, a, n) => {
8593
+ const s = t[r];
8594
+ return typeof s != "number" ? o : (s === 1 ? a : n).replace(/#/g, String(s));
6704
8595
  }
6705
- ), r;
8596
+ ), i;
6706
8597
  }
6707
- function Xe(e) {
6708
- return j.includes(e);
8598
+ function Qe(e) {
8599
+ return x.includes(e);
6709
8600
  }
6710
- function _o() {
6711
- var o;
8601
+ function Yt() {
8602
+ var t;
6712
8603
  if (typeof navigator > "u")
6713
8604
  return "en";
6714
- const e = (o = navigator.language) == null ? void 0 : o.split("-")[0];
6715
- return Xe(e) ? e : "en";
8605
+ const e = (t = navigator.language) == null ? void 0 : t.split("-")[0];
8606
+ return Qe(e) ? e : "en";
6716
8607
  }
6717
- function te(e, o) {
6718
- var n;
6719
- const r = Math.abs(e), t = Math.floor(r), a = e.toString().includes(".") && ((n = e.toString().split(".")[1]) == null ? void 0 : n.length) || 0;
6720
- switch (a > 0 && parseInt(e.toString().split(".")[1] || "0", 10), o) {
8608
+ function oe(e, t) {
8609
+ var a;
8610
+ const i = Math.abs(e), o = Math.floor(i), r = e.toString().includes(".") && ((a = e.toString().split(".")[1]) == null ? void 0 : a.length) || 0;
8611
+ switch (r > 0 && parseInt(e.toString().split(".")[1] || "0", 10), t) {
6721
8612
  // ── English-like (one/other) ───────────────────────────
6722
8613
  case "en":
6723
8614
  case "de":
@@ -6729,29 +8620,29 @@ function te(e, o) {
6729
8620
  case "it":
6730
8621
  case "es":
6731
8622
  case "pt":
6732
- return t === 1 && a === 0 ? "one" : "other";
8623
+ return o === 1 && r === 0 ? "one" : "other";
6733
8624
  // ── French (one/many/other) ────────────────────────────
6734
8625
  case "fr":
6735
- return t === 0 || t === 1 ? "one" : r >= 1e6 ? "many" : "other";
8626
+ return o === 0 || o === 1 ? "one" : i >= 1e6 ? "many" : "other";
6736
8627
  // ── Polish (Slavic: one/few/many/other) ────────────────
6737
8628
  case "pl":
6738
- return t === 1 && a === 0 ? "one" : a === 0 && t % 10 >= 2 && t % 10 <= 4 && !(t % 100 >= 12 && t % 100 <= 14) ? "few" : a === 0 && t !== 1 && (t % 10 === 0 || t % 10 === 1) || a === 0 && t % 10 >= 5 && t % 10 <= 9 || a === 0 && t % 100 >= 12 && t % 100 <= 14 ? "many" : "other";
8629
+ return o === 1 && r === 0 ? "one" : r === 0 && o % 10 >= 2 && o % 10 <= 4 && !(o % 100 >= 12 && o % 100 <= 14) ? "few" : r === 0 && o !== 1 && (o % 10 === 0 || o % 10 === 1) || r === 0 && o % 10 >= 5 && o % 10 <= 9 || r === 0 && o % 100 >= 12 && o % 100 <= 14 ? "many" : "other";
6739
8630
  // ── Ukrainian (Slavic: one/few/many/other) ─────────────
6740
8631
  case "uk":
6741
- return a === 0 && t % 10 === 1 && t % 100 !== 11 ? "one" : a === 0 && t % 10 >= 2 && t % 10 <= 4 && !(t % 100 >= 12 && t % 100 <= 14) ? "few" : a === 0 && t % 10 === 0 || a === 0 && t % 10 >= 5 && t % 10 <= 9 || a === 0 && t % 100 >= 11 && t % 100 <= 14 ? "many" : "other";
8632
+ return r === 0 && o % 10 === 1 && o % 100 !== 11 ? "one" : r === 0 && o % 10 >= 2 && o % 10 <= 4 && !(o % 100 >= 12 && o % 100 <= 14) ? "few" : r === 0 && o % 10 === 0 || r === 0 && o % 10 >= 5 && o % 10 <= 9 || r === 0 && o % 100 >= 11 && o % 100 <= 14 ? "many" : "other";
6742
8633
  // ── Bulgarian (one/other) ──────────────────────────────
6743
8634
  case "bg":
6744
8635
  return e === 1 ? "one" : "other";
6745
8636
  // ── Czech/Slovak (Slavic: one/few/many/other) ──────────
6746
8637
  case "cs":
6747
8638
  case "sk":
6748
- return t === 1 && a === 0 ? "one" : t >= 2 && t <= 4 && a === 0 ? "few" : a !== 0 ? "many" : "other";
8639
+ return o === 1 && r === 0 ? "one" : o >= 2 && o <= 4 && r === 0 ? "few" : r !== 0 ? "many" : "other";
6749
8640
  // ── Hungarian (one/other) ──────────────────────────────
6750
8641
  case "hu":
6751
8642
  return e === 1 ? "one" : "other";
6752
8643
  // ── Romanian (one/few/other) ───────────────────────────
6753
8644
  case "ro":
6754
- return t === 1 && a === 0 ? "one" : a !== 0 || e === 0 || e % 100 >= 2 && e % 100 <= 19 ? "few" : "other";
8645
+ return o === 1 && r === 0 ? "one" : r !== 0 || e === 0 || e % 100 >= 2 && e % 100 <= 19 ? "few" : "other";
6755
8646
  // ── Japanese/Korean/Chinese (other only) ─────────────────
6756
8647
  case "ja":
6757
8648
  case "ko":
@@ -6765,20 +8656,20 @@ function te(e, o) {
6765
8656
  return "one";
6766
8657
  if (e === 2)
6767
8658
  return "two";
6768
- const i = e % 100;
6769
- return i >= 3 && i <= 10 ? "few" : i >= 11 && i <= 99 ? "many" : "other";
8659
+ const n = e % 100;
8660
+ return n >= 3 && n <= 10 ? "few" : n >= 11 && n <= 99 ? "many" : "other";
6770
8661
  }
6771
8662
  default:
6772
8663
  if (typeof Intl < "u" && typeof Intl.PluralRules == "function")
6773
8664
  try {
6774
- return new Intl.PluralRules(o).select(e);
8665
+ return new Intl.PluralRules(t).select(e);
6775
8666
  } catch {
6776
8667
  }
6777
- return t === 1 && a === 0 ? "one" : "other";
8668
+ return o === 1 && r === 0 ? "one" : "other";
6778
8669
  }
6779
8670
  }
6780
- function re(e, o) {
6781
- switch (o) {
8671
+ function ie(e, t) {
8672
+ switch (t) {
6782
8673
  // ── English ────────────────────────────────────────────
6783
8674
  case "en":
6784
8675
  return e % 10 === 1 && e % 100 !== 11 ? "one" : e % 10 === 2 && e % 100 !== 12 ? "two" : e % 10 === 3 && e % 100 !== 13 ? "few" : "other";
@@ -6805,149 +8696,149 @@ function re(e, o) {
6805
8696
  default:
6806
8697
  if (typeof Intl < "u" && typeof Intl.PluralRules == "function")
6807
8698
  try {
6808
- return new Intl.PluralRules(o, { type: "ordinal" }).select(e);
8699
+ return new Intl.PluralRules(t, { type: "ordinal" }).select(e);
6809
8700
  } catch {
6810
8701
  }
6811
8702
  return "other";
6812
8703
  }
6813
8704
  }
6814
- function eo(e) {
6815
- var a;
8705
+ function et(e) {
8706
+ var r;
6816
8707
  if (e = e.trim(), !e.includes(","))
6817
8708
  return { type: "simple", name: e };
6818
- const o = e.split(",").map((n) => n.trim()), r = o[0], t = (a = o[1]) == null ? void 0 : a.toLowerCase();
6819
- if (!t || !r)
8709
+ const t = e.split(",").map((a) => a.trim()), i = t[0], o = (r = t[1]) == null ? void 0 : r.toLowerCase();
8710
+ if (!o || !i)
6820
8711
  return null;
6821
- if (t === "number")
6822
- return { type: "number", name: r, style: o[2] };
6823
- if (t === "date" || t === "time")
6824
- return { type: t, name: r, style: o[2] || "medium" };
6825
- if (t === "plural" || t === "select" || t === "selectordinal") {
6826
- const n = o.slice(2).join(",").trim(), i = {}, s = /(=?\w+)\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
6827
- let d;
6828
- for (; (d = s.exec(n)) !== null; )
6829
- i[d[1]] = d[2];
6830
- return { type: t, name: r, options: i };
8712
+ if (o === "number")
8713
+ return { type: "number", name: i, style: t[2] };
8714
+ if (o === "date" || o === "time")
8715
+ return { type: o, name: i, style: t[2] || "medium" };
8716
+ if (o === "plural" || o === "select" || o === "selectordinal") {
8717
+ const a = t.slice(2).join(",").trim(), n = {}, s = /(=?\w+)\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
8718
+ let l;
8719
+ for (; (l = s.exec(a)) !== null; )
8720
+ n[l[1]] = l[2];
8721
+ return { type: o, name: i, options: n };
6831
8722
  }
6832
- return { type: "simple", name: r };
8723
+ return { type: "simple", name: i };
6833
8724
  }
6834
- function oo(e, o, r) {
6835
- const t = {};
6836
- switch (r) {
8725
+ function tt(e, t, i) {
8726
+ const o = {};
8727
+ switch (i) {
6837
8728
  case "currency":
6838
- t.style = "currency", t.currency = "USD";
8729
+ o.style = "currency", o.currency = "USD";
6839
8730
  break;
6840
8731
  case "percent":
6841
- t.style = "percent";
8732
+ o.style = "percent";
6842
8733
  break;
6843
8734
  case "integer":
6844
- t.maximumFractionDigits = 0;
8735
+ o.maximumFractionDigits = 0;
6845
8736
  break;
6846
8737
  }
6847
- return new Intl.NumberFormat(o, t).format(e);
8738
+ return new Intl.NumberFormat(t, o).format(e);
6848
8739
  }
6849
- function to(e, o, r) {
6850
- const t = e instanceof Date ? e : new Date(e);
6851
- let a;
6852
- switch (r) {
8740
+ function ot(e, t, i) {
8741
+ const o = e instanceof Date ? e : new Date(e);
8742
+ let r;
8743
+ switch (i) {
6853
8744
  case "short":
6854
- a = { dateStyle: "short" };
8745
+ r = { dateStyle: "short" };
6855
8746
  break;
6856
8747
  case "long":
6857
- a = { dateStyle: "long" };
8748
+ r = { dateStyle: "long" };
6858
8749
  break;
6859
8750
  case "full":
6860
- a = { dateStyle: "full" };
8751
+ r = { dateStyle: "full" };
6861
8752
  break;
6862
8753
  case "medium":
6863
8754
  default:
6864
- a = { dateStyle: "medium" };
8755
+ r = { dateStyle: "medium" };
6865
8756
  break;
6866
8757
  }
6867
- return new Intl.DateTimeFormat(o, a).format(t);
8758
+ return new Intl.DateTimeFormat(t, r).format(o);
6868
8759
  }
6869
- function ro(e, o, r) {
6870
- const t = e instanceof Date ? e : new Date(e);
6871
- let a;
6872
- switch (r) {
8760
+ function it(e, t, i) {
8761
+ const o = e instanceof Date ? e : new Date(e);
8762
+ let r;
8763
+ switch (i) {
6873
8764
  case "short":
6874
- a = { timeStyle: "short" };
8765
+ r = { timeStyle: "short" };
6875
8766
  break;
6876
8767
  case "long":
6877
- a = { timeStyle: "long" };
8768
+ r = { timeStyle: "long" };
6878
8769
  break;
6879
8770
  case "full":
6880
- a = { timeStyle: "full" };
8771
+ r = { timeStyle: "full" };
6881
8772
  break;
6882
8773
  case "medium":
6883
8774
  default:
6884
- a = { timeStyle: "medium" };
8775
+ r = { timeStyle: "medium" };
6885
8776
  break;
6886
8777
  }
6887
- return new Intl.DateTimeFormat(o, a).format(t);
8778
+ return new Intl.DateTimeFormat(t, r).format(o);
6888
8779
  }
6889
- function V(e, o, r) {
6890
- return e.replace(/#/g, String(r));
8780
+ function H(e, t, i) {
8781
+ return e.replace(/#/g, String(i));
6891
8782
  }
6892
- function ao(e, o = {}, r = {}) {
6893
- const t = r.lang || "en", a = r.locale || t, n = /\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
6894
- return e.replace(n, (i, s) => {
6895
- const d = eo(s);
6896
- if (!d)
6897
- return i;
6898
- const l = o[d.name];
6899
- if (l === void 0)
6900
- return i;
6901
- switch (d.type) {
8783
+ function rt(e, t = {}, i = {}) {
8784
+ const o = i.lang || "en", r = i.locale || o, a = /\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
8785
+ return e.replace(a, (n, s) => {
8786
+ const l = et(s);
8787
+ if (!l)
8788
+ return n;
8789
+ const d = t[l.name];
8790
+ if (d === void 0)
8791
+ return n;
8792
+ switch (l.type) {
6902
8793
  case "simple":
6903
- return String(l);
8794
+ return String(d);
6904
8795
  case "number":
6905
- return typeof l != "number" ? i : oo(l, a, d.style);
8796
+ return typeof d != "number" ? n : tt(d, r, l.style);
6906
8797
  case "date":
6907
- return to(l, a, d.style);
8798
+ return ot(d, r, l.style);
6908
8799
  case "time":
6909
- return ro(l, a, d.style);
8800
+ return it(d, r, l.style);
6910
8801
  case "plural": {
6911
- if (typeof l != "number" || !d.options)
6912
- return i;
6913
- const p = te(l, t), f = `=${l}`, u = d.options[f] ?? d.options[p] ?? d.options.other ?? "";
6914
- return V(u, d.name, l);
8802
+ if (typeof d != "number" || !l.options)
8803
+ return n;
8804
+ const u = oe(d, o), v = `=${d}`, p = l.options[v] ?? l.options[u] ?? l.options.other ?? "";
8805
+ return H(p, l.name, d);
6915
8806
  }
6916
8807
  case "selectordinal": {
6917
- if (typeof l != "number" || !d.options)
6918
- return i;
6919
- const p = re(l, t), f = d.options[p] ?? d.options.other ?? "";
6920
- return V(f, d.name, l);
8808
+ if (typeof d != "number" || !l.options)
8809
+ return n;
8810
+ const u = ie(d, o), v = l.options[u] ?? l.options.other ?? "";
8811
+ return H(v, l.name, d);
6921
8812
  }
6922
8813
  case "select": {
6923
- if (!d.options)
6924
- return i;
6925
- const p = d.options[String(l)] ?? d.options.other ?? "";
6926
- return V(p, d.name, l);
8814
+ if (!l.options)
8815
+ return n;
8816
+ const u = l.options[String(d)] ?? l.options.other ?? "";
8817
+ return H(u, l.name, d);
6927
8818
  }
6928
8819
  default:
6929
- return i;
8820
+ return n;
6930
8821
  }
6931
8822
  });
6932
8823
  }
6933
- function Qo(e, o = "en") {
6934
- return function(t, a, n) {
6935
- const i = e[t] ?? a;
6936
- return n ? ao(i, n, { lang: o }) : i;
8824
+ function $t(e, t = "en") {
8825
+ return function(o, r, a) {
8826
+ const n = e[o] ?? r;
8827
+ return a ? rt(n, a, { lang: t }) : n;
6937
8828
  };
6938
8829
  }
6939
- function Xo(e, o, r = "en") {
6940
- const t = te(e, r);
6941
- return (o[t] ?? o.other).replace(/#/g, String(e));
8830
+ function _t(e, t, i = "en") {
8831
+ const o = oe(e, i);
8832
+ return (t[o] ?? t.other).replace(/#/g, String(e));
6942
8833
  }
6943
- function et(e, o, r = "en") {
6944
- const t = re(e, r);
6945
- return (o[t] ?? o.other).replace(/#/g, String(e));
8834
+ function Qt(e, t, i = "en") {
8835
+ const o = ie(e, i);
8836
+ return (t[o] ?? t.other).replace(/#/g, String(e));
6946
8837
  }
6947
- function ot(e, o) {
6948
- return o[e] ?? o.other;
8838
+ function eo(e, t) {
8839
+ return t[e] ?? t.other;
6949
8840
  }
6950
- const no = [
8841
+ const at = [
6951
8842
  "ar",
6952
8843
  // Arabic
6953
8844
  "he",
@@ -6961,29 +8852,29 @@ const no = [
6961
8852
  "ps"
6962
8853
  // Pashto
6963
8854
  ];
6964
- function ae(e) {
6965
- return no.includes(e);
8855
+ function re(e) {
8856
+ return at.includes(e);
6966
8857
  }
6967
- function io(e) {
6968
- return ae(e) ? "rtl" : "ltr";
8858
+ function nt(e) {
8859
+ return re(e) ? "rtl" : "ltr";
6969
8860
  }
6970
- function so(e) {
8861
+ function st(e) {
6971
8862
  if (typeof document > "u")
6972
8863
  return;
6973
- const o = io(e);
6974
- document.documentElement.setAttribute("dir", o), document.documentElement.setAttribute("lang", e);
8864
+ const t = nt(e);
8865
+ document.documentElement.setAttribute("dir", t), document.documentElement.setAttribute("lang", e);
6975
8866
  }
6976
- function tt() {
8867
+ function to() {
6977
8868
  return typeof document > "u" ? "ltr" : document.documentElement.getAttribute("dir") || "ltr";
6978
8869
  }
6979
- function lo(e, o) {
6980
- return o ? e.rtl : e.ltr;
8870
+ function lt(e, t) {
8871
+ return t ? e.rtl : e.ltr;
6981
8872
  }
6982
- function rt(e) {
8873
+ function oo(e) {
6983
8874
  return e === "left" ? "right" : "left";
6984
8875
  }
6985
- function co(e, o) {
6986
- return o && {
8876
+ function dt(e, t) {
8877
+ return t && {
6987
8878
  left: "right",
6988
8879
  right: "left",
6989
8880
  start: "end",
@@ -6992,7 +8883,7 @@ function co(e, o) {
6992
8883
  "flex-end": "flex-start"
6993
8884
  }[e] || e;
6994
8885
  }
6995
- function po(e) {
8886
+ function ct(e) {
6996
8887
  return {
6997
8888
  // Margins
6998
8889
  "margin-left": "margin-inline-start",
@@ -7022,39 +8913,39 @@ function po(e) {
7022
8913
  "text-align: right": "text-align: end"
7023
8914
  }[e] || e;
7024
8915
  }
7025
- const q = I({
8916
+ const G = I({
7026
8917
  dir: "ltr",
7027
8918
  isRTL: !1,
7028
8919
  flip: (e) => e,
7029
8920
  value: (e) => e.ltr
7030
- }), at = ({
8921
+ }), io = ({
7031
8922
  lang: e,
7032
- autoSetDocument: o = !0,
7033
- children: r
8923
+ autoSetDocument: t = !0,
8924
+ children: i
7034
8925
  }) => {
7035
- const t = ae(e), a = t ? "rtl" : "ltr";
8926
+ const o = re(e), r = o ? "rtl" : "ltr";
7036
8927
  L(() => {
7037
- o && so(e);
7038
- }, [e, o]);
7039
- const n = b(
8928
+ t && st(e);
8929
+ }, [e, t]);
8930
+ const a = b(
7040
8931
  () => ({
7041
- dir: a,
7042
- isRTL: t,
7043
- flip: (i) => co(i, t),
7044
- value: (i) => lo(i, t)
8932
+ dir: r,
8933
+ isRTL: o,
8934
+ flip: (n) => dt(n, o),
8935
+ value: (n) => lt(n, o)
7045
8936
  }),
7046
- [a, t]
8937
+ [r, o]
7047
8938
  );
7048
- return /* @__PURE__ */ B(q.Provider, { value: n, children: r });
8939
+ return /* @__PURE__ */ O(G.Provider, { value: a, children: i });
7049
8940
  };
7050
- function nt() {
7051
- return N(q);
8941
+ function ro() {
8942
+ return B(G);
7052
8943
  }
7053
- function it() {
7054
- return N(q).isRTL;
8944
+ function ao() {
8945
+ return B(G).isRTL;
7055
8946
  }
7056
- function st(e) {
7057
- const o = [], r = [
8947
+ function no(e) {
8948
+ const t = [], i = [
7058
8949
  "left",
7059
8950
  "right",
7060
8951
  "margin-left",
@@ -7064,11 +8955,11 @@ function st(e) {
7064
8955
  "border-left",
7065
8956
  "border-right"
7066
8957
  ];
7067
- for (const [t, a] of Object.entries(e))
7068
- r.includes(t) && o.push(`Use logical property instead of '${t}' → '${po(t)}'`), t === "text-align" && (a === "left" || a === "right") && o.push(`Use 'text-align: start/end' instead of 'text-align: ${a}'`), t === "float" && (a === "left" || a === "right") && o.push(`Use flexbox or grid instead of 'float: ${a}' for RTL support`);
7069
- return o;
8958
+ for (const [o, r] of Object.entries(e))
8959
+ i.includes(o) && t.push(`Use logical property instead of '${o}' → '${ct(o)}'`), o === "text-align" && (r === "left" || r === "right") && t.push(`Use 'text-align: start/end' instead of 'text-align: ${r}'`), o === "float" && (r === "left" || r === "right") && t.push(`Use flexbox or grid instead of 'float: ${r}' for RTL support`);
8960
+ return t;
7070
8961
  }
7071
- const U = {
8962
+ const q = {
7072
8963
  // Direction multiplier: 1 for LTR, -1 for RTL
7073
8964
  dirMultiplier: "--nice-dir-multiplier",
7074
8965
  // Inline start (left in LTR, right in RTL)
@@ -7076,52 +8967,52 @@ const U = {
7076
8967
  // Inline end (right in LTR, left in RTL)
7077
8968
  inlineEnd: "--nice-inline-end"
7078
8969
  };
7079
- function dt(e) {
8970
+ function so(e) {
7080
8971
  return {
7081
- [U.dirMultiplier]: e ? "-1" : "1",
7082
- [U.inlineStart]: e ? "right" : "left",
7083
- [U.inlineEnd]: e ? "left" : "right"
8972
+ [q.dirMultiplier]: e ? "-1" : "1",
8973
+ [q.inlineStart]: e ? "right" : "left",
8974
+ [q.inlineEnd]: e ? "left" : "right"
7084
8975
  };
7085
8976
  }
7086
- function lt() {
7087
- return Object.keys(k.en);
8977
+ function lo() {
8978
+ return Object.keys(w.en);
7088
8979
  }
7089
- function uo(e) {
8980
+ function ut(e) {
7090
8981
  if (e === "en")
7091
8982
  return [];
7092
- const o = k.en, r = k[e], t = [];
7093
- for (const [a, n] of Object.entries(o))
7094
- r[a] || t.push({ key: a, englishValue: n });
7095
- return t;
8983
+ const t = w.en, i = w[e], o = [];
8984
+ for (const [r, a] of Object.entries(t))
8985
+ i[r] || o.push({ key: r, englishValue: a });
8986
+ return o;
7096
8987
  }
7097
- function mo(e) {
7098
- const o = Object.keys(k.en).length, r = Object.keys(k[e]).length, t = o - r, a = Math.round(r / o * 100);
8988
+ function pt(e) {
8989
+ const t = Object.keys(w.en).length, i = Object.keys(w[e]).length, o = t - i, r = Math.round(i / t * 100);
7099
8990
  return {
7100
8991
  lang: e,
7101
- totalKeys: o,
7102
- translatedKeys: r,
7103
- missingKeys: t,
7104
- coverage: a
8992
+ totalKeys: t,
8993
+ translatedKeys: i,
8994
+ missingKeys: o,
8995
+ coverage: r
7105
8996
  };
7106
8997
  }
7107
- function go() {
7108
- return j.map((e) => mo(e));
8998
+ function mt() {
8999
+ return x.map((e) => pt(e));
7109
9000
  }
7110
- function ct(e, o) {
7111
- const r = o.map((t) => {
7112
- const a = t.translated.replace(/'/g, "\\'");
7113
- return ` '${t.key}': '${a}',`;
9001
+ function co(e, t) {
9002
+ const i = t.map((o) => {
9003
+ const r = o.translated.replace(/'/g, "\\'");
9004
+ return ` '${o.key}': '${r}',`;
7114
9005
  });
7115
9006
  return `// Auto-translated additions for ${e} (review before merging)
7116
9007
  // Generated on ${(/* @__PURE__ */ new Date()).toISOString()}
7117
9008
  {
7118
- ${r.join(`
9009
+ ${i.join(`
7119
9010
  `)}
7120
9011
  }`;
7121
9012
  }
7122
- function pt() {
7123
- const e = go();
7124
- let o = `# Translation Coverage Report
9013
+ function uo() {
9014
+ const e = mt();
9015
+ let t = `# Translation Coverage Report
7125
9016
 
7126
9017
  Generated: ${(/* @__PURE__ */ new Date()).toISOString()}
7127
9018
 
@@ -7130,29 +9021,29 @@ Generated: ${(/* @__PURE__ */ new Date()).toISOString()}
7130
9021
  | Language | Translated | Missing | Coverage |
7131
9022
  |----------|------------|---------|----------|
7132
9023
  `;
7133
- for (const r of e) {
7134
- const t = "█".repeat(Math.floor(r.coverage / 10)) + "░".repeat(10 - Math.floor(r.coverage / 10));
7135
- o += `| ${r.lang} | ${r.translatedKeys} | ${r.missingKeys} | ${t} ${r.coverage}% |
9024
+ for (const i of e) {
9025
+ const o = "█".repeat(Math.floor(i.coverage / 10)) + "░".repeat(10 - Math.floor(i.coverage / 10));
9026
+ t += `| ${i.lang} | ${i.translatedKeys} | ${i.missingKeys} | ${o} ${i.coverage}% |
7136
9027
  `;
7137
9028
  }
7138
- o += `
9029
+ t += `
7139
9030
  ## Languages with Missing Translations
7140
9031
 
7141
9032
  `;
7142
- for (const r of e.filter((t) => t.missingKeys > 0)) {
7143
- o += `### ${r.lang.toUpperCase()} (${r.coverage}% complete)
9033
+ for (const i of e.filter((o) => o.missingKeys > 0)) {
9034
+ t += `### ${i.lang.toUpperCase()} (${i.coverage}% complete)
7144
9035
 
7145
9036
  `;
7146
- const t = uo(r.lang);
7147
- o += `Missing ${t.length} keys:
9037
+ const o = ut(i.lang);
9038
+ t += `Missing ${o.length} keys:
7148
9039
 
7149
- `, o += "```\n", o += t.slice(0, 10).map((a) => a.key).join(`
7150
- `), t.length > 10 && (o += `
7151
- ... and ${t.length - 10} more`), o += "\n```\n\n";
9040
+ `, t += "```\n", t += o.slice(0, 10).map((r) => r.key).join(`
9041
+ `), o.length > 10 && (t += `
9042
+ ... and ${o.length - 10} more`), t += "\n```\n\n";
7152
9043
  }
7153
- return o;
9044
+ return t;
7154
9045
  }
7155
- const ho = {
9046
+ const gt = {
7156
9047
  en: "en-US",
7157
9048
  pl: "pl-PL",
7158
9049
  de: "de-DE",
@@ -7185,56 +9076,56 @@ const ho = {
7185
9076
  ms: "ms-MY"
7186
9077
  };
7187
9078
  function D(e) {
7188
- return ho[e] ?? "en-US";
9079
+ return gt[e] ?? "en-US";
7189
9080
  }
7190
- function fo(e, o = "medium") {
7191
- const r = D(e), t = new Intl.DateTimeFormat(r, { dateStyle: o });
9081
+ function ht(e, t = "medium") {
9082
+ const i = D(e), o = new Intl.DateTimeFormat(i, { dateStyle: t });
7192
9083
  return {
7193
- format: (a) => t.format(a instanceof Date ? a : new Date(a)),
7194
- formatRange: (a, n) => {
7195
- const i = a instanceof Date ? a : new Date(a), s = n instanceof Date ? n : new Date(n);
7196
- return t.formatRange(i, s);
9084
+ format: (r) => o.format(r instanceof Date ? r : new Date(r)),
9085
+ formatRange: (r, a) => {
9086
+ const n = r instanceof Date ? r : new Date(r), s = a instanceof Date ? a : new Date(a);
9087
+ return o.formatRange(n, s);
7197
9088
  },
7198
- formatRelative: (a) => wo(a instanceof Date ? a : new Date(a), r)
9089
+ formatRelative: (r) => wt(r instanceof Date ? r : new Date(r), i)
7199
9090
  };
7200
9091
  }
7201
- function ut(e, o = "medium") {
7202
- return b(() => fo(e, o), [e, o]);
9092
+ function po(e, t = "medium") {
9093
+ return b(() => ht(e, t), [e, t]);
7203
9094
  }
7204
- function vo(e, o = "short") {
7205
- const r = D(e), t = new Intl.DateTimeFormat(r, { timeStyle: o });
9095
+ function vt(e, t = "short") {
9096
+ const i = D(e), o = new Intl.DateTimeFormat(i, { timeStyle: t });
7206
9097
  return {
7207
- format: (a) => t.format(a instanceof Date ? a : new Date(a))
9098
+ format: (r) => o.format(r instanceof Date ? r : new Date(r))
7208
9099
  };
7209
9100
  }
7210
- function mt(e, o = "short") {
7211
- return b(() => vo(e, o), [e, o]);
9101
+ function mo(e, t = "short") {
9102
+ return b(() => vt(e, t), [e, t]);
7212
9103
  }
7213
- function bo(e) {
7214
- const o = D(e);
9104
+ function ft(e) {
9105
+ const t = D(e);
7215
9106
  return {
7216
- format: (r) => new Intl.NumberFormat(o).format(r),
7217
- formatCompact: (r) => new Intl.NumberFormat(o, { notation: "compact" }).format(r),
7218
- formatPercent: (r) => new Intl.NumberFormat(o, { style: "percent", maximumFractionDigits: 1 }).format(r)
9107
+ format: (i) => new Intl.NumberFormat(t).format(i),
9108
+ formatCompact: (i) => new Intl.NumberFormat(t, { notation: "compact" }).format(i),
9109
+ formatPercent: (i) => new Intl.NumberFormat(t, { style: "percent", maximumFractionDigits: 1 }).format(i)
7219
9110
  };
7220
9111
  }
7221
- function gt(e) {
7222
- return b(() => bo(e), [e]);
9112
+ function go(e) {
9113
+ return b(() => ft(e), [e]);
7223
9114
  }
7224
- function ko(e, o = "USD") {
7225
- const r = D(e), t = new Intl.NumberFormat(r, { style: "currency", currency: o });
9115
+ function bt(e, t = "USD") {
9116
+ const i = D(e), o = new Intl.NumberFormat(i, { style: "currency", currency: t });
7226
9117
  return {
7227
- format: (a) => t.format(a)
9118
+ format: (r) => o.format(r)
7228
9119
  };
7229
9120
  }
7230
- function ht(e, o = "USD") {
7231
- return b(() => ko(e, o), [e, o]);
9121
+ function ho(e, t = "USD") {
9122
+ return b(() => bt(e, t), [e, t]);
7232
9123
  }
7233
- function wo(e, o) {
7234
- const r = Date.now(), t = e.getTime() - r, a = Math.abs(t), n = new Intl.RelativeTimeFormat(o, { numeric: "auto" });
7235
- return a < 6e4 ? n.format(Math.round(t / 1e3), "second") : a < 36e5 ? n.format(Math.round(t / 6e4), "minute") : a < 864e5 ? n.format(Math.round(t / 36e5), "hour") : a < 2592e6 ? n.format(Math.round(t / 864e5), "day") : a < 31536e6 ? n.format(Math.round(t / 2592e6), "month") : n.format(Math.round(t / 31536e6), "year");
9124
+ function wt(e, t) {
9125
+ const i = Date.now(), o = e.getTime() - i, r = Math.abs(o), a = new Intl.RelativeTimeFormat(t, { numeric: "auto" });
9126
+ return r < 6e4 ? a.format(Math.round(o / 1e3), "second") : r < 36e5 ? a.format(Math.round(o / 6e4), "minute") : r < 864e5 ? a.format(Math.round(o / 36e5), "hour") : r < 2592e6 ? a.format(Math.round(o / 864e5), "day") : r < 31536e6 ? a.format(Math.round(o / 2592e6), "month") : a.format(Math.round(o / 31536e6), "year");
7236
9127
  }
7237
- const ne = [
9128
+ const ae = [
7238
9129
  {
7239
9130
  en: "Save",
7240
9131
  translations: {
@@ -7386,54 +9277,54 @@ const ne = [
7386
9277
  }
7387
9278
  }
7388
9279
  ];
7389
- function yo(e, o) {
7390
- const r = ne.find((t) => t.en.toLowerCase() === e.toLowerCase());
7391
- return r == null ? void 0 : r.translations[o];
9280
+ function Et(e, t) {
9281
+ const i = ae.find((o) => o.en.toLowerCase() === e.toLowerCase());
9282
+ return i == null ? void 0 : i.translations[t];
7392
9283
  }
7393
- function ft(e, o, r = 0.8) {
7394
- const t = k.en, a = k[o], n = e.toLowerCase().trim();
7395
- let i;
7396
- for (const [s, d] of Object.entries(t)) {
7397
- const l = a[s];
7398
- if (!l)
9284
+ function vo(e, t, i = 0.8) {
9285
+ const o = w.en, r = w[t], a = e.toLowerCase().trim();
9286
+ let n;
9287
+ for (const [s, l] of Object.entries(o)) {
9288
+ const d = r[s];
9289
+ if (!d)
7399
9290
  continue;
7400
- const p = Eo(n, d.toLowerCase().trim());
7401
- p >= r && (!i || p > i.similarity) && (i = { key: s, english: d, translated: l, similarity: p });
9291
+ const u = kt(a, l.toLowerCase().trim());
9292
+ u >= i && (!n || u > n.similarity) && (n = { key: s, english: l, translated: d, similarity: u });
7402
9293
  }
7403
- return i;
9294
+ return n;
7404
9295
  }
7405
- function vt(e) {
7406
- return ne.filter((o) => o.translations[e] != null).map((o) => ({
7407
- en: o.en,
7408
- translation: o.translations[e]
9296
+ function fo(e) {
9297
+ return ae.filter((t) => t.translations[e] != null).map((t) => ({
9298
+ en: t.en,
9299
+ translation: t.translations[e]
7409
9300
  }));
7410
9301
  }
7411
- function bt(e) {
7412
- const o = k[e], r = k.en, t = [];
7413
- for (const [a, n] of Object.entries(r)) {
7414
- const i = yo(n, e), s = o[a];
7415
- i && s && s !== i && t.push({ key: a, currentTranslation: s, glossaryTranslation: i });
9302
+ function bo(e) {
9303
+ const t = w[e], i = w.en, o = [];
9304
+ for (const [r, a] of Object.entries(i)) {
9305
+ const n = Et(a, e), s = t[r];
9306
+ n && s && s !== n && o.push({ key: r, currentTranslation: s, glossaryTranslation: n });
7416
9307
  }
7417
- return t;
7418
- }
7419
- function _(e) {
7420
- const o = /* @__PURE__ */ new Set();
7421
- for (let r = 0; r < e.length - 1; r++)
7422
- o.add(e.substring(r, r + 2));
7423
9308
  return o;
7424
9309
  }
7425
- function Eo(e, o) {
7426
- if (e === o)
9310
+ function $(e) {
9311
+ const t = /* @__PURE__ */ new Set();
9312
+ for (let i = 0; i < e.length - 1; i++)
9313
+ t.add(e.substring(i, i + 2));
9314
+ return t;
9315
+ }
9316
+ function kt(e, t) {
9317
+ if (e === t)
7427
9318
  return 1;
7428
- if (e.length < 2 || o.length < 2)
9319
+ if (e.length < 2 || t.length < 2)
7429
9320
  return 0;
7430
- const r = _(e), t = _(o);
7431
- let a = 0;
7432
- for (const n of r)
7433
- t.has(n) && a++;
7434
- return 2 * a / (r.size + t.size);
9321
+ const i = $(e), o = $(t);
9322
+ let r = 0;
9323
+ for (const a of i)
9324
+ o.has(a) && r++;
9325
+ return 2 * r / (i.size + o.size);
7435
9326
  }
7436
- const ie = {
9327
+ const ne = {
7437
9328
  UTC: ["UTC", "Etc/UTC", "Etc/GMT"],
7438
9329
  NorthAmerica: [
7439
9330
  "America/New_York",
@@ -7494,124 +9385,124 @@ const ie = {
7494
9385
  "Pacific/Fiji"
7495
9386
  ]
7496
9387
  };
7497
- function G() {
9388
+ function Z() {
7498
9389
  try {
7499
9390
  return Intl.DateTimeFormat().resolvedOptions().timeZone;
7500
9391
  } catch {
7501
9392
  return "UTC";
7502
9393
  }
7503
9394
  }
7504
- function kt(e) {
9395
+ function wo(e) {
7505
9396
  try {
7506
9397
  return new Intl.DateTimeFormat("en", { timeZone: e }), !0;
7507
9398
  } catch {
7508
9399
  return !1;
7509
9400
  }
7510
9401
  }
7511
- function F(e, o = "en", r = /* @__PURE__ */ new Date()) {
7512
- var w, M;
7513
- const t = D(o), a = new Intl.DateTimeFormat(t, {
9402
+ function M(e, t = "en", i = /* @__PURE__ */ new Date()) {
9403
+ var E, F;
9404
+ const o = D(t), r = new Intl.DateTimeFormat(o, {
7514
9405
  timeZone: e,
7515
9406
  timeZoneName: "long"
7516
- }), n = new Intl.DateTimeFormat(t, {
9407
+ }), a = new Intl.DateTimeFormat(o, {
7517
9408
  timeZone: e,
7518
9409
  timeZoneName: "short"
7519
- }), i = a.formatToParts(r), s = n.formatToParts(r), d = ((w = i.find((x) => x.type === "timeZoneName")) == null ? void 0 : w.value) || e, l = ((M = s.find((x) => x.type === "timeZoneName")) == null ? void 0 : M.value) || e, p = new Date(r.toLocaleString("en-US", { timeZone: "UTC" })), f = new Date(r.toLocaleString("en-US", { timeZone: e })), u = Math.round((f.getTime() - p.getTime()) / 6e4), m = new Date(r.getFullYear(), 0, 1), v = new Date(r.getFullYear(), 6, 1), g = K(e, m), E = K(e, v), C = K(e, r), y = Math.min(g, E), A = C !== y && g !== E;
9410
+ }), n = r.formatToParts(i), s = a.formatToParts(i), l = ((E = n.find((A) => A.type === "timeZoneName")) == null ? void 0 : E.value) || e, d = ((F = s.find((A) => A.type === "timeZoneName")) == null ? void 0 : F.value) || e, u = new Date(i.toLocaleString("en-US", { timeZone: "UTC" })), v = new Date(i.toLocaleString("en-US", { timeZone: e })), p = Math.round((v.getTime() - u.getTime()) / 6e4), m = new Date(i.getFullYear(), 0, 1), f = new Date(i.getFullYear(), 6, 1), g = U(e, m), y = U(e, f), z = U(e, i), k = Math.min(g, y), j = z !== k && g !== y;
7520
9411
  return {
7521
9412
  id: e,
7522
- displayName: d,
7523
- shortName: l,
7524
- offsetMinutes: u,
7525
- offsetString: Do(u),
7526
- isDST: A
9413
+ displayName: l,
9414
+ shortName: d,
9415
+ offsetMinutes: p,
9416
+ offsetString: St(p),
9417
+ isDST: j
7527
9418
  };
7528
9419
  }
7529
- function wt(e = "en", o = /* @__PURE__ */ new Date()) {
7530
- return Object.values(ie).flat().map((t) => F(t, e, o));
9420
+ function Eo(e = "en", t = /* @__PURE__ */ new Date()) {
9421
+ return Object.values(ne).flat().map((o) => M(o, e, t));
7531
9422
  }
7532
- function yt(e = "en", o = /* @__PURE__ */ new Date()) {
7533
- const r = {};
7534
- for (const [t, a] of Object.entries(ie))
7535
- r[t] = a.map((n) => F(n, e, o));
7536
- return r;
9423
+ function ko(e = "en", t = /* @__PURE__ */ new Date()) {
9424
+ const i = {};
9425
+ for (const [o, r] of Object.entries(ne))
9426
+ i[o] = r.map((a) => M(a, e, t));
9427
+ return i;
7537
9428
  }
7538
- function se(e, o, r) {
7539
- const t = e.toLocaleString("en-US", { timeZone: o }), a = new Date(t), n = e.toLocaleString("en-US", { timeZone: r }), i = new Date(n), s = a.getTime() - i.getTime();
9429
+ function se(e, t, i) {
9430
+ const o = e.toLocaleString("en-US", { timeZone: t }), r = new Date(o), a = e.toLocaleString("en-US", { timeZone: i }), n = new Date(a), s = r.getTime() - n.getTime();
7540
9431
  return new Date(e.getTime() + s);
7541
9432
  }
7542
- function Co(e, o) {
7543
- const r = o || G();
7544
- return se(e, r, "UTC");
9433
+ function yt(e, t) {
9434
+ const i = t || Z();
9435
+ return se(e, i, "UTC");
7545
9436
  }
7546
- function So(e, o) {
7547
- const r = o || G();
7548
- return se(e, "UTC", r);
9437
+ function zt(e, t) {
9438
+ const i = t || Z();
9439
+ return se(e, "UTC", i);
7549
9440
  }
7550
- function zo(e, o, r = {}) {
7551
- const t = D(e), { dateStyle: a = "medium", timeStyle: n = "short", nameStyle: i = "short" } = r, s = new Intl.DateTimeFormat(t, {
7552
- timeZone: o,
7553
- dateStyle: a,
7554
- timeStyle: n
7555
- }), d = new Intl.DateTimeFormat(t, {
7556
- timeZone: o,
7557
- dateStyle: a,
7558
- timeStyle: n,
7559
- timeZoneName: i
7560
- }), l = new Intl.DateTimeFormat(t, {
7561
- timeZone: o,
9441
+ function Ct(e, t, i = {}) {
9442
+ const o = D(e), { dateStyle: r = "medium", timeStyle: a = "short", nameStyle: n = "short" } = i, s = new Intl.DateTimeFormat(o, {
9443
+ timeZone: t,
9444
+ dateStyle: r,
9445
+ timeStyle: a
9446
+ }), l = new Intl.DateTimeFormat(o, {
9447
+ timeZone: t,
9448
+ dateStyle: r,
9449
+ timeStyle: a,
9450
+ timeZoneName: n
9451
+ }), d = new Intl.DateTimeFormat(o, {
9452
+ timeZone: t,
7562
9453
  timeZoneName: "short"
7563
9454
  });
7564
9455
  return {
7565
- format: (p) => s.format(p),
7566
- formatWithZone: (p) => d.format(p),
7567
- getOffset: (p) => F(o, e, p).offsetString,
7568
- getAbbreviation: (p) => {
7569
- var u;
7570
- return ((u = l.formatToParts(p).find((m) => m.type === "timeZoneName")) == null ? void 0 : u.value) || "";
9456
+ format: (u) => s.format(u),
9457
+ formatWithZone: (u) => l.format(u),
9458
+ getOffset: (u) => M(t, e, u).offsetString,
9459
+ getAbbreviation: (u) => {
9460
+ var p;
9461
+ return ((p = d.formatToParts(u).find((m) => m.type === "timeZoneName")) == null ? void 0 : p.value) || "";
7571
9462
  }
7572
9463
  };
7573
9464
  }
7574
- function H(e, o = /* @__PURE__ */ new Date()) {
7575
- return F(e, "en", o).isDST;
9465
+ function W(e, t = /* @__PURE__ */ new Date()) {
9466
+ return M(e, "en", t).isDST;
7576
9467
  }
7577
- function Et(e, o = /* @__PURE__ */ new Date()) {
7578
- const r = H(e, o), t = new Date(o), a = new Date(o);
7579
- for (a.setFullYear(a.getFullYear() + 1); t < a; )
7580
- if (t.setDate(t.getDate() + 1), H(e, t) !== r) {
7581
- t.setDate(t.getDate() - 1);
7582
- const n = new Date(t);
7583
- n.setHours(0, 0, 0, 0);
7584
- const i = new Date(t);
7585
- for (i.setDate(i.getDate() + 2); i.getTime() - n.getTime() > 6e4; ) {
7586
- const s = new Date((n.getTime() + i.getTime()) / 2);
7587
- H(e, s) === r ? n.setTime(s.getTime()) : i.setTime(s.getTime());
9468
+ function yo(e, t = /* @__PURE__ */ new Date()) {
9469
+ const i = W(e, t), o = new Date(t), r = new Date(t);
9470
+ for (r.setFullYear(r.getFullYear() + 1); o < r; )
9471
+ if (o.setDate(o.getDate() + 1), W(e, o) !== i) {
9472
+ o.setDate(o.getDate() - 1);
9473
+ const a = new Date(o);
9474
+ a.setHours(0, 0, 0, 0);
9475
+ const n = new Date(o);
9476
+ for (n.setDate(n.getDate() + 2); n.getTime() - a.getTime() > 6e4; ) {
9477
+ const s = new Date((a.getTime() + n.getTime()) / 2);
9478
+ W(e, s) === i ? a.setTime(s.getTime()) : n.setTime(s.getTime());
7588
9479
  }
7589
- return i;
9480
+ return n;
7590
9481
  }
7591
9482
  return null;
7592
9483
  }
7593
- function Ct(e, o, r) {
7594
- const [t] = P(() => G()), a = o || t, n = b(() => zo(e, a, r), [e, a, r]), i = b(() => F(a, e), [a, e]);
9484
+ function zo(e, t, i) {
9485
+ const [o] = T(() => Z()), r = t || o, a = b(() => Ct(e, r, i), [e, r, i]), n = b(() => M(r, e), [r, e]);
7595
9486
  return {
7596
- timezone: a,
7597
- info: i,
7598
- format: n.format,
7599
- formatWithZone: n.formatWithZone,
7600
- getOffset: n.getOffset,
7601
- getAbbreviation: n.getAbbreviation,
7602
- toUTC: (s) => Co(s, a),
7603
- fromUTC: (s) => So(s, a)
9487
+ timezone: r,
9488
+ info: n,
9489
+ format: a.format,
9490
+ formatWithZone: a.formatWithZone,
9491
+ getOffset: a.getOffset,
9492
+ getAbbreviation: a.getAbbreviation,
9493
+ toUTC: (s) => yt(s, r),
9494
+ fromUTC: (s) => zt(s, r)
7604
9495
  };
7605
9496
  }
7606
- function K(e, o) {
7607
- const r = o.toLocaleString("en-US", { timeZone: "UTC" }), t = o.toLocaleString("en-US", { timeZone: e }), a = new Date(r), n = new Date(t);
7608
- return Math.round((n.getTime() - a.getTime()) / 6e4);
9497
+ function U(e, t) {
9498
+ const i = t.toLocaleString("en-US", { timeZone: "UTC" }), o = t.toLocaleString("en-US", { timeZone: e }), r = new Date(i), a = new Date(o);
9499
+ return Math.round((a.getTime() - r.getTime()) / 6e4);
7609
9500
  }
7610
- function Do(e) {
7611
- const o = e >= 0 ? "+" : "-", r = Math.abs(e), t = Math.floor(r / 60), a = r % 60;
7612
- return `${o}${t.toString().padStart(2, "0")}:${a.toString().padStart(2, "0")}`;
9501
+ function St(e) {
9502
+ const t = e >= 0 ? "+" : "-", i = Math.abs(e), o = Math.floor(i / 60), r = i % 60;
9503
+ return `${t}${o.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}`;
7613
9504
  }
7614
- const W = {
9505
+ const V = {
7615
9506
  gregory: {
7616
9507
  id: "gregory",
7617
9508
  displayName: "Gregorian",
@@ -7745,7 +9636,7 @@ const W = {
7745
9636
  isLunar: !1,
7746
9637
  associatedLanguages: ["zh"]
7747
9638
  }
7748
- }, de = {
9639
+ }, le = {
7749
9640
  en: "gregory",
7750
9641
  pl: "gregory",
7751
9642
  de: "gregory",
@@ -7777,70 +9668,70 @@ const W = {
7777
9668
  fil: "gregory",
7778
9669
  ms: "gregory"
7779
9670
  };
7780
- function le(e, o = "gregory", r = {}) {
7781
- const t = D(e), { dateStyle: a = "medium", showEra: n = !1, showWeekday: i = !1 } = r, s = {
7782
- calendar: o,
7783
- dateStyle: a
9671
+ function de(e, t = "gregory", i = {}) {
9672
+ const o = D(e), { dateStyle: r = "medium", showEra: a = !1, showWeekday: n = !1 } = i, s = {
9673
+ calendar: t,
9674
+ dateStyle: r
7784
9675
  };
7785
- i && (delete s.dateStyle, s.weekday = "long", s.year = "numeric", s.month = "long", s.day = "numeric");
7786
- const d = new Intl.DateTimeFormat(t, s), l = {
7787
- calendar: o,
9676
+ n && (delete s.dateStyle, s.weekday = "long", s.year = "numeric", s.month = "long", s.day = "numeric");
9677
+ const l = new Intl.DateTimeFormat(o, s), d = {
9678
+ calendar: t,
7788
9679
  year: "numeric",
7789
9680
  month: "long",
7790
9681
  day: "numeric",
7791
9682
  era: "long"
7792
- }, p = new Intl.DateTimeFormat(t, l), f = new Intl.DateTimeFormat(t, { calendar: o, month: "long" }), u = new Intl.DateTimeFormat(t, { calendar: o, weekday: "long" });
9683
+ }, u = new Intl.DateTimeFormat(o, d), v = new Intl.DateTimeFormat(o, { calendar: t, month: "long" }), p = new Intl.DateTimeFormat(o, { calendar: t, weekday: "long" });
7793
9684
  return {
7794
- format: (m) => d.format(m),
7795
- formatWithEra: (m) => p.format(m),
7796
- getMonthName: (m) => f.format(m),
9685
+ format: (m) => l.format(m),
9686
+ formatWithEra: (m) => u.format(m),
9687
+ getMonthName: (m) => v.format(m),
7797
9688
  getMonthNames: () => {
7798
- const m = [], v = new Date(2024, 0, 15);
9689
+ const m = [], f = new Date(2024, 0, 15);
7799
9690
  for (let g = 0; g < 12; g++)
7800
- v.setMonth(g), m.push(f.format(v));
9691
+ f.setMonth(g), m.push(v.format(f));
7801
9692
  return m;
7802
9693
  },
7803
- getWeekdayName: (m) => u.format(m),
9694
+ getWeekdayName: (m) => p.format(m),
7804
9695
  getWeekdayNames: () => {
7805
- const m = [], v = new Date(2024, 0, 7);
9696
+ const m = [], f = new Date(2024, 0, 7);
7806
9697
  for (let g = 0; g < 7; g++)
7807
- v.setDate(7 + g), m.push(u.format(v));
9698
+ f.setDate(7 + g), m.push(p.format(f));
7808
9699
  return m;
7809
9700
  },
7810
9701
  parseParts: (m) => {
7811
- var E, C, y, A;
7812
- const g = new Intl.DateTimeFormat(t, {
7813
- calendar: o,
9702
+ var y, z, k, j;
9703
+ const g = new Intl.DateTimeFormat(o, {
9704
+ calendar: t,
7814
9705
  year: "numeric",
7815
9706
  month: "numeric",
7816
9707
  day: "numeric",
7817
9708
  era: "short"
7818
9709
  }).formatToParts(m);
7819
9710
  return {
7820
- calendar: o,
7821
- year: parseInt(((E = g.find((w) => w.type === "year")) == null ? void 0 : E.value) || "0", 10),
7822
- month: parseInt(((C = g.find((w) => w.type === "month")) == null ? void 0 : C.value) || "0", 10),
7823
- day: parseInt(((y = g.find((w) => w.type === "day")) == null ? void 0 : y.value) || "0", 10),
7824
- era: (A = g.find((w) => w.type === "era")) == null ? void 0 : A.value,
9711
+ calendar: t,
9712
+ year: parseInt(((y = g.find((E) => E.type === "year")) == null ? void 0 : y.value) || "0", 10),
9713
+ month: parseInt(((z = g.find((E) => E.type === "month")) == null ? void 0 : z.value) || "0", 10),
9714
+ day: parseInt(((k = g.find((E) => E.type === "day")) == null ? void 0 : k.value) || "0", 10),
9715
+ era: (j = g.find((E) => E.type === "era")) == null ? void 0 : j.value,
7825
9716
  gregorianDate: m
7826
9717
  };
7827
9718
  },
7828
9719
  getEraName: (m) => {
7829
- var E;
7830
- return (E = new Intl.DateTimeFormat(t, {
7831
- calendar: o,
9720
+ var y;
9721
+ return (y = new Intl.DateTimeFormat(o, {
9722
+ calendar: t,
7832
9723
  era: "long"
7833
- }).formatToParts(m).find((C) => C.type === "era")) == null ? void 0 : E.value;
9724
+ }).formatToParts(m).find((z) => z.type === "era")) == null ? void 0 : y.value;
7834
9725
  }
7835
9726
  };
7836
9727
  }
7837
- function ce(e, o, r = "en") {
7838
- return le(r, o).parseParts(e);
9728
+ function ce(e, t, i = "en") {
9729
+ return de(i, t).parseParts(e);
7839
9730
  }
7840
- function Ao(e, o = "en") {
7841
- return ce(/* @__PURE__ */ new Date(), e, o);
9731
+ function Dt(e, t = "en") {
9732
+ return ce(/* @__PURE__ */ new Date(), e, t);
7842
9733
  }
7843
- const St = [
9734
+ const Co = [
7844
9735
  "Muharram",
7845
9736
  "Safar",
7846
9737
  "Rabi' al-Awwal",
@@ -7854,13 +9745,13 @@ const St = [
7854
9745
  "Dhu al-Qi'dah",
7855
9746
  "Dhu al-Hijjah"
7856
9747
  ];
7857
- function xo(e) {
9748
+ function jt(e) {
7858
9749
  return (11 * e + 14) % 30 < 11;
7859
9750
  }
7860
- function zt(e, o) {
7861
- return o === 12 ? xo(e) ? 30 : 29 : o % 2 === 1 ? 30 : 29;
9751
+ function So(e, t) {
9752
+ return t === 12 ? jt(e) ? 30 : 29 : t % 2 === 1 ? 30 : 29;
7862
9753
  }
7863
- const Dt = [
9754
+ const Do = [
7864
9755
  "Tishrei",
7865
9756
  "Cheshvan",
7866
9757
  "Kislev",
@@ -7873,7 +9764,7 @@ const Dt = [
7873
9764
  "Tammuz",
7874
9765
  "Av",
7875
9766
  "Elul"
7876
- ], At = [
9767
+ ], jo = [
7877
9768
  "Tishrei",
7878
9769
  "Cheshvan",
7879
9770
  "Kislev",
@@ -7888,27 +9779,27 @@ const Dt = [
7888
9779
  "Av",
7889
9780
  "Elul"
7890
9781
  ];
7891
- function xt(e) {
9782
+ function Ao(e) {
7892
9783
  return (7 * e + 1) % 19 < 7;
7893
9784
  }
7894
- const Z = [
9785
+ const K = [
7895
9786
  { name: "Meiji", kanji: "明治", startDate: new Date(1868, 9, 23) },
7896
9787
  { name: "Taisho", kanji: "大正", startDate: new Date(1912, 6, 30) },
7897
9788
  { name: "Showa", kanji: "昭和", startDate: new Date(1926, 11, 25) },
7898
9789
  { name: "Heisei", kanji: "平成", startDate: new Date(1989, 0, 8) },
7899
9790
  { name: "Reiwa", kanji: "令和", startDate: new Date(2019, 4, 1) }
7900
9791
  ];
7901
- function To(e) {
7902
- for (let o = Z.length - 1; o >= 0; o--)
7903
- if (e >= Z[o].startDate)
7904
- return Z[o];
9792
+ function At(e) {
9793
+ for (let t = K.length - 1; t >= 0; t--)
9794
+ if (e >= K[t].startDate)
9795
+ return K[t];
7905
9796
  return null;
7906
9797
  }
7907
- function Tt(e) {
7908
- const o = To(e);
7909
- return o ? e.getFullYear() - o.startDate.getFullYear() + 1 : null;
9798
+ function Po(e) {
9799
+ const t = At(e);
9800
+ return t ? e.getFullYear() - t.startDate.getFullYear() + 1 : null;
7910
9801
  }
7911
- const Pt = [
9802
+ const To = [
7912
9803
  "Farvardin",
7913
9804
  "Ordibehesht",
7914
9805
  "Khordad",
@@ -7922,10 +9813,10 @@ const Pt = [
7922
9813
  "Bahman",
7923
9814
  "Esfand"
7924
9815
  ];
7925
- function jt(e) {
9816
+ function xo(e) {
7926
9817
  return ((e - 474) % 2820 + 2820) % 2820 * 682 % 2816 < 682;
7927
9818
  }
7928
- const Po = [
9819
+ const Pt = [
7929
9820
  "Rat",
7930
9821
  "Ox",
7931
9822
  "Tiger",
@@ -7939,10 +9830,10 @@ const Po = [
7939
9830
  "Dog",
7940
9831
  "Pig"
7941
9832
  ];
7942
- function Nt(e) {
7943
- return Po[(e - 4) % 12];
9833
+ function Bo(e) {
9834
+ return Pt[(e - 4) % 12];
7944
9835
  }
7945
- const jo = [
9836
+ const Tt = [
7946
9837
  "Jia",
7947
9838
  "Yi",
7948
9839
  "Bing",
@@ -7954,46 +9845,46 @@ const jo = [
7954
9845
  "Ren",
7955
9846
  "Gui"
7956
9847
  ];
7957
- function Ft(e) {
7958
- return jo[(e - 4) % 10];
9848
+ function Mo(e) {
9849
+ return Tt[(e - 4) % 10];
7959
9850
  }
7960
- function Mt(e, o, r) {
7961
- const t = o || de[e], a = b(
7962
- () => le(e, t, r),
7963
- [e, t, r]
7964
- ), n = b(() => W[t], [t]), i = b(() => Ao(t, e), [t, e]);
9851
+ function Fo(e, t, i) {
9852
+ const o = t || le[e], r = b(
9853
+ () => de(e, o, i),
9854
+ [e, o, i]
9855
+ ), a = b(() => V[o], [o]), n = b(() => Dt(o, e), [o, e]);
7965
9856
  return {
7966
- calendar: t,
7967
- info: n,
7968
- current: i,
7969
- format: a.format,
7970
- formatWithEra: a.formatWithEra,
7971
- getMonthName: a.getMonthName,
7972
- getMonthNames: a.getMonthNames,
7973
- getWeekdayName: a.getWeekdayName,
7974
- getWeekdayNames: a.getWeekdayNames,
7975
- parseParts: a.parseParts,
7976
- getEraName: a.getEraName,
7977
- toCalendar: (s) => ce(s, t, e)
9857
+ calendar: o,
9858
+ info: a,
9859
+ current: n,
9860
+ format: r.format,
9861
+ formatWithEra: r.formatWithEra,
9862
+ getMonthName: r.getMonthName,
9863
+ getMonthNames: r.getMonthNames,
9864
+ getWeekdayName: r.getWeekdayName,
9865
+ getWeekdayNames: r.getWeekdayNames,
9866
+ parseParts: r.parseParts,
9867
+ getEraName: r.getEraName,
9868
+ toCalendar: (s) => ce(s, o, e)
7978
9869
  };
7979
9870
  }
7980
- function Ot() {
7981
- return Object.keys(W);
9871
+ function No() {
9872
+ return Object.keys(V);
7982
9873
  }
7983
- function Rt(e, o = "en") {
7984
- const r = { ...W[e] };
9874
+ function Ro(e, t = "en") {
9875
+ const i = { ...V[e] };
7985
9876
  try {
7986
- const t = D(o), n = new Intl.DisplayNames([t], { type: "calendar" }).of(e);
7987
- n && (r.displayName = n);
9877
+ const o = D(t), a = new Intl.DisplayNames([o], { type: "calendar" }).of(e);
9878
+ a && (i.displayName = a);
7988
9879
  } catch {
7989
9880
  }
7990
- return r;
9881
+ return i;
7991
9882
  }
7992
- function Lt(e) {
7993
- const o = de[e], r = /* @__PURE__ */ new Set([o]);
7994
- for (const [t, a] of Object.entries(W))
7995
- a.associatedLanguages.includes(e) && r.add(t);
7996
- return r.add("gregory"), Array.from(r);
9883
+ function Lo(e) {
9884
+ const t = le[e], i = /* @__PURE__ */ new Set([t]);
9885
+ for (const [o, r] of Object.entries(V))
9886
+ r.associatedLanguages.includes(e) && i.add(o);
9887
+ return i.add("gregory"), Array.from(i);
7997
9888
  }
7998
9889
  const J = {
7999
9890
  // Lowercase
@@ -8050,7 +9941,7 @@ const J = {
8050
9941
  X: "Χ",
8051
9942
  Y: "Ÿ",
8052
9943
  Z: "Ž"
8053
- }, No = {
9944
+ }, xt = {
8054
9945
  ...J,
8055
9946
  // Additional mappings
8056
9947
  a: "ặ",
@@ -8065,64 +9956,64 @@ const J = {
8065
9956
  O: "Ộ",
8066
9957
  U: "Ụ",
8067
9958
  Y: "Ỵ"
8068
- }, Fo = "‪", Mo = "‫", Q = "‬", Oo = "~∼~≈";
8069
- function Bt(e, o = !1) {
8070
- const r = o ? No : J;
8071
- return e.split("").map((t) => r[t] || t).join("");
9959
+ }, Bt = "‪", Mt = "‫", _ = "‬", Ft = "~∼~≈";
9960
+ function Oo(e, t = !1) {
9961
+ const i = t ? xt : J;
9962
+ return e.split("").map((o) => i[o] || o).join("");
8072
9963
  }
8073
- function It(e, o = "[", r = "]") {
8074
- return `${o}${e}${r}`;
9964
+ function Io(e, t = "[", i = "]") {
9965
+ return `${t}${e}${i}`;
8075
9966
  }
8076
- function Ro(e, o = 0.3, r = !1) {
8077
- if (r)
8078
- return Lo(e);
8079
- const a = Math.ceil(e.length * (1 + o)) - e.length;
8080
- if (a <= 0)
9967
+ function Nt(e, t = 0.3, i = !1) {
9968
+ if (i)
9969
+ return Rt(e);
9970
+ const r = Math.ceil(e.length * (1 + t)) - e.length;
9971
+ if (r <= 0)
8081
9972
  return e;
8082
- const n = Oo[0].repeat(a);
8083
- return e + n;
9973
+ const a = Ft[0].repeat(r);
9974
+ return e + a;
8084
9975
  }
8085
- function Lo(e) {
8086
- const o = /* @__PURE__ */ new Set(["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]);
8087
- return e.split("").map((r) => o.has(r) ? r + r : r).join("");
9976
+ function Rt(e) {
9977
+ const t = /* @__PURE__ */ new Set(["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]);
9978
+ return e.split("").map((i) => t.has(i) ? i + i : i).join("");
8088
9979
  }
8089
- function Bo(e, o = !1) {
8090
- return o ? `${Mo}${e}${Q}` : `${Fo}${e}${Q}`;
9980
+ function Lt(e, t = !1) {
9981
+ return t ? `${Mt}${e}${_}` : `${Bt}${e}${_}`;
8091
9982
  }
8092
- function pe(e, o = {}) {
9983
+ function ue(e, t = {}) {
8093
9984
  const {
8094
- addBrackets: r = !0,
8095
- expansionFactor: t = 0.3,
8096
- addAccents: a = !0,
8097
- addBidiMarkers: n = !1,
8098
- useVowelDoubling: i = !1,
9985
+ addBrackets: i = !0,
9986
+ expansionFactor: o = 0.3,
9987
+ addAccents: r = !0,
9988
+ addBidiMarkers: a = !1,
9989
+ useVowelDoubling: n = !1,
8099
9990
  preservePlaceholders: s = !0,
8100
- preserveHtml: d = !0,
8101
- prefix: l = "[",
8102
- suffix: p = "]"
8103
- } = o, f = /* @__PURE__ */ new Map();
8104
- let u = e, m = 0;
8105
- s && (u = u.replace(/\{[^}]+\}/g, (v) => {
9991
+ preserveHtml: l = !0,
9992
+ prefix: d = "[",
9993
+ suffix: u = "]"
9994
+ } = t, v = /* @__PURE__ */ new Map();
9995
+ let p = e, m = 0;
9996
+ s && (p = p.replace(/\{[^}]+\}/g, (f) => {
8106
9997
  const g = `__PH${m++}__`;
8107
- return f.set(g, v), g;
8108
- })), d && (u = u.replace(/<[^>]+>/g, (v) => {
9998
+ return v.set(g, f), g;
9999
+ })), l && (p = p.replace(/<[^>]+>/g, (f) => {
8109
10000
  const g = `__PH${m++}__`;
8110
- return f.set(g, v), g;
8111
- })), a && (u = Io(u, f)), t > 0 && (u = Ro(u, t, i)), n && (u = Bo(u)), r && (u = `${l}${u}${p}`);
8112
- for (const [v, g] of f.entries())
8113
- u = u.replace(v, g);
8114
- return u;
10001
+ return v.set(g, f), g;
10002
+ })), r && (p = Ot(p, v)), o > 0 && (p = Nt(p, o, n)), a && (p = Lt(p)), i && (p = `${d}${p}${u}`);
10003
+ for (const [f, g] of v.entries())
10004
+ p = p.replace(f, g);
10005
+ return p;
8115
10006
  }
8116
- function Io(e, o) {
8117
- const r = new Set(o.keys());
8118
- return e.split("").map((t) => {
8119
- for (const a of r)
8120
- if (e.includes(a) && a.includes(t))
8121
- return t;
8122
- return J[t] || t;
10007
+ function Ot(e, t) {
10008
+ const i = new Set(t.keys());
10009
+ return e.split("").map((o) => {
10010
+ for (const r of i)
10011
+ if (e.includes(r) && r.includes(o))
10012
+ return o;
10013
+ return J[o] || o;
8123
10014
  }).join("");
8124
10015
  }
8125
- function T(e) {
10016
+ function P(e) {
8126
10017
  switch (e) {
8127
10018
  case "accented":
8128
10019
  return {
@@ -8156,93 +10047,93 @@ function T(e) {
8156
10047
  };
8157
10048
  }
8158
10049
  }
8159
- function Wt(e, o) {
8160
- const r = {};
8161
- for (const [t, a] of Object.entries(e))
8162
- r[t] = pe(a, o);
8163
- return r;
10050
+ function Vo(e, t) {
10051
+ const i = {};
10052
+ for (const [o, r] of Object.entries(e))
10053
+ i[o] = ue(r, t);
10054
+ return i;
8164
10055
  }
8165
- function Wo(e) {
10056
+ function It(e) {
8166
10057
  return /[^\x00-\x7F]/.test(e);
8167
10058
  }
8168
- function Vo(e) {
10059
+ function Vt(e) {
8169
10060
  if (!e || /^[\d.,-]+$/.test(e) || e.startsWith("["))
8170
10061
  return !1;
8171
- const o = /[a-zA-Z]{2,}/.test(e), r = Wo(e);
8172
- return o && !r;
10062
+ const t = /[a-zA-Z]{2,}/.test(e), i = It(e);
10063
+ return t && !i;
8173
10064
  }
8174
- function Vt(e, o) {
8175
- const r = {
10065
+ function Ho(e, t) {
10066
+ const i = {
8176
10067
  totalKeys: Object.keys(e).length,
8177
10068
  hardcodedStrings: [],
8178
10069
  emptyValues: [],
8179
10070
  placeholderMismatches: [],
8180
10071
  potentialIssues: 0
8181
10072
  };
8182
- for (const [t, a] of Object.entries(e)) {
8183
- if (!a || a.trim() === "") {
8184
- r.emptyValues.push(t), r.potentialIssues++;
10073
+ for (const [o, r] of Object.entries(e)) {
10074
+ if (!r || r.trim() === "") {
10075
+ i.emptyValues.push(o), i.potentialIssues++;
8185
10076
  continue;
8186
10077
  }
8187
- if (Vo(a) && r.hardcodedStrings.push(t), o && o[t]) {
8188
- const n = X(a), i = X(o[t]), s = n.filter((l) => !i.includes(l)), d = i.filter((l) => !n.includes(l));
8189
- (s.length > 0 || d.length > 0) && (r.placeholderMismatches.push({
8190
- key: t,
10078
+ if (Vt(r) && i.hardcodedStrings.push(o), t && t[o]) {
10079
+ const a = Q(r), n = Q(t[o]), s = a.filter((d) => !n.includes(d)), l = n.filter((d) => !a.includes(d));
10080
+ (s.length > 0 || l.length > 0) && (i.placeholderMismatches.push({
10081
+ key: o,
8191
10082
  placeholders: [
8192
- ...s.map((l) => `-${l}`),
8193
- ...d.map((l) => `+${l}`)
10083
+ ...s.map((d) => `-${d}`),
10084
+ ...l.map((d) => `+${d}`)
8194
10085
  ]
8195
- }), r.potentialIssues++);
10086
+ }), i.potentialIssues++);
8196
10087
  }
8197
10088
  }
8198
- return r;
10089
+ return i;
8199
10090
  }
8200
- function X(e) {
8201
- return (e.match(/\{([^}]+)\}/g) || []).map((r) => r.replace(/[{}]/g, "").split(",")[0].trim());
10091
+ function Q(e) {
10092
+ return (e.match(/\{([^}]+)\}/g) || []).map((i) => i.replace(/[{}]/g, "").split(",")[0].trim());
8202
10093
  }
8203
- const ue = I(null);
8204
- function Ut({
10094
+ const pe = I(null);
10095
+ function qo({
8205
10096
  children: e,
8206
- initialEnabled: o = !1,
8207
- initialMode: r = "full"
10097
+ initialEnabled: t = !1,
10098
+ initialMode: i = "full"
8208
10099
  }) {
8209
- const [t, a] = P(o), [n, i] = P(r), s = b(() => T(n), [n]), d = b(() => (p) => t ? pe(p, s) : p, [t, s]), l = b(
10100
+ const [o, r] = T(t), [a, n] = T(i), s = b(() => P(a), [a]), l = b(() => (u) => o ? ue(u, s) : u, [o, s]), d = b(
8210
10101
  () => ({
8211
- enabled: t,
8212
- mode: n,
10102
+ enabled: o,
10103
+ mode: a,
8213
10104
  options: s,
8214
- toggle: () => a((p) => !p),
8215
- setMode: i,
8216
- transform: d
10105
+ toggle: () => r((u) => !u),
10106
+ setMode: n,
10107
+ transform: l
8217
10108
  }),
8218
- [t, n, s, d]
10109
+ [o, a, s, l]
8219
10110
  );
8220
- return /* @__PURE__ */ B(ue.Provider, { value: l, children: e });
10111
+ return /* @__PURE__ */ O(pe.Provider, { value: d, children: e });
8221
10112
  }
8222
- function Ht() {
8223
- const e = N(ue);
10113
+ function Wo() {
10114
+ const e = B(pe);
8224
10115
  return e || {
8225
10116
  enabled: !1,
8226
10117
  mode: "full",
8227
- options: T("full"),
10118
+ options: P("full"),
8228
10119
  toggle: () => {
8229
10120
  },
8230
10121
  setMode: () => {
8231
10122
  },
8232
- transform: (o) => o
10123
+ transform: (t) => t
8233
10124
  };
8234
10125
  }
8235
- const Kt = {
10126
+ const Uo = {
8236
10127
  /** Minimal: brackets only */
8237
10128
  MINIMAL: { addBrackets: !0, addAccents: !1, expansionFactor: 0 },
8238
10129
  /** Accented: brackets + accents */
8239
- ACCENTED: T("accented"),
10130
+ ACCENTED: P("accented"),
8240
10131
  /** Expanded: brackets + 30% expansion */
8241
- EXPANDED: T("expansion"),
10132
+ EXPANDED: P("expansion"),
8242
10133
  /** Bidi: brackets + RTL markers */
8243
- BIDI: T("bidi"),
10134
+ BIDI: P("bidi"),
8244
10135
  /** Full: brackets + accents + expansion */
8245
- FULL: T("full"),
10136
+ FULL: P("full"),
8246
10137
  /** Finnish: 40% expansion (Finnish is very long) */
8247
10138
  FINNISH: { addBrackets: !0, addAccents: !0, expansionFactor: 0.4 },
8248
10139
  /** German: 35% expansion */
@@ -8250,376 +10141,376 @@ const Kt = {
8250
10141
  /** CJK: Short expansion, no accents (CJK often shorter) */
8251
10142
  CJK: { addBrackets: !0, addAccents: !1, expansionFactor: -0.1 }
8252
10143
  };
8253
- class Uo {
8254
- constructor(o = 0) {
8255
- this.cache = /* @__PURE__ */ new Map(), this.ttl = o;
10144
+ class Ht {
10145
+ constructor(t = 0) {
10146
+ this.cache = /* @__PURE__ */ new Map(), this.ttl = t;
8256
10147
  }
8257
- getCacheKey(o, r) {
8258
- return r ? `${o}:${r}` : o;
10148
+ getCacheKey(t, i) {
10149
+ return i ? `${t}:${i}` : t;
8259
10150
  }
8260
- get(o, r) {
8261
- const t = this.getCacheKey(o, r), a = this.cache.get(t);
8262
- return a ? this.ttl > 0 && Date.now() > a.expiresAt ? (this.cache.delete(t), null) : a.data : null;
10151
+ get(t, i) {
10152
+ const o = this.getCacheKey(t, i), r = this.cache.get(o);
10153
+ return r ? this.ttl > 0 && Date.now() > r.expiresAt ? (this.cache.delete(o), null) : r.data : null;
8263
10154
  }
8264
- set(o, r, t) {
8265
- const a = this.getCacheKey(o, t), n = Date.now();
8266
- this.cache.set(a, {
8267
- data: r,
8268
- loadedAt: n,
8269
- expiresAt: this.ttl > 0 ? n + this.ttl : 1 / 0
10155
+ set(t, i, o) {
10156
+ const r = this.getCacheKey(t, o), a = Date.now();
10157
+ this.cache.set(r, {
10158
+ data: i,
10159
+ loadedAt: a,
10160
+ expiresAt: this.ttl > 0 ? a + this.ttl : 1 / 0
8270
10161
  });
8271
10162
  }
8272
- has(o, r) {
8273
- return this.get(o, r) !== null;
10163
+ has(t, i) {
10164
+ return this.get(t, i) !== null;
8274
10165
  }
8275
- delete(o, r) {
8276
- if (r)
8277
- this.cache.delete(this.getCacheKey(o, r));
10166
+ delete(t, i) {
10167
+ if (i)
10168
+ this.cache.delete(this.getCacheKey(t, i));
8278
10169
  else
8279
- for (const t of this.cache.keys())
8280
- (t === o || t.startsWith(`${o}:`)) && this.cache.delete(t);
10170
+ for (const o of this.cache.keys())
10171
+ (o === t || o.startsWith(`${t}:`)) && this.cache.delete(o);
8281
10172
  }
8282
10173
  clear() {
8283
10174
  this.cache.clear();
8284
10175
  }
8285
10176
  getStats() {
8286
- const o = /* @__PURE__ */ new Set();
8287
- for (const r of this.cache.keys())
8288
- o.add(r.split(":")[0]);
10177
+ const t = /* @__PURE__ */ new Set();
10178
+ for (const i of this.cache.keys())
10179
+ t.add(i.split(":")[0]);
8289
10180
  return {
8290
10181
  size: this.cache.size,
8291
- languages: Array.from(o)
10182
+ languages: Array.from(t)
8292
10183
  };
8293
10184
  }
8294
10185
  }
8295
10186
  function me(e) {
8296
10187
  const {
8297
- loadFn: o,
8298
- fallbackLang: r = "en",
8299
- cacheTtl: t = 0,
8300
- preloadLanguages: a = [],
8301
- namespaces: n = [],
8302
- defaultNamespace: i,
10188
+ loadFn: t,
10189
+ fallbackLang: i = "en",
10190
+ cacheTtl: o = 0,
10191
+ preloadLanguages: r = [],
10192
+ namespaces: a = [],
10193
+ defaultNamespace: n,
8303
10194
  onLoadStart: s,
8304
- onLoadComplete: d,
8305
- onLoadError: l
8306
- } = e, p = new Uo(t), f = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();
8307
- let m = r;
8308
- const v = /* @__PURE__ */ new Set();
10195
+ onLoadComplete: l,
10196
+ onLoadError: d
10197
+ } = e, u = new Ht(o), v = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Map();
10198
+ let m = i;
10199
+ const f = /* @__PURE__ */ new Set();
8309
10200
  function g() {
8310
- const c = C();
8311
- v.forEach((h) => h(c));
10201
+ const c = z();
10202
+ f.forEach((h) => h(c));
8312
10203
  }
8313
- function E(c, h) {
10204
+ function y(c, h) {
8314
10205
  return h ? `${c}:${h}` : c;
8315
10206
  }
8316
- function C() {
10207
+ function z() {
8317
10208
  const c = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set();
8318
- for (const S of j)
8319
- p.has(S) && c.add(S);
8320
- for (const S of f) {
8321
- const O = S.split(":")[0];
8322
- h.add(O);
10209
+ for (const C of x)
10210
+ u.has(C) && c.add(C);
10211
+ for (const C of v) {
10212
+ const N = C.split(":")[0];
10213
+ h.add(N);
8323
10214
  }
8324
10215
  return {
8325
10216
  loadedLanguages: c,
8326
10217
  loadingLanguages: h,
8327
- failedLanguages: new Map(u),
10218
+ failedLanguages: new Map(p),
8328
10219
  currentLanguage: m
8329
10220
  };
8330
10221
  }
8331
- async function y(c, h) {
8332
- const S = E(c, h), O = p.get(c, h);
8333
- if (O)
8334
- return O;
8335
- if (f.has(S))
8336
- return new Promise((z) => {
10222
+ async function k(c, h) {
10223
+ const C = y(c, h), N = u.get(c, h);
10224
+ if (N)
10225
+ return N;
10226
+ if (v.has(C))
10227
+ return new Promise((S) => {
8337
10228
  const R = setInterval(() => {
8338
- f.has(S) || (clearInterval(R), z(p.get(c, h)));
10229
+ v.has(C) || (clearInterval(R), S(u.get(c, h)));
8339
10230
  }, 50);
8340
10231
  });
8341
- f.add(S), u.delete(c), s == null || s(c, h), g();
10232
+ v.add(C), p.delete(c), s == null || s(c, h), g();
8342
10233
  try {
8343
- const z = await o(c, h);
8344
- return p.set(c, z, h), d == null || d(c, h), z;
8345
- } catch (z) {
8346
- const R = z instanceof Error ? z : new Error(String(z));
8347
- return u.set(c, R), l == null || l(c, R, h), c !== r && !h ? (console.warn(`Failed to load ${c}, falling back to ${r}`), y(r, h)) : null;
10234
+ const S = await t(c, h);
10235
+ return u.set(c, S, h), l == null || l(c, h), S;
10236
+ } catch (S) {
10237
+ const R = S instanceof Error ? S : new Error(String(S));
10238
+ return p.set(c, R), d == null || d(c, R, h), c !== i && !h ? (console.warn(`Failed to load ${c}, falling back to ${i}`), k(i, h)) : null;
8348
10239
  } finally {
8349
- f.delete(S), g();
10240
+ v.delete(C), g();
8350
10241
  }
8351
10242
  }
8352
- async function A(c) {
8353
- await Promise.all(c.map((h) => y(h)));
10243
+ async function j(c) {
10244
+ await Promise.all(c.map((h) => k(h)));
8354
10245
  }
8355
- async function w() {
8356
- a.length !== 0 && await Promise.allSettled(
8357
- a.map((c) => n.length > 0 ? Promise.all(n.map((h) => y(c, h))) : y(c))
10246
+ async function E() {
10247
+ r.length !== 0 && await Promise.allSettled(
10248
+ r.map((c) => a.length > 0 ? Promise.all(a.map((h) => k(c, h))) : k(c))
8358
10249
  );
8359
10250
  }
8360
- function M(c, h) {
8361
- return p.get(c, h);
10251
+ function F(c, h) {
10252
+ return u.get(c, h);
8362
10253
  }
8363
- function x(c, h) {
8364
- return p.has(c, h);
10254
+ function A(c, h) {
10255
+ return u.has(c, h);
8365
10256
  }
8366
10257
  function he(c) {
8367
- for (const h of f)
10258
+ for (const h of v)
8368
10259
  if (h === c || h.startsWith(`${c}:`))
8369
10260
  return !0;
8370
10261
  return !1;
8371
10262
  }
8372
- function fe() {
8373
- return p.getStats().languages;
10263
+ function ve() {
10264
+ return u.getStats().languages;
8374
10265
  }
8375
- function ve(c) {
8376
- c ? p.delete(c) : p.clear(), g();
10266
+ function fe(c) {
10267
+ c ? u.delete(c) : u.clear(), g();
8377
10268
  }
8378
10269
  async function be(c) {
8379
- x(c) || await y(c), m = c, g();
10270
+ A(c) || await k(c), m = c, g();
8380
10271
  }
8381
- function ke() {
10272
+ function we() {
8382
10273
  return m;
8383
10274
  }
8384
- function we(c) {
8385
- return v.add(c), () => v.delete(c);
10275
+ function Ee(c) {
10276
+ return f.add(c), () => f.delete(c);
8386
10277
  }
8387
10278
  return {
8388
- loadLanguage: y,
8389
- loadLanguages: A,
8390
- preloadLanguages: w,
8391
- getTranslations: M,
8392
- isLoaded: x,
10279
+ loadLanguage: k,
10280
+ loadLanguages: j,
10281
+ preloadLanguages: E,
10282
+ getTranslations: F,
10283
+ isLoaded: A,
8393
10284
  isLoading: he,
8394
- getLoadedLanguages: fe,
8395
- clearCache: ve,
8396
- getState: C,
10285
+ getLoadedLanguages: ve,
10286
+ clearCache: fe,
10287
+ getState: z,
8397
10288
  setLanguage: be,
8398
- getCurrentLanguage: ke,
8399
- subscribe: we
10289
+ getCurrentLanguage: we,
10290
+ subscribe: Ee
8400
10291
  };
8401
10292
  }
8402
- function Zt(e, o) {
10293
+ function Ko(e, t) {
8403
10294
  return me({
8404
- ...o,
8405
- loadFn: async (r, t) => {
8406
- const a = t ? `${e}/${r}/${t}.json` : `${e}/${r}.json`, n = await fetch(a);
8407
- if (!n.ok)
8408
- throw new Error(`Failed to load translations: ${n.status}`);
8409
- return n.json();
10295
+ ...t,
10296
+ loadFn: async (i, o) => {
10297
+ const r = o ? `${e}/${i}/${o}.json` : `${e}/${i}.json`, a = await fetch(r);
10298
+ if (!a.ok)
10299
+ throw new Error(`Failed to load translations: ${a.status}`);
10300
+ return a.json();
8410
10301
  }
8411
10302
  });
8412
10303
  }
8413
- function qt(e, o) {
10304
+ function Go(e, t) {
8414
10305
  return me({
8415
- ...o,
8416
- loadFn: async (r, t) => (await e(r, t)).default
10306
+ ...t,
10307
+ loadFn: async (i, o) => (await e(i, o)).default
8417
10308
  });
8418
10309
  }
8419
10310
  const ge = I(null);
8420
- function Gt({
10311
+ function Zo({
8421
10312
  children: e,
8422
- loader: o,
8423
- initialLanguage: r,
8424
- namespace: t
10313
+ loader: t,
10314
+ initialLanguage: i,
10315
+ namespace: o
8425
10316
  }) {
8426
- const [a, n] = P(() => o.getState()), [i, s] = P(null);
8427
- L(() => o.subscribe(n), [o]), L(() => {
8428
- r && !o.isLoaded(r, t) && o.loadLanguage(r, t).catch(s);
8429
- }, [o, r, t]);
8430
- const d = b(() => o.getTranslations(a.currentLanguage, t) || {}, [o, a.currentLanguage, t]), l = ee(
8431
- async (f) => {
10317
+ const [r, a] = T(() => t.getState()), [n, s] = T(null);
10318
+ L(() => t.subscribe(a), [t]), L(() => {
10319
+ i && !t.isLoaded(i, o) && t.loadLanguage(i, o).catch(s);
10320
+ }, [t, i, o]);
10321
+ const l = b(() => t.getTranslations(r.currentLanguage, o) || {}, [t, r.currentLanguage, o]), d = ee(
10322
+ async (v) => {
8432
10323
  s(null);
8433
10324
  try {
8434
- await o.setLanguage(f);
8435
- } catch (u) {
8436
- s(u instanceof Error ? u : new Error(String(u)));
10325
+ await t.setLanguage(v);
10326
+ } catch (p) {
10327
+ s(p instanceof Error ? p : new Error(String(p)));
8437
10328
  }
8438
10329
  },
8439
- [o]
8440
- ), p = b(
10330
+ [t]
10331
+ ), u = b(
8441
10332
  () => ({
8442
- loader: o,
8443
- translations: d,
8444
- isLoading: a.loadingLanguages.size > 0,
8445
- error: i,
8446
- setLanguage: l,
8447
- currentLanguage: a.currentLanguage,
8448
- loadedLanguages: Array.from(a.loadedLanguages)
10333
+ loader: t,
10334
+ translations: l,
10335
+ isLoading: r.loadingLanguages.size > 0,
10336
+ error: n,
10337
+ setLanguage: d,
10338
+ currentLanguage: r.currentLanguage,
10339
+ loadedLanguages: Array.from(r.loadedLanguages)
8449
10340
  }),
8450
- [o, d, a, i, l]
10341
+ [t, l, r, n, d]
8451
10342
  );
8452
- return /* @__PURE__ */ B(ge.Provider, { value: p, children: e });
10343
+ return /* @__PURE__ */ O(ge.Provider, { value: u, children: e });
8453
10344
  }
8454
- function Ho() {
8455
- const e = N(ge);
10345
+ function qt() {
10346
+ const e = B(ge);
8456
10347
  if (!e)
8457
10348
  throw new Error("useDynamicI18n must be used within DynamicI18nProvider");
8458
10349
  return e;
8459
10350
  }
8460
- function Jt(e) {
8461
- const { translations: o, currentLanguage: r, loader: t, isLoading: a } = Ho();
10351
+ function Jo(e) {
10352
+ const { translations: t, currentLanguage: i, loader: o, isLoading: r } = qt();
8462
10353
  return L(() => {
8463
- e && !t.isLoaded(r, e) && t.loadLanguage(r, e);
8464
- }, [t, r, e]), { t: ee(
8465
- (i, s) => {
8466
- let d = o[i] || i;
10354
+ e && !o.isLoaded(i, e) && o.loadLanguage(i, e);
10355
+ }, [o, i, e]), { t: ee(
10356
+ (n, s) => {
10357
+ let l = t[n] || n;
8467
10358
  if (s)
8468
- for (const [l, p] of Object.entries(s))
8469
- d = d.replace(new RegExp(`\\{${l}\\}`, "g"), String(p));
8470
- return d;
10359
+ for (const [d, u] of Object.entries(s))
10360
+ l = l.replace(new RegExp(`\\{${d}\\}`, "g"), String(u));
10361
+ return l;
8471
10362
  },
8472
- [o]
8473
- ), isLoading: a, currentLanguage: r };
10363
+ [t]
10364
+ ), isLoading: r, currentLanguage: i };
8474
10365
  }
8475
- function Yt(e, o, r) {
8476
- switch (r) {
10366
+ function Xo(e, t, i) {
10367
+ switch (i) {
8477
10368
  case "immediate":
8478
- e.loadLanguages(o);
10369
+ e.loadLanguages(t);
8479
10370
  break;
8480
10371
  case "idle":
8481
10372
  "requestIdleCallback" in window ? window.requestIdleCallback(() => {
8482
- e.loadLanguages(o);
8483
- }) : setTimeout(() => e.loadLanguages(o), 1e3);
10373
+ e.loadLanguages(t);
10374
+ }) : setTimeout(() => e.loadLanguages(t), 1e3);
8484
10375
  break;
8485
10376
  case "visible":
8486
10377
  if ("IntersectionObserver" in window) {
8487
- const t = new IntersectionObserver(
10378
+ const o = new IntersectionObserver(
8488
10379
  () => {
8489
- e.loadLanguages(o), t.disconnect();
10380
+ e.loadLanguages(t), o.disconnect();
8490
10381
  },
8491
10382
  { threshold: 0.1 }
8492
10383
  );
8493
- t.observe(document.body);
10384
+ o.observe(document.body);
8494
10385
  } else
8495
- e.loadLanguages(o);
10386
+ e.loadLanguages(t);
8496
10387
  break;
8497
10388
  case "interaction": {
8498
- const t = () => {
8499
- e.loadLanguages(o), window.removeEventListener("click", t), window.removeEventListener("keydown", t), window.removeEventListener("touchstart", t);
10389
+ const o = () => {
10390
+ e.loadLanguages(t), window.removeEventListener("click", o), window.removeEventListener("keydown", o), window.removeEventListener("touchstart", o);
8500
10391
  };
8501
- window.addEventListener("click", t, { once: !0 }), window.addEventListener("keydown", t, { once: !0 }), window.addEventListener("touchstart", t, { once: !0 });
10392
+ window.addEventListener("click", o, { once: !0 }), window.addEventListener("keydown", o, { once: !0 }), window.addEventListener("touchstart", o, { once: !0 });
8502
10393
  break;
8503
10394
  }
8504
10395
  }
8505
10396
  }
8506
- async function $t(e, o) {
8507
- const { fallback: r = "en", preferredLanguages: t = [] } = o || {};
8508
- for (const n of t)
8509
- if (j.includes(n))
8510
- return await e.setLanguage(n), n;
8511
- const a = navigator.language.split("-")[0].toLowerCase();
8512
- return j.includes(a) ? (await e.setLanguage(a), a) : (await e.setLanguage(r), r);
10397
+ async function Yo(e, t) {
10398
+ const { fallback: i = "en", preferredLanguages: o = [] } = t || {};
10399
+ for (const a of o)
10400
+ if (x.includes(a))
10401
+ return await e.setLanguage(a), a;
10402
+ const r = navigator.language.split("-")[0].toLowerCase();
10403
+ return x.includes(r) ? (await e.setLanguage(r), r) : (await e.setLanguage(i), i);
8513
10404
  }
8514
10405
  export {
8515
- W as CALENDAR_INFO,
8516
- jo as CELESTIAL_STEMS,
8517
- Po as CHINESE_ZODIAC,
8518
- de as DEFAULT_CALENDAR,
8519
- Gt as DynamicI18nProvider,
8520
- Dt as HEBREW_MONTHS,
8521
- At as HEBREW_MONTHS_LEAP,
8522
- St as HIJRI_MONTHS,
8523
- Z as JAPANESE_ERAS,
8524
- ne as NICE_GLOSSARY,
8525
- k as NICE_I18N_DICTIONARIES,
8526
- _e as NICE_I18N_VARIANTS,
8527
- j as NICE_SUPPORTED_LANGS,
8528
- Go as NiceI18nProvider,
8529
- Pt as PERSIAN_MONTHS,
8530
- Kt as PSEUDO_PRESETS,
8531
- Ut as PseudoLocalizationProvider,
8532
- at as RTLProvider,
8533
- U as RTL_CSS_VARS,
8534
- no as RTL_LANGUAGES,
8535
- ie as TIMEZONE_GROUPS,
8536
- Bt as addAccents,
8537
- Bo as addBidiMarkers,
8538
- It as addBrackets,
8539
- Vt as analyzeDictionary,
8540
- st as analyzeStylesForRTL,
8541
- Wo as containsNonAscii,
10406
+ V as CALENDAR_INFO,
10407
+ Tt as CELESTIAL_STEMS,
10408
+ Pt as CHINESE_ZODIAC,
10409
+ le as DEFAULT_CALENDAR,
10410
+ Zo as DynamicI18nProvider,
10411
+ Do as HEBREW_MONTHS,
10412
+ jo as HEBREW_MONTHS_LEAP,
10413
+ Co as HIJRI_MONTHS,
10414
+ K as JAPANESE_ERAS,
10415
+ ae as NICE_GLOSSARY,
10416
+ w as NICE_I18N_DICTIONARIES,
10417
+ $e as NICE_I18N_VARIANTS,
10418
+ x as NICE_SUPPORTED_LANGS,
10419
+ Gt as NiceI18nProvider,
10420
+ To as PERSIAN_MONTHS,
10421
+ Uo as PSEUDO_PRESETS,
10422
+ qo as PseudoLocalizationProvider,
10423
+ io as RTLProvider,
10424
+ q as RTL_CSS_VARS,
10425
+ at as RTL_LANGUAGES,
10426
+ ne as TIMEZONE_GROUPS,
10427
+ Oo as addAccents,
10428
+ Lt as addBidiMarkers,
10429
+ Io as addBrackets,
10430
+ Ho as analyzeDictionary,
10431
+ no as analyzeStylesForRTL,
10432
+ It as containsNonAscii,
8542
10433
  se as convertTimezone,
8543
- le as createCalendarFormatter,
8544
- ko as createCurrencyFormatter,
8545
- fo as createDateFormatter,
10434
+ de as createCalendarFormatter,
10435
+ bt as createCurrencyFormatter,
10436
+ ht as createDateFormatter,
8546
10437
  me as createDynamicLoader,
8547
- Zt as createFetchLoader,
8548
- Qo as createICUTranslator,
8549
- qt as createImportLoader,
8550
- bo as createNumberFormatter,
8551
- vo as createTimeFormatter,
8552
- zo as createTimezoneFormatter,
8553
- Yo as createTranslator,
8554
- $t as detectAndLoad,
8555
- _o as detectBrowserLanguage,
8556
- Vo as detectHardcodedText,
8557
- G as detectTimezone,
8558
- Ro as expandText,
8559
- ft as findSimilarTranslation,
8560
- co as flipAlignment,
8561
- rt as flipHorizontal,
8562
- ao as formatICU,
8563
- $o as formatMessage,
8564
- So as fromUTC,
8565
- pt as generateCoverageReport,
8566
- ct as generateTranslationCode,
8567
- wt as getAllTimezones,
8568
- go as getAllTranslationStats,
8569
- Ot as getAvailableCalendars,
8570
- Rt as getCalendarInfo,
8571
- Ft as getCelestialStem,
8572
- Nt as getChineseZodiac,
8573
- Ao as getCurrentCalendarDate,
8574
- tt as getDocumentDirection,
8575
- vt as getGlossaryForLanguage,
8576
- zt as getHijriMonthDays,
8577
- To as getJapaneseEra,
8578
- Tt as getJapaneseYear,
10438
+ Ko as createFetchLoader,
10439
+ $t as createICUTranslator,
10440
+ Go as createImportLoader,
10441
+ ft as createNumberFormatter,
10442
+ vt as createTimeFormatter,
10443
+ Ct as createTimezoneFormatter,
10444
+ Jt as createTranslator,
10445
+ Yo as detectAndLoad,
10446
+ Yt as detectBrowserLanguage,
10447
+ Vt as detectHardcodedText,
10448
+ Z as detectTimezone,
10449
+ Nt as expandText,
10450
+ vo as findSimilarTranslation,
10451
+ dt as flipAlignment,
10452
+ oo as flipHorizontal,
10453
+ rt as formatICU,
10454
+ Xt as formatMessage,
10455
+ zt as fromUTC,
10456
+ uo as generateCoverageReport,
10457
+ co as generateTranslationCode,
10458
+ Eo as getAllTimezones,
10459
+ mt as getAllTranslationStats,
10460
+ No as getAvailableCalendars,
10461
+ Ro as getCalendarInfo,
10462
+ Mo as getCelestialStem,
10463
+ Bo as getChineseZodiac,
10464
+ Dt as getCurrentCalendarDate,
10465
+ to as getDocumentDirection,
10466
+ fo as getGlossaryForLanguage,
10467
+ So as getHijriMonthDays,
10468
+ At as getJapaneseEra,
10469
+ Po as getJapaneseYear,
8579
10470
  D as getLocaleTag,
8580
- po as getLogicalProperty,
8581
- uo as getMissingTranslations,
8582
- Et as getNextDSTTransition,
8583
- re as getOrdinalCategory,
8584
- te as getPluralCategory,
8585
- T as getPseudoLocalizationPreset,
8586
- dt as getRTLCSSVars,
8587
- Lt as getRecommendedCalendars,
8588
- lt as getSourceKeys,
8589
- io as getTextDirection,
8590
- F as getTimezoneInfo,
8591
- yt as getTimezonesGrouped,
8592
- mo as getTranslationStats,
8593
- H as isDSTActive,
8594
- xt as isHebrewLeapYear,
8595
- xo as isHijriLeapYear,
8596
- jt as isPersianLeapYear,
8597
- ae as isRTLLanguage,
8598
- Xe as isSupported,
8599
- kt as isValidTimezone,
8600
- yo as lookupGlossary,
8601
- et as ordinal,
8602
- Xo as plural,
8603
- Yt as preloadWithStrategy,
8604
- pe as pseudoLocalize,
8605
- Wt as pseudoLocalizeDictionary,
8606
- qo as resolvePlVariant,
8607
- lo as rtlValue,
8608
- ot as select,
8609
- so as setDocumentDirection,
10471
+ ct as getLogicalProperty,
10472
+ ut as getMissingTranslations,
10473
+ yo as getNextDSTTransition,
10474
+ ie as getOrdinalCategory,
10475
+ oe as getPluralCategory,
10476
+ P as getPseudoLocalizationPreset,
10477
+ so as getRTLCSSVars,
10478
+ Lo as getRecommendedCalendars,
10479
+ lo as getSourceKeys,
10480
+ nt as getTextDirection,
10481
+ M as getTimezoneInfo,
10482
+ ko as getTimezonesGrouped,
10483
+ pt as getTranslationStats,
10484
+ W as isDSTActive,
10485
+ Ao as isHebrewLeapYear,
10486
+ jt as isHijriLeapYear,
10487
+ xo as isPersianLeapYear,
10488
+ re as isRTLLanguage,
10489
+ Qe as isSupported,
10490
+ wo as isValidTimezone,
10491
+ Et as lookupGlossary,
10492
+ Qt as ordinal,
10493
+ _t as plural,
10494
+ Xo as preloadWithStrategy,
10495
+ ue as pseudoLocalize,
10496
+ Vo as pseudoLocalizeDictionary,
10497
+ Kt as resolvePlVariant,
10498
+ lt as rtlValue,
10499
+ eo as select,
10500
+ st as setDocumentDirection,
8610
10501
  ce as toCalendar,
8611
- Co as toUTC,
8612
- Mt as useCalendar,
8613
- Ho as useDynamicI18n,
8614
- Jt as useDynamicTranslation,
8615
- it as useIsRTL,
8616
- ht as useNiceCurrencyFormat,
8617
- ut as useNiceDateFormat,
8618
- gt as useNiceNumberFormat,
8619
- mt as useNiceTimeFormat,
8620
- Jo as useNiceTranslation,
8621
- Ht as usePseudoLocalization,
8622
- nt as useRTL,
8623
- Ct as useTimezone,
8624
- bt as validateAgainstGlossary
10502
+ yt as toUTC,
10503
+ Fo as useCalendar,
10504
+ qt as useDynamicI18n,
10505
+ Jo as useDynamicTranslation,
10506
+ ao as useIsRTL,
10507
+ ho as useNiceCurrencyFormat,
10508
+ po as useNiceDateFormat,
10509
+ go as useNiceNumberFormat,
10510
+ mo as useNiceTimeFormat,
10511
+ Zt as useNiceTranslation,
10512
+ Wo as usePseudoLocalization,
10513
+ ro as useRTL,
10514
+ zo as useTimezone,
10515
+ bo as validateAgainstGlossary
8625
10516
  };