The overlay percentage now rises linearly to 95% at the expected wait captured at Calculate, holds there, and shows 100% only when the planner completes. Beneath the status, one line names the current planning stage (with the rule name for rule stages) and another shows the approximate remaining time, or "Taking longer than expected" once the wait is exceeded, announced once through the live status. Cancel freezes the percentage and hides both lines. PlanningCalculationService reports the stage and submitted request instead of fixed per-stage percentages; PlanningDurationService owns the wait progress on a 250 ms tick. Closes #300 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
396 lines
18 KiB
JSON
396 lines
18 KiB
JSON
{
|
||
"locale": "es-ES",
|
||
"bookedDays": {
|
||
"enter": "Editar días ya reservados",
|
||
"booked": "Ya reservado",
|
||
"help": "Elija CP, RTT, Otro o Borrar y haga clic o arrastre entre fechas, incluso de varios meses. Suelte para guardar; Escape cancela. Cada día que ya tenga el tipo elegido se borra; los demás reciben ese tipo. Se omiten fines de semana y festivos. El rayado indica los días ya reservados, que se aplican en el próximo cálculo.",
|
||
"fixed": "Entrada fija del usuario, sin descontar el saldo restante ni decisión de optimización.",
|
||
"removed": "Declaración eliminada",
|
||
"erase": "Borrar",
|
||
"rangeSaved": "Días ya reservados guardados: {count} ({type}).",
|
||
"rangeRemoved": "Declaraciones eliminadas: {count}."
|
||
},
|
||
"app": {
|
||
"title": "vac-optimizer",
|
||
"description": "Más espacio para descansar.",
|
||
"skipToPlan": "Ir a tu plan"
|
||
},
|
||
"userInput": {
|
||
"title": "Configura tus vacaciones",
|
||
"description": "Elige el período de planificación y añade cada saldo de vacaciones y su periodo de validez.",
|
||
"addVacationDay": "Añadir saldo de vacaciones",
|
||
"calculate": "Calcular plan",
|
||
"durationEstimate": "Espera aproximada: {range} {unit}",
|
||
"durationUnits": {
|
||
"seconds": "s",
|
||
"minutes": "min"
|
||
},
|
||
"remainingDaysWarning": "{count} día{plural} de permiso restante{plural}:",
|
||
"deleteEntry": "Eliminar entrada",
|
||
"chooseDate": "Caduca el",
|
||
"availableDate": "Disponible desde",
|
||
"days": "Días",
|
||
"type": "Tipo de permiso",
|
||
"daySuffix": "día",
|
||
"daysSuffix": "días",
|
||
"expires": "exp.",
|
||
"remainingValidity": "Utilizable del {available} al {expiry}.",
|
||
"remainingHorizon": "Plan calculado del {start} al {end}.",
|
||
"remainingEarnedFrom": "Permiso obtenido gracias a la regla «{rule}».",
|
||
"remainingSuggestions": {
|
||
"available-after-horizon": "Puedes ampliar el período planificado más allá de su fecha de disponibilidad y volver a calcular.",
|
||
"no-working-date": "Comprueba el período planificado y las fechas de validez de este saldo.",
|
||
"all-dates-occupied": "Puedes ampliar el período si la validez lo permite, o ajustar los días ya reservados y tus reglas, y volver a calcular.",
|
||
"preserved": "No es necesario hacer nada. Para solicitar su uso, añade una regla dentro de su período de validez y vuelve a calcular.",
|
||
"calculation-incomplete": "Repite el cálculo si quieres que termine la planificación."
|
||
}
|
||
},
|
||
"dayTypes": {
|
||
"weekend": "Fin de semana",
|
||
"closedDay": "Día festivo",
|
||
"rtt": "RTT",
|
||
"cp": "Vacaciones pagadas",
|
||
"other": "Otro",
|
||
"today": "Hoy",
|
||
"any": "Cualquier"
|
||
},
|
||
"settings": {
|
||
"title": "Ajustes",
|
||
"description": "Los cambios se guardan automáticamente.",
|
||
"showWeekNumbers": "Mostrar números de semana",
|
||
"close": "Cerrar",
|
||
"selectLanguage": "Idioma",
|
||
"selectTheme": "Tema",
|
||
"themeOptions": {
|
||
"system": "Sistema",
|
||
"light": "Claro",
|
||
"dark": "Oscuro"
|
||
},
|
||
"systemAppearance": "Apariencia actual del sistema",
|
||
"planningHorizon": "Período de planificación",
|
||
"planningStart": "Fecha de inicio (incluida)",
|
||
"lastPlanningDate": "Última fecha de planificación (incluida)",
|
||
"planningDatesHelp": "Elige cualquier fecha, incluso pasada. El calendario se actualiza al seleccionar Calcular plan.",
|
||
"invalidDate": "Introduce dos fechas válidas.",
|
||
"horizonOrder": "La última fecha de planificación debe ser igual o posterior a la fecha de inicio.",
|
||
"invalidHorizon": "Corrige las fechas de planificación antes de calcular."
|
||
},
|
||
"rules": {
|
||
"title": "Reglas de planificación",
|
||
"subtitle": "Gestionar reglas de optimización",
|
||
"active": "activas",
|
||
"moveRuleUp": "Subir regla",
|
||
"moveRuleDown": "Bajar regla",
|
||
"dragRule": "Arrastrar para reordenar",
|
||
"ruleMoved": "{name}: posición {position} de {count}.",
|
||
"priorityInfo": "Las reglas de arriba tienen prioridad. Reordénalas con el tirador o las flechas.",
|
||
"ifThenTemplate": "Si un día festivo cae en <strong>{day}</strong>, colocar <strong>{placeDays}</strong> día(s) <strong>{placeType}</strong> <strong>{placement}</strong> y obtener <strong>{rewardDays}</strong> día(s) <strong>{rewardType}</strong> de bonificación.",
|
||
"timeWindowTemplate": "Colocar <strong>{placeDays}</strong> día(s) <strong>{placeType}</strong> entre el <strong>{startDate}</strong> y el <strong>{endDate}</strong>.",
|
||
"editRule": "Editar regla",
|
||
"deleteRule": "Eliminar regla",
|
||
"addRule": "Añadir una regla",
|
||
"place": "Colocar",
|
||
"ruleName": "Nombre de la regla",
|
||
"holidayFalls": "Día festivo cae en",
|
||
"days": "Días",
|
||
"type": "Tipo",
|
||
"position": "Posición",
|
||
"getBonus": "Obtener en bonificación",
|
||
"force": "Fuerza de la regla",
|
||
"obligation": "Obligación",
|
||
"preference": "Preferencia",
|
||
"startDate": "Fecha de inicio",
|
||
"endDate": "Fecha de fin",
|
||
"cancel": "Cancelar",
|
||
"save": "Guardar",
|
||
"add": "Añadir",
|
||
"addRuleButton": "Añadir",
|
||
"newIfThenRule": "Nueva regla \"Si ... Entonces\"",
|
||
"newTimeWindowRule": "Nuevo período impuesto",
|
||
"defaultNewRuleName": "Nueva regla",
|
||
"defaultNewPeriodName": "Nuevo período",
|
||
"daysOfWeek": {
|
||
"1": "Lunes",
|
||
"2": "Martes",
|
||
"3": "Miércoles",
|
||
"4": "Jueves",
|
||
"5": "Viernes",
|
||
"6": "Sábado",
|
||
"0": "Domingo"
|
||
},
|
||
"placement": {
|
||
"before": "Antes",
|
||
"after": "Después",
|
||
"around": "Alrededor",
|
||
"auto": "Auto (Mejor opción)"
|
||
},
|
||
"optimization": {
|
||
"newRule": "Nueva regla de Optimización",
|
||
"defaultName": "Prevención de pérdidas",
|
||
"elementsLabel": "Elementos del plan",
|
||
"conditionsLabel": "Condiciones (deben cumplirse todas)",
|
||
"measureLabel": "Medida",
|
||
"aggregationLabel": "Agregación",
|
||
"directionLabel": "Dirección",
|
||
"thresholdLabel": "Umbral de preferencia en días laborables",
|
||
"thresholdSummary": "umbral de preferencia: {count} días laborables",
|
||
"summary": "{direction} {aggregation}: {measure} — {elements}{conditions}.",
|
||
"invalidConfiguration": "Elija elementos, condiciones, medidas y agregaciones compatibles, con un umbral entero positivo cuando sea necesario.",
|
||
"nameRequired": "Introduzca un nombre para la regla.",
|
||
"elements": {
|
||
"leave-balances": "Saldos de vacaciones",
|
||
"public-holiday-weeks": "Semanas con festivos",
|
||
"time-off-periods": "Períodos sin trabajo",
|
||
"work-sequences": "Secuencias de trabajo",
|
||
"leave-placements": "Vacaciones colocadas"
|
||
},
|
||
"conditions": {
|
||
"at-risk": "En riesgo de caducar",
|
||
"complete": "Completas",
|
||
"internal": "Internas",
|
||
"non-empty": "No vacías",
|
||
"supporting": "De apoyo"
|
||
},
|
||
"measures": {
|
||
"unplaced-quantity": "Cantidad no colocada",
|
||
"public-holiday-week-value": "Valor de las semanas festivas",
|
||
"non-working-day-gain": "Ganancia de días sin trabajo",
|
||
"work-sequence-length": "Longitud de las secuencias de trabajo",
|
||
"work-sequence-deficit": "Déficit de las secuencias de trabajo",
|
||
"placement-count": "Número de colocaciones"
|
||
},
|
||
"aggregations": {
|
||
"sum": "Suma",
|
||
"count": "Cantidad",
|
||
"maximum": "Máximo"
|
||
},
|
||
"directions": {
|
||
"minimize": "Minimizar",
|
||
"maximize": "Maximizar"
|
||
}
|
||
}
|
||
},
|
||
"planning": {
|
||
"statistics": {
|
||
"open": "Estadísticas",
|
||
"title": "Estadísticas del plan",
|
||
"leaveDays": "Nuevos días de permiso",
|
||
"averageWorkSequence": "Secuencia de trabajo media",
|
||
"averageTimeOffPeriod": "Período de descanso medio",
|
||
"longestTimeOffPeriod": "Período de descanso más largo",
|
||
"weekendConnectedHolidays": "Festivos conectados con un fin de semana",
|
||
"workingDays": "días laborables",
|
||
"calendarDays": "días naturales",
|
||
"partialPlan": "Plan parcial",
|
||
"help": "Estadísticas del plan calculado. Los días ya reservados definen los períodos de descanso y trabajo sin consumir de nuevo los saldos restantes.",
|
||
"earnedLeave": "Permisos adquiridos antes de su uso",
|
||
"leaveDaysUnit": "días",
|
||
"earnedLeaveByRule": "Permisos adquiridos por regla"
|
||
},
|
||
"calculationDate": "Fecha del cálculo",
|
||
"futureEntitlement": "Derecho futuro generado",
|
||
"includedEntitlement": "Derecho ya incluido en los saldos declarados",
|
||
"title": "Tu año optimizado",
|
||
"daysPlaced": "Días de vacaciones asignados",
|
||
"daysGained": "Días no laborables ganados",
|
||
"longestWorkSequence": "Período de trabajo más largo",
|
||
"legend": "Leyenda del calendario",
|
||
"invalidInput": "Los datos de planificación no son válidos.",
|
||
"conflict": "Las obligaciones no se pueden satisfacer juntas.",
|
||
"incomplete": "El cálculo se detuvo antes de completar todas las etapas de calidad.",
|
||
"cancel": "Cancelar",
|
||
"cancelling": "Cancelando…",
|
||
"progress": {
|
||
"stages": {
|
||
"preparation": "Preparando el calendario",
|
||
"validation": "Comprobando tus datos",
|
||
"obligations": "Cumpliendo las obligaciones",
|
||
"expiry": "Usando primero los saldos que vencen antes",
|
||
"dates": "Fijando las fechas definitivas"
|
||
},
|
||
"rule": "Aplicando «{rule}»",
|
||
"remaining": "Quedan unos {value} {unit}",
|
||
"overrun": "Está tardando más de lo previsto"
|
||
},
|
||
"cancelled": "Cálculo cancelado",
|
||
"cancelledPartial": "Cálculo cancelado — plan parcial",
|
||
"error": "El planificador encontró un error inesperado.",
|
||
"complete": "Plan calculado.",
|
||
"whyPlacement": "Entender tus días de permiso",
|
||
"placementNavigation": "Navegación por las explicaciones de las asignaciones",
|
||
"placement": "Día de permiso",
|
||
"placements": "asignaciones",
|
||
"of": "de",
|
||
"first": "Primera asignación",
|
||
"previous": "Asignación anterior",
|
||
"next": "Asignación siguiente",
|
||
"last": "Última asignación",
|
||
"remaining": "Días sin usar en el plan final",
|
||
"balanceRemaining": "restantes",
|
||
"counterfactual": "Fechas alternativas",
|
||
"counterfactualLoading": "Analizando cada fecha del horizonte…",
|
||
"counterfactualReady": "Las fechas alternativas están listas.",
|
||
"counterfactualError": "No se pudieron calcular las fechas alternativas.",
|
||
"retryCounterfactual": "Reintentar el análisis de fechas",
|
||
"eligible": "Válida",
|
||
"ineligible": "No válida",
|
||
"reason": "Motivo",
|
||
"explanationError": "No se pudo generar la explicación.",
|
||
"conflictDetails": "Por qué ningún plan satisface las obligaciones",
|
||
"conflictingRules": "Reglas en conflicto",
|
||
"bottleneck": "Cuello de botella",
|
||
"incompleteDetails": "Lo completado antes de detener el cálculo",
|
||
"incumbentExplanation": "Esto explica el mejor plan válido encontrado; las etapas de calidad posteriores no se completaron.",
|
||
"completedStages": "Etapas completadas",
|
||
"uncompletedStages": "Etapas interrumpidas o no iniciadas",
|
||
"none": "Ninguno",
|
||
"currentPlacement": "Asignación explicada actualmente",
|
||
"explainedPeriod": "Período de descanso explicado",
|
||
"outsideHorizon": "Fecha de contexto fuera del horizonte de planificación",
|
||
"calendarHelp": "Selecciona un día de permiso para ver su aportación al plan.",
|
||
"explanationHelp": "Consulta tu descanso y qué cambia con cada día.",
|
||
"technicalDetails": "Detalles del cálculo",
|
||
"compareDates": "Comparar otras fechas",
|
||
"stopComparing": "Cerrar comparación",
|
||
"explanation": {
|
||
"breakTitle": "Tu descanso",
|
||
"leaveDays": "días de permiso usados",
|
||
"freeDays": "días de fin de semana y festivos",
|
||
"daysOff": "días libres seguidos",
|
||
"wholeBreak": "Estos totales corresponden a todo el descanso, incluido el día seleccionado.",
|
||
"leaveUsed": "Esta fecha usa 1 día del saldo «{balance}».",
|
||
"expires": "Usa este saldo hasta el",
|
||
"linkedRules": "Reglas vinculadas:",
|
||
"atRiskContribution": "Protege permisos que podrían vencer.",
|
||
"impact": "Qué cambia con este día",
|
||
"impactHelp": "Compara todo el plan con y sin este día de permiso. Las demás fechas no cambian; solo se muestran los totales que varían.",
|
||
"criterion": "En todo tu plan",
|
||
"withoutDay": "Sin este día",
|
||
"withDay": "Con este día",
|
||
"noChange": "Estos totales son iguales. Las reglas y los últimos criterios de desempate (vencimiento del saldo y después fecha) aún pueden influir en la elección.",
|
||
"priorityHelp": "Las obligaciones se resuelven conjuntamente. Las preferencias activas se comparan en el orden de sus reglas. Solo esas reglas añaden vacaciones; la caducidad y luego las fechas resuelven los empates.",
|
||
"tryDate": "Probar otra fecha",
|
||
"plannedDate": "Fecha prevista actualmente:",
|
||
"currentPlan": "Plan actual",
|
||
"alternative": "Con esta fecha",
|
||
"sameDate": "Esta es la fecha prevista. Elige otra fecha arriba para ver la diferencia.",
|
||
"moveHelp": "Prueba a mover este día. Las demás fechas de permiso no cambian.",
|
||
"comparisonUnavailable": "La comparación de la fecha original no está disponible, por lo que no se puede mostrar el cambio.",
|
||
"objectives": {
|
||
"obligation-validity": {
|
||
"label": "Obligaciones sin cumplir",
|
||
"help": "Número de reglas obligatorias incumplidas. Un plan válido tiene cero."
|
||
},
|
||
"unplaced-at-risk": {
|
||
"label": "Días sin usar que podrían vencer",
|
||
"help": "Días sin planificar que vencen durante el período. Menos es mejor."
|
||
},
|
||
"preference": {
|
||
"label": "Preferencia: {rule}",
|
||
"help": "Días o coincidencias completas, según la regla. Más es mejor."
|
||
},
|
||
"holiday-week-value": {
|
||
"label": "Prioridad de semanas con festivos (puntos)",
|
||
"help": "Puntuación ponderada: festivos en miércoles valen 3, martes/jueves 2 y lunes/viernes 1. Más es mejor."
|
||
},
|
||
"non-working-day-gain": {
|
||
"label": "Fines de semana y festivos en tus descansos",
|
||
"help": "Días libres sin gastar permisos. Más es mejor."
|
||
},
|
||
"longest-work-sequence": {
|
||
"label": "Máximo de días laborables entre permisos",
|
||
"help": "No se cuentan fines de semana ni festivos. Menos es mejor."
|
||
},
|
||
"short-sequence-deficit": {
|
||
"label": "Penalización por tramos cortos de trabajo",
|
||
"help": "Cada tramo de 1–4 días laborables entre permisos suma los días que faltan para llegar a 5. Menos es mejor."
|
||
},
|
||
"supporting-placements": {
|
||
"label": "Días usados de saldos que vencen más tarde",
|
||
"help": "Permisos que podrían guardarse más allá de este período. Menos es mejor."
|
||
},
|
||
"balance-expiry": {
|
||
"label": "Primero los permisos que vencen antes",
|
||
"help": "Desempate cuando los totales anteriores son iguales."
|
||
},
|
||
"placement-date": {
|
||
"label": "Primero las fechas más tempranas",
|
||
"help": "Último desempate cuando los demás criterios son iguales."
|
||
},
|
||
"optimization": {
|
||
"label": "{rule}: {summary}",
|
||
"help": "Esta preferencia de optimización evalúa su configuración guardada. Las preferencias activas siguen el orden mostrado; las anteriores tienen prioridad."
|
||
}
|
||
},
|
||
"stages": {
|
||
"validation": "Comprobar saldos y reglas",
|
||
"obligations": "Cumplir las reglas obligatorias",
|
||
"at-risk": "Usar los permisos antes de que venzan",
|
||
"expiry": "Preferir los permisos que vencen antes",
|
||
"dates": "Preferir las fechas más tempranas"
|
||
},
|
||
"unavailable": {
|
||
"non-working": "Ya es un día libre (fin de semana o festivo). No hace falta pedir permiso.",
|
||
"occupied": "Ya hay otro permiso previsto aquí. Elige un día laborable disponible.",
|
||
"unavailable": "Este saldo de permisos no se puede usar en esta fecha.",
|
||
"expired": "Esta fecha es posterior al vencimiento del saldo.",
|
||
"type-incompatible": "Este tipo de permiso no se puede usar en esta fecha.",
|
||
"rule-invalid": "Usar esta fecha incumpliría una regla del plan.",
|
||
"invalid-optimization-configuration": "Elija elementos, condiciones, medidas y agregaciones compatibles, con un umbral entero positivo cuando sea necesario.",
|
||
"unsupported-optimization-configuration": "Esta regla combina elementos del plan y medidas incompatibles."
|
||
},
|
||
"preferenceHelp": {
|
||
"time_window": "Días de permiso dentro del período preferido. Más es mejor.",
|
||
"if_then": "Coincidencias completas de esta regla. Más es mejor."
|
||
}
|
||
},
|
||
"details": {
|
||
"intro": "La columna izquierda muestra el plan sin este día de permiso. La derecha muestra el plan actual.",
|
||
"balance": "Saldo de permisos",
|
||
"available": "Disponible desde",
|
||
"expires": "Vence el",
|
||
"criteria": "Las prioridades del cálculo",
|
||
"criteriaHelp": "Lee de arriba abajo: la primera diferencia tiene prioridad. Selecciona un criterio para ver cómo se calcula.",
|
||
"firstDifference": "Primera diferencia",
|
||
"higher": "Más es mejor",
|
||
"lower": "Menos es mejor",
|
||
"tieBreaks": "Si los totales anteriores son iguales",
|
||
"audit": "Datos sin procesar · depuración",
|
||
"auditHelp": "Valores, identificadores y contribuciones originales de este cálculo.",
|
||
"supporting": "Este día usa permisos que podrían guardarse más allá del período planificado para mejorar tus descansos.",
|
||
"remainingReasons": {
|
||
"unavoidable-expiry": "Caducó el {expiry}, antes del inicio del plan el {start}. No puede colocarse en este período.",
|
||
"available-after-horizon": "Disponible solo a partir del {available}, después de la última fecha del plan, el {end}.",
|
||
"no-working-date": "Ningún día laborable está dentro del período planificado y entre sus fechas de disponibilidad y caducidad.",
|
||
"all-dates-occupied": "Todos los días laborables en los que puede utilizarse este saldo ya están ocupados por permisos planificados o días ya reservados.",
|
||
"preserved": "Guardado para más adelante: caduca después del período planificado y el cálculo no seleccionó ninguna colocación adicional según tus prioridades.",
|
||
"active-priorities": "El cálculo conservó este saldo sin utilizar según tus reglas activas. Cambia las reglas o su orden para solicitar otro plan.",
|
||
"calculation-incomplete": "El cálculo se interrumpió antes de terminar la planificación. Su falta de uso no es una decisión definitiva.",
|
||
"not-established": "Este cálculo no determinó un motivo preciso para dejarlo sin utilizar."
|
||
}
|
||
},
|
||
"comparison": {
|
||
"title": "Comparar fechas",
|
||
"preview": "Solo una vista previa. Tu plan no cambia.",
|
||
"nearby": "Fechas cercanas disponibles",
|
||
"noAlternatives": "No hay otra fecha disponible para este día de permiso. Puedes comprobar una fecha para ver el motivo.",
|
||
"chooseDate": "Elige una fecha arriba para ver qué cambiaría.",
|
||
"dateRange": "Período planificado:",
|
||
"invalidDate": "Elige una fecha válida dentro del período indicado arriba.",
|
||
"changes": "Qué cambiaría",
|
||
"available": "Fecha disponible",
|
||
"unavailable": "Esta fecha no se puede usar",
|
||
"backToPlan": "Volver a mi plan"
|
||
}
|
||
},
|
||
"benchmark": {
|
||
"title": "Prueba del planificador de vacaciones",
|
||
"instructions": "Ejecuta los cinco escenarios fijos y copia el informe resultante.",
|
||
"run": "Ejecutar prueba",
|
||
"running": "En curso…",
|
||
"copy": "Copiar informe"
|
||
},
|
||
"loading": "Calculando...",
|
||
"weekdaysShort": ["L", "M", "M", "J", "V", "S", "D"]
|
||
}
|