Improve frontend traslations

This commit is contained in:
Urtzi Alfaro
2025-11-18 22:17:56 +01:00
parent 8c6393ea14
commit bbf6658759
27 changed files with 424 additions and 462 deletions

View File

@@ -726,7 +726,7 @@ const SubscriptionPage: React.FC = () => {
</p>
<p className="text-sm text-[var(--text-secondary)]">
Si tienes preguntas sobre tu suscripción o necesitas asistencia, contacta a nuestro equipo de soporte en{' '}
<a href="mailto:support@bakery-ia.com" className="text-blue-500 hover:underline">
<a href="mailto:support@bakery-ia.com" className="text-blue-500 hover:text-white hover:bg-blue-500 px-2 py-0.5 rounded transition-all duration-200 no-underline">
support@bakery-ia.com
</a>
</p>

View File

@@ -90,7 +90,7 @@ const CareersPage: React.FC = () => {
<span className="block text-[var(--color-primary)]">Paso a Paso</span>
</h1>
<p className="text-xl text-[var(--text-secondary)] leading-relaxed mb-8">
Panadería IA es actualmente un proyecto en solitario, enfocado en crear la mejor herramienta
{t('common:app.name', 'BakeWise')} es actualmente un proyecto en solitario, enfocado en crear la mejor herramienta
de IA para panaderías mediante contacto directo con clientes y ejecución ágil. Cuando llegue
el momento adecuado, construiré un equipo que comparta esta visión.
</p>

View File

@@ -414,7 +414,7 @@ export const CookiePolicyPage: React.FC = () => {
If you have questions about our use of cookies, please contact us:
</p>
<div className="bg-gray-50 dark:bg-gray-800 p-4 rounded-lg">
<p className="font-semibold">Panadería IA</p>
<p className="font-semibold">{t('common:app.name', 'BakeWise')}</p>
<p>Email: privacy@panaderia-ia.com</p>
<p>Website: https://panaderia-ia.com</p>
</div>

View File

@@ -153,7 +153,7 @@ const FeedbackPage: React.FC = () => {
</div>
<h1 className="text-4xl lg:text-6xl font-extrabold text-[var(--text-primary)] mb-6">
Ayúdanos a Mejorar
<span className="block text-[var(--color-primary)]">Panadería IA</span>
<span className="block text-[var(--color-primary)]">{t('common:app.name', 'BakeWise')}</span>
</h1>
<p className="text-xl text-[var(--text-secondary)] leading-relaxed mb-8">
Tu feedback es fundamental para construir el mejor producto para panaderías

View File

@@ -282,10 +282,10 @@ const LandingPage: React.FC = () => {
</div>
<div className="flex-1">
<h3 className="text-2xl lg:text-3xl font-bold text-[var(--text-primary)] mb-4">
{t('landing:pillar1.title', '🎯 Predice Demanda con Datos de Tu Zona')}
{t('landing:pillars.pillar1.title', '🎯 Predice Demanda con Datos de Tu Zona')}
</h3>
<p className="text-lg text-[var(--text-secondary)] mb-6">
{t('landing:pillar1.intro', 'IA que conoce tu barrio, no solo el calendario. Sabe que el colegio de al lado cierra en agosto, que los viernes hay mercado en tu plaza, y que abrió otra panadería a 500m.')}
{t('landing:pillars.pillar1.intro', 'IA que conoce tu barrio, no solo el calendario. Sabe que el colegio de al lado cierra en agosto, que los viernes hay mercado en tu plaza, y que abrió otra panadería a 500m.')}
</p>
<div className="grid md:grid-cols-2 gap-4">
@@ -293,44 +293,44 @@ const LandingPage: React.FC = () => {
<div className="flex items-center gap-3 mb-2">
<School className="w-5 h-5 text-blue-600" />
<h4 className="font-bold text-[var(--text-primary)]">
{t('landing:pillar1.schools', 'Colegios y Oficinas Cerca')}
{t('landing:pillars.pillar1.schools', 'Colegios y Oficinas Cerca')}
</h4>
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar1.schools_desc', 'Sabe cuándo hay vacaciones, horarios de oficina, eventos escolares')}
{t('landing:pillars.pillar1.schools_desc', 'Sabe cuándo hay vacaciones, horarios de oficina, eventos escolares')}
</p>
</div>
<div className="bg-[var(--bg-secondary)] rounded-lg p-4">
<div className="flex items-center gap-3 mb-2">
<Building2 className="w-5 h-5 text-purple-600" />
<h4 className="font-bold text-[var(--text-primary)]">
{t('landing:pillar1.competition', 'Tu Competencia')}
{t('landing:pillars.pillar1.competition', 'Tu Competencia')}
</h4>
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar1.competition_desc', 'Detecta nuevas panaderías en tu zona y ajusta predicciones')}
{t('landing:pillars.pillar1.competition_desc', 'Detecta nuevas panaderías en tu zona y ajusta predicciones')}
</p>
</div>
<div className="bg-[var(--bg-secondary)] rounded-lg p-4">
<div className="flex items-center gap-3 mb-2">
<Cloud className="w-5 h-5 text-sky-600" />
<h4 className="font-bold text-[var(--text-primary)]">
{t('landing:pillar1.weather', 'Clima Local (AEMET)')}
{t('landing:pillars.pillar1.weather', 'Clima Local')}
</h4>
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar1.weather_desc', 'Lluvia → menos croissants. Calor → más productos frescos')}
{t('landing:pillars.pillar1.weather_desc', 'Lluvia → menos croissants. Calor → más productos frescos')}
</p>
</div>
<div className="bg-[var(--bg-secondary)] rounded-lg p-4">
<div className="flex items-center gap-3 mb-2">
<Target className="w-5 h-5 text-amber-600" />
<h4 className="font-bold text-[var(--text-primary)]">
{t('landing:pillar1.events', 'Eventos y Festivales')}
{t('landing:pillars.pillar1.events', 'Eventos y Festivales')}
</h4>
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar1.events_desc', 'Fiestas del barrio, mercadillos, partidos importantes')}
{t('landing:pillars.pillar1.events_desc', 'Fiestas del barrio, mercadillos, partidos importantes')}
</p>
</div>
</div>
@@ -352,48 +352,48 @@ const LandingPage: React.FC = () => {
</div>
<div className="flex-1">
<h3 className="text-2xl lg:text-3xl font-bold text-[var(--text-primary)] mb-4">
{t('landing:pillar2.title', '🤖 Sistema Automático Cada Mañana')}
{t('landing:pillars.pillar2.title', '🤖 Sistema Automático Cada Mañana')}
</h3>
<p className="text-lg text-[var(--text-secondary)] mb-6">
{t('landing:pillar2.intro', 'Despierta con todo el trabajo hecho. A las 5:30 AM el sistema ya predijo ventas, planificó producción, gestionó inventario y creó pedidos a proveedores.')}
{t('landing:pillars.pillar2.intro', 'Despierta con todo el trabajo hecho. A las 5:30 AM el sistema ya predijo ventas, planificó producción, gestionó inventario y creó pedidos a proveedores.')}
</p>
<div className="space-y-3">
<div className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<p className="text-[var(--text-secondary)]">
<strong>{t('landing:pillar2.step1', 'Predice ventas de hoy:')}</strong> {t('landing:pillar2.step1_desc', '"Harás 80 croissants, 120 barras"')}
<strong>{t('landing:pillars.pillar2.step1', 'Predice ventas de hoy:')}</strong> {t('landing:pillars.pillar2.step1_desc', '"Harás 80 croissants, 120 barras"')}
</p>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<p className="text-[var(--text-secondary)]">
<strong>{t('landing:pillar2.step2', 'Planifica producción:')}</strong> {t('landing:pillar2.step2_desc', 'Lista exacta de lo que hornear')}
<strong>{t('landing:pillars.pillar2.step2', 'Planifica producción:')}</strong> {t('landing:pillars.pillar2.step2_desc', 'Lista exacta de lo que hornear')}
</p>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<p className="text-[var(--text-secondary)]">
<strong>{t('landing:pillar2.step3', 'Gestiona inventario:')}</strong> {t('landing:pillar2.step3_desc', 'Proyecta 7 días → "Te quedarás sin harina en 4 días, pide 50kg hoy"')}
<strong>{t('landing:pillars.pillar2.step3', 'Gestiona inventario:')}</strong> {t('landing:pillars.pillar2.step3_desc', 'Proyecta 7 días → "Te quedarás sin harina en 4 días, pide 50kg hoy"')}
</p>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<p className="text-[var(--text-secondary)]">
<strong>{t('landing:pillar2.step4', 'Previene desperdicios:')}</strong> {t('landing:pillar2.step4_desc', '"Leche caduca en 5 días, no pidas más de 15L"')}
<strong>{t('landing:pillars.pillar2.step4', 'Previene desperdicios:')}</strong> {t('landing:pillars.pillar2.step4_desc', '"Leche caduca en 5 días, no pidas más de 15L"')}
</p>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<p className="text-[var(--text-secondary)]">
<strong>{t('landing:pillar2.step5', 'Crea pedidos:')}</strong> {t('landing:pillar2.step5_desc', 'Listos para aprobar con 1 clic')}
<strong>{t('landing:pillars.pillar2.step5', 'Crea pedidos:')}</strong> {t('landing:pillars.pillar2.step5_desc', 'Listos para aprobar con 1 clic')}
</p>
</div>
</div>
<div className="mt-6 bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20 rounded-lg p-4 border-l-4 border-blue-600">
<p className="font-bold text-[var(--text-primary)]">
{t('landing:pillar2.key', '🔑 Nunca llegas al punto de quedarte sin stock. El sistema lo previene 7 días antes.')}
{t('landing:pillars.pillar2.key', '🔑 Nunca llegas al punto de quedarte sin stock. El sistema lo previene 7 días antes.')}
</p>
</div>
</div>
@@ -408,45 +408,45 @@ const LandingPage: React.FC = () => {
</div>
<div className="flex-1">
<h3 className="text-2xl lg:text-3xl font-bold text-[var(--text-primary)] mb-4">
{t('landing:pillar3.title', 'Tus Datos, Tu Impacto Ambiental')}
{t('landing:pillars.pillar3.title', 'Tus Datos, Tu Impacto Ambiental')}
</h3>
<p className="text-lg text-[var(--text-secondary)] mb-6">
{t('landing:pillar3.intro', '100% de tus datos te pertenecen. Mide tu impacto ambiental automáticamente y genera informes de sostenibilidad que cumplen con los estándares internacionales.')}
{t('landing:pillars.pillar3.intro', '100% de tus datos te pertenecen. Mide tu impacto ambiental automáticamente y genera informes de sostenibilidad que cumplen con los estándares internacionales.')}
</p>
<div className="grid md:grid-cols-3 gap-4 mb-6">
<div className="bg-[var(--bg-secondary)] rounded-lg p-4 text-center">
<div className="text-3xl font-bold text-green-600 mb-2">
{t('landing:pillar3.data_ownership_value', '100%')}
{t('landing:pillars.pillar3.data_ownership_value', '100%')}
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar3.data_ownership', 'Propiedad de datos')}
{t('landing:pillars.pillar3.data_ownership', 'Propiedad de datos')}
</p>
</div>
<div className="bg-[var(--bg-secondary)] rounded-lg p-4 text-center">
<div className="text-3xl font-bold text-blue-600 mb-2">
{t('landing:pillar3.co2_metric', 'CO₂')}
{t('landing:pillars.pillar3.co2_metric', 'CO₂')}
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar3.co2', 'Medición automática')}
{t('landing:pillars.pillar3.co2', 'Medición automática')}
</p>
</div>
<div className="bg-[var(--bg-secondary)] rounded-lg p-4 text-center">
<div className="text-3xl font-bold text-amber-600 mb-2">
{t('landing:pillar3.sdg_value', 'ODS 12.3')}
{t('landing:pillars.pillar3.sdg_value', 'ODS 12.3')}
</div>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar3.sdg', 'Seguimiento de cumplimiento')}
{t('landing:pillars.pillar3.sdg', 'Seguimiento de cumplimiento')}
</p>
</div>
</div>
<div className="bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border-l-4 border-green-600">
<p className="font-bold text-[var(--text-primary)] mb-2">
{t('landing:pillar3.sustainability_title', 'Informes de Sostenibilidad Automatizados')}
{t('landing:pillars.pillar3.sustainability_title', 'Informes de Sostenibilidad Automatizados')}
</p>
<p className="text-sm text-[var(--text-secondary)]">
{t('landing:pillar3.sustainability_desc', 'Genera informes que cumplen con los estándares internacionales de sostenibilidad y reducción de desperdicio alimentario')}
{t('landing:pillars.pillar3.sustainability_desc', 'Genera informes que cumplen con los estándares internacionales de sostenibilidad y reducción de desperdicio alimentario')}
</p>
</div>
</div>
@@ -456,7 +456,7 @@ const LandingPage: React.FC = () => {
{/* Link to Features Page */}
<div className="mt-12 text-center">
<Link to="/features" className="inline-flex items-center gap-2 text-[var(--color-primary)] hover:text-[var(--color-primary-dark)] font-semibold text-lg group">
<Link to="/features" className="inline-flex items-center gap-2 text-[var(--color-primary)] hover:text-white font-semibold text-lg group px-6 py-3 rounded-lg transition-all duration-200 hover:bg-[var(--color-primary)] no-underline">
{t('landing:pillars.see_all', 'Ver todas las funcionalidades en detalle')}
<ChevronRight className="w-5 h-5 group-hover:translate-x-1 transition-transform" />
</Link>
@@ -571,6 +571,10 @@ const LandingPage: React.FC = () => {
<Check className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<span className="text-[var(--text-secondary)]">{t('landing:pilot.we_ask.item2', 'Tarjeta de crédito (sin cargo por 3 meses)')}</span>
</li>
<li className="flex items-start gap-2">
<Check className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
<span className="text-[var(--text-secondary)]">{t('landing:pilot.we_ask.item3', 'Comprensión de que es un programa piloto y feedback semanal sobre fallos y mejoras')}</span>
</li>
</ul>
</div>
</div>

View File

@@ -35,7 +35,7 @@ export const PrivacyPolicyPage: React.FC = () => {
The data controller responsible for your personal data is:
</p>
<div className="bg-gray-50 dark:bg-gray-800 p-4 rounded-lg mb-4">
<p className="font-semibold">Panadería IA</p>
<p className="font-semibold">{t('common:app.name', 'BakeWise')}</p>
<p>Email: privacy@panaderia-ia.com</p>
<p>Website: https://panaderia-ia.com</p>
</div>

View File

@@ -32,13 +32,13 @@ export const TermsOfServicePage: React.FC = () => {
1. {t('legal:terms.section_1_title', 'Agreement to Terms')}
</h2>
<p className="text-gray-700 dark:text-gray-300 mb-4">
By accessing or using Panadería IA ("the Platform", "our Service"), you agree to be
By accessing or using {t('common:app.name', 'BakeWise')} ("the Platform", "our Service"), you agree to be
bound by these Terms of Service ("Terms"). If you do not agree to these Terms, do not
use the Platform.
</p>
<p className="text-gray-700 dark:text-gray-300">
These Terms constitute a legally binding agreement between you ("User", "you", "your")
and Panadería IA regarding your use of the Platform.
and {t('common:app.name', 'BakeWise')} regarding your use of the Platform.
</p>
</section>
@@ -47,7 +47,7 @@ export const TermsOfServicePage: React.FC = () => {
2. {t('legal:terms.section_2_title', 'Description of Service')}
</h2>
<p className="text-gray-700 dark:text-gray-300 mb-4">
Panadería IA provides a comprehensive bakery management platform that includes:
{t('common:app.name', 'BakeWise')} provides a comprehensive bakery management platform that includes:
</p>
<ul className="list-disc pl-6 mb-4 text-gray-700 dark:text-gray-300 space-y-1">
<li>Inventory management and tracking</li>
@@ -176,7 +176,7 @@ export const TermsOfServicePage: React.FC = () => {
6.1 Platform Ownership
</h3>
<p className="text-gray-700 dark:text-gray-300 mb-4">
The Platform and all content, features, and functionality are owned by Panadería IA and
The Platform and all content, features, and functionality are owned by {t('common:app.name', 'BakeWise')} and
are protected by international copyright, trademark, and other intellectual property laws.
</p>
@@ -197,7 +197,7 @@ export const TermsOfServicePage: React.FC = () => {
6.3 Trademarks
</h3>
<p className="text-gray-700 dark:text-gray-300">
"Panadería IA" and our logo are trademarks. You may not use our trademarks without
"{t('common:app.name', 'BakeWise')}" and our logo are trademarks. You may not use our trademarks without
prior written consent.
</p>
</section>
@@ -300,7 +300,7 @@ export const TermsOfServicePage: React.FC = () => {
10. {t('legal:terms.section_10_title', 'Indemnification')}
</h2>
<p className="text-gray-700 dark:text-gray-300">
You agree to indemnify and hold harmless Panadería IA from any claims, damages, losses,
You agree to indemnify and hold harmless {t('common:app.name', 'BakeWise')} from any claims, damages, losses,
liabilities, and expenses (including legal fees) arising from:
</p>
<ul className="list-disc pl-6 mb-4 text-gray-700 dark:text-gray-300 space-y-1">
@@ -364,7 +364,7 @@ export const TermsOfServicePage: React.FC = () => {
</h3>
<p className="text-gray-700 dark:text-gray-300 mb-4">
These Terms, together with our Privacy Policy and Cookie Policy, constitute the entire
agreement between you and Panadería IA.
agreement between you and {t('common:app.name', 'BakeWise')}.
</p>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white mb-3">
@@ -398,7 +398,7 @@ export const TermsOfServicePage: React.FC = () => {
For questions about these Terms, contact us at:
</p>
<div className="bg-gray-50 dark:bg-gray-800 p-4 rounded-lg">
<p className="font-semibold">Panadería IA</p>
<p className="font-semibold">{t('common:app.name', 'BakeWise')}</p>
<p>Email: legal@panaderia-ia.com</p>
<p>Website: https://panaderia-ia.com</p>
</div>