Split i18n catalogues into per-domain modules

sv.ts/en.ts were single 602-line files that every feature had to edit,
making concurrent work on unrelated screens collide constantly. Split
both into per-domain modules (common, auth, calendar, dashboard,
settings, plan, wishEditor, tips) composed by an index that preserves
the existing `import { sv } from './sv'` specifier, so no consumer
changes.

Typing still catches drift in both directions: each en module is checked
against TranslationKey, and the composed catalogue must satisfy
Record<TranslationKey, string>.

All 433 keys and their values are byte-identical to the originals,
verified by diffing the parsed catalogues against the pre-split files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RXMhc9nT6sNz1SL4j8dznL
This commit is contained in:
2026-09-14 18:54:27 +02:00
parent 7f031f2087
commit bd996245ba
20 changed files with 1017 additions and 1204 deletions
+13
View File
@@ -0,0 +1,13 @@
export const auth = {
'auth.createAccountButton': 'Skapa konto',
'auth.createAccountTitle': 'Skapa konto',
'auth.emailPlaceholder': 'E-post',
'auth.genericError': 'Något gick fel',
'auth.haveAccountButton': 'Har redan konto',
'auth.loadingEllipsis': 'Laddar…',
'auth.loginButton': 'Logga in',
'auth.loginTitle': 'Logga in',
'auth.namePlaceholder': 'Namn',
'auth.passwordPlaceholder': 'Lösenord',
'auth.registerButton': 'Registrera',
} as const
+62
View File
@@ -0,0 +1,62 @@
export const calendar = {
'calendar.advanceMonthAria': '{month} - klicka för att byta månad',
'calendar.advanceYearAria': '{year} - klicka för att byta år',
'calendar.deleteError': 'Det gick inte att ta bort den planerade dagen',
'calendar.legendDoubleDay': 'Dubbeldag',
'calendar.legendIncomeBased': 'Sjukpenningnivå',
'calendar.legendKlamdag': 'Klämdag',
'calendar.legendMinimumRate': 'Lägstanivå',
'calendar.legendOverride': 'Undantag (arbets-/ledig dag)',
'calendar.legendRedDay': 'Röd dag',
'calendar.legendTitle': 'Teckenförklaring',
'calendar.legendVacation': 'Semester',
'calendar.loading': 'Laddar kalender...',
'calendar.nextMonthAria': 'Nästa månad',
'calendar.overrideError': 'Det gick inte att uppdatera undantaget',
'calendar.overrideModeActiveLabel': 'Avsluta redigering av dagar',
'calendar.overrideModeHint': 'Klicka på en dag för att markera den som arbetsdag eller ledig dag. Klicka igen på en markerad dag för att återställa den.',
'calendar.overrideModeLabel': 'Markera arbets-/ledig dag',
'calendar.partner': 'Partner',
'calendar.prevMonthAria': 'Föregående månad',
'calendar.saveError': 'Det gick inte att spara de planerade dagarna',
'calendar.weekdayFri': 'Fre',
'calendar.weekdayMon': 'Mån',
'calendar.weekdaySat': 'Lör',
'calendar.weekdaySun': 'Sön',
'calendar.weekdayThu': 'Tor',
'calendar.weekdayTue': 'Tis',
'calendar.weekdayWed': 'Ons',
'calendar.you': 'Du',
'calendarDay.ariaWithEvents': '{date} med {count} händelse(r)',
'calendarDay.klamdagAria': 'klämdag',
'calendarDay.overrideFreeAria': 'markerad som ledig dag (undantag)',
'calendarDay.overrideWorkingAria': 'markerad som arbetsdag (undantag)',
'calendarEvent.dismissAria': 'Avfärda {leaveType}',
'plannedDayModal.cancelButton': 'Avbryt',
'plannedDayModal.closeAria': 'Stäng',
'plannedDayModal.confirmDelete': 'Är du säker på att du vill ta bort den här planerade dagen?',
'plannedDayModal.deleteButton': 'Ta bort',
'plannedDayModal.deleteError': 'Det gick inte att ta bort den planerade dagen',
'plannedDayModal.deletingButton': 'Tar bort…',
'plannedDayModal.doubleDayHint': 'Dubbeldagar gäller inte för semester',
'plannedDayModal.doubleDayLabel': 'Dubbeldag (båda föräldrarna tar ut ledighet)',
'plannedDayModal.editTitle': 'Redigera planerad dag',
'plannedDayModal.lagstaOption': 'Lägstanivå (90-nivån)',
'plannedDayModal.leaveTypeLabel': 'Typ av ledighet',
'plannedDayModal.newTitle': 'Planera en dag',
'plannedDayModal.parentLabel': 'Förälder',
'plannedDayModal.rangeTitle': 'Planera {count} dagar',
'plannedDayModal.saveButton': 'Spara',
'plannedDayModal.saveError': 'Det gick inte att spara den planerade dagen',
'plannedDayModal.savingButton': 'Sparar…',
'plannedDayModal.sjukpenningOption': 'Sjukpenningnivå (390-nivån)',
'plannedDayModal.vacationOption': 'Semester',
'redDaysList.effectiveFree': 'Ledig',
'redDaysList.effectiveWorking': 'Arbetsdag',
'redDaysList.emptyYear': 'Inga röda dagar eller undantag detta år.',
'redDaysList.loading': 'Laddar röda dagar...',
'redDaysList.nextWindow': 'Nästa 4 år',
'redDaysList.overrideFree': 'Undantag: ledig dag',
'redDaysList.overrideWorking': 'Undantag: arbetsdag',
'redDaysList.prevWindow': 'Föregående 4 år',
} as const
+23
View File
@@ -0,0 +1,23 @@
export const common = {
'app.name': 'Föräldraledigplannerare',
'common.cancel': 'Avbryt',
'common.close': 'Stäng',
'common.delete': 'Ta bort',
'common.deleting': 'Tar bort…',
'common.loadingEllipsis': 'Laddar…',
'common.save': 'Spara',
'common.saving': 'Sparar…',
'footer.copyright': '© {year} Föräldraledigplannerare. Alla rättigheter förbehållna.',
'leaveType.lagsta': 'Lägstanivå',
'leaveType.sjukpenning': 'Sjukpenningnivå',
'leaveType.unknown': 'Okänd',
'leaveType.vacation': 'Semester',
'nav.calendar': 'Kalender',
'nav.logout': 'Logga ut',
'nav.logoutAria': 'Logga ut',
'nav.overview': 'Översikt',
'nav.plan': 'Planering',
'nav.selectChildAria': 'Välj barn',
'nav.settings': 'Inställningar',
'nav.tips': 'Tips',
} as const
+41
View File
@@ -0,0 +1,41 @@
export const dashboard = {
'dashboard.addChildButton': 'Lägg till barn',
'dashboard.addChildIntro': 'Du har inga barn registrerade ännu. Lägg till ditt första barn för att börja.',
'dashboard.addChildTitle': 'Lägg till barn',
'dashboard.addingChild': 'Lägger till...',
'dashboard.birthdayLabel': 'Födelsedag',
'dashboard.childNameLabel': 'Barnets namn',
'dashboard.createChildError': 'Kunde inte skapa barn',
'dashboard.daysLeft': 'Kvarvarande dagar',
'dashboard.enterManually': 'Ange uppgifter manuellt',
'dashboard.expiringAtB4': 'Totalt förfaller vid 4 års ålder (summa av alla föräldrar)',
'dashboard.expiringAtB4ForParent': 'Förfaller vid 4 års ålder – {name}',
'dashboard.expiringAtB4ParentFallback': 'Förälder {number}',
'dashboard.fetchFromFk': 'Hämta från Försäkringskassan',
'dashboard.fillAllFields': 'Fyll i alla fält',
'dashboard.loading': 'Laddar...',
'dashboard.namePlaceholder': 'Namn',
'dashboard.overviewTitle': 'Översikt',
'dashboard.plannedDaysTitle': 'Planerade dagar',
'dashboard.remainingUntilB4Title': 'Återstående till 4 års ålder',
'dashboard.saveManualFetchError': 'Kunde inte spara uppgifterna',
'dashboard.usedDays': 'Använda dagar',
'daysBreakdown.daysHeader': 'Dagar',
'daysBreakdown.empty': 'Inga dagar registrerade än',
'daysBreakdown.typeHeader': 'Typ av ledighet',
'overviewMetrics.defaultTitle': 'Översikt',
'parentalLeaveBreakdown.dubbeldagarLeft': 'Dubbeldagar kvar',
'parentalLeaveBreakdown.empty': 'Ingen data hämtad ännu — tryck på Hämta från Försäkringskassan.',
'parentalLeaveBreakdown.lagstaNiva': 'Lägsta nivå',
'parentalLeaveBreakdown.remainingHeader': 'Återstående',
'parentalLeaveBreakdown.reservedNote': '{reserved} av dina dagar är reserverade och kan inte överlåtas till den andra föräldern (max {transferable} dagar kan överlåtas).',
'parentalLeaveBreakdown.sjukpenning': 'Sjukpenning',
'parentalLeaveBreakdown.sourceManual': 'Manuellt angiven',
'parentalLeaveBreakdown.sourceScraped': 'Hämtad från Försäkringskassan',
'parentalLeaveBreakdown.totalHeader': 'Totalt',
'parentalLeaveBreakdown.transferableDays': 'Överlåtbara dagar',
'parentalLeaveBreakdown.typeHeader': 'Typ',
'progressChart.age': 'Ålder: {age}',
'progressChart.title': 'Föräldraledighet – förlopp',
'progressChart.weeksStat': '{current} / {target} veckor',
} as const
+32
View File
@@ -0,0 +1,32 @@
import { common } from './common'
import { auth } from './auth'
import { calendar } from './calendar'
import { dashboard } from './dashboard'
import { settings } from './settings'
import { plan } from './plan'
import { wishEditor } from './wishEditor'
import { tips } from './tips'
/**
* Swedish message catalogue — the single source of truth for translation keys.
*
* Split into per-domain modules so unrelated features can add keys without
* editing the same file. `en/` mirrors this structure exactly and is typed
* against `TranslationKey`, so a key present in one locale and missing from
* the other is a compile-time (`npm run typecheck`) error.
*
* These strings were extracted verbatim from the components that previously
* hardcoded them — this file is the authoritative Swedish copy.
*/
export const sv = {
...common,
...auth,
...calendar,
...dashboard,
...settings,
...plan,
...wishEditor,
...tips,
} as const
export type TranslationKey = keyof typeof sv
+117
View File
@@ -0,0 +1,117 @@
export const plan = {
'plan.addAtLeastOneWish': 'Lägg till minst ett önskemål ovan för att föreslå en plan.',
'plan.addWishError': 'Kunde inte lägga till önskemål',
'plan.calculating': 'Beräknar...',
'plan.intro': 'Beskriv hur du vill vara ledig — till exempel 6 veckor varje sommar och 4 veckor varje jul — och föreslå en plan som visar exakt vilka dagar som redan är lediga, vilka som kostar en semesterdag och vilka som kostar en föräldrapenningdag.',
'plan.loading': 'Laddar planering...',
'plan.proposeButton': 'Föreslå plan',
'plan.removeWishError': 'Kunde inte ta bort önskemål',
'plan.title': 'Planering',
'plan.updateWishError': 'Kunde inte spara önskemål',
'plan.wishesTitle': 'Dina önskemål',
'planResults.age4ProjectionsIntro': 'Så här ser det ut vid 4-årsdagen om den här planen tas ut som föreslaget — livet kan förstås bli annorlunda.',
'planResults.age4ProjectionsTitle': 'Vid barnets 4-årsdag, om planen genomförs',
'planResults.applyButton': 'Använd plan',
'planResults.applySavedPrefix': 'Planen har sparats!',
'planResults.applyingButton': 'Sparar...',
'planResults.balancesTitle': 'Kvarvarande saldon efter planen',
'planResults.cancelButton': 'Avbryt',
'planResults.collisionDateHeader': 'Datum',
'planResults.collisionExistingHeader': 'Befintlig typ',
'planResults.collisionProposedHeader': 'Föreslagen typ',
'planResults.confirmOverwriteButton': 'Ja, ersätt de befintliga dagarna',
'planResults.confirmOverwriteIntro': 'Följande dagar är redan planerade och kommer att ersättas:',
'planResults.confirmOverwriteTitle': 'Konflikt med befintliga dagar',
'planResults.createdClause': '{count} nya {dayWord} skapades',
'planResults.daySingular': 'dag',
'planResults.dayTypeFree': 'fria dagar (helg/röd dag)',
'planResults.dayTypeLagsta': 'FP-dagar (lägstanivå)',
'planResults.dayTypeSjukpenning': 'FP-dagar (sjukpenningnivå)',
'planResults.dayTypeVacation': 'semesterdagar',
'planResults.daysPlural': 'dagar',
'planResults.detailTitle': 'Ledigheter i detalj',
'planResults.dubbeldagarLeftHeader': 'Dubbeldagar kvar',
'planResults.expiringAtB4Header': 'Förfaller',
'planResults.explanationDetailFree': '{free_days} helt fria dagar (helg/röd dag)',
'planResults.explanationDetailLagsta': '{lagsta_days} föräldrapenningdagar (lägstanivå)',
'planResults.explanationDetailSjukpenning': '{sjukpenning_days} föräldrapenningdagar (sjukpenningnivå)',
'planResults.explanationDetailVacationAndFp': 'du behåller lönen {vacation_days} dagar och sparar {fp_days} FP-dagar',
'planResults.explanationDetailVacationOnly': '{vacation_days} semesterdagar',
'planResults.explanationShortfallSuffix': ' ({shortfall_days} dagar saknas)',
'planResults.explanationSummary': '{wish_name} {year} — {weeks_wished} veckor önskade, {weeks_funded} veckor finansierade',
'planResults.fourthBirthdayHeader': '4-årsdag',
'planResults.freeDaySingular': 'fri dag',
'planResults.freeDaysPlural': 'fria dagar',
'planResults.fullyFunded': 'Fullt finansierad',
'planResults.funded': 'finansierade',
'planResults.lagstaLeftHeader': 'Lägstanivådagar kvar',
'planResults.leavesHeader': 'Ledigheter',
'planResults.noWindowsInHorizon': 'Inga fönster inom planeringshorisonten.',
'planResults.parentHeader': 'Förälder',
'planResults.parentalDaysTitle': 'Föräldrapenningdagar',
'planResults.previewBanner': 'Detta är ett förslag — inget sparas automatiskt. Du kan justera dina önskemål ovan och föreslå en ny plan så många gånger du vill.',
'planResults.projectedLeftHeader': 'Beräknat kvar',
'planResults.rejectionCollisionsNeedReplace': '{count} dag(ar) är redan planerade på annat sätt; skicka replace=true för att skriva över',
'planResults.rejectionConflictingDuplicate': 'Motstridiga dubbletter för {date} (barn {child_id}, förälder {parent_personal_data_uuid}) i samma omgång',
'planResults.rejectionDubbeldagBatchQuotaExceeded': 'Omgången skulle resultera i {projected_total} dubbeldagar, max är {max_dubbeldagar}',
'planResults.rejectionDubbeldagInvalid': 'Dubbeldag för {date} kunde inte godkännas',
'planResults.rejectionDubbeldagQuotaReached': 'Kvoten för dubbeldagar ({max_dubbeldagar} dagar) är redan nådd',
'planResults.rejectionDubbeldagWindowExceeded': 'Dubbeldagar är endast tillåtna inom barnets första {months_limit} månader (senast {deadline})',
'planResults.rejectionInsufficientBalance': 'Omgången behöver {needed} fler "{tier}"-dagar men endast {remaining} finns kvar',
'planResults.rejectionInvalidDayType': 'Dag {index} ({date}): ogiltig dagtyp "{day_type}"',
'planResults.rejectionOutsideEligibleWindow': '{date}: utanför barnets tillåtna period ({birth_date} – {hard_expiry})',
'planResults.rejectionsClause': '. Avslag: {rejections}',
'planResults.remedyCarryVacationForward': '{spare_total} semesterdagar från tidigare år kan sparas framåt',
'planResults.remedyLowerPriorityWish': 'Sänk {wish_name} från {from_weeks} till {to_weeks} veckor frigör {freed_days} dagar',
'planResults.remedyReducePreschoolReserve': 'Minska förskolans planeringsdagar ({reserved} reserverade) frigör {reserved} dagar',
'planResults.remedyShiftWindowIntoFreeDays': 'Flytta {wish_name} närmare en helg frigör {shift_gain} dagar',
'planResults.replacedClause': ', {count} {dayWord} ersattes',
'planResults.savableAfterB4Header': 'Kan sparas',
'planResults.shortfallCouldNotBeFunded': '{days} {dayWord} kunde inte finansieras.',
'planResults.shortfallLabel': 'Underskott:',
'planResults.sjukpenningLeftHeader': 'Sjukpenningdagar kvar',
'planResults.skippedFreeClause': ', {count} {dayWord} hoppades över',
'planResults.skippedIdenticalClause': ', {count} {dayWord} hoppades över (redan likadana)',
'planResults.strategyDubbeldag': 'Dubbeldagar — båda föräldrarna hemma samtidigt',
'planResults.strategyParentSwap': 'Föräldrarna växlar av varandra',
'planResults.strategyPrefix': 'Strategi:',
'planResults.strategySolo': 'En förälder hemma',
'planResults.strategyUnplaced': 'Kunde inte placeras — ingen ledig plats hittades',
'planResults.surplusAdviceBodyFrontLoadEarlyYears': '{parent_name} har ett stort överskott ({days_involved} FP-dagar) — ta ut fler dagar nu medan barnet är litet och ni ändå är hemma, istället för att sprida ut dem tunt fram till 4-årsdagen.',
'planResults.surplusAdviceBodyShiftMixToFp': '{parent_name} kan byta {days_involved} semesterdagar mot föräldrapenningdagar under planen — FP-dagarna går annars förlorade vid 4-årsdagen, medan semestern inte gör det.',
'planResults.surplusAdviceBodyUseLessVacation': '{parent_name} kan ta ut {days_involved} färre semesterdagar ({years_text}) utan att gå under lägsta uttaget ({min_vacation_days_per_year} dagar/år) — spara dem istället för att täcka FP-dagar som annars går förlorade.',
'planResults.surplusAdviceBodyWishMoreLeave': '{parent_name} har råd med ytterligare {weeks} veckor ledigt ({days_involved} FP-dagar går annars förlorade vid barnets 4-årsdag) — lägg till en vecka på sommaren eller ett höstlov.',
'planResults.surplusAdviceFrontLoadEarlyYears': 'Ta ut mer ledighet medan barnet är litet',
'planResults.surplusAdviceIntro': 'Planen lämnar dagar outnyttjade som annars går förlorade vid barnets 4-årsdag. Några förslag:',
'planResults.surplusAdviceShiftMixToFp': 'Använd föräldradagar istället för semester',
'planResults.surplusAdviceTitle': 'Ni har outnyttjade dagar',
'planResults.surplusAdviceUseLessVacation': 'Spara färre semesterdagar',
'planResults.surplusAdviceWishMoreLeave': 'Önska mer ledighet',
'planResults.totalAvailableHeader': 'Totalt tillgängliga',
'planResults.usedHeader': 'Använda',
'planResults.vacationAssumedBadge': 'Antaget',
'planResults.vacationAssumedPrompt': 'Inget värde är registrerat för detta år — 25 dagar (lagstadgat) har antagits. Bekräfta eller ändra i Inställningar.',
'planResults.vacationDaysTitle': 'Semesterdagar',
'planResults.warningBodyDaysLostAtAge4': '{parent_name} riskerar att förlora {expiring_days} dagar vid barnets 4-årsdag ({fourth_birthday}) om inte fler dagar tas ut innan dess.',
'planResults.warningBodySgiRisk': '{parent_name} riskerar SGI-skyddet veckan som börjar {week_start} ({days_planned} dagar planerade, minst {min_days_per_week} krävs).',
'planResults.warningBodyVacationExpiring': '{parent_name} har {saved_days_in} sparade semesterdagar från {year} som riskerar att gå förlorade.',
'planResults.warningDaysLostAtAge4': 'Dagar som riskerar att gå förlorade vid 4 år',
'planResults.warningSgiRisk': 'Risk för SGI-skydd',
'planResults.warningVacationExpiring': 'Semesterdagar som riskerar att gå förlorade',
'planResults.warningsTitle': 'Varningar',
'planResults.weekSingular': 'vecka',
'planResults.weeksUnit': 'veckor',
'planResults.wished': 'önskade',
'planResults.yearHeader': 'År',
'planResults.yearOverviewTitle': 'Översikt över åren',
'planningGoalSelector.balanced': 'Balanserad',
'planningGoalSelector.balancedHelp': 'En avvägning mellan tid hemma och inkomst.',
'planningGoalSelector.legend': 'Planeringsmål',
'planningGoalSelector.maxMoney': 'Mest pengar',
'planningGoalSelector.maxMoneyHelp': 'Skydda din inkomst, t.ex. genom att lägga semester runt helger och röda dagar.',
'planningGoalSelector.maxTime': 'Mest tid hemma',
'planningGoalSelector.maxTimeHelp': 'Spara dagar och förläng din totala lediga tid, med lägre inkomst nu.',
'planningModeSelector.couple': 'Jag och min partner',
'planningModeSelector.legend': 'Planerar du själv eller tillsammans med en partner?',
'planningModeSelector.solo': 'Bara jag',
} as const
+131
View File
@@ -0,0 +1,131 @@
export const settings = {
'childBirthdayInput.birthDateLabel': 'Födelsedatum',
'childBirthdayInput.defaultLabel': 'Barnets födelsedatum',
'childBirthdayInput.preschoolStartLabel': 'Förskolestart (valfritt)',
'dayOverridesInput.addButton': 'Lägg till undantag',
'dayOverridesInput.addSectionTitle': 'Lägg till undantag',
'dayOverridesInput.addingButton': 'Lägger till...',
'dayOverridesInput.charCount': '{count}/280',
'dayOverridesInput.dateLabel': 'Datum',
'dayOverridesInput.empty': 'Du har inga undantag i kalendern ännu.',
'dayOverridesInput.noteFieldLabel': 'Anteckning (valfritt)',
'dayOverridesInput.noteLabel': 'Anteckning: {note}',
'dayOverridesInput.notePlaceholder': 'T.ex. Jobbade på juldagen',
'dayOverridesInput.offStatus': 'Jag är ledig den här dagen',
'dayOverridesInput.statusLegend': 'Status',
'dayOverridesInput.workingStatus': 'Jag jobbar den här dagen',
'manualFetchModal.cancelButton': 'Avbryt',
'manualFetchModal.closeAria': 'Stäng',
'manualFetchModal.daysRemaining': 'Kvarvarande dagar:',
'manualFetchModal.daysUsedLabel': 'Använda dagar',
'manualFetchModal.description': 'Ange dina uppgifter om föräldrapenning från Försäkringskassan manuellt om automatisk hämtning inte är tillgänglig.',
'manualFetchModal.dubbeldagarLabel': 'Dubbeldagar kvar (0–60)',
'manualFetchModal.lagstaUsedLabel': 'Använda dagar på lägstanivå (90-nivån)',
'manualFetchModal.remainingBreakdownTitle': 'Fördelning av kvarvarande dagar',
'manualFetchModal.reservedDaysLabel': 'Reserverade dagar kvar',
'manualFetchModal.saveButton': 'Spara',
'manualFetchModal.saveError': 'Det gick inte att spara de manuella uppgifterna',
'manualFetchModal.savingButton': 'Sparar…',
'manualFetchModal.sjukpenningUsedLabel': 'Använda dagar på sjukpenningnivå (390-nivån)',
'manualFetchModal.tierBreakdownTitle': 'Fördelning per nivå',
'manualFetchModal.title': 'Ange föräldrapenninguppgifter',
'manualFetchModal.totalDaysLabel': 'Totalt antal dagar (0–480)',
'manualFetchModal.totalDaysSectionTitle': 'Totalt antal dagar',
'manualFetchModal.transferableDaysLabel': 'Överlåtbara dagar kvar',
'parentProfileInput.employed': 'Anställd',
'parentProfileInput.employmentStatusLabel': 'Sysselsättning',
'parentProfileInput.hourly': 'Timlön',
'parentProfileInput.jobseeking': 'Arbetssökande',
'parentProfileInput.monthly': 'Månadslön',
'parentProfileInput.none': 'Ingen',
'parentProfileInput.salaryTypeLabel': 'Lönetyp',
'parentProfileInput.selectEmploymentStatus': 'Välj sysselsättning',
'parentProfileInput.selectSalaryType': 'Välj lönetyp',
'qrModal.authenticating': 'Autentiserar…',
'qrModal.cancelButton': 'Avbryt',
'qrModal.cancelled': 'Sessionen avbröts.',
'qrModal.closeAria': 'Stäng dialogruta',
'qrModal.closeButton': 'Stäng',
'qrModal.errorLabel': 'Fel:',
'qrModal.fetching': 'Hämtar data från FK…',
'qrModal.qrAlt': 'BankID QR-kod',
'qrModal.qrInstruction': 'Öppna BankID-appen och skanna QR-koden:',
'qrModal.statusLabel': 'Status:',
'qrModal.success': 'Klar! Data hämtad från Försäkringskassan.',
'qrModal.title': 'Hämta från Försäkringskassan',
'settings.addPartnerButton': 'Lägg till partner',
'settings.addPartnerError': 'Kunde inte lägga till partner',
'settings.addPartnerSuccess': 'Partner tillagd!',
'settings.addingPartner': 'Lägger till...',
'settings.calendarSectionTitle': 'Kalender',
'settings.cancelButton': 'Avbryt',
'settings.childBirthDateLabel': 'Barnets födelsedatum',
'settings.childSectionTitle': 'Barn',
'settings.dayOverridesHelp': 'Planeraren utgår från den svenska kalendern (röda dagar, klämdagar, julafton, midsommarafton och pingstafton är normalt lediga). Här kan du ange undantag för din arbetsplats — om du måste jobba juldagen eller är ledig på annars arbetande dagar.',
'settings.dayOverridesSectionTitle': 'Undantag i kalendern',
'settings.languageAutoOption': 'Automatisk (webbläsarens språk)',
'settings.languageEnglishOption': 'English',
'settings.languageLabel': 'Välj språk / Select language',
'settings.languageSectionTitle': 'Språk / Language',
'settings.languageSwedishOption': 'Svenska',
'settings.loading': 'Laddar inställningar...',
'settings.membersLoading': 'Laddar medlemmar…',
'settings.noChildSelected': 'Inget barn valt ännu.',
'settings.partnerActionErrorNotFound': 'Kunde inte hitta partnern. Ladda om sidan och försök igen.',
'settings.partnerIntro': 'Lägg till en partner för att planera föräldraledigheten tillsammans.',
'settings.partnerLinkedIntro': 'Din partner är kopplad till detta arbetsutrymme.',
'settings.partnerNameInvalid': 'Partnerns namn är ogiltigt.',
'settings.partnerNamePlaceholder': 'Partnerns namn',
'settings.partnerNameRequired': 'Ange ett namn för partnern',
'settings.partnerSectionTitle': 'Partner',
'settings.planningHelp': 'Ditt planeringsmål och om du planerar själv eller tillsammans med en partner styr hur planeraren föreslår fördelning av dagar.',
'settings.planningSectionTitle': 'Planering',
'settings.preschoolHelp': 'Förskolor stänger oftast ca 6 dagar per år för planering. Ange hur många dagar din förskola har, så reserveras de i planeringen.',
'settings.preschoolPlanningDaysLabel': 'Förskolans planeringsdagar per år',
'settings.profileHelp': 'Din lönetyp och sysselsättning används för att uppskatta din SGI och planera din ledighet.',
'settings.profileSectionTitle': 'Din profil',
'settings.redDaysHelp': 'En lista över röda dagar enligt den svenska kalendern, tillsammans med dina egna undantag — fyra år i taget.',
'settings.redDaysSectionTitle': 'Röda dagar',
'settings.removeBlockerLeaveWishes': 'önskemål om ledighet',
'settings.removeBlockerParentalLeave': 'registrerad föräldrapenning',
'settings.removeBlockerPlannedLeave': 'planerade lediga dagar',
'settings.removeBlockerVacationDays': 'registrerade semesterdagar',
'settings.removeConfirmButton': 'Ja, ta bort',
'settings.removeConfirmPrompt': 'Ta bort {name} från arbetsutrymmet?',
'settings.removePartnerButton': 'Ta bort',
'settings.removePartnerError': 'Kunde inte ta bort partnern',
'settings.removePartnerErrorHasDependentData': 'Går inte att ta bort — det finns registrerat: {blockers}. Ta bort eller flytta detta först.',
'settings.removePartnerErrorHasLogin': 'Går inte att ta bort — den här personen har ett eget konto och egen inloggning.',
'settings.removePartnerErrorSelf': 'Du kan inte ta bort dig själv från arbetsutrymmet.',
'settings.renameButton': 'Byt namn',
'settings.renamePartnerError': 'Kunde inte byta namn',
'settings.saveChildButton': 'Spara barnuppgifter',
'settings.saveChildError': 'Kunde inte spara barnets uppgifter',
'settings.saveChildSuccess': 'Barnets uppgifter sparade!',
'settings.savePlanningButton': 'Spara planering',
'settings.savePlanningError': 'Kunde inte spara planeringsinställningar',
'settings.savePlanningSuccess': 'Planeringsinställningar sparade!',
'settings.saveProfileButton': 'Spara din profil',
'settings.saveProfileError': 'Kunde inte spara din profil',
'settings.saveProfileSuccess': 'Din profil sparades!',
'settings.saveRenameButton': 'Spara namn',
'settings.saveVacationError': 'Kunde inte spara semesterdagar',
'settings.saveVacationSuccess': 'Semesterdagar för {year} sparade!',
'settings.selectedChildLabel': 'Valt barn:',
'settings.showWeekNumbers': 'Visa veckonummer',
'settings.title': 'Inställningar',
'settings.vacationHelp': 'Ange semesterdagar per år. Det första året är du oftast hemma mer och har färre dagar att lägga på semester, medan kommande år har din fulla årliga tilldelning. Detta styr hur mycket tid planeraren har att arbeta med.',
'settings.vacationSectionTitle': 'Semesterdagar',
'settings.youBadge': '(Du)',
'vacationDaysList.empty': 'Inga semesterdagar registrerade.',
'vacationDaysList.itemDays': '{count} dagar',
'vacationDaysList.loading': 'Laddar semesterdagar…',
'vacationDaysList.savedSuffix': '(+{count} sparade)',
'vacationDaysTable.assumedBadge': 'Antaget',
'vacationDaysTable.assumedPrompt': 'Inget värde är registrerat för detta år — 25 dagar (lagstadgat) har antagits. Bekräfta eller ändra nedan.',
'vacationDaysTable.empty': 'Inga år att visa ännu.',
'vacationDaysTable.saveButton': 'Spara',
'vacationDaysTable.savedDaysHeader': 'Sparade dagar in',
'vacationDaysTable.vacationDaysHeader': 'Semesterdagar',
'vacationDaysTable.yearHeader': 'År',
} as const
+31
View File
@@ -0,0 +1,31 @@
export const tips = {
'tip.aria': 'Tips: {title}',
'tip.balanceBetweenParents.body': '{leading_parent} har tagit ut {gap_days} fler dagar än {lagging_parent}. Fundera på att jämna ut fördelningen.',
'tip.balanceBetweenParents.title': 'Obalans mellan föräldrarna',
'tip.dismissAria': 'Avfärda: {title}',
'tip.lagstaNivaCoverage.body': '{parent_name} har bara {sjukpenning_left} dagar kvar på sjukpenningnivå men {lagsta_left} dagar kvar på lägstanivå.',
'tip.lagstaNivaCoverage.title': 'Täck upp med lägstanivå',
'tip.longBreakParentSwap.body': '{parent_name} täcker mindre än hälften av "{break_name}" ({start_date}–{end_date}). Låt {other_parent_name} ta en del av perioden.',
'tip.longBreakParentSwap.title': 'Överväg att växla av varandra',
'tip.preserveForAge4.body': '{parent_name} riskerar att förlora {expiring_days} dagar när barnet fyller 4 år ({fourth_birthday}). Endast 96 dagar kan sparas efter det.',
'tip.preserveForAge4.title': 'Dagar riskerar att gå förlorade vid 4 års ålder',
'tip.reserveForPreschoolPlanningDays.body': '{parent_name} har {days_left} dagar kvar, vilket knappt räcker för förskolans {buffer_days} planeringsdagar. Reservera dagar i god tid.',
'tip.reserveForPreschoolPlanningDays.title': 'Reservera dagar för förskolans planeringsdagar',
'tip.sgiMinimumAfterAge1.body': '{parent_name} planerar färre än {min_days_per_week} föräldrapenningdagar per vecka den kommande månaden, vilket kan påverka SGI-skyddet.',
'tip.sgiMinimumAfterAge1.title': 'Risk för SGI-skydd',
'tip.skipFpFirst12Months.body': '{parent_name} har föräldrapenning planerad innan barnet fyller 1 år. Med målet "mest tid hemma" kan det löna sig att spara dagarna till senare.',
'tip.skipFpFirst12Months.title': 'Spara föräldrapenning första året',
'tip.stretchTimeAtHome.body': '{parent_name} planerar {weekly_intensity} dagar per vecka den kommande månaden, vilket lämnar {projected_left} dagar kvar vid 4 års ålder.',
'tip.stretchTimeAtHome.title': 'Sträck ut tiden hemma',
'tip.useDubbeldagarStrategically.body': 'Ni har båda föräldrapenning planerad {date} men den är inte markerad som dubbeldag.',
'tip.useDubbeldagarStrategically.title': 'Använd en dubbeldag',
'tip.useVacationBeforeExpiry.body': '{parent_name} har {saved_days} sparade semesterdagar från {year} som riskerar att gå förlorade om de inte används.',
'tip.useVacationBeforeExpiry.title': 'Semesterdagar riskerar att gå förlorade',
'tip.wrapRedDaysWithVacation.body': '{parent_name} har föräldrapenning planerad nära en klämperiod ({cluster_start}–{cluster_end}). En semesterdag runt de röda dagarna kan ge en längre sammanhängande ledighet.',
'tip.wrapRedDaysWithVacation.title': 'Utnyttja röda dagar',
'tip.wrapWeekendWithVacation.body': '{parent_name} har föräldrapenning planerad fredagen {friday} och måndagen {monday}. En semesterdag mellan dem ger en längre ledighet.',
'tip.wrapWeekendWithVacation.title': 'Utnyttja helgen',
'tips.empty': 'Inga tips än. Bra jobbat med planeringen av din föräldraledighet!',
'tips.loading': 'Laddar tips...',
'tips.title': 'Optimeringstips',
} as const
+58
View File
@@ -0,0 +1,58 @@
export const wishEditor = {
'wishEditor.adjustBound': 'Justera sökintervall',
'wishEditor.adjustDates': 'Justera datum',
'wishEditor.bothParents': 'Båda föräldrarna',
'wishEditor.boundEndsLabel': 'till',
'wishEditor.boundStartsLabel': 'Sökintervall från',
'wishEditor.boundTooShortError': 'Sökintervallet är kortare än de {weeks} veckor som önskas — välj ett längre intervall eller minska antalet veckor.',
'wishEditor.customFlexButton': '+ Eget sökintervall',
'wishEditor.customFlexName': 'Eget sökintervall',
'wishEditor.customLeaveButton': '+ Egen ledighet',
'wishEditor.customLeaveName': 'Egen ledighet',
'wishEditor.eitherParent': 'Endera förälder',
'wishEditor.emptyState': 'Inga ledighetsönskemål ännu. Välj ett förslag ovan för att komma igång.',
'wishEditor.endsLabel': 'Slutar',
'wishEditor.firstYearLabel': 'Första året',
'wishEditor.flexBadge': 'när det passar bäst',
'wishEditor.flexPresetsLabel': 'Snabbval — sök inom en säsong ("när det passar bäst"):',
'wishEditor.hideDates': 'Dölj datum',
'wishEditor.lastYearLabel': 'Sista året',
'wishEditor.modeFixed': 'Bestämda datum',
'wishEditor.modeFlexible': 'När det passar bäst',
'wishEditor.modeFlexibleExplainer': 'Motorn väljer själv den bästa veckan inom sökintervallet nedan — den letar efter perioden med flest röda dagar och klämdagar, eftersom det kostar minst antal semesterdagar. Vid ett återkommande önskemål väljs ett nytt fönster varje år (påsken flyttar sig till exempel), och förslaget måste alltid bekräftas i planeringsfliken innan det sparas, precis som alla andra planer.',
'wishEditor.modeSectionLabel': 'Hur ska önskemålet placeras?',
'wishEditor.month1': 'Januari',
'wishEditor.month10': 'Oktober',
'wishEditor.month11': 'November',
'wishEditor.month12': 'December',
'wishEditor.month2': 'Februari',
'wishEditor.month3': 'Mars',
'wishEditor.month4': 'April',
'wishEditor.month5': 'Maj',
'wishEditor.month6': 'Juni',
'wishEditor.month7': 'Juli',
'wishEditor.month8': 'Augusti',
'wishEditor.month9': 'September',
'wishEditor.nameAria': 'Namn för {name}',
'wishEditor.parentLabel': 'Förälder',
'wishEditor.presetHostlov': 'Höstlov',
'wishEditor.presetJullov': 'Jullov',
'wishEditor.presetSommar': 'Sommar',
'wishEditor.priorityLabel': 'Prioritet',
'wishEditor.recurEveryYear': 'Återkommer varje år',
'wishEditor.removeButton': 'Ta bort',
'wishEditor.saveButton': 'Spara',
'wishEditor.saveFailedStatus': 'Kunde inte spara — ändringen finns kvar, försök igen.',
'wishEditor.savedStatus': 'Sparat',
'wishEditor.savingButton': 'Sparar...',
'wishEditor.seasonHost': 'Höst',
'wishEditor.seasonJul': 'Jul',
'wishEditor.seasonSommar': 'Sommar',
'wishEditor.seasonVar': 'Vår',
'wishEditor.startsLabel': 'Startar',
'wishEditor.untilAge4': 'Tills barnet fyller 4 år',
'wishEditor.weekUnit': 'vecka',
'wishEditor.weeksLabel': 'Veckor',
'wishEditor.weeksUnit': 'veckor',
'wishEditor.wrapsNote': 'Sträcker sig in i nästa år.',
} as const