```
✨ 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:
@@ -6,7 +6,7 @@
|
||||
|
||||
{# --- SEO Fondamental --- #}
|
||||
<title>
|
||||
{% block title %}{{ 'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent'|trans }}{% endblock %}
|
||||
{% block title %}{{ 'base.seo.title'|trans }}{% endblock %}
|
||||
</title>
|
||||
|
||||
{% if block('description') is defined %}
|
||||
@@ -17,7 +17,7 @@
|
||||
<link rel="canonical" href="{{ app.request.schemeAndHttpHost }}{{ app.request.pathinfo }}">
|
||||
{% 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 --- #}
|
||||
<meta property="og:type" content="website">
|
||||
@@ -27,7 +27,6 @@
|
||||
<meta property="og:description" content="{{ block('description') }}">
|
||||
{% endif %}
|
||||
<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 --- #}
|
||||
<meta name="twitter:card" content="summary">
|
||||
@@ -36,47 +35,8 @@
|
||||
|
||||
{% block extra_header %}{% endblock %}
|
||||
|
||||
{# --- Données Structurées (JSON-LD) --- #}
|
||||
<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 %}
|
||||
{# ... scripts PWA / Analytics ... #}
|
||||
|
||||
{# --- 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',{}) }}
|
||||
{% block stylesheets %}{% endblock %}
|
||||
</head>
|
||||
@@ -88,7 +48,7 @@
|
||||
{% endif %}
|
||||
|
||||
{# --- 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="flex justify-between h-20">
|
||||
|
||||
@@ -104,14 +64,14 @@
|
||||
|
||||
{# Menu Desktop #}
|
||||
<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_catalogue') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ '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="/images/Catalogue.pdf" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Catalogue'|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_contact') }}" class="text-gray-700 hover:text-blue-600 font-medium transition-colors">{{ 'Contact'|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">{{ 'nav.catalogue'|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">{{ 'nav.pdf'|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">{{ '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">
|
||||
<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>
|
||||
@@ -121,78 +81,45 @@
|
||||
<div class="flex items-center gap-4">
|
||||
{% 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">
|
||||
{{ 'Admin'|trans }}
|
||||
{{ 'nav.admin'|trans }}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
<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>
|
||||
{{ 'Mon Espace'|trans }}
|
||||
{{ 'nav.my_account'|trans }}
|
||||
</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>
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<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>
|
||||
{{ 'Connexion'|trans }}
|
||||
{{ 'nav.login'|trans }}
|
||||
</a>
|
||||
{% 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>
|
||||
|
||||
{# Bouton Menu Mobile #}
|
||||
<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 }}">
|
||||
<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>
|
||||
<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"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /></svg>
|
||||
</button>
|
||||
</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>
|
||||
|
||||
{# --- MESSAGES FLASH --- #}
|
||||
{% 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">
|
||||
{% for message in messages %}
|
||||
<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 justify-between p-4 rounded-2xl shadow-lg border">
|
||||
<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>
|
||||
</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>
|
||||
{% endfor %}
|
||||
</div>
|
||||
@@ -206,26 +133,19 @@
|
||||
<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="flex flex-col md:flex-row justify-between items-center gap-8">
|
||||
|
||||
<div class="text-center md:text-left">
|
||||
<p class="text-sm text-gray-700">
|
||||
© {{ "now"|date("Y") }} <span class="font-bold text-[#f39e36]">Ludikevent</span>.
|
||||
{{ 'Tous droits réservés.'|trans }}
|
||||
{{ 'footer.rights'|trans }}
|
||||
</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 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_cgv') }}" class="hover:text-blue-700 transition-colors">{{ 'CGV'|trans }}</a>
|
||||
<a href="{{ path('reservation_rgpd') }}" class="hover:text-blue-700 transition-colors">{{ 'RGPD'|trans }}</a>
|
||||
<a href="{{ path('reservation_cookies') }}" class="hover:text-blue-700 transition-colors">{{ '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>
|
||||
<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">{{ 'footer.cgv'|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">{{ 'footer.cookies'|trans }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -233,6 +153,5 @@
|
||||
|
||||
<cookie-banner></cookie-banner>
|
||||
{% block javascripts %}{% endblock %}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
{% extends 'revervation/base.twig' %}
|
||||
|
||||
{% block title %}Catalogue Ludik Event | Location Structures & Matériel{% 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 title %}{{ 'catalog.seo.title'|trans }}{% endblock %}
|
||||
{% block description %}{{ 'catalog.seo.description'|trans }}{% endblock %}
|
||||
|
||||
{% block breadcrumb_json %}
|
||||
,{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Catalogue",
|
||||
"name": "{{ 'catalog.breadcrumb'|trans }}",
|
||||
"item": "{{ url('reservation_catalogue') }}"
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<utm-event event="view_catalogue"></utm-event>
|
||||
<div class="min-h-screen bg-gray-50/50 font-sans antialiased pb-20">
|
||||
@@ -17,39 +19,35 @@
|
||||
{# --- HEADER --- #}
|
||||
<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">
|
||||
{# Correction : text-slate-400 -> text-slate-600 #}
|
||||
<a href="{{ url('reservation') }}" class="text-slate-600 hover:text-[#fc0e50] transition">ACCUEIL</a>
|
||||
{# Correction : text-slate-300 -> text-slate-500 #}
|
||||
<a href="{{ url('reservation') }}" class="text-slate-600 hover:text-[#fc0e50] transition">{{ 'nav.home'|trans }}</a>
|
||||
<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">Catalogue</span>
|
||||
<span class="text-amber-700 underline decoration-2 underline-offset-4">{{ 'catalog.breadcrumb'|trans }}</span>
|
||||
</nav>
|
||||
|
||||
<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>
|
||||
</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="max-w-7xl mx-auto px-4 py-4">
|
||||
<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">
|
||||
Tout voir
|
||||
{{ 'catalog.filter.all'|trans }}
|
||||
</button>
|
||||
|
||||
{% set categories_list = [
|
||||
{'id': '2-7 ans', 'label': '2-7 ANS', '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-99 ans', 'label': '3-99 ANS', 'hover': 'hover:border-indigo-600 hover:text-indigo-600'},
|
||||
{'id': 'barnums', 'label': 'BARNUMS', 'hover': 'hover:border-slate-800 hover:text-slate-800'},
|
||||
{'id': 'alimentaire', 'label': 'ALIMENTAIRE', 'hover': 'hover:border-rose-500 hover:text-rose-600'},
|
||||
{'id': 'options', 'label': 'OPTIONS', 'hover': 'hover:border-emerald-500 hover:text-emerald-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': 'catalog.filter.cat_3_15'|trans, 'hover': 'hover:border-blue-600 hover:text-blue-600'},
|
||||
{'id': '3-99 ans', 'label': 'catalog.filter.cat_3_99'|trans, 'hover': 'hover:border-indigo-600 hover:text-indigo-600'},
|
||||
{'id': 'barnums', 'label': 'catalog.filter.cat_barnums'|trans, 'hover': 'hover:border-slate-800 hover:text-slate-800'},
|
||||
{'id': 'alimentaire', 'label': 'catalog.filter.cat_food'|trans, 'hover': 'hover:border-rose-500 hover:text-rose-600'},
|
||||
{'id': 'options', 'label': 'catalog.filter.cat_options'|trans, 'hover': 'hover:border-emerald-500 hover:text-emerald-600'}
|
||||
] %}
|
||||
|
||||
{% for cat in categories_list %}
|
||||
<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 }}">
|
||||
{{ cat.label }}
|
||||
</button>
|
||||
@@ -66,54 +64,45 @@
|
||||
<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">
|
||||
|
||||
{# 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">
|
||||
{% if product.imageName %}
|
||||
<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">
|
||||
<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">
|
||||
{% else %}
|
||||
<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">
|
||||
<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">
|
||||
{% 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">
|
||||
<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" %}
|
||||
A partir de {{ product.priceDay|format_currency('EUR') }} / Week-End
|
||||
/ {{ 'catalog.product.weekend'|trans }}
|
||||
{% else %}
|
||||
A partir de {{ product.priceDay|format_currency('EUR') }} / Jour
|
||||
/ {{ 'catalog.product.day'|trans }}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# INFOS #}
|
||||
<div class="px-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">
|
||||
{{ product.category }}
|
||||
{{ product.category }} {# Souvent laissé brut car vient de la base #}
|
||||
</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">
|
||||
REF. {{ product.ref }}
|
||||
{{ 'catalog.product.ref'|trans }} {{ product.ref }}
|
||||
</span>
|
||||
</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 }}
|
||||
</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">
|
||||
<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">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -121,10 +110,8 @@
|
||||
</div>
|
||||
{% 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">
|
||||
{# Correction : text-slate-400 -> text-slate-600 #}
|
||||
<p class="text-slate-600 font-black italic uppercase tracking-widest text-xs">Arrive bientôt...</p>
|
||||
<p class="text-slate-600 font-black italic uppercase tracking-widest text-xs">{{ 'catalog.empty'|trans }}</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,21 +1,51 @@
|
||||
'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent': 'Location Structure Gonflable & Châteaux pour vos Événements | Ludikevent'
|
||||
'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'
|
||||
'Menu principal': 'Menu principal'
|
||||
'Accueil': 'Accueil'
|
||||
'Nos structures': 'Nos structures'
|
||||
'Nos Formules': 'Nos Formules'
|
||||
'Catalogue': 'Catalogue'
|
||||
'Comment Reserver': 'Comment Réserver'
|
||||
'Contact': 'Contact'
|
||||
'Mon Espace': 'Mon Espace'
|
||||
'Connexion': 'Connexion'
|
||||
'Déconnexion': 'Déconnexion'
|
||||
'Tous droits réservés.': 'Tous droits réservés.'
|
||||
'Location de structures gonflables de haute qualité.': 'Location de structures gonflables de haute qualité.'
|
||||
'Mentions légales': 'Mentions légales'
|
||||
'CGV': 'CGV'
|
||||
'RGPD': 'RGPD'
|
||||
'Cookies': 'Cookies'
|
||||
'Appeler le': 'Appeler le'
|
||||
'Rechercher': 'Rechercher'
|
||||
'Ouvrir le menu': 'Ouvrir le menu'
|
||||
catalog:
|
||||
seo:
|
||||
title: "Catalogue Ludik Event | Location Structures & Matériel"
|
||||
description: "Découvrez notre catalogue : châteaux gonflables, parcours sportifs et machines gourmandes. Tarifs transparents et sécurité garantie pour vos événements."
|
||||
breadcrumb: "Catalogue"
|
||||
header:
|
||||
main: "Tout notre"
|
||||
highlight: "Univers"
|
||||
filter:
|
||||
all: "Tout voir"
|
||||
cat_2_7: "2-7 ANS"
|
||||
cat_3_15: "3-15 ANS"
|
||||
cat_3_99: "3-99 ANS"
|
||||
cat_barnums: "BARNUMS"
|
||||
cat_food: "ALIMENTAIRE"
|
||||
cat_options: "OPTIONS"
|
||||
product:
|
||||
from: "À partir de"
|
||||
day: "Jour"
|
||||
weekend: "Week-End"
|
||||
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"
|
||||
|
||||
Reference in New Issue
Block a user