feat: implement bilingual English/Spanish toggle with lossless i18n translation engine across all pages
This commit is contained in:
+479
@@ -0,0 +1,479 @@
|
||||
/**
|
||||
* NEXT GEN LANDSCAPING & YARD CARE (AV YARD PRO)
|
||||
* Enterprise-Grade Bilingual Internationalization (i18n) Engine
|
||||
* Antelope Valley (Palmdale, Lancaster, Quartz Hill, Acton, Rosamond)
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// Rich HTML translations for headings and highlights that contain styled neon spans
|
||||
const htmlDictionary = {
|
||||
"calc.title": {
|
||||
en: 'Transparent Pricing for <span class="neon-text">High Desert Yards</span>',
|
||||
es: 'Precios Transparentes para <span class="neon-text">Jardines del Alto Desierto</span>'
|
||||
},
|
||||
"ba.title": {
|
||||
en: 'See the <span class="neon-text">Same-Day Cleanup</span>',
|
||||
es: 'Vea la <span class="neon-text">Limpieza el Mismo Día</span>'
|
||||
},
|
||||
"projects.title": {
|
||||
en: 'Beyond Cleanouts: <span class="neon-text">Custom Desert Living</span>',
|
||||
es: 'Más Allá de Limpiezas: <span class="neon-text">Vida Desértica a Medida</span>'
|
||||
},
|
||||
"services.title": {
|
||||
en: 'Complete Yard & Landscaping <span class="neon-text">Services</span>',
|
||||
es: 'Servicios Completos de Jardinería y <span class="neon-text">Mantenimiento</span>'
|
||||
},
|
||||
"areas.title": {
|
||||
en: 'Proudly Serving the Entire <span class="neon-text">Antelope Valley</span>',
|
||||
es: 'Sirviendo con Orgullo a Todo <span class="neon-text">Antelope Valley</span>'
|
||||
},
|
||||
"reviews.title": {
|
||||
en: 'What High Desert <span class="neon-text">Homeowners Say</span>',
|
||||
es: 'Lo que Dicen los <span class="neon-text">Propietarios del Desierto</span>'
|
||||
},
|
||||
"faq.title": {
|
||||
en: 'Frequently Asked <span class="neon-text">Questions</span>',
|
||||
es: 'Preguntas <span class="neon-text">Frecuentes</span>'
|
||||
},
|
||||
"cta.title": {
|
||||
en: 'Ready To Reclaim Your <span class="neon-text">High Desert Yard?</span>',
|
||||
es: '¿Listo Para Recuperar Su <span class="neon-text">Jardín del Alto Desierto?</span>'
|
||||
},
|
||||
"modal.title": {
|
||||
en: 'Request Your <span class="neon-text">Free Estimate</span>',
|
||||
es: 'Solicite Su <span class="neon-text">Presupuesto Gratis</span>'
|
||||
}
|
||||
};
|
||||
|
||||
// Comprehensive plain text dictionary
|
||||
const dictionary = {
|
||||
// --- Top Announcement Bar ---
|
||||
"High Desert Notice": "Aviso del Alto Desierto",
|
||||
"LA & Kern County Fire Clearance Deadlines Approaching! Fast 48-Hour Weed Abatement Available.": "¡Se acercan los plazos de desbroce contra incendios de LA y Kern! Desbroce rápido en 48 horas.",
|
||||
"Get Instant Estimate →": "Obtener Presupuesto Inmediato →",
|
||||
"Get Instant Estimate →": "Obtener Presupuesto Inmediato →",
|
||||
"Direct: (661) 581-7278": "Directo: (661) 581-7278",
|
||||
"24-Hr Text Dispatch Available": "Despacho por Mensaje 24 Horas",
|
||||
|
||||
// --- Navigation Links ---
|
||||
"Services": "Servicios",
|
||||
"Cost Calculator": "Calculadora de Costos",
|
||||
"Before & After": "Antes y Después",
|
||||
"Projects": "Proyectos",
|
||||
"Featured Projects": "Proyectos Destacados",
|
||||
"Service Areas": "Zonas de Servicio",
|
||||
"All Service Areas": "Todas las Zonas de Servicio",
|
||||
"All Services": "Todos los Servicios",
|
||||
"Reviews": "Opiniones",
|
||||
"Customer Reviews": "Opiniones de Clientes",
|
||||
"Contact": "Contacto",
|
||||
"Contact Us": "Contáctenos",
|
||||
"Free Estimate": "Presupuesto Gratis",
|
||||
"Get Free Estimate": "Obtener Presupuesto Gratis",
|
||||
"Request Instant Quote": "Solicitar Presupuesto Inmediato",
|
||||
"Language / Idioma:": "Idioma / Lenguaje:",
|
||||
"Home": "Inicio",
|
||||
|
||||
// --- Hero Section ---
|
||||
"Antelope Valley High-Desert Yard Specialists": "Especialistas en Jardinería del Alto Desierto de Antelope Valley",
|
||||
"Rugged Desert.": "Desierto Agreste.",
|
||||
"Precision Lawns.": "Césped de Precisión.",
|
||||
"Zero Compromise.": "Cero Compromisos.",
|
||||
"Tumbleweeds, unkempt desert brush, or high water bills? Next Gen transforms harsh Antelope Valley properties into pristine, fire-safe showpieces. Fast turnarounds across Palmdale, Lancaster, Quartz Hill, and surrounding desert communities.": "¿Rodadoras, maleza desértica o altas facturas de agua? Next Gen transforma terrenos difíciles de Antelope Valley en propiedades impecables y seguras contra incendios. Servicio rápido en Palmdale, Lancaster, Quartz Hill y comunidades vecinas.",
|
||||
"Calculate Your Estimate": "Calcular Su Presupuesto",
|
||||
"Calculate Yard Cost": "Calcular Costo de Jardín",
|
||||
"Call (661) 581-7278": "Llamar (661) 581-7278",
|
||||
"Direct Call (661) 581-7278": "Llamar Directo (661) 581-7278",
|
||||
|
||||
// --- Stats Ticker ---
|
||||
"Zero Tractor Damage": "Cero Daño de Tractor",
|
||||
"Lightweight Walk-Behind Precision": "Precisión Manual Ligera",
|
||||
"Walk-Behind Precision Only": "Solo Precisión Manual y Cortacésped",
|
||||
"Emergency Storm Cleanups": "Limpiezas de Emergencia",
|
||||
"24-48 Hr Fast Dispatch": "Despacho Rápido en 24-48 Horas",
|
||||
"Avg Water Bill Savings": "Ahorro Promedio en Agua",
|
||||
"Smart Drip & Turf Solutions": "Soluciones de Riego y Césped",
|
||||
"Fire Code Compliance": "Cumplimiento contra Incendios",
|
||||
"LA County Defensible Space": "Espacio Defensivo del Condado de LA",
|
||||
|
||||
// --- Calculator Section ---
|
||||
"Instant Estimation Engine": "Calculadora de Estimación Inmediata",
|
||||
"Transparent Pricing for High Desert Yards": "Precios Transparentes para Jardines del Alto Desierto",
|
||||
"Customize your property parameters below. Get an immediate ballpark estimate tailored for Antelope Valley parcel sizes, soil types, and fire safety codes.": "Personalice los parámetros de su propiedad a continuación. Obtenga un presupuesto aproximado e inmediato adaptado a los tamaños de lote, tipos de suelo y normas contra incendios de Antelope Valley.",
|
||||
"Select Primary Service Needed": "Seleccione el Servicio Principal",
|
||||
"Select Yard or Parcel Footprint": "Seleccione el Tamaño del Terreno",
|
||||
"Yard Condition / Growth Severity": "Condición del Terreno / Severidad",
|
||||
|
||||
// Calculator Service Options
|
||||
"Tumbleweed & Cleanout": "Limpieza y Retiro de Rodadoras",
|
||||
"Windstorm brush, trashout, deep haul": "Maleza de tormenta, basura y retiro profundo",
|
||||
"Fire Hazard Clearance": "Desbroce contra Incendios",
|
||||
"100ft defensible space, weed whacking, raking": "Espacio defensivo de 100 pies, desbroce y rastrillado",
|
||||
"Artificial Turf / Putting Green": "Césped Sintético / Putting Green",
|
||||
"Cool-blade UV turf, zero water maintenance": "Césped UV refrescante, cero agua",
|
||||
"Desert Xeriscaping & Rock": "Jardinería Desértica (Xeriscape) y Rocas",
|
||||
"DG, river stone, desert agaves & drip": "Granito, piedra de río, agaves y riego por goteo",
|
||||
"Tree Trimming & Palms": "Poda de Árboles y Palmeras",
|
||||
"Wind mitigation, skinning & pruning": "Prevención contra viento, afeitado y poda",
|
||||
"Routine Yard Maintenance": "Mantenimiento Periódico de Jardín",
|
||||
"Bi-weekly / monthly edging & detailing": "Orillado y detallado quincenal o mensual",
|
||||
|
||||
// Calculator Size Options
|
||||
"Front Yard Only": "Solo Patio Delantero",
|
||||
"Up to ~2,000 sq ft": "Hasta ~2,000 pies²",
|
||||
"Standard Suburb Lot": "Lote Residencial Estándar",
|
||||
"1/4 Acre (Front & Back)": "1/4 Acre (Delantero y Trasero)",
|
||||
"Half-Acre Parcel": "Terreno de Medio Acre",
|
||||
"~20,000 sq ft": "~20,000 pies²",
|
||||
"Large Residential Parcel": "Terreno Residencial Grande",
|
||||
"Comprehensive crew clearance": "Despeje integral con cuadrilla completa",
|
||||
|
||||
// Calculator Severity Options
|
||||
"Light / Moderate": "Ligero / Moderado",
|
||||
"Surface weeds, basic tidying": "Maleza superficial, limpieza básica",
|
||||
"Heavy Overgrowth": "Crecimiento Denso / Pesado",
|
||||
"Tall foxtails, tumbleweed build-up": "Pasto alto, colas de zorro y rodadoras",
|
||||
"Severe / Jungle": "Severo / Muy Denso",
|
||||
"Waist-high brush, debris & heavy hauling": "Maleza a la cintura, escombros y retiro pesado",
|
||||
|
||||
// Calculator Output Box
|
||||
"Estimated Price Range": "Rango de Precio Estimado",
|
||||
"*All-inclusive: labor, equipment, disposal & hauling.": "*Todo incluido: mano de obra, equipo, traslado y descarga.",
|
||||
"Lock In This Estimate & Book": "Asegurar Este Presupuesto y Reservar",
|
||||
"Free in-person confirmation walkthrough before any work begins.": "Recorrido de confirmación en persona gratis antes de comenzar cualquier trabajo.",
|
||||
"Commercial Haul Included": "Transporte Comercial Incluido",
|
||||
"County Defensible Space Compliant": "Cumplimiento de Espacio Defensivo del Condado",
|
||||
|
||||
// --- Before / After Section ---
|
||||
"Authentic High Desert Results": "Resultados Auténticos del Alto Desierto",
|
||||
"See the Same-Day Cleanup": "Vea la Limpieza el Mismo Día",
|
||||
"Slide the divider to see the exact same property before and after our crew arrived: waist-high weeds, tumbleweeds, and yard trash completely cleared down to clean, raked, fire-safe ground.": "Deslice el divisor para ver la misma propiedad antes y después de nuestro equipo: maleza a la cintura, rodadoras y basura completamente despejadas hasta dejar el suelo limpio, rastrillado y seguro contra incendios.",
|
||||
"Drag the neon divider or tap anywhere to compare before & after": "Deslice el divisor de neón o toque en cualquier parte para comparar el antes y después",
|
||||
"Same-Day Crew Turnaround": "Entrega del Equipo el Mismo Día",
|
||||
"100% Hand-Raked Ground Finish": "Acabado de Suelo Rastrillado a Mano al 100%",
|
||||
"Fenceline & Pipe Safe (No Heavy Tractors)": "Seguro para Cercas y Tuberías (Sin Tractores)",
|
||||
"Full Trailer Haul-Away Included": "Retiro Completo en Remolque Incluido",
|
||||
"AFTER": "DESPUÉS",
|
||||
": CLEANED YARD": ": TERRENO LIMPIO",
|
||||
"BEFORE": "ANTES",
|
||||
": OVERGROWN": ": CON MALEZA",
|
||||
|
||||
// --- Featured Projects ---
|
||||
"Featured AV Installations": "Instalaciones Destacadas en AV",
|
||||
"Beyond Cleanouts: Custom Desert Living": "Más Allá de Limpiezas: Vida Desértica a Medida",
|
||||
"Explore drought-tolerant xeriscaping, decorative river rockscapes, and synthetic turf installations engineered to withstand 105°F+ High Desert heat and heavy seasonal winds.": "Explore jardines xeriscaping tolerantes a la sequía, rocas decorativas de río e instalaciones de césped sintético diseñadas para soportar más de 105°F y fuertes vientos.",
|
||||
"Modern Xeriscape & River Rock": "Xeriscape Moderno y Roca de Río",
|
||||
"Replaced weed-choked dirt with decomposed granite, decorative river boulders, and automated drip agave beds.": "Reemplazamos tierra con maleza por granito descompuesto, rocas decorativas de río y canteros de agave con riego por goteo.",
|
||||
"Water Savings:": "Ahorro de Agua:",
|
||||
"Turnaround:": "Tiempo de Ejecución:",
|
||||
"3 Days": "3 Días",
|
||||
"Luxury Turf & Yard Remodel": "Césped de Lujo y Remodelación de Patio",
|
||||
"Triple-layer UV-rated artificial turf resilient against desert wind gusts and summer highs above 105°F.": "Césped artificial de triple capa resistente a los fuertes vientos del desierto y veranos de más de 105°F.",
|
||||
"Request Similar Xeriscape Quote": "Solicitar Presupuesto de Xeriscape Similar",
|
||||
"Request Similar Turf Quote": "Solicitar Presupuesto de Césped Similar",
|
||||
"Warranty:": "Garantía:",
|
||||
"15-Year": "15 Años",
|
||||
"Maintenance:": "Mantenimiento:",
|
||||
"Zero Mow": "Cero Corte",
|
||||
"Fire Clearance Lot Trash-Out": "Desbroce de Lote y Retiro de Residuos",
|
||||
"Cleared 1/2 acre of windblown Russian thistle tumbleweeds, dry sage, and debris to pass LA County fire inspection.": "Despejamos medio acre de rodadoras de cardo ruso, pasto seco y escombros para aprobar la inspección de bomberos.",
|
||||
"County Status:": "Estado del Condado:",
|
||||
"100% Passed": "100% Aprobado",
|
||||
"Haul-Away:": "Retiro de Carga:",
|
||||
"2 Full Trailers": "2 Remolques Llenos",
|
||||
|
||||
// --- Core Services ---
|
||||
"Built For Antelope Valley": "Diseñado para Antelope Valley",
|
||||
"Complete Yard & Landscaping Services": "Servicios Completos de Jardinería y Mantenimiento",
|
||||
"We don't do cookie-cutter coastal landscaping. Our equipment, crews, and materials are engineered for High Desert caliche soil, seasonal windstorms, and California drought restrictions.": "No hacemos jardinería costera genérica. Nuestro equipo, cuadrillas y materiales están preparados para el suelo de caliche, tormentas de viento y restricciones de sequía de California.",
|
||||
|
||||
// Service 1
|
||||
"LA County Weed Abatement": "Desbroce contra Incendios Condado de LA",
|
||||
"Stay ahead of LA County and Kern County fire inspection notices. We cut, weed whack, rake, and clear properties to meet strict 100-foot defensible space requirements before deadlines hit.": "Anticípese a las inspecciones de incendios de LA y Kern. Cortamos, desbrozamos, rastrillamos y limpiamos su propiedad para cumplir con el espacio defensivo de 100 pies antes del plazo límite.",
|
||||
"100-Foot Fire Defensible Perimeter": "Perímetro Defensivo contra Incendios de 100 Pies",
|
||||
"High-Power Weed Whacking, Mowing & Raking": "Desbroce de Alta Potencia, Corte y Rastrillado",
|
||||
"Guaranteed County Inspection Sign-Off": "Aprobación Garantizada de Inspección del Condado",
|
||||
"Get Fire Clearance Quote": "Presupuesto de Desbroce contra Incendios",
|
||||
"View Weed Abatement Details →": "Ver Detalles de Desbroce →",
|
||||
|
||||
// Service 2
|
||||
"Tumbleweed & Windstorm Hauling": "Retiro de Rodadoras y Limpieza de Tormentas",
|
||||
"When the Antelope Valley 60mph winds blow, tumbleweeds stack to the roofline against your fences and sheds. We eradicate the piles and haul everything to the transfer station.": "Cuando los vientos de 60 mph de Antelope Valley azotan, las rodadoras se apilan hasta los techos contra cercas y cobertizos. Erradicamos los montones y transportamos todo a los centros autorizados.",
|
||||
"Fence Line & Rooftop Tumbleweed Removal": "Retiro de Rodadoras en Cercas y Techos",
|
||||
"High-Capacity Hauling & Dump Trailers": "Remolques de Volteo y Carga Pesada de Gran Capacidad",
|
||||
"Property Trash-Out & Lot Cleans": "Limpieza Integral de Terrenos y Residuos",
|
||||
"Book Cleanout": "Reservar Limpieza",
|
||||
"View Tumbleweed Details →": "Ver Detalles de Rodadoras →",
|
||||
|
||||
// Service 3
|
||||
"Artificial Turf & Putting Greens": "Césped Sintético y Putting Greens",
|
||||
"Enjoy an emerald green yard year-round without paying astronomical water rates. We install commercial-grade, anti-microbial turf with specialized heat-deflecting cooling infill.": "Disfrute de un jardín verde esmeralda todo el año sin pagar facturas de agua astronómicas. Instalamos césped comercial antimicrobiano con relleno refrigerante contra el calor.",
|
||||
"UV-Stabilized (No Fade In Desert Sun)": "Protección UV (Sin Decoloración por Sol del Desierto)",
|
||||
"Pet-Friendly with Rapid Drainage Base": "Apto para Mascotas con Base de Drenaje Rápido",
|
||||
"Custom Backyard Putting Greens": "Putting Greens Personalizados para Patios",
|
||||
"Get Turf Estimate": "Obtener Presupuesto de Césped",
|
||||
|
||||
// Service 4
|
||||
"Desert Xeriscape & Rockscaping": "Jardinería Desértica (Xeriscape) y Rocas",
|
||||
"Stunning architectural landscaping engineered to thrive in the High Desert. We blend decomposed granite, California gold river rock, decorative boulders, and water-wise agaves.": "Hermosa jardinería arquitectónica diseñada para prosperar en el Alto Desierto. Combinamos granito descompuesto, piedra de río dorada, rocas decorativas y agaves resistentes.",
|
||||
"Decomposed Granite & Crushed Stone": "Granito Descompuesto y Piedra Triturada",
|
||||
"Heavy-Duty Commercial Weed Barrier Fabric": "Malla Profesional de Alta Densidad contra Maleza",
|
||||
"Architectural Desert Boulders & Succulents": "Rocas Arquitectónicas y Suculentas del Desierto",
|
||||
"Explore Rockscaping": "Explorar Jardinería con Rocas",
|
||||
|
||||
// Service 5
|
||||
"Tree Trimming & Palm Pruning": "Poda de Árboles y Palmeras",
|
||||
"High winds in Palmdale and Lancaster topple untrimmed trees and dead palm fronds. We thin tree canopies for wind passage, skin palms, and grind dangerous stumps safely.": "Los fuertes vientos en Palmdale y Lancaster derriban árboles sin podar y palmas secas. Aclareamos copas para el paso del viento, afeitamos palmeras y trituramos tocones peligrosos.",
|
||||
"Wind Mitigation Canopy Thinning": "Aclareo de Copas para Mitigar Vientos Fuertes",
|
||||
"Palm Frond Skinning & Seed Removal": "Afeitado de Palmeras y Retiro de Semillas",
|
||||
"Complete Stump Grinding & Root Extraction": "Trituración Completa de Tocones y Extracción de Raíces",
|
||||
"Quote Tree Work": "Presupuesto de Trabajo en Árboles",
|
||||
|
||||
// Service 6
|
||||
"Smart Irrigation & Drip Repair": "Reparación de Riego por Goteo Inteligente",
|
||||
"Desert soil requires dialed-in watering. Leaky valves or broken lines skyrocket your utility bill. We diagnose underground leaks, replace cracked manifolds, and tune drip systems.": "El suelo desértico requiere riego exacto. Válvulas con fugas o líneas rotas disparan su factura. Diagnosticamos fugas subterráneas, reemplazamos colectores agrietados y calibramos goteo.",
|
||||
"Subsurface Drip Line Conversions": "Conversión a Líneas de Riego por Goteo Subterráneo",
|
||||
"Smart Wi-Fi Weather-Sensing Controllers": "Controladores Wi-Fi Inteligentes con Sensor de Clima",
|
||||
"Anti-Siphon Valve & Backflow Replacement": "Reemplazo de Válvulas Anti-Sifón y Antirretorno",
|
||||
"Schedule Irrigation Check": "Programar Revisión de Riego",
|
||||
|
||||
// --- Service Areas ---
|
||||
"Local Territory Coverage": "Cobertura Territorial Local",
|
||||
"Proudly Serving the Entire Antelope Valley": "Sirviendo con Orgullo a Todo Antelope Valley",
|
||||
"Our crews live and work right here in the High Desert. We arrive equipped with commercial-grade trimmers, mowers, haul trailers, and hand tools suited for residential yards and neighborhood properties alike.": "Nuestras cuadrillas viven y trabajan aquí mismo en el Alto Desierto. Llegamos equipados con desbrozadoras comerciales, cortacéspedes, remolques y herramientas de mano aptas para cualquier propiedad.",
|
||||
"West Palmdale": "Palmdale Oeste",
|
||||
"East Palmdale": "Palmdale Este",
|
||||
"Lancaster West": "Lancaster Oeste",
|
||||
"Quartz Hill": "Quartz Hill",
|
||||
"Rosamond & Mojave": "Rosamond y Mojave",
|
||||
"Acton & Agua Dulce": "Acton y Agua Dulce",
|
||||
"View All Antelope Valley Service Areas & Regulations →": "Ver Todas las Zonas de Servicio y Regulaciones de Antelope Valley →",
|
||||
"View All Service Areas →": "Ver Todas las Zonas de Servicio →",
|
||||
"All Service Areas →": "Todas las Zonas de Servicio →",
|
||||
|
||||
// --- Reviews Section ---
|
||||
"Real Antelope Valley Feedback": "Opiniones Reales de Antelope Valley",
|
||||
"What High Desert Homeowners Say": "Lo que Dicen los Propietarios del Desierto",
|
||||
"Don't just take our word for it. Here is how Next Gen has helped neighbors in Palmdale, Lancaster, and Quartz Hill regain control of their properties.": "No solo se quede con nuestra palabra. Así es como Next Gen ha ayudado a vecinos en Palmdale, Lancaster y Quartz Hill a recuperar sus terrenos.",
|
||||
"\"We received a weed abatement violation notice from LA County Fire with a 2-week deadline. Next Gen showed up the next morning with commercial weed trimmers and had our full half-acre cleared, raked, and hauled into their trailer before sundown. The inspector signed off with zero issues. Lifesavers!\"": "\"Recibimos un aviso de infracción por maleza de los Bomberos del Condado de LA con un plazo de 2 semanas. Next Gen llegó a la mañana siguiente con desbrozadoras comerciales y dejó nuestro medio acre despejado, rastrillado y cargado en su remolque antes de caer el sol. El inspector lo firmó sin un solo problema. ¡Nos salvaron!\"",
|
||||
"\"After the winter windstorms, our backyard had tumbleweeds literally stacked 8 feet high against our vinyl fence. These guys had the proper heavy-duty trailers and cleared everything in 3 hours. Super polite, fair pricing, and they left the yard spotless.\"": "\"Después de las tormentas de viento invernales, nuestro patio trasero tenía rodadoras apiladas a 8 pies de altura contra nuestra cerca de vinilo. Estos chicos llegaron con remolques de carga pesada y despejaron todo en 3 horas. Súper amables, precio justo y dejaron el patio impecable.\"",
|
||||
"\"We ditched our dead grass for artificial turf and desert rockscape. Our water bill dropped by over $220/month in the summer, and our dogs love the turf. The green is so vibrant and stays cool even when Palmdale hits 104 degrees. Highly recommend!\"": "\"Reemplazamos el pasto seco por césped artificial y rocas de desierto. Nuestra factura de agua bajó más de $220/mes en el verano y a nuestros perros les fascina. El verde es vibrante y se mantiene fresco incluso a 104 grados en Palmdale. ¡Muy recomendados!\"",
|
||||
|
||||
// --- FAQs Section ---
|
||||
"Common Questions": "Preguntas Frecuentes",
|
||||
"Frequently Asked Questions": "Preguntas Frecuentes",
|
||||
"Everything you need to know about our Antelope Valley yard care, county weed deadlines, and pricing.": "Todo lo que necesita saber sobre el cuidado de jardines, plazos de maleza del condado y precios en Antelope Valley.",
|
||||
"What are the LA County and Kern County weed abatement deadlines?": "¿Cuáles son los plazos de desbroce contra incendios de los condados de LA y Kern?",
|
||||
"In the Antelope Valley, LA County Agricultural Commissioner and Fire Department inspections typically begin in mid-to-late spring and enforce 100-foot defensible space clearance around structures and 10-foot road buffers. Failure to clear can result in county-enforced contractor billing and heavy penalty fees. Next Gen guarantees work that passes county inspection on the first visit.": "En Antelope Valley, las inspecciones de bomberos del Condado de LA comienzan a mediados de primavera y exigen un espacio defensivo de 100 pies alrededor de estructuras y márgenes de 10 pies en caminos. No limpiar puede ocasionar multas severas y cobros del condado. Next Gen garantiza trabajos que aprueban la inspección en la primera visita.",
|
||||
"How does artificial turf hold up in high Antelope Valley summer heat?": "¿Cómo resiste el césped sintético el intenso calor veraniego de Antelope Valley?",
|
||||
"We exclusively install UV-stabilized commercial turf with special cooling infill designed to withstand 110°F+ desert temperatures without melting, fading, or discoloring. It also includes an engineered perforated backing that drains quickly during rare desert cloudbursts and prevents pet odor buildup.": "Instalamos exclusivamente césped comercial con protección UV y relleno refrigerante especial para soportar más de 110°F sin derretirse ni desteñirse. Además, cuenta con base perforada que drena rápidamente y previene la acumulación de olores de mascotas.",
|
||||
"Do you haul away the debris, or do I need to rent a dumpster?": "¿Se llevan los escombros o necesito rentar un contenedor de basura?",
|
||||
"We handle 100% of the hauling. Our fleet is equipped with high-capacity dump trailers and commercial trucks. All tumbleweeds, tree clippings, dead brush, and yard trash are loaded and legally disposed of at authorized local green-waste facilities in Palmdale and Lancaster.": "Nosotros nos encargamos del 100% del retiro y transporte. Nuestra flota cuenta con remolques de volteo de alta capacidad. Todas las rodadoras, ramas podadas y maleza seca se cargan y depositan legalmente en instalaciones de reciclaje verde autorizadas en Palmdale y Lancaster.",
|
||||
"Can I get an estimate by texting photos of my yard?": "¿Puedo obtener un presupuesto enviando fotos de mi patio por mensaje?",
|
||||
"Yes! You can text photos and your address directly to (661) 581-7278. We can often provide a same-hour ballpark estimate, followed by a quick in-person verification before any tools touch the ground.": "¡Sí! Puede enviar fotos y su dirección directamente al (661) 581-7278. A menudo entregamos un estimado en la misma hora, seguido de una confirmación rápida en persona antes de iniciar los trabajos.",
|
||||
"What equipment do you use for yard cleanups and weed clearing?": "¿Qué herramientas y equipos usan para la limpieza de patios y desbroce?",
|
||||
"We use commercial-grade walk-behind mowers, high-powered gas weed trimmers/whackers, heavy-duty landscape rakes, blowers, and our haul truck & trailer. We specialize in residential yards, standard lots, and parcels up to a half-acre—getting directly up against fences, walls, and corners that heavy machinery and tractors can't reach.": "Usamos cortacéspedes comerciales de empuje, desbrozadoras a gas de alta potencia, rastrillos reforzados, sopladoras y remolques de volteo. Nos especializamos en patios residenciales y terrenos de hasta medio acre, llegando directamente contra cercas y paredes donde los tractores pesados no pueden entrar sin causar daños.",
|
||||
|
||||
// --- Final CTA ---
|
||||
"Ready To Reclaim Your High Desert Yard?": "¿Listo Para Recuperar Su Jardín del Alto Desierto?",
|
||||
"Don't let windblown tumbleweeds and fire hazards take over. Get an honest, zero-pressure quote from the local Next Gen team that knows Antelope Valley soil inside and out.": "No permita que las rodadoras y los peligros de incendio se apoderen de su propiedad. Obtenga un presupuesto honesto del equipo local de Next Gen que conoce el terreno de Antelope Valley al detalle.",
|
||||
"Request Free On-Site Quote": "Solicitar Presupuesto en el Lugar Gratis",
|
||||
|
||||
// --- Modal Form ---
|
||||
"Quick Response Guarantee": "Garantía de Respuesta Rápida",
|
||||
"Request Your Free Estimate": "Solicite Su Presupuesto Gratis",
|
||||
"Fill out the form below or call us directly. Next Gen responds within 15 minutes during daylight hours.": "Complete el formulario a continuación o llámenos directamente. Next Gen responde en menos de 15 minutos en horas diurnas.",
|
||||
"Full Name *": "Nombre Completo *",
|
||||
"Mobile Phone (for quote text) *": "Teléfono Móvil (para texto de presupuesto) *",
|
||||
"Property Address / City *": "Dirección de la Propiedad / Ciudad *",
|
||||
"Service Needed": "Servicio Solicitado",
|
||||
"Select a Service": "Seleccione un Servicio",
|
||||
"Weed Abatement (Fire Clearance)": "Desbroce contra Incendios (Fire Clearance)",
|
||||
"Tumbleweed Removal & Hauling": "Retiro y Transporte de Rodadoras",
|
||||
"Synthetic Turf Installation": "Instalación de Césped Sintético",
|
||||
"Desert Xeriscape & Rockscaping": "Jardinería Desértica (Xeriscape) y Rocas",
|
||||
"Tree Trimming & Palm Pruning": "Poda de Árboles y Palmeras",
|
||||
"Smart Irrigation & Drip Repair": "Reparación de Riego por Goteo",
|
||||
"Complete Property Cleanup / Trash-Out": "Limpieza Completa de Propiedad / Desalojo",
|
||||
"Notes / Yard Size": "Notas / Tamaño del Terreno",
|
||||
"Submit for Fast Quote →": "Enviar Para Presupuesto Rápido →",
|
||||
|
||||
// --- Footer ---
|
||||
"Antelope Valley's premier landscaping, fire hazard weed abatement, desert rockscaping, and synthetic turf contractor. Palmdale & Lancaster, California.": "El principal contratista de jardinería, desbroce contra incendios, rocas desérticas y césped sintético en Antelope Valley. Palmdale y Lancaster, California.",
|
||||
"Working Hours": "Horario de Trabajo",
|
||||
"Mon – Fri: 6:30 AM – 7:00 PM": "Lun – Vie: 6:30 AM – 7:00 PM",
|
||||
"Saturday: 7:00 AM – 6:00 PM": "Sábado: 7:00 AM – 6:00 PM",
|
||||
"Sunday: Emergency Storm Calls": "Domingo: Llamadas de Emergencia",
|
||||
"24-Hr Antelope Valley Dispatch": "Despacho 24 Horas en Antelope Valley",
|
||||
"Next Gen Landscaping & Yard Care. All rights reserved.": "Next Gen Landscaping & Yard Care. Todos los derechos reservados.",
|
||||
"Privacy Policy (CCPA / CPRA)": "Política de Privacidad (CCPA / CPRA)",
|
||||
"Terms of Service": "Términos de Servicio",
|
||||
"Licensed, Bonded & Insured • High Desert Fire Hazard Compliant": "Licenciados, Asegurados y Afianzados • Cumplimiento contra Incendios del Alto Desierto",
|
||||
"Licensed, Bonded & Insured • Residential Hand-Tool Precision": "Licenciados, Asegurados y Afianzados • Precisión Manual Residencial",
|
||||
"Palmdale, CA (93550, 93551)": "Palmdale, CA (93550, 93551)",
|
||||
"Lancaster, CA (93534, 93535)": "Lancaster, CA (93534, 93535)",
|
||||
"Quartz Hill, CA (93536)": "Quartz Hill, CA (93536)",
|
||||
"Acton & Agua Dulce": "Acton y Agua Dulce",
|
||||
"Rosamond & Mojave": "Rosamond y Mojave",
|
||||
|
||||
// Subpage & Hub Pages
|
||||
"Same-Day & 48-Hour On-Site Estimates Across All High Desert Zip Codes.": "Presupuestos en el sitio el mismo día y en 48 horas en todos los códigos postales del Alto Desierto.",
|
||||
"All Antelope Valley Service Areas & Regulations": "Todas las Zonas de Servicio y Regulaciones de Antelope Valley",
|
||||
"High Desert Landscaping & Weed Abatement Locations": "Ubicaciones de Jardinería y Desbroce en el Alto Desierto",
|
||||
"Fast 24-48 hour response times for LA County Fire defensible space compliance, tumbleweed clearing, desert rockscaping, and water-saving synthetic turf throughout the Antelope Valley.": "Respuesta rápida de 24 a 48 horas para cumplimiento de espacio defensivo contra incendios del Condado de LA, retiro de rodadoras, jardinería xeriscape y césped sintético en todo Antelope Valley.",
|
||||
"Palmdale Yard Care & Weed Abatement": "Cuidado de Jardines y Desbroce en Palmdale",
|
||||
"Lancaster Yard Care & Weed Abatement": "Cuidado de Jardines y Desbroce en Lancaster",
|
||||
"Quartz Hill Yard Care & Weed Abatement": "Cuidado de Jardines y Desbroce en Quartz Hill",
|
||||
"Acton & Agua Dulce Yard Care": "Cuidado de Jardines en Acton y Agua Dulce",
|
||||
"Rosamond & Mojave Yard Care": "Cuidado de Jardines en Rosamond y Mojave"
|
||||
};
|
||||
|
||||
/**
|
||||
* Set Application Language
|
||||
* @param {'en'|'es'} lang
|
||||
*/
|
||||
function setLanguage(lang) {
|
||||
if (lang !== 'es') lang = 'en';
|
||||
|
||||
// 1. Save state in localStorage
|
||||
try {
|
||||
localStorage.setItem('avyardpro_lang', lang);
|
||||
} catch (e) {}
|
||||
|
||||
// 2. Set document language
|
||||
document.documentElement.lang = lang;
|
||||
|
||||
// 3. Update all toggle button active classes
|
||||
document.querySelectorAll('.lang-btn').forEach(btn => {
|
||||
const btnLang = btn.getAttribute('data-lang');
|
||||
if (btnLang === lang) {
|
||||
btn.classList.add('active');
|
||||
btn.setAttribute('aria-pressed', 'true');
|
||||
} else {
|
||||
btn.classList.remove('active');
|
||||
btn.setAttribute('aria-pressed', 'false');
|
||||
}
|
||||
});
|
||||
|
||||
// 4. Update rich HTML elements with data-i18n-html
|
||||
document.querySelectorAll('[data-i18n-html]').forEach(el => {
|
||||
const key = el.getAttribute('data-i18n-html');
|
||||
if (htmlDictionary[key] && htmlDictionary[key][lang]) {
|
||||
el.innerHTML = htmlDictionary[key][lang];
|
||||
}
|
||||
});
|
||||
|
||||
// 5. Update text elements
|
||||
const targets = document.querySelectorAll(
|
||||
'h1, h2, h3, h4, h5, p, span, a, button, label, summary, div.stat-label, div.calc-option-title, div.calc-option-desc, div.faq-answer'
|
||||
);
|
||||
|
||||
targets.forEach(el => {
|
||||
// Don't overwrite elements handled by data-i18n-html
|
||||
if (el.hasAttribute('data-i18n-html') || el.closest('[data-i18n-html]')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip elements that contain other complex children unless it's pure text or text + svg
|
||||
if (el.children.length > 0 && !el.classList.contains('badge') && !el.classList.contains('btn') && !el.classList.contains('showcase-stat') && !el.classList.contains('announcement-link')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Store initial English text on first pass
|
||||
if (typeof el._originalText === 'undefined') {
|
||||
el._originalText = el.textContent.trim();
|
||||
}
|
||||
|
||||
const original = el._originalText;
|
||||
|
||||
if (lang === 'es') {
|
||||
if (dictionary[original]) {
|
||||
const svg = el.querySelector('svg');
|
||||
if (svg) {
|
||||
const svgHtml = svg.outerHTML;
|
||||
el.innerHTML = svgHtml + ' ' + dictionary[original];
|
||||
} else {
|
||||
el.textContent = dictionary[original];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Restore original English text
|
||||
const svg = el.querySelector('svg');
|
||||
if (svg) {
|
||||
const svgHtml = svg.outerHTML;
|
||||
el.innerHTML = svgHtml + ' ' + original;
|
||||
} else {
|
||||
el.textContent = original;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 6. Translate select options in forms
|
||||
document.querySelectorAll('select option').forEach(opt => {
|
||||
if (typeof opt._originalText === 'undefined') {
|
||||
opt._originalText = opt.textContent.trim();
|
||||
}
|
||||
const orig = opt._originalText;
|
||||
if (lang === 'es' && dictionary[orig]) {
|
||||
opt.textContent = dictionary[orig];
|
||||
} else if (lang === 'en') {
|
||||
opt.textContent = orig;
|
||||
}
|
||||
});
|
||||
|
||||
// 7. Translate input & textarea placeholders
|
||||
document.querySelectorAll('input[placeholder], textarea[placeholder]').forEach(input => {
|
||||
if (typeof input._originalPlaceholder === 'undefined') {
|
||||
input._originalPlaceholder = input.getAttribute('placeholder') || '';
|
||||
}
|
||||
const orig = input._originalPlaceholder;
|
||||
if (lang === 'es' && dictionary[orig]) {
|
||||
input.setAttribute('placeholder', dictionary[orig]);
|
||||
} else if (lang === 'en') {
|
||||
input.setAttribute('placeholder', orig);
|
||||
}
|
||||
});
|
||||
|
||||
// 8. Dispatch event for calculators, sliders, or other components
|
||||
window.dispatchEvent(new CustomEvent('languageChanged', { detail: { lang } }));
|
||||
}
|
||||
|
||||
// Expose globally
|
||||
window.setAppLanguage = setLanguage;
|
||||
|
||||
// Initialize immediately or on DOMContentLoaded
|
||||
function initLanguage() {
|
||||
// Check URL query parameter: ?lang=es or ?lang=en
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const urlLang = urlParams.get('lang');
|
||||
|
||||
let activeLang = 'en';
|
||||
try {
|
||||
activeLang = urlLang || localStorage.getItem('avyardpro_lang') || 'en';
|
||||
} catch (e) {
|
||||
activeLang = urlLang || 'en';
|
||||
}
|
||||
|
||||
// Attach click listeners to all language switch buttons
|
||||
document.querySelectorAll('.lang-btn').forEach(btn => {
|
||||
btn.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
const target = btn.getAttribute('data-lang');
|
||||
if (target) {
|
||||
setLanguage(target);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Apply active language
|
||||
setLanguage(activeLang);
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initLanguage);
|
||||
} else {
|
||||
initLanguage();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user