Files
HC_APTBS/Resources/Strings.es.xaml
LucianoDev 827b811b39 feat: developer tools page, auto-test orchestrator, BIP display, tests redesign
Bundles several feature streams that have been iterating on the working tree:

- Developer Tools page (Debug-only via DEVELOPER_TOOLS symbol): hosts the
  identification card, manual KWP write + transaction log, ROM/EEPROM dump
  card with progress banner and completion message, persisted custom-commands
  library, persisted EEPROM passwords library. New service primitives:
  IKwpService.SendRawCustomAsync / ReadEepromAsync / ReadRomEepromAsync.
  Persistence mirrors the Clients XML pattern in two new files
  (custom_commands.xml, eeprom_passwords.xml).
- Auto-test orchestrator (IAutoTestOrchestrator + AutoTestState): linear
  K-Line read -> unlock -> bench-on -> test sequence with snackbar UI and
  progress dialog VM, gated on dashboard alarms.
- BIP-STATUS display: BipDisplayViewModel + BipDisplayView, RAM read at
  0x0106 via IKwpService.ReadBipStatusAsync; status definitions in
  BipStatusDefinition.
- Tests page redesign: TestSectionCard + PhaseTileView replacing the old
  TestPlanView/TestRunningView/TestDoneView/TestPreconditionsView/
  TestSectionView controls and their VMs.
- Pump command sliders: Fluent thick-track style with overhang thumb,
  click-anywhere-and-drag, mouse-wheel adjustment.
- Window startup: app.manifest declares PerMonitorV2 DPI awareness,
  MainWindow installs a WM_GETMINMAXINFO hook in OnSourceInitialized and
  maximizes there (after the hook is in place) so the app fits the work
  area exactly on any display configuration.
- Misc: PercentToPixelsConverter, seed_aliases.py one-shot pump-alias
  importer, tools/Import-BipStatus.ps1, kline_eeprom_spec.md and
  dump-functions reference docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 13:59:50 +02:00

634 lines
48 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=System.Runtime">
<!-- ══════════════════════════════════════════════════════════════════
Spanish (ESP) — Default language
══════════════════════════════════════════════════════════════════ -->
<!-- ── App ──────────────────────────────────────────────────────────── -->
<sys:String x:Key="App.Title">HC_APTBS — Herlic Banco de Pruebas</sys:String>
<!-- ── Navigation rail ──────────────────────────────────────────────── -->
<sys:String x:Key="Nav.Dashboard">Panel</sys:String>
<sys:String x:Key="Nav.Bench">Banco</sys:String>
<sys:String x:Key="Nav.Pump">Bomba</sys:String>
<sys:String x:Key="Nav.Tests">Pruebas</sys:String>
<sys:String x:Key="Nav.Results">Resultados</sys:String>
<sys:String x:Key="Nav.Settings">Configuración</sys:String>
<!-- ── Página de panel ──────────────────────────────────────────────── -->
<sys:String x:Key="Dashboard.Readings">Lecturas del banco</sys:String>
<sys:String x:Key="Dashboard.Connections">Conexiones</sys:String>
<sys:String x:Key="Dashboard.Conn.Can">Bus CAN</sys:String>
<sys:String x:Key="Dashboard.Conn.Bench">Controlador del banco</sys:String>
<sys:String x:Key="Dashboard.Conn.Pump">ECU de la bomba</sys:String>
<sys:String x:Key="Dashboard.Conn.KLine">Sesión K-Line</sys:String>
<sys:String x:Key="Dashboard.StateOnline">EN LÍNEA</sys:String>
<sys:String x:Key="Dashboard.StateOffline">FUERA DE LÍNEA</sys:String>
<sys:String x:Key="Dashboard.StateOpen">ABIERTA</sys:String>
<sys:String x:Key="Dashboard.StateClosed">CERRADA</sys:String>
<sys:String x:Key="Dashboard.StateFailed">FALLO</sys:String>
<sys:String x:Key="Dashboard.Alarms">Alarmas activas</sys:String>
<sys:String x:Key="Dashboard.AlarmsNone">Sistema OK — sin alarmas activas</sys:String>
<sys:String x:Key="Dashboard.TestSummary">Resumen de prueba</sys:String>
<sys:String x:Key="Dashboard.TestActive">Activa:</sys:String>
<sys:String x:Key="Dashboard.TestPhase">Fase:</sys:String>
<sys:String x:Key="Dashboard.NoTestRunning">No hay ninguna prueba en curso.</sys:String>
<sys:String x:Key="Dashboard.LastTestPass">Última prueba: APROBADA</sys:String>
<sys:String x:Key="Dashboard.LastTestFail">Última prueba: FALLIDA</sys:String>
<sys:String x:Key="Dashboard.Action.StartTest">Iniciar prueba</sys:String>
<sys:String x:Key="Dashboard.Action.StartTest.Tip">Requiere una bomba seleccionada y conexión CAN abierta.</sys:String>
<sys:String x:Key="Dashboard.Action.AutoTest">Conectar y probar</sys:String>
<sys:String x:Key="Dashboard.Action.AutoTest.Tip">Abre K-Line, lee la bomba, desbloquea si procede, enciende el banco y comienza la prueba en un solo paso.</sys:String>
<sys:String x:Key="Dashboard.Action.Stop">Detener</sys:String>
<sys:String x:Key="Dashboard.Action.EmergencyStop">PARADA DE EMERGENCIA</sys:String>
<!-- ── Dashboard KPI tile labels ──────────────────────────────────────── -->
<sys:String x:Key="Dashboard.Kpi.Rpm">RPM del banco</sys:String>
<sys:String x:Key="Dashboard.Kpi.Qdelivery">Q. caudal</sys:String>
<sys:String x:Key="Dashboard.Kpi.P1">Presión P1</sys:String>
<sys:String x:Key="Dashboard.Kpi.P2">Presión P2</sys:String>
<sys:String x:Key="Dashboard.Kpi.Tin">T. entrada</sys:String>
<sys:String x:Key="Dashboard.Kpi.Tout">T. salida</sys:String>
<sys:String x:Key="Dashboard.Kpi.Unit.Rpm">rpm</sys:String>
<sys:String x:Key="Dashboard.Kpi.Unit.CcS">cc/s</sys:String>
<sys:String x:Key="Dashboard.Kpi.Unit.Bar">bar</sys:String>
<sys:String x:Key="Dashboard.Kpi.Unit.Celsius">°C</sys:String>
<!-- Dashboard test summary extras -->
<sys:String x:Key="Dashboard.TestSummary.Elapsed">Duración:</sys:String>
<!-- Dashboard connection chip extras -->
<sys:String x:Key="Dashboard.Conn.Pump.Label">Bomba:</sys:String>
<sys:String x:Key="Dashboard.Conn.NoPump">Sin bomba</sys:String>
<!-- ── Dashboard Devices column ─────────────────────────────────────── -->
<sys:String x:Key="Dashboard.Devices">Dispositivos</sys:String>
<sys:String x:Key="Dashboard.Devices.Can">CAN</sys:String>
<sys:String x:Key="Dashboard.Devices.Kline">K-Line</sys:String>
<sys:String x:Key="Dashboard.Devices.Bench">Banco</sys:String>
<sys:String x:Key="Dashboard.Devices.Refresh">Actualizar</sys:String>
<sys:String x:Key="Dashboard.Devices.State.Idle">Disponible</sys:String>
<sys:String x:Key="Dashboard.Devices.State.Connected">Conectado</sys:String>
<sys:String x:Key="Dashboard.Devices.State.Active">Sesión activa</sys:String>
<sys:String x:Key="Dashboard.Devices.State.Failed">Error</sys:String>
<sys:String x:Key="Dashboard.Devices.None">Sin dispositivos</sys:String>
<sys:String x:Key="Dashboard.Devices.BenchRow">Controlador del banco</sys:String>
<!-- CAN connect/disconnect snackbar -->
<sys:String x:Key="Dashboard.Devices.Snackbar.Connecting">Conectando con CAN…</sys:String>
<sys:String x:Key="Dashboard.Devices.Snackbar.Disconnecting">Desconectando CAN…</sys:String>
<sys:String x:Key="Dashboard.Devices.Snackbar.Connected">CAN conectado</sys:String>
<sys:String x:Key="Dashboard.Devices.Snackbar.Disconnected">CAN desconectado</sys:String>
<sys:String x:Key="Dashboard.Devices.Snackbar.Failed">Operación fallida</sys:String>
<!-- Confirmation dialogs -->
<sys:String x:Key="Devices.Confirm.Title">Confirmar cambio de dispositivo</sys:String>
<sys:String x:Key="Devices.Confirm.Body.Active">La sesión {0} está activa. ¿Desea desconectar?</sys:String>
<sys:String x:Key="Devices.Confirm.Body.TestRunning">Hay una prueba en ejecución. Cambiar el estado del dispositivo puede interrumpirla. ¿Continuar?</sys:String>
<!-- ── Status bar / connection indicators ───────────────────────────── -->
<sys:String x:Key="Status.Label">Estado:</sys:String>
<sys:String x:Key="Status.Can">CAN</sys:String>
<sys:String x:Key="Status.Bench">Banco</sys:String>
<sys:String x:Key="Status.Pump">Bomba</sys:String>
<sys:String x:Key="Status.KLine">K-Line</sys:String>
<sys:String x:Key="Status.Connected">Conectado</sys:String>
<sys:String x:Key="Status.ConnectionFailed">Fallo de conexión</sys:String>
<sys:String x:Key="Status.Disconnected">Desconectado</sys:String>
<!-- ── Bench section ────────────────────────────────────────────────── -->
<sys:String x:Key="Bench.ConnectCan">Conectar CAN</sys:String>
<sys:String x:Key="Bench.DisconnectCan">Desconectar CAN</sys:String>
<sys:String x:Key="Bench.Rpm">rpm</sys:String>
<sys:String x:Key="Bench.Target">Objetivo:</sys:String>
<sys:String x:Key="Bench.Voltage">V:</sys:String>
<sys:String x:Key="Bench.TempIn">T. Ent.:</sys:String>
<sys:String x:Key="Bench.TempOut">T. Sal.:</sys:String>
<sys:String x:Key="Bench.Temp4">T. 4:</sys:String>
<sys:String x:Key="Bench.TempTank">T. Tanq.:</sys:String>
<sys:String x:Key="Bench.P1">P1:</sys:String>
<sys:String x:Key="Bench.P2">P2:</sys:String>
<sys:String x:Key="Bench.QDelivery">Q-Del.:</sys:String>
<sys:String x:Key="Bench.QOver">Q-Over:</sys:String>
<sys:String x:Key="Bench.CcStroke">cc/golpe</sys:String>
<sys:String x:Key="Bench.PumpRpm">P-RPM:</sys:String>
<sys:String x:Key="Bench.PumpTemp">P-Temp:</sys:String>
<sys:String x:Key="Bench.PumpMe">P-ME:</sys:String>
<sys:String x:Key="Bench.PumpFbkw">P-FBkW:</sys:String>
<sys:String x:Key="Bench.PsgEncoder">Encoder PSG:</sys:String>
<!-- ── Bench controls ───────────────────────────────────────────────── -->
<sys:String x:Key="Bench.Direction">Dirección</sys:String>
<sys:String x:Key="Bench.Left">IZQUIERDA</sys:String>
<sys:String x:Key="Bench.Right">DERECHA</sys:String>
<sys:String x:Key="Bench.Motor">Motor del Banco</sys:String>
<sys:String x:Key="Bench.Start">ARRANCAR</sys:String>
<sys:String x:Key="Bench.Stop">PARAR</sys:String>
<sys:String x:Key="Bench.SetRpm">Fijar RPM:</sys:String>
<sys:String x:Key="Bench.Go">IR</sys:String>
<sys:String x:Key="Bench.OilPump">Bomba de Aceite</sys:String>
<sys:String x:Key="Bench.OilOff">ACEITE OFF</sys:String>
<sys:String x:Key="Bench.OilOn">ACEITE ON</sys:String>
<sys:String x:Key="Bench.Counter">Contador</sys:String>
<sys:String x:Key="Bench.Turns">Vueltas:</sys:String>
<sys:String x:Key="Bench.Send">Enviar</sys:String>
<sys:String x:Key="Bench.Relays">Relés</sys:String>
<sys:String x:Key="Bench.Electronic">Electrónico</sys:String>
<sys:String x:Key="Bench.DepositCooler">Enfriador Depósito</sys:String>
<sys:String x:Key="Bench.DepositHeater">Calentador Depósito</sys:String>
<sys:String x:Key="Bench.TinCooler">Enfriador T-in</sys:String>
<sys:String x:Key="Bench.Flasher">Intermitente</sys:String>
<sys:String x:Key="Bench.Pulse4Signal">Señal 4-Pulsos</sys:String>
<sys:String x:Key="Bench.RelayOn">ON</sys:String>
<sys:String x:Key="Bench.RelayOff">OFF</sys:String>
<sys:String x:Key="Bench.TempControl">Temperatura</sys:String>
<sys:String x:Key="Bench.Setpoint">Consigna</sys:String>
<sys:String x:Key="Bench.Tolerance">Tolerancia</sys:String>
<sys:String x:Key="Bench.ApplySetpoint">Aplicar consigna</sys:String>
<!-- ── Pump page sub-nav / banners ──────────────────────────────────── -->
<sys:String x:Key="PumpSub.Identification">Identificación</sys:String>
<sys:String x:Key="PumpSub.Dtcs">Códigos de Falla</sys:String>
<sys:String x:Key="PumpSub.LiveData">Datos en Vivo</sys:String>
<sys:String x:Key="PumpSub.Adaptation">Adaptación</sys:String>
<sys:String x:Key="PumpSub.Unlock">Desbloqueo Immo</sys:String>
<sys:String x:Key="Pump.KLineClosed">La sesión K-Line no está abierta. Identifique una bomba para iniciar el diagnóstico.</sys:String>
<sys:String x:Key="Pump.NoPumpSelected">Seleccione una bomba en la pestaña Identificación para habilitar el diagnóstico.</sys:String>
<sys:String x:Key="Pump.NoUnlockActive">No hay ningún desbloqueo de inmovilizador en curso para esta bomba.</sys:String>
<sys:String x:Key="PumpLive.Engineering">Valores de ingeniería (en bruto)</sys:String>
<!-- ── DTC list ─────────────────────────────────────────────────────── -->
<sys:String x:Key="Dtc.Read">Leer DTC</sys:String>
<sys:String x:Key="Dtc.Clear">Borrar DTC</sys:String>
<sys:String x:Key="Dtc.NoFaults">La ECU no reportó códigos de falla.</sys:String>
<sys:String x:Key="Dtc.LastRead">Última lectura:</sys:String>
<sys:String x:Key="Dtc.Cleared">Códigos de falla borrados.</sys:String>
<!-- ── Auth gate ────────────────────────────────────────────────────── -->
<sys:String x:Key="AuthGate.LockedTitle">Se requiere autenticación</sys:String>
<sys:String x:Key="AuthGate.LockedMessage">Esta sección puede modificar parámetros de la bomba. Inicie sesión para desbloquearla.</sys:String>
<sys:String x:Key="AuthGate.Authenticate">Autenticar…</sys:String>
<sys:String x:Key="AuthGate.UnlockedAs">Desbloqueado como</sys:String>
<sys:String x:Key="AuthGate.Lock">Bloquear</sys:String>
<!-- ── Pump live data ───────────────────────────────────────────────── -->
<sys:String x:Key="Pump.THyb">T-hyb</sys:String>
<sys:String x:Key="Pump.Rpm">RPM</sys:String>
<sys:String x:Key="Pump.TEin">T-ein</sys:String>
<sys:String x:Key="Pump.UnitRpm">1/min</sys:String>
<sys:String x:Key="Pump.UnitCelsius">°C</sys:String>
<sys:String x:Key="Pump.UnitUs">µs</sys:String>
<sys:String x:Key="Pump.Commands.Title">Pump Commands</sys:String>
<sys:String x:Key="Pump.Commands.Me">ME</sys:String>
<sys:String x:Key="Pump.Commands.Fbkw">FBKW</sys:String>
<sys:String x:Key="Pump.Commands.PreIn">Pre-inj</sys:String>
<sys:String x:Key="Pump.LiveData.Title">Live Data</sys:String>
<sys:String x:Key="Pump.LiveData.RPM">RPM Bomba</sys:String>
<sys:String x:Key="Pump.LiveData.THyb">T-hyb</sys:String>
<sys:String x:Key="Pump.LiveData.TEin">T-ein</sys:String>
<sys:String x:Key="Pump.LiveData.Me">ME</sys:String>
<sys:String x:Key="Pump.LiveData.Fbkw">FBKW</sys:String>
<sys:String x:Key="Pump.LiveData.RpmChart">Tendencia RPM</sys:String>
<sys:String x:Key="Pump.Status.Active">Activo</sys:String>
<sys:String x:Key="Pump.Bip.Title">BIP-STATUS</sys:String>
<sys:String x:Key="Pump.Bip.RawLabel">BIP:</sys:String>
<sys:String x:Key="Pump.Bip.Desc.0000.9">BIP detectado, sin fallo actual</sys:String>
<sys:String x:Key="Pump.Bip.Desc.000F.9">Sin BIP en todo el período de detección</sys:String>
<sys:String x:Key="Pump.Bip.Desc.00F0.9">Sin BIP en período de detección, MV desactivada (o.k.)</sys:String>
<sys:String x:Key="Pump.Bip.Desc.0F00.9">Sin excitación de MV por MAB</sys:String>
<sys:String x:Key="Pump.Bip.Desc.F00F.9">BIP detectado, pero desviación excesiva respecto a la curva característica</sys:String>
<sys:String x:Key="Pump.Bip.Desc.A00F.9">BIP detectado, pero demasiado cerca del punto de conmutación HLU</sys:String>
<sys:String x:Key="Pump.Bip.Desc.000F.11">Sin BIP en todo el período de detección (Ford)</sys:String>
<sys:String x:Key="Pump.Dfi.Title">Calibración Ralentí</sys:String>
<sys:String x:Key="Pump.Dfi.Version">Versión</sys:String>
<sys:String x:Key="Pump.Dfi.Current">DFI Actual</sys:String>
<sys:String x:Key="Pump.Dtcs.Title">Códigos de Falla</sys:String>
<sys:String x:Key="Pump.Identification.Title">Identificación</sys:String>
<sys:String x:Key="Pump.TopStrip.Brand">Marca</sys:String>
<sys:String x:Key="Pump.TopStrip.NoPump">Sin bomba seleccionada</sys:String>
<sys:String x:Key="Pump.TopStrip.Can">CAN</sys:String>
<sys:String x:Key="Pump.TopStrip.KLine">K-Line</sys:String>
<sys:String x:Key="Pump.NoPumpBanner">Sin bomba seleccionada — seleccione una bomba para habilitar el diagnóstico.</sys:String>
<sys:String x:Key="Pump.FastUnlock">Intento de desbloqueo rápido...</sys:String>
<!-- ── Pump identification ──────────────────────────────────────────── -->
<sys:String x:Key="PumpId.Label">Bomba:</sys:String>
<sys:String x:Key="PumpId.Dfi">DFI:</sys:String>
<sys:String x:Key="PumpId.PumpId">ID Bomba:</sys:String>
<sys:String x:Key="PumpId.SerialNo">Nro. Serie:</sys:String>
<sys:String x:Key="PumpId.ModelRef">Ref. Modelo:</sys:String>
<sys:String x:Key="PumpId.DataRecord">Registro Datos:</sys:String>
<sys:String x:Key="PumpId.PumpCtrl">Ctrl. Bomba:</sys:String>
<sys:String x:Key="PumpId.ModelIndex">Índice Modelo:</sys:String>
<sys:String x:Key="PumpId.SwVer1">SW Ver 1:</sys:String>
<sys:String x:Key="PumpId.SwVer2">SW Ver 2:</sys:String>
<sys:String x:Key="PumpId.Errors">Errores:</sys:String>
<sys:String x:Key="PumpId.Error">Error:</sys:String>
<sys:String x:Key="PumpId.ReadKLine">Leer K-Line</sys:String>
<sys:String x:Key="PumpId.Disconnect">Desconectar</sys:String>
<sys:String x:Key="PumpId.NoKLineDevice">No se encontró dispositivo K-Line</sys:String>
<!-- ── DFI management ───────────────────────────────────────────────── -->
<sys:String x:Key="Dfi.Read">LEER</sys:String>
<sys:String x:Key="Dfi.Write">ESCRIBIR</sys:String>
<sys:String x:Key="Dfi.Label">DFI:</sys:String>
<sys:String x:Key="Dfi.Auto">AUTO</sys:String>
<!-- ── Pump control sliders ─────────────────────────────────────────── -->
<sys:String x:Key="PumpCtrl.Fbkw">FBKW - Control de Avance</sys:String>
<sys:String x:Key="PumpCtrl.Me">ME - Control de Caudal</sys:String>
<sys:String x:Key="PumpCtrl.PreInj">ME - Caudal Pre-inyección</sys:String>
<sys:String x:Key="PumpCtrl.MinStepMax">Mín / Paso / Máx</sys:String>
<sys:String x:Key="PumpCtrl.Min">Mín</sys:String>
<sys:String x:Key="PumpCtrl.Step">Paso</sys:String>
<sys:String x:Key="PumpCtrl.Max">Máx</sys:String>
<!-- ── Bench parameter config ───────────────────────────────────────── -->
<sys:String x:Key="BenchParam.CanBusId">CAN-Bus ID (0x)</sys:String>
<sys:String x:Key="BenchParam.ByteL">Byte L</sys:String>
<sys:String x:Key="BenchParam.ByteH">Byte H</sys:String>
<sys:String x:Key="BenchParam.FilterAlpha">Filtro α</sys:String>
<sys:String x:Key="BenchParam.EnableFormula">Habilitar fórmula</sys:String>
<!-- ── Angle display ────────────────────────────────────────────────── -->
<sys:String x:Key="Angle.Header">MONITOREO DE AVANCE</sys:String>
<sys:String x:Key="Angle.Psg">PSG:</sys:String>
<sys:String x:Key="Angle.Inj">INJ:</sys:String>
<sys:String x:Key="Angle.AbsDeg">ABS º:</sys:String>
<sys:String x:Key="Angle.LockDeg">LOCK º:</sys:String>
<sys:String x:Key="Angle.SetPsgZero">Fijar referencia cero PSG</sys:String>
<sys:String x:Key="Angle.SetInjZero">Fijar referencia cero INJ</sys:String>
<!-- ── Bench page — Fluent redesign cards ───────────────────────────── -->
<sys:String x:Key="Bench.RpmCommand.Title">Mando RPM</sys:String>
<sys:String x:Key="Bench.RpmCommand.Actual">Actual</sys:String>
<sys:String x:Key="Bench.RpmCommand.Target">Objetivo</sys:String>
<sys:String x:Key="Bench.RpmCommand.Apply">Aplicar</sys:String>
<sys:String x:Key="Bench.Actuators.Title">Actuadores y Relés</sys:String>
<sys:String x:Key="Bench.Actuators.Direction">Dirección</sys:String>
<sys:String x:Key="Bench.Actuators.DirRight">Derecha</sys:String>
<sys:String x:Key="Bench.Actuators.DirLeft">Izquierda</sys:String>
<sys:String x:Key="Bench.Actuators.OilPump">Bomba de Aceite</sys:String>
<sys:String x:Key="Bench.Actuators.Counter">Contador</sys:String>
<sys:String x:Key="Bench.Actuators.Set">Fijar</sys:String>
<sys:String x:Key="Bench.Actuators.Temperature">Temperatura</sys:String>
<sys:String x:Key="Bench.Actuators.Setpoint">Consigna °C</sys:String>
<sys:String x:Key="Bench.Actuators.Tolerance">Tolerancia ±°C</sys:String>
<sys:String x:Key="Bench.Actuators.Heater">Calefactor</sys:String>
<sys:String x:Key="Bench.Actuators.DepositCooler">Refr. Dep.</sys:String>
<sys:String x:Key="Bench.Actuators.TinCooler">Refr. T-In</sys:String>
<sys:String x:Key="Bench.Actuators.Relays">Relés Misc.</sys:String>
<sys:String x:Key="Bench.Actuators.Electronic">Electrónico</sys:String>
<sys:String x:Key="Bench.Actuators.Flasher">Flasher</sys:String>
<sys:String x:Key="Bench.Actuators.Pulse4">Pulso 4</sys:String>
<sys:String x:Key="Bench.LiveData.Title">Datos en Vivo</sys:String>
<sys:String x:Key="Bench.Charts.Title">Gráficos</sys:String>
<sys:String x:Key="Bench.Advance.Title">Monitor de Avance</sys:String>
<sys:String x:Key="Bench.Advance.Delta">Offset Bloqueo Δ°</sys:String>
<sys:String x:Key="Bench.Advance.ZeroPsg">Cero PSG</sys:String>
<sys:String x:Key="Bench.Advance.ZeroInj">Cero INJ</sys:String>
<sys:String x:Key="Bench.Advance.Lock">Bloqueo</sys:String>
<sys:String x:Key="Bench.Kpi.Rpm">RPM Banco</sys:String>
<sys:String x:Key="Bench.Kpi.P1">Presión P1</sys:String>
<sys:String x:Key="Bench.Kpi.P2">Presión P2</sys:String>
<sys:String x:Key="Bench.Kpi.QDelivery">Q Entrega</sys:String>
<sys:String x:Key="Bench.Kpi.QOver">Q Derrame</sys:String>
<sys:String x:Key="Bench.Kpi.TIn">T-Ent.</sys:String>
<sys:String x:Key="Bench.Kpi.TOut">T-Sal.</sys:String>
<sys:String x:Key="Bench.Kpi.T4">T4</sys:String>
<sys:String x:Key="Bench.Kpi.TTank">T-Tanque</sys:String>
<sys:String x:Key="Bench.Kpi.BenchTemp">T. Banco</sys:String>
<sys:String x:Key="Bench.Kpi.Unit.Bar">bar</sys:String>
<sys:String x:Key="Bench.Kpi.Unit.CcS">cc/iny.</sys:String>
<sys:String x:Key="Bench.Chart.Delivery">Q Entrega</sys:String>
<sys:String x:Key="Bench.Chart.Over">Q Derrame</sys:String>
<sys:String x:Key="Bench.Chart.P1">Presión P1</sys:String>
<sys:String x:Key="Bench.Chart.P2">Presión P2</sys:String>
<!-- ── Test panel ───────────────────────────────────────────────────── -->
<sys:String x:Key="Test.StartTest">▶ INICIAR TEST</sys:String>
<sys:String x:Key="Test.Stop">■ PARAR</sys:String>
<sys:String x:Key="Test.Report">📄 Informe</sys:String>
<sys:String x:Key="Test.ShowValues">Mostrar valores</sys:String>
<sys:String x:Key="Test.CheckAll">Marcar Todos</sys:String>
<sys:String x:Key="Test.SecondsRemaining">s restantes</sys:String>
<sys:String x:Key="Test.Condition">Cond:</sys:String>
<sys:String x:Key="Test.Measurement">Med:</sys:String>
<sys:String x:Key="Test.MeasPerSec">M/s:</sys:String>
<sys:String x:Key="Test.Required">Requerido:</sys:String>
<sys:String x:Key="Test.TestLabel">Test:</sys:String>
<sys:String x:Key="Test.Critical">Crítico</sys:String>
<sys:String x:Key="Test.Plan.Title">Plan — selecciona las fases a ejecutar</sys:String>
<sys:String x:Key="Test.Plan.Remaining">estimado</sys:String>
<sys:String x:Key="Test.Plan.EnableAll">Todas las fases</sys:String>
<sys:String x:Key="Test.Plan.HoverHint">Pasa el cursor sobre una fase para ver valores</sys:String>
<sys:String x:Key="Test.Plan.MetaCond">Cond</sys:String>
<sys:String x:Key="Test.Plan.MetaMeas">Med</sys:String>
<sys:String x:Key="Test.Plan.MetaMps">M/s</sys:String>
<sys:String x:Key="Test.Plan.NoIndicators">sin mediciones</sys:String>
<sys:String x:Key="Test.Started">Test iniciado...</sys:String>
<sys:String x:Key="Test.Stopped">Test detenido.</sys:String>
<!-- ── Barra de estado de la página de tests ──────────────────────────── -->
<sys:String x:Key="Test.Status.Ready">Listo para comenzar</sys:String>
<sys:String x:Key="Test.Status.NotReady">No listo</sys:String>
<sys:String x:Key="Test.Status.Running">Ejecutando</sys:String>
<sys:String x:Key="Test.Status.NoPhases">Selecciona al menos una fase para comenzar.</sys:String>
<!-- ── Checklist de precondiciones ────────────────────────────────────── -->
<sys:String x:Key="Test.Precheck.Title">Precondiciones</sys:String>
<sys:String x:Key="Test.Precheck.PumpSelected">Bomba seleccionada</sys:String>
<sys:String x:Key="Test.Precheck.CanLive">Bus CAN activo</sys:String>
<sys:String x:Key="Test.Precheck.KLineOpen">Sesión K-Line abierta</sys:String>
<sys:String x:Key="Test.Precheck.RpmZero">RPM del banco a cero</sys:String>
<sys:String x:Key="Test.Precheck.OilPumpOn">Bomba de aceite en marcha</sys:String>
<sys:String x:Key="Test.Precheck.NoCriticalAlarms">Sin alarmas críticas</sys:String>
<sys:String x:Key="Test.Precheck.UserAuth">Usuario autenticado</sys:String>
<sys:String x:Key="Test.Precheck.FixButton">Corregir</sys:String>
<sys:String x:Key="Test.Precheck.Ready">Todas las precondiciones cumplidas. Listo para comenzar.</sys:String>
<sys:String x:Key="Test.Precheck.NotReady">Resuelva los elementos anteriores antes de comenzar.</sys:String>
<sys:String x:Key="Test.Precheck.AuthBanner">Este test requiere autenticación del operador.</sys:String>
<sys:String x:Key="Test.Precheck.AuthButton">Autenticar…</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.SelectPump">Vaya a la página de Bomba para seleccionar una.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.CheckCan">Abra el Dashboard para verificar la conexión CAN.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.OpenKLine">Abra una sesión K-Line en la página Bomba.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.StopBench">Detenga el banco desde la página Banco.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.StartOilPump">Arranque la bomba de aceite desde la página Banco.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.ClearAlarms">Elimine las alarmas críticas en el Dashboard.</sys:String>
<sys:String x:Key="Test.Precheck.Remediation.Authenticate">Autentique al operador arriba.</sys:String>
<!-- ── Controles del paso En ejecución ────────────────────────────────── -->
<sys:String x:Key="Test.Running.Abort">■ Abortar</sys:String>
<sys:String x:Key="Test.Running.Pause">Pausar</sys:String>
<sys:String x:Key="Test.Running.Resume">Reanudar</sys:String>
<sys:String x:Key="Test.Running.Retry">Reintentar fase</sys:String>
<sys:String x:Key="Test.Running.Skip">Saltar fase</sys:String>
<sys:String x:Key="Test.Running.ComingSoon">Próximamente</sys:String>
<!-- ── Paso Finalizado ────────────────────────────────────────────────── -->
<sys:String x:Key="Test.Done.Passed">APROBADO</sys:String>
<sys:String x:Key="Test.Done.Failed">FALLIDO</sys:String>
<sys:String x:Key="Test.Done.ViewFullResults">Ver resultados completos</sys:String>
<sys:String x:Key="Test.Done.RunAgain">Ejecutar de nuevo</sys:String>
<sys:String x:Key="Test.Done.ClearData">Borrar resultados</sys:String>
<!-- ── Confirmación de aborto ─────────────────────────────────────────── -->
<sys:String x:Key="Test.Abort.Title">¿Abortar el test?</sys:String>
<sys:String x:Key="Test.Abort.Message">Detener el test ahora finalizará la fase actual y devolverá resultados parciales. ¿Continuar?</sys:String>
<sys:String x:Key="Test.Abort.Confirm">Abortar</sys:String>
<sys:String x:Key="Test.Abort.Cancel">Seguir ejecutando</sys:String>
<!-- ── Test types ───────────────────────────────────────────────────── -->
<sys:String x:Key="TestType.Warmup">Calentamiento</sys:String>
<sys:String x:Key="TestType.Adjustment">Ajuste</sys:String>
<sys:String x:Key="TestType.Flow">Caudal</sys:String>
<sys:String x:Key="TestType.ServoValve">Servoválvula</sys:String>
<sys:String x:Key="TestType.Upstroke">Carrera Ascendente</sys:String>
<sys:String x:Key="TestType.PreInjection">Pre-inyección</sys:String>
<!-- ── Result display ───────────────────────────────────────────────── -->
<sys:String x:Key="Result.Phase">Fase</sys:String>
<sys:String x:Key="Result.Parameter">Parámetro</sys:String>
<sys:String x:Key="Result.Target">Objetivo</sys:String>
<sys:String x:Key="Result.Tolerance">Tol ±</sys:String>
<sys:String x:Key="Result.Average">Promedio</sys:String>
<sys:String x:Key="Result.ResultHeader">Resultado</sys:String>
<sys:String x:Key="Result.AllTests">Todos los Tests</sys:String>
<!-- ── Página de resultados (§5) ────────────────────────────────────── -->
<sys:String x:Key="Results.PageTitle">Resultados</sys:String>
<sys:String x:Key="Results.HistoryHeader">Historial de pruebas (sesión)</sys:String>
<sys:String x:Key="Results.DetailHeader">Detalle de la prueba</sys:String>
<sys:String x:Key="Results.ObservationsLabel">Observaciones / Notas</sys:String>
<sys:String x:Key="Results.ExportButton">Exportar PDF…</sys:String>
<sys:String x:Key="Results.EmptyState">Aún no hay pruebas completadas. Finalice una prueba para verla aquí.</sys:String>
<sys:String x:Key="Results.NoSelection">Seleccione una prueba en la lista para ver sus detalles.</sys:String>
<sys:String x:Key="Results.InterruptedLabel">INTERRUMPIDA</sys:String>
<sys:String x:Key="Results.DeleteTooltip">Eliminar esta entrada</sys:String>
<sys:String x:Key="Results.ClearSessionButton">Limpiar sesión</sys:String>
<sys:String x:Key="Results.ClearSessionConfirm">¿Eliminar todas las entradas del historial de esta sesión?</sys:String>
<!-- ── Common strings ───────────────────────────────────────────────── -->
<sys:String x:Key="Common.Pass">APROBADO</sys:String>
<sys:String x:Key="Common.Fail">REPROBADO</sys:String>
<sys:String x:Key="Common.Accept">Aceptar</sys:String>
<sys:String x:Key="Common.Cancel">Cancelar</sys:String>
<sys:String x:Key="Common.Close">Cerrar</sys:String>
<sys:String x:Key="Common.Save">Guardar</sys:String>
<sys:String x:Key="Common.Ok">OK</sys:String>
<sys:String x:Key="Common.Yes"></sys:String>
<sys:String x:Key="Common.No">No</sys:String>
<sys:String x:Key="Common.Warning">ADVERTENCIA</sys:String>
<sys:String x:Key="Common.Disabled">deshabilitado</sys:String>
<sys:String x:Key="Common.Dismiss">Cerrar</sys:String>
<!-- ── Dialog: Report ───────────────────────────────────────────────── -->
<sys:String x:Key="Dialog.Report.Title">Generar Informe</sys:String>
<sys:String x:Key="Dialog.Report.ClientList">Lista de Clientes</sys:String>
<sys:String x:Key="Dialog.Report.ClientData">Datos del Cliente</sys:String>
<sys:String x:Key="Dialog.Report.CompanyData">Datos de la Empresa</sys:String>
<sys:String x:Key="Dialog.Report.Name">Nombre:</sys:String>
<sys:String x:Key="Dialog.Report.ClientInfo">Información del cliente</sys:String>
<sys:String x:Key="Dialog.Report.Observations">Observaciones</sys:String>
<sys:String x:Key="Dialog.Report.Operator">Operador:</sys:String>
<sys:String x:Key="Dialog.Report.Company">Empresa:</sys:String>
<sys:String x:Key="Dialog.Report.CompanyInfo">Información de la empresa</sys:String>
<sys:String x:Key="Dialog.Report.DeleteClient">Eliminar Cliente</sys:String>
<sys:String x:Key="Dialog.Report.Generate">Generar</sys:String>
<!-- ── Dialog: User authentication ──────────────────────────────────── -->
<sys:String x:Key="Dialog.UserCheck.Title">Autenticación de Usuario</sys:String>
<sys:String x:Key="Dialog.UserCheck.Username">Usuario:</sys:String>
<sys:String x:Key="Dialog.UserCheck.Password">Contraseña:</sys:String>
<!-- ── Dialog: Voltage warning ──────────────────────────────────────── -->
<sys:String x:Key="Dialog.Voltage.Title">Advertencia de Fuente de Alimentación</sys:String>
<sys:String x:Key="Dialog.Voltage.VoltageLabel">VOLTAJE: </sys:String>
<sys:String x:Key="Dialog.Voltage.PumpRequires">La bomba seleccionada requiere </sys:String>
<sys:String x:Key="Dialog.Voltage.PowerSupply"> de alimentación.</sys:String>
<sys:String x:Key="Dialog.Voltage.SwitchTo">CAMBIE LA FUENTE DE ALIMENTACIÓN A </sys:String>
<!-- ── Dialog: Oil pump confirmation ────────────────────────────────── -->
<sys:String x:Key="Dialog.OilPump.Title">Activación de Bomba de Aceite</sys:String>
<sys:String x:Key="Dialog.OilPump.Message">Está a punto de activar la bomba de aceite. Confirme que el nivel de aceite es adecuado y que todas las conexiones están seguras antes de continuar.</sys:String>
<sys:String x:Key="Dialog.OilPump.LeaksChecked">He verificado — sin fugas, conexiones listas</sys:String>
<!-- ── Dialog: RPM safety warning ───────────────────────────────────── -->
<sys:String x:Key="Dialog.RpmSafety.Title">Advertencia de Seguridad RPM</sys:String>
<sys:String x:Key="Dialog.RpmSafety.Message">La bomba de aceite está APAGADA. Hacer funcionar el motor del banco sin circulación de aceite puede causar daño a los rodamientos de la bomba.</sys:String>
<sys:String x:Key="Dialog.RpmSafety.OilAndProceed">Encender bomba de aceite e iniciar el banco</sys:String>
<sys:String x:Key="Dialog.RpmSafety.ProceedWithout">Sé lo que hago — iniciar sin aceite</sys:String>
<!-- ── Dialog: Unlock progress ──────────────────────────────────────── -->
<sys:String x:Key="Dialog.Unlock.Title">Desbloqueo de Inmovilizador</sys:String>
<sys:String x:Key="Dialog.Unlock.Progress">PROGRESO</sys:String>
<sys:String x:Key="Dialog.Unlock.Phase1">Fase 1: Enviando señales de desbloqueo</sys:String>
<sys:String x:Key="Dialog.Unlock.Phase2Testing">Fase 2: Probando</sys:String>
<sys:String x:Key="Dialog.Unlock.Phase2Sending">Fase 2: Enviando...</sys:String>
<sys:String x:Key="Dialog.Unlock.Cancelled">CANCELADO</sys:String>
<sys:String x:Key="Dialog.Unlock.Unlocked">DESBLOQUEADO</sys:String>
<sys:String x:Key="Dialog.Unlock.Failed">DESBLOQUEO FALLIDO</sys:String>
<sys:String x:Key="Dialog.Unlock.TypeLabel">Tipo {0}</sys:String>
<sys:String x:Key="Dialog.Unlock.Retry">Reintentar desbloqueo</sys:String>
<!-- ── Dialog: K-Line errors ────────────────────────────────────────── -->
<sys:String x:Key="Dialog.KlineErrors.Title">Códigos de Falla K-Line</sys:String>
<sys:String x:Key="Dialog.KlineErrors.Header">Códigos de falla:</sys:String>
<sys:String x:Key="Dialog.KlineErrors.Read">Leer</sys:String>
<sys:String x:Key="Dialog.KlineErrors.Clear">Borrar</sys:String>
<!-- ── Dialog: Settings ───────────────────────────────────────────────── -->
<sys:String x:Key="Dialog.Settings.Title">Configuración</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.General">General</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.Safety">Seguridad</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.Pid">PID</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.Motor">Motor</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.Report">Reporte</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.KLine">K-Line</sys:String>
<sys:String x:Key="Dialog.Settings.Tab.Advanced">Avanzado</sys:String>
<sys:String x:Key="Dialog.Settings.Language">Idioma:</sys:String>
<sys:String x:Key="Dialog.Settings.DaysKeepLogs">Días de retención de logs:</sys:String>
<sys:String x:Key="Dialog.Settings.TempMax">Temperatura máx. (°C):</sys:String>
<sys:String x:Key="Dialog.Settings.TempMin">Temperatura mín. (°C):</sys:String>
<sys:String x:Key="Dialog.Settings.SecurityRpmLimit">Límite RPM de seguridad:</sys:String>
<sys:String x:Key="Dialog.Settings.MaxPressureBar">Presión máx. (bar):</sys:String>
<sys:String x:Key="Dialog.Settings.ToleranceUp">Extensión tolerancia UP:</sys:String>
<sys:String x:Key="Dialog.Settings.TolerancePfp">Extensión tolerancia PFP:</sys:String>
<sys:String x:Key="Dialog.Settings.IgnoreTin">Ignorar T-in por defecto</sys:String>
<sys:String x:Key="Dialog.Settings.AutoTestSkipsOilPumpConfirm">Omitir confirmación de bomba de aceite en Auto Test (el operario asume la comprobación de fugas)</sys:String>
<sys:String x:Key="Dialog.Settings.PidP">Proporcional (P):</sys:String>
<sys:String x:Key="Dialog.Settings.PidI">Integral (I):</sys:String>
<sys:String x:Key="Dialog.Settings.PidD">Derivativo (D):</sys:String>
<sys:String x:Key="Dialog.Settings.PidLoopMs">Período del lazo (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.EncoderRes">Resolución encoder:</sys:String>
<sys:String x:Key="Dialog.Settings.VoltMaxRpm">Voltaje para RPM máx. (V):</sys:String>
<sys:String x:Key="Dialog.Settings.MaxRpm">RPM máximo:</sys:String>
<sys:String x:Key="Dialog.Settings.RightRelay">Derecha = relé ON</sys:String>
<sys:String x:Key="Dialog.Settings.Relations">Tabla RPM-Voltaje</sys:String>
<sys:String x:Key="Dialog.Settings.RelRpm">RPM</sys:String>
<sys:String x:Key="Dialog.Settings.RelVoltage">Voltaje (V)</sys:String>
<sys:String x:Key="Dialog.Settings.AddRow">Agregar</sys:String>
<sys:String x:Key="Dialog.Settings.RemoveRow">Eliminar</sys:String>
<sys:String x:Key="Dialog.Settings.CompanyName">Nombre empresa:</sys:String>
<sys:String x:Key="Dialog.Settings.CompanyInfo">Información empresa:</sys:String>
<sys:String x:Key="Dialog.Settings.ReportLogo">Ruta logo de informe:</sys:String>
<sys:String x:Key="Dialog.Settings.BrowseLogoTitle">Seleccionar imagen de logo</sys:String>
<sys:String x:Key="Dialog.Settings.KLinePort">Puerto K-Line (FTDI):</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshPorts">Refrescar</sys:String>
<sys:String x:Key="Dialog.Settings.KLineHint">Seleccione un dispositivo FTDI o ingrese el número de serie manualmente.</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshBench">Interfaz banco (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshReading">Durante lectura K-Line (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshCanBus">Lectura CAN bus (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshPumpReq">Solicitud bomba (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.RefreshPumpParams">Parámetros bomba (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.BlinkInterval">Intervalo parpadeo (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.FlasherInterval">Intervalo flasher (ms):</sys:String>
<sys:String x:Key="Dialog.Settings.RpmChartUpdateHz">Tasa gráfico RPM (Hz):</sys:String>
<sys:String x:Key="Dialog.Settings.UsersHeader">Usuarios</sys:String>
<sys:String x:Key="Dialog.Settings.ManageUsers">Administrar Usuarios...</sys:String>
<!-- ── Dialog: Gestión de usuarios ──────────────────────────────────── -->
<sys:String x:Key="Dialog.UserManage.Title">Gestión de Usuarios</sys:String>
<sys:String x:Key="Dialog.UserManage.ColumnUsername">Usuario</sys:String>
<sys:String x:Key="Dialog.UserManage.Add">Añadir...</sys:String>
<sys:String x:Key="Dialog.UserManage.Remove">Eliminar</sys:String>
<sys:String x:Key="Dialog.UserManage.ChangePassword">Cambiar Contraseña...</sys:String>
<sys:String x:Key="Dialog.UserManage.Close">Cerrar</sys:String>
<sys:String x:Key="Dialog.UserManage.Prompt.AddTitle">Añadir Usuario</sys:String>
<sys:String x:Key="Dialog.UserManage.Prompt.ChangeTitle">Cambiar contraseña de '{0}'</sys:String>
<sys:String x:Key="Dialog.UserManage.Confirm.RemoveTitle">Eliminar Usuario</sys:String>
<sys:String x:Key="Dialog.UserManage.Confirm.Remove">¿Eliminar el usuario '{0}'?</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.EmptyTitle">Entrada Inválida</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.Empty">El usuario y la contraseña no pueden estar vacíos.</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.InvalidCharsTitle">Entrada Inválida</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.InvalidChars">El nombre de usuario no puede contener ':' o ','.</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.DuplicateTitle">Usuario Duplicado</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.Duplicate">Ya existe un usuario con ese nombre.</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.LastUserTitle">No Se Puede Eliminar</sys:String>
<sys:String x:Key="Dialog.UserManage.Error.LastUser">No se puede eliminar el último usuario restante.</sys:String>
<!-- ── Auto Test (snackbar del panel) ───────────────────────────────── -->
<sys:String x:Key="AutoTest.TypeLabel">Auto Test</sys:String>
<sys:String x:Key="AutoTest.State.Preflight">Comprobaciones previas…</sys:String>
<sys:String x:Key="AutoTest.State.Connecting">Conectando K-Line…</sys:String>
<sys:String x:Key="AutoTest.State.Reading">Leyendo identificación de bomba…</sys:String>
<sys:String x:Key="AutoTest.State.Unlocking">Desbloqueando bomba…</sys:String>
<sys:String x:Key="AutoTest.State.UnlockingWithDetail">Desbloqueando bomba — {0}</sys:String>
<sys:String x:Key="AutoTest.State.BenchOn">Encendiendo banco…</sys:String>
<sys:String x:Key="AutoTest.State.OilPump">Arrancando bomba de aceite…</sys:String>
<sys:String x:Key="AutoTest.State.TestStart">Iniciando procedimiento de prueba…</sys:String>
<sys:String x:Key="AutoTest.State.Running">Prueba en curso…</sys:String>
<sys:String x:Key="AutoTest.State.RunningWithPhase">Prueba en curso — {0}</sys:String>
<sys:String x:Key="AutoTest.State.Completed">Auto Test completado.</sys:String>
<sys:String x:Key="AutoTest.State.Aborted">Abortado — {0}</sys:String>
<sys:String x:Key="AutoTest.Failure.UserCancelled">Cancelado por el operario</sys:String>
<sys:String x:Key="AutoTest.Failure.PreflightDenied">No se cumplen las condiciones previas</sys:String>
<sys:String x:Key="AutoTest.Failure.KLineConnectFailed">No se pudo abrir la sesión K-Line</sys:String>
<sys:String x:Key="AutoTest.Failure.KLineLost">Sesión K-Line perdida</sys:String>
<sys:String x:Key="AutoTest.Failure.ReadFailed">Fallo al leer la identificación de la bomba</sys:String>
<sys:String x:Key="AutoTest.Failure.PumpNotRecognized">ID de bomba no reconocida</sys:String>
<sys:String x:Key="AutoTest.Failure.UnlockFailed">Fallo en el desbloqueo del inmovilizador</sys:String>
<sys:String x:Key="AutoTest.Failure.BenchCanLost">Bus CAN del banco perdido</sys:String>
<sys:String x:Key="AutoTest.Failure.PumpCanLost">CAN de la ECU perdido</sys:String>
<sys:String x:Key="AutoTest.Failure.AlarmTriggered">Alarma crítica disparada</sys:String>
<sys:String x:Key="AutoTest.Failure.OilPumpNotConfirmed">Confirmación de bomba de aceite cancelada por el operador</sys:String>
<sys:String x:Key="AutoTest.Failure.TestInterrupted">Prueba interrumpida</sys:String>
<sys:String x:Key="AutoTest.Failure.TestFailed">Prueba fallida</sys:String>
<sys:String x:Key="AutoTest.Failure.Unexpected">Error inesperado</sys:String>
<!-- ── Error messages ───────────────────────────────────────────────── -->
<sys:String x:Key="Error.ReportGeneration">Error al generar informe:\n{0}</sys:String>
<sys:String x:Key="Error.ReportTitle">Error de Informe</sys:String>
<sys:String x:Key="Error.PsgSync">No se detectó el pulso de sincronización PSG. Verifique la conexión del encoder.</sys:String>
<sys:String x:Key="Error.PsgTitle">Error PSG</sys:String>
<sys:String x:Key="Error.EmergencyStop">PARADA DE EMERGENCIA: {0}</sys:String>
<sys:String x:Key="Error.KLineNotFound">Dispositivo K-Line no encontrado. Verifique que el adaptador FTDI esté conectado.</sys:String>
<sys:String x:Key="Error.KLineTitle">Error K-Line</sys:String>
<sys:String x:Key="Error.AuthInvalid">Usuario o contraseña inválidos.\n(Ambos distinguen mayúsculas y minúsculas.)</sys:String>
<sys:String x:Key="Error.AuthTitle">Error de Autenticación</sys:String>
<!-- ── PDF Report ───────────────────────────────────────────────────── -->
<sys:String x:Key="Pdf.ReportTitle">INFORME DE PRUEBA DE BOMBA INYECTORA VP44</sys:String>
<sys:String x:Key="Pdf.GeneratedBy">Generado por HC-APTBS</sys:String>
<sys:String x:Key="Pdf.Page">Página </sys:String>
<sys:String x:Key="Pdf.Of"> de </sys:String>
<sys:String x:Key="Pdf.Date">Fecha: {0:dd/MM/yyyy HH:mm}</sys:String>
<sys:String x:Key="Pdf.Operator">Operador: {0}</sys:String>
<sys:String x:Key="Pdf.Client">Cliente: {0}</sys:String>
<sys:String x:Key="Pdf.PumpIdentification">IDENTIFICACIÓN DE BOMBA</sys:String>
<sys:String x:Key="Pdf.PumpId">ID Bomba:</sys:String>
<sys:String x:Key="Pdf.Model">Modelo:</sys:String>
<sys:String x:Key="Pdf.SerialNo">Nro. Serie:</sys:String>
<sys:String x:Key="Pdf.Injector">Inyector:</sys:String>
<sys:String x:Key="Pdf.Tube">Tubo:</sys:String>
<sys:String x:Key="Pdf.Valve">Válvula:</sys:String>
<sys:String x:Key="Pdf.Tension">Tensión:</sys:String>
<sys:String x:Key="Pdf.Rotation">Rotación:</sys:String>
<sys:String x:Key="Pdf.LockAngle">Ángulo de Bloqueo:</sys:String>
<sys:String x:Key="Pdf.Measured">Medido:</sys:String>
<sys:String x:Key="Pdf.Chaveta">Chaveta:</sys:String>
<sys:String x:Key="Pdf.PreInj">Pre-Iny.:</sys:String>
<sys:String x:Key="Pdf.EcuData">DATOS ECU (K-Line)</sys:String>
<sys:String x:Key="Pdf.OverallResult">RESULTADO GENERAL DEL TEST</sys:String>
<sys:String x:Key="Pdf.TestsExecuted">Tests ejecutados: {0} de {1}</sys:String>
<sys:String x:Key="Pdf.ParamsEvaluated">Parámetros evaluados: {0} / {1} aprobados</sys:String>
<sys:String x:Key="Pdf.TestHeader">TEST: {0}</sys:String>
<sys:String x:Key="Pdf.Phase">Fase</sys:String>
<sys:String x:Key="Pdf.Parameter">Parámetro</sys:String>
<sys:String x:Key="Pdf.Target">Objetivo</sys:String>
<sys:String x:Key="Pdf.ToleranceHeader">Tolerancia ±</sys:String>
<sys:String x:Key="Pdf.Average">Promedio</sys:String>
<sys:String x:Key="Pdf.Result">Resultado</sys:String>
<sys:String x:Key="Pdf.ErrorBits"> ⚠ Bits de error: {0}</sys:String>
<sys:String x:Key="Pdf.NoSampleData">No hay datos de muestra disponibles para visualización gráfica.</sys:String>
<sys:String x:Key="Pdf.ChartSamples">Muestras: {0} | Objetivo: {1} ± {2} | Promedio: {3} | Resultado: {4}</sys:String>
<sys:String x:Key="Pdf.Observations">OBSERVACIONES</sys:String>
</ResourceDictionary>