// Bara app-kromet. Steg-/fält-/villkorsnamn kommer tvåspråkigt från // /api/step-schema (rpa/schema.py) och slås upp med fieldLabel(). export type Lang = "sv" | "en"; const STRINGS = { en: { app_title: "RPA Tool", page_title: "RPA Tool – flow builder", new_flow: "New flow", delete_flow: "Delete flow", save: "Save", saved: "Saved", unsaved: "Unsaved changes", run: "Run flow", close_browser: "Close browser", show_trace: "Show trace", wiki: "Wiki", settings: "⚙ Settings", export: "Export as script", close_always: "Close the browser", close_on_success: "Keep open on error", close_never: "Always keep open", add_step: "+ Add step", add_step_after: "Add step after", add_step_in: "+ Add step", add_branch: "+ Add branch", else_toggle: "…else (else)", remove: "Remove", remove_branch: "Remove", branch_if: "If", branch_else_if: "…else if", branch_case: "Branch {n}", out_next: "next", start_node: "▶ start = top node", unknown_step: "Unknown step type", tab_main: "Main", tab_add: "New subflow", tab_run: "Run this tab", subflow_name_prompt: "Subflow name:", subflow_delete_confirm: "Delete this subflow?", subflow_in_use: "A call_flow node still targets this subflow. Delete anyway?", leave_unsaved: "Discard unsaved changes and open the other flow?", callflow_target: "Target", callflow_local: "This file", callflow_external: "Other flows", callflow_open: "Open", callflow_in: "Inputs →", callflow_out: "Outputs ←", callflow_in_name: "input name", callflow_in_value: "value / {var}", callflow_out_from: "subflow var", callflow_out_to: "caller var", callflow_add_in: "+ input", callflow_add_out: "+ output", add_field: "+ Add column", column_name: "Column name", label_ph: "Label (optional)", on_error_stop: "On error: stop", on_error_continue: "On error: continue", enabled_title: "Enabled (unchecked = skipped when running)", move_up: "Move up", move_down: "Move down", run_log: "Run log", variables: "Variables", no_vars: "No variables yet.", vars_hint: "Click a name to see its content (filled in once the flow finishes).", assist_title: "AI assistant", assist_hint: "Describe in plain language what the flow should do. The suggestion replaces the canvas (unsaved) so you can review it before saving/running.", assist_ph: "e.g. Go to example.com, wait for login, list all links and save them as CSV", assist_btn: "Suggest changes", assist_working: "Thinking…", assist_applied: "Suggestion applied — review, then Save / Run flow.", assist_unavailable: "Set ANTHROPIC_API_KEY (or run `ant auth login`) and restart the server to use this.", assist_failed: "Could not generate a flow: {msg}", status_running: "Running…", status_done: "Done", status_error: "Error", condition: "Condition", new_flow_prompt: "Name of new flow:", delete_flow_confirm: 'Delete the flow "{name}"?', settings_hint: "Saved with the flow, so they travel along when you export it as a standalone script.", cancel: "Cancel", fit_view: "Fit to view", relayout: "Auto-arrange", var_list: "list, {n} item(s)", var_object: "object", var_text: "text, {n} chars", save_failed: "Save failed: {msg}", menu: "Menu", menu_flow: "Flow", menu_view: "View", menu_run: "Run", menu_tools: "Tools", language: "Language", run_settings: "Run settings…", inspect_window: "Inspect window", inspect_hint: "Pick a running window to list its controls — use name / auto_id / control_type in the desktop steps.", inspect_pick: "Window", inspect_load: "Load controls", inspect_unavailable: "Windows only — pywinauto could not be loaded.", inspect_make_click: "New desktop_click", inspect_make_type: "New desktop_type", inspect_copy: "Copy selector", inspect_none: "No windows found.", palette: "Steps", palette_search: "Search…", palette_blocks: "Blocks", palette_toggle: "Show/hide the step palette", palette_click_add: "Click + (or double-click) to add, or drag onto the canvas", block_save_selection: "💾 Save selection as block", block_insert: "Insert", block_none: "No blocks yet. Select nodes on the canvas and save them as a block.", block_name_prompt: "Block name:", block_desc_prompt: "Short description (optional):", block_saved: "Block saved.", block_select_first: "Select one or more nodes on the canvas first.", change_type: "Change step type", run_params_menu: "Run parameters / inputs", runp_title: "Run parameters", runp_hint: "Fill in the flow's input variables, or pick a saved value set. Used as {name} in the steps.", runp_set: "Value set", runp_set_none: "(none)", runp_save_set: "💾 Save as set", runp_set_name_prompt: "Name for the value set:", runp_add_var: "+ Add variable", runp_var_name: "name", runp_var_value: "value", inputs_title: "Run parameters / inputs", inputs_hint: "Declare the variables the flow expects at run time. They appear in the run dialog and resolve as {name}.", inputs_add: "+ Add input", inputs_sets: "Saved value sets", inputs_set_rename: "Rename", }, sv: { app_title: "RPA-verktyg", page_title: "RPA-verktyg – flödesbyggare", new_flow: "Nytt flöde", delete_flow: "Ta bort flöde", save: "Spara", saved: "Sparat", unsaved: "Osparade ändringar", run: "Kör flöde", close_browser: "Stäng webbläsare", show_trace: "Visa trace", wiki: "Wiki", settings: "⚙ Inställningar", export: "Exportera som script", close_always: "Stäng webbläsaren", close_on_success: "Håll öppen vid fel", close_never: "Håll alltid öppen", add_step: "+ Lägg till steg", add_step_after: "Lägg till steg efter", add_step_in: "+ Lägg till steg", add_branch: "+ Lägg till gren", else_toggle: "…annars (else)", remove: "Ta bort", remove_branch: "Ta bort", branch_if: "Om", branch_else_if: "…annars om", branch_case: "Gren {n}", out_next: "nästa", start_node: "▶ start = översta noden", unknown_step: "Okänd stegtyp", tab_main: "Main", tab_add: "Nytt subflöde", tab_run: "Kör denna flik", subflow_name_prompt: "Subflödets namn:", subflow_delete_confirm: "Ta bort det här subflödet?", subflow_in_use: "En call_flow-nod pekar fortfarande på det här subflödet. Ta bort ändå?", leave_unsaved: "Kasta osparade ändringar och öppna det andra flödet?", callflow_target: "Mål", callflow_local: "Detta flöde", callflow_external: "Andra flöden", callflow_open: "Öppna", callflow_in: "Indata →", callflow_out: "Utdata ←", callflow_in_name: "indata-namn", callflow_in_value: "värde / {var}", callflow_out_from: "subflödets variabel", callflow_out_to: "anroparens variabel", callflow_add_in: "+ indata", callflow_add_out: "+ utdata", add_field: "+ Lägg till kolumn", column_name: "Kolumnnamn", label_ph: "Etikett (valfri)", on_error_stop: "Vid fel: stanna", on_error_continue: "Vid fel: fortsätt", enabled_title: "Aktiverat (avbockad = hoppas över vid körning)", move_up: "Flytta upp", move_down: "Flytta ner", run_log: "Körlogg", variables: "Variabler", no_vars: "Inga variabler ännu.", vars_hint: "Klicka på ett namn för att se innehållet (fylls i när flödet är klart).", assist_title: "AI-assistent", assist_hint: "Beskriv i klartext vad flödet ska göra. Förslaget ersätter canvasen (osparat) så du kan granska det innan du sparar/kör.", assist_ph: "t.ex. Gå till example.com, vänta på inloggning, lista alla länkar och spara som CSV", assist_btn: "Föreslå ändringar", assist_working: "Tänker…", assist_applied: "Förslag infogat — granska, sedan Spara / Kör flöde.", assist_unavailable: "Sätt ANTHROPIC_API_KEY (eller kör `ant auth login`) och starta om servern för att använda detta.", assist_failed: "Kunde inte generera ett flöde: {msg}", status_running: "Kör…", status_done: "Klar", status_error: "Fel", condition: "Villkor", new_flow_prompt: "Namn på nytt flöde:", delete_flow_confirm: 'Ta bort flödet "{name}"?', settings_hint: "Sparas med flödet, så de följer med om du exporterar det som ett fristående script.", cancel: "Avbryt", fit_view: "Anpassa till vy", relayout: "Autoplacera", var_list: "lista, {n} post(er)", var_object: "objekt", var_text: "text, {n} tecken", save_failed: "Kunde inte spara: {msg}", menu: "Meny", menu_flow: "Flöde", menu_view: "Visning", menu_run: "Körning", menu_tools: "Verktyg", language: "Språk", run_settings: "Körningsinställningar…", inspect_window: "Inspektera fönster", inspect_hint: "Välj ett körande fönster för att lista dess kontroller — använd name / auto_id / control_type i desktop-stegen.", inspect_pick: "Fönster", inspect_load: "Hämta kontroller", inspect_unavailable: "Bara Windows — pywinauto kunde inte laddas.", inspect_make_click: "Nytt desktop_click", inspect_make_type: "Nytt desktop_type", inspect_copy: "Kopiera selector", inspect_none: "Inga fönster hittades.", palette: "Steg", palette_search: "Sök…", palette_blocks: "Block", palette_toggle: "Visa/dölj steg-paletten", palette_click_add: "Klicka + (eller dubbelklicka) för att lägga till, eller dra till canvasen", block_save_selection: "💾 Spara markering som block", block_insert: "Infoga", block_none: "Inga block än. Markera noder på canvasen och spara dem som ett block.", block_name_prompt: "Blockets namn:", block_desc_prompt: "Kort beskrivning (valfri):", block_saved: "Blocket sparat.", block_select_first: "Markera en eller flera noder på canvasen först.", change_type: "Byt stegtyp", run_params_menu: "Kör-parametrar / indata", runp_title: "Kör-parametrar", runp_hint: "Fyll i flödets indata-variabler, eller välj ett sparat värde-set. Används som {name} i stegen.", runp_set: "Värde-set", runp_set_none: "(inget)", runp_save_set: "💾 Spara som set", runp_set_name_prompt: "Namn på värde-setet:", runp_add_var: "+ Lägg till variabel", runp_var_name: "namn", runp_var_value: "värde", inputs_title: "Kör-parametrar / indata", inputs_hint: "Deklarera vilka variabler flödet förväntar sig vid körning. De dyker upp i kördialogen och löses som {name}.", inputs_add: "+ Lägg till indata", inputs_sets: "Sparade värde-set", inputs_set_rename: "Döp om", }, } as const; export type Key = keyof (typeof STRINGS)["en"]; export function makeT(lang: Lang) { return (key: Key, params?: Record): string => { let s: string = STRINGS[lang][key] ?? STRINGS.en[key] ?? key; if (params) for (const [k, v] of Object.entries(params)) s = s.replace(`{${k}}`, String(v)); return s; }; } export type T = ReturnType;