Files
HC_APTBS/Resources/Strings.es.xaml
LucianoDev 37d099cdbd feat: add Ford VP44 unlock progress dialog, K-Line fast unlock, localization, safety dialogs, and settings
Unlock progress UI:
- UnlockProgressDialog with dark-themed progress ring, phase indicator, elapsed
  time, and cancel/close buttons (non-modal, draggable borderless window)
- UnlockProgressViewModel with event-driven progress tracking via IUnlockService
- Triggers on pump selection (manual or K-Line auto-detect), not test start

UnlockService rewrite:
- Persistent CAN senders that outlive the unlock sequence (StopSenders on pump change)
- Concurrent K-Line fast unlock: awaits session Connected, sends RAM timer shortcut
  ({02 88 02 03 A8 01 00}), verifies via CAN TestUnlock before skipping wait
- Fix Type 1 verification (Value == 0 means unlocked, was inverted)

K-Line fast unlock support:
- IKwpService.TryFastUnlockAsync / KwpService implementation

Additional features:
- ILocalizationService with ES/EN resource dictionaries and runtime switching
- Safety dialogs: VoltageWarning, OilPumpConfirm, RpmSafetyWarning
- SettingsDialog for app configuration
- BenchService enhancements, ConfigurationService improvements, PDF report updates
- All UI strings localized via DynamicResource

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 13:22:48 +02:00

323 lines
23 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>
<sys:String x:Key="App.LanguageLabel">ENG</sys:String>
<!-- ── Menu ─────────────────────────────────────────────────────────── -->
<sys:String x:Key="Menu.Settings">Configuración</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.Header">Banco</sys:String>
<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>
<!-- ── 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>
<!-- ── 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>
<!-- ── 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>
<!-- ── 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>
<!-- ── 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>
<!-- ── 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.Company">Empresa</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>
<!-- ── 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>
</ResourceDictionary>