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 --- #}
<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">
&copy; {{ "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>

View File

@@ -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,41 +64,34 @@
<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>
@@ -108,12 +99,10 @@
{{ 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>

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'
'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"