{
  "title": "UV-K5 V3 & UV-K1 Web Tool",
  "subtitle": "Firmware flasher and calibration manager via Web Serial API",
  "tabFlash": "Flash Firmware",
  "tabDump": "Dump Calib",
  "tabRestore": "Restore Calib",
  "tabLogoUpload": "Upload Logo",
  "tabLogoDump": "Download Logo",
  "labelBlVersion": "Bootloader Version (max 4 characters)",
  "labelFirmwareFile": "Firmware File (.bin)",
  "labelCalibFile": "Calibration Dump File (.dat)",
  "connectBtn": "Connect to serial port",
  "disconnectBtn": "Disconnect",
  "flashBtn": "Flash firmware",
  "dumpBtn": "Dump Calibration Data",
  "restoreBtn": "Restore Calibration Data",
  "logTitle": "Console",
  "logShow": "Show Console",
  "logHide": "Hide Console",
  "infoBox": "<strong>Note:</strong> This application requires Chrome/Edge/Opera or Firefox 151+ on desktop. Make sure your radio is in <strong>DFU mode</strong> (flash mode) before flash.",
  "infoBoxDump": "<strong>Note:</strong> This application requires Chrome/Edge/Opera or Firefox 151+ on desktop. Make sure your radio is in <strong>normal mode</strong> before dump or restore.",
  "infoBoxLogo": "<strong>Note:</strong> This application requires Chrome/Edge/Opera or Firefox 151+ on desktop. Make sure your radio is in <strong>normal mode</strong>.",
  "fileNoFile": "No file selected",
  "fileChoose": "Choose file",
  "dumpDescription": "Extract calibration data from your UV-K5 V3 or UV-K1 device.",
  "downloadText": "Download calibration.dat",
  "firmwareLoaded": "Firmware loaded: {0}, size: {1} bytes",
  "calibLoaded": "Calibration file loaded: {0}, size: {1} bytes",
  "calibInvalidSize": "Invalid calibration file size. Expected 512 bytes, got {0} bytes",
  "connected": "Connected to serial port",
  "disconnected": "Disconnected",
  "error": "Error: {0}",
  "flashError": "Flash error: {0}",
  "establishing": "Establishing contact with device...",
  "waiting": "Waiting for device messages...",
  "uidLabel": "UID: {0}",
  "blVersionLabel": "BL Version: {0}",
  "blWarning": "⚠️ WARNING: BL version mismatch! Expected: {0}, Got: {1}",
  "deviceDetected": "Device detected",
  "handshake": "Handshake...",
  "sendingBlVersion": "Sending BL version...",
  "waitingStop": "Waiting for DEV_INFO messages to stop...",
  "devInfoIgnored": "DEV_INFO message ignored",
  "bufferCleaned": "Buffer cleaned, {0} bytes remaining",
  "handshakeComplete": "Handshake complete",
  "programming": "Programming {0} pages...",
  "pageOk": "Page {0}/{1} OK",
  "pageError": "Page {0}/{1}: error {2}",
  "pageTimeout": "Page {0}/{1}: timeout",
  "pageWrongResponse": "Page {0}/{1}: response for page {2}, ignored",
  "tooManyErrors": "Too many errors on page {0}",
  "tooManyTimeouts": "Too many timeouts on page {0}",
  "programmingComplete": "Programming complete! 👍🏼",
  "dumpingData": "Dumping calibration data...",
  "dumpProgress": "Dumping: {0}/{1} bytes ({2}%)",
  "dumpComplete": "Dump complete! 👍🏼",
  "dumpSaved": "Calibration data saved to file",
  "restoringData": "Restoring calibration data...",
  "restoreProgress": "Restoring: {0}/{1} bytes ({2}%)",
  "restoreComplete": "Restore complete! 👍🏼",
  "rebooting": "Rebooting device...",
  "rebootComplete": "Device rebooted",
  "readingEeprom": "Reading EEPROM at offset 0x{0}...",
  "writingEeprom": "Writing EEPROM at offset 0x{0}...",
  "eepromReadOk": "EEPROM read OK: offset 0x{0}, size {1}",
  "eepromWriteOk": "EEPROM write OK: offset 0x{0}",
  "eepromError": "EEPROM error at offset 0x{0}",
  "retry": "Retrying...",
  "startReading": "Starting continuous reading...",
  "rxData": "RX: {0} bytes, total buffer: {1}",
  "streamClosed": "Stream closed",
  "readError": "Read error: {0}",
  "readComplete": "Reading complete",
  "requestingPort": "Requesting serial port...",
  "openingPort": "Opening port...",
  "gettingReader": "Getting reader...",
  "gettingWriter": "Getting writer...",
  "startingRead": "Starting reading...",
  "waiting500ms": "Waiting 500ms...",
  "connectionError": "Connection error: {0}",
  "bufferEmpty": "Buffer emptied, waiting for data...",
  "bufferContains": "Buffer contains {0} bytes",
  "messageReceived": "Message received: type=0x{0}",
  "interval": "Interval: {0}ms, acc={1}",
  "invalidInterval": "Invalid interval ({0}ms), reset acc",
  "validMessage": "Valid message, acc={0}/5",
  "timeoutNoDevice": "Timeout: no device detected",
  "webSerialNotSupported": "⚠️ Web Serial API not supported. Use Chrome/Edge/Opera or Firefox 151+ on desktop.",
  "loopError": "Loop read error: {0}",
  "baselineDeveloped": "developed by",
  "labelLogoFile": "Image file",
  "labelLogoThreshold": "Threshold",
  "labelLogoInvert": "Invert colors",
  "labelLogoPreview": "Preview (128x64):",
  "logoUploadDescription": "Upload a custom 128x64 boot logo to your radio. Any image format is accepted (PNG, JPG, BMP, etc.). The image is automatically resized and converted to monochrome.",
  "logoDumpDescription": "Read the current boot logo from your radio and download it as a PNG.",
  "logoUploadBtn": "Upload Logo to Radio",
  "logoDumpBtn": "Download Logo from Radio",
  "logoDumpedLabel": "Downloaded logo (128x64):",
  "logoDumpDownloadText": "Download logo.png",
  "logoLoaded": "Image loaded: {0}",
  "logoDecodeError": "Failed to decode image",
  "logoUploading": "Uploading logo to radio...",
  "logoUploadComplete": "Logo uploaded! 👍🏼",
  "logoDumping": "Downloading logo from radio...",
  "logoDumpComplete": "Logo downloaded! 👍🏼",
  "logoMagicOk": "Magic header OK (F4HWNLGO)",
  "logoMagicMissing": "Magic header missing — area may have never been written by UVTools2"
}
