Files
vac-optimizer/src/i18n/en.json
T
nessarandClaude Opus 5.5 c2745ecbd6
CI / policy (push) Successful in 22s
CI / validate (push) Successful in 35s
CI / build (push) Successful in 21s
CI / policy (pull_request) Successful in 8s
CI / validate (pull_request) Successful in 24s
CI / benchmark (push) Successful in 1m28s
CI / security (push) Successful in 1m4s
CI / build (pull_request) Successful in 24s
CI / test (push) Failing after 2m8s
CI / images (push) Skipped
CI / required (push) Failing after 1s
CI / security (pull_request) Successful in 56s
CI / benchmark (pull_request) Successful in 1m32s
CI / test (pull_request) Failing after 1m50s
CI / images (pull_request) Skipped
CI / required (pull_request) Failing after 2s
feat(planning): follow the indicative wait in calculation progress
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>
2026-10-19 01:04:47 +02:00

396 lines
17 KiB
JSON
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.
{
"locale": "en-GB",
"bookedDays": {
"enter": "Edit already booked days",
"booked": "Already booked",
"help": "Choose CP, RTT, Other or Erase, then click or drag between dates, including across months. Release to save; Escape cancels. Each day already matching the chosen type is cleared; other days receive that type. Weekends and public holidays are skipped. Hatching marks already booked days, applied on the next calculation.",
"fixed": "Fixed user input, with no remaining balance debit or optimization decision.",
"removed": "Declaration removed",
"erase": "Erase",
"rangeSaved": "Saved already booked days: {count} ({type}).",
"rangeRemoved": "Removed declarations: {count}."
},
"app": {
"title": "vac-optimizer",
"description": "Make more room for time off.",
"skipToPlan": "Skip to your plan"
},
"userInput": {
"title": "Configure your leave",
"description": "Choose a planning period, then add each leave balance and its validity period.",
"addVacationDay": "Add leave balance",
"calculate": "Calculate plan",
"durationEstimate": "Approximate wait: {range} {unit}",
"durationUnits": {
"seconds": "s",
"minutes": "min"
},
"remainingDaysWarning": "{count} leave day{plural} remaining:",
"deleteEntry": "Delete entry",
"chooseDate": "Expires on",
"availableDate": "Available from",
"days": "Days",
"type": "Leave type",
"daySuffix": "day",
"daysSuffix": "days",
"expires": "exp.",
"remainingValidity": "Usable from {available} through {expiry}.",
"remainingHorizon": "Calculated plan from {start} through {end}.",
"remainingEarnedFrom": "Leave earned through the rule “{rule}”.",
"remainingSuggestions": {
"available-after-horizon": "You can extend the planning period beyond its availability date, then recalculate.",
"no-working-date": "Check the planning period and this balance’s validity dates.",
"all-dates-occupied": "You can extend the period if validity allows, or adjust your already booked days and rules, then recalculate.",
"preserved": "No action needed. To request its use, add a rule within its validity period, then recalculate.",
"calculation-incomplete": "Run the calculation again if you want it to finish planning."
}
},
"dayTypes": {
"weekend": "Weekend",
"closedDay": "Public Holiday",
"rtt": "RTT",
"cp": "Paid Leave",
"other": "Other",
"today": "Today",
"any": "Any"
},
"settings": {
"title": "Settings",
"description": "Changes are saved automatically.",
"showWeekNumbers": "Show week numbers",
"close": "Close",
"selectLanguage": "Language",
"selectTheme": "Theme",
"themeOptions": {
"system": "System",
"light": "Light",
"dark": "Dark"
},
"systemAppearance": "Current system appearance",
"planningHorizon": "Planning period",
"planningStart": "Start date (inclusive)",
"lastPlanningDate": "Last planning date (inclusive)",
"planningDatesHelp": "Choose any dates, including past dates. Your calendar updates when you select Calculate plan.",
"invalidDate": "Enter two valid calendar dates.",
"horizonOrder": "The last planning date must be on or after the start date.",
"invalidHorizon": "Correct the planning dates before calculating."
},
"rules": {
"title": "Planning rules",
"subtitle": "Manage optimization rules",
"active": "active",
"moveRuleUp": "Move rule up",
"moveRuleDown": "Move rule down",
"dragRule": "Drag to reorder",
"ruleMoved": "{name}: position {position} of {count}.",
"priorityInfo": "Rules at the top have higher priority. Reorder with the handle or arrow buttons.",
"ifThenTemplate": "If a holiday falls on a <strong>{day}</strong>, place <strong>{placeDays}</strong> day(s) <strong>{placeType}</strong> <strong>{placement}</strong> and get <strong>{rewardDays}</strong> day(s) <strong>{rewardType}</strong> as a bonus.",
"timeWindowTemplate": "Place <strong>{placeDays}</strong> day(s) <strong>{placeType}</strong> between <strong>{startDate}</strong> and <strong>{endDate}</strong>.",
"editRule": "Edit rule",
"deleteRule": "Delete rule",
"addRule": "Add a rule",
"place": "Place",
"ruleName": "Rule name",
"holidayFalls": "Holiday falls on a",
"days": "Days",
"type": "Type",
"position": "Position",
"getBonus": "Get as bonus",
"force": "Rule force",
"obligation": "Obligation",
"preference": "Preference",
"startDate": "Start date",
"endDate": "End date",
"cancel": "Cancel",
"save": "Save",
"add": "Add",
"addRuleButton": "Add Rule",
"newIfThenRule": "New \"If ... Then\" Rule",
"newTimeWindowRule": "New Imposed Period",
"defaultNewRuleName": "New Rule",
"defaultNewPeriodName": "New Period",
"daysOfWeek": {
"1": "Monday",
"2": "Tuesday",
"3": "Wednesday",
"4": "Thursday",
"5": "Friday",
"6": "Saturday",
"0": "Sunday"
},
"placement": {
"before": "Before",
"after": "After",
"around": "Around",
"auto": "Auto (Best choice)"
},
"optimization": {
"newRule": "New Optimization Rule",
"defaultName": "Loss prevention",
"elementsLabel": "Planning elements",
"conditionsLabel": "Conditions (all must match)",
"measureLabel": "Measure",
"aggregationLabel": "Aggregation",
"directionLabel": "Direction",
"thresholdLabel": "Preference threshold in working days",
"thresholdSummary": "preference threshold: {count} working days",
"summary": "{direction} {aggregation}: {measure} — {elements}{conditions}.",
"invalidConfiguration": "Choose compatible planning elements, conditions, measure and aggregation, with a positive whole-day threshold when needed.",
"nameRequired": "Enter a rule name.",
"elements": {
"leave-balances": "Leave balances",
"public-holiday-weeks": "Public-holiday weeks",
"time-off-periods": "Time-off periods",
"work-sequences": "Work sequences",
"leave-placements": "Leave placements"
},
"conditions": {
"at-risk": "At risk of expiry",
"complete": "Complete",
"internal": "Internal",
"non-empty": "Non-empty",
"supporting": "Supporting"
},
"measures": {
"unplaced-quantity": "Unplaced quantity",
"public-holiday-week-value": "Public-holiday week value",
"non-working-day-gain": "Non-working-day gain",
"work-sequence-length": "Work-sequence length",
"work-sequence-deficit": "Work-sequence deficit",
"placement-count": "Placement count"
},
"aggregations": {
"sum": "Sum",
"count": "Count",
"maximum": "Maximum"
},
"directions": {
"minimize": "Minimize",
"maximize": "Maximize"
}
}
},
"planning": {
"statistics": {
"open": "Statistics",
"title": "Plan statistics",
"leaveDays": "New leave days",
"averageWorkSequence": "Average work sequence",
"averageTimeOffPeriod": "Average time-off period",
"longestTimeOffPeriod": "Longest time-off period",
"weekendConnectedHolidays": "Public holidays connected to a weekend",
"workingDays": "working days",
"calendarDays": "calendar days",
"partialPlan": "Partial plan",
"help": "Statistics for the calculated plan. Already booked days shape breaks and working stretches without consuming remaining balances.",
"earnedLeave": "Earned leave before use",
"leaveDaysUnit": "days",
"earnedLeaveByRule": "Earned leave by rule"
},
"calculationDate": "Calculation date",
"futureEntitlement": "Future entitlement generated",
"includedEntitlement": "Entitlement already included in reported balances",
"title": "Your optimized year",
"daysPlaced": "Leave days placed",
"daysGained": "Non-working days gained",
"longestWorkSequence": "Longest work sequence",
"legend": "Calendar legend",
"invalidInput": "The planning input is invalid.",
"conflict": "The obligations cannot be satisfied together.",
"incomplete": "Calculation stopped before all quality stages completed.",
"cancel": "Cancel",
"cancelling": "Cancelling…",
"progress": {
"stages": {
"preparation": "Preparing the calendar",
"validation": "Checking your inputs",
"obligations": "Satisfying obligations",
"expiry": "Using balances that expire first",
"dates": "Settling the final dates"
},
"rule": "Applying “{rule}”",
"remaining": "About {value} {unit} left",
"overrun": "Taking longer than expected"
},
"cancelled": "Calculation cancelled",
"cancelledPartial": "Calculation cancelled — partial plan",
"error": "The planner encountered an unexpected error.",
"complete": "Plan calculated.",
"whyPlacement": "Understand your leave days",
"placementNavigation": "Placement explanation navigation",
"placement": "Leave day",
"placements": "placements",
"of": "of",
"first": "First placement",
"previous": "Previous placement",
"next": "Next placement",
"last": "Last placement",
"remaining": "Unused days in the final plan",
"balanceRemaining": "remaining",
"counterfactual": "Date alternatives",
"counterfactualLoading": "Analyzing every date in the horizon…",
"counterfactualReady": "Date alternatives are ready.",
"counterfactualError": "Date alternatives could not be calculated.",
"retryCounterfactual": "Retry date analysis",
"eligible": "Eligible",
"ineligible": "Ineligible",
"reason": "Reason",
"explanationError": "The explanation could not be produced.",
"conflictDetails": "Why no plan can satisfy the obligations",
"conflictingRules": "Conflicting rules",
"bottleneck": "Bottleneck",
"incompleteDetails": "What completed before calculation stopped",
"incumbentExplanation": "This explains the best valid incumbent; later quality stages did not complete.",
"completedStages": "Completed stages",
"uncompletedStages": "Interrupted or unstarted stages",
"none": "None",
"currentPlacement": "Current explained placement",
"explainedPeriod": "Explained time-off period",
"outsideHorizon": "Context date outside the planning horizon",
"calendarHelp": "Select a leave day to see its contribution to your plan.",
"explanationHelp": "See the break you get and what each day changes.",
"technicalDetails": "Calculation details",
"compareDates": "Compare other dates",
"stopComparing": "Close date comparison",
"explanation": {
"breakTitle": "Your break",
"leaveDays": "leave days used",
"freeDays": "weekend & holiday days",
"daysOff": "days off in a row",
"wholeBreak": "These totals cover the whole break, including the selected day.",
"leaveUsed": "This date uses 1 day from {balance}.",
"expires": "Use this balance by",
"linkedRules": "Linked rules:",
"atRiskContribution": "Protects leave at risk of expiry.",
"impact": "What this day changes",
"impactHelp": "Compare the whole plan with and without this day of leave. All other leave dates stay the same; only changed totals are shown.",
"criterion": "Across your plan",
"withoutDay": "Without this day",
"withDay": "With this day",
"noChange": "These totals are unchanged. Rules and the final tie-breakers (balance expiry, then date) can still affect the choice.",
"priorityHelp": "Obligations are satisfied together. Active preferences are compared in your rule order. Only those rules drive new placements; earlier expiry and then dates break equal results.",
"tryDate": "Try another date",
"plannedDate": "Currently planned for:",
"currentPlan": "Current plan",
"alternative": "With this date",
"sameDate": "This is the planned date. Choose another date above to see the difference.",
"moveHelp": "Try moving this one day. All other leave dates stay the same.",
"comparisonUnavailable": "The comparison for the original date is unavailable, so the change cannot be shown.",
"objectives": {
"obligation-validity": {
"label": "Unmet obligations",
"help": "Number of required obligations left unsatisfied. A valid plan has zero."
},
"unplaced-at-risk": {
"label": "Leave left at risk of expiry",
"help": "Unused days expiring within the planning period. Fewer is better."
},
"preference": {
"label": "Preference: {rule}",
"help": "Days or complete rule matches, depending on the rule. More is better."
},
"holiday-week-value": {
"label": "Holiday-week priority (points)",
"help": "Weighted score: Wednesday holidays count 3, Tuesday/Thursday 2, Monday/Friday 1. Higher is better."
},
"non-working-day-gain": {
"label": "Weekend & holiday days in your breaks",
"help": "Days off that use no leave. More is better."
},
"longest-work-sequence": {
"label": "Most working days between leave days",
"help": "Weekends and public holidays are not counted. Fewer is better."
},
"short-sequence-deficit": {
"label": "Penalty for short work gaps",
"help": "Each gap of 1–4 working days between leave days adds the days missing to reach 5. Lower is better."
},
"supporting-placements": {
"label": "Days used from later-expiring balances",
"help": "Leave that could be saved beyond this planning period. Fewer is better."
},
"balance-expiry": {
"label": "Earlier-expiring leave first",
"help": "Tie-breaker when the totals above are equal."
},
"placement-date": {
"label": "Earlier dates first",
"help": "Final tie-breaker when all other criteria are equal."
},
"optimization": {
"label": "{rule}: {summary}",
"help": "This optimization preference evaluates its saved configuration. Active preferences follow the displayed order; earlier preferences win before later ones."
}
},
"stages": {
"validation": "Check balances and rules",
"obligations": "Meet required rules",
"at-risk": "Use leave before it expires",
"expiry": "Prefer earlier-expiring leave",
"dates": "Prefer earlier dates"
},
"unavailable": {
"non-working": "This is already a day off (weekend or public holiday). No leave is needed.",
"occupied": "Another leave day is already planned here. Choose a free working day.",
"unavailable": "This leave balance cannot be used on this date.",
"expired": "This date is after the leave balance expires.",
"type-incompatible": "This leave type cannot be used on this date.",
"rule-invalid": "Using this date would break a planning rule.",
"invalid-optimization-configuration": "Choose compatible planning elements, conditions, measure and aggregation, with a positive whole-day threshold when needed.",
"unsupported-optimization-configuration": "This rule uses an unsupported combination of planning elements and measures."
},
"preferenceHelp": {
"time_window": "Leave days in this preferred period. More is better.",
"if_then": "Complete matches for this rule. More is better."
}
},
"details": {
"intro": "The left column shows the plan without this leave day. The right shows the current plan.",
"balance": "Leave balance",
"available": "Available from",
"expires": "Expires on",
"criteria": "The planner’s priorities",
"criteriaHelp": "Read from top to bottom: the first difference takes priority. Select a criterion to see how it is calculated.",
"firstDifference": "First difference",
"higher": "Higher is better",
"lower": "Lower is better",
"tieBreaks": "If the totals above are equal",
"audit": "Raw data · for debugging",
"auditHelp": "Original values, identifiers and contributions from this calculation.",
"supporting": "This day uses leave that could be saved beyond the planning period to improve your breaks.",
"remainingReasons": {
"unavoidable-expiry": "Expired on {expiry}, before the plan starts on {start}. It cannot be placed in this period.",
"available-after-horizon": "Available only from {available}, after the last planning date, {end}.",
"no-working-date": "No working day falls within both the planning period and its availability and expiry dates.",
"all-dates-occupied": "All working days on which this balance can be used are already occupied by planned leave or already booked days.",
"preserved": "Kept for later: it expires after the planning period and the calculation retained no additional placement under your priorities.",
"active-priorities": "The calculation kept this balance unused under your active planning rules. Change the rules or their order to request a different plan.",
"calculation-incomplete": "The calculation was interrupted before planning finished. Leaving it unused is not a final decision.",
"not-established": "This calculation did not establish a precise reason for leaving it unused."
}
},
"comparison": {
"title": "Compare dates",
"preview": "Preview only. Your plan stays unchanged.",
"nearby": "Nearby available dates",
"noAlternatives": "No other date can use this leave day. You can still check a date to see why.",
"chooseDate": "Choose a date above to see what would change.",
"dateRange": "Planning period:",
"invalidDate": "Choose a valid date within the planning period shown above.",
"changes": "What would change",
"available": "Available date",
"unavailable": "This date can’t be used",
"backToPlan": "Back to my plan"
}
},
"benchmark": {
"title": "Leave planner benchmark",
"instructions": "Run the five fixed scenarios and copy the resulting report.",
"run": "Run benchmark",
"running": "Running…",
"copy": "Copy report"
},
"loading": "Calculating...",
"weekdaysShort": ["M", "T", "W", "T", "F", "S", "S"]
}