// 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, string | number>): 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<typeof makeT>;