careermate 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +11 -7
- package/INSTALL.md +18 -16
- package/README.md +28 -26
- package/THIRD_PARTY_NOTICES.md +2 -3
- package/bin/careermate.mjs +8 -1
- package/dist/career-os/README.md +8 -3
- package/dist/career-os/eop/career-description.md +136 -0
- package/dist/career-os/eop/cover-letter.md +7 -5
- package/dist/career-os/eop/fit-analysis.md +15 -5
- package/dist/career-os/eop/interview-prep.md +209 -21
- package/dist/career-os/eop/job-analysis.md +5 -3
- package/dist/career-os/eop/profile-extraction.md +5 -4
- package/dist/career-os/knowledge/cover-letter.md +4 -4
- package/dist/career-os/knowledge/fit-matching.md +8 -8
- package/dist/career-os/knowledge/interview-behavioral.md +76 -8
- package/dist/career-os/knowledge/interview-technical.md +106 -4
- package/dist/career-os/knowledge/linkedin-profile.md +1 -1
- package/dist/career-os/knowledge/networking-referrals.md +1 -1
- package/dist/career-os/knowledge/offer-evaluation-decision.md +10 -10
- package/dist/career-os/knowledge/portfolio.md +3 -3
- package/dist/career-os/knowledge/verifiers/ats-compat.md +8 -4
- package/dist/career-os/knowledge/verifiers/human-voice.md +2 -2
- package/dist/career-os/knowledge/verifiers/recency-staleness.md +1 -1
- package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
- package/dist/career-os/knowledge/verifiers/truthfulness.md +1 -1
- package/dist/doctor.mjs +1019 -127
- package/dist/mcp.mjs +1036 -126
- package/dist/migrate.mjs +52 -1
- package/dist/public/app.js +42 -16
- package/dist/public/i18n/en/applications.js +23 -0
- package/dist/public/i18n/en/common.js +22 -0
- package/dist/public/i18n/en/documents.js +133 -0
- package/dist/public/i18n/en/home.js +75 -0
- package/dist/public/i18n/en/interview.js +69 -0
- package/dist/public/i18n/en/jobs.js +152 -0
- package/dist/public/i18n/en/nav.js +18 -0
- package/dist/public/i18n/en/profile.js +201 -0
- package/dist/public/i18n/en/settings.js +127 -0
- package/dist/public/i18n/en/status.js +22 -0
- package/dist/public/i18n/en.js +17 -0
- package/dist/public/i18n/ko/applications.js +23 -0
- package/dist/public/i18n/ko/common.js +22 -0
- package/dist/public/i18n/ko/documents.js +133 -0
- package/dist/public/i18n/ko/home.js +63 -0
- package/dist/public/i18n/ko/interview.js +69 -0
- package/dist/public/i18n/ko/jobs.js +152 -0
- package/dist/public/i18n/ko/nav.js +18 -0
- package/dist/public/i18n/ko/profile.js +201 -0
- package/dist/public/i18n/ko/settings.js +127 -0
- package/dist/public/i18n/ko/status.js +23 -0
- package/dist/public/i18n/ko.js +18 -0
- package/dist/public/i18n.js +55 -0
- package/dist/public/index.html +1 -0
- package/dist/public/lib.js +25 -17
- package/dist/public/pages/applications.js +17 -21
- package/dist/public/pages/documents.js +153 -107
- package/dist/public/pages/home.js +88 -53
- package/dist/public/pages/interview.js +105 -51
- package/dist/public/pages/jobs.js +330 -106
- package/dist/public/pages/profile.js +157 -152
- package/dist/public/pages/settings.js +270 -72
- package/dist/public/styles.css +38 -3
- package/dist/web.mjs +859 -103
- package/docs/FAQ.md +26 -5
- package/docs/MCP_TOOLS.md +26 -12
- package/docs/START_WORKFLOW.md +2 -2
- package/docs/SUPPORTED_AI_APPS.md +13 -0
- package/docs/WORKFLOWS.md +80 -23
- package/docs/career-os/README.md +8 -3
- package/docs/career-os/eop/career-description.md +136 -0
- package/docs/career-os/eop/cover-letter.md +7 -5
- package/docs/career-os/eop/fit-analysis.md +15 -5
- package/docs/career-os/eop/interview-prep.md +209 -21
- package/docs/career-os/eop/job-analysis.md +5 -3
- package/docs/career-os/eop/profile-extraction.md +5 -4
- package/docs/career-os/knowledge/cover-letter.md +4 -4
- package/docs/career-os/knowledge/fit-matching.md +8 -8
- package/docs/career-os/knowledge/interview-behavioral.md +76 -8
- package/docs/career-os/knowledge/interview-technical.md +106 -4
- package/docs/career-os/knowledge/linkedin-profile.md +1 -1
- package/docs/career-os/knowledge/networking-referrals.md +1 -1
- package/docs/career-os/knowledge/offer-evaluation-decision.md +10 -10
- package/docs/career-os/knowledge/portfolio.md +3 -3
- package/docs/career-os/knowledge/verifiers/ats-compat.md +8 -4
- package/docs/career-os/knowledge/verifiers/human-voice.md +2 -2
- package/docs/career-os/knowledge/verifiers/recency-staleness.md +1 -1
- package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
- package/docs/career-os/knowledge/verifiers/truthfulness.md +1 -1
- package/package.json +2 -2
- package/packages/core/src/onboarding.ts +2 -1
- package/packages/core/src/services.ts +138 -21
- package/packages/core/src/summary.ts +59 -1
- package/packages/core/src/verify/lint.ts +4 -0
- package/packages/db/src/index.ts +1 -0
- package/packages/db/src/repositories.ts +0 -0
- package/packages/db/src/schema.ts +17 -0
- package/packages/exporters/src/index.ts +28 -17
- package/packages/knowledge/src/index.ts +46 -7
- package/packages/mcp-tools/src/bridge.ts +194 -13
- package/packages/mcp-tools/src/tools.ts +390 -38
- package/packages/mcp-tools/src/update.ts +31 -16
- package/packages/parsers/src/documents.ts +12 -1
- package/packages/prompts/src/humanize.ts +46 -0
- package/packages/prompts/src/index.ts +5 -1
- package/packages/prompts/src/install.ts +4 -4
- package/packages/prompts/src/onboarding.ts +4 -4
- package/packages/prompts/src/system.ts +17 -8
- package/packages/shared/src/enums.ts +14 -4
- package/packages/shared/src/schemas.ts +41 -0
- package/packages/workflows/src/definitions.ts +47 -10
- package/scripts/init.ts +284 -13
- package/dist/site/analytics.js +0 -97
- package/dist/site/favicon.svg +0 -1
- package/dist/site/fonts/PretendardVariable.woff2 +0 -0
- package/dist/site/icon-180.png +0 -0
- package/dist/site/icon-512.png +0 -0
- package/dist/site/index.html +0 -565
- package/dist/site/landing.js +0 -54
- package/dist/site/llms-install.txt +0 -218
- package/dist/site/robots.txt +0 -4
- package/dist/site/sitemap.xml +0 -21
- package/dist/site/start.html +0 -353
- package/dist/site/style.css +0 -559
- package/dist/site/vercel.json +0 -20
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Postings page — list + detail
|
|
2
|
+
export default {
|
|
3
|
+
// ---- list mode ----
|
|
4
|
+
'jobs.list.empty.title': 'No saved postings yet',
|
|
5
|
+
'jobs.list.empty.body': 'Add a posting you are interested in to track its fit and your progress.',
|
|
6
|
+
'jobs.list.addJob': 'Add posting',
|
|
7
|
+
'jobs.list.searchPlaceholder': 'Search company or role',
|
|
8
|
+
'jobs.list.searchAria': 'Search postings',
|
|
9
|
+
'jobs.list.locationUnset': 'Location TBD',
|
|
10
|
+
'jobs.list.deadline': 'Due {{date}}',
|
|
11
|
+
'jobs.list.noDeadline': 'No deadline',
|
|
12
|
+
'jobs.list.score': '{{score}}/100',
|
|
13
|
+
'jobs.list.noResult': 'No matching postings.',
|
|
14
|
+
'jobs.list.cardTitle': 'Saved postings',
|
|
15
|
+
'jobs.list.cardSub': { one: '{{count}} posting', other: '{{count}} postings' },
|
|
16
|
+
'jobs.list.col.companyRole': 'Company · Role',
|
|
17
|
+
'jobs.list.col.locationDeadline': 'Location · Deadline',
|
|
18
|
+
'jobs.list.col.fit': 'Fit',
|
|
19
|
+
'jobs.list.col.status': 'Status',
|
|
20
|
+
|
|
21
|
+
// ---- job form (create/edit modal) ----
|
|
22
|
+
'jobs.form.companyPlaceholder': 'Company name',
|
|
23
|
+
'jobs.form.positionPlaceholder': 'Role / position title',
|
|
24
|
+
'jobs.form.urlPlaceholder': 'https://…',
|
|
25
|
+
'jobs.form.locationPlaceholder': 'e.g. Seoul / Remote',
|
|
26
|
+
'jobs.form.employmentPlaceholder': 'e.g. Full-time / Contract / Intern',
|
|
27
|
+
'jobs.form.deadlinePlaceholder': 'YYYY-MM-DD',
|
|
28
|
+
'jobs.form.sourcePlaceholder': 'e.g. LinkedIn / Wanted / Manual entry',
|
|
29
|
+
'jobs.form.descriptionPlaceholder': 'Paste the original posting or a tidied-up version.',
|
|
30
|
+
'jobs.form.keywordsPlaceholder': 'Key keywords (comma-separated)',
|
|
31
|
+
'jobs.form.requirementsPlaceholder': 'One requirement or preferred qualification per line',
|
|
32
|
+
'jobs.form.tidy': 'Tidy pasted text',
|
|
33
|
+
'jobs.form.tidyBusy': 'Tidying…',
|
|
34
|
+
'jobs.form.tidyNeedsText': 'Paste the original posting first.',
|
|
35
|
+
'jobs.form.tidyDone': 'Tidied the pasted text and filled in a few fields.',
|
|
36
|
+
'jobs.form.field.company': 'Company *',
|
|
37
|
+
'jobs.form.field.position': 'Role *',
|
|
38
|
+
'jobs.form.field.url': 'Posting URL',
|
|
39
|
+
'jobs.form.field.location': 'Location',
|
|
40
|
+
'jobs.form.field.employment': 'Employment type',
|
|
41
|
+
'jobs.form.field.deadline': 'Deadline',
|
|
42
|
+
'jobs.form.field.deadlineHint': 'YYYY-MM-DD',
|
|
43
|
+
'jobs.form.field.source': 'Source',
|
|
44
|
+
'jobs.form.field.description': 'Original posting',
|
|
45
|
+
'jobs.form.field.descriptionHint': 'Paste the text and click "Tidy" to auto-fill company, role, keywords, and deadline.',
|
|
46
|
+
'jobs.form.field.keywords': 'Key keywords',
|
|
47
|
+
'jobs.form.field.keywordsHint': 'comma-separated',
|
|
48
|
+
'jobs.form.field.requirements': 'Requirements · Preferred',
|
|
49
|
+
'jobs.form.field.requirementsHint': 'one per line',
|
|
50
|
+
'jobs.form.validationRequired': 'Company and role are required.',
|
|
51
|
+
'jobs.form.savedNew': 'Posting saved.',
|
|
52
|
+
'jobs.form.savedEdit': 'Posting updated.',
|
|
53
|
+
'jobs.form.save': 'Save posting',
|
|
54
|
+
'jobs.form.cancel': 'Cancel',
|
|
55
|
+
'jobs.modal.addTitle': 'Add posting',
|
|
56
|
+
'jobs.modal.editTitle': 'Edit posting',
|
|
57
|
+
|
|
58
|
+
// ---- detail mode ----
|
|
59
|
+
'jobs.detail.notFoundTitle': 'Posting not found',
|
|
60
|
+
'jobs.detail.notFoundCardTitle': "We couldn't find this posting",
|
|
61
|
+
'jobs.detail.notFoundBody': 'The posting you requested was deleted or does not exist.',
|
|
62
|
+
'jobs.detail.backToList': 'Back to postings',
|
|
63
|
+
'jobs.detail.title': '{{company}} · {{position}}',
|
|
64
|
+
'jobs.detail.statusChanged': 'Status updated.',
|
|
65
|
+
'jobs.detail.edit': 'Edit',
|
|
66
|
+
'jobs.detail.delete': 'Delete',
|
|
67
|
+
'jobs.detail.deleteTitle': 'Delete posting',
|
|
68
|
+
'jobs.detail.deleteMessage': "Delete the '{{company}} · {{position}}' posting? Its linked application records will be removed too.",
|
|
69
|
+
'jobs.detail.deleteConfirm': 'Delete',
|
|
70
|
+
'jobs.detail.deleted': 'Posting deleted.',
|
|
71
|
+
'jobs.detail.list': 'Postings',
|
|
72
|
+
'jobs.detail.statusLabel': 'Status',
|
|
73
|
+
'jobs.detail.openPosting': 'Original posting',
|
|
74
|
+
|
|
75
|
+
// ---- posting card ----
|
|
76
|
+
'jobs.posting.title': 'Posting details',
|
|
77
|
+
'jobs.posting.location': 'Location',
|
|
78
|
+
'jobs.posting.employment': 'Employment type',
|
|
79
|
+
'jobs.posting.deadline': 'Deadline',
|
|
80
|
+
'jobs.posting.source': 'Source',
|
|
81
|
+
'jobs.posting.unset': 'TBD',
|
|
82
|
+
'jobs.posting.none': 'None',
|
|
83
|
+
'jobs.posting.sourceManual': 'Manual entry',
|
|
84
|
+
'jobs.posting.keywords': 'Key keywords',
|
|
85
|
+
'jobs.posting.requirements': 'Requirements · Preferred',
|
|
86
|
+
'jobs.posting.rawText': 'Original posting',
|
|
87
|
+
|
|
88
|
+
// ---- fit card ----
|
|
89
|
+
'jobs.fit.title': 'Fit analysis',
|
|
90
|
+
'jobs.fit.emptyBody': 'Not analyzed yet. The comparison between this posting and your profile will appear here.',
|
|
91
|
+
'jobs.fit.overall': 'Overall fit (out of 100)',
|
|
92
|
+
'jobs.fit.notScored': 'Not scored',
|
|
93
|
+
'jobs.fit.strengths': 'Strengths',
|
|
94
|
+
'jobs.fit.gaps': 'Gaps to address',
|
|
95
|
+
'jobs.fit.matchedKeywords': 'Matching keywords',
|
|
96
|
+
'jobs.fit.missingKeywords': 'Missing keywords',
|
|
97
|
+
'jobs.fit.recommendations': 'Suggested approach',
|
|
98
|
+
|
|
99
|
+
// ---- cover letters card ----
|
|
100
|
+
'jobs.cover.title': 'Cover letters',
|
|
101
|
+
'jobs.cover.empty': 'Ask your AI to write one and it will be saved here.',
|
|
102
|
+
'jobs.cover.cardSub': { one: '{{count}} letter', other: '{{count}} letters' },
|
|
103
|
+
'jobs.cover.versions': { one: '{{count}} version', other: '{{count}} versions' },
|
|
104
|
+
|
|
105
|
+
// ---- interview card ----
|
|
106
|
+
'jobs.interview.title': 'Interview prep',
|
|
107
|
+
'jobs.interview.viewPrep': 'Details',
|
|
108
|
+
'jobs.interview.questions': { one: '{{count}} likely question is ready.', other: '{{count}} likely questions are ready.' },
|
|
109
|
+
'jobs.interview.saved': 'Interview prep is saved.',
|
|
110
|
+
'jobs.interview.introSaved': 'A 1-minute intro draft is saved too.',
|
|
111
|
+
'jobs.interview.empty': 'Ask your AI to prepare it and it will be saved here.',
|
|
112
|
+
|
|
113
|
+
// ---- applied modal ----
|
|
114
|
+
'jobs.applied.title': 'Record application',
|
|
115
|
+
'jobs.applied.channelPlaceholder': 'e.g. LinkedIn, Wanted, company careers page',
|
|
116
|
+
'jobs.applied.notePlaceholder': 'You can leave a note about this status change.',
|
|
117
|
+
'jobs.applied.coverNone': 'None',
|
|
118
|
+
'jobs.applied.coverNoneSub': "Don't record a cover letter as a submitted item",
|
|
119
|
+
'jobs.applied.versions': { one: '{{count}} version', other: '{{count}} versions' },
|
|
120
|
+
'jobs.applied.otherJob': 'Linked to another posting',
|
|
121
|
+
'jobs.applied.primary': 'Primary',
|
|
122
|
+
'jobs.applied.noCovers': "There's no cover letter for this posting yet.",
|
|
123
|
+
'jobs.applied.noDocs': 'No resumes, career descriptions, or portfolios saved in your documents.',
|
|
124
|
+
'jobs.applied.toggleOther': 'Other cover letters',
|
|
125
|
+
'jobs.applied.toggleScoped': 'Only this posting',
|
|
126
|
+
'jobs.applied.fieldSubmittedAt': 'Submitted on',
|
|
127
|
+
'jobs.applied.fieldChannel': 'Submission channel',
|
|
128
|
+
'jobs.applied.fieldCover': 'Cover letter',
|
|
129
|
+
'jobs.applied.fieldDocs': 'Submitted documents',
|
|
130
|
+
'jobs.applied.fieldNote': 'Note',
|
|
131
|
+
'jobs.applied.cancel': 'Cancel',
|
|
132
|
+
'jobs.applied.statusOnly': 'Change status only',
|
|
133
|
+
'jobs.applied.recordAndDone': 'Record and finish',
|
|
134
|
+
|
|
135
|
+
// ---- timeline card ----
|
|
136
|
+
'jobs.timeline.title': 'Timeline',
|
|
137
|
+
'jobs.timeline.cardSub': { one: '{{count}} event', other: '{{count}} events' },
|
|
138
|
+
'jobs.timeline.coverLetter': 'Cover letter',
|
|
139
|
+
'jobs.timeline.deletedDoc': 'Deleted document',
|
|
140
|
+
'jobs.timeline.deleted': 'Deleted',
|
|
141
|
+
'jobs.timeline.type.job_saved': 'Posting added',
|
|
142
|
+
'jobs.timeline.type.fit_analysis_saved': 'Fit analysis',
|
|
143
|
+
'jobs.timeline.type.cover_letter_version_saved': 'Cover letter written',
|
|
144
|
+
'jobs.timeline.type.interview_prep_saved': 'Interview prep',
|
|
145
|
+
'jobs.timeline.fitScore': 'Overall {{score}}/100',
|
|
146
|
+
'jobs.timeline.questionCount': { one: '{{count}} likely question', other: '{{count}} likely questions' },
|
|
147
|
+
|
|
148
|
+
// ---- related card ----
|
|
149
|
+
'jobs.related.title': 'Related records',
|
|
150
|
+
'jobs.related.sub': 'Same company · role',
|
|
151
|
+
'jobs.related.deadline': 'Due {{date}}',
|
|
152
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Sidebar navigation + routing/shell.
|
|
2
|
+
export default {
|
|
3
|
+
'nav.home': 'Home',
|
|
4
|
+
'nav.profile': 'Profile',
|
|
5
|
+
'nav.jobs': 'Postings',
|
|
6
|
+
'nav.applications': 'Applications',
|
|
7
|
+
'nav.documents': 'Documents',
|
|
8
|
+
'nav.interview': 'Interview prep',
|
|
9
|
+
'nav.settings': 'Settings',
|
|
10
|
+
'nav.section.workspace': 'Workspace',
|
|
11
|
+
'nav.section.system': 'System',
|
|
12
|
+
'nav.menu.open': 'Open menu',
|
|
13
|
+
'nav.menu.close': 'Close menu',
|
|
14
|
+
'nav.subtitle': 'Manage your career',
|
|
15
|
+
'nav.skip': 'Skip to content',
|
|
16
|
+
'nav.footStatus': 'Running locally',
|
|
17
|
+
'err.page.load': "Couldn't load the page",
|
|
18
|
+
};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// Profile page.
|
|
2
|
+
export default {
|
|
3
|
+
'profile.title': 'Profile',
|
|
4
|
+
|
|
5
|
+
// period label
|
|
6
|
+
'profile.period.present': 'Present',
|
|
7
|
+
'profile.period.startToPresent': '{{start}} ~ Present',
|
|
8
|
+
'profile.period.startToEnd': '{{start}} ~ {{end}}',
|
|
9
|
+
|
|
10
|
+
// completeness card
|
|
11
|
+
'profile.completeness.title': 'Profile completeness',
|
|
12
|
+
'profile.completeness.percent': '{{pct}}%',
|
|
13
|
+
|
|
14
|
+
// export profile as a resume
|
|
15
|
+
'profile.export.md': 'MD',
|
|
16
|
+
'profile.export.html': 'HTML',
|
|
17
|
+
'profile.export.mdTitle': 'Export resume as Markdown',
|
|
18
|
+
'profile.export.htmlTitle': 'Export resume as HTML',
|
|
19
|
+
|
|
20
|
+
// basic info card
|
|
21
|
+
'profile.basic.title': 'Basic info',
|
|
22
|
+
'profile.basic.kv.name': 'Name',
|
|
23
|
+
'profile.basic.kv.email': 'Email',
|
|
24
|
+
'profile.basic.kv.phone': 'Phone',
|
|
25
|
+
'profile.basic.kv.location': 'Location',
|
|
26
|
+
'profile.basic.kv.headline': 'Headline',
|
|
27
|
+
'profile.basic.summaryLabel': 'About summary',
|
|
28
|
+
'profile.basic.empty.title': 'Your basic info is empty',
|
|
29
|
+
'profile.basic.empty.body': 'Fill in your name, contact, and headline so they can be reused across every document.',
|
|
30
|
+
'profile.basic.empty.action': 'Add info',
|
|
31
|
+
'profile.basic.edit': 'Edit',
|
|
32
|
+
// basic info edit modal
|
|
33
|
+
'profile.basic.modal.title': 'Edit basic info',
|
|
34
|
+
'profile.basic.ph.name': 'Jane Doe',
|
|
35
|
+
'profile.basic.ph.email': 'you@example.com',
|
|
36
|
+
'profile.basic.ph.phone': '+1 555-000-0000',
|
|
37
|
+
'profile.basic.ph.location': 'San Francisco',
|
|
38
|
+
'profile.basic.ph.headline': 'e.g. Backend engineer, 5 years experience',
|
|
39
|
+
'profile.basic.ph.summary': 'About summary',
|
|
40
|
+
'profile.basic.ph.links': 'GitHub | https://github.com/...\nPortfolio | https://...',
|
|
41
|
+
'profile.basic.field.name': 'Name',
|
|
42
|
+
'profile.basic.field.email': 'Email',
|
|
43
|
+
'profile.basic.field.phone': 'Phone',
|
|
44
|
+
'profile.basic.field.location': 'Location',
|
|
45
|
+
'profile.basic.field.headline': 'Headline',
|
|
46
|
+
'profile.basic.field.headlineHint': 'Your role title or a key strength in one sentence',
|
|
47
|
+
'profile.basic.field.summary': 'About summary',
|
|
48
|
+
'profile.basic.field.links': 'Links',
|
|
49
|
+
'profile.basic.field.linksHint': 'One per line, in the format "Label | URL".',
|
|
50
|
+
'profile.basic.cancel': 'Cancel',
|
|
51
|
+
'profile.basic.save': 'Save basic info',
|
|
52
|
+
'profile.basic.saved': 'Basic info saved.',
|
|
53
|
+
|
|
54
|
+
// desired card
|
|
55
|
+
'profile.desired.title': 'Preferences',
|
|
56
|
+
'profile.desired.rolesLabel': 'Target roles',
|
|
57
|
+
'profile.desired.conditionsLabel': 'Preferred conditions',
|
|
58
|
+
'profile.desired.empty.title': 'Your preferences are empty',
|
|
59
|
+
'profile.desired.empty.body': 'Note your target roles and work conditions so posting matches become more accurate.',
|
|
60
|
+
'profile.desired.empty.action': 'Add preferences',
|
|
61
|
+
'profile.desired.edit': 'Edit',
|
|
62
|
+
'profile.desired.modal.title': 'Edit preferences',
|
|
63
|
+
'profile.desired.ph.roles': 'Backend engineer, Platform engineer',
|
|
64
|
+
'profile.desired.ph.conditions': 'e.g. $120k+ / San Francisco or remote / full-time',
|
|
65
|
+
'profile.desired.field.roles': 'Target roles',
|
|
66
|
+
'profile.desired.field.rolesHint': 'Separate multiple entries with commas (,).',
|
|
67
|
+
'profile.desired.field.conditions': 'Preferred conditions',
|
|
68
|
+
'profile.desired.field.conditionsHint': 'Salary, location, work type, and anything else.',
|
|
69
|
+
'profile.desired.cancel': 'Cancel',
|
|
70
|
+
'profile.desired.save': 'Save preferences',
|
|
71
|
+
'profile.desired.saved': 'Preferences saved.',
|
|
72
|
+
|
|
73
|
+
// writing card
|
|
74
|
+
'profile.writing.title': 'Cover letter settings',
|
|
75
|
+
'profile.writing.callout.title': 'This directly shapes AI writing quality',
|
|
76
|
+
'profile.writing.callout.body': 'Note your preferred tone and emphasis points to keep cover letters and interview answers consistent in voice.',
|
|
77
|
+
'profile.writing.toneLabel': 'Preferred tone',
|
|
78
|
+
'profile.writing.emphasisLabel': 'Emphasis points',
|
|
79
|
+
'profile.writing.emptyHint': "You haven't set a preferred tone or emphasis points yet.",
|
|
80
|
+
'profile.writing.edit': 'Edit',
|
|
81
|
+
'profile.writing.setup': 'Set up',
|
|
82
|
+
'profile.writing.modal.title': 'Cover letter settings',
|
|
83
|
+
'profile.writing.ph.tone': 'e.g. plain and specific',
|
|
84
|
+
'profile.writing.ph.emphasis': 'Problem solving\nProactive collaboration\nQuantified results',
|
|
85
|
+
'profile.writing.field.tone': 'Preferred tone',
|
|
86
|
+
'profile.writing.field.toneHint': 'e.g. plain and specific / confident / candid',
|
|
87
|
+
'profile.writing.field.emphasis': 'Emphasis points',
|
|
88
|
+
'profile.writing.field.emphasisHint': 'One per line. The AI prioritizes these points when writing.',
|
|
89
|
+
'profile.writing.cancel': 'Cancel',
|
|
90
|
+
'profile.writing.save': 'Save settings',
|
|
91
|
+
'profile.writing.saved': 'Cover letter settings saved.',
|
|
92
|
+
|
|
93
|
+
// experiences card
|
|
94
|
+
'profile.exp.title': 'Experience',
|
|
95
|
+
'profile.exp.add': 'Add experience',
|
|
96
|
+
'profile.exp.count': { one: '{{count}} entry', other: '{{count}} entries' },
|
|
97
|
+
'profile.exp.empty.title': 'No experience added yet',
|
|
98
|
+
'profile.exp.empty.body': 'Adding key experience improves fit analysis and cover letter quality.',
|
|
99
|
+
'profile.exp.editTitle': 'Edit',
|
|
100
|
+
'profile.exp.deleteTitle': 'Delete',
|
|
101
|
+
'profile.exp.delete.title': 'Delete experience',
|
|
102
|
+
'profile.exp.delete.message': 'Delete the "{{company}}" experience?',
|
|
103
|
+
'profile.exp.delete.confirm': 'Delete',
|
|
104
|
+
'profile.exp.deleted': 'Experience deleted.',
|
|
105
|
+
'profile.exp.modal.addTitle': 'Add experience',
|
|
106
|
+
'profile.exp.modal.editTitle': 'Edit experience',
|
|
107
|
+
'profile.exp.ph.company': 'Company name (required)',
|
|
108
|
+
'profile.exp.ph.role': 'Role / title',
|
|
109
|
+
'profile.exp.ph.empType': 'Full-time / Contract / Intern / Freelance',
|
|
110
|
+
'profile.exp.ph.month': 'YYYY-MM',
|
|
111
|
+
'profile.exp.ph.desc': 'Responsibilities / role',
|
|
112
|
+
'profile.exp.ph.achievements': 'Improved payment conversion by 12%\nTripled monthly deploy frequency',
|
|
113
|
+
'profile.exp.ph.tech': 'TypeScript, Node.js, PostgreSQL',
|
|
114
|
+
'profile.exp.field.company': 'Company',
|
|
115
|
+
'profile.exp.field.role': 'Role',
|
|
116
|
+
'profile.exp.field.empType': 'Employment type',
|
|
117
|
+
'profile.exp.field.start': 'Start (YYYY-MM)',
|
|
118
|
+
'profile.exp.field.end': 'End (YYYY-MM)',
|
|
119
|
+
'profile.exp.field.isCurrent': 'Currently employed here',
|
|
120
|
+
'profile.exp.field.desc': 'Description',
|
|
121
|
+
'profile.exp.field.achievements': 'Key achievements',
|
|
122
|
+
'profile.exp.field.achievementsHint': 'One per line. Including quantified metrics helps.',
|
|
123
|
+
'profile.exp.field.tech': 'Tech used',
|
|
124
|
+
'profile.exp.field.techHint': 'Separate with commas (,)',
|
|
125
|
+
'profile.exp.cancel': 'Cancel',
|
|
126
|
+
'profile.exp.saveNew': 'Add experience',
|
|
127
|
+
'profile.exp.saveEdit': 'Save experience',
|
|
128
|
+
'profile.exp.validation.company': 'Please enter a company name.',
|
|
129
|
+
'profile.exp.added': 'Experience added.',
|
|
130
|
+
'profile.exp.updated': 'Experience updated.',
|
|
131
|
+
|
|
132
|
+
// projects card
|
|
133
|
+
'profile.proj.title': 'Projects',
|
|
134
|
+
'profile.proj.add': 'Add project',
|
|
135
|
+
'profile.proj.count': { one: '{{count}} entry', other: '{{count}} entries' },
|
|
136
|
+
'profile.proj.empty.title': 'No projects added yet',
|
|
137
|
+
'profile.proj.empty.body': 'Organizing key projects gives you concrete evidence for cover letters and interviews.',
|
|
138
|
+
'profile.proj.openLink': 'Open link',
|
|
139
|
+
'profile.proj.editTitle': 'Edit',
|
|
140
|
+
'profile.proj.deleteTitle': 'Delete',
|
|
141
|
+
'profile.proj.delete.title': 'Delete project',
|
|
142
|
+
'profile.proj.delete.message': 'Delete the "{{name}}" project?',
|
|
143
|
+
'profile.proj.delete.confirm': 'Delete',
|
|
144
|
+
'profile.proj.deleted': 'Project deleted.',
|
|
145
|
+
'profile.proj.modal.addTitle': 'Add project',
|
|
146
|
+
'profile.proj.modal.editTitle': 'Edit project',
|
|
147
|
+
'profile.proj.ph.name': 'Project name (required)',
|
|
148
|
+
'profile.proj.ph.role': 'Your role',
|
|
149
|
+
'profile.proj.ph.month': 'YYYY-MM',
|
|
150
|
+
'profile.proj.ph.url': 'https://...',
|
|
151
|
+
'profile.proj.ph.desc': 'Project overview / goal',
|
|
152
|
+
'profile.proj.ph.highlights': 'Key results, one per line',
|
|
153
|
+
'profile.proj.ph.tech': 'React, AWS, GraphQL',
|
|
154
|
+
'profile.proj.field.name': 'Project name',
|
|
155
|
+
'profile.proj.field.role': 'Role',
|
|
156
|
+
'profile.proj.field.url': 'Link',
|
|
157
|
+
'profile.proj.field.start': 'Start (YYYY-MM)',
|
|
158
|
+
'profile.proj.field.end': 'End (YYYY-MM)',
|
|
159
|
+
'profile.proj.field.desc': 'Description',
|
|
160
|
+
'profile.proj.field.highlights': 'Highlights',
|
|
161
|
+
'profile.proj.field.highlightsHint': 'One per line',
|
|
162
|
+
'profile.proj.field.tech': 'Tech used',
|
|
163
|
+
'profile.proj.field.techHint': 'Separate with commas (,)',
|
|
164
|
+
'profile.proj.cancel': 'Cancel',
|
|
165
|
+
'profile.proj.saveNew': 'Add project',
|
|
166
|
+
'profile.proj.saveEdit': 'Save project',
|
|
167
|
+
'profile.proj.validation.name': 'Please enter a project name.',
|
|
168
|
+
'profile.proj.added': 'Project added.',
|
|
169
|
+
'profile.proj.updated': 'Project updated.',
|
|
170
|
+
|
|
171
|
+
// skills card
|
|
172
|
+
'profile.skill.title': 'Skills',
|
|
173
|
+
'profile.skill.add': 'Add skill',
|
|
174
|
+
'profile.skill.count': { one: '{{count}} skill', other: '{{count}} skills' },
|
|
175
|
+
'profile.skill.empty.title': 'No skills added yet',
|
|
176
|
+
'profile.skill.empty.body': 'Organizing your skills makes posting keyword matching more accurate.',
|
|
177
|
+
'profile.skill.uncategorized': 'Other',
|
|
178
|
+
'profile.skill.years': { one: '{{count}} year', other: '{{count}} years' },
|
|
179
|
+
'profile.skill.editTitle': 'Edit',
|
|
180
|
+
'profile.skill.deleteTitle': 'Delete',
|
|
181
|
+
'profile.skill.delete.title': 'Delete skill',
|
|
182
|
+
'profile.skill.delete.message': 'Delete "{{name}}"?',
|
|
183
|
+
'profile.skill.delete.confirm': 'Delete',
|
|
184
|
+
'profile.skill.deleted': 'Skill deleted.',
|
|
185
|
+
'profile.skill.modal.addTitle': 'Add skill',
|
|
186
|
+
'profile.skill.modal.editTitle': 'Edit skill',
|
|
187
|
+
'profile.skill.ph.name': 'Skill name (required)',
|
|
188
|
+
'profile.skill.ph.category': 'Language / Framework / Tool / Soft skill',
|
|
189
|
+
'profile.skill.ph.level': 'High / Medium / Low, or describe freely',
|
|
190
|
+
'profile.skill.ph.years': 'Years',
|
|
191
|
+
'profile.skill.field.name': 'Skill name',
|
|
192
|
+
'profile.skill.field.category': 'Category',
|
|
193
|
+
'profile.skill.field.level': 'Proficiency',
|
|
194
|
+
'profile.skill.field.years': 'Years',
|
|
195
|
+
'profile.skill.cancel': 'Cancel',
|
|
196
|
+
'profile.skill.saveNew': 'Add skill',
|
|
197
|
+
'profile.skill.saveEdit': 'Save skill',
|
|
198
|
+
'profile.skill.validation.name': 'Please enter a skill name.',
|
|
199
|
+
'profile.skill.added': 'Skill added.',
|
|
200
|
+
'profile.skill.updated': 'Skill updated.',
|
|
201
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Settings page.
|
|
2
|
+
export default {
|
|
3
|
+
// shared
|
|
4
|
+
'settings.copy': 'Copy',
|
|
5
|
+
'settings.confirm': 'OK',
|
|
6
|
+
'settings.cancel': 'Cancel',
|
|
7
|
+
'settings.copyPath': 'Copy path',
|
|
8
|
+
|
|
9
|
+
// data location
|
|
10
|
+
'settings.dataLocation.title': 'Where your data lives',
|
|
11
|
+
'settings.dataLocation.dataDir': 'Data folder',
|
|
12
|
+
'settings.dataLocation.database': 'Database',
|
|
13
|
+
'settings.dataLocation.appVersion': 'App version',
|
|
14
|
+
'settings.dataLocation.nodeVersion': 'Node version',
|
|
15
|
+
'settings.dataLocation.privacyTitle': 'Stored only on your computer',
|
|
16
|
+
'settings.dataLocation.privacyBody': 'All your data stays on this computer and is never sent anywhere. The AI only sees what you type in or what it looks up through MCP.',
|
|
17
|
+
|
|
18
|
+
// connection
|
|
19
|
+
'settings.connection.title': 'Connection',
|
|
20
|
+
'settings.connection.shortcutDemoToast': "Here's a preview of how the shortcut works.",
|
|
21
|
+
'settings.connection.shortcutToast': 'Created a dashboard shortcut.',
|
|
22
|
+
'settings.connection.shortcutDemoTitle': 'Shortcut preview',
|
|
23
|
+
'settings.connection.shortcutTitle': 'Shortcut created',
|
|
24
|
+
'settings.connection.shortcutDemoCalloutTitle': "The demo doesn't create files",
|
|
25
|
+
'settings.connection.shortcutCalloutTitle': 'Folder created',
|
|
26
|
+
'settings.connection.shortcutDemoCalloutBody': 'The real app creates a dashboard shortcut folder and launcher; here we just show example paths.',
|
|
27
|
+
'settings.connection.shortcutCalloutBody': "If the dashboard is running it just opens your browser; if it's stopped, it starts the server first and then opens the browser.",
|
|
28
|
+
'settings.connection.shortcutFolder': 'Folder',
|
|
29
|
+
'settings.connection.shortcutLauncher': 'Shortcut',
|
|
30
|
+
'settings.connection.running': 'Running',
|
|
31
|
+
'settings.connection.dashboard': 'Dashboard',
|
|
32
|
+
'settings.connection.createShortcut': 'Create shortcut',
|
|
33
|
+
'settings.connection.mcpServer': 'MCP server',
|
|
34
|
+
'settings.connection.mcpBody': 'Your AI client (Claude, ChatGPT, Cursor) runs the MCP server itself, and it shares the same database as this dashboard.',
|
|
35
|
+
'settings.connection.openInstall': 'Open setup guide',
|
|
36
|
+
|
|
37
|
+
// theme
|
|
38
|
+
'settings.theme.title': 'Theme',
|
|
39
|
+
'settings.theme.sub': 'Follow your system setting or pick one yourself',
|
|
40
|
+
'settings.theme.light': 'Light',
|
|
41
|
+
'settings.theme.dark': 'Dark',
|
|
42
|
+
'settings.theme.system': 'System',
|
|
43
|
+
|
|
44
|
+
// cover-letter number check mode
|
|
45
|
+
'settings.verify.title': 'Cover letter number check',
|
|
46
|
+
'settings.verify.sub': 'Before saving, automatically checks that any numbers the AI wrote are backed by your real data',
|
|
47
|
+
'settings.verify.basic': 'Standard',
|
|
48
|
+
'settings.verify.strict': 'Strict',
|
|
49
|
+
'settings.verify.basicDesc': 'Blocks only numbers with no basis at all in your saved experience, resume, or projects',
|
|
50
|
+
'settings.verify.strictDesc': 'Also blocks numbers that appear only in structured experience/project entries but not in your resume text',
|
|
51
|
+
'settings.verify.strictOnToast': 'Strict mode is on.',
|
|
52
|
+
'settings.verify.strictOffToast': 'Strict mode is off.',
|
|
53
|
+
'settings.verify.note': 'In strict mode, numbers that are not in your uploaded resume may be blocked. If that happens, upload your resume or turn the mode off. You can also tell the AI "check this strictly" to turn it on.',
|
|
54
|
+
|
|
55
|
+
// my data
|
|
56
|
+
'settings.myData.title': 'My data',
|
|
57
|
+
'settings.myData.sub': 'Items stored on this computer',
|
|
58
|
+
|
|
59
|
+
// count labels (COUNT_LABELS / BACKUP_COUNT_LABELS)
|
|
60
|
+
'settings.count.profile': 'Profile',
|
|
61
|
+
'settings.count.experiences': 'Experience',
|
|
62
|
+
'settings.count.projects': 'Projects',
|
|
63
|
+
'settings.count.skills': 'Skills',
|
|
64
|
+
'settings.count.documents': 'Documents',
|
|
65
|
+
'settings.count.cover_letters': 'Cover letters',
|
|
66
|
+
'settings.count.jobs': 'Postings',
|
|
67
|
+
'settings.count.applications': 'Applications',
|
|
68
|
+
'settings.count.interview_preps': 'Interview prep',
|
|
69
|
+
'settings.count.cover_letter_versions': 'Cover letter versions',
|
|
70
|
+
'settings.count.fit_analyses': 'Fit analyses',
|
|
71
|
+
'settings.count.activities': 'Activity',
|
|
72
|
+
|
|
73
|
+
// export / import
|
|
74
|
+
'settings.backup.title': 'Export / Import',
|
|
75
|
+
'settings.backup.export': 'Export (JSON)',
|
|
76
|
+
'settings.backup.import': 'Import (JSON)',
|
|
77
|
+
'settings.backup.create': 'Back up current state',
|
|
78
|
+
'settings.backup.createToast': 'Created a backup.',
|
|
79
|
+
'settings.backup.colFile': 'File',
|
|
80
|
+
'settings.backup.colCreated': 'Created',
|
|
81
|
+
'settings.backup.colSize': 'Size',
|
|
82
|
+
'settings.backup.size': '{{kb}} KB',
|
|
83
|
+
'settings.backup.empty': 'No local backups yet. Use "Back up current state" to save your data now.',
|
|
84
|
+
'settings.backup.readError': "Couldn't read the backup file.",
|
|
85
|
+
'settings.backup.parseError': 'Only JSON backup files can be restored.',
|
|
86
|
+
'settings.backup.unknownDate': 'Unknown',
|
|
87
|
+
|
|
88
|
+
// import preview table
|
|
89
|
+
'settings.preview.empty': 'Nothing to restore.',
|
|
90
|
+
'settings.preview.colData': 'Data',
|
|
91
|
+
'settings.preview.colCount': 'Items',
|
|
92
|
+
|
|
93
|
+
// import modal
|
|
94
|
+
'settings.import.gateWord': 'IMPORT',
|
|
95
|
+
'settings.import.title': 'Import data',
|
|
96
|
+
'settings.import.calloutTitle': 'Your current data is backed up first',
|
|
97
|
+
'settings.import.calloutBody': 'Importing replaces all CareerMate data on this computer with the contents of the JSON you selected.',
|
|
98
|
+
'settings.import.file': 'File',
|
|
99
|
+
'settings.import.exportedAt': 'Backed up at',
|
|
100
|
+
'settings.import.schema': 'Schema',
|
|
101
|
+
'settings.import.schemaValue': '{{version}} / current {{current}}',
|
|
102
|
+
'settings.import.totalRows': 'Total items',
|
|
103
|
+
'settings.import.warningsTitle': 'Please review',
|
|
104
|
+
'settings.import.instruction': 'To continue, type {{word}} in the field below.',
|
|
105
|
+
'settings.import.confirm': 'Import',
|
|
106
|
+
'settings.import.doneToast': 'Data imported.',
|
|
107
|
+
|
|
108
|
+
// danger zone
|
|
109
|
+
'settings.reset.gateWord': 'RESET',
|
|
110
|
+
'settings.reset.title': 'Reset all data',
|
|
111
|
+
'settings.reset.calloutTitle': "This can't be undone",
|
|
112
|
+
'settings.reset.calloutBody': 'All data, including your profile, postings, applications, documents, and interview prep, will be permanently deleted. For safety, a backup is created automatically right before the reset.',
|
|
113
|
+
'settings.reset.instruction': 'To continue, type {{word}} in the field below.',
|
|
114
|
+
'settings.reset.confirm': 'Reset all data',
|
|
115
|
+
'settings.reset.doneToast': 'All data has been reset.',
|
|
116
|
+
'settings.danger.title': 'Danger zone',
|
|
117
|
+
'settings.danger.sub': "This action can't be undone",
|
|
118
|
+
'settings.danger.resetTitle': 'Reset all data',
|
|
119
|
+
'settings.danger.resetBody': 'Deletes all CareerMate data stored on this computer. A backup is created automatically before the reset.',
|
|
120
|
+
|
|
121
|
+
// help / report a problem
|
|
122
|
+
'settings.support.title': 'Help & report a problem',
|
|
123
|
+
'settings.support.sub': 'Report bugs on GitHub Issues, ask how-to questions in Discussions, or email us for anything else.',
|
|
124
|
+
'settings.support.report': 'Report a problem',
|
|
125
|
+
'settings.support.ask': 'Ask a question',
|
|
126
|
+
'settings.support.email': 'Email us',
|
|
127
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// enum labels (client-side). Keys mirror the CODE in packages/shared/src/enums.ts 1:1.
|
|
2
|
+
export default {
|
|
3
|
+
// application status
|
|
4
|
+
'status.draft': 'Draft',
|
|
5
|
+
'status.planned': 'Planned',
|
|
6
|
+
'status.applied': 'Applied',
|
|
7
|
+
'status.document_passed': 'Screening passed',
|
|
8
|
+
'status.interview': 'Interviewing',
|
|
9
|
+
'status.final_passed': 'Offer',
|
|
10
|
+
'status.rejected': 'Rejected',
|
|
11
|
+
'status.on_hold': 'On hold',
|
|
12
|
+
// document kind
|
|
13
|
+
'kind.resume': 'Resume',
|
|
14
|
+
'kind.career_description': 'Career description',
|
|
15
|
+
'kind.portfolio': 'Portfolio',
|
|
16
|
+
'kind.other': 'Other',
|
|
17
|
+
// content source
|
|
18
|
+
'source.manual': 'Manual entry',
|
|
19
|
+
'source.upload': 'File upload',
|
|
20
|
+
'source.ai': 'AI-generated',
|
|
21
|
+
'source.edit': 'Manual edit',
|
|
22
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// English catalog — area modules merged into one flat map.
|
|
2
|
+
// Adding a locale/area = one file + one import. Count nouns use { one, other } objects.
|
|
3
|
+
import common from './en/common.js';
|
|
4
|
+
import nav from './en/nav.js';
|
|
5
|
+
import status from './en/status.js';
|
|
6
|
+
import settings from './en/settings.js';
|
|
7
|
+
import home from './en/home.js';
|
|
8
|
+
import jobs from './en/jobs.js';
|
|
9
|
+
import documents from './en/documents.js';
|
|
10
|
+
import profile from './en/profile.js';
|
|
11
|
+
import interview from './en/interview.js';
|
|
12
|
+
import applications from './en/applications.js';
|
|
13
|
+
|
|
14
|
+
export default {
|
|
15
|
+
...common, ...nav, ...status, ...settings,
|
|
16
|
+
...home, ...jobs, ...documents, ...profile, ...interview, ...applications,
|
|
17
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// 지원 현황 페이지.
|
|
2
|
+
export default {
|
|
3
|
+
// deadline D-day chip
|
|
4
|
+
'applications.dday.future': '마감 D-{{n}}',
|
|
5
|
+
'applications.dday.today': '마감 D-day',
|
|
6
|
+
'applications.dday.past': '마감 지남',
|
|
7
|
+
|
|
8
|
+
// empty state
|
|
9
|
+
'applications.empty.title': '아직 지원 내역이 없어요',
|
|
10
|
+
'applications.empty.body': '공고를 추가하면 지원이 상태별로 정리됩니다.',
|
|
11
|
+
'applications.empty.action': '공고 보러 가기',
|
|
12
|
+
|
|
13
|
+
// status group
|
|
14
|
+
'applications.group.count': '{{count}}건',
|
|
15
|
+
|
|
16
|
+
// app row
|
|
17
|
+
'applications.row.score': '{{score}}점',
|
|
18
|
+
|
|
19
|
+
// status select + toasts
|
|
20
|
+
'applications.statusSelect.title': '상태 변경',
|
|
21
|
+
'applications.toast.statusChanged': '지원 상태를 변경했어요.',
|
|
22
|
+
'applications.hint.title': '면접 준비',
|
|
23
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// 공통 UI 문자열 + 토스트/에러(lib.js에서 사용).
|
|
2
|
+
export default {
|
|
3
|
+
'common.cancel': '취소',
|
|
4
|
+
'common.confirm': '확인',
|
|
5
|
+
'common.close': '닫기',
|
|
6
|
+
'common.save': '저장',
|
|
7
|
+
'common.retry': '다시 시도',
|
|
8
|
+
'common.edit': '수정',
|
|
9
|
+
'common.delete': '삭제',
|
|
10
|
+
'common.open': '열기',
|
|
11
|
+
'common.justNow': '방금 전',
|
|
12
|
+
|
|
13
|
+
'toast.copied': '클립보드에 복사했습니다.',
|
|
14
|
+
'toast.copyFailed': '복사에 실패했습니다. 직접 선택해 복사해 주세요.',
|
|
15
|
+
'toast.errorTitle': '오류',
|
|
16
|
+
|
|
17
|
+
'err.connect': '서버에 연결하지 못했어요. 대시보드가 실행 중인지 확인한 뒤 다시 시도해 주세요.',
|
|
18
|
+
'err.404': '요청한 항목을 찾을 수 없어요. 새로고침 후 다시 시도해 주세요.',
|
|
19
|
+
'err.403': '권한 확인이 필요해요. 대시보드를 새로고침해 주세요.',
|
|
20
|
+
'err.500': '일시적인 오류가 발생했어요. 잠시 후 다시 시도해 주세요.',
|
|
21
|
+
'err.generic': '요청을 처리하지 못했어요. 입력을 확인하고 다시 시도해 주세요.',
|
|
22
|
+
};
|