From 2c27836245306407f13120fe07d9a85b583a3773 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Tue, 23 Dec 2025 15:29:47 -0300 Subject: [PATCH] feat: Add i18n support to company registration page --- frontend/src/app/register/company/page.tsx | 232 +++++++++--------- frontend/src/components/language-switcher.tsx | 30 ++- frontend/src/i18n/en.json | 109 ++++++++ frontend/src/i18n/pt-BR.json | 109 ++++++++ 4 files changed, 349 insertions(+), 131 deletions(-) diff --git a/frontend/src/app/register/company/page.tsx b/frontend/src/app/register/company/page.tsx index 048f116..6a25154 100644 --- a/frontend/src/app/register/company/page.tsx +++ b/frontend/src/app/register/company/page.tsx @@ -5,13 +5,6 @@ import { useRouter } from "next/navigation"; import Link from "next/link"; import Image from "next/image"; import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; @@ -31,50 +24,51 @@ import { EyeOff, Phone, MapPin, - Users, Globe, FileText, ArrowLeft, } from "lucide-react"; -import { Alert, AlertDescription } from "@/components/ui/alert"; import { motion } from "framer-motion"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; - -const companySchema = z.object({ - companyName: z.string().min(2, "Company name must be at least 2 characters"), - cnpj: z.string().min(14, "CNPJ must have 14 digits"), - email: z.string().email("Invalid email"), - password: z.string().min(6, "Password must be at least 6 characters"), - confirmPassword: z.string(), - phone: z.string().min(10, "Phone must have at least 10 digits"), - website: z.string().url("Website must be a valid URL").optional().or(z.literal("")), - address: z.string().min(5, "Address must be at least 5 characters"), - city: z.string().min(2, "City is required"), - state: z.string().min(2, "State is required"), - zipCode: z.string().min(8, "ZIP code must have 8 digits"), - sector: z.string().min(1, "Industry is required"), - companySize: z.string().min(1, "Company size is required"), - description: z.string().min(20, "Description must be at least 20 characters"), - contactPerson: z.string().min(2, "Contact name is required"), - contactRole: z.string().min(2, "Contact role is required"), - acceptTerms: z.boolean().refine(val => val === true, "You must accept the terms"), - acceptNewsletter: z.boolean().optional(), -}).refine(data => data.password === data.confirmPassword, { - message: "Passwords do not match", - path: ["confirmPassword"], -}); - -type CompanyFormData = z.infer; +import { useTranslation } from "@/lib/i18n"; +import { LanguageSwitcher } from "@/components/language-switcher"; export default function CompanyRegisterPage() { const router = useRouter(); + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [currentStep, setCurrentStep] = useState(1); + const companySchema = z.object({ + companyName: z.string().min(2, t("register.company.form.errors.companyName")), + cnpj: z.string().min(14, t("register.company.form.errors.cnpj")), + email: z.string().email(t("register.company.form.errors.email")), + password: z.string().min(6, t("register.company.form.errors.password")), + confirmPassword: z.string(), + phone: z.string().min(10, t("register.company.form.errors.phone")), + website: z.string().url(t("register.company.form.errors.website")).optional().or(z.literal("")), + address: z.string().min(5, t("register.company.form.errors.address")), + city: z.string().min(2, t("register.company.form.errors.city")), + state: z.string().min(2, t("register.company.form.errors.state")), + zipCode: z.string().min(8, t("register.company.form.errors.zipCode")), + sector: z.string().min(1, t("register.company.form.errors.industry")), + companySize: z.string().min(1, t("register.company.form.errors.size")), + description: z.string().min(20, t("register.company.form.errors.description")), + contactPerson: z.string().min(2, t("register.company.form.errors.contactName")), + contactRole: z.string().min(2, t("register.company.form.errors.contactRole")), + acceptTerms: z.boolean().refine(val => val === true, t("register.company.form.errors.acceptTerms")), + acceptNewsletter: z.boolean().optional(), + }).refine(data => data.password === data.confirmPassword, { + message: t("register.company.form.errors.passwordMismatch"), + path: ["confirmPassword"], + }); + + type CompanyFormData = z.infer; + const { register, handleSubmit, @@ -87,7 +81,6 @@ export default function CompanyRegisterPage() { const acceptTerms = watch("acceptTerms"); const acceptNewsletter = watch("acceptNewsletter"); - const [errorMsg, setErrorMsg] = useState(null); const onSubmit = async (data: CompanyFormData) => { @@ -103,17 +96,15 @@ export default function CompanyRegisterPage() { phone: data.phone, }); - // Redirect to login after registration router.push("/login?message=Empresa registrada com sucesso! Faça login com seu email e a senha padrão: ChangeMe123!"); } catch (error: any) { console.error("Registration error:", error); - setErrorMsg(error.message || "Erro ao registrar empresa. Tente novamente."); + setErrorMsg(error.message || t("register.company.form.errors.generic")); } finally { setLoading(false); } }; - const nextStep = () => { if (currentStep < 3) setCurrentStep(currentStep + 1); }; @@ -131,7 +122,7 @@ export default function CompanyRegisterPage() { return (
{/* Left Panel - Information */} -
+

- Register your company + {t("register.company.title")}

- Find top talent for your company. - Post jobs and connect with qualified candidates. + {t("register.company.subtitle")}

- Post jobs for free + {t("register.company.bullets.free")}
- Access thousands of candidates + {t("register.company.bullets.candidates")}
- Application management tools + {t("register.company.bullets.tools")}
- Complete recruiting dashboard + {t("register.company.bullets.dashboard")}
{/* Right Panel - Form */} -
+
+
+ +
+
{/* Header */}
@@ -181,25 +175,25 @@ export default function CompanyRegisterPage() { className="inline-flex items-center gap-2 text-muted-foreground hover:text-foreground mb-4 transition-colors" > - Back to login + {t("register.company.form.actions.backLogin")}

- Create account - company + {t("register.company.form.title")}

- Fill in your company details + {t("register.company.form.subtitle")}

{/* Progress Indicator */}
- Step {currentStep} of 3 + {t("register.company.form.steps.step", { current: currentStep, total: 3 })} - {currentStep === 1 && "Company details"} - {currentStep === 2 && "Address & contact"} - {currentStep === 3 && "Additional information"} + {currentStep === 1 && t("register.company.form.steps.details")} + {currentStep === 2 && t("register.company.form.steps.address")} + {currentStep === 3 && t("register.company.form.steps.info")}
@@ -222,13 +216,13 @@ export default function CompanyRegisterPage() { className="space-y-4" >
- +
@@ -239,13 +233,13 @@ export default function CompanyRegisterPage() {
- +
@@ -256,13 +250,13 @@ export default function CompanyRegisterPage() {
- +
@@ -273,13 +267,13 @@ export default function CompanyRegisterPage() {
- +
@@ -303,13 +297,13 @@ export default function CompanyRegisterPage() {
- +
@@ -333,7 +327,7 @@ export default function CompanyRegisterPage() {
)} @@ -349,13 +343,13 @@ export default function CompanyRegisterPage() { className="space-y-4" >
- +
@@ -366,13 +360,13 @@ export default function CompanyRegisterPage() {
- +
@@ -383,13 +377,13 @@ export default function CompanyRegisterPage() {
- +
@@ -401,11 +395,11 @@ export default function CompanyRegisterPage() {
- + {errors.city && ( @@ -414,10 +408,10 @@ export default function CompanyRegisterPage() {
- + {errors.zipCode && ( @@ -470,10 +464,10 @@ export default function CompanyRegisterPage() {
@@ -490,26 +484,26 @@ export default function CompanyRegisterPage() { className="space-y-4" >
- + {errors.sector && ( @@ -518,18 +512,18 @@ export default function CompanyRegisterPage() {
- + {errors.companySize && ( @@ -538,10 +532,10 @@ export default function CompanyRegisterPage() {
- +