feat(policies): add FR/EN policy pages and i18n routes; update footer and consent links to localized URLs

This commit is contained in:
Ruidy 2025-09-05 12:23:59 -04:00
parent 4c4224eb46
commit ed80223e92
12 changed files with 164 additions and 8 deletions

View file

@ -9,7 +9,11 @@ export type RouteKey =
| 'location'
| 'rates'
| 'contact'
| 'thank_you';
| 'thank_you'
| 'terms'
| 'privacy'
| 'cancellation'
| 'house_rules';
export const routes: Record<RouteKey, Record<Locale, string>> = {
home: { fr: '/fr/', en: '/en/' },
@ -21,6 +25,10 @@ export const routes: Record<RouteKey, Record<Locale, string>> = {
rates: { fr: '/fr/tarifs-disponibilites/', en: '/en/rates-availability/' },
contact: { fr: '/fr/contact/', en: '/en/contact/' },
thank_you: { fr: '/fr/merci/', en: '/en/thank-you/' },
terms: { fr: '/fr/politiques/conditions/', en: '/en/policies/terms/' },
privacy: { fr: '/fr/politiques/confidentialite/', en: '/en/policies/privacy/' },
cancellation: { fr: '/fr/politiques/annulation/', en: '/en/policies/cancellation/' },
house_rules: { fr: '/fr/politiques/reglement/', en: '/en/policies/house-rules/' },
};
const normalize = (p: string) => {
@ -68,4 +76,3 @@ export function navFor(locale: Locale): Array<{ label: string; href: string }> {
export function ctaLabelFor(locale: Locale): string {
return locale === 'en' ? 'Send a Request' : 'Envoyer une demande';
}

View file

@ -49,10 +49,21 @@ const homeHref = hrefFor('home', lang);
<p class="mt-1">© VillaFleurie</p>
</div>
<ul class="flex gap-4">
<li><a class="underline" href="/fr/politiques/conditions/">Conditions</a></li>
<li><a class="underline" href="/fr/politiques/confidentialite/">Confidentialité</a></li>
<li><a class="underline" href="/fr/politiques/annulation/">Annulation</a></li>
<li><a class="underline" href="/fr/politiques/reglement/">Règlement intérieur</a></li>
{lang === 'en' ? (
<>
<li><a class="underline" href={hrefFor('terms','en')}>Terms</a></li>
<li><a class="underline" href={hrefFor('privacy','en')}>Privacy</a></li>
<li><a class="underline" href={hrefFor('cancellation','en')}>Cancellation</a></li>
<li><a class="underline" href={hrefFor('house_rules','en')}>House Rules</a></li>
</>
) : (
<>
<li><a class="underline" href={hrefFor('terms','fr')}>Conditions</a></li>
<li><a class="underline" href={hrefFor('privacy','fr')}>Confidentialité</a></li>
<li><a class="underline" href={hrefFor('cancellation','fr')}>Annulation</a></li>
<li><a class="underline" href={hrefFor('house_rules','fr')}>Règlement intérieur</a></li>
</>
)}
</ul>
</div>
</footer>

View file

@ -46,7 +46,7 @@ const thankHref = hrefFor('thank_you', 'en');
</label>
<label class="md:col-span-2 flex items-start gap-2 text-sm">
<input type="checkbox" required name="consent_privacy" />
<span>I agree to the use of my data to process my request in accordance with the <a class="underline" href="/fr/politiques/confidentialite/">Privacy Policy</a>.</span>
<span>I agree to the use of my data to process my request in accordance with the <a class="underline" href={hrefFor('privacy','en')}>Privacy Policy</a>.</span>
</label>
<div class="md:col-span-2">
<button class="rounded-lg bg-brand px-4 py-2 text-white hover:bg-brand-600">Send</button>

View file

@ -0,0 +1,15 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Cancellation" lang="en">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Cancellation Policy</h1>
<ul>
<li>Late cancellation: 50% fee if cancelled within 14 days before arrival.</li>
<li>Noshow: treated as late cancellation.</li>
<li>Security deposit: none.</li>
<li>Cleaning fee: €20 if left dirty; free otherwise.</li>
</ul>
<p class="text-sm">Last updated: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,15 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="House Rules" lang="en">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>House Rules</h1>
<ul>
<li>No smoking, no parties, no pets.</li>
<li>Respect neighbors and quiet hours.</li>
<li>Checkin 14:00 · Checkout 11:00.</li>
<li>Normal use of amenities; report any damage.</li>
</ul>
<p class="text-sm">Last updated: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,19 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Privacy" lang="en">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Privacy Policy</h1>
<p>We collect data submitted via the form (name, email, dates, etc.) to respond to your request.</p>
<ul>
<li>Legal basis: precontractual measures.</li>
<li>Retention: as needed for processing and legal obligations.</li>
<li>Sharing: owner notification email; no resale.</li>
<li>Analytics: Plausible (cookiefree by default).</li>
<li>Hosting: Netlify (form data processed by Netlify).</li>
<li>Data rights: access, rectification, deletion — contact us.</li>
</ul>
<p>Contact: location.villafleurie@gmail.com</p>
<p class="text-sm">Last updated: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,20 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Terms" lang="en">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Terms & Conditions</h1>
<p><strong>Legal name:</strong> VillaFleurie (Jacques Gordien)</p>
<p><strong>Contact:</strong> location.villafleurie@gmail.com · +33 6 58 96 12 79</p>
<p><strong>Hosting:</strong> Netlify · <strong>Jurisdiction:</strong> France</p>
<h2>Bookings</h2>
<ul>
<li>Minimum stay: 3 nights.</li>
<li>Checkin: 14:00 · Checkout: 11:00.</li>
<li>Payments and confirmations communicated by email.</li>
</ul>
<h2>Liability</h2>
<p>Guest is responsible for damages during the stay. We are not liable for lost items.</p>
<p class="text-sm">Last updated: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -46,7 +46,7 @@ const thankHref = hrefFor('thank_you', 'fr');
</label>
<label class="md:col-span-2 flex items-start gap-2 text-sm">
<input type="checkbox" required name="consent_privacy" />
<span>Jaccepte que mes données soient utilisées pour traiter ma demande conformément à la <a class="underline" href="/fr/politiques/confidentialite/">Politique de Confidentialité</a>.</span>
<span>Jaccepte que mes données soient utilisées pour traiter ma demande conformément à la <a class="underline" href={hrefFor('privacy','fr')}>Politique de Confidentialité</a>.</span>
</label>
<div class="md:col-span-2">
<button class="rounded-lg bg-brand px-4 py-2 text-white hover:bg-brand-600">Envoyer</button>

View file

@ -0,0 +1,15 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Annulation" lang="fr">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Politique dAnnulation</h1>
<ul>
<li>Annulation tardive: 50% des frais si annulé dans les 14 jours avant larrivée.</li>
<li>Noshow: traité comme une annulation tardive.</li>
<li>Caution: aucune.</li>
<li>Frais de ménage: 20 € si laissé sale, gratuit sinon.</li>
</ul>
<p class="text-sm">Dernière mise à jour: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,20 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Conditions" lang="fr">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Conditions Générales</h1>
<p><strong>Nom légal:</strong> VillaFleurie (Jacques Gordien)</p>
<p><strong>Contact:</strong> location.villafleurie@gmail.com · +33 6 58 96 12 79</p>
<p><strong>Hébergement:</strong> Netlify · <strong>Juridiction:</strong> France</p>
<h2>Réservations</h2>
<ul>
<li>Séjour minimum: 3 nuits.</li>
<li>Arrivée: 14:00 · Départ: 11:00.</li>
<li>Paiements et confirmations communiqués par email.</li>
</ul>
<h2>Responsabilités</h2>
<p>Le client est responsable des dommages causés pendant le séjour. Nous déclinons toute responsabilité pour les objets perdus.</p>
<p class="text-sm">Dernière mise à jour: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,19 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Confidentialité" lang="fr">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Politique de Confidentialité</h1>
<p>Nous collectons les données soumises via le formulaire (nom, email, dates, etc.) pour répondre à votre demande.</p>
<ul>
<li>Base légale: exécution de mesures précontractuelles.</li>
<li>Conservation: durée nécessaire au traitement et obligations légales.</li>
<li>Partage: email de notification (propriétaire), pas de revente.</li>
<li>Analytics: Plausible (sans cookie par défaut).</li>
<li>Hébergement: Netlify (données de formulaire hébergées chez Netlify).</li>
<li>Droits RGPD: accès, rectification, suppression — contactez-nous.</li>
</ul>
<p>Contact: location.villafleurie@gmail.com</p>
<p class="text-sm">Dernière mise à jour: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>

View file

@ -0,0 +1,15 @@
---
import BaseLayout from '../../../layouts/BaseLayout.astro';
---
<BaseLayout title="Règlement intérieur" lang="fr">
<div class="mx-auto max-w-3xl px-6 py-10 prose">
<h1>Règlement Intérieur</h1>
<ul>
<li>Nonfumeur, pas de fêtes, pas danimaux.</li>
<li>Respect du voisinage et du calme.</li>
<li>Checkin 14:00 · Checkout 11:00.</li>
<li>Utilisation normale des équipements; signaler tout dommage.</li>
</ul>
<p class="text-sm">Dernière mise à jour: {new Date().toISOString().slice(0,10)}</p>
</div>
</BaseLayout>