- color_cycle is now a top-level source type (alongside picture/static/gradient) with a configurable color list and cycle_speed; defaults to full rainbow spectrum - ColorCycleColorStripSource + ColorCycleColorStripStream: smooth 30 fps interpolation between user-defined colors, one full cycle every 20s at speed=1.0 - Removed color_cycle animation sub-type from StaticColorStripStream - Color cycle editor: compact horizontal swatch layout, proper module-scope fix (colorCycleAdd/Remove now exposed on window, DOM-synced before mutations) - Animation enabled + Frame interpolation checkboxes use toggle-switch style - Removed Potential FPS metric from targets and KC targets metric grids Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
610 lines
34 KiB
JSON
610 lines
34 KiB
JSON
{
|
||
"app.title": "LED Grab",
|
||
"app.version": "Version:",
|
||
"app.api_docs": "API Documentation",
|
||
"theme.toggle": "Toggle theme",
|
||
"locale.change": "Change language",
|
||
"auth.login": "Login",
|
||
"auth.logout": "Logout",
|
||
"auth.authenticated": "● Authenticated",
|
||
"auth.title": "Login to LED Grab",
|
||
"auth.message": "Please enter your API key to authenticate and access the LED Grab.",
|
||
"auth.label": "API Key:",
|
||
"auth.placeholder": "Enter your API key...",
|
||
"auth.hint": "Your API key will be stored securely in your browser's local storage.",
|
||
"auth.button.cancel": "Cancel",
|
||
"auth.button.login": "Login",
|
||
"auth.error.required": "Please enter an API key",
|
||
"auth.success": "Logged in successfully!",
|
||
"auth.logout.confirm": "Are you sure you want to logout?",
|
||
"auth.logout.success": "Logged out successfully",
|
||
"auth.please_login": "Please login to view",
|
||
"auth.session_expired": "Your session has expired or the API key is invalid. Please login again.",
|
||
"displays.title": "Available Displays",
|
||
"displays.layout": "\uD83D\uDDA5\uFE0F Displays",
|
||
"displays.information": "Display Information",
|
||
"displays.legend.primary": "Primary Display",
|
||
"displays.legend.secondary": "Secondary Display",
|
||
"displays.badge.primary": "Primary",
|
||
"displays.badge.secondary": "Secondary",
|
||
"displays.resolution": "Resolution:",
|
||
"displays.refresh_rate": "Refresh Rate:",
|
||
"displays.position": "Position:",
|
||
"displays.index": "Display Index:",
|
||
"displays.loading": "Loading displays...",
|
||
"displays.none": "No displays available",
|
||
"displays.failed": "Failed to load displays",
|
||
"displays.picker.title": "Select a Display",
|
||
"displays.picker.select": "Select display...",
|
||
"displays.picker.click_to_select": "Click to select this display",
|
||
"templates.title": "\uD83D\uDCC4 Engine Templates",
|
||
"templates.description": "Capture templates define how the screen is captured. Each template uses a specific capture engine (MSS, DXcam, WGC) with custom settings. Assign templates to devices for optimal performance.",
|
||
"templates.loading": "Loading templates...",
|
||
"templates.empty": "No capture templates configured",
|
||
"templates.add": "Add Engine Template",
|
||
"templates.edit": "Edit Engine Template",
|
||
"templates.name": "Template Name:",
|
||
"templates.name.placeholder": "My Custom Template",
|
||
"templates.description.label": "Description (optional):",
|
||
"templates.description.placeholder": "Describe this template...",
|
||
"templates.engine": "Capture Engine:",
|
||
"templates.engine.hint": "Select the screen capture technology to use",
|
||
"templates.engine.select": "Select an engine...",
|
||
"templates.engine.unavailable": "Unavailable",
|
||
"templates.engine.unavailable.hint": "This engine is not available on your system",
|
||
"templates.config": "Configuration",
|
||
"templates.config.show": "Show configuration",
|
||
"templates.config.none": "No additional configuration",
|
||
"templates.config.default": "Default",
|
||
"templates.created": "Template created successfully",
|
||
"templates.updated": "Template updated successfully",
|
||
"templates.deleted": "Template deleted successfully",
|
||
"templates.delete.confirm": "Are you sure you want to delete this template?",
|
||
"templates.error.load": "Failed to load templates",
|
||
"templates.error.engines": "Failed to load engines",
|
||
"templates.error.required": "Please fill in all required fields",
|
||
"templates.error.delete": "Failed to delete template",
|
||
"templates.test.title": "Test Capture",
|
||
"templates.test.description": "Test this template before saving to see a capture preview and performance metrics.",
|
||
"templates.test.display": "Display:",
|
||
"templates.test.display.select": "Select display...",
|
||
"templates.test.duration": "Capture Duration (s):",
|
||
"templates.test.border_width": "Border Width (px):",
|
||
"templates.test.run": "\uD83E\uDDEA Run",
|
||
"templates.test.running": "Running test...",
|
||
"templates.test.results.preview": "Full Capture Preview",
|
||
"templates.test.results.borders": "Border Extraction",
|
||
"templates.test.results.top": "Top",
|
||
"templates.test.results.right": "Right",
|
||
"templates.test.results.bottom": "Bottom",
|
||
"templates.test.results.left": "Left",
|
||
"templates.test.results.performance": "Performance",
|
||
"templates.test.results.capture_time": "Capture",
|
||
"templates.test.results.extraction_time": "Extraction",
|
||
"templates.test.results.total_time": "Total",
|
||
"templates.test.results.max_fps": "Max FPS",
|
||
"templates.test.results.duration": "Duration",
|
||
"templates.test.results.frame_count": "Frames",
|
||
"templates.test.results.actual_fps": "Actual FPS",
|
||
"templates.test.results.avg_capture_time": "Avg Capture",
|
||
"templates.test.error.no_engine": "Please select a capture engine",
|
||
"templates.test.error.no_display": "Please select a display",
|
||
"templates.test.error.failed": "Test failed",
|
||
"devices.title": "\uD83D\uDCA1 Devices",
|
||
"devices.add": "Add New Device",
|
||
"devices.loading": "Loading devices...",
|
||
"devices.none": "No devices configured",
|
||
"devices.failed": "Failed to load devices",
|
||
"devices.wled_config": "WLED Configuration:",
|
||
"devices.wled_note": "Configure your WLED device (effects, segments, color order, power limits, etc.) using the",
|
||
"devices.wled_link": "official WLED app",
|
||
"devices.wled_note_or": "or the built-in",
|
||
"devices.wled_webui_link": "WLED Web UI",
|
||
"devices.wled_note_webui": "(open your device's IP in a browser).",
|
||
"devices.wled_note2": "This controller sends pixel color data and controls brightness per device.",
|
||
"device.scan": "Auto Discovery",
|
||
"device.scan.empty": "No devices found",
|
||
"device.scan.error": "Network scan failed",
|
||
"device.scan.already_added": "Already added",
|
||
"device.scan.selected": "Device selected",
|
||
"device.type": "Device Type:",
|
||
"device.type.hint": "Select the type of LED controller",
|
||
"device.serial_port": "Serial Port:",
|
||
"device.serial_port.hint": "Select the COM port of the Adalight device",
|
||
"device.serial_port.none": "No serial ports found",
|
||
"device.led_count_manual.hint": "Number of LEDs on the strip (must match your Arduino sketch)",
|
||
"device.baud_rate": "Baud Rate:",
|
||
"device.baud_rate.hint": "Serial communication speed. Higher = more FPS but requires matching Arduino sketch.",
|
||
"device.url.hint": "IP address or hostname of the device (e.g. http://192.168.1.100)",
|
||
"device.name": "Device Name:",
|
||
"device.name.placeholder": "Living Room TV",
|
||
"device.url": "URL:",
|
||
"device.url.placeholder": "http://192.168.1.100",
|
||
"device.led_count": "LED Count:",
|
||
"device.led_count.hint": "Number of LEDs configured in the device",
|
||
"device.led_count.hint.auto": "Auto-detected from device",
|
||
"device.button.add": "Add Device",
|
||
"device.button.start": "Start",
|
||
"device.button.stop": "Stop",
|
||
"device.button.settings": "General Settings",
|
||
"device.button.capture_settings": "Capture Settings",
|
||
"device.button.calibrate": "Calibrate",
|
||
"device.button.remove": "Remove",
|
||
"device.button.webui": "Open Device Web UI",
|
||
"device.button.power_toggle": "Toggle Power",
|
||
"device.power.on_success": "Device turned on",
|
||
"device.power.off_success": "Device turned off",
|
||
"device.status.connected": "Connected",
|
||
"device.status.disconnected": "Disconnected",
|
||
"device.status.error": "Error",
|
||
"device.status.processing": "Processing",
|
||
"device.status.idle": "Idle",
|
||
"device.fps": "FPS:",
|
||
"device.display": "Display:",
|
||
"device.remove.confirm": "Are you sure you want to remove this device?",
|
||
"device.added": "Device added successfully",
|
||
"device.removed": "Device removed successfully",
|
||
"device.started": "Processing started",
|
||
"device.stopped": "Processing stopped",
|
||
"device.metrics.actual_fps": "Actual FPS",
|
||
"device.metrics.current_fps": "Current FPS",
|
||
"device.metrics.target_fps": "Target FPS",
|
||
"device.metrics.potential_fps": "Potential FPS",
|
||
"device.metrics.frames": "Frames",
|
||
"device.metrics.frames_skipped": "Skipped",
|
||
"device.metrics.keepalive": "Keepalive",
|
||
"device.metrics.errors": "Errors",
|
||
"device.metrics.timing": "Pipeline timing:",
|
||
"device.metrics.device_fps": "Device refresh rate",
|
||
"device.health.online": "Online",
|
||
"device.health.offline": "Offline",
|
||
"device.health.checking": "Checking...",
|
||
"device.static_color": "Idle Color",
|
||
"device.static_color.hint": "Color shown when device is idle",
|
||
"device.static_color.clear": "Clear idle color",
|
||
"device.tutorial.start": "Start tutorial",
|
||
"device.tip.metadata": "Device info (LED count, type, color channels) is auto-detected from the device",
|
||
"device.tip.brightness": "Slide to adjust device brightness",
|
||
"device.tip.start": "Start or stop screen capture processing",
|
||
"device.tip.settings": "Configure general device settings (name, URL, health check)",
|
||
"device.tip.capture_settings": "Configure capture settings (display, capture template)",
|
||
"device.tip.calibrate": "Calibrate LED positions, direction, and coverage",
|
||
"device.tip.webui": "Open the device's built-in web interface for advanced configuration",
|
||
"device.tip.add": "Click here to add a new LED device",
|
||
"settings.title": "Device Settings",
|
||
"settings.general.title": "General Settings",
|
||
"settings.capture.title": "Capture Settings",
|
||
"settings.capture.saved": "Capture settings updated",
|
||
"settings.capture.failed": "Failed to save capture settings",
|
||
"settings.brightness": "Brightness:",
|
||
"settings.brightness.hint": "Global brightness for this device (0-100%)",
|
||
"settings.url.hint": "IP address or hostname of the device",
|
||
"settings.display_index": "Display:",
|
||
"settings.display_index.hint": "Which screen to capture for this device",
|
||
"settings.fps": "Target FPS:",
|
||
"settings.fps.hint": "Target frames per second (10-90)",
|
||
"settings.capture_template": "Engine Template:",
|
||
"settings.capture_template.hint": "Screen capture engine and configuration for this device",
|
||
"settings.button.cancel": "Cancel",
|
||
"settings.health_interval": "Health Check Interval (s):",
|
||
"settings.health_interval.hint": "How often to check the device status (5-600 seconds)",
|
||
"settings.auto_shutdown": "Auto Restore:",
|
||
"settings.auto_shutdown.hint": "Restore device to idle state when targets stop or server shuts down",
|
||
"settings.button.save": "Save Changes",
|
||
"settings.saved": "Settings saved successfully",
|
||
"settings.failed": "Failed to save settings",
|
||
"calibration.title": "LED Calibration",
|
||
"calibration.tip.led_count": "Enter LED count per edge",
|
||
"calibration.tip.start_corner": "Click a corner to set the start position",
|
||
"calibration.tip.direction": "Toggle LED strip direction (clockwise / counterclockwise)",
|
||
"calibration.tip.offset": "Set LED offset — distance from LED 0 to the start corner",
|
||
"calibration.tip.span": "Drag green bars to adjust coverage span",
|
||
"calibration.tip.test": "Click an edge to toggle test LEDs",
|
||
"calibration.tip.toggle_inputs": "Click total LED count to toggle edge inputs",
|
||
"calibration.tip.border_width": "How many pixels from the screen edge to sample for LED colors",
|
||
"calibration.tip.skip_leds_start": "Skip LEDs at the start of the strip — skipped LEDs stay off",
|
||
"calibration.tip.skip_leds_end": "Skip LEDs at the end of the strip — skipped LEDs stay off",
|
||
"calibration.tutorial.start": "Start tutorial",
|
||
"calibration.start_position": "Starting Position:",
|
||
"calibration.position.bottom_left": "Bottom Left",
|
||
"calibration.position.bottom_right": "Bottom Right",
|
||
"calibration.position.top_left": "Top Left",
|
||
"calibration.position.top_right": "Top Right",
|
||
"calibration.direction": "Direction:",
|
||
"calibration.direction.clockwise": "Clockwise",
|
||
"calibration.direction.counterclockwise": "Counterclockwise",
|
||
"calibration.leds.top": "Top LEDs:",
|
||
"calibration.leds.right": "Right LEDs:",
|
||
"calibration.leds.bottom": "Bottom LEDs:",
|
||
"calibration.leds.left": "Left LEDs:",
|
||
"calibration.offset": "LED Offset:",
|
||
"calibration.offset.hint": "Distance from physical LED 0 to the start corner (along strip direction)",
|
||
"calibration.skip_start": "Skip LEDs (Start):",
|
||
"calibration.skip_start.hint": "Number of LEDs to turn off at the beginning of the strip (0 = none)",
|
||
"calibration.skip_end": "Skip LEDs (End):",
|
||
"calibration.skip_end.hint": "Number of LEDs to turn off at the end of the strip (0 = none)",
|
||
"calibration.border_width": "Border (px):",
|
||
"calibration.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
|
||
"calibration.button.cancel": "Cancel",
|
||
"calibration.button.save": "Save",
|
||
"calibration.saved": "Calibration saved successfully",
|
||
"calibration.failed": "Failed to save calibration",
|
||
"server.healthy": "Server online",
|
||
"server.offline": "Server offline",
|
||
"error.unauthorized": "Unauthorized - please login",
|
||
"error.network": "Network error",
|
||
"error.unknown": "An error occurred",
|
||
"modal.discard_changes": "You have unsaved changes. Discard them?",
|
||
"confirm.title": "Confirm Action",
|
||
"confirm.yes": "Yes",
|
||
"confirm.no": "No",
|
||
"common.loading": "Loading...",
|
||
"common.delete": "Delete",
|
||
"common.edit": "Edit",
|
||
"streams.title": "\uD83D\uDCFA Sources",
|
||
"streams.description": "Sources define the capture pipeline. A raw source captures from a display using a capture template. A processed source applies postprocessing to another source. Assign sources to devices.",
|
||
"streams.group.raw": "Screen Capture",
|
||
"streams.group.processed": "Processed",
|
||
"streams.section.streams": "\uD83D\uDCFA Sources",
|
||
"streams.add": "Add Source",
|
||
"streams.add.raw": "Add Screen Capture",
|
||
"streams.add.processed": "Add Processed Source",
|
||
"streams.edit": "Edit Source",
|
||
"streams.edit.raw": "Edit Screen Capture",
|
||
"streams.edit.processed": "Edit Processed Source",
|
||
"streams.name": "Source Name:",
|
||
"streams.name.placeholder": "My Source",
|
||
"streams.type": "Type:",
|
||
"streams.type.raw": "Screen Capture",
|
||
"streams.type.processed": "Processed",
|
||
"streams.display": "Display:",
|
||
"streams.display.hint": "Which screen to capture",
|
||
"streams.capture_template": "Engine Template:",
|
||
"streams.capture_template.hint": "Engine template defining how the screen is captured",
|
||
"streams.target_fps": "Target FPS:",
|
||
"streams.target_fps.hint": "Target frames per second for capture (10-90)",
|
||
"streams.source": "Source:",
|
||
"streams.source.hint": "The source to apply processing filters to",
|
||
"streams.pp_template": "Filter Template:",
|
||
"streams.pp_template.hint": "Filter template to apply to the source",
|
||
"streams.description_label": "Description (optional):",
|
||
"streams.description_placeholder": "Describe this source...",
|
||
"streams.created": "Source created successfully",
|
||
"streams.updated": "Source updated successfully",
|
||
"streams.deleted": "Source deleted successfully",
|
||
"streams.delete.confirm": "Are you sure you want to delete this source?",
|
||
"streams.error.load": "Failed to load sources",
|
||
"streams.error.required": "Please fill in all required fields",
|
||
"streams.error.delete": "Failed to delete source",
|
||
"streams.test.title": "Test Source",
|
||
"streams.test.run": "🧪 Run",
|
||
"streams.test.running": "Testing source...",
|
||
"streams.test.duration": "Capture Duration (s):",
|
||
"streams.test.error.failed": "Source test failed",
|
||
"postprocessing.title": "\uD83D\uDCC4 Filter Templates",
|
||
"postprocessing.description": "Processing templates define image filters and color correction. Assign them to processed picture sources for consistent postprocessing across devices.",
|
||
"postprocessing.add": "Add Filter Template",
|
||
"postprocessing.edit": "Edit Filter Template",
|
||
"postprocessing.name": "Template Name:",
|
||
"postprocessing.name.placeholder": "My Filter Template",
|
||
"filters.select_type": "Select filter type...",
|
||
"filters.add": "Add Filter",
|
||
"filters.remove": "Remove",
|
||
"filters.move_up": "Move Up",
|
||
"filters.move_down": "Move Down",
|
||
"filters.empty": "No filters added. Use the selector below to add filters.",
|
||
"filters.brightness": "Brightness",
|
||
"filters.saturation": "Saturation",
|
||
"filters.gamma": "Gamma",
|
||
"filters.downscaler": "Downscaler",
|
||
"filters.pixelate": "Pixelate",
|
||
"filters.auto_crop": "Auto Crop",
|
||
"filters.flip": "Flip",
|
||
"filters.color_correction": "Color Correction",
|
||
"postprocessing.description_label": "Description (optional):",
|
||
"postprocessing.description_placeholder": "Describe this template...",
|
||
"postprocessing.created": "Template created successfully",
|
||
"postprocessing.updated": "Template updated successfully",
|
||
"postprocessing.deleted": "Template deleted successfully",
|
||
"postprocessing.delete.confirm": "Are you sure you want to delete this filter template?",
|
||
"postprocessing.error.load": "Failed to load processing templates",
|
||
"postprocessing.error.required": "Please fill in all required fields",
|
||
"postprocessing.error.delete": "Failed to delete processing template",
|
||
"postprocessing.config.show": "Show settings",
|
||
"postprocessing.test.title": "Test Filter Template",
|
||
"postprocessing.test.source_stream": "Source:",
|
||
"postprocessing.test.running": "Testing processing template...",
|
||
"postprocessing.test.error.no_stream": "Please select a source",
|
||
"postprocessing.test.error.failed": "Processing template test failed",
|
||
"device.button.stream_selector": "Source Settings",
|
||
"device.stream_settings.title": "📺 Source Settings",
|
||
"device.stream_selector.label": "Source:",
|
||
"device.stream_selector.hint": "Select a source that defines what this device captures and processes",
|
||
"device.stream_selector.none": "-- No source assigned --",
|
||
"device.stream_selector.saved": "Source settings updated",
|
||
"device.stream_settings.border_width": "Border Width (px):",
|
||
"device.stream_settings.border_width_hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
|
||
"device.stream_settings.interpolation": "Interpolation Mode:",
|
||
"device.stream_settings.interpolation.average": "Average",
|
||
"device.stream_settings.interpolation.median": "Median",
|
||
"device.stream_settings.interpolation.dominant": "Dominant",
|
||
"device.stream_settings.interpolation_hint": "How to calculate LED color from sampled pixels",
|
||
"device.stream_settings.smoothing": "Smoothing:",
|
||
"device.stream_settings.smoothing_hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
|
||
"device.tip.stream_selector": "Configure picture source and LED projection settings for this device",
|
||
"streams.group.static_image": "Static Image",
|
||
"streams.add.static_image": "Add Static Image Source",
|
||
"streams.edit.static_image": "Edit Static Image Source",
|
||
"streams.type.static_image": "Static Image",
|
||
"streams.image_source": "Image Source:",
|
||
"streams.image_source.placeholder": "https://example.com/image.jpg or C:\\path\\to\\image.png",
|
||
"streams.image_source.hint": "Enter a URL (http/https) or local file path to an image",
|
||
"streams.validate_image.validating": "Validating...",
|
||
"streams.validate_image.valid": "Image accessible",
|
||
"streams.validate_image.invalid": "Image not accessible",
|
||
"targets.title": "⚡ Targets",
|
||
"targets.description": "Targets bridge color strip sources to output devices. Each target references a device and a color strip source.",
|
||
"targets.subtab.wled": "LED",
|
||
"targets.subtab.led": "LED",
|
||
"targets.section.devices": "💡 Devices",
|
||
"targets.section.color_strips": "🎞️ Color Strip Sources",
|
||
"targets.section.targets": "⚡ Targets",
|
||
"targets.add": "Add Target",
|
||
"targets.edit": "Edit Target",
|
||
"targets.loading": "Loading targets...",
|
||
"targets.none": "No targets configured",
|
||
"targets.failed": "Failed to load targets",
|
||
"targets.name": "Target Name:",
|
||
"targets.name.placeholder": "My Target",
|
||
"targets.device": "Device:",
|
||
"targets.device.hint": "Select the LED device to send data to",
|
||
"targets.device.none": "-- Select a device --",
|
||
"targets.color_strip_source": "Color Strip Source:",
|
||
"targets.color_strip_source.hint": "Color strip source that captures and processes screen pixels into LED colors",
|
||
"targets.source": "Source:",
|
||
"targets.source.hint": "Which picture source to capture and process",
|
||
"targets.source.none": "-- No source assigned --",
|
||
"targets.fps": "Target FPS:",
|
||
"targets.fps.hint": "Target frames per second for capture and LED updates (10-90)",
|
||
"targets.border_width": "Border Width (px):",
|
||
"targets.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
|
||
"targets.interpolation": "Interpolation Mode:",
|
||
"targets.interpolation.hint": "How to calculate LED color from sampled pixels",
|
||
"targets.interpolation.average": "Average",
|
||
"targets.interpolation.median": "Median",
|
||
"targets.interpolation.dominant": "Dominant",
|
||
"targets.smoothing": "Smoothing:",
|
||
"targets.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
|
||
"targets.standby_interval": "Standby Interval:",
|
||
"targets.standby_interval.hint": "How often to resend the last frame when the screen is static, keeping the device in live mode (0.5-5.0s)",
|
||
"targets.created": "Target created successfully",
|
||
"targets.updated": "Target updated successfully",
|
||
"targets.deleted": "Target deleted successfully",
|
||
"targets.delete.confirm": "Are you sure you want to delete this target?",
|
||
"targets.error.load": "Failed to load targets",
|
||
"targets.error.required": "Please fill in all required fields",
|
||
"targets.error.name_required": "Please enter a target name",
|
||
"targets.error.delete": "Failed to delete target",
|
||
"targets.button.start": "Start",
|
||
"targets.button.stop": "Stop",
|
||
"targets.status.processing": "Processing",
|
||
"targets.status.idle": "Idle",
|
||
"targets.status.error": "Error",
|
||
"targets.metrics.actual_fps": "Actual FPS",
|
||
"targets.metrics.target_fps": "Target FPS",
|
||
"targets.metrics.frames": "Frames",
|
||
"targets.metrics.errors": "Errors",
|
||
"targets.subtab.key_colors": "Key Colors",
|
||
"targets.section.key_colors": "🎨 Key Colors Targets",
|
||
"kc.add": "Add Key Colors Target",
|
||
"kc.edit": "Edit Key Colors Target",
|
||
"kc.name": "Target Name:",
|
||
"kc.name.placeholder": "My Key Colors Target",
|
||
"kc.source": "Picture Source:",
|
||
"kc.source.hint": "Which picture source to extract colors from",
|
||
"kc.source.none": "-- No source assigned --",
|
||
"kc.fps": "Extraction FPS:",
|
||
"kc.fps.hint": "How many times per second to extract colors (1-60)",
|
||
"kc.interpolation": "Color Mode:",
|
||
"kc.interpolation.hint": "How to compute the key color from pixels in each rectangle",
|
||
"kc.interpolation.average": "Average",
|
||
"kc.interpolation.median": "Median",
|
||
"kc.interpolation.dominant": "Dominant",
|
||
"kc.smoothing": "Smoothing:",
|
||
"kc.smoothing.hint": "Temporal blending between extractions (0=none, 1=full)",
|
||
"kc.pattern_template": "Pattern Template:",
|
||
"kc.pattern_template.hint": "Select the rectangle pattern to use for color extraction",
|
||
"kc.pattern_template.none": "-- Select a pattern template --",
|
||
"kc.created": "Key colors target created successfully",
|
||
"kc.updated": "Key colors target updated successfully",
|
||
"kc.deleted": "Key colors target deleted successfully",
|
||
"kc.delete.confirm": "Are you sure you want to delete this key colors target?",
|
||
"kc.error.no_pattern": "Please select a pattern template",
|
||
"kc.error.required": "Please fill in all required fields",
|
||
"kc.colors.none": "No colors extracted yet",
|
||
"kc.test": "Test",
|
||
"kc.test.error": "Test failed",
|
||
"targets.section.pattern_templates": "📄 Pattern Templates",
|
||
"pattern.add": "📄 Add Pattern Template",
|
||
"pattern.edit": "📄 Edit Pattern Template",
|
||
"pattern.name": "Template Name:",
|
||
"pattern.name.placeholder": "My Pattern Template",
|
||
"pattern.description_label": "Description (optional):",
|
||
"pattern.description_placeholder": "Describe this pattern...",
|
||
"pattern.rectangles": "Rectangles",
|
||
"pattern.rect.name": "Name",
|
||
"pattern.rect.x": "X",
|
||
"pattern.rect.y": "Y",
|
||
"pattern.rect.width": "W",
|
||
"pattern.rect.height": "H",
|
||
"pattern.rect.add": "Add Rectangle",
|
||
"pattern.rect.remove": "Remove",
|
||
"pattern.rect.empty": "No rectangles defined. Add at least one rectangle.",
|
||
"pattern.created": "Pattern template created successfully",
|
||
"pattern.updated": "Pattern template updated successfully",
|
||
"pattern.deleted": "Pattern template deleted successfully",
|
||
"pattern.delete.confirm": "Are you sure you want to delete this pattern template?",
|
||
"pattern.delete.referenced": "Cannot delete: this template is referenced by a target",
|
||
"pattern.error.required": "Please fill in all required fields",
|
||
"pattern.visual_editor": "Visual Editor",
|
||
"pattern.capture_bg": "Capture Background",
|
||
"pattern.source_for_bg": "Source for Background:",
|
||
"pattern.source_for_bg.none": "-- Select source --",
|
||
"pattern.delete_selected": "Delete Selected",
|
||
"pattern.name.hint": "A descriptive name for this rectangle layout",
|
||
"pattern.description.hint": "Optional notes about where or how this pattern is used",
|
||
"pattern.visual_editor.hint": "Click + buttons to add rectangles. Drag edges to resize, drag inside to move.",
|
||
"pattern.rectangles.hint": "Fine-tune rectangle positions and sizes with exact coordinates (0.0 to 1.0)",
|
||
"overlay.button.show": "Show overlay visualization",
|
||
"overlay.button.hide": "Hide overlay visualization",
|
||
"overlay.started": "Overlay visualization started",
|
||
"overlay.stopped": "Overlay visualization stopped",
|
||
"overlay.error.start": "Failed to start overlay",
|
||
"overlay.error.stop": "Failed to stop overlay",
|
||
"dashboard.title": "📊 Dashboard",
|
||
"dashboard.section.targets": "Targets",
|
||
"dashboard.section.running": "Running",
|
||
"dashboard.section.stopped": "Stopped",
|
||
"dashboard.no_targets": "No targets configured",
|
||
"dashboard.uptime": "Uptime",
|
||
"dashboard.fps": "FPS",
|
||
"dashboard.errors": "Errors",
|
||
"dashboard.device": "Device",
|
||
"dashboard.stop_all": "Stop All",
|
||
"dashboard.failed": "Failed to load dashboard",
|
||
"dashboard.section.profiles": "Profiles",
|
||
"dashboard.targets": "Targets",
|
||
"dashboard.section.performance": "System Performance",
|
||
"dashboard.perf.cpu": "CPU",
|
||
"dashboard.perf.ram": "RAM",
|
||
"dashboard.perf.gpu": "GPU",
|
||
"dashboard.perf.unavailable": "unavailable",
|
||
"dashboard.poll_interval": "Refresh interval",
|
||
|
||
"profiles.title": "\uD83D\uDCCB Profiles",
|
||
"profiles.empty": "No profiles configured. Create one to automate target activation.",
|
||
"profiles.add": "\uD83D\uDCCB Add Profile",
|
||
"profiles.edit": "Edit Profile",
|
||
"profiles.delete.confirm": "Delete profile \"{name}\"?",
|
||
"profiles.name": "Name:",
|
||
"profiles.name.hint": "A descriptive name for this profile",
|
||
"profiles.enabled": "Enabled:",
|
||
"profiles.enabled.hint": "Disabled profiles won't activate even when conditions are met",
|
||
"profiles.condition_logic": "Condition Logic:",
|
||
"profiles.condition_logic.hint": "How multiple conditions are combined: ANY (OR) or ALL (AND)",
|
||
"profiles.condition_logic.or": "Any condition (OR)",
|
||
"profiles.condition_logic.and": "All conditions (AND)",
|
||
"profiles.conditions": "Conditions:",
|
||
"profiles.conditions.hint": "Rules that determine when this profile activates",
|
||
"profiles.conditions.add": "Add Condition",
|
||
"profiles.conditions.empty": "No conditions \u2014 profile will never activate automatically",
|
||
"profiles.condition.application": "Application",
|
||
"profiles.condition.application.apps": "Applications:",
|
||
"profiles.condition.application.apps.hint": "Process names, one per line (e.g. firefox.exe)",
|
||
"profiles.condition.application.browse": "Browse",
|
||
"profiles.condition.application.search": "Filter processes...",
|
||
"profiles.condition.application.no_processes": "No processes found",
|
||
"profiles.condition.application.match_type": "Match Type:",
|
||
"profiles.condition.application.match_type.hint": "How to detect the application",
|
||
"profiles.condition.application.match_type.running": "Running",
|
||
"profiles.condition.application.match_type.topmost": "Topmost (foreground)",
|
||
"profiles.condition.application.match_type.topmost_fullscreen": "Topmost + Fullscreen",
|
||
"profiles.condition.application.match_type.fullscreen": "Fullscreen",
|
||
"profiles.targets": "Targets:",
|
||
"profiles.targets.hint": "Targets to start when this profile activates",
|
||
"profiles.targets.empty": "No targets available",
|
||
"profiles.status.active": "Active",
|
||
"profiles.status.inactive": "Inactive",
|
||
"profiles.status.disabled": "Disabled",
|
||
"profiles.last_activated": "Last activated",
|
||
"profiles.logic.and": " AND ",
|
||
"profiles.logic.or": " OR ",
|
||
"profiles.logic.all": "ALL",
|
||
"profiles.logic.any": "ANY",
|
||
"profiles.updated": "Profile updated",
|
||
"profiles.created": "Profile created",
|
||
"profiles.deleted": "Profile deleted",
|
||
"profiles.error.name_required": "Name is required",
|
||
"time.hours_minutes": "{h}h {m}m",
|
||
"time.minutes_seconds": "{m}m {s}s",
|
||
"time.seconds": "{s}s",
|
||
"dashboard.type.led": "LED",
|
||
"dashboard.type.kc": "Key Colors",
|
||
"aria.close": "Close",
|
||
"aria.save": "Save",
|
||
"aria.cancel": "Cancel",
|
||
"aria.previous": "Previous",
|
||
"aria.next": "Next",
|
||
"aria.hint": "Show hint",
|
||
|
||
"color_strip.add": "🎞️ Add Color Strip Source",
|
||
"color_strip.edit": "🎞️ Edit Color Strip Source",
|
||
"color_strip.name": "Name:",
|
||
"color_strip.name.placeholder": "Wall Strip",
|
||
"color_strip.picture_source": "Picture Source:",
|
||
"color_strip.picture_source.hint": "Which screen capture source to use as input for LED color calculation",
|
||
"color_strip.fps": "Target FPS:",
|
||
"color_strip.fps.hint": "Target frames per second for LED color updates (10-90)",
|
||
"color_strip.interpolation": "Color Mode:",
|
||
"color_strip.interpolation.hint": "How to calculate LED color from sampled border pixels",
|
||
"color_strip.interpolation.average": "Average",
|
||
"color_strip.interpolation.median": "Median",
|
||
"color_strip.interpolation.dominant": "Dominant",
|
||
"color_strip.smoothing": "Smoothing:",
|
||
"color_strip.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
|
||
"color_strip.frame_interpolation": "Frame Interpolation:",
|
||
"color_strip.frame_interpolation.hint": "Blends between consecutive captured frames to produce output at the full target FPS even when capture rate is lower. Reduces visible stepping on slow ambient transitions.",
|
||
"color_strip.color_corrections": "Color Corrections",
|
||
"color_strip.brightness": "Brightness:",
|
||
"color_strip.brightness.hint": "Output brightness multiplier (0=off, 1=unchanged, 2=double). Applied after color extraction.",
|
||
"color_strip.saturation": "Saturation:",
|
||
"color_strip.saturation.hint": "Color saturation (0=grayscale, 1=unchanged, 2=double saturation)",
|
||
"color_strip.gamma": "Gamma:",
|
||
"color_strip.gamma.hint": "Gamma correction (1=none, <1=brighter midtones, >1=darker midtones)",
|
||
"color_strip.test_device": "Test on Device:",
|
||
"color_strip.test_device.hint": "Select a device to send test pixels to when clicking edge toggles",
|
||
"color_strip.leds": "LED count",
|
||
"color_strip.led_count": "LED Count:",
|
||
"color_strip.led_count.hint": "Total number of LEDs on the physical strip. For screen sources: 0 = auto from calibration (extra LEDs not mapped to edges will be black). For static color: set to match your device LED count.",
|
||
"color_strip.created": "Color strip source created",
|
||
"color_strip.updated": "Color strip source updated",
|
||
"color_strip.deleted": "Color strip source deleted",
|
||
"color_strip.delete.confirm": "Are you sure you want to delete this color strip source?",
|
||
"color_strip.delete.referenced": "Cannot delete: this source is in use by a target",
|
||
"color_strip.error.name_required": "Please enter a name",
|
||
"color_strip.type": "Type:",
|
||
"color_strip.type.hint": "Picture Source derives LED colors from a screen capture. Static Color fills all LEDs with a single constant color. Gradient distributes a color gradient across all LEDs. Color Cycle smoothly cycles through a user-defined list of colors.",
|
||
"color_strip.type.picture": "Picture Source",
|
||
"color_strip.type.static": "Static Color",
|
||
"color_strip.type.gradient": "Gradient",
|
||
"color_strip.type.color_cycle": "Color Cycle",
|
||
"color_strip.static_color": "Color:",
|
||
"color_strip.static_color.hint": "The solid color that will be sent to all LEDs on the strip.",
|
||
"color_strip.gradient.preview": "Gradient:",
|
||
"color_strip.gradient.preview.hint": "Visual preview. Click the marker track below to add a stop. Drag markers to reposition.",
|
||
"color_strip.gradient.stops": "Color Stops:",
|
||
"color_strip.gradient.stops.hint": "Each stop defines a color at a relative position (0.0 = start, 1.0 = end). The ↔ button adds a right-side color to create a hard edge at that stop.",
|
||
"color_strip.gradient.stops_count": "stops",
|
||
"color_strip.gradient.add_stop": "+ Add Stop",
|
||
"color_strip.gradient.position": "Position (0.0–1.0)",
|
||
"color_strip.gradient.bidir.hint": "Add a second color on the right side of this stop to create a hard edge in the gradient.",
|
||
"color_strip.gradient.min_stops": "Gradient must have at least 2 stops",
|
||
"color_strip.animation": "Animation",
|
||
"color_strip.animation.enabled": "Enable Animation:",
|
||
"color_strip.animation.enabled.hint": "Enables procedural animation. The LEDs will update at 30 fps driven by the selected effect.",
|
||
"color_strip.animation.type": "Effect:",
|
||
"color_strip.animation.type.hint": "The animation effect to apply. Breathing works for both static and gradient sources; Gradient Shift and Wave work for gradient sources only.",
|
||
"color_strip.animation.type.breathing": "Breathing",
|
||
"color_strip.animation.type.color_cycle": "Color Cycle",
|
||
"color_strip.animation.type.gradient_shift": "Gradient Shift",
|
||
"color_strip.animation.type.wave": "Wave",
|
||
"color_strip.animation.speed": "Speed:",
|
||
"color_strip.animation.speed.hint": "Animation speed multiplier. 1.0 ≈ one cycle per second for Breathing; higher values cycle faster.",
|
||
"color_strip.color_cycle.colors": "Colors:",
|
||
"color_strip.color_cycle.colors.hint": "List of colors to cycle through smoothly. At least 2 required. Default is a full rainbow spectrum.",
|
||
"color_strip.color_cycle.add_color": "+ Add Color",
|
||
"color_strip.color_cycle.speed": "Speed:",
|
||
"color_strip.color_cycle.speed.hint": "Cycle speed multiplier. 1.0 ≈ one full cycle every 20 seconds; higher values cycle faster.",
|
||
"color_strip.color_cycle.min_colors": "Color cycle must have at least 2 colors"
|
||
}
|