This commit is contained in:
lovebird 2025-09-27 08:01:23 +02:00
parent db5182c0a5
commit 4463f26bb2
6 changed files with 50 additions and 401 deletions

View File

@ -1,5 +1,6 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
import { T } from '../i18n';
interface HeaderProps {
showDebugPanel: boolean;
@ -20,8 +21,8 @@ const Header: React.FC<HeaderProps> = ({
{/* Title on its own row */}
<div className="text-center">
<h1 className="text-2xl md:text-3xl font-bold accent-text drop-shadow-sm flex justify-center gap-4">
<span>Image</span>
<span>Wizard</span>
<span><T>Image</T></span>
<span><T>Wizard</T></span>
</h1>
</div>

View File

@ -8,6 +8,7 @@ import log from "../lib/log";
import Header from "./Header";
import PromptForm from "./PromptForm";
import DebugPanel from "./DebugPanel";
import { T } from "../i18n";
function arrayBufferToBase64(buffer: number[]) {
let binary = '';

View File

@ -7,6 +7,7 @@ import TemplateManager from './TemplateManager';
import { tauriApi } from '../lib/tauriApi';
import log from '../lib/log';
import { Eraser, Sparkles, Crop, Palette, Package, FolderOpen, Plus, History, ChevronUp, ChevronDown } from 'lucide-react';
import { T } from '../i18n';
function arrayBufferToBase64(buffer: number[]) {
let binary = '';
@ -258,10 +259,10 @@ const PromptForm: React.FC<PromptFormProps> = ({
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none" />
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
</svg>
Generating...
<T>Generating...</T>
</span>
) : (
'🎨 Generate Image'
<>🎨 <T>Generate Image</T></>
)}
</button>
@ -291,7 +292,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
</div>
{/* Quick Styles - Compact */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Styles</h4>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2"><T>Styles</T></h4>
<div className="flex flex-wrap gap-1">
{quickStyles.map((style) => (
<button
@ -308,7 +309,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
{/* Quick Actions - Icons Only */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Actions</h4>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2"><T>Actions</T></h4>
<div className="flex flex-wrap gap-1">
{quickActions.map((action) => {
const hasSelectedImages = getSelectedImages().length > 0;
@ -355,7 +356,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
{/* Left: Output destination */}
<div className="border border-slate-200/50 dark:border-slate-700/50 rounded-xl p-4 bg-slate-50/30 dark:bg-slate-800/30">
<label htmlFor="output-path" className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">
Output File Path
<T>Output File Path</T>
</label>
<div className="flex flex-col sm:flex-row gap-3">
<input
@ -373,7 +374,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
title="Browse for save location"
>
<FolderOpen size={16} />
Browse
<T>Browse</T>
</button>
</div>
</div>
@ -390,7 +391,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
className="w-full glass-button font-semibold py-4 px-6 rounded-xl hover:border-slate-400/60 dark:hover-border-slate-500/60 flex items-center justify-center gap-2 border-2 border-dashed border-slate-300 dark:border-slate-600 hover:border-indigo-400 dark:hover:border-indigo-500 transition-colors"
>
<FolderOpen size={20} />
Select Images (or Drop Here)
<T>Select Images (or Drop Here)</T>
</button>
<div className="flex flex-col sm:flex-row gap-2 justify-center">
<button

View File

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { ArrowLeft } from 'lucide-react';
import { useNavigate } from 'react-router-dom';
import { saveToStore } from '../lib/init';
import { T } from '../i18n';
interface SettingsProps {
apiKey: string;
@ -60,7 +61,7 @@ const Settings: React.FC<SettingsProps> = ({
>
<ArrowLeft className="w-4 h-4 sm:w-5 sm:h-5 text-slate-700 dark:text-slate-300" />
</button>
<h1 className="text-2xl md:text-3xl font-bold accent-text drop-shadow-sm">Settings</h1>
<h1 className="text-2xl md:text-3xl font-bold accent-text drop-shadow-sm"><T>Settings</T></h1>
</div>
</div>
@ -71,7 +72,7 @@ const Settings: React.FC<SettingsProps> = ({
<div className="space-y-3">
<div>
<label htmlFor="api-key" className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">
Google AI API Key
<T>Google AI API Key</T>
</label>
<div className="space-y-2">
<input
@ -85,19 +86,19 @@ const Settings: React.FC<SettingsProps> = ({
<div className="flex items-center gap-2">
<div className={`h-2 w-2 rounded-full ${localApiKey ? 'bg-green-500' : 'bg-red-500'}`}></div>
<span className="text-xs text-slate-500 dark:text-slate-400">
{localApiKey ? 'API key configured' : 'API key required for image generation'}
{localApiKey ? <T>API key configured</T> : <T>API key required for image generation</T>}
</span>
</div>
</div>
<p className="text-xs text-slate-500 dark:text-slate-400 mt-2">
Get your API key from{' '}
<T>Get your API key from</T>{' '}
<a
href="https://aistudio.google.com/app/apikey"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 dark:text-blue-400 hover:underline"
>
Google AI Studio
<T>Google AI Studio</T>
</a>
</p>
</div>
@ -107,8 +108,8 @@ const Settings: React.FC<SettingsProps> = ({
<div>
<div className="flex items-center justify-between">
<div>
<h3 className="text-sm font-semibold text-slate-700 dark:text-slate-300">Theme</h3>
<p className="text-xs text-slate-500 dark:text-slate-400">Choose your preferred color scheme</p>
<h3 className="text-sm font-semibold text-slate-700 dark:text-slate-300"><T>Theme</T></h3>
<p className="text-xs text-slate-500 dark:text-slate-400"><T>Choose your preferred color scheme</T></p>
</div>
<button
onClick={toggleTheme}
@ -138,7 +139,7 @@ const Settings: React.FC<SettingsProps> = ({
onClick={handleSave}
className="w-full glass-button bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700 text-white px-6 py-3 rounded-xl font-semibold transition-all duration-300"
>
Save Settings
<T>Save Settings</T>
</button>
</div>
</div>

View File

@ -1,6 +1,7 @@
import React from 'react';
import { PromptTemplate } from '../types';
import { Save, Download, Upload } from 'lucide-react';
import { T } from '../i18n';
interface TemplateManagerProps {
prompts: PromptTemplate[];
@ -33,10 +34,10 @@ const TemplateManager: React.FC<TemplateManagerProps> = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{/* Left: Template Picker */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Templates</h4>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2"><T>Templates</T></h4>
<div className="flex flex-wrap gap-1">
{prompts.length === 0 ? (
<span className="text-xs text-slate-500 dark:text-slate-400">No templates saved yet</span>
<span className="text-xs text-slate-500 dark:text-slate-400"><T>No templates saved yet</T></span>
) : (
prompts.map((template) => (
<button
@ -55,7 +56,7 @@ const TemplateManager: React.FC<TemplateManagerProps> = ({
{/* Right: Template Management Icons */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Manage</h4>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2"><T>Manage</T></h4>
<div className="flex flex-col sm:flex-row gap-2">
<button
type="button"

View File

@ -1,379 +1,23 @@
{
"Download English Translations": "Download English Translations",
"Connect": "Connect",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "OFFLINE",
"System Information": "System Information",
"API URL": "API URL",
"System Messages": "System Messages",
"Clear": "Clear",
"No enabled profile": "No enabled profile",
"Stop Profile": "Stop Profile",
"N/A": "N/A",
"Press": "Press",
"Stop": "Stop",
"MANUAL": "MANUAL",
"AUTO": "AUTO",
"MANUAL MULTI": "MANUAL MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI BALANCED",
"Press Cylinder Controls": "Press Cylinder Controls",
"PV": "PV",
"Mode": "Mode",
"SP:": "SP:",
"Interlocked": "Interlocked",
"Low": "Low",
"Mid": "Mid",
"Max": "Max",
"Press Cylinder": "Press Cylinder",
"Dashboard": "Dashboard",
"Signals": "Signals",
"Profiles": "Profiles",
"Playground": "Playground",
"Advanced": "Advanced",
"This is where you'll design and configure your HMI layouts.": "This is where you'll design and configure your HMI layouts.",
"Widget editor and drag-and-drop functionality coming soon...": "Widget editor and drag-and-drop functionality coming soon...",
"HMI Edit Mode Active": "HMI Edit Mode Active",
"Drag and resize widgets": "Drag and resize widgets",
"Edit": "Edit",
"View": "View",
"Add Widget": "Add Widget",
"Clear All": "Clear All",
"No widgets yet": "No widgets yet",
"Click \"Add Widget\" to start building your HMI": "Click \"Add Widget\" to start building your HMI",
"Empty Canvas": "Empty Canvas",
"Switch to edit mode to add widgets": "Switch to edit mode to add widgets",
"Edit mode: Add, move, and configure widgets": "Edit mode: Add, move, and configure widgets",
"View mode: Interact with your widgets": "View mode: Interact with your widgets",
"Widgets": "Widgets",
"Last updated": "Last updated",
"No widgets found": "No widgets found",
"Import": "Import",
"Export": "Export",
"Add Container": "Add Container",
"Edit mode: Configure containers and add widgets": "Edit mode: Configure containers and add widgets",
"Containers": "Containers",
"No containers yet": "No containers yet",
"Click \"Add Container\" to start building your layout": "Click \"Add Container\" to start building your layout",
"Empty Layout": "Empty Layout",
"Switch to edit mode to add containers": "Switch to edit mode to add containers",
"Address Picker": "Address Picker",
"Select a register or coil address": "Select a register or coil address",
"Image": "Image",
"Wizard": "Wizard",
"Settings": "Settings",
"Network": "Network",
"Coils": "Coils",
"Registers": "Registers",
"Charts": "Charts",
"Logs": "Logs",
"Favorites": "Favorites",
"Connect to view register data.": "Connect to view register data.",
"Cancel": "Cancel",
"Reset": "Reset",
"Disconnect": "Disconnect",
"ONLINE": "ONLINE",
"No register data available. Try refreshing.": "No register data available. Try refreshing.",
"Connect to a Modbus server to see controller data.": "Connect to a Modbus server to see controller data.",
"Connected, but no register data received yet. Waiting for data...": "Connected, but no register data received yet. Waiting for data...",
"Start Profile": "Start Profile",
"IDLE": "IDLE",
"Commons": "Commons",
"Slave Mode": "Slave Mode",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "When Slave Mode is enabled, all Omron controllers will be disabled for processing.",
"All Stop": "All Stop",
"COM Write": "COM Write",
"Set All SP": "Set All SP",
"Total Cost": "Total Cost",
"Custom Widgets": "Custom Widgets",
"Watched Items": "Watched Items",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "MINLOAD",
"MAX_TIME": "MAX_TIME",
"STALLED": "STALLED",
"BALANCE": "BALANCE",
"LOADCELL": "LOADCELL",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "NONE",
"MANUAL_MULTI": "MANUAL_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BALANCED",
"REMOTE": "REMOTE",
"Temperature Profiles": "Temperature Profiles",
"Controller Chart": "Controller Chart",
"Global Settings": "Global Settings",
"Show PV": "Show PV",
"Show SP": "Show SP",
"Profile SP": "Profile SP",
"Window (min)": "Window (min)",
"Visible Controllers": "Visible Controllers",
"Cassandra Left": "Cassandra Left",
"Cassandra Right": "Cassandra Right",
"Clear Chart": "Clear Chart",
"Reset Zoom": "Reset Zoom",
"Export to CSV": "Export to CSV",
"Sequential Heating Control": "Sequential Heating Control",
"Sequential Heating": "Sequential Heating",
"Heating Time": "Heating Time",
"in seconds": "in seconds",
"Max Simultaneous": "Max Simultaneous",
"Window Offset": "Window Offset",
"Start Index": "Start Index",
"End Index": "End Index",
"Current Status": "Current Status",
"Unknown": "Unknown",
"Controller Partitions": "Controller Partitions",
"Carina": "Carina",
"Stopped": "Stopped",
"SP": "SP",
"Castor": "Castor",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Crater",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Copy \"{plotName}\" to...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.",
"Select a plot to overwrite": "Select a plot to overwrite",
"Signal Plot Editor": "Signal Plot Editor",
"Download All JSON": "Download All JSON",
"Upload All JSON": "Upload All JSON",
"Signal plots configuration loaded from API.": "Signal plots configuration loaded from API.",
"Slot:": "Slot:",
"Enable control unavailable for {name}": "Enable control unavailable for {name}",
"Total:": "Total:",
"Add a set of sample control points to this plot": "Add a set of sample control points to this plot",
"Remove all control points from this plot": "Remove all control points from this plot",
"Download JSON for {name}": "Download JSON for {name}",
"Upload JSON for {name}": "Upload JSON for {name}",
"Copy this plot to another slot...": "Copy this plot to another slot...",
"Slot": "Slot",
"Duration:": "Duration:",
"Timeline:": "Timeline:",
"Play from start": "Play from start",
"Pause": "Pause",
"Stop and reset": "Stop and reset",
"Control Points": "Control Points",
"Control Points List": "Control Points List",
"Move control point up": "Move control point up",
"Move control point down": "Move control point down",
"Delete control point": "Delete control point",
"Properties:": "Properties:",
"Select a control point to see its properties.": "Select a control point to see its properties.",
"Add Samples": "Add Samples",
"Clear All CPs": "Clear All CPs",
"Download Plot": "Download Plot",
"Upload Plot": "Upload Plot",
"Copy to...": "Copy to...",
"No Operation": "No Operation",
"Write Coil": "Write Coil",
"Write Holding Register": "Write Holding Register",
"Call Method": "Call Method",
"Call Function": "Call Function",
"Call REST API": "Call REST API",
"Write GPIO": "Write GPIO",
"Display Message": "Display Message",
"User Defined": "User Defined",
"Pause Profile": "Pause Profile",
"Start PID Controllers": "Start PID Controllers",
"Stop PID Controllers": "Stop PID Controllers",
"Buzzer: Off": "Buzzer: Off",
"Buzzer: Solid On": "Buzzer: Solid On",
"Buzzer: Slow Blink": "Buzzer: Slow Blink",
"Buzzer: Fast Blink": "Buzzer: Fast Blink",
"Buzzer: Long Beep/Short Pause": "Buzzer: Long Beep/Short Pause",
"Send IFTTT Notification": "Send IFTTT Notification",
"Buzzer": "Buzzer",
"General": "General",
"Hardware I/O": "Hardware I/O",
"Integrations": "Integrations",
"Modbus": "Modbus",
"PID Control": "PID Control",
"System Calls": "System Calls",
"Addr:": "Addr:",
"Run this control point action now": "Run this control point action now",
"Select type": "Select type",
"Enter CP name": "Enter CP name",
"Enter CP description": "Enter CP description",
"ID:": "ID:",
"Run Action": "Run Action",
"Time:": "Time:",
"Scale:": "Scale:",
"State:": "State:",
"Type:": "Type:",
"CP Name (Optional):": "CP Name (Optional):",
"CP Description (Optional):": "CP Description (Optional):",
"Arguments:": "Arguments:",
"Argument 0:": "Argument 0:",
"Argument 1:": "Argument 1:",
"Argument 2 (Optional):": "Argument 2 (Optional):",
"Loading profiles from Modbus...": "Loading profiles from Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.",
"Copy \"{profileName}\" to...": "Copy \"{profileName}\" to...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.",
"Select a profile to overwrite": "Select a profile to overwrite",
"Help": "Help",
"Download": "Download",
"Upload": "Upload",
"Associated Controllers:": "Associated Controllers:",
"Edit Profile": "Edit Profile",
"Duplicate Profile": "Duplicate Profile",
"Copy to existing slot...": "Copy to existing slot...",
"Delete Profile": "Delete Profile",
"Enabled": "Enabled",
"Total": "Total",
"Idle": "Idle",
"Start": "Start",
"E.g., Quick Ramp Up": "E.g., Quick Ramp Up",
"Select a signal plot to associate and edit": "Select a signal plot to associate and edit",
"Slave:": "Slave:",
"SP CMD Addr:": "SP CMD Addr:",
"Profile Name": "Profile Name",
"Description": "Description",
"Duration (hh:mm:ss)": "Duration (hh:mm:ss)",
"Profile Curves": "Profile Curves",
"Temperature Control Points": "Temperature Control Points",
"Associated Signal Plot (Optional)": "Associated Signal Plot (Optional)",
"Child Profiles (Sub-plots)": "Child Profiles (Sub-plots)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Selected child profiles will start, stop, pause, and resume with this parent profile.",
"Target Controllers (Registers)": "Target Controllers (Registers)",
"Add all": "Add all",
"Remove all": "Remove all",
"Export": "Export",
"Markdown": "Markdown",
"Import": "Import",
"Update Profile": "Update Profile",
"None": "None",
"Signal Control Point Details": "Signal Control Point Details",
"Save Signal Plot": "Save Signal Plot",
"Loading Cassandra settings...": "Loading Cassandra settings...",
"General Settings": "General Settings",
"Master Configuration": "Master Configuration",
"Master Name": "Master Name",
"Slaves": "Slaves",
"Manage slave devices (max 1).": "Manage slave devices (max 1).",
"Add Slave": "Add Slave",
"Partitions": "Partitions",
"Import JSON": "Import JSON",
"Export JSON": "Export JSON",
"Save All Settings": "Save All Settings",
"Loading network settings...": "Loading network settings...",
"Network Settings": "Network Settings",
"Hostname": "Hostname",
"Device Hostname": "Device Hostname",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "This hostname is used for both STA and AP modes. Changes here will be saved with either form.",
"Station (STA) Mode": "Station (STA) Mode",
"Connects to an existing Wi-Fi network.": "Connects to an existing Wi-Fi network.",
"STA SSID": "STA SSID",
"STA Password": "STA Password",
"STA IP Address": "STA IP Address",
"STA Gateway": "STA Gateway",
"STA Subnet Mask": "STA Subnet Mask",
"STA Primary DNS": "STA Primary DNS",
"STA Secondary DNS": "STA Secondary DNS",
"Save STA Settings": "Save STA Settings",
"Access Point (AP) Mode": "Access Point (AP) Mode",
"Creates its own Wi-Fi network.": "Creates its own Wi-Fi network.",
"AP SSID": "AP SSID",
"AP Password": "AP Password",
"AP IP Address": "AP IP Address",
"AP Gateway": "AP Gateway",
"AP Subnet Mask": "AP Subnet Mask",
"Save AP Settings": "Save AP Settings",
"Enable All": "Enable All",
"Disable All": "Disable All",
"Operatorswitch": "Operatorswitch",
"Set All": "Set All",
"Presscylinder": "Presscylinder",
"MAXLOAD": "MAXLOAD",
"ERROR": "ERROR",
"OK": "OK",
"OVERLOAD": "OVERLOAD",
"BALANCE_MAX_DIFF": "BALANCE_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Loadcell[25]",
"Loadcell[26]": "Loadcell[26]",
"Real-time Charts": "Real-time Charts",
"Real time Charting": "Real time Charting",
"X-Axis": "X-Axis",
"Refresh Rate": "Refresh Rate",
"Y-Axis Left": "Y-Axis Left",
"Min": "Min",
"Series": "Series",
"Settings...": "Settings...",
"Copy...": "Copy...",
"Show Legend": "Show Legend",
"Apply": "Apply",
"CSV": "CSV",
"Pop-out": "Pop-out",
"Save As": "Save As",
"Set as Default": "Set as Default",
"Delete": "Delete",
"Series Toggles": "Series Toggles",
"Continue": "Continue",
"Stop at end": "Stop at end",
"Restart at end": "Restart at end",
"Series settings": "Series settings",
"Configure the series to be displayed on the chart.": "Configure the series to be displayed on the chart.",
"Color": "Color",
"Offset": "Offset",
"Scale": "Scale",
"Title (Optional)": "Title (Optional)",
"Source": "Source",
"File name": "File name",
"Search...": "Search...",
"No source found.": "No source found.",
"Select source...": "Select source...",
"Favorite Registers": "Favorite Registers",
"Favorite Coils": "Favorite Coils",
"e.g., Start Heating": "e.g., Start Heating",
"e.g., Turn on coil for pre-heating stage": "e.g., Turn on coil for pre-heating stage",
"Select Known Coil...": "Select Known Coil...",
"Create New Control Point": "Create New Control Point",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configure the new control point. Press Enter to confirm or Esc to cancel.",
"Coil to Write:": "Coil to Write:",
"Value:": "Value:",
"ON": "ON",
"Create Control Point": "Create Control Point",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Samplesignalplot 0",
"Shortplot 70s": "Shortplot 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Slot 2",
"Signalplot 923 Slot 3": "Signalplot 923 Slot 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "none",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "stop",
"run": "run",
"accel": "accel",
"decel": "decel",
"err": "err",
"fwd": "fwd",
"rev": "rev",
"reset": "reset",
"info": "info",
"setup": "setup",
"reset_fault": "reset_fault",
"Plunger": "Plunger",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "PlungingMan",
"PlungingAuto": "PlungingAuto",
"Stopping": "Stopping",
"Jammed": "Jammed",
"ResettingJam": "ResettingJam",
"Record": "Record",
"Replay": "Replay",
"Filling": "Filling",
"PostFlow": "PostFlow",
"Home": "Home",
"Plunge": "Plunge",
"Info": "Info",
"Fill": "Fill",
"No coils data available. Try refreshing.": "No coils data available. Try refreshing."
"Google AI API Key": "Google AI API Key",
"API key configured": "API key configured",
"API key required for image generation": "API key required for image generation",
"Get your API key from": "Get your API key from",
"Google AI Studio": "Google AI Studio",
"Theme": "Theme",
"Choose your preferred color scheme": "Choose your preferred color scheme",
"Save Settings": "Save Settings",
"Generate Image": "Generate Image",
"Generating...": "Generating...",
"Styles": "Styles",
"Actions": "Actions",
"Output File Path": "Output File Path",
"Browse": "Browse",
"Select Images (or Drop Here)": "Select Images (or Drop Here)",
"Templates": "Templates",
"No templates saved yet": "No templates saved yet",
"Manage": "Manage"
}