Files
HC_APTBS/Resources/Strings.es.xaml
LucianoDev 69bfda54e1 feat: redesign Bench page with Fluent card layout and radial advance monitor
Three-column layout replacing the old HMI grid:
- BenchRpmCommandCard: inline numeric input, 2×4 preset grid, Start/Stop
- BenchActuatorsCard: direction toggle, oil pump, temperature PID, misc relays
  with FluentStateToggle showing checked state via AccentFillColor
- BenchLiveDataCard: 2×5 KPI tiles (RPM, P1, P2, Q-Delivery, Q-Over, temps)
- BenchChartsCard: 2×2 compact chart grid (Delivery, Over, P1, P2)
- AdvanceMonitorCard: RadialAngleGauge custom FrameworkElement + PSG/INJ readouts,
  Δ° lock offset input, Zero PSG / Zero INJ buttons

Supporting changes:
- AngleDisplayViewModel: promote _currentManualDegrees, _isLockSet to
  [ObservableProperty]; add PsgRelativeDegrees, InjEncoderDegreesValue,
  TargetLockAngle, IsRunningMode (29/31 hysteresis); computed PrimaryGaugeAngle,
  TargetAngleForGauge, SecondaryGaugeAngle
- BenchControlViewModel: add IsDirectionLeft computed property,
  SetDirectionRightCommand, SetDirectionLeftCommand, ApplyRpmCommand
- FlowmeterChartView: add IsCompact DP (false default) for 90px compact height
- Styles.xaml: add IsChecked trigger to FluentStateToggle (accent fill + white text)
- Strings.en/es.xaml: add all new card and actuator string keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 17:45:59 +02:00

578 lines
42 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.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>
<!-- 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.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.Started">Test iniciado...</sys:String>
<sys:String x:Key="Test.Stopped">Test detenido.</sys:String>
<!-- ── Asistente de la página de tests ────────────────────────────────── -->
<sys:String x:Key="Test.Wizard.Plan">1. Planificar</sys:String>
<sys:String x:Key="Test.Wizard.Preconditions">2. Precondiciones</sys:String>
<sys:String x:Key="Test.Wizard.Running">3. En ejecución</sys:String>
<sys:String x:Key="Test.Wizard.Done">4. Finalizado</sys:String>
<sys:String x:Key="Test.Wizard.Next">Siguiente ▶</sys:String>
<sys:String x:Key="Test.Wizard.Back">◀ Atrás</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>
<!-- ── 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>
<!-- ── 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.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.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>
<!-- ── 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>