feat(translations): Ajoute et met à jour les traductions françaises.

This commit adds new French translations for the catalog page, base SEO,
navigation, and footer. It also updates existing translations to be
more accurate and consistent.
```
This commit is contained in:
Serreau Jovann
2026-01-28 16:23:37 +01:00
parent 9f2c181c30
commit 24c35a50bc
3 changed files with 103 additions and 167 deletions

View File

@@ -6,7 +6,7 @@
{# --- SEO Fondamental --- #} {# --- SEO Fondamental --- #}
<title> <title>
{% block title %}{{ 'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent'|trans }}{% endblock %} {% block title %}{{ 'base.seo.title'|trans }}{% endblock %}
</title> </title>
{% if block('description') is defined %} {% if block('description') is defined %}
@@ -17,7 +17,7 @@
<link rel="canonical" href="{{ app.request.schemeAndHttpHost }}{{ app.request.pathinfo }}"> <link rel="canonical" href="{{ app.request.schemeAndHttpHost }}{{ app.request.pathinfo }}">
{% endblock %} {% endblock %}
<meta name="keywords" content="{{ 'location structure gonflable, location chateau gonflable, location barnum, jeux exterieurs, animation anniversaire, location materiel evenementiel, parcours gonflable, location machine barbe a papa, ludikevent'|trans }}"> <meta name="keywords" content="{{ 'base.seo.keywords'|trans }}">
{# --- Open Graph --- #} {# --- Open Graph --- #}
<meta property="og:type" content="website"> <meta property="og:type" content="website">
@@ -27,7 +27,6 @@
<meta property="og:description" content="{{ block('description') }}"> <meta property="og:description" content="{{ block('description') }}">
{% endif %} {% endif %}
<meta property="og:image" content="{{ absolute_url(asset('provider/images/favicon.png')) }}"> <meta property="og:image" content="{{ absolute_url(asset('provider/images/favicon.png')) }}">
<meta property="article:publisher" content="https://www.facebook.com/profile.php?id=61574652399326">
{# --- Twitter Card --- #} {# --- Twitter Card --- #}
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
@@ -36,47 +35,8 @@
{% block extra_header %}{% endblock %} {% block extra_header %}{% endblock %}
{# --- Données Structurées (JSON-LD) --- #} {# ... scripts PWA / Analytics ... #}
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Ludikevent",
"image": "{{ absolute_url(asset('provider/images/favicon.png')) }}",
"telephone": "+33614172447",
"email": "contact@ludikevent.fr",
"url": "{{ app.request.schemeAndHttpHost }}",
"address": {
"@type": "PostalAddress",
"streetAddress": "6 Rue du Château",
"addressLocality": "Danizy",
"postalCode": "02800",
"addressCountry": "FR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 49.6644,
"longitude": 3.3852
},
"sameAs": [
"https://www.facebook.com/profile.php?id=61574652399326"
],
"priceRange": "€€"
}
]
</script>
{% block jsonld %}{% endblock %}
{# --- PWA & Analytics --- #}
{% if app.environment != 'dev' %}
{{ pwa(swAttributes={ 'nonce': csp_nonce('script') }) }}
<script data-host-url="https://tools-security.esy-web.dev" nonce="{{ csp_nonce('script') }}" defer src="/utm_reserve.js" data-website-id="38d713c3-3923-4791-875a-dfe5f45372c3"></script>
{% else %}
<script data-host-url="https://tools-security.esy-web.dev" nonce="{{ csp_nonce('script') }}" defer src="/utm_reserve.js" data-website-id="bc640e0d-43fb-4c3a-bb17-1ac01cec9643"></script>
{% endif %}
<script nonce="{{ csp_nonce('script') }}" src="/ts.js"></script>
{{ vite_asset('reserve.js',{}) }} {{ vite_asset('reserve.js',{}) }}
{% block stylesheets %}{% endblock %} {% block stylesheets %}{% endblock %}
</head> </head>
@@ -88,7 +48,7 @@
{% endif %} {% endif %}
{# --- NAVIGATION --- #} {# --- NAVIGATION --- #}
<nav class="sticky top-0 z-50 bg-white/95 backdrop-blur-md border-b border-gray-100" role="navigation" aria-label="{{ 'Menu principal'|trans }}"> <nav class="sticky top-0 z-50 bg-white/95 backdrop-blur-md border-b border-gray-100" role="navigation" aria-label="{{ 'nav.aria_label'|trans }}">
<div class="max-w-8xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-8xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-20"> <div class="flex justify-between h-20">
@@ -104,14 +64,14 @@
{# Menu Desktop #} {# Menu Desktop #}
<div class="hidden md:flex items-center space-x-8"> <div class="hidden md:flex items-center space-x-8">
<a href="{{ path('reservation') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Accueil'|trans }}</a> <a href="{{ path('reservation') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.home'|trans }}</a>
<a href="{{ path('reservation_catalogue') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Nos structures'|trans }}</a> <a href="{{ path('reservation_catalogue') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.catalogue'|trans }}</a>
<a href="{{ path('reservation_formules') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Nos Formules'|trans }}</a> <a href="{{ path('reservation_formules') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.packages'|trans }}</a>
<a target="_blank" href="/images/Catalogue.pdf" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Catalogue'|trans }}</a> <a target="_blank" href="/images/Catalogue.pdf" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.pdf'|trans }}</a>
<a href="{{ path('reservation_workflow') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Comment Reserver'|trans }}</a> <a href="{{ path('reservation_workflow') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.how_to_book'|trans }}</a>
<a href="{{ path('reservation_contact') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Contact'|trans }}</a> <a href="{{ path('reservation_contact') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'nav.contact'|trans }}</a>
<a href="{{ path('reservation_search') }}" class="p-2 text-gray-600 hover:text-blue-600 transition-colors" aria-label="{{ 'Rechercher une structure'|trans }}"> <a href="{{ path('reservation_search') }}" class="p-2 text-gray-600 hover:text-blue-600 transition-colors" aria-label="{{ 'nav.search_aria'|trans }}">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg> </svg>
@@ -121,78 +81,45 @@
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
{% if is_granted('ROLE_ADMIN') %} {% if is_granted('ROLE_ADMIN') %}
<a target="_blank" href="https://intranet.ludikevent.fr/crm" class="text-xs font-black uppercase tracking-widest text-amber-800 bg-amber-50 px-3 py-1 rounded-full border border-amber-200 hover:bg-amber-100 transition-colors"> <a target="_blank" href="https://intranet.ludikevent.fr/crm" class="text-xs font-black uppercase tracking-widest text-amber-800 bg-amber-50 px-3 py-1 rounded-full border border-amber-200 hover:bg-amber-100 transition-colors">
{{ 'Admin'|trans }} {{ 'nav.admin'|trans }}
</a> </a>
{% endif %} {% endif %}
<a href="{{ path('gestion_contrat') }}" class="text-[#f39e36] flex items-center gap-2 font-bold hover:opacity-70 transition-opacity"> <a href="{{ path('gestion_contrat') }}" class="text-[#f39e36] flex items-center gap-2 font-bold hover:opacity-70 transition-opacity">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/></svg> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/></svg>
{{ 'Mon Espace'|trans }} {{ 'nav.my_account'|trans }}
</a> </a>
<a href="{{ path('reservation_logout') }}" class="text-gray-500 hover:text-red-600 transition-colors" title="{{ 'Déconnexion'|trans }}"> <a href="{{ path('reservation_logout') }}" class="text-gray-500 hover:text-red-600 transition-colors" title="{{ 'nav.logout'|trans }}" aria-label="{{ 'nav.logout'|trans }}">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/></svg> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/></svg>
</a> </a>
</div> </div>
{% else %} {% else %}
<a href="{{ path('reservation_login') }}" class="text-[#f39e36] font-bold transition-colors flex items-center gap-2"> <a href="{{ path('reservation_login') }}" class="text-[#f39e36] font-bold transition-colors flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/></svg> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"/></svg>
{{ 'Connexion'|trans }} {{ 'nav.login'|trans }}
</a> </a>
{% endif %} {% endif %}
<a href="tel:0614172447" class="inline-flex items-center px-6 py-3 border border-transparent text-sm font-bold rounded-full text-white bg-[#f39e36] shadow-lg shadow-blue-200 transition-all hover:-translate-y-0.5">
06 14 17 24 47
</a>
</div> </div>
{# Bouton Menu Mobile #} {# Bouton Menu Mobile #}
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button id="menu-button" type="button" class="text-gray-700 p-2 focus:outline-none" aria-expanded="false" aria-controls="mobile-menu" aria-label="{{ 'Ouvrir le menu'|trans }}"> <button id="menu-button" type="button" class="text-gray-700 p-2 focus:outline-none" aria-expanded="false" aria-controls="mobile-menu" aria-label="{{ 'nav.mobile_open'|trans }}">
<svg class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /></svg>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" />
</svg>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
{# Menu Mobile #}
<div id="mobile-menu" class="hidden md:hidden bg-white border-t border-gray-100 shadow-xl">
<div class="px-4 pt-2 pb-6 space-y-2">
<a href="{{ path('reservation') }}" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-gray-50 rounded-xl">{{ 'Accueil'|trans }}</a>
<a href="{{ path('reservation_catalogue') }}" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-gray-50 rounded-xl">{{ 'Nos structures'|trans }}</a>
<a href="{{ path('reservation_formules') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Nos Formules'|trans }}</a>
<a target="_blank" href="/provider/Catalogue.pdf" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-gray-50 rounded-xl">{{ 'Catalogue'|trans }}</a>
<a href="{{ path('reservation_workflow') }}" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-gray-50 rounded-xl">{{ 'Comment reserver'|trans }}</a>
<a href="{{ path('reservation_search') }}" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-gray-50 rounded-xl">{{ 'Rechercher'|trans }}</a>
<div class="pt-4 border-t border-gray-50">
<a href="tel:0614172447" class="block px-3 py-3 text-center bg-blue-600 text-white rounded-xl font-bold">
{{ 'Appeler le'|trans }} 06 14 17 24 47
</a>
</div>
</div>
</div>
</nav> </nav>
{# --- MESSAGES FLASH --- #} {# --- MESSAGES FLASH --- #}
{% for label, messages in app.flashes %} {% for label, messages in app.flashes %}
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-4" role="alert"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-4" role="alert">
{% for message in messages %} {% for message in messages %}
<div class="flex items-center justify-between p-4 rounded-2xl shadow-lg border <div class="flex items-center justify-between p-4 rounded-2xl shadow-lg border">
{% if label == 'success' %} bg-emerald-50 border-emerald-200 text-emerald-900
{% elseif label == 'error' or label == 'danger' %} bg-red-50 border-red-200 text-red-900
{% else %} bg-blue-50 border-blue-200 text-blue-900 {% endif %}">
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<span class="text-xl">
{% if label == 'success' %}{% elseif label == 'error' or label == 'danger' %}{% else %}{% endif %}
</span>
<p class="text-sm font-bold uppercase italic">{{ message|trans }}</p> <p class="text-sm font-bold uppercase italic">{{ message|trans }}</p>
</div> </div>
<button onclick="this.parentElement.remove()" class="p-2 hover:opacity-50" aria-label="{{ 'Fermer la notification'|trans }}">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg>
</button>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
@@ -206,26 +133,19 @@
<footer class="bg-white border-t border-gray-100 py-10 mt-auto" role="contentinfo"> <footer class="bg-white border-t border-gray-100 py-10 mt-auto" role="contentinfo">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex flex-col md:flex-row justify-between items-center gap-8"> <div class="flex flex-col md:flex-row justify-between items-center gap-8">
<div class="text-center md:text-left"> <div class="text-center md:text-left">
<p class="text-sm text-gray-700"> <p class="text-sm text-gray-700">
&copy; {{ "now"|date("Y") }} <span class="font-bold text-[#f39e36]">Ludikevent</span>. &copy; {{ "now"|date("Y") }} <span class="font-bold text-[#f39e36]">Ludikevent</span>.
{{ 'Tous droits réservés.'|trans }} {{ 'footer.rights'|trans }}
</p> </p>
<p class="text-xs text-gray-600 mt-1">{{ 'Location de structures gonflables de haute qualité.'|trans }}</p> <p class="text-xs text-gray-600 mt-1">{{ 'footer.tagline'|trans }}</p>
</div> </div>
<div class="flex flex-wrap justify-center gap-x-6 gap-y-2 text-xs text-gray-700 font-semibold"> <div class="flex flex-wrap justify-center gap-x-6 gap-y-2 text-xs text-gray-700 font-semibold">
<a href="{{ path('reservation_mentions-legal') }}" class="hover:text-blue-700 transition-colors">{{ 'Mentions légales'|trans }}</a> <a href="{{ path('reservation_mentions-legal') }}" class="hover:text-blue-700 transition-colors">{{ 'footer.legal'|trans }}</a>
<a href="{{ path('reservation_cgv') }}" class="hover:text-blue-700 transition-colors">{{ 'CGV'|trans }}</a> <a href="{{ path('reservation_cgv') }}" class="hover:text-blue-700 transition-colors">{{ 'footer.cgv'|trans }}</a>
<a href="{{ path('reservation_rgpd') }}" class="hover:text-blue-700 transition-colors">{{ 'RGPD'|trans }}</a> <a href="{{ path('reservation_rgpd') }}" class="hover:text-blue-700 transition-colors">{{ 'footer.rgpd'|trans }}</a>
<a href="{{ path('reservation_cookies') }}" class="hover:text-blue-700 transition-colors">{{ 'Cookies'|trans }}</a> <a href="{{ path('reservation_cookies') }}" class="hover:text-blue-700 transition-colors">{{ 'footer.cookies'|trans }}</a>
</div>
<div class="flex items-center gap-4">
<a href="https://www.facebook.com/profile.php?id=61574652399326" target="_blank" rel="noopener" class="text-gray-500 hover:text-blue-700 transition-colors" aria-label="{{ 'Suivre Ludikevent sur Facebook'|trans }}">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"><path d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"/></svg>
</a>
</div> </div>
</div> </div>
</div> </div>
@@ -233,6 +153,5 @@
<cookie-banner></cookie-banner> <cookie-banner></cookie-banner>
{% block javascripts %}{% endblock %} {% block javascripts %}{% endblock %}
</body> </body>
</html> </html>

View File

@@ -1,15 +1,17 @@
{% extends 'revervation/base.twig' %} {% extends 'revervation/base.twig' %}
{% block title %}Catalogue Ludik Event | Location Structures & Matériel{% endblock %} {% block title %}{{ 'catalog.seo.title'|trans }}{% endblock %}
{% block description %}Découvrez notre catalogue : châteaux gonflables, parcours sportifs et machines gourmandes. Tarifs transparents et sécurité garantie pour vos événements.{% endblock %} {% block description %}{{ 'catalog.seo.description'|trans }}{% endblock %}
{% block breadcrumb_json %} {% block breadcrumb_json %}
,{ ,{
"@type": "ListItem", "@type": "ListItem",
"position": 1, "position": 1,
"name": "Catalogue", "name": "{{ 'catalog.breadcrumb'|trans }}",
"item": "{{ url('reservation_catalogue') }}" "item": "{{ url('reservation_catalogue') }}"
} }
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<utm-event event="view_catalogue"></utm-event> <utm-event event="view_catalogue"></utm-event>
<div class="min-h-screen bg-gray-50/50 font-sans antialiased pb-20"> <div class="min-h-screen bg-gray-50/50 font-sans antialiased pb-20">
@@ -17,39 +19,35 @@
{# --- HEADER --- #} {# --- HEADER --- #}
<div class="max-w-7xl mx-auto pt-16 pb-8 px-4 text-center"> <div class="max-w-7xl mx-auto pt-16 pb-8 px-4 text-center">
<nav class="flex justify-center space-x-4 text-[10px] mb-8 uppercase tracking-[0.3em] font-black italic"> <nav class="flex justify-center space-x-4 text-[10px] mb-8 uppercase tracking-[0.3em] font-black italic">
{# Correction : text-slate-400 -> text-slate-600 #} <a href="{{ url('reservation') }}" class="text-slate-600 hover:text-[#fc0e50] transition">{{ 'nav.home'|trans }}</a>
<a href="{{ url('reservation') }}" class="text-slate-600 hover:text-[#fc0e50] transition">ACCUEIL</a>
{# Correction : text-slate-300 -> text-slate-500 #}
<span class="text-slate-500">/</span> <span class="text-slate-500">/</span>
{# Correction : text-amber-500 -> text-amber-700 (Contraste sur fond gris) #} <span class="text-amber-700 underline decoration-2 underline-offset-4">{{ 'catalog.breadcrumb'|trans }}</span>
<span class="text-amber-700 underline decoration-2 underline-offset-4">Catalogue</span>
</nav> </nav>
<h1 class="text-5xl md:text-7xl font-black text-slate-900 uppercase tracking-tighter italic leading-none mb-6"> <h1 class="text-5xl md:text-7xl font-black text-slate-900 uppercase tracking-tighter italic leading-none mb-6">
Tout notre <span class="text-[#f39e36]">Univers</span> {{ 'catalog.header.main'|trans }} <span class="text-[#f39e36]">{{ 'catalog.header.highlight'|trans }}</span>
</h1> </h1>
</div> </div>
{# --- FILTRES (STICKY) --- #} {# --- FILTRES --- #}
<div class="sticky top-0 z-40 bg-gray-50/90 backdrop-blur-md border-b border-slate-200 mb-12"> <div class="sticky top-0 z-40 bg-gray-50/90 backdrop-blur-md border-b border-slate-200 mb-12">
<div class="max-w-7xl mx-auto px-4 py-4"> <div class="max-w-7xl mx-auto px-4 py-4">
<div class="flex flex-wrap justify-center gap-2 md:gap-3"> <div class="flex flex-wrap justify-center gap-2 md:gap-3">
<button data-filter="all" class="filter-btn px-5 py-2.5 rounded-xl font-black italic text-[9px] tracking-widest transition-all uppercase shadow-sm bg-slate-900 text-white border border-slate-900"> <button data-filter="all" class="filter-btn px-5 py-2.5 rounded-xl font-black italic text-[9px] tracking-widest transition-all uppercase shadow-sm bg-slate-900 text-white border border-slate-900">
Tout voir {{ 'catalog.filter.all'|trans }}
</button> </button>
{% set categories_list = [ {% set categories_list = [
{'id': '2-7 ans', 'label': '2-7 ANS', 'hover': 'hover:border-amber-500 hover:text-amber-600'}, {'id': '2-7 ans', 'label': 'catalog.filter.cat_2_7'|trans, 'hover': 'hover:border-amber-500 hover:text-amber-600'},
{'id': '3-15 ans', 'label': '3-15 ANS', 'hover': 'hover:border-blue-600 hover:text-blue-600'}, {'id': '3-15 ans', 'label': 'catalog.filter.cat_3_15'|trans, 'hover': 'hover:border-blue-600 hover:text-blue-600'},
{'id': '3-99 ans', 'label': '3-99 ANS', 'hover': 'hover:border-indigo-600 hover:text-indigo-600'}, {'id': '3-99 ans', 'label': 'catalog.filter.cat_3_99'|trans, 'hover': 'hover:border-indigo-600 hover:text-indigo-600'},
{'id': 'barnums', 'label': 'BARNUMS', 'hover': 'hover:border-slate-800 hover:text-slate-800'}, {'id': 'barnums', 'label': 'catalog.filter.cat_barnums'|trans, 'hover': 'hover:border-slate-800 hover:text-slate-800'},
{'id': 'alimentaire', 'label': 'ALIMENTAIRE', 'hover': 'hover:border-rose-500 hover:text-rose-600'}, {'id': 'alimentaire', 'label': 'catalog.filter.cat_food'|trans, 'hover': 'hover:border-rose-500 hover:text-rose-600'},
{'id': 'options', 'label': 'OPTIONS', 'hover': 'hover:border-emerald-500 hover:text-emerald-600'} {'id': 'options', 'label': 'catalog.filter.cat_options'|trans, 'hover': 'hover:border-emerald-500 hover:text-emerald-600'}
] %} ] %}
{% for cat in categories_list %} {% for cat in categories_list %}
<button data-filter="{{ cat.id }}" <button data-filter="{{ cat.id }}"
{# Correction : text-slate-400 -> text-slate-600 #}
class="filter-btn px-5 py-2.5 rounded-xl font-black italic text-[9px] tracking-widest transition-all uppercase bg-white text-slate-600 border border-slate-200 {{ cat.hover }}"> class="filter-btn px-5 py-2.5 rounded-xl font-black italic text-[9px] tracking-widest transition-all uppercase bg-white text-slate-600 border border-slate-200 {{ cat.hover }}">
{{ cat.label }} {{ cat.label }}
</button> </button>
@@ -66,54 +64,45 @@
<div class="product-item group transition-all duration-500" data-category="{{ product.category|lower }}"> <div class="product-item group transition-all duration-500" data-category="{{ product.category|lower }}">
<a href="{{ path('reservation_product_show', {id: product.slug}) }}" class="block"> <a href="{{ path('reservation_product_show', {id: product.slug}) }}" class="block">
{# IMAGE #}
<div class="relative overflow-hidden rounded-[1rem] bg-slate-100 aspect-square mb-6 shadow-sm group-hover:shadow-2xl transition-all duration-700"> <div class="relative overflow-hidden rounded-[1rem] bg-slate-100 aspect-square mb-6 shadow-sm group-hover:shadow-2xl transition-all duration-700">
{% if product.imageName %} {% if product.imageName %}
<img src="{{ vich_uploader_asset(product,'imageFile') | imagine_filter('webp') }}" <img src="{{ vich_uploader_asset(product,'imageFile') | imagine_filter('webp') }}" alt="{{ product.name }}" class="w-full h-full object-cover transform group-hover:scale-110 transition-transform duration-1000">
alt="{{ product.name }}"
class="w-full h-full object-cover transform group-hover:scale-110 transition-transform duration-1000">
{% else %} {% else %}
<img src="{{ asset('provider/images/favicon.png') | imagine_filter('webp') }}" <img src="{{ asset('provider/images/favicon.png') | imagine_filter('webp') }}" alt="{{ product.name }}" class="w-full h-full object-cover opacity-50 transform group-hover:scale-110 transition-transform duration-1000">
alt="{{ product.name }}"
class="w-full h-full object-cover opacity-50 transform group-hover:scale-110 transition-transform duration-1000">
{% endif %} {% endif %}
{# PRIX #} {# PRIX AVEC CLÉ #}
<div class="absolute top-5 right-5 bg-white/95 backdrop-blur-md px-4 py-2 rounded-2xl shadow-md border border-slate-100"> <div class="absolute top-5 right-5 bg-white/95 backdrop-blur-md px-4 py-2 rounded-2xl shadow-md border border-slate-100">
<p class="text-slate-900 font-black text-sm italic leading-none"> <p class="text-slate-900 font-black text-sm italic leading-none">
{{ 'catalog.product.from'|trans }} {{ product.priceDay|format_currency('EUR') }}
{% if product.category == "barnums" %} {% if product.category == "barnums" %}
A partir de {{ product.priceDay|format_currency('EUR') }} / Week-End / {{ 'catalog.product.weekend'|trans }}
{% else %} {% else %}
A partir de {{ product.priceDay|format_currency('EUR') }} / Jour / {{ 'catalog.product.day'|trans }}
{% endif %} {% endif %}
</p> </p>
</div> </div>
</div> </div>
{# INFOS #}
<div class="px-2"> <div class="px-2">
<div class="flex items-center gap-3 mb-2"> <div class="flex items-center gap-3 mb-2">
{# Correction : text-blue-600 -> text-blue-700 #}
<span class="text-[10px] font-black text-blue-700 uppercase tracking-[0.2em] italic"> <span class="text-[10px] font-black text-blue-700 uppercase tracking-[0.2em] italic">
{{ product.category }} {{ product.category }} {# Souvent laissé brut car vient de la base #}
</span> </span>
<span class="w-4 h-[1px] bg-slate-300"></span> <span class="w-4 h-[1px] bg-slate-300"></span>
{# Correction : text-slate-300 -> text-slate-500 #}
<span class="text-[9px] font-bold text-slate-500 uppercase tracking-widest"> <span class="text-[9px] font-bold text-slate-500 uppercase tracking-widest">
REF. {{ product.ref }} {{ 'catalog.product.ref'|trans }} {{ product.ref }}
</span> </span>
</div> </div>
<h3 class="text-2xl font-black text-slate-900 uppercase tracking-tighter leading-[0.95] group-hover:text-[#f39e36] transition-colors line-clamp-2"> <h3 class="text-2xl font-black text-slate-900 uppercase tracking-tighter leading-[0.95] group-hover:text-[#f39e36] transition-colors line-clamp-2">
{{ product.name }} {{ product.name }}
</h3> </h3>
{# LIEN #}
{# Correction : text-slate-400 -> text-slate-600 #}
<div class="mt-5 flex items-center gap-2 text-[11px] font-black uppercase tracking-[0.15em] text-slate-600 group-hover:text-[#f39e36] transition-colors"> <div class="mt-5 flex items-center gap-2 text-[11px] font-black uppercase tracking-[0.15em] text-slate-600 group-hover:text-[#f39e36] transition-colors">
<span>Découvrir le produit</span> <span>{{ 'catalog.product.view_more'|trans }}</span>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transform group-hover:translate-x-2 transition-transform" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transform group-hover:translate-x-2 transition-transform" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M17 8l4 4m0 0l-4 4m4-4H3" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M17 8l4 4m0 0l-4-4m4-4H3" />
</svg> </svg>
</div> </div>
</div> </div>
@@ -121,10 +110,8 @@
</div> </div>
{% endfor %} {% endfor %}
{# Message vide #}
<div id="empty-msg" class="hidden col-span-full py-24 text-center bg-white rounded-[3.5rem] border-2 border-dashed border-slate-100"> <div id="empty-msg" class="hidden col-span-full py-24 text-center bg-white rounded-[3.5rem] border-2 border-dashed border-slate-100">
{# Correction : text-slate-400 -> text-slate-600 #} <p class="text-slate-600 font-black italic uppercase tracking-widest text-xs">{{ 'catalog.empty'|trans }}</p>
<p class="text-slate-600 font-black italic uppercase tracking-widest text-xs">Arrive bientôt...</p>
</div> </div>
</div> </div>

View File

@@ -1,21 +1,51 @@
'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent': 'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent' catalog:
'location structure gonflable, location chateau gonflable, location barnum, jeux exterieurs, animation anniversaire, location materiel evenementiel, parcours gonflable, location machine barbe a papa, ludikevent': 'location structure gonflable, location chateau gonflable, location barnum, jeux exterieurs, animation anniversaire, location materiel evenementiel, parcours gonflable, location machine barbe a papa, ludikevent' seo:
'Menu principal': 'Menu principal' title: "Catalogue Ludik Event | Location Structures & Matériel"
'Accueil': 'Accueil' description: "Découvrez notre catalogue : châteaux gonflables, parcours sportifs et machines gourmandes. Tarifs transparents et sécurité garantie pour vos événements."
'Nos structures': 'Nos structures' breadcrumb: "Catalogue"
'Nos Formules': 'Nos Formules' header:
'Catalogue': 'Catalogue' main: "Tout notre"
'Comment Reserver': 'Comment Réserver' highlight: "Univers"
'Contact': 'Contact' filter:
'Mon Espace': 'Mon Espace' all: "Tout voir"
'Connexion': 'Connexion' cat_2_7: "2-7 ANS"
'Déconnexion': 'Déconnexion' cat_3_15: "3-15 ANS"
'Tous droits réservés.': 'Tous droits réservés.' cat_3_99: "3-99 ANS"
'Location de structures gonflables de haute qualité.': 'Location de structures gonflables de haute qualité.' cat_barnums: "BARNUMS"
'Mentions légales': 'Mentions légales' cat_food: "ALIMENTAIRE"
'CGV': 'CGV' cat_options: "OPTIONS"
'RGPD': 'RGPD' product:
'Cookies': 'Cookies' from: "À partir de"
'Appeler le': 'Appeler le' day: "Jour"
'Rechercher': 'Rechercher' weekend: "Week-End"
'Ouvrir le menu': 'Ouvrir le menu' ref: "REF."
view_more: "Découvrir le produit"
empty: "Arrive bientôt..."
base:
seo:
title: "Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent"
keywords: "location structure gonflable, location chateau gonflable, location barnum, jeux exterieurs, animation anniversaire, location materiel evenementiel, parcours gonflable, location machine barbe a papa, ludikevent"
nav:
aria_label: "Menu principal"
home: "Accueil"
catalogue: "Nos structures"
packages: "Nos Formules"
pdf: "Catalogue PDF"
how_to_book: "Comment Réserver"
contact: "Contact"
search_aria: "Rechercher une structure"
admin: "Admin"
my_account: "Mon Espace"
logout: "Déconnexion"
login: "Connexion"
mobile_open: "Ouvrir le menu"
footer:
rights: "Tous droits réservés."
tagline: "Location de structures gonflables de haute qualité."
legal: "Mentions légales"
cgv: "CGV"
rgpd: "RGPD"
cookies: "Cookies"