From 33e7bbb3346517121562f6fe54b89c94426ff045 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Wed, 31 Dec 2025 13:20:04 -0300 Subject: [PATCH] feat(i18n): internationalize sidebar and dashboards --- frontend/src/app/dashboard/translations.ts | 110 ---------- frontend/src/app/dashboard/users/page.tsx | 2 +- .../dashboard-contents/admin-dashboard.tsx | 54 +++-- .../candidate-dashboard.tsx | 40 ++-- .../dashboard-contents/company-dashboard.tsx | 44 ++-- frontend/src/components/sidebar.tsx | 189 +++++++++--------- frontend/src/i18n/en.json | 112 +++++++++++ frontend/src/i18n/es.json | 113 +++++++++++ frontend/src/i18n/pt-BR.json | 112 +++++++++++ 9 files changed, 508 insertions(+), 268 deletions(-) delete mode 100644 frontend/src/app/dashboard/translations.ts diff --git a/frontend/src/app/dashboard/translations.ts b/frontend/src/app/dashboard/translations.ts deleted file mode 100644 index e019d0d..0000000 --- a/frontend/src/app/dashboard/translations.ts +++ /dev/null @@ -1,110 +0,0 @@ -export const dashboardTranslations = { - pt: { - title: "Dashboard", - subtitle: "Visão geral do portal de vagas", - stats: { - activeJobs: "Vagas Ativas", - activeJobsDesc: "Total de vagas publicadas", - candidates: "Candidatos", - candidatesDesc: "Usuários registrados", - applications: "Candidaturas", - applicationsDesc: "Em andamento", - hiringRate: "Taxa de Contratação", - hiringRateDesc: "Candidaturas por vaga" - }, - jobs: { - title: "Gerenciamento de Vagas", - add: "Nova Vaga", - table: { - title: "Título", - company: "Empresa", - status: "Status", - created: "Criado em", - actions: "Ações" - }, - empty: "Nenhuma vaga encontrada." - }, - candidates: { - title: "Gerenciamento de Candidatos", - table: { - name: "Nome", - email: "Email", - location: "Localização", - actions: "Ações" - }, - empty: "Nenhum candidato encontrado." - } - }, - en: { - title: "Dashboard", - subtitle: "Overview of the jobs portal", - stats: { - activeJobs: "Active Jobs", - activeJobsDesc: "Total posted jobs", - candidates: "Total Candidates", - candidatesDesc: "Registered users", - applications: "Active Applications", - applicationsDesc: "Current pipeline", - hiringRate: "Hiring Rate", - hiringRateDesc: "Applications per job" - }, - jobs: { - title: "Job Management", - add: "Add Job", - table: { - title: "Title", - company: "Company", - status: "Status", - created: "Created At", - actions: "Actions" - }, - empty: "No jobs found." - }, - candidates: { - title: "Candidate Management", - table: { - name: "Name", - email: "Email", - location: "Location", - actions: "Actions" - }, - empty: "No candidates found." - } - }, - es: { - title: "Panel de Control", - subtitle: "Visión general del portal de empleos", - stats: { - activeJobs: "Empleos Activos", - activeJobsDesc: "Total publicados", - candidates: "Candidatos Total", - candidatesDesc: "Usuarios registrados", - applications: "Aplicaciones Activas", - applicationsDesc: "En proceso", - hiringRate: "Tasa de Contratación", - hiringRateDesc: "Aplicaciones por empleo" - }, - jobs: { - title: "Gestión de Empleos", - add: "Nuevo Empleo", - table: { - title: "Título", - company: "Empresa", - status: "Estado", - created: "Creado en", - actions: "Acciones" - }, - empty: "No se encontraron empleos." - }, - candidates: { - title: "Gestión de Candidatos", - table: { - name: "Nombre", - email: "Correo", - location: "Ubicación", - actions: "Acciones" - }, - empty: "No se encontraron candidatos." - } - } -} diff --git a/frontend/src/app/dashboard/users/page.tsx b/frontend/src/app/dashboard/users/page.tsx index 42ff8ef..c39e47b 100644 --- a/frontend/src/app/dashboard/users/page.tsx +++ b/frontend/src/app/dashboard/users/page.tsx @@ -249,7 +249,7 @@ export default function AdminUsersPage() { {/* Header */}
-

{t('admin.users.title')} (v2)

+

{t('admin.users.title')}

{t('admin.users.subtitle')}

diff --git a/frontend/src/components/dashboard-contents/admin-dashboard.tsx b/frontend/src/components/dashboard-contents/admin-dashboard.tsx index 8068da0..308a8fa 100644 --- a/frontend/src/components/dashboard-contents/admin-dashboard.tsx +++ b/frontend/src/components/dashboard-contents/admin-dashboard.tsx @@ -23,14 +23,12 @@ import { Briefcase, Users, TrendingUp, FileText, Plus, MoreHorizontal, Loader2 } import { motion } from "framer-motion" import { adminJobsApi, adminCandidatesApi, type AdminJob, type AdminCandidate, type AdminCandidateStats } from "@/lib/api" import { toast } from "sonner" -import { useLanguageStore } from "@/lib/store/language-store" -import { dashboardTranslations } from "@/app/dashboard/translations" +import { useTranslation } from "@/lib/i18n" export function AdminDashboardContent() { const [isDialogOpen, setIsDialogOpen] = useState(false) const [isLoading, setIsLoading] = useState(true) - const { language } = useLanguageStore() - const t = dashboardTranslations[language] + const { t } = useTranslation() const [stats, setStats] = useState({ activeJobs: 0, @@ -104,8 +102,8 @@ export function AdminDashboardContent() { animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5 }} > -

{t.title}

-

{t.subtitle}

+

{t('admin.dashboard.title')}

+

{t('admin.dashboard.subtitle')}

{/* Stats */} @@ -116,28 +114,28 @@ export function AdminDashboardContent() { className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" > @@ -149,12 +147,12 @@ export function AdminDashboardContent() { > - {t.jobs.title} + {t('admin.dashboard.jobs.title')} @@ -199,17 +197,17 @@ export function AdminDashboardContent() { - {t.jobs.table.title} - {t.jobs.table.company} - {t.jobs.table.status} - {t.jobs.table.created} - {t.jobs.table.actions} + {t('admin.dashboard.jobs.table.title')} + {t('admin.dashboard.jobs.table.company')} + {t('admin.dashboard.jobs.table.status')} + {t('admin.dashboard.jobs.table.created')} + {t('admin.dashboard.jobs.table.actions')} {recentJobs.length === 0 ? ( - {t.jobs.empty} + {t('admin.dashboard.jobs.empty')} ) : ( recentJobs.map((job) => ( @@ -242,22 +240,22 @@ export function AdminDashboardContent() { > - {t.candidates.title} + {t('admin.dashboard.candidates.title')}
- {t.candidates.table.name} - {t.candidates.table.email} - {t.candidates.table.location} - {t.candidates.table.actions} + {t('admin.dashboard.candidates.table.name')} + {t('admin.dashboard.candidates.table.email')} + {t('admin.dashboard.candidates.table.location')} + {t('admin.dashboard.candidates.table.actions')} {recentCandidates.length === 0 ? ( - No candidates found. + {t('admin.dashboard.candidates.empty')} ) : ( recentCandidates.map((candidate) => ( diff --git a/frontend/src/components/dashboard-contents/candidate-dashboard.tsx b/frontend/src/components/dashboard-contents/candidate-dashboard.tsx index 8af591b..c8adc5e 100644 --- a/frontend/src/components/dashboard-contents/candidate-dashboard.tsx +++ b/frontend/src/components/dashboard-contents/candidate-dashboard.tsx @@ -25,8 +25,10 @@ import { } from "lucide-react" import { motion } from "framer-motion" import { getCurrentUser } from "@/lib/auth" +import { useTranslation } from "@/lib/i18n" export function CandidateDashboardContent() { + const { t } = useTranslation() const user = getCurrentUser() const recommendedJobs = mockJobs.slice(0, 3) const unreadNotifications = mockNotifications.filter((n) => !n.read) @@ -37,35 +39,35 @@ export function CandidateDashboardContent() { return ( - Under review + {t('candidate.dashboard.status.under_review')} ) case "reviewing": return ( - Under review + {t('candidate.dashboard.status.under_review')} ) case "interview": return ( - Interview + {t('candidate.dashboard.status.interview')} ) case "accepted": return ( - Accepted + {t('candidate.dashboard.status.accepted')} ) case "rejected": return ( - Rejected + {t('candidate.dashboard.status.rejected')} ) default: @@ -85,12 +87,12 @@ export function CandidateDashboardContent() {
-

Hi, {user?.name || "Candidate"}!

+

{t('candidate.dashboard.welcome', { name: user?.name || "Candidate" })}

{user?.area || "Engineering"}

@@ -105,26 +107,26 @@ export function CandidateDashboardContent() { className="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8" > a.status === "reviewing" || a.status === "interview" ).length } icon={Clock} - description="Awaiting a response" + description={t('candidate.dashboard.stats.in_progress_desc')} /> @@ -139,7 +141,7 @@ export function CandidateDashboardContent() { > - Recommended jobs + {t('candidate.dashboard.recommended.title')} {recommendedJobs.map((job) => ( @@ -157,16 +159,16 @@ export function CandidateDashboardContent() { > - My applications + {t('candidate.dashboard.applications.title')}
- Role - Company - Status - Date + {t('candidate.dashboard.applications.table.role')} + {t('candidate.dashboard.applications.table.company')} + {t('candidate.dashboard.applications.table.status')} + {t('candidate.dashboard.applications.table.date')} diff --git a/frontend/src/components/dashboard-contents/company-dashboard.tsx b/frontend/src/components/dashboard-contents/company-dashboard.tsx index 85e8a52..8c2d0b6 100644 --- a/frontend/src/components/dashboard-contents/company-dashboard.tsx +++ b/frontend/src/components/dashboard-contents/company-dashboard.tsx @@ -25,12 +25,14 @@ import { jobsApi, applicationsApi, ApiJob } from "@/lib/api" import { User } from "@/lib/auth" import { formatDistanceToNow } from "date-fns" import { ptBR } from "date-fns/locale" +import { useTranslation } from "@/lib/i18n" interface CompanyDashboardContentProps { user: User } export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) { + const { t } = useTranslation() const [stats, setStats] = useState({ activeJobs: 0, totalApplications: 0, @@ -102,16 +104,16 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps)

- Dashboard + {t('company.dashboard.title')}

- Olá, {user.name}! 👋 + {t('company.dashboard.welcome', { name: user.name })} 👋

@@ -121,7 +123,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) - Vagas Ativas + {t('company.dashboard.stats.active_jobs')} @@ -130,7 +132,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) {stats.activeJobs}

- Publicadas + {t('company.dashboard.stats.posted')}

@@ -138,7 +140,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) - Candidaturas + {t('company.dashboard.stats.applications')} @@ -147,7 +149,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) {stats.totalApplications}

- +{stats.thisMonth} este mês + {t('company.dashboard.stats.this_month', { count: stats.thisMonth })}

@@ -155,7 +157,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) - Visualizações + {t('company.dashboard.stats.views')} @@ -164,7 +166,7 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) -

- Em breve + {t('company.dashboard.stats.soon')}

@@ -172,14 +174,14 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps) - Conversão + {t('company.dashboard.stats.conversion')}
-

- Em breve + {t('company.dashboard.stats.soon')}

@@ -192,21 +194,21 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps)
- Vagas Recentes + {t('company.dashboard.recent_jobs.title')} - Suas últimas vagas publicadas + {t('company.dashboard.recent_jobs.subtitle')}
{recentJobs.length === 0 ? ( -

Nenhuma vaga encontrada.

+

{t('company.dashboard.recent_jobs.empty')}

) : recentJobs.map((job) => (
{/* Mocking app count if not available */} - {job.applicationCount || 0} applications + {t('company.dashboard.recent_jobs.applications_count', { count: job.applicationCount || 0 })} @@ -267,19 +269,19 @@ export function CompanyDashboardContent({ user }: CompanyDashboardContentProps)
- Candidaturas - Candidatos recentes + {t('company.dashboard.recent_applications.title')} + {t('company.dashboard.recent_applications.subtitle')}
{recentApplications.length === 0 ? ( -

Nenhuma candidatura recente.

+

{t('company.dashboard.recent_applications.empty')}

) : recentApplications.map((application) => (

- {application.jobTitle || "Vaga desconhecida"} + {application.jobTitle || t('company.dashboard.recent_applications.unknown_job')}

{formatDistanceToNow(new Date(application.created_at), { addSuffix: true, locale: ptBR })} diff --git a/frontend/src/components/sidebar.tsx b/frontend/src/components/sidebar.tsx index 2612e09..96f8b28 100644 --- a/frontend/src/components/sidebar.tsx +++ b/frontend/src/components/sidebar.tsx @@ -6,99 +6,110 @@ import { usePathname } from "next/navigation" import { cn } from "@/lib/utils" import { LayoutDashboard, Briefcase, Users, MessageSquare, Building2, FileText, HelpCircle, Ticket } from "lucide-react" import { getCurrentUser, isAdminUser } from "@/lib/auth" +import { useTranslation } from "@/lib/i18n" -const adminItems = [ - { - title: "Dashboard", - href: "/dashboard", - icon: LayoutDashboard, - }, - { - title: "Jobs", - href: "/dashboard/jobs", - icon: Briefcase, - }, - { - title: "Candidates", - href: "/dashboard/candidates", - icon: Users, - }, - { - title: "Users", - href: "/dashboard/users", - icon: Users, - }, - { - title: "Companies", - href: "/dashboard/companies", - icon: Building2, - }, - { - title: "Backoffice", - href: "/dashboard/backoffice", - icon: FileText, - }, - { - title: "Messages", - href: "/dashboard/messages", - icon: MessageSquare, - }, - { - title: "Tickets", - href: "/dashboard/tickets", - icon: Ticket, - }, -] - -const companyItems = [ - { - title: "Dashboard", - href: "/dashboard", - icon: LayoutDashboard, - }, - { - title: "My jobs", - href: "/dashboard/my-jobs", - icon: Briefcase, - }, - { - title: "Applications", - href: "/dashboard/applications", - icon: Users, - }, -] - -const candidateItems = [ - { - title: "Dashboard", - href: "/dashboard", - icon: LayoutDashboard, - }, - { - title: "Jobs", - href: "/jobs", // Public search - icon: Briefcase, - }, - { - title: "My applications", - href: "/dashboard/my-applications", - icon: FileText, - }, - { - title: "Support", - href: "/dashboard/support/tickets", - icon: HelpCircle, - }, -] - -export function Sidebar() { +const Sidebar = () => { + const { t } = useTranslation() const pathname = usePathname() const user = getCurrentUser() const isSuperadmin = user?.role === "superadmin" + const adminItems = [ + { + title: t('sidebar.dashboard'), + href: "/dashboard", + icon: LayoutDashboard, + }, + { + title: t('sidebar.jobs'), + href: "/dashboard/jobs", + icon: Briefcase, + }, + { + title: t('sidebar.candidates'), + href: "/dashboard/candidates", + icon: Users, + }, + { + title: t('sidebar.users'), + href: "/dashboard/users", + icon: Users, + }, + { + title: t('sidebar.companies'), + href: "/dashboard/companies", + icon: Building2, + }, + { + title: t('sidebar.backoffice'), + href: "/dashboard/backoffice", + icon: FileText, + }, + { + title: t('sidebar.messages'), + href: "/dashboard/messages", + icon: MessageSquare, + }, + { + title: t('sidebar.tickets'), + href: "/dashboard/tickets", + icon: Ticket, + }, + ] + + const companyItems = [ + { + title: t('sidebar.dashboard'), + href: "/dashboard", + icon: LayoutDashboard, + }, + { + title: t('sidebar.my_jobs'), + href: "/dashboard/my-jobs", + icon: Briefcase, + }, + { + title: t('sidebar.applications'), + href: "/dashboard/applications", + icon: Users, + }, + { + title: t('sidebar.messages'), + href: "/dashboard/messages", + icon: MessageSquare, + }, + { + title: t('sidebar.support'), + href: "/dashboard/support", + icon: HelpCircle, + }, + ] + + const candidateItems = [ + { + title: t('sidebar.dashboard'), + href: "/dashboard", + icon: LayoutDashboard, + }, + { + title: t('sidebar.jobs'), + href: "/jobs", + icon: Briefcase, + }, + { + title: t('sidebar.my_applications'), + href: "/dashboard/my-applications", + icon: FileText, + }, + { + title: t('sidebar.support'), + href: "/dashboard/support/tickets", + icon: HelpCircle, + }, + ] + let items = candidateItems if (isAdminUser(user)) { - // For Admin (not Superadmin), filter out Backoffice items = isSuperadmin ? adminItems : adminItems.filter(item => item.href !== "/dashboard/backoffice" && item.href !== "/dashboard/companies") @@ -108,7 +119,6 @@ export function Sidebar() { return (

) } + +export { Sidebar } + diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index a540b72..0349e0f 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -1,4 +1,18 @@ { + "sidebar": { + "dashboard": "Dashboard", + "jobs": "Jobs", + "candidates": "Candidates", + "users": "Users", + "companies": "Companies", + "backoffice": "Backoffice", + "messages": "Messages", + "tickets": "Tickets", + "my_jobs": "My Jobs", + "applications": "Applications", + "my_applications": "My Applications", + "support": "Support" + }, "nav": { "jobs": "Jobs", "about": "About", @@ -662,6 +676,42 @@ } }, "admin": { + "dashboard": { + "title": "Dashboard", + "subtitle": "Overview of the jobs portal", + "stats": { + "activeJobs": "Active Jobs", + "activeJobsDesc": "Total posted jobs", + "candidates": "Total Candidates", + "candidatesDesc": "Registered users", + "applications": "Active Applications", + "applicationsDesc": "Current pipeline", + "hiringRate": "Hiring Rate", + "hiringRateDesc": "Applications per job" + }, + "jobs": { + "title": "Job Management", + "add": "Add Job", + "table": { + "title": "Title", + "company": "Company", + "status": "Status", + "created": "Created At", + "actions": "Actions" + }, + "empty": "No jobs found." + }, + "candidates": { + "title": "Candidate Management", + "table": { + "name": "Name", + "email": "Email", + "location": "Location", + "actions": "Actions" + }, + "empty": "No candidates found." + } + }, "users": { "title": "User management", "subtitle": "Manage all platform users", @@ -718,5 +768,67 @@ "load_error": "Failed to load users" } } + }, + "company": { + "dashboard": { + "title": "Dashboard", + "welcome": "Hello, {name}!", + "new_job": "New Job", + "stats": { + "active_jobs": "Active Jobs", + "posted": "Posted", + "applications": "Applications", + "this_month": "+{count} this month", + "views": "Views", + "conversion": "Conversion", + "soon": "Coming soon" + }, + "recent_jobs": { + "title": "Recent Jobs", + "subtitle": "Your latest posted jobs", + "view_all": "View all", + "empty": "No jobs found.", + "applications_count": "{count} applications" + }, + "recent_applications": { + "title": "Applications", + "subtitle": "Recent candidates", + "view_all": "View all", + "empty": "No recent applications.", + "unknown_job": "Unknown job" + } + } + }, + "candidate": { + "dashboard": { + "welcome": "Hi, {name}!", + "edit_profile": "Edit profile", + "stats": { + "applications": "Applications", + "applications_desc": "Total jobs applied to", + "in_progress": "In progress", + "in_progress_desc": "Awaiting a response", + "notifications": "Notifications", + "notifications_desc": "New updates" + }, + "recommended": { + "title": "Recommended jobs" + }, + "applications": { + "title": "My applications", + "table": { + "role": "Role", + "company": "Company", + "status": "Status", + "date": "Date" + } + }, + "status": { + "under_review": "Under review", + "interview": "Interview", + "accepted": "Accepted", + "rejected": "Rejected" + } + } } } \ No newline at end of file diff --git a/frontend/src/i18n/es.json b/frontend/src/i18n/es.json index f611357..6a0ae62 100644 --- a/frontend/src/i18n/es.json +++ b/frontend/src/i18n/es.json @@ -1,4 +1,18 @@ { + "sidebar": { + "dashboard": "Panel de Control", + "jobs": "Empleos", + "candidates": "Candidatos", + "users": "Usuarios", + "companies": "Empresas", + "backoffice": "Backoffice", + "messages": "Mensajes", + "tickets": "Tickets", + "my_jobs": "Mis Empleos", + "applications": "Postulaciones", + "my_applications": "Mis Postulaciones", + "support": "Soporte" + }, "nav": { "jobs": "Empleos", "about": "Sobre", @@ -662,6 +676,43 @@ } }, "admin": { + "dashboard": { + "title": "Panel de Control", + "subtitle": "Visión general del portal de empleos", + "stats": { + "activeJobs": "Empleos Activos", + "activeJobsDesc": "Total publicados", + "candidates": "Candidatos Total", + "candidatesDesc": "Usuarios registrados", + "applications": "Aplicaciones Activas", + "applicationsDesc": "En proceso", + "hiringRate": "Tasa de Contratación", + "hiringRateDesc": "Aplicaciones por empleo" + }, + "jobs": { + "title": "Gestión de Empleos", + "add": "Nuevo Empleo", + "table": { + "title": "Título", + "company": "Empresa", + "status": "Estado", + "created": "Creado en", + "actions": "Acciones" + }, + "empty": "No se encontraron empleos." + }, + "candidates": { + "title": "Gestión de Candidatos", + "table": { + "title": "Nombre", + "name": "Nombre", + "email": "Correo", + "location": "Ubicación", + "actions": "Acciones" + }, + "empty": "No se encontraron candidatos." + } + }, "users": { "title": "Gestión de Usuarios", "subtitle": "Gestione todos los usuarios de la plataforma", @@ -718,5 +769,67 @@ "load_error": "Error al cargar usuarios" } } + }, + "company": { + "dashboard": { + "title": "Panel de Control", + "welcome": "¡Hola, {name}!", + "new_job": "Nuevo Empleo", + "stats": { + "active_jobs": "Empleos Activos", + "posted": "Publicados", + "applications": "Postulaciones", + "this_month": "+{count} este mes", + "views": "Vistas", + "conversion": "Conversión", + "soon": "Próximamente" + }, + "recent_jobs": { + "title": "Empleos Recientes", + "subtitle": "Tus últimos empleos publicados", + "view_all": "Ver todos", + "empty": "No se encontraron empleos.", + "applications_count": "{count} postulaciones" + }, + "recent_applications": { + "title": "Postulaciones", + "subtitle": "Candidatos recientes", + "view_all": "Ver todas", + "empty": "No hay postulaciones recientes.", + "unknown_job": "Empleo desconocido" + } + } + }, + "candidate": { + "dashboard": { + "welcome": "¡Hola, {name}!", + "edit_profile": "Editar perfil", + "stats": { + "applications": "Postulaciones", + "applications_desc": "Total de empleos aplicados", + "in_progress": "En proceso", + "in_progress_desc": "Esperando respuesta", + "notifications": "Notificaciones", + "notifications_desc": "Nuevas actualizaciones" + }, + "recommended": { + "title": "Empleos recomendados" + }, + "applications": { + "title": "Mis postulaciones", + "table": { + "role": "Puesto", + "company": "Empresa", + "status": "Estado", + "date": "Fecha" + } + }, + "status": { + "under_review": "En revisión", + "interview": "Entrevista", + "accepted": "Aceptado", + "rejected": "Rechazado" + } + } } } \ No newline at end of file diff --git a/frontend/src/i18n/pt-BR.json b/frontend/src/i18n/pt-BR.json index b1e0690..9049cb3 100644 --- a/frontend/src/i18n/pt-BR.json +++ b/frontend/src/i18n/pt-BR.json @@ -1,4 +1,18 @@ { + "sidebar": { + "dashboard": "Dashboard", + "jobs": "Vagas", + "candidates": "Candidatos", + "users": "Usuários", + "companies": "Empresas", + "backoffice": "Backoffice", + "messages": "Mensagens", + "tickets": "Tickets", + "my_jobs": "Minhas Vagas", + "applications": "Candidaturas", + "my_applications": "Minhas Candidaturas", + "support": "Suporte" + }, "nav": { "jobs": "Vagas", "about": "Sobre", @@ -662,6 +676,42 @@ } }, "admin": { + "dashboard": { + "title": "Dashboard", + "subtitle": "Visão geral do portal de vagas", + "stats": { + "activeJobs": "Vagas Ativas", + "activeJobsDesc": "Total de vagas publicadas", + "candidates": "Candidatos", + "candidatesDesc": "Usuários registrados", + "applications": "Candidaturas", + "applicationsDesc": "Em andamento", + "hiringRate": "Taxa de Contratação", + "hiringRateDesc": "Candidaturas por vaga" + }, + "jobs": { + "title": "Gerenciamento de Vagas", + "add": "Nova Vaga", + "table": { + "title": "Título", + "company": "Empresa", + "status": "Status", + "created": "Criado em", + "actions": "Ações" + }, + "empty": "Nenhuma vaga encontrada." + }, + "candidates": { + "title": "Gerenciamento de Candidatos", + "table": { + "name": "Nome", + "email": "Email", + "location": "Localização", + "actions": "Ações" + }, + "empty": "Nenhum candidato encontrado." + } + }, "users": { "title": "Gestão de Usuários", "subtitle": "Gerencie todos os usuários da plataforma", @@ -718,5 +768,67 @@ "load_error": "Falha ao carregar usuários" } } + }, + "company": { + "dashboard": { + "title": "Dashboard", + "welcome": "Olá, {name}!", + "new_job": "Nova Vaga", + "stats": { + "active_jobs": "Vagas Ativas", + "posted": "Publicadas", + "applications": "Candidaturas", + "this_month": "+{count} este mês", + "views": "Visualizações", + "conversion": "Conversão", + "soon": "Em breve" + }, + "recent_jobs": { + "title": "Vagas Recentes", + "subtitle": "Suas últimas vagas publicadas", + "view_all": "Ver todas", + "empty": "Nenhuma vaga encontrada.", + "applications_count": "{count} candidaturas" + }, + "recent_applications": { + "title": "Candidaturas", + "subtitle": "Candidatos recentes", + "view_all": "Ver todas", + "empty": "Nenhuma candidatura recente.", + "unknown_job": "Vaga desconhecida" + } + } + }, + "candidate": { + "dashboard": { + "welcome": "Olá, {name}!", + "edit_profile": "Editar perfil", + "stats": { + "applications": "Candidaturas", + "applications_desc": "Total de vagas aplicadas", + "in_progress": "Em andamento", + "in_progress_desc": "Aguardando resposta", + "notifications": "Notificações", + "notifications_desc": "Novas atualizações" + }, + "recommended": { + "title": "Vagas recomendadas" + }, + "applications": { + "title": "Minhas candidaturas", + "table": { + "role": "Vaga", + "company": "Empresa", + "status": "Status", + "date": "Data" + } + }, + "status": { + "under_review": "Em análise", + "interview": "Entrevista", + "accepted": "Aprovado", + "rejected": "Reprovado" + } + } } } \ No newline at end of file