From 407744d00f1f4cffddeab66da62b2a5d226dc630 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 1 Mar 2026 21:24:48 +0000 Subject: [PATCH] feat: translate memberships page and components to English Co-Authored-By: Claude Opus 4.6 --- apps/web/app/(admin)/memberships/page.tsx | 68 +++++++++---------- apps/web/components/memberships/plan-card.tsx | 22 +++--- apps/web/components/memberships/plan-form.tsx | 54 +++++++-------- 3 files changed, 72 insertions(+), 72 deletions(-) diff --git a/apps/web/app/(admin)/memberships/page.tsx b/apps/web/app/(admin)/memberships/page.tsx index 4702712..4e2c1c9 100644 --- a/apps/web/app/(admin)/memberships/page.tsx +++ b/apps/web/app/(admin)/memberships/page.tsx @@ -68,10 +68,10 @@ interface MembershipsResponse { } const statusFilters = [ - { value: "", label: "Todos" }, - { value: "ACTIVE", label: "Activas" }, - { value: "EXPIRED", label: "Expiradas" }, - { value: "CANCELLED", label: "Canceladas" }, + { value: "", label: "All" }, + { value: "ACTIVE", label: "Active" }, + { value: "EXPIRED", label: "Expired" }, + { value: "CANCELLED", label: "Cancelled" }, ]; export default function MembershipsPage() { @@ -104,12 +104,12 @@ export default function MembershipsPage() { setLoadingPlans(true); try { const response = await fetch("/api/membership-plans?includeInactive=true"); - if (!response.ok) throw new Error("Error al cargar planes"); + if (!response.ok) throw new Error("Error loading plans"); const data = await response.json(); setPlans(data); } catch (err) { console.error("Error fetching plans:", err); - setError(err instanceof Error ? err.message : "Error desconocido"); + setError(err instanceof Error ? err.message : "Unknown error"); } finally { setLoadingPlans(false); } @@ -125,7 +125,7 @@ export default function MembershipsPage() { if (searchQuery) params.append("search", searchQuery); const response = await fetch(`/api/memberships?${params.toString()}`); - if (!response.ok) throw new Error("Error al cargar membresias"); + if (!response.ok) throw new Error("Error loading memberships"); const data: MembershipsResponse = await response.json(); setMemberships(data.data); @@ -138,7 +138,7 @@ export default function MembershipsPage() { }); } catch (err) { console.error("Error fetching memberships:", err); - setError(err instanceof Error ? err.message : "Error desconocido"); + setError(err instanceof Error ? err.message : "Unknown error"); } finally { setLoadingMemberships(false); } @@ -209,7 +209,7 @@ export default function MembershipsPage() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.error || "Error al guardar plan"); + throw new Error(errorData.error || "Error saving plan"); } setShowPlanForm(false); @@ -224,7 +224,7 @@ export default function MembershipsPage() { // Handle plan deletion const handleDeletePlan = async (plan: MembershipPlan) => { - if (!confirm(`¿Estas seguro de eliminar el plan "${plan.name}"? Esta accion lo desactivara.`)) { + if (!confirm(`Are you sure you want to delete the plan "${plan.name}"? This action will deactivate it.`)) { return; } @@ -235,13 +235,13 @@ export default function MembershipsPage() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.error || "Error al eliminar plan"); + throw new Error(errorData.error || "Error deleting plan"); } await fetchPlans(); } catch (err) { console.error("Error deleting plan:", err); - setError(err instanceof Error ? err.message : "Error desconocido"); + setError(err instanceof Error ? err.message : "Unknown error"); } }; @@ -262,7 +262,7 @@ export default function MembershipsPage() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.error || "Error al asignar membresia"); + throw new Error(errorData.error || "Error assigning membership"); } setShowAssignDialog(false); @@ -295,19 +295,19 @@ export default function MembershipsPage() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.error || "Error al renovar membresia"); + throw new Error(errorData.error || "Error renewing membership"); } await Promise.all([fetchMemberships(), fetchPlans()]); } catch (err) { console.error("Error renewing membership:", err); - setError(err instanceof Error ? err.message : "Error desconocido"); + setError(err instanceof Error ? err.message : "Unknown error"); } }; // Handle membership cancellation const handleCancelMembership = async (membership: Membership) => { - if (!confirm(`¿Estas seguro de cancelar la membresia de ${membership.client.firstName} ${membership.client.lastName}?`)) { + if (!confirm(`Are you sure you want to cancel the membership for ${membership.client.firstName} ${membership.client.lastName}?`)) { return; } @@ -318,13 +318,13 @@ export default function MembershipsPage() { if (!response.ok) { const errorData = await response.json(); - throw new Error(errorData.error || "Error al cancelar membresia"); + throw new Error(errorData.error || "Error cancelling membership"); } await Promise.all([fetchMemberships(), fetchPlans()]); } catch (err) { console.error("Error cancelling membership:", err); - setError(err instanceof Error ? err.message : "Error desconocido"); + setError(err instanceof Error ? err.message : "Unknown error"); } }; @@ -336,9 +336,9 @@ export default function MembershipsPage() { {/* Header */}
-

Membresias

+

Memberships

- Gestiona planes y membresias de tus clientes + Manage plans and memberships for your players

@@ -374,7 +374,7 @@ export default function MembershipsPage() {
-

Membresias Activas

+

Active Memberships

{stats.totalActive}

@@ -396,7 +396,7 @@ export default function MembershipsPage() {
-

Por Expirar

+

Expiring Soon

{stats.expiringSoon}

@@ -412,7 +412,7 @@ export default function MembershipsPage() {
-

Planes Activos

+

Active Plans

{activePlans.length}

@@ -428,7 +428,7 @@ export default function MembershipsPage() {
-

Total Suscriptores

+

Total Subscribers

{plans.reduce((sum, p) => sum + p.subscriberCount, 0)}

@@ -441,12 +441,12 @@ export default function MembershipsPage() { {/* Plans Section */}
-

Planes de Membresia

+

Membership Plans

@@ -454,7 +454,7 @@ export default function MembershipsPage() {
-

Cargando planes...

+

Loading plans...

) : plans.length === 0 ? ( @@ -468,10 +468,10 @@ export default function MembershipsPage() { > -

No hay planes

-

Crea tu primer plan de membresia

+

No plans

+

Create your first membership plan

@@ -496,12 +496,12 @@ export default function MembershipsPage() { {/* Memberships Section */}
-

Membresias

+

Memberships

@@ -513,7 +513,7 @@ export default function MembershipsPage() {
setSearchQuery(e.target.value)} className="w-full" @@ -527,7 +527,7 @@ export default function MembershipsPage() { onChange={(e) => setPlanFilter(e.target.value)} className="flex h-10 w-full rounded-md border border-primary-200 bg-white px-3 py-2 text-sm ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2" > - + {activePlans.map((plan) => (
{plan.description && ( @@ -72,7 +72,7 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr {formatCurrency(price)}
- /{plan.durationMonths} {plan.durationMonths === 1 ? "mes" : "meses"} + /{plan.durationMonths} {plan.durationMonths === 1 ? "month" : "months"}
@@ -87,8 +87,8 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr
-

{freeHours} horas gratis

-

de cancha al mes

+

{freeHours} free hours

+

of court time per month

)} @@ -102,8 +102,8 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr
-

{discountPercent}% descuento

-

en reservas adicionales

+

{discountPercent}% discount

+

on additional bookings

)} @@ -117,8 +117,8 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr
-

{storeDiscount}% descuento

-

en tienda

+

{storeDiscount}% discount

+

in store

)} @@ -126,7 +126,7 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr {/* Other Benefits */} {otherBenefits.length > 0 && (
-

Beneficios adicionales:

+

Additional benefits:

    {otherBenefits.map((benefit, index) => (
  • @@ -153,7 +153,7 @@ export function PlanCard({ plan, onEdit, onDelete, isAdmin = false }: PlanCardPr - Editar + Edit )} diff --git a/apps/web/components/memberships/plan-form.tsx b/apps/web/components/memberships/plan-form.tsx index 5e2fc0d..fdd84f8 100644 --- a/apps/web/components/memberships/plan-form.tsx +++ b/apps/web/components/memberships/plan-form.tsx @@ -41,10 +41,10 @@ interface PlanFormProps { } const durationOptions = [ - { value: 1, label: "1 mes" }, - { value: 3, label: "3 meses" }, - { value: 6, label: "6 meses" }, - { value: 12, label: "12 meses" }, + { value: 1, label: "1 month" }, + { value: 3, label: "3 months" }, + { value: 6, label: "6 months" }, + { value: 12, label: "12 months" }, ]; export function PlanForm({ @@ -107,19 +107,19 @@ export function PlanForm({ const newErrors: Record = {}; if (!formData.name.trim()) { - newErrors.name = "El nombre es requerido"; + newErrors.name = "Name is required"; } if (formData.price <= 0) { - newErrors.price = "El precio debe ser mayor a 0"; + newErrors.price = "Price must be greater than 0"; } if (formData.bookingDiscount < 0 || formData.bookingDiscount > 100) { - newErrors.bookingDiscount = "El descuento debe estar entre 0 y 100"; + newErrors.bookingDiscount = "Discount must be between 0 and 100"; } if (formData.storeDiscount < 0 || formData.storeDiscount > 100) { - newErrors.storeDiscount = "El descuento debe estar entre 0 y 100"; + newErrors.storeDiscount = "Discount must be between 0 and 100"; } if (formData.freeHours < 0) { - newErrors.freeHours = "Las horas gratis no pueden ser negativas"; + newErrors.freeHours = "Free hours cannot be negative"; } setErrors(newErrors); @@ -137,20 +137,20 @@ export function PlanForm({
    - {mode === "create" ? "Nuevo Plan de Membresia" : "Editar Plan"} + {mode === "create" ? "New Membership Plan" : "Edit Plan"} {/* Name */}
    {errors.name && ( @@ -161,13 +161,13 @@ export function PlanForm({ {/* Description */}