feat(workspace): refine career workflows

Make job/CV comparisons language-aware and filter recruitment noise. Improve responsive career navigation, shared spacing, dashboard priorities, settings, localized workspace controls, and portable browser tests.
This commit is contained in:
cesnimda
2026-08-29 16:44:44 +02:00
parent 4d4af47651
commit 9edcbfc5de
29 changed files with 827 additions and 236 deletions
+182 -2
View File
@@ -11,6 +11,9 @@ export const translations = {
companies: "Companies",
trash: "Trash",
settings: "Settings",
openNavigation: "Open navigation",
expandSidebar: "Expand sidebar",
collapseSidebar: "Collapse sidebar",
addJob: "Add Job",
addJobApplication: "Add Job Application",
company: "Company",
@@ -159,6 +162,8 @@ export const translations = {
intelligenceCvProfileEmpty: "The linked CV cannot be matched until its career profile contains content.",
intelligenceMatchScore: "Career match score",
intelligenceAdvertTooShort: "The advert is too short to score reliably. Add the full text for a meaningful match.",
intelligenceMatchUsedTranslation: "The advert and CV use different languages. This match uses the saved English translation of the advert so equivalent wording is compared fairly.",
intelligenceMatchLanguageMismatch: "The advert and CV use different languages, but no saved translation is available. The score prioritises language-independent technical skills and may understate transferable experience.",
intelligenceMatched: "Matched",
intelligenceMissing: "Missing",
intelligenceRelevantExperience: "Relevant experience",
@@ -458,6 +463,10 @@ export const translations = {
cvDocumentAiNoChanges: "No wording changes were suggested.",
cvDocumentAiApplied: "The reviewed CV suggestions were applied.",
careerOverviewTitle: "Career Workspace",
careerWorkspaceNavigation: "Career workspace section",
careerWorkspaceOverviewTab: "Overview",
careerWorkspaceProfileTab: "Career profile",
careerWorkspaceImportTab: "Import review",
careerOverviewSubtitle: "Choose what you want to work on next.",
careerOverviewOpenBuilder: "Open CV Builder",
careerOverviewFirstRun: "Start by adding career information manually or importing a CV.",
@@ -655,10 +664,16 @@ export const translations = {
settingsBillingUnavailable: "Billing is temporarily unavailable.",
settingsBillingNotConfigured: "Pro upgrades are not available in this deployment yet.",
settingsSubtitle: "Preferences and admin tools.",
settingsNavigation: "Settings section",
settingsTabGeneral: "General",
settingsTabFollowUps: "Follow-ups",
settingsTabNotifications: "Notifications",
settingsTabBackup: "Backup",
settingsConnectedAccountsBody: "Manage inbox connections separately from account and security settings.",
settingsManageConnectedAccounts: "Manage connected accounts",
settingsNotificationsEmailBody: "Turning this off stops follow-up reminder emails. In-app reminders remain available.",
settingsNotificationsSave: "Save notification settings",
settingsSaving: "Saving…",
settingsAppearance: "Appearance",
settingsTheme: "Theme",
settingsThemeSystem: "System",
@@ -914,6 +929,7 @@ export const translations = {
dashboardHeroLabel: "Job search overview",
onboardingTitle: "Get set up",
onboardingBody: "A few steps to get the most out of Jobbjakt.",
onboardingDismiss: "Dismiss setup checklist",
onboardingStepSignup: "Create your account",
onboardingStepVerify: "Verify your email",
onboardingStepProfile: "Complete your profile",
@@ -925,6 +941,12 @@ export const translations = {
onboardingStepEmail: "Connect your email",
onboardingStepEmailAction: "Connect email",
dashboardResponseRate: "{rate}% response rate",
dashboardTodayTitle: "Today",
dashboardTodayBody: "Your highest-priority application actions, ordered by urgency.",
dashboardSummaryUnavailableTitle: "Unable to load dashboard summary",
dashboardSummaryUnavailableBody: "The dashboard summary is unavailable right now.",
dashboardTrendsUnavailableTitle: "Unable to load dashboard trends",
dashboardTrendsUnavailableBody: "Charts and trend panels could not reach the API.",
dashboardMonthsShort: "{count} mo",
dashboardAppliedCount: "{count} applied",
dashboardResponsesCount: "{count} responses",
@@ -1242,7 +1264,7 @@ export const translations = {
adminSystemCpuMode: "CPU mode",
adminSystemNoSmtpHost: "No SMTP host configured",
googleAccountTitle: "Google account",
googleSetupHint: "Set `NEXT_PUBLIC_GOOGLE_CLIENT_ID` in your UI environment to enable Google sign-in and account linking.",
googleSetupHint: "Google sign-in is not available in this deployment.",
googleLinked: "Linked",
googleAvailableToLink: "Available to link",
googleLinkedDate: "Linked {date}",
@@ -1679,6 +1701,55 @@ export const translations = {
workspaceNoActivity: "No activity recorded yet.",
workspaceJobDetails: "Job details",
workspaceChecklist: "Next actions and checklist",
checklistTitle: "Application checklist",
checklistProgress: "{completed} of {total} done",
checklistCompletion: "Checklist completion",
checklistLoadFailed: "Could not load the checklist.",
checklistUpdateFailed: "Could not update the checklist.",
checklistCategoryPreparation: "Before applying",
checklistCategorySubmission: "Submitting",
checklistCategoryFollowUp: "Follow-up",
checklistCategoryInterview: "Interview",
checklistCategoryCustom: "Your own tasks",
checklistYours: "Yours",
checklistDetected: "Detected",
checklistMoveUp: "Move up",
checklistMoveDown: "Move down",
checklistMoveUpItem: "Move up: {title}",
checklistMoveDownItem: "Move down: {title}",
checklistNotRelevant: "Not relevant for this role",
checklistRemoveItem: "Remove: {title}",
checklistAddTask: "Add your own task",
checklistAdd: "Add",
deleteAction: "Delete",
checklistItem_reviewJobDetails: "Review job details",
checklistItem_reviewJobDetailsDescription: "Save the advert text so analysis and matching have something to work with.",
checklistItem_completeCareerProfile: "Complete your career profile",
checklistItem_completeCareerProfileDescription: "The master profile is what every CV variant is built from.",
checklistItem_prepareCv: "Prepare a CV for this role",
checklistItem_prepareCvDescription: "Attach a CV variant tailored to this application.",
checklistItem_reviewCvMatch: "Review the CV match",
checklistItem_reviewCvMatchDescription: "Check that the CV answers the advert before sending it.",
checklistItem_createCoverLetter: "Create a cover letter",
checklistItem_createCoverLetterDescription: "Prepare a tailored letter for this application.",
checklistItem_attachPortfolio: "Attach a portfolio example",
checklistItem_attachPortfolioDescription: "Add relevant work samples where the role rewards them.",
checklistItem_attachSupportingDocuments: "Attach supporting documents",
checklistItem_attachSupportingDocumentsDescription: "Add certificates, references, or transcripts where relevant.",
checklistItem_saveApplicationAnswers: "Save application answers for this role",
checklistItem_saveApplicationAnswersDescription: "Reuse them in the application form and interview preparation.",
checklistItem_captureRecruiterContact: "Capture recruiter contact details",
checklistItem_captureRecruiterContactDescription: "A named contact makes a focused follow-up possible.",
checklistItem_confirmSubmitted: "Confirm the application was submitted",
checklistItem_confirmSubmittedDescription: "Move it out of the prospect stage and record the application date.",
checklistItem_addFollowUpReminder: "Add a follow-up reminder",
checklistItem_addFollowUpReminderDescription: "Choose when you want to follow up on this application.",
checklistItem_setNextAction: "Write the next action",
checklistItem_setNextActionDescription: "Keep the application moving deliberately rather than drifting.",
checklistItem_prepareInterviewNotes: "Prepare interview notes",
checklistItem_prepareInterviewNotesDescription: "Record talking points and likely questions before the interview.",
checklistItem_researchCompany: "Research the company",
checklistItem_researchCompanyDescription: "Learn enough about its product, people, and recent work to ask useful questions.",
workspaceActivityHistory: "Activity history",
workspaceDocuments: "Documents",
workspaceCommunication: "Communication",
@@ -1686,6 +1757,25 @@ export const translations = {
workspaceSelectCvMatch: "Choose the CV intended for this application before comparing it with the advert.",
workspaceComparingCv: "{name} compared with this job advert.",
workspaceSelectCvFirst: "Select a CV on the CV tab first. The application will only analyse the document you explicitly link.",
workspaceStatusSuggestionApply: "Apply {status}",
workspaceStatusSuggestionBody: "A recent recruiter message suggests moving this application from {current} to {suggested}.",
workspaceStatusSuggestionCurrent: "its current stage",
workspaceStatusSuggestionApplied: "Application status updated from the latest message.",
workspaceStatusSuggestionFailed: "Could not apply the suggested status.",
workspaceStrategyTitle: "Strategy snapshot",
workspaceStrategySubtitle: "An on-demand plan grounded in this advert and your saved career data.",
workspaceStrategyProRequired: "Pro required",
workspaceStrategyGenerate: "Generate",
workspaceStrategyRegenerate: "Regenerate",
workspaceStrategyCompleted: "Strategy snapshot completed.",
workspaceStrategyFailed: "Strategy snapshot failed. You can retry safely.",
workspaceStrategyCancelled: "Strategy snapshot cancelled.",
workspaceStrategyQueued: "Strategy snapshot queued.",
workspaceStrategyAlreadyQueued: "Strategy snapshot is already queued.",
workspaceStrategyQueueFailed: "Could not queue the strategy snapshot.",
workspaceStrategyCancelFailed: "Could not cancel the strategy snapshot.",
workspaceStrategyRetryFailed: "Could not retry the strategy snapshot.",
workspaceStrategyEmpty: "No strategy snapshot yet. Generate one when you want AI-assisted planning.",
coverAiTitle: "AI writing assistant",
coverAiSubtitle: "Uses this job and its linked CV. Suggestions never overwrite your document.",
coverAiSelectCv: "Select a CV before generating a tailored cover letter.",
@@ -1707,6 +1797,9 @@ export const translations = {
companies: "Selskaper",
trash: "Papirkurv",
settings: "Innstillinger",
openNavigation: "Åpne navigasjon",
expandSidebar: "Utvid sidemenyen",
collapseSidebar: "Skjul sidemenyen",
addJob: "Legg til jobb",
addJobApplication: "Legg til jobbsøknad",
company: "Selskap",
@@ -1855,6 +1948,8 @@ export const translations = {
intelligenceCvProfileEmpty: "Den tilknyttede CV-en kan ikke sammenlignes før karriereprofilen inneholder data.",
intelligenceMatchScore: "Samsvar mellom CV og jobb",
intelligenceAdvertTooShort: "Annonsen er for kort til å gi en pålitelig vurdering. Legg til hele teksten for et meningsfylt samsvar.",
intelligenceMatchUsedTranslation: "Annonsen og CV-en bruker ulike språk. Sammenligningen bruker den lagrede engelske oversettelsen av annonsen, slik at tilsvarende formuleringer vurderes rettferdig.",
intelligenceMatchLanguageMismatch: "Annonsen og CV-en bruker ulike språk, men ingen lagret oversettelse er tilgjengelig. Vurderingen prioriterer språkuavhengige tekniske ferdigheter og kan undervurdere overførbar erfaring.",
intelligenceMatched: "Samsvarer",
intelligenceMissing: "Mangler",
intelligenceRelevantExperience: "Relevant erfaring",
@@ -2154,6 +2249,10 @@ export const translations = {
cvDocumentAiNoChanges: "Ingen tekstendringer ble foreslått.",
cvDocumentAiApplied: "De gjennomgåtte CV-forslagene ble tatt i bruk.",
careerOverviewTitle: "Karriereområde",
careerWorkspaceNavigation: "Område i karrierearbeidsområdet",
careerWorkspaceOverviewTab: "Oversikt",
careerWorkspaceProfileTab: "Karriereprofil",
careerWorkspaceImportTab: "Importgjennomgang",
careerOverviewSubtitle: "Velg hva du vil arbeide med videre.",
careerOverviewOpenBuilder: "Åpne CV-bygger",
careerOverviewFirstRun: "Start med å legge til karriereinformasjon manuelt eller importere en CV.",
@@ -2351,10 +2450,16 @@ export const translations = {
settingsBillingUnavailable: "Betaling er midlertidig utilgjengelig.",
settingsBillingNotConfigured: "Pro-oppgraderinger er ikke tilgjengelige i denne installasjonen ennå.",
settingsSubtitle: "Preferanser og adminverktøy.",
settingsNavigation: "Innstillingsområde",
settingsTabGeneral: "Generelt",
settingsTabFollowUps: "Oppfølging",
settingsTabNotifications: "Varsler",
settingsTabBackup: "Sikkerhetskopi",
settingsConnectedAccountsBody: "Administrer innbokstilkoblinger separat fra konto- og sikkerhetsinnstillingene.",
settingsManageConnectedAccounts: "Administrer tilkoblede kontoer",
settingsNotificationsEmailBody: "Hvis dette slås av, stoppes e-postpåminnelser om oppfølging. Påminnelser i appen forblir tilgjengelige.",
settingsNotificationsSave: "Lagre varslingsinnstillinger",
settingsSaving: "Lagrer…",
settingsAppearance: "Utseende",
settingsTheme: "Tema",
settingsThemeSystem: "System",
@@ -2610,6 +2715,7 @@ export const translations = {
dashboardHeroLabel: "Oversikt over jobbsøket",
onboardingTitle: "Kom i gang",
onboardingBody: "Noen få steg for å få mest mulig ut av Jobbjakt.",
onboardingDismiss: "Skjul oppstartslisten",
onboardingStepSignup: "Opprett kontoen din",
onboardingStepVerify: "Bekreft e-postadressen din",
onboardingStepProfile: "Fullfør profilen din",
@@ -2621,6 +2727,12 @@ export const translations = {
onboardingStepEmail: "Koble til e-post",
onboardingStepEmailAction: "Koble til e-post",
dashboardResponseRate: "{rate}% svarrate",
dashboardTodayTitle: "I dag",
dashboardTodayBody: "De viktigste handlingene for søknadene dine, sortert etter hvor mye de haster.",
dashboardSummaryUnavailableTitle: "Kunne ikke laste dashboard-oppsummeringen",
dashboardSummaryUnavailableBody: "Dashboard-oppsummeringen er ikke tilgjengelig akkurat nå.",
dashboardTrendsUnavailableTitle: "Kunne ikke laste dashboard-trender",
dashboardTrendsUnavailableBody: "Grafer og trendpaneler fikk ikke kontakt med API-et.",
dashboardMonthsShort: "{count} md",
dashboardAppliedCount: "{count} søkt",
dashboardResponsesCount: "{count} svar",
@@ -2938,7 +3050,7 @@ export const translations = {
adminSystemCpuMode: "CPU-modus",
adminSystemNoSmtpHost: "Ingen SMTP-vert konfigurert",
googleAccountTitle: "Google-konto",
googleSetupHint: "Sett `NEXT_PUBLIC_GOOGLE_CLIENT_ID` i UI-miljøet ditt for å aktivere Google-innlogging og kontokobling.",
googleSetupHint: "Google-innlogging er ikke tilgjengelig i denne installasjonen.",
googleLinked: "Koblet",
googleAvailableToLink: "Tilgjengelig for kobling",
googleLinkedDate: "Koblet {date}",
@@ -3375,6 +3487,55 @@ export const translations = {
workspaceNoActivity: "Ingen aktivitet er registrert ennå.",
workspaceJobDetails: "Stillingsdetaljer",
workspaceChecklist: "Neste handlinger og sjekkliste",
checklistTitle: "Sjekkliste for søknaden",
checklistProgress: "{completed} av {total} fullført",
checklistCompletion: "Fullføring av sjekklisten",
checklistLoadFailed: "Kunne ikke laste sjekklisten.",
checklistUpdateFailed: "Kunne ikke oppdatere sjekklisten.",
checklistCategoryPreparation: "Før du søker",
checklistCategorySubmission: "Innsending",
checklistCategoryFollowUp: "Oppfølging",
checklistCategoryInterview: "Intervju",
checklistCategoryCustom: "Dine egne oppgaver",
checklistYours: "Din",
checklistDetected: "Oppdaget",
checklistMoveUp: "Flytt opp",
checklistMoveDown: "Flytt ned",
checklistMoveUpItem: "Flytt opp: {title}",
checklistMoveDownItem: "Flytt ned: {title}",
checklistNotRelevant: "Ikke relevant for denne stillingen",
checklistRemoveItem: "Fjern: {title}",
checklistAddTask: "Legg til din egen oppgave",
checklistAdd: "Legg til",
deleteAction: "Slett",
checklistItem_reviewJobDetails: "Se gjennom stillingsdetaljene",
checklistItem_reviewJobDetailsDescription: "Lagre annonseteksten slik at analyse og sammenligning har et godt grunnlag.",
checklistItem_completeCareerProfile: "Fullfør karriereprofilen din",
checklistItem_completeCareerProfileDescription: "Hovedprofilen er grunnlaget for alle CV-varianter.",
checklistItem_prepareCv: "Forbered en CV for denne stillingen",
checklistItem_prepareCvDescription: "Koble til en CV-variant som er tilpasset denne søknaden.",
checklistItem_reviewCvMatch: "Se gjennom CV-samsvaret",
checklistItem_reviewCvMatchDescription: "Kontroller at CV-en svarer på annonsen før du sender den.",
checklistItem_createCoverLetter: "Opprett et søknadsbrev",
checklistItem_createCoverLetterDescription: "Forbered et tilpasset brev for denne søknaden.",
checklistItem_attachPortfolio: "Legg ved et porteføljeeksempel",
checklistItem_attachPortfolioDescription: "Legg til relevante arbeidseksempler når stillingen verdsetter dem.",
checklistItem_attachSupportingDocuments: "Legg ved støttedokumenter",
checklistItem_attachSupportingDocumentsDescription: "Legg til attester, referanser eller vitnemål der det er relevant.",
checklistItem_saveApplicationAnswers: "Lagre søknadssvar for denne stillingen",
checklistItem_saveApplicationAnswersDescription: "Gjenbruk dem i søknadsskjemaet og intervjuforberedelsen.",
checklistItem_captureRecruiterContact: "Lagre kontaktinformasjon til rekruttereren",
checklistItem_captureRecruiterContactDescription: "En navngitt kontakt gjør målrettet oppfølging mulig.",
checklistItem_confirmSubmitted: "Bekreft at søknaden er sendt",
checklistItem_confirmSubmittedDescription: "Flytt den ut av interessentstadiet og registrer søknadsdatoen.",
checklistItem_addFollowUpReminder: "Legg til en oppfølgingspåminnelse",
checklistItem_addFollowUpReminderDescription: "Velg når du vil følge opp denne søknaden.",
checklistItem_setNextAction: "Skriv neste handling",
checklistItem_setNextActionDescription: "Hold søknaden i bevegelse med en tydelig plan.",
checklistItem_prepareInterviewNotes: "Forbered intervjunotater",
checklistItem_prepareInterviewNotesDescription: "Noter samtalepunkter og sannsynlige spørsmål før intervjuet.",
checklistItem_researchCompany: "Undersøk selskapet",
checklistItem_researchCompanyDescription: "Lær nok om produktet, menneskene og nylig arbeid til å stille nyttige spørsmål.",
workspaceActivityHistory: "Aktivitetshistorikk",
workspaceDocuments: "Dokumenter",
workspaceCommunication: "Kommunikasjon",
@@ -3382,6 +3543,25 @@ export const translations = {
workspaceSelectCvMatch: "Velg CV-en som skal brukes i søknaden før den sammenlignes med annonsen.",
workspaceComparingCv: "{name} sammenlignes med denne stillingsannonsen.",
workspaceSelectCvFirst: "Velg først en CV under CV-fanen. Søknaden analyserer bare dokumentet du kobler til eksplisitt.",
workspaceStatusSuggestionApply: "Bruk {status}",
workspaceStatusSuggestionBody: "En nylig melding fra en rekrutterer foreslår å flytte denne søknaden fra {current} til {suggested}.",
workspaceStatusSuggestionCurrent: "nåværende stadium",
workspaceStatusSuggestionApplied: "Søknadsstatusen ble oppdatert fra den siste meldingen.",
workspaceStatusSuggestionFailed: "Kunne ikke bruke den foreslåtte statusen.",
workspaceStrategyTitle: "Strategioversikt",
workspaceStrategySubtitle: "En behovsstyrt plan basert på denne annonsen og dine lagrede karrieredata.",
workspaceStrategyProRequired: "Krever Pro",
workspaceStrategyGenerate: "Generer",
workspaceStrategyRegenerate: "Generer på nytt",
workspaceStrategyCompleted: "Strategioversikten er ferdig.",
workspaceStrategyFailed: "Strategioversikten mislyktes. Du kan trygt prøve igjen.",
workspaceStrategyCancelled: "Strategioversikten ble avbrutt.",
workspaceStrategyQueued: "Strategioversikten er satt i kø.",
workspaceStrategyAlreadyQueued: "Strategioversikten står allerede i kø.",
workspaceStrategyQueueFailed: "Kunne ikke sette strategioversikten i kø.",
workspaceStrategyCancelFailed: "Kunne ikke avbryte strategioversikten.",
workspaceStrategyRetryFailed: "Kunne ikke prøve strategioversikten på nytt.",
workspaceStrategyEmpty: "Ingen strategioversikt ennå. Generer en når du ønsker AI-støttet planlegging.",
coverAiTitle: "AI-skriveassistent",
coverAiSubtitle: "Bruker denne stillingen og den tilknyttede CV-en. Forslag overskriver aldri dokumentet ditt.",
coverAiSelectCv: "Velg en CV før du genererer et skreddersydd søknadsbrev.",