Files
orion/scripts/seed/create_default_content_pages.py
Samir Boulahtit adc36246b8
Some checks failed
CI / ruff (push) Successful in 14s
CI / pytest (push) Failing after 2h32m45s
CI / validate (push) Successful in 30s
CI / dependency-scanning (push) Successful in 31s
CI / docs (push) Has been skipped
CI / deploy (push) Has been skipped
feat(storefront): homepage, module gating, widget protocol, i18n fixes
Storefront homepage & module gating:
- CMS owns storefront GET / (slug="home" with 3-tier resolution)
- Catalog loses GET / (keeps /products only)
- Store root redirect (GET / → /store/dashboard or /store/login)
- Route gating: non-core modules return 404 when disabled for platform
- Seed store default homepages per platform

Widget protocol for customer dashboard:
- StorefrontDashboardCard contract in widgets.py
- Widget aggregator get_storefront_dashboard_cards()
- Orders and Loyalty module widget providers
- Dashboard template renders contributed cards (no module names)

Landing template module-agnostic:
- CTAs driven by storefront_nav (not hardcoded module names)
- Header actions check nav item IDs (not enabled_modules)
- Remove hardcoded "Add Product" sidebar button
- Remove all enabled_modules checks from storefront templates

i18n fixes:
- Title placeholder resolution ({{store_name}}) for store default pages
- Storefront nav label_keys prefixed with module code
- Add storefront.account.* keys to 6 modules (en/fr/de/lb)
- Header/footer CMS pages use get_translated_title(current_language)
- Footer labels use i18n keys instead of hardcoded English

Icon cleanup:
- Standardize on map-pin (remove location-marker alias)
- Replace all location-marker references across templates and docs

Docs:
- Storefront builder vision proposal (6 phases)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:53:17 +02:00

2863 lines
135 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Create Default Content Pages for All Platforms (CMS)
This script creates:
1. Platform Homepages (slug="home", is_platform_page=True, sections JSON)
- wizard.lu: multi-product landing (hero + products + cta)
- omsflow.lu: OMS-focused (hero + features + pricing + cta)
- rewardflow.lu: loyalty-focused (hero + features + pricing + cta)
2. Platform Marketing Pages (is_platform_page=True)
- about, contact, faq, privacy, terms per platform
3. Store Default Pages (is_platform_page=False, store_id=NULL)
- Generic templates with {{store_name}} placeholders
- OMS: about, contact, faq, shipping, returns, privacy, terms
- Loyalty: about, contact, faq, privacy, terms
Prerequisites:
- Database migrations must be applied
- content_pages table must exist
- Platforms must exist (run init_production.py first)
Usage:
python scripts/seed/create_default_content_pages.py
"""
import sys
from datetime import UTC, datetime
from pathlib import Path
# Add project root to path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
import contextlib
from sqlalchemy import select
from sqlalchemy.orm import Session
# Register all models with SQLAlchemy so string-based relationships resolve
for _mod in [
"app.modules.billing.models",
"app.modules.inventory.models",
"app.modules.cart.models",
"app.modules.messaging.models",
"app.modules.loyalty.models",
"app.modules.catalog.models",
"app.modules.customers.models",
"app.modules.orders.models",
"app.modules.marketplace.models",
"app.modules.cms.models",
]:
with contextlib.suppress(ImportError):
__import__(_mod)
from app.core.database import SessionLocal
from app.modules.cms.models import ContentPage
from app.modules.tenancy.models import Platform
# ============================================================================
# HELPER: TranslatableText dict builder
# ============================================================================
def t(fr: str, en: str, de: str, lb: str | None = None) -> dict:
"""Build a TranslatableText-compatible dict."""
d = {"translations": {"fr": fr, "en": en, "de": de}}
if lb is not None:
d["translations"]["lb"] = lb
return d
def tt(en: str, fr: str, de: str, lb: str | None = None) -> dict:
"""Build a simple language-keyed dict for title_translations / content_translations."""
d = {"en": en, "fr": fr, "de": de}
if lb is not None:
d["lb"] = lb
return d
# ============================================================================
# PLATFORM HOMEPAGE SECTIONS (slug="home", is_platform_page=True)
# ============================================================================
def _wizard_homepage_sections() -> dict:
"""Wizard.lu (main) — multi-product landing page."""
return {
"hero": {
"enabled": True,
"title": t(
"Votre boîte à outils numérique pour votre entreprise",
"Your Business Digital Toolkit",
"Ihr digitales Business-Toolkit",
),
"subtitle": t(
"Gestion des commandes, programmes de fidélité et création de sites web — tout ce dont votre entreprise luxembourgeoise a besoin.",
"Order management, loyalty programs, and website building — everything your Luxembourg business needs.",
"Bestellverwaltung, Treueprogramme und Website-Erstellung — alles, was Ihr luxemburgisches Unternehmen braucht.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Découvrir nos solutions",
"Discover Our Solutions",
"Unsere Lösungen entdecken",
),
"url": "#products",
"style": "primary",
},
],
},
"products": {
"enabled": True,
"title": t(
"Nos solutions",
"Our Solutions",
"Unsere Lösungen",
),
"subtitle": t(
"Des outils conçus pour le commerce luxembourgeois",
"Tools built for Luxembourg commerce",
"Werkzeuge für den luxemburgischen Handel",
),
"products": [
{
"icon": "clipboard-list",
"title": t(
"Gestion des Commandes (OMS)",
"Order Management (OMS)",
"Bestellverwaltung (OMS)",
),
"description": t(
"Synchronisez vos commandes Letzshop, gérez les stocks et générez des factures conformes à la TVA.",
"Sync your Letzshop orders, manage inventory, and generate VAT-compliant invoices.",
"Synchronisieren Sie Ihre Letzshop-Bestellungen, verwalten Sie Lagerbestände und erstellen Sie MwSt-konforme Rechnungen.",
),
"url": "/platforms/oms/",
"link_text": t("En savoir plus", "Learn More", "Mehr erfahren"),
},
{
"icon": "heart",
"title": t(
"Programme de Fidélité",
"Loyalty Program",
"Treueprogramm",
),
"description": t(
"Créez des programmes de fidélité avec points, récompenses et niveaux pour fidéliser vos clients.",
"Create loyalty programs with points, rewards, and tiers to retain your customers.",
"Erstellen Sie Treueprogramme mit Punkten, Prämien und Stufen, um Ihre Kunden zu binden.",
),
"url": "/platforms/loyalty/",
"link_text": t("En savoir plus", "Learn More", "Mehr erfahren"),
},
{
"icon": "globe-alt",
"title": t(
"Création de Sites Web",
"Website Builder",
"Website-Erstellung",
),
"description": t(
"Créez votre présence en ligne avec notre outil de création de sites web intuitif.",
"Build your online presence with our intuitive website builder.",
"Erstellen Sie Ihre Online-Präsenz mit unserem intuitiven Website-Baukasten.",
),
"url": "",
"badge": t("Bientôt", "Coming Soon", "Demnächst"),
},
],
},
"cta": {
"enabled": True,
"title": t(
"Prêt à digitaliser votre entreprise ?",
"Ready to Digitalize Your Business?",
"Bereit, Ihr Unternehmen zu digitalisieren?",
),
"subtitle": t(
"Rejoignez les entreprises luxembourgeoises qui font confiance à nos solutions.",
"Join Luxembourg businesses that trust our solutions.",
"Schließen Sie sich luxemburgischen Unternehmen an, die unseren Lösungen vertrauen.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Commencer maintenant",
"Get Started Now",
"Jetzt starten",
),
"url": "/signup",
"style": "primary",
},
{
"text": t(
"Nous contacter",
"Contact Us",
"Kontaktieren Sie uns",
),
"url": "/contact",
"style": "secondary",
},
],
},
}
def _oms_homepage_sections() -> dict:
"""OMS (omsflow.lu) — order management focused homepage."""
return {
"hero": {
"enabled": True,
"badge_text": t(
"Essai gratuit — Aucune carte de crédit requise",
"Free Trial — No Credit Card Required",
"Kostenlose Testversion — Keine Kreditkarte erforderlich",
),
"title": t(
"OMS léger pour les vendeurs Letzshop",
"Lightweight OMS for Letzshop Sellers",
"Leichtes OMS für Letzshop-Verkäufer",
),
"subtitle": t(
"Gestion des commandes, stocks et facturation conçue pour le e-commerce luxembourgeois. Arrêtez de jongler avec les tableurs. Gérez votre entreprise.",
"Order management, inventory, and invoicing built for Luxembourg e-commerce. Stop juggling spreadsheets. Start running your business.",
"Bestellverwaltung, Lager und Rechnungsstellung für den luxemburgischen E-Commerce. Schluss mit Tabellenkalkulationen. Führen Sie Ihr Geschäft.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Essai gratuit",
"Start Free Trial",
"Kostenlos testen",
),
"url": "/signup",
"style": "primary",
},
{
"text": t(
"Trouvez votre boutique Letzshop",
"Find Your Letzshop Shop",
"Finden Sie Ihren Letzshop",
),
"url": "#find-shop",
"style": "secondary",
},
],
},
"features": {
"enabled": True,
"title": t(
"Tout ce dont un vendeur Letzshop a besoin",
"Everything a Letzshop Seller Needs",
"Alles, was ein Letzshop-Verkäufer braucht",
),
"subtitle": t(
"Les outils opérationnels que Letzshop ne fournit pas",
"The operational tools Letzshop doesn't provide",
"Die operativen Tools, die Letzshop nicht bietet",
),
"layout": "grid",
"features": [
{
"icon": "refresh",
"title": t(
"Synchronisation Letzshop",
"Letzshop Order Sync",
"Letzshop-Synchronisierung",
),
"description": t(
"Les commandes se synchronisent automatiquement. Confirmez et ajoutez le suivi depuis Orion.",
"Orders sync automatically. Confirm and add tracking directly from Orion.",
"Bestellungen werden automatisch synchronisiert. Bestätigen und Tracking direkt von Orion hinzufügen.",
),
},
{
"icon": "cube",
"title": t(
"Gestion des stocks",
"Inventory Management",
"Lagerverwaltung",
),
"description": t(
"Suivez vos stocks en temps réel avec emplacements d'entrepôt et bons de commande.",
"Track inventory in real-time with warehouse locations and purchase orders.",
"Verfolgen Sie Lagerbestände in Echtzeit mit Lagerstandorten und Bestellungen.",
),
},
{
"icon": "document-text",
"title": t(
"Facturation TVA UE",
"EU VAT Invoicing",
"EU-MwSt-Rechnungen",
),
"description": t(
"Générez des factures PDF conformes avec la TVA correcte pour tout pays UE.",
"Generate compliant PDF invoices with correct VAT for any EU country.",
"Erstellen Sie konforme PDF-Rechnungen mit korrekter MwSt für jedes EU-Land.",
),
},
{
"icon": "users",
"title": t(
"Données clients",
"Customer Data",
"Kundendaten",
),
"description": t(
"Possédez vos données clients. Exportez pour le marketing et la fidélisation.",
"Own your customer data. Export for marketing and loyalty building.",
"Besitzen Sie Ihre Kundendaten. Exportieren Sie für Marketing und Kundenbindung.",
),
},
],
},
"pricing": {
"enabled": True,
"title": t(
"Tarification simple et transparente",
"Simple, Transparent Pricing",
"Einfache, transparente Preise",
),
"subtitle": t(
"Choisissez le plan adapté à votre entreprise. Tous les plans incluent un essai gratuit.",
"Choose the plan that fits your business. All plans include a free trial.",
"Wählen Sie den Plan, der zu Ihrem Unternehmen passt. Alle Pläne beinhalten eine kostenlose Testversion.",
),
"use_subscription_tiers": True,
"monthly_label": t("Mensuel", "Monthly", "Monatlich"),
"annual_label": t("Annuel", "Annual", "Jährlich"),
"save_text": t("Économisez 2 mois !", "Save 2 months!", "Sparen Sie 2 Monate!"),
"popular_badge": t("LE PLUS POPULAIRE", "MOST POPULAR", "AM BELIEBTESTEN"),
"cta_text": t("Essai gratuit", "Start Free Trial", "Kostenlos testen"),
"per_month_label": t("/mois", "/month", "/Monat"),
"per_year_label": t("/an", "/year", "/Jahr"),
"coming_soon_text": t(
"Plans tarifaires bientôt disponibles",
"Pricing plans coming soon",
"Preispläne demnächst verfügbar",
),
},
"cta": {
"enabled": True,
"title": t(
"Prêt à optimiser vos commandes ?",
"Ready to Streamline Your Orders?",
"Bereit, Ihre Bestellungen zu optimieren?",
),
"subtitle": t(
"Rejoignez les vendeurs Letzshop qui font confiance à Orion pour leur gestion de commandes.",
"Join Letzshop stores who trust Orion for their order management.",
"Schließen Sie sich Letzshop-Händlern an, die Orion für ihre Bestellverwaltung vertrauen.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Essai gratuit",
"Start Free Trial",
"Kostenlos testen",
),
"url": "/signup",
"style": "primary",
},
],
},
}
def _loyalty_homepage_sections() -> dict:
"""Loyalty (rewardflow.lu) — loyalty program focused homepage."""
return {
"hero": {
"enabled": True,
"badge_text": t(
"Essai gratuit — Aucune carte de crédit requise",
"Free Trial — No Credit Card Required",
"Kostenlose Testversion — Keine Kreditkarte erforderlich",
),
"title": t(
"Fidélisation client simplifiée",
"Customer Loyalty Made Simple",
"Kundentreue leicht gemacht",
),
"subtitle": t(
"Créez des programmes de fidélité engageants avec points, récompenses et niveaux. Conçu pour les commerces luxembourgeois.",
"Create engaging loyalty programs with points, rewards, and tiers. Built for Luxembourg businesses.",
"Erstellen Sie ansprechende Treueprogramme mit Punkten, Prämien und Stufen. Für luxemburgische Unternehmen.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Essai gratuit",
"Start Free Trial",
"Kostenlos testen",
),
"url": "/signup",
"style": "primary",
},
{
"text": t(
"Voir les fonctionnalités",
"See Features",
"Funktionen ansehen",
),
"url": "#features",
"style": "secondary",
},
],
},
"features": {
"enabled": True,
"title": t(
"Tout pour fidéliser vos clients",
"Everything to Build Customer Loyalty",
"Alles für die Kundenbindung",
),
"subtitle": t(
"Des outils puissants pour créer et gérer vos programmes de fidélité",
"Powerful tools to create and manage your loyalty programs",
"Leistungsstarke Tools zum Erstellen und Verwalten Ihrer Treueprogramme",
),
"layout": "grid",
"features": [
{
"icon": "star",
"title": t(
"Système de points",
"Points System",
"Punktesystem",
),
"description": t(
"Attribuez des points pour chaque achat. Règles flexibles et multiplicateurs personnalisables.",
"Award points for every purchase. Flexible rules and customizable multipliers.",
"Vergeben Sie Punkte für jeden Einkauf. Flexible Regeln und anpassbare Multiplikatoren.",
),
},
{
"icon": "gift",
"title": t(
"Catalogue de récompenses",
"Rewards Catalog",
"Prämienkatalog",
),
"description": t(
"Créez un catalogue de récompenses attrayant. Produits, remises ou expériences exclusives.",
"Create an attractive rewards catalog. Products, discounts, or exclusive experiences.",
"Erstellen Sie einen attraktiven Prämienkatalog. Produkte, Rabatte oder exklusive Erlebnisse.",
),
},
{
"icon": "trending-up",
"title": t(
"Gestion des niveaux",
"Tier Management",
"Stufenverwaltung",
),
"description": t(
"Bronze, Argent, Or — motivez vos clients avec des niveaux de fidélité progressifs.",
"Bronze, Silver, Gold — motivate customers with progressive loyalty tiers.",
"Bronze, Silber, Gold — motivieren Sie Kunden mit progressiven Treuestufen.",
),
},
{
"icon": "chart-bar",
"title": t(
"Analytique avancée",
"Advanced Analytics",
"Erweiterte Analytik",
),
"description": t(
"Suivez l'engagement, les taux de rétention et le ROI de vos programmes.",
"Track engagement, retention rates, and program ROI.",
"Verfolgen Sie Engagement, Bindungsraten und Programm-ROI.",
),
},
],
},
"pricing": {
"enabled": True,
"title": t(
"Tarification simple et transparente",
"Simple, Transparent Pricing",
"Einfache, transparente Preise",
),
"subtitle": t(
"Choisissez le plan adapté à votre programme de fidélité.",
"Choose the plan that fits your loyalty program.",
"Wählen Sie den Plan, der zu Ihrem Treueprogramm passt.",
),
"use_subscription_tiers": True,
"monthly_label": t("Mensuel", "Monthly", "Monatlich"),
"annual_label": t("Annuel", "Annual", "Jährlich"),
"save_text": t("Économisez 2 mois !", "Save 2 months!", "Sparen Sie 2 Monate!"),
"popular_badge": t("LE PLUS POPULAIRE", "MOST POPULAR", "AM BELIEBTESTEN"),
"cta_text": t("Essai gratuit", "Start Free Trial", "Kostenlos testen"),
"per_month_label": t("/mois", "/month", "/Monat"),
"per_year_label": t("/an", "/year", "/Jahr"),
"coming_soon_text": t(
"Plans tarifaires bientôt disponibles",
"Pricing plans coming soon",
"Preispläne demnächst verfügbar",
),
},
"cta": {
"enabled": True,
"title": t(
"Prêt à fidéliser vos clients ?",
"Ready to Build Customer Loyalty?",
"Bereit, Kundentreue aufzubauen?",
),
"subtitle": t(
"Commencez votre programme de fidélité dès aujourd'hui. Essai gratuit, sans engagement.",
"Start your loyalty program today. Free trial, no commitment.",
"Starten Sie Ihr Treueprogramm noch heute. Kostenlose Testversion, ohne Verpflichtung.",
),
"background_type": "gradient",
"buttons": [
{
"text": t(
"Essai gratuit",
"Start Free Trial",
"Kostenlos testen",
),
"url": "/signup",
"style": "primary",
},
],
},
}
def _hostwizard_homepage_sections() -> dict:
"""hostwizard.lu — web hosting & website building landing page."""
return {
"hero": {
"enabled": True,
"title": t(
"Votre site web professionnel au Luxembourg",
"Your Professional Website in Luxembourg",
"Ihre professionelle Website in Luxemburg",
"Är professionell Websäit zu Lëtzebuerg",
),
"subtitle": t(
"Sites web, domaines, e-mail et hébergement — tout en un pour les entreprises luxembourgeoises.",
"Websites, domains, email, and hosting — all-in-one for Luxembourg businesses.",
"Websites, Domains, E-Mail und Hosting — alles in einem für luxemburgische Unternehmen.",
"Websäiten, Domänen, E-Mail an Hosting — alles an engem fir lëtzebuerger Betriber.",
),
"cta_text": t("Demander un devis", "Get a Quote", "Angebot anfordern", "Offert ufroen"),
"cta_url": "/contact",
},
"features": {
"enabled": True,
"title": t("Nos services", "Our Services", "Unsere Dienstleistungen", "Eis Servicer"),
"items": [
{
"title": t("Création de sites web", "Website Creation", "Website-Erstellung", "Websäit Erstellen"),
"description": t(
"Sites web professionnels avec CMS intégré pour gérer votre contenu facilement.",
"Professional websites with integrated CMS to manage your content easily.",
"Professionelle Websites mit integriertem CMS zur einfachen Verwaltung Ihrer Inhalte.",
"Professionell Websäiten mat integréiertem CMS fir Ären Inhalt einfach ze geréieren.",
),
"icon": "globe",
},
{
"title": t("Noms de domaine", "Domain Names", "Domainnamen", "Domänennimm"),
"description": t(
"Enregistrement et gestion de domaines .lu et internationaux.",
"Registration and management of .lu and international domains.",
"Registrierung und Verwaltung von .lu und internationalen Domains.",
"Registréierung a Gestioun vun .lu an internationalen Domänen.",
),
"icon": "at-symbol",
},
{
"title": t("E-mail professionnel", "Professional Email", "Professionelle E-Mail", "Professionell E-Mail"),
"description": t(
"Boîtes mail personnalisées avec votre nom de domaine.",
"Custom mailboxes with your domain name.",
"Individuelle Postfächer mit Ihrem Domainnamen.",
"Personaliséiert Postfächer mat Ärem Domännumm.",
),
"icon": "mail",
},
{
"title": t("Hébergement & SSL", "Hosting & SSL", "Hosting & SSL", "Hosting & SSL"),
"description": t(
"Hébergement sécurisé avec certificat SSL inclus.",
"Secure hosting with included SSL certificate.",
"Sicheres Hosting mit inkludiertem SSL-Zertifikat.",
"Séchert Hosting mat abegraff SSL-Zertifikat.",
),
"icon": "shield-check",
},
],
},
"pricing": {
"enabled": True,
"title": t("Tarifs", "Pricing", "Preise", "Präisser"),
"subtitle": t(
"Des formules adaptées à chaque entreprise.",
"Plans tailored to every business.",
"Pläne für jedes Unternehmen.",
"Pläng fir all Betrib.",
),
},
"cta": {
"enabled": True,
"title": t(
"Prêt à mettre votre entreprise en ligne ?",
"Ready to bring your business online?",
"Bereit, Ihr Unternehmen online zu bringen?",
"Prett fir Äre Betrib online ze bréngen?",
),
"subtitle": t(
"Contactez-nous pour un site web gratuit de démonstration.",
"Contact us for a free demo website.",
"Kontaktieren Sie uns für eine kostenlose Demo-Website.",
"Kontaktéiert eis fir eng gratis Demo-Websäit.",
),
"cta_text": t("Nous contacter", "Contact Us", "Kontaktieren", "Kontaktéiert eis"),
"cta_url": "/contact",
},
}
HOMEPAGE_SECTIONS = {
"main": _wizard_homepage_sections,
"oms": _oms_homepage_sections,
"loyalty": _loyalty_homepage_sections,
"hosting": _hostwizard_homepage_sections,
}
# ============================================================================
# PLATFORM MARKETING PAGES (is_platform_page=True)
# ============================================================================
def _get_platform_pages(platform_code: str) -> list[dict]:
"""Get platform marketing pages for a given platform code."""
if platform_code == "main":
return [
{
"slug": "about",
"title": "About Wizard",
"title_translations": tt("About Wizard", "À propos de Wizard", "Über Wizard", "Iwwer Wizard"),
"content": """<div class="prose-content">
<h2>About Wizard</h2>
<p>Wizard is the digital toolkit for Luxembourg businesses. We provide integrated solutions for order management, customer loyalty, and online presence.</p>
<h3>Our Mission</h3>
<p>To empower Luxembourg businesses with modern, easy-to-use digital tools that help them grow and thrive in the digital age.</p>
<h3>Our Solutions</h3>
<ul>
<li><strong>OMS (omsflow.lu):</strong> Order management, inventory, and invoicing for Letzshop sellers</li>
<li><strong>Loyalty (rewardflow.lu):</strong> Customer loyalty programs with points, rewards, and tiers</li>
<li><strong>Website Builder:</strong> Coming soon — build your online presence</li>
</ul>
<h3>Built in Luxembourg</h3>
<p>We understand the unique needs of Luxembourg commerce — from multilingual support (FR/DE/EN) to EU VAT compliance.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>About Wizard</h2>
<p>Wizard is the digital toolkit for Luxembourg businesses. We provide integrated solutions for order management, customer loyalty, and online presence.</p>
<h3>Our Mission</h3>
<p>To empower Luxembourg businesses with modern, easy-to-use digital tools that help them grow and thrive in the digital age.</p>
<h3>Our Solutions</h3>
<ul>
<li><strong>OMS (omsflow.lu):</strong> Order management, inventory, and invoicing for Letzshop sellers</li>
<li><strong>Loyalty (rewardflow.lu):</strong> Customer loyalty programs with points, rewards, and tiers</li>
<li><strong>Website Builder:</strong> Coming soon — build your online presence</li>
</ul>
<h3>Built in Luxembourg</h3>
<p>We understand the unique needs of Luxembourg commerce — from multilingual support (FR/DE/EN) to EU VAT compliance.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>À propos de Wizard</h2>
<p>Wizard est la boîte à outils numérique pour les entreprises luxembourgeoises. Nous proposons des solutions intégrées pour la gestion des commandes, la fidélisation client et la présence en ligne.</p>
<h3>Notre mission</h3>
<p>Donner aux entreprises luxembourgeoises des outils numériques modernes et faciles à utiliser pour les aider à croître et prospérer à l'ère du numérique.</p>
<h3>Nos solutions</h3>
<ul>
<li><strong>OMS (omsflow.lu) :</strong> Gestion des commandes, inventaire et facturation pour les vendeurs Letzshop</li>
<li><strong>Loyalty (rewardflow.lu) :</strong> Programmes de fidélité client avec points, récompenses et niveaux</li>
<li><strong>Website Builder :</strong> Bientôt disponible — créez votre présence en ligne</li>
</ul>
<h3>Conçu au Luxembourg</h3>
<p>Nous comprenons les besoins uniques du commerce luxembourgeois — du support multilingue (FR/DE/EN) à la conformité TVA européenne.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Über Wizard</h2>
<p>Wizard ist das digitale Toolkit für luxemburgische Unternehmen. Wir bieten integrierte Lösungen für Bestellverwaltung, Kundenbindung und Online-Präsenz.</p>
<h3>Unsere Mission</h3>
<p>Luxemburgische Unternehmen mit modernen, benutzerfreundlichen digitalen Werkzeugen zu stärken, die ihnen helfen, im digitalen Zeitalter zu wachsen und zu gedeihen.</p>
<h3>Unsere Lösungen</h3>
<ul>
<li><strong>OMS (omsflow.lu):</strong> Bestellverwaltung, Lagerhaltung und Rechnungsstellung für Letzshop-Verkäufer</li>
<li><strong>Loyalty (rewardflow.lu):</strong> Kundenbindungsprogramme mit Punkten, Prämien und Stufen</li>
<li><strong>Website Builder:</strong> Demnächst verfügbar — erstellen Sie Ihre Online-Präsenz</li>
</ul>
<h3>Made in Luxembourg</h3>
<p>Wir verstehen die einzigartigen Bedürfnisse des luxemburgischen Handels — von mehrsprachiger Unterstützung (FR/DE/EN) bis zur EU-MwSt-Konformität.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Iwwer Wizard</h2>
<p>Wizard ass den digitalen Toolkit fir lëtzebuerger Betriber. Mir bidden integréiert Léisunge fir Bestellverwaltung, Clientsfidélisatioun an Online-Präsenz.</p>
<h3>Eis Missioun</h3>
<p>Lëtzebuerger Betriber mat modernen, einfach ze benotzenden digitale Werkzeuger ze stäerken, fir hinnen ze hëllefen am digitalen Zäitalter ze wuessen.</p>
<h3>Eis Léisungen</h3>
<ul>
<li><strong>OMS (omsflow.lu):</strong> Bestellverwaltung, Lagerhaltung a Rechnungsstellung fir Letzshop-Verkeefer</li>
<li><strong>Loyalty (rewardflow.lu):</strong> Clientsfidélisatiounsprogrammer mat Punkten, Belounungen a Stufen</li>
<li><strong>Website Builder:</strong> Geschwënn disponibel — erstellt Är Online-Präsenz</li>
</ul>
<h3>Gemaach zu Lëtzebuerg</h3>
<p>Mir verstinn déi eenzegaarteg Besoinë vum lëtzebuerger Commerce — vu méisproocheger Ënnerstëtzung (FR/DE/EN) bis zur EU-MwSt-Konformitéit.</p>
</div>""",
),
"meta_description": "Wizard — the digital toolkit for Luxembourg businesses. Order management, loyalty programs, and more.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 1,
},
{
"slug": "contact",
"title": "Contact Us",
"title_translations": tt("Contact Us", "Contactez-nous", "Kontakt", "Kontakt"),
"content": """<div class="prose-content">
<h2>Contact Wizard</h2>
<p>We'd love to hear from you. Get in touch with our team.</p>
<h3>General Inquiries</h3>
<ul>
<li><strong>Email:</strong> info@wizard.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in our solutions for your business?</p>
<ul>
<li><strong>Email:</strong> sales@wizard.lu</li>
</ul>
<h3>Support</h3>
<p>Already a customer? Our support team is here to help.</p>
<ul>
<li><strong>Email:</strong> support@wizard.lu</li>
</ul>
<h3>Office</h3>
<p>Luxembourg</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Contact Wizard</h2>
<p>We'd love to hear from you. Get in touch with our team.</p>
<h3>General Inquiries</h3>
<ul>
<li><strong>Email:</strong> info@wizard.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in our solutions for your business?</p>
<ul>
<li><strong>Email:</strong> sales@wizard.lu</li>
</ul>
<h3>Support</h3>
<p>Already a customer? Our support team is here to help.</p>
<ul>
<li><strong>Email:</strong> support@wizard.lu</li>
</ul>
<h3>Office</h3>
<p>Luxembourg</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Contacter Wizard</h2>
<p>Nous serions ravis d'avoir de vos nouvelles. Contactez notre équipe.</p>
<h3>Renseignements généraux</h3>
<ul>
<li><strong>Email :</strong> info@wizard.lu</li>
</ul>
<h3>Ventes</h3>
<p>Intéressé par nos solutions pour votre entreprise ?</p>
<ul>
<li><strong>Email :</strong> sales@wizard.lu</li>
</ul>
<h3>Support</h3>
<p>Déjà client ? Notre équipe de support est là pour vous aider.</p>
<ul>
<li><strong>Email :</strong> support@wizard.lu</li>
</ul>
<h3>Bureau</h3>
<p>Luxembourg</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Kontaktieren Sie Wizard</h2>
<p>Wir freuen uns, von Ihnen zu hören. Nehmen Sie Kontakt mit unserem Team auf.</p>
<h3>Allgemeine Anfragen</h3>
<ul>
<li><strong>E-Mail:</strong> info@wizard.lu</li>
</ul>
<h3>Vertrieb</h3>
<p>Interessiert an unseren Lösungen für Ihr Unternehmen?</p>
<ul>
<li><strong>E-Mail:</strong> sales@wizard.lu</li>
</ul>
<h3>Support</h3>
<p>Bereits Kunde? Unser Support-Team hilft Ihnen gerne weiter.</p>
<ul>
<li><strong>E-Mail:</strong> support@wizard.lu</li>
</ul>
<h3>Büro</h3>
<p>Luxemburg</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Wizard kontaktéieren</h2>
<p>Mir géife gäre vun Iech héieren. Kontaktéiert eist Team.</p>
<h3>Allgemeng Ufroen</h3>
<ul>
<li><strong>E-Mail:</strong> info@wizard.lu</li>
</ul>
<h3>Verkaf</h3>
<p>Interesséiert un eise Léisunge fir Äre Betrib?</p>
<ul>
<li><strong>E-Mail:</strong> sales@wizard.lu</li>
</ul>
<h3>Support</h3>
<p>Schonn Client? Eist Support-Team ass do fir Iech ze hëllefen.</p>
<ul>
<li><strong>E-Mail:</strong> support@wizard.lu</li>
</ul>
<h3>Büro</h3>
<p>Lëtzebuerg</p>
</div>""",
),
"meta_description": "Contact the Wizard team for inquiries about our business solutions.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 2,
},
{
"slug": "faq",
"title": "FAQ",
"title_translations": tt("FAQ", "FAQ", "FAQ", "FAQ"),
"content": """<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h3>General</h3>
<h4>What is Wizard?</h4>
<p>Wizard is a suite of digital tools for Luxembourg businesses, including order management (OMS), customer loyalty programs, and website building.</p>
<h4>Who is Wizard for?</h4>
<p>Wizard is designed for Luxembourg businesses of all sizes — from individual Letzshop sellers to multi-store retailers.</p>
<h3>Pricing & Billing</h3>
<h4>Is there a free trial?</h4>
<p>Yes! All our solutions offer a free trial period. No credit card required to start.</p>
<h4>Can I switch plans?</h4>
<p>Yes, you can upgrade or downgrade your plan at any time.</p>
<h3>Technical</h3>
<h4>What languages are supported?</h4>
<p>Our platform supports French, German, and English — the three official languages of Luxembourg.</p>
<h4>Is my data secure?</h4>
<p>Yes. We use industry-standard encryption and follow GDPR regulations for data protection.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h3>General</h3>
<h4>What is Wizard?</h4>
<p>Wizard is a suite of digital tools for Luxembourg businesses, including order management (OMS), customer loyalty programs, and website building.</p>
<h4>Who is Wizard for?</h4>
<p>Wizard is designed for Luxembourg businesses of all sizes — from individual Letzshop sellers to multi-store retailers.</p>
<h3>Pricing & Billing</h3>
<h4>Is there a free trial?</h4>
<p>Yes! All our solutions offer a free trial period. No credit card required to start.</p>
<h4>Can I switch plans?</h4>
<p>Yes, you can upgrade or downgrade your plan at any time.</p>
<h3>Technical</h3>
<h4>What languages are supported?</h4>
<p>Our platform supports French, German, and English — the three official languages of Luxembourg.</p>
<h4>Is my data secure?</h4>
<p>Yes. We use industry-standard encryption and follow GDPR regulations for data protection.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Questions fréquemment posées</h2>
<h3>Général</h3>
<h4>Qu'est-ce que Wizard ?</h4>
<p>Wizard est une suite d'outils numériques pour les entreprises luxembourgeoises, comprenant la gestion des commandes (OMS), les programmes de fidélité client et la création de sites web.</p>
<h4>À qui s'adresse Wizard ?</h4>
<p>Wizard est conçu pour les entreprises luxembourgeoises de toutes tailles — des vendeurs Letzshop individuels aux détaillants multi-boutiques.</p>
<h3>Tarifs et facturation</h3>
<h4>Y a-t-il un essai gratuit ?</h4>
<p>Oui ! Toutes nos solutions offrent une période d'essai gratuite. Aucune carte de crédit requise pour commencer.</p>
<h4>Puis-je changer de plan ?</h4>
<p>Oui, vous pouvez passer à un plan supérieur ou inférieur à tout moment.</p>
<h3>Technique</h3>
<h4>Quelles langues sont supportées ?</h4>
<p>Notre plateforme supporte le français, l'allemand et l'anglais — les trois langues officielles du Luxembourg.</p>
<h4>Mes données sont-elles sécurisées ?</h4>
<p>Oui. Nous utilisons un chiffrement aux normes de l'industrie et respectons les réglementations RGPD pour la protection des données.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Häufig gestellte Fragen</h2>
<h3>Allgemein</h3>
<h4>Was ist Wizard?</h4>
<p>Wizard ist eine Suite digitaler Werkzeuge für luxemburgische Unternehmen, einschließlich Bestellverwaltung (OMS), Kundenbindungsprogramme und Website-Erstellung.</p>
<h4>Für wen ist Wizard gedacht?</h4>
<p>Wizard ist für luxemburgische Unternehmen jeder Größe konzipiert — von einzelnen Letzshop-Verkäufern bis hin zu Multi-Store-Einzelhändlern.</p>
<h3>Preise und Abrechnung</h3>
<h4>Gibt es eine kostenlose Testversion?</h4>
<p>Ja! Alle unsere Lösungen bieten eine kostenlose Testphase. Keine Kreditkarte erforderlich.</p>
<h4>Kann ich den Plan wechseln?</h4>
<p>Ja, Sie können Ihren Plan jederzeit upgraden oder downgraden.</p>
<h3>Technik</h3>
<h4>Welche Sprachen werden unterstützt?</h4>
<p>Unsere Plattform unterstützt Französisch, Deutsch und Englisch — die drei offiziellen Sprachen Luxemburgs.</p>
<h4>Sind meine Daten sicher?</h4>
<p>Ja. Wir verwenden branchenübliche Verschlüsselung und befolgen die DSGVO-Vorschriften zum Datenschutz.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Heefeg gestallte Froen</h2>
<h3>Allgemeng</h3>
<h4>Wat ass Wizard?</h4>
<p>Wizard ass eng Suite vun digitale Werkzeuger fir lëtzebuerger Betriber, inklusiv Bestellverwaltung (OMS), Clientsfidélisatiounsprogrammer a Website-Erstellen.</p>
<h4>Fir wie ass Wizard geduecht?</h4>
<p>Wizard ass fir lëtzebuerger Betriber vun all Gréisst konzipéiert — vun eenzelne Letzshop-Verkeefer bis zu Multi-Store-Detaillisten.</p>
<h3>Präisser a Rechnung</h3>
<h4>Gëtt et eng gratis Testversioun?</h4>
<p>Jo! All eis Léisunge bidden eng gratis Testphas. Keng Kreditkaart néideg fir unzefänken.</p>
<h4>Kann ech de Plang wiesselen?</h4>
<p>Jo, Dir kënnt Äre Plang jidderzäit upgraden oder downgraden.</p>
<h3>Technik</h3>
<h4>Wéi eng Sproochen ginn ënnerstëtzt?</h4>
<p>Eis Plattform ënnerstëtzt Franséisch, Däitsch an Englesch — déi dräi offiziell Sproochen vu Lëtzebuerg.</p>
<h4>Sinn meng Donnéeën sécher?</h4>
<p>Jo. Mir benotzen Industriestandard-Verschlësselung a befollegen d'DSGVO-Virschrëften fir den Dateschutz.</p>
</div>""",
),
"meta_description": "Frequently asked questions about Wizard solutions for Luxembourg businesses.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 3,
},
]
if platform_code == "oms":
return [
{
"slug": "about",
"title": "About OMS",
"title_translations": tt("About OMS", "À propos d'OMS", "Über OMS", "Iwwer OMS"),
"content": """<div class="prose-content">
<h2>About OMS by Wizard</h2>
<p>OMS (omsflow.lu) is a lightweight order management system built specifically for Letzshop sellers in Luxembourg.</p>
<h3>Why OMS?</h3>
<p>Letzshop is a great marketplace, but it doesn't give sellers the back-office tools they need. OMS fills that gap with:</p>
<ul>
<li><strong>Automatic order sync</strong> from Letzshop</li>
<li><strong>Inventory management</strong> with warehouse locations</li>
<li><strong>EU VAT invoicing</strong> with correct rates per country</li>
<li><strong>Customer data ownership</strong> for marketing and retention</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>From multilingual support to Luxembourg VAT compliance, OMS is designed for the local market.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>About OMS by Wizard</h2>
<p>OMS (omsflow.lu) is a lightweight order management system built specifically for Letzshop sellers in Luxembourg.</p>
<h3>Why OMS?</h3>
<p>Letzshop is a great marketplace, but it doesn't give sellers the back-office tools they need. OMS fills that gap with:</p>
<ul>
<li><strong>Automatic order sync</strong> from Letzshop</li>
<li><strong>Inventory management</strong> with warehouse locations</li>
<li><strong>EU VAT invoicing</strong> with correct rates per country</li>
<li><strong>Customer data ownership</strong> for marketing and retention</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>From multilingual support to Luxembourg VAT compliance, OMS is designed for the local market.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>À propos d'OMS par Wizard</h2>
<p>OMS (omsflow.lu) est un système de gestion de commandes léger conçu spécifiquement pour les vendeurs Letzshop au Luxembourg.</p>
<h3>Pourquoi OMS ?</h3>
<p>Letzshop est une excellente marketplace, mais elle ne fournit pas aux vendeurs les outils de back-office dont ils ont besoin. OMS comble ce manque avec :</p>
<ul>
<li><strong>Synchronisation automatique des commandes</strong> depuis Letzshop</li>
<li><strong>Gestion des stocks</strong> avec emplacements d'entrepôt</li>
<li><strong>Facturation TVA UE</strong> avec les taux corrects par pays</li>
<li><strong>Propriété des données clients</strong> pour le marketing et la fidélisation</li>
</ul>
<h3>Conçu pour le Luxembourg</h3>
<p>Du support multilingue à la conformité TVA luxembourgeoise, OMS est conçu pour le marché local.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Über OMS von Wizard</h2>
<p>OMS (omsflow.lu) ist ein leichtgewichtiges Bestellverwaltungssystem, das speziell für Letzshop-Verkäufer in Luxemburg entwickelt wurde.</p>
<h3>Warum OMS?</h3>
<p>Letzshop ist ein großartiger Marktplatz, bietet Verkäufern jedoch nicht die Back-Office-Tools, die sie benötigen. OMS schließt diese Lücke mit:</p>
<ul>
<li><strong>Automatische Bestellsynchronisation</strong> von Letzshop</li>
<li><strong>Lagerverwaltung</strong> mit Lagerstandorten</li>
<li><strong>EU-MwSt-Rechnungsstellung</strong> mit korrekten Sätzen pro Land</li>
<li><strong>Kundendaten-Eigentum</strong> für Marketing und Kundenbindung</li>
</ul>
<h3>Für Luxemburg entwickelt</h3>
<p>Von mehrsprachiger Unterstützung bis zur luxemburgischen MwSt-Konformität — OMS ist für den lokalen Markt konzipiert.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Iwwer OMS vun Wizard</h2>
<p>OMS (omsflow.lu) ass e liichten Bestellverwaltungssystem, dat speziell fir Letzshop-Verkeefer zu Lëtzebuerg entwéckelt gouf.</p>
<h3>Firwat OMS?</h3>
<p>Letzshop ass e super Marché, awer et gëtt de Verkeefer net déi Back-Office-Tools déi si brauchen. OMS fëllt dës Lück mat:</p>
<ul>
<li><strong>Automatesch Bestellsynchronisatioun</strong> vun Letzshop</li>
<li><strong>Lagerverwaltung</strong> mat Lagerstanduerten</li>
<li><strong>EU-MwSt-Rechnungsstellung</strong> mat korrekten Taux pro Land</li>
<li><strong>Clientsdaten-Eegentum</strong> fir Marketing a Clientsfidélisatioun</li>
</ul>
<h3>Fir Lëtzebuerg entwéckelt</h3>
<p>Vu méisproocheger Ënnerstëtzung bis zur lëtzebuerger MwSt-Konformitéit — OMS ass fir de lokale Marché konzipéiert.</p>
</div>""",
),
"meta_description": "OMS — lightweight order management for Letzshop sellers. Manage orders, inventory, and invoicing.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 1,
},
{
"slug": "contact",
"title": "Contact OMS Support",
"title_translations": tt("Contact OMS Support", "Contacter le support OMS", "OMS Support kontaktieren", "OMS Support kontaktéieren"),
"content": """<div class="prose-content">
<h2>Contact OMS Support</h2>
<p>Need help with your order management? We're here for you.</p>
<h3>Support</h3>
<ul>
<li><strong>Email:</strong> support@omsflow.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in OMS for your Letzshop store?</p>
<ul>
<li><strong>Email:</strong> sales@omsflow.lu</li>
</ul>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Contact OMS Support</h2>
<p>Need help with your order management? We're here for you.</p>
<h3>Support</h3>
<ul>
<li><strong>Email:</strong> support@omsflow.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in OMS for your Letzshop store?</p>
<ul>
<li><strong>Email:</strong> sales@omsflow.lu</li>
</ul>
</div>""",
# French
"""<div class="prose-content">
<h2>Contacter le support OMS</h2>
<p>Besoin d'aide avec votre gestion de commandes ? Nous sommes là pour vous.</p>
<h3>Support</h3>
<ul>
<li><strong>Email :</strong> support@omsflow.lu</li>
</ul>
<h3>Ventes</h3>
<p>Intéressé par OMS pour votre boutique Letzshop ?</p>
<ul>
<li><strong>Email :</strong> sales@omsflow.lu</li>
</ul>
</div>""",
# German
"""<div class="prose-content">
<h2>OMS Support kontaktieren</h2>
<p>Brauchen Sie Hilfe bei Ihrer Bestellverwaltung? Wir sind für Sie da.</p>
<h3>Support</h3>
<ul>
<li><strong>E-Mail:</strong> support@omsflow.lu</li>
</ul>
<h3>Vertrieb</h3>
<p>Interessiert an OMS für Ihren Letzshop-Shop?</p>
<ul>
<li><strong>E-Mail:</strong> sales@omsflow.lu</li>
</ul>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>OMS Support kontaktéieren</h2>
<p>Braucht Dir Hëllef mat Ärer Bestellverwaltung? Mir sinn do fir Iech.</p>
<h3>Support</h3>
<ul>
<li><strong>E-Mail:</strong> support@omsflow.lu</li>
</ul>
<h3>Verkaf</h3>
<p>Interesséiert un OMS fir Äre Letzshop-Shop?</p>
<ul>
<li><strong>E-Mail:</strong> sales@omsflow.lu</li>
</ul>
</div>""",
),
"meta_description": "Contact the OMS support team for help with order management.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 2,
},
{
"slug": "faq",
"title": "OMS FAQ",
"title_translations": tt("OMS FAQ", "FAQ OMS", "OMS FAQ", "OMS FAQ"),
"content": """<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>Do I need a Letzshop account?</h4>
<p>While OMS works best with Letzshop integration, you can also use it as a standalone order management tool.</p>
<h4>How does Letzshop sync work?</h4>
<p>Enter your Letzshop API credentials and orders sync automatically. Setup takes about 2 minutes.</p>
<h4>Is EU VAT invoicing included?</h4>
<p>Yes, EU VAT invoicing is available on Professional and Enterprise plans. Luxembourg VAT is available on all plans.</p>
<h4>Can I export my data?</h4>
<p>Yes, you can export customers, orders, and invoices at any time.</p>
<h4>Is there a free trial?</h4>
<p>Yes! Start with a free trial, no credit card required.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>Do I need a Letzshop account?</h4>
<p>While OMS works best with Letzshop integration, you can also use it as a standalone order management tool.</p>
<h4>How does Letzshop sync work?</h4>
<p>Enter your Letzshop API credentials and orders sync automatically. Setup takes about 2 minutes.</p>
<h4>Is EU VAT invoicing included?</h4>
<p>Yes, EU VAT invoicing is available on Professional and Enterprise plans. Luxembourg VAT is available on all plans.</p>
<h4>Can I export my data?</h4>
<p>Yes, you can export customers, orders, and invoices at any time.</p>
<h4>Is there a free trial?</h4>
<p>Yes! Start with a free trial, no credit card required.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Questions fréquemment posées</h2>
<h4>Ai-je besoin d'un compte Letzshop ?</h4>
<p>Bien qu'OMS fonctionne mieux avec l'intégration Letzshop, vous pouvez aussi l'utiliser comme outil de gestion de commandes autonome.</p>
<h4>Comment fonctionne la synchronisation Letzshop ?</h4>
<p>Entrez vos identifiants API Letzshop et les commandes se synchronisent automatiquement. La configuration prend environ 2 minutes.</p>
<h4>La facturation TVA UE est-elle incluse ?</h4>
<p>Oui, la facturation TVA UE est disponible sur les plans Professionnel et Entreprise. La TVA luxembourgeoise est disponible sur tous les plans.</p>
<h4>Puis-je exporter mes données ?</h4>
<p>Oui, vous pouvez exporter les clients, commandes et factures à tout moment.</p>
<h4>Y a-t-il un essai gratuit ?</h4>
<p>Oui ! Commencez avec un essai gratuit, aucune carte de crédit requise.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Häufig gestellte Fragen</h2>
<h4>Brauche ich ein Letzshop-Konto?</h4>
<p>OMS funktioniert am besten mit der Letzshop-Integration, kann aber auch als eigenständiges Bestellverwaltungstool verwendet werden.</p>
<h4>Wie funktioniert die Letzshop-Synchronisation?</h4>
<p>Geben Sie Ihre Letzshop-API-Zugangsdaten ein und die Bestellungen werden automatisch synchronisiert. Die Einrichtung dauert etwa 2 Minuten.</p>
<h4>Ist die EU-MwSt-Rechnungsstellung enthalten?</h4>
<p>Ja, die EU-MwSt-Rechnungsstellung ist in den Professional- und Enterprise-Plänen verfügbar. Luxemburger MwSt ist in allen Plänen verfügbar.</p>
<h4>Kann ich meine Daten exportieren?</h4>
<p>Ja, Sie können Kunden, Bestellungen und Rechnungen jederzeit exportieren.</p>
<h4>Gibt es eine kostenlose Testversion?</h4>
<p>Ja! Starten Sie mit einer kostenlosen Testversion, keine Kreditkarte erforderlich.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Heefeg gestallte Froen</h2>
<h4>Brauch ech e Letzshop-Konto?</h4>
<p>OMS funktionéiert am beschten mat der Letzshop-Integratioun, kann awer och als eegenstännegt Bestellverwaltungs-Tool benotzt ginn.</p>
<h4>Wéi funktionéiert d'Letzshop-Synchronisatioun?</h4>
<p>Gitt Är Letzshop-API-Zougangsdaten an an d'Bestellunge synchroniséiere sech automatesch. D'Astellung dauert ongeféier 2 Minutten.</p>
<h4>Ass d'EU-MwSt-Rechnungsstellung abegraff?</h4>
<p>Jo, d'EU-MwSt-Rechnungsstellung ass an de Professional- a Enterprise-Pläng disponibel. Lëtzebuerger MwSt ass an alle Pläng disponibel.</p>
<h4>Kann ech meng Donnéeën exportéieren?</h4>
<p>Jo, Dir kënnt Clienten, Bestellungen a Rechnungen jidderzäit exportéieren.</p>
<h4>Gëtt et eng gratis Testversioun?</h4>
<p>Jo! Start mat enger gratis Testversioun, keng Kreditkaart néideg.</p>
</div>""",
),
"meta_description": "Frequently asked questions about OMS order management for Letzshop sellers.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 3,
},
]
if platform_code == "loyalty":
return [
{
"slug": "about",
"title": "About Loyalty",
"title_translations": tt("About Loyalty", "À propos de Loyalty", "Über Loyalty", "Iwwer Loyalty"),
"content": """<div class="prose-content">
<h2>About Loyalty by Wizard</h2>
<p>Loyalty (rewardflow.lu) helps Luxembourg businesses create engaging customer loyalty programs.</p>
<h3>What We Offer</h3>
<ul>
<li><strong>Points system:</strong> Award points for purchases with flexible rules</li>
<li><strong>Rewards catalog:</strong> Products, discounts, or exclusive experiences</li>
<li><strong>Tier management:</strong> Bronze, Silver, Gold — progressive loyalty levels</li>
<li><strong>Analytics:</strong> Track engagement, retention, and program ROI</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>Multilingual support (FR/DE/EN) and local business features out of the box.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>About Loyalty by Wizard</h2>
<p>Loyalty (rewardflow.lu) helps Luxembourg businesses create engaging customer loyalty programs.</p>
<h3>What We Offer</h3>
<ul>
<li><strong>Points system:</strong> Award points for purchases with flexible rules</li>
<li><strong>Rewards catalog:</strong> Products, discounts, or exclusive experiences</li>
<li><strong>Tier management:</strong> Bronze, Silver, Gold — progressive loyalty levels</li>
<li><strong>Analytics:</strong> Track engagement, retention, and program ROI</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>Multilingual support (FR/DE/EN) and local business features out of the box.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>À propos de Loyalty par Wizard</h2>
<p>Loyalty (rewardflow.lu) aide les entreprises luxembourgeoises à créer des programmes de fidélité client engageants.</p>
<h3>Ce que nous offrons</h3>
<ul>
<li><strong>Système de points :</strong> Attribuez des points pour les achats avec des règles flexibles</li>
<li><strong>Catalogue de récompenses :</strong> Produits, remises ou expériences exclusives</li>
<li><strong>Gestion des niveaux :</strong> Bronze, Argent, Or — niveaux de fidélité progressifs</li>
<li><strong>Analytique :</strong> Suivez l'engagement, la rétention et le ROI du programme</li>
</ul>
<h3>Conçu pour le Luxembourg</h3>
<p>Support multilingue (FR/DE/EN) et fonctionnalités adaptées aux entreprises locales.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Über Loyalty von Wizard</h2>
<p>Loyalty (rewardflow.lu) hilft luxemburgischen Unternehmen, ansprechende Kundenbindungsprogramme zu erstellen.</p>
<h3>Was wir bieten</h3>
<ul>
<li><strong>Punktesystem:</strong> Vergeben Sie Punkte für Einkäufe mit flexiblen Regeln</li>
<li><strong>Prämienkatalog:</strong> Produkte, Rabatte oder exklusive Erlebnisse</li>
<li><strong>Stufenverwaltung:</strong> Bronze, Silber, Gold — progressive Treuestufen</li>
<li><strong>Analytik:</strong> Verfolgen Sie Engagement, Bindungsraten und Programm-ROI</li>
</ul>
<h3>Für Luxemburg entwickelt</h3>
<p>Mehrsprachige Unterstützung (FR/DE/EN) und lokale Geschäftsfunktionen von Anfang an.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Iwwer Loyalty vun Wizard</h2>
<p>Loyalty (rewardflow.lu) hëlleft lëtzebuerger Betriber, engagéierend Clientsfidélisatiounsprogrammer ze erstellen.</p>
<h3>Wat mir bidden</h3>
<ul>
<li><strong>Punktesystem:</strong> Vergitt Punkten fir Akaf mat flexibele Reegelen</li>
<li><strong>Belounungskatalog:</strong> Produkter, Remisen oder exklusiv Erfarungen</li>
<li><strong>Stufeverwaltung:</strong> Bronze, Sëlwer, Gold — progressiv Treiëstufen</li>
<li><strong>Analytik:</strong> Verfollegt Engagement, Bindungsraten an de Programm-ROI</li>
</ul>
<h3>Fir Lëtzebuerg entwéckelt</h3>
<p>Méisproocheg Ënnerstëtzung (FR/DE/EN) a lokal Geschäftsfunktiounen vun Ufank un.</p>
</div>""",
),
"meta_description": "Loyalty — customer loyalty programs for Luxembourg businesses. Points, rewards, and tiers.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 1,
},
{
"slug": "contact",
"title": "Contact Loyalty Support",
"title_translations": tt("Contact Loyalty Support", "Contacter le support Loyalty", "Loyalty Support kontaktieren", "Loyalty Support kontaktéieren"),
"content": """<div class="prose-content">
<h2>Contact Loyalty Support</h2>
<p>Need help with your loyalty program? We're here for you.</p>
<h3>Support</h3>
<ul>
<li><strong>Email:</strong> support@rewardflow.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in a loyalty program for your business?</p>
<ul>
<li><strong>Email:</strong> sales@rewardflow.lu</li>
</ul>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Contact Loyalty Support</h2>
<p>Need help with your loyalty program? We're here for you.</p>
<h3>Support</h3>
<ul>
<li><strong>Email:</strong> support@rewardflow.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in a loyalty program for your business?</p>
<ul>
<li><strong>Email:</strong> sales@rewardflow.lu</li>
</ul>
</div>""",
# French
"""<div class="prose-content">
<h2>Contacter le support Loyalty</h2>
<p>Besoin d'aide avec votre programme de fidélité ? Nous sommes là pour vous.</p>
<h3>Support</h3>
<ul>
<li><strong>Email :</strong> support@rewardflow.lu</li>
</ul>
<h3>Ventes</h3>
<p>Intéressé par un programme de fidélité pour votre entreprise ?</p>
<ul>
<li><strong>Email :</strong> sales@rewardflow.lu</li>
</ul>
</div>""",
# German
"""<div class="prose-content">
<h2>Loyalty Support kontaktieren</h2>
<p>Brauchen Sie Hilfe mit Ihrem Treueprogramm? Wir sind für Sie da.</p>
<h3>Support</h3>
<ul>
<li><strong>E-Mail:</strong> support@rewardflow.lu</li>
</ul>
<h3>Vertrieb</h3>
<p>Interessiert an einem Treueprogramm für Ihr Unternehmen?</p>
<ul>
<li><strong>E-Mail:</strong> sales@rewardflow.lu</li>
</ul>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Loyalty Support kontaktéieren</h2>
<p>Braucht Dir Hëllef mat Ärem Treiëprogramm? Mir sinn do fir Iech.</p>
<h3>Support</h3>
<ul>
<li><strong>E-Mail:</strong> support@rewardflow.lu</li>
</ul>
<h3>Verkaf</h3>
<p>Interesséiert un engem Treiëprogramm fir Äre Betrib?</p>
<ul>
<li><strong>E-Mail:</strong> sales@rewardflow.lu</li>
</ul>
</div>""",
),
"meta_description": "Contact the Loyalty support team for help with your loyalty program.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 2,
},
{
"slug": "faq",
"title": "Loyalty FAQ",
"title_translations": tt("Loyalty FAQ", "FAQ Loyalty", "Loyalty FAQ", "Loyalty FAQ"),
"content": """<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>How do loyalty points work?</h4>
<p>You define the rules — for example, 1 point per euro spent. Points can be redeemed for rewards from your catalog.</p>
<h4>Can I customize the loyalty tiers?</h4>
<p>Yes! You can create custom tiers with different names, thresholds, and benefits.</p>
<h4>How do customers check their points?</h4>
<p>Customers can check their balance through a personalized loyalty page or at your point of sale.</p>
<h4>Is there a free trial?</h4>
<p>Yes! Start with a free trial, no credit card required.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>How do loyalty points work?</h4>
<p>You define the rules — for example, 1 point per euro spent. Points can be redeemed for rewards from your catalog.</p>
<h4>Can I customize the loyalty tiers?</h4>
<p>Yes! You can create custom tiers with different names, thresholds, and benefits.</p>
<h4>How do customers check their points?</h4>
<p>Customers can check their balance through a personalized loyalty page or at your point of sale.</p>
<h4>Is there a free trial?</h4>
<p>Yes! Start with a free trial, no credit card required.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Questions fréquemment posées</h2>
<h4>Comment fonctionnent les points de fidélité ?</h4>
<p>Vous définissez les règles — par exemple, 1 point par euro dépensé. Les points peuvent être échangés contre des récompenses de votre catalogue.</p>
<h4>Puis-je personnaliser les niveaux de fidélité ?</h4>
<p>Oui ! Vous pouvez créer des niveaux personnalisés avec des noms, seuils et avantages différents.</p>
<h4>Comment les clients vérifient-ils leurs points ?</h4>
<p>Les clients peuvent consulter leur solde via une page de fidélité personnalisée ou à votre point de vente.</p>
<h4>Y a-t-il un essai gratuit ?</h4>
<p>Oui ! Commencez avec un essai gratuit, aucune carte de crédit requise.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Häufig gestellte Fragen</h2>
<h4>Wie funktionieren Treuepunkte?</h4>
<p>Sie definieren die Regeln — zum Beispiel 1 Punkt pro ausgegebenem Euro. Punkte können gegen Prämien aus Ihrem Katalog eingelöst werden.</p>
<h4>Kann ich die Treuestufen anpassen?</h4>
<p>Ja! Sie können benutzerdefinierte Stufen mit verschiedenen Namen, Schwellenwerten und Vorteilen erstellen.</p>
<h4>Wie überprüfen Kunden ihre Punkte?</h4>
<p>Kunden können ihren Kontostand über eine personalisierte Treueseite oder an Ihrer Verkaufsstelle überprüfen.</p>
<h4>Gibt es eine kostenlose Testversion?</h4>
<p>Ja! Starten Sie mit einer kostenlosen Testversion, keine Kreditkarte erforderlich.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Heefeg gestallte Froen</h2>
<h4>Wéi funktionéieren Treiëpunkten?</h4>
<p>Dir definéiert d'Reegelen — zum Beispill 1 Punkt pro ausgeebenen Euro. Punkten kënnen géint Belounungen aus Ärem Katalog ageléist ginn.</p>
<h4>Kann ech d'Treiëstufe personaliséieren?</h4>
<p>Jo! Dir kënnt personaliséiert Stufe mat verschiddenen Nimm, Schwellenwäerter a Virdeeler erstellen.</p>
<h4>Wéi kucken d'Clienten hir Punkten no?</h4>
<p>Clientë kënnen hire Solde iwwer eng personaliséiert Treiësäit oder un Ärer Verkafsstell nokucken.</p>
<h4>Gëtt et eng gratis Testversioun?</h4>
<p>Jo! Start mat enger gratis Testversioun, keng Kreditkaart néideg.</p>
</div>""",
),
"meta_description": "Frequently asked questions about Loyalty customer loyalty programs.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 3,
},
]
if platform_code == "hosting":
return [
{
"slug": "about",
"title": "About HostWizard",
"title_translations": tt("About HostWizard", "À propos de HostWizard", "Über HostWizard", "Iwwer HostWizard"),
"content": """<div class="prose-content">
<h2>About HostWizard</h2>
<p>HostWizard (hostwizard.lu) provides professional web hosting, domain registration, and website creation for Luxembourg businesses.</p>
<h3>Our Services</h3>
<ul>
<li><strong>Website Creation:</strong> Professional websites with an integrated CMS for easy content management</li>
<li><strong>Domain Registration:</strong> .lu and international domain registration and management</li>
<li><strong>Professional Email:</strong> Custom mailboxes with your domain name</li>
<li><strong>Secure Hosting:</strong> Fast, reliable hosting with SSL certificates included</li>
<li><strong>Maintenance:</strong> Ongoing website maintenance and support</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>Multilingual support (FR/DE/EN/LB) and tailored for the Luxembourg business landscape.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>About HostWizard</h2>
<p>HostWizard (hostwizard.lu) provides professional web hosting, domain registration, and website creation for Luxembourg businesses.</p>
<h3>Our Services</h3>
<ul>
<li><strong>Website Creation:</strong> Professional websites with an integrated CMS for easy content management</li>
<li><strong>Domain Registration:</strong> .lu and international domain registration and management</li>
<li><strong>Professional Email:</strong> Custom mailboxes with your domain name</li>
<li><strong>Secure Hosting:</strong> Fast, reliable hosting with SSL certificates included</li>
<li><strong>Maintenance:</strong> Ongoing website maintenance and support</li>
</ul>
<h3>Built for Luxembourg</h3>
<p>Multilingual support (FR/DE/EN/LB) and tailored for the Luxembourg business landscape.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>À propos de HostWizard</h2>
<p>HostWizard (hostwizard.lu) fournit l'hébergement web professionnel, l'enregistrement de domaines et la création de sites web pour les entreprises luxembourgeoises.</p>
<h3>Nos services</h3>
<ul>
<li><strong>Création de sites web :</strong> Sites web professionnels avec un CMS intégré pour une gestion facile du contenu</li>
<li><strong>Enregistrement de domaines :</strong> Enregistrement et gestion de domaines .lu et internationaux</li>
<li><strong>E-mail professionnel :</strong> Boîtes mail personnalisées avec votre nom de domaine</li>
<li><strong>Hébergement sécurisé :</strong> Hébergement rapide et fiable avec certificats SSL inclus</li>
<li><strong>Maintenance :</strong> Maintenance et support continus de votre site web</li>
</ul>
<h3>Conçu pour le Luxembourg</h3>
<p>Support multilingue (FR/DE/EN/LB) et adapté au paysage commercial luxembourgeois.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Über HostWizard</h2>
<p>HostWizard (hostwizard.lu) bietet professionelles Webhosting, Domainregistrierung und Website-Erstellung für luxemburgische Unternehmen.</p>
<h3>Unsere Dienstleistungen</h3>
<ul>
<li><strong>Website-Erstellung:</strong> Professionelle Websites mit integriertem CMS für einfache Inhaltsverwaltung</li>
<li><strong>Domainregistrierung:</strong> .lu und internationale Domainregistrierung und -verwaltung</li>
<li><strong>Professionelle E-Mail:</strong> Individuelle Postfächer mit Ihrem Domainnamen</li>
<li><strong>Sicheres Hosting:</strong> Schnelles, zuverlässiges Hosting mit SSL-Zertifikaten inklusive</li>
<li><strong>Wartung:</strong> Laufende Website-Wartung und Support</li>
</ul>
<h3>Für Luxemburg entwickelt</h3>
<p>Mehrsprachige Unterstützung (FR/DE/EN/LB) und maßgeschneidert für die luxemburgische Geschäftswelt.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Iwwer HostWizard</h2>
<p>HostWizard (hostwizard.lu) bitt professionellt Webhosting, Domainregistréierung a Website-Erstellen fir lëtzebuerger Betriber.</p>
<h3>Eis Servicer</h3>
<ul>
<li><strong>Website-Erstellen:</strong> Professionell Websäite mat integréiertem CMS fir einfach Inhaltsverwaltung</li>
<li><strong>Domainregistréierung:</strong> .lu an international Domainregistréierung a -verwaltung</li>
<li><strong>Professionell E-Mail:</strong> Personaliséiert Postfächer mat Ärem Domännumm</li>
<li><strong>Séchert Hosting:</strong> Séiert, zouverlässegt Hosting mat SSL-Zertifikater abegraff</li>
<li><strong>Wartung:</strong> Lafend Website-Wartung a Support</li>
</ul>
<h3>Fir Lëtzebuerg entwéckelt</h3>
<p>Méisproocheg Ënnerstëtzung (FR/DE/EN/LB) an ugepasst un d'lëtzebuerger Geschäftswelt.</p>
</div>""",
),
"meta_description": "HostWizard — professional web hosting, domains, and website creation for Luxembourg businesses.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 1,
},
{
"slug": "services",
"title": "Our Services",
"title_translations": tt("Our Services", "Nos services", "Unsere Dienstleistungen", "Eis Servicer"),
"content": """<div class="prose-content">
<h2>HostWizard Services</h2>
<h3>Website Creation</h3>
<p>We build professional websites for your business with our integrated CMS. You can edit your content anytime, or let us handle it for you.</p>
<h3>Domain Names</h3>
<p>Register and manage .lu domains and international domain names. We handle DNS configuration and renewals.</p>
<h3>Professional Email</h3>
<p>Get professional email addresses with your domain name (e.g., info@yourbusiness.lu). Multiple mailboxes available.</p>
<h3>Hosting & SSL</h3>
<p>Fast, secure hosting with free SSL certificates. Your website is always online and protected.</p>
<h3>Website Maintenance</h3>
<p>Ongoing updates, security patches, and content changes. We keep your website running smoothly.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>HostWizard Services</h2>
<h3>Website Creation</h3>
<p>We build professional websites for your business with our integrated CMS. You can edit your content anytime, or let us handle it for you.</p>
<h3>Domain Names</h3>
<p>Register and manage .lu domains and international domain names. We handle DNS configuration and renewals.</p>
<h3>Professional Email</h3>
<p>Get professional email addresses with your domain name (e.g., info@yourbusiness.lu). Multiple mailboxes available.</p>
<h3>Hosting & SSL</h3>
<p>Fast, secure hosting with free SSL certificates. Your website is always online and protected.</p>
<h3>Website Maintenance</h3>
<p>Ongoing updates, security patches, and content changes. We keep your website running smoothly.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Services HostWizard</h2>
<h3>Création de sites web</h3>
<p>Nous créons des sites web professionnels pour votre entreprise avec notre CMS intégré. Vous pouvez modifier votre contenu à tout moment, ou nous laisser le gérer pour vous.</p>
<h3>Noms de domaine</h3>
<p>Enregistrez et gérez des domaines .lu et des noms de domaine internationaux. Nous gérons la configuration DNS et les renouvellements.</p>
<h3>E-mail professionnel</h3>
<p>Obtenez des adresses e-mail professionnelles avec votre nom de domaine (ex. : info@votreentreprise.lu). Plusieurs boîtes mail disponibles.</p>
<h3>Hébergement et SSL</h3>
<p>Hébergement rapide et sécurisé avec certificats SSL gratuits. Votre site web est toujours en ligne et protégé.</p>
<h3>Maintenance de site web</h3>
<p>Mises à jour continues, correctifs de sécurité et modifications de contenu. Nous maintenons votre site web en bon état de fonctionnement.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>HostWizard Dienstleistungen</h2>
<h3>Website-Erstellung</h3>
<p>Wir erstellen professionelle Websites für Ihr Unternehmen mit unserem integrierten CMS. Sie können Ihre Inhalte jederzeit bearbeiten oder uns damit beauftragen.</p>
<h3>Domainnamen</h3>
<p>Registrieren und verwalten Sie .lu-Domains und internationale Domainnamen. Wir kümmern uns um DNS-Konfiguration und Verlängerungen.</p>
<h3>Professionelle E-Mail</h3>
<p>Erhalten Sie professionelle E-Mail-Adressen mit Ihrem Domainnamen (z.B. info@ihrunternehmen.lu). Mehrere Postfächer verfügbar.</p>
<h3>Hosting und SSL</h3>
<p>Schnelles, sicheres Hosting mit kostenlosen SSL-Zertifikaten. Ihre Website ist immer online und geschützt.</p>
<h3>Website-Wartung</h3>
<p>Laufende Updates, Sicherheitspatches und Inhaltsänderungen. Wir halten Ihre Website reibungslos am Laufen.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>HostWizard Servicer</h2>
<h3>Website-Erstellen</h3>
<p>Mir bauen professionell Websäite fir Äre Betrib mat eisem integréierte CMS. Dir kënnt Ären Inhalt jidderzäit änneren, oder loosst eis dat fir Iech maachen.</p>
<h3>Domänennimm</h3>
<p>Registréiert a geréiert .lu-Domänen an international Domänennimm. Mir këmmeren eis ëm DNS-Konfiguratioun an Erneierungen.</p>
<h3>Professionell E-Mail</h3>
<p>Kritt professionell E-Mail-Adressen mat Ärem Domännumm (z.B. info@ärebetrib.lu). Méi Postfächer disponibel.</p>
<h3>Hosting an SSL</h3>
<p>Séiert, séchert Hosting mat gratis SSL-Zertifikater. Är Websäit ass ëmmer online a geschützt.</p>
<h3>Website-Wartung</h3>
<p>Lafend Updates, Sécherheetspatches an Inhaltsännerungen. Mir halen Är Websäit reibungslos am Lafen.</p>
</div>""",
),
"meta_description": "HostWizard services — website creation, domains, email, hosting, and maintenance for Luxembourg businesses.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 2,
},
{
"slug": "pricing",
"title": "Pricing",
"title_translations": tt("Pricing", "Tarifs", "Preise", "Präisser"),
"content": """<div class="prose-content">
<h2>HostWizard Pricing</h2>
<p>Transparent pricing for all our services. No hidden fees.</p>
<h3>Website Packages</h3>
<p>Contact us for a personalized quote based on your needs. We start with a free POC (proof of concept) website so you can see the result before committing.</p>
<h3>Domain Registration</h3>
<p>.lu domains starting from €29/year. International domains available.</p>
<h3>Email Hosting</h3>
<p>Professional email from €5/mailbox/month.</p>
<h3>Website Maintenance</h3>
<p>Monthly maintenance plans starting from €49/month.</p>
<p><strong>Contact us for a custom quote:</strong> info@hostwizard.lu</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>HostWizard Pricing</h2>
<p>Transparent pricing for all our services. No hidden fees.</p>
<h3>Website Packages</h3>
<p>Contact us for a personalized quote based on your needs. We start with a free POC (proof of concept) website so you can see the result before committing.</p>
<h3>Domain Registration</h3>
<p>.lu domains starting from €29/year. International domains available.</p>
<h3>Email Hosting</h3>
<p>Professional email from €5/mailbox/month.</p>
<h3>Website Maintenance</h3>
<p>Monthly maintenance plans starting from €49/month.</p>
<p><strong>Contact us for a custom quote:</strong> info@hostwizard.lu</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Tarifs HostWizard</h2>
<p>Des tarifs transparents pour tous nos services. Aucun frais caché.</p>
<h3>Forfaits sites web</h3>
<p>Contactez-nous pour un devis personnalisé selon vos besoins. Nous commençons par un site POC (preuve de concept) gratuit pour que vous puissiez voir le résultat avant de vous engager.</p>
<h3>Enregistrement de domaines</h3>
<p>Domaines .lu à partir de 29 €/an. Domaines internationaux disponibles.</p>
<h3>Hébergement e-mail</h3>
<p>E-mail professionnel à partir de 5 €/boîte mail/mois.</p>
<h3>Maintenance de site web</h3>
<p>Plans de maintenance mensuels à partir de 49 €/mois.</p>
<p><strong>Contactez-nous pour un devis personnalisé :</strong> info@hostwizard.lu</p>
</div>""",
# German
"""<div class="prose-content">
<h2>HostWizard Preise</h2>
<p>Transparente Preise für alle unsere Dienstleistungen. Keine versteckten Gebühren.</p>
<h3>Website-Pakete</h3>
<p>Kontaktieren Sie uns für ein personalisiertes Angebot nach Ihren Bedürfnissen. Wir beginnen mit einer kostenlosen POC-Website (Proof of Concept), damit Sie das Ergebnis sehen können, bevor Sie sich verpflichten.</p>
<h3>Domainregistrierung</h3>
<p>.lu-Domains ab 29 €/Jahr. Internationale Domains verfügbar.</p>
<h3>E-Mail-Hosting</h3>
<p>Professionelle E-Mail ab 5 €/Postfach/Monat.</p>
<h3>Website-Wartung</h3>
<p>Monatliche Wartungspläne ab 49 €/Monat.</p>
<p><strong>Kontaktieren Sie uns für ein individuelles Angebot:</strong> info@hostwizard.lu</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>HostWizard Präisser</h2>
<p>Transparent Präisser fir all eis Servicer. Keng verstoppte Käschten.</p>
<h3>Website-Paketen</h3>
<p>Kontaktéiert eis fir en personaliséierten Devis no Äre Besoinë. Mir fänken mat enger gratis POC-Websäit (Proof of Concept) un, sou datt Dir d'Resultat gesitt ier Dir Iech engagéiert.</p>
<h3>Domainregistréierung</h3>
<p>.lu-Domänen ab 29 €/Joer. International Domänen disponibel.</p>
<h3>E-Mail-Hosting</h3>
<p>Professionell E-Mail ab 5 €/Postfach/Mount.</p>
<h3>Website-Wartung</h3>
<p>Monatslech Wartungspläng ab 49 €/Mount.</p>
<p><strong>Kontaktéiert eis fir en individuellt Offert:</strong> info@hostwizard.lu</p>
</div>""",
),
"meta_description": "HostWizard pricing — transparent pricing for websites, domains, email, and hosting.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 3,
},
{
"slug": "contact",
"title": "Contact HostWizard",
"title_translations": tt("Contact HostWizard", "Contacter HostWizard", "HostWizard kontaktieren", "HostWizard kontaktéieren"),
"content": """<div class="prose-content">
<h2>Contact HostWizard</h2>
<p>Ready to bring your business online? Get in touch with our team.</p>
<h3>General Inquiries</h3>
<ul>
<li><strong>Email:</strong> info@hostwizard.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in a website for your business?</p>
<ul>
<li><strong>Email:</strong> sales@hostwizard.lu</li>
</ul>
<h3>Support</h3>
<p>Already a customer? Our support team is here to help.</p>
<ul>
<li><strong>Email:</strong> support@hostwizard.lu</li>
</ul>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Contact HostWizard</h2>
<p>Ready to bring your business online? Get in touch with our team.</p>
<h3>General Inquiries</h3>
<ul>
<li><strong>Email:</strong> info@hostwizard.lu</li>
</ul>
<h3>Sales</h3>
<p>Interested in a website for your business?</p>
<ul>
<li><strong>Email:</strong> sales@hostwizard.lu</li>
</ul>
<h3>Support</h3>
<p>Already a customer? Our support team is here to help.</p>
<ul>
<li><strong>Email:</strong> support@hostwizard.lu</li>
</ul>
</div>""",
# French
"""<div class="prose-content">
<h2>Contacter HostWizard</h2>
<p>Prêt à mettre votre entreprise en ligne ? Contactez notre équipe.</p>
<h3>Renseignements généraux</h3>
<ul>
<li><strong>Email :</strong> info@hostwizard.lu</li>
</ul>
<h3>Ventes</h3>
<p>Intéressé par un site web pour votre entreprise ?</p>
<ul>
<li><strong>Email :</strong> sales@hostwizard.lu</li>
</ul>
<h3>Support</h3>
<p>Déjà client ? Notre équipe de support est là pour vous aider.</p>
<ul>
<li><strong>Email :</strong> support@hostwizard.lu</li>
</ul>
</div>""",
# German
"""<div class="prose-content">
<h2>HostWizard kontaktieren</h2>
<p>Bereit, Ihr Unternehmen online zu bringen? Nehmen Sie Kontakt mit unserem Team auf.</p>
<h3>Allgemeine Anfragen</h3>
<ul>
<li><strong>E-Mail:</strong> info@hostwizard.lu</li>
</ul>
<h3>Vertrieb</h3>
<p>Interessiert an einer Website für Ihr Unternehmen?</p>
<ul>
<li><strong>E-Mail:</strong> sales@hostwizard.lu</li>
</ul>
<h3>Support</h3>
<p>Bereits Kunde? Unser Support-Team hilft Ihnen gerne weiter.</p>
<ul>
<li><strong>E-Mail:</strong> support@hostwizard.lu</li>
</ul>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>HostWizard kontaktéieren</h2>
<p>Prett fir Äre Betrib online ze bréngen? Kontaktéiert eist Team.</p>
<h3>Allgemeng Ufroen</h3>
<ul>
<li><strong>E-Mail:</strong> info@hostwizard.lu</li>
</ul>
<h3>Verkaf</h3>
<p>Interesséiert un enger Websäit fir Äre Betrib?</p>
<ul>
<li><strong>E-Mail:</strong> sales@hostwizard.lu</li>
</ul>
<h3>Support</h3>
<p>Schonn Client? Eist Support-Team ass do fir Iech ze hëllefen.</p>
<ul>
<li><strong>E-Mail:</strong> support@hostwizard.lu</li>
</ul>
</div>""",
),
"meta_description": "Contact HostWizard for web hosting, domains, and website creation in Luxembourg.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 4,
},
{
"slug": "faq",
"title": "FAQ",
"title_translations": tt("FAQ", "FAQ", "FAQ", "FAQ"),
"content": """<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>What is HostWizard?</h4>
<p>HostWizard provides web hosting, domain registration, email hosting, and website creation services for Luxembourg businesses.</p>
<h4>How does the POC website work?</h4>
<p>We create a free proof-of-concept website for your business. If you like it, we can make it your live website on your own domain.</p>
<h4>What domains can I register?</h4>
<p>We support .lu domains and most international domain extensions (.com, .eu, .net, etc.).</p>
<h4>Do you offer multilingual websites?</h4>
<p>Yes! Our CMS supports French, German, English, and Luxembourgish out of the box.</p>
<h4>What is included in website maintenance?</h4>
<p>Security updates, content changes, performance monitoring, and technical support.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>What is HostWizard?</h4>
<p>HostWizard provides web hosting, domain registration, email hosting, and website creation services for Luxembourg businesses.</p>
<h4>How does the POC website work?</h4>
<p>We create a free proof-of-concept website for your business. If you like it, we can make it your live website on your own domain.</p>
<h4>What domains can I register?</h4>
<p>We support .lu domains and most international domain extensions (.com, .eu, .net, etc.).</p>
<h4>Do you offer multilingual websites?</h4>
<p>Yes! Our CMS supports French, German, English, and Luxembourgish out of the box.</p>
<h4>What is included in website maintenance?</h4>
<p>Security updates, content changes, performance monitoring, and technical support.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Questions fréquemment posées</h2>
<h4>Qu'est-ce que HostWizard ?</h4>
<p>HostWizard fournit des services d'hébergement web, d'enregistrement de domaines, d'hébergement e-mail et de création de sites web pour les entreprises luxembourgeoises.</p>
<h4>Comment fonctionne le site web POC ?</h4>
<p>Nous créons un site web gratuit de preuve de concept pour votre entreprise. Si il vous plaît, nous pouvons en faire votre site web en production sur votre propre domaine.</p>
<h4>Quels domaines puis-je enregistrer ?</h4>
<p>Nous supportons les domaines .lu et la plupart des extensions de domaines internationaux (.com, .eu, .net, etc.).</p>
<h4>Proposez-vous des sites web multilingues ?</h4>
<p>Oui ! Notre CMS supporte le français, l'allemand, l'anglais et le luxembourgeois nativement.</p>
<h4>Qu'est-ce qui est inclus dans la maintenance du site web ?</h4>
<p>Mises à jour de sécurité, modifications de contenu, surveillance des performances et support technique.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Häufig gestellte Fragen</h2>
<h4>Was ist HostWizard?</h4>
<p>HostWizard bietet Webhosting, Domainregistrierung, E-Mail-Hosting und Website-Erstellung für luxemburgische Unternehmen.</p>
<h4>Wie funktioniert die POC-Website?</h4>
<p>Wir erstellen eine kostenlose Proof-of-Concept-Website für Ihr Unternehmen. Wenn sie Ihnen gefällt, können wir sie zu Ihrer Live-Website auf Ihrer eigenen Domain machen.</p>
<h4>Welche Domains kann ich registrieren?</h4>
<p>Wir unterstützen .lu-Domains und die meisten internationalen Domain-Endungen (.com, .eu, .net usw.).</p>
<h4>Bieten Sie mehrsprachige Websites an?</h4>
<p>Ja! Unser CMS unterstützt Französisch, Deutsch, Englisch und Luxemburgisch von Haus aus.</p>
<h4>Was ist in der Website-Wartung enthalten?</h4>
<p>Sicherheitsupdates, Inhaltsänderungen, Leistungsüberwachung und technischer Support.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Heefeg gestallte Froen</h2>
<h4>Wat ass HostWizard?</h4>
<p>HostWizard bitt Webhosting, Domainregistréierung, E-Mail-Hosting a Website-Erstellen fir lëtzebuerger Betriber.</p>
<h4>Wéi funktionéiert d'POC-Websäit?</h4>
<p>Mir erstellen eng gratis Proof-of-Concept-Websäit fir Äre Betrib. Wann se Iech gefält, kënne mir se zu Ärer Live-Websäit op Ärer eegener Domän maachen.</p>
<h4>Wéi eng Domäne kann ech registréieren?</h4>
<p>Mir ënnerstëtzen .lu-Domänen an déi meescht international Domain-Endungen (.com, .eu, .net asw.).</p>
<h4>Bitt Dir méisproocheg Websäiten un?</h4>
<p>Jo! Eise CMS ënnerstëtzt Franséisch, Däitsch, Englesch a Lëtzebuergesch vun Ufank un.</p>
<h4>Wat ass an der Website-Wartung abegraff?</h4>
<p>Sécherheetsupdaten, Inhaltsännerungen, Leeschtungsiwwerwaachung an technesche Support.</p>
</div>""",
),
"meta_description": "Frequently asked questions about HostWizard web hosting and website creation services.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 5,
},
]
return []
# Shared legal pages (same content for all platforms)
SHARED_PLATFORM_PAGES = [
{
"slug": "privacy",
"title": "Privacy Policy",
"title_translations": tt("Privacy Policy", "Politique de confidentialité", "Datenschutzrichtlinie", "Dateschutzrichtlinn"),
"content": """<div class="prose-content">
<h2>Privacy Policy</h2>
<p><em>Last Updated: February 2026</em></p>
<h3>Information We Collect</h3>
<p>We collect information you provide directly:</p>
<ul>
<li>Name, email address, and contact information</li>
<li>Business information (for merchants)</li>
<li>Payment information (processed securely by our payment processor)</li>
</ul>
<h3>How We Use Your Information</h3>
<p>We use your information to provide and improve our services, process payments, communicate with you, and comply with legal obligations.</p>
<h3>Data Protection (GDPR)</h3>
<p>We comply with the EU General Data Protection Regulation. You have the right to access, correct, delete, or export your personal data at any time.</p>
<h3>Contact</h3>
<p>For privacy-related questions, contact privacy@wizard.lu</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Privacy Policy</h2>
<p><em>Last Updated: February 2026</em></p>
<h3>Information We Collect</h3>
<p>We collect information you provide directly:</p>
<ul>
<li>Name, email address, and contact information</li>
<li>Business information (for merchants)</li>
<li>Payment information (processed securely by our payment processor)</li>
</ul>
<h3>How We Use Your Information</h3>
<p>We use your information to provide and improve our services, process payments, communicate with you, and comply with legal obligations.</p>
<h3>Data Protection (GDPR)</h3>
<p>We comply with the EU General Data Protection Regulation. You have the right to access, correct, delete, or export your personal data at any time.</p>
<h3>Contact</h3>
<p>For privacy-related questions, contact privacy@wizard.lu</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Politique de confidentialité</h2>
<p><em>Dernière mise à jour : février 2026</em></p>
<h3>Informations que nous collectons</h3>
<p>Nous collectons les informations que vous fournissez directement :</p>
<ul>
<li>Nom, adresse e-mail et coordonnées</li>
<li>Informations commerciales (pour les commerçants)</li>
<li>Informations de paiement (traitées de manière sécurisée par notre processeur de paiement)</li>
</ul>
<h3>Comment nous utilisons vos informations</h3>
<p>Nous utilisons vos informations pour fournir et améliorer nos services, traiter les paiements, communiquer avec vous et respecter les obligations légales.</p>
<h3>Protection des données (RGPD)</h3>
<p>Nous sommes conformes au Règlement Général sur la Protection des Données de l'UE. Vous avez le droit d'accéder, corriger, supprimer ou exporter vos données personnelles à tout moment.</p>
<h3>Contact</h3>
<p>Pour toute question relative à la confidentialité, contactez privacy@wizard.lu</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Datenschutzrichtlinie</h2>
<p><em>Letzte Aktualisierung: Februar 2026</em></p>
<h3>Informationen, die wir sammeln</h3>
<p>Wir sammeln Informationen, die Sie direkt angeben:</p>
<ul>
<li>Name, E-Mail-Adresse und Kontaktinformationen</li>
<li>Geschäftsinformationen (für Händler)</li>
<li>Zahlungsinformationen (sicher verarbeitet durch unseren Zahlungsdienstleister)</li>
</ul>
<h3>Wie wir Ihre Informationen verwenden</h3>
<p>Wir verwenden Ihre Informationen, um unsere Dienste bereitzustellen und zu verbessern, Zahlungen zu verarbeiten, mit Ihnen zu kommunizieren und gesetzliche Verpflichtungen zu erfüllen.</p>
<h3>Datenschutz (DSGVO)</h3>
<p>Wir erfüllen die EU-Datenschutz-Grundverordnung. Sie haben jederzeit das Recht, auf Ihre persönlichen Daten zuzugreifen, sie zu korrigieren, zu löschen oder zu exportieren.</p>
<h3>Kontakt</h3>
<p>Für datenschutzbezogene Fragen kontaktieren Sie privacy@wizard.lu</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Dateschutzrichtlinn</h2>
<p><em>Lescht Aktualiséierung: Februar 2026</em></p>
<h3>Informatiounen déi mir sammelen</h3>
<p>Mir sammelen Informatiounen déi Dir direkt ugitt:</p>
<ul>
<li>Numm, E-Mail-Adress a Kontaktinformatiounen</li>
<li>Geschäftsinformatiounen (fir Händler)</li>
<li>Bezuelinformatiounen (sécher veraarbecht duerch eise Bezueldéngschtleeschter)</li>
</ul>
<h3>Wéi mir Är Informatiounen benotzen</h3>
<p>Mir benotzen Är Informatiounen fir eis Servicer ze bidden an ze verbesseren, Bezuelunge ze veraarbechten, mat Iech ze kommunizéieren an gesetzlech Obligatiounen z'erfëllen.</p>
<h3>Dateschutz (DSGVO)</h3>
<p>Mir erfëllen d'EU-Dateschutz-Grondveruerdnung. Dir hutt jidderzäit d'Recht, op Är perséinlech Donnéeën zouzegräifen, se ze korrigéieren, ze läschen oder z'exportéieren.</p>
<h3>Kontakt</h3>
<p>Fir Dateschutzfroen kontaktéiert privacy@wizard.lu</p>
</div>""",
),
"meta_description": "Privacy policy — how we collect, use, and protect your personal information.",
"show_in_footer": False,
"show_in_header": False,
"show_in_legal": True,
"display_order": 10,
},
{
"slug": "terms",
"title": "Terms of Service",
"title_translations": tt("Terms of Service", "Conditions d'utilisation", "Nutzungsbedingungen", "Notzungsbedingungen"),
"content": """<div class="prose-content">
<h2>Terms of Service</h2>
<p><em>Last Updated: February 2026</em></p>
<h3>1. Acceptance of Terms</h3>
<p>By accessing and using this platform, you accept and agree to be bound by these Terms of Service.</p>
<h3>2. Services</h3>
<p>We provide digital business tools including order management, loyalty programs, and website building services.</p>
<h3>3. Account</h3>
<p>You must provide accurate information and maintain the security of your account.</p>
<h3>4. Payments</h3>
<p>Subscription fees are billed monthly or annually. You may cancel at any time.</p>
<h3>5. Data & Privacy</h3>
<p>Your use of our services is also governed by our Privacy Policy.</p>
<h3>6. Governing Law</h3>
<p>These terms are governed by the laws of Luxembourg.</p>
<h3>Contact</h3>
<p>For questions about these terms, contact legal@wizard.lu</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Terms of Service</h2>
<p><em>Last Updated: February 2026</em></p>
<h3>1. Acceptance of Terms</h3>
<p>By accessing and using this platform, you accept and agree to be bound by these Terms of Service.</p>
<h3>2. Services</h3>
<p>We provide digital business tools including order management, loyalty programs, and website building services.</p>
<h3>3. Account</h3>
<p>You must provide accurate information and maintain the security of your account.</p>
<h3>4. Payments</h3>
<p>Subscription fees are billed monthly or annually. You may cancel at any time.</p>
<h3>5. Data & Privacy</h3>
<p>Your use of our services is also governed by our Privacy Policy.</p>
<h3>6. Governing Law</h3>
<p>These terms are governed by the laws of Luxembourg.</p>
<h3>Contact</h3>
<p>For questions about these terms, contact legal@wizard.lu</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Conditions d'utilisation</h2>
<p><em>Dernière mise à jour : février 2026</em></p>
<h3>1. Acceptation des conditions</h3>
<p>En accédant et en utilisant cette plateforme, vous acceptez d'être lié par ces Conditions d'utilisation.</p>
<h3>2. Services</h3>
<p>Nous fournissons des outils numériques pour les entreprises, notamment la gestion des commandes, les programmes de fidélité et les services de création de sites web.</p>
<h3>3. Compte</h3>
<p>Vous devez fournir des informations exactes et maintenir la sécurité de votre compte.</p>
<h3>4. Paiements</h3>
<p>Les frais d'abonnement sont facturés mensuellement ou annuellement. Vous pouvez annuler à tout moment.</p>
<h3>5. Données et confidentialité</h3>
<p>Votre utilisation de nos services est également régie par notre Politique de confidentialité.</p>
<h3>6. Droit applicable</h3>
<p>Ces conditions sont régies par les lois du Luxembourg.</p>
<h3>Contact</h3>
<p>Pour toute question sur ces conditions, contactez legal@wizard.lu</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Nutzungsbedingungen</h2>
<p><em>Letzte Aktualisierung: Februar 2026</em></p>
<h3>1. Annahme der Bedingungen</h3>
<p>Durch den Zugang und die Nutzung dieser Plattform akzeptieren Sie diese Nutzungsbedingungen und stimmen ihnen zu.</p>
<h3>2. Dienstleistungen</h3>
<p>Wir bieten digitale Geschäftstools, einschließlich Bestellverwaltung, Treueprogramme und Website-Erstellungsdienste.</p>
<h3>3. Konto</h3>
<p>Sie müssen genaue Informationen angeben und die Sicherheit Ihres Kontos gewährleisten.</p>
<h3>4. Zahlungen</h3>
<p>Abonnementgebühren werden monatlich oder jährlich berechnet. Sie können jederzeit kündigen.</p>
<h3>5. Daten und Datenschutz</h3>
<p>Ihre Nutzung unserer Dienste unterliegt auch unserer Datenschutzrichtlinie.</p>
<h3>6. Anwendbares Recht</h3>
<p>Diese Bedingungen unterliegen den Gesetzen Luxemburgs.</p>
<h3>Kontakt</h3>
<p>Für Fragen zu diesen Bedingungen kontaktieren Sie legal@wizard.lu</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Notzungsbedingungen</h2>
<p><em>Lescht Aktualiséierung: Februar 2026</em></p>
<h3>1. Akzeptéierung vun de Bedingungen</h3>
<p>Duerch den Zougang an d'Notzung vun dëser Plattform akzeptéiert Dir dës Notzungsbedingungen.</p>
<h3>2. Servicer</h3>
<p>Mir bidden digital Geschäftstools, inklusiv Bestellverwaltung, Treiëprogrammer a Website-Erstellungsservicer.</p>
<h3>3. Konto</h3>
<p>Dir musst korrekt Informatiounen uginn an d'Sécherheet vun Ärem Konto garantéieren.</p>
<h3>4. Bezuelungen</h3>
<p>Abonnementskäschte ginn monatslech oder jäerlech berechent. Dir kënnt jidderzäit kënnegen.</p>
<h3>5. Donnéeën an Dateschutz</h3>
<p>Är Notzung vun eise Servicer ënnerläit och eiser Dateschutzrichtlinn.</p>
<h3>6. Applicabelt Recht</h3>
<p>Dës Bedingunge sinn dem lëtzebuerger Recht ënnerworf.</p>
<h3>Kontakt</h3>
<p>Fir Froen zu dëse Bedingunge kontaktéiert legal@wizard.lu</p>
</div>""",
),
"meta_description": "Terms of service governing the use of our platform.",
"show_in_footer": False,
"show_in_header": False,
"show_in_legal": True,
"display_order": 11,
},
]
# ============================================================================
# STORE DEFAULT PAGES (is_platform_page=False, store_id=NULL)
# Uses {{store_name}}, {{store_email}}, {{store_phone}} placeholders
# ============================================================================
STORE_DEFAULT_HOME = {
"slug": "home",
"title": "Welcome to {{store_name}}",
"title_translations": tt(
"Welcome to {{store_name}}",
"Bienvenue chez {{store_name}}",
"Willkommen bei {{store_name}}",
"Wëllkomm bei {{store_name}}",
),
"content": """<div class="prose-content">
<h2>Welcome</h2>
<p>{{store_name}} is here to serve you. Browse our offerings and discover what we have for you.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Welcome</h2>
<p>{{store_name}} is here to serve you. Browse our offerings and discover what we have for you.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Bienvenue</h2>
<p>{{store_name}} est là pour vous servir. Découvrez nos offres et ce que nous avons pour vous.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Willkommen</h2>
<p>{{store_name}} ist für Sie da. Entdecken Sie unser Angebot.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Wëllkomm</h2>
<p>{{store_name}} ass fir Iech do. Entdeckt eist Angebot.</p>
</div>""",
),
"template": "default",
"meta_description": "Welcome to {{store_name}}",
"show_in_header": False,
"show_in_footer": False,
"display_order": 0,
}
STORE_DEFAULTS_COMMON = [
{
"slug": "about",
"title": "About Us",
"title_translations": tt("About Us", "À propos", "Über uns", "Iwwer eis"),
"content": """<div class="prose-content">
<h2>About {{store_name}}</h2>
<p>Welcome to {{store_name}}. We are committed to providing you with quality products and excellent service.</p>
<h3>Our Story</h3>
<p>{{store_name}} was founded with a simple mission: to deliver exceptional value to our customers.</p>
<h3>Contact Us</h3>
<p>Have questions? We'd love to hear from you.</p>
<ul>
<li><strong>Email:</strong> {{store_email}}</li>
<li><strong>Phone:</strong> {{store_phone}}</li>
</ul>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>About {{store_name}}</h2>
<p>Welcome to {{store_name}}. We are committed to providing you with quality products and excellent service.</p>
<h3>Our Story</h3>
<p>{{store_name}} was founded with a simple mission: to deliver exceptional value to our customers.</p>
<h3>Contact Us</h3>
<p>Have questions? We'd love to hear from you.</p>
<ul>
<li><strong>Email:</strong> {{store_email}}</li>
<li><strong>Phone:</strong> {{store_phone}}</li>
</ul>
</div>""",
# French
"""<div class="prose-content">
<h2>À propos de {{store_name}}</h2>
<p>Bienvenue chez {{store_name}}. Nous nous engageons à vous fournir des produits de qualité et un service excellent.</p>
<h3>Notre histoire</h3>
<p>{{store_name}} a été fondé avec une mission simple : offrir une valeur exceptionnelle à nos clients.</p>
<h3>Contactez-nous</h3>
<p>Vous avez des questions ? Nous serions ravis d'avoir de vos nouvelles.</p>
<ul>
<li><strong>Email :</strong> {{store_email}}</li>
<li><strong>Téléphone :</strong> {{store_phone}}</li>
</ul>
</div>""",
# German
"""<div class="prose-content">
<h2>Über {{store_name}}</h2>
<p>Willkommen bei {{store_name}}. Wir sind bestrebt, Ihnen Qualitätsprodukte und exzellenten Service zu bieten.</p>
<h3>Unsere Geschichte</h3>
<p>{{store_name}} wurde mit einer einfachen Mission gegründet: unseren Kunden einen außergewöhnlichen Mehrwert zu bieten.</p>
<h3>Kontaktieren Sie uns</h3>
<p>Haben Sie Fragen? Wir freuen uns, von Ihnen zu hören.</p>
<ul>
<li><strong>E-Mail:</strong> {{store_email}}</li>
<li><strong>Telefon:</strong> {{store_phone}}</li>
</ul>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Iwwer {{store_name}}</h2>
<p>Wëllkomm bei {{store_name}}. Mir setzen eis derfir an, Iech Qualitéitsprodukter an exzellente Service ze bidden.</p>
<h3>Eis Geschicht</h3>
<p>{{store_name}} gouf mat enger einfacher Missioun gegrënnt: eise Clienten en aussergewéinleche Méiwäert ze bidden.</p>
<h3>Kontaktéiert eis</h3>
<p>Hutt Dir Froen? Mir géife gäre vun Iech héieren.</p>
<ul>
<li><strong>E-Mail:</strong> {{store_email}}</li>
<li><strong>Telefon:</strong> {{store_phone}}</li>
</ul>
</div>""",
),
"meta_description": "Learn about {{store_name}} — our story, values, and commitment to quality.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 1,
},
{
"slug": "contact",
"title": "Contact Us",
"title_translations": tt("Contact Us", "Contactez-nous", "Kontakt", "Kontakt"),
"content": """<div class="prose-content">
<h2>Contact {{store_name}}</h2>
<p>We're here to help! Reach out to us.</p>
<h3>Get in Touch</h3>
<ul>
<li><strong>Email:</strong> {{store_email}}</li>
<li><strong>Phone:</strong> {{store_phone}}</li>
</ul>
<p>We typically respond within 24 hours during business days.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Contact {{store_name}}</h2>
<p>We're here to help! Reach out to us.</p>
<h3>Get in Touch</h3>
<ul>
<li><strong>Email:</strong> {{store_email}}</li>
<li><strong>Phone:</strong> {{store_phone}}</li>
</ul>
<p>We typically respond within 24 hours during business days.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Contacter {{store_name}}</h2>
<p>Nous sommes là pour vous aider ! Contactez-nous.</p>
<h3>Nous joindre</h3>
<ul>
<li><strong>Email :</strong> {{store_email}}</li>
<li><strong>Téléphone :</strong> {{store_phone}}</li>
</ul>
<p>Nous répondons généralement dans les 24 heures les jours ouvrables.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>{{store_name}} kontaktieren</h2>
<p>Wir sind hier, um zu helfen! Kontaktieren Sie uns.</p>
<h3>Kontakt aufnehmen</h3>
<ul>
<li><strong>E-Mail:</strong> {{store_email}}</li>
<li><strong>Telefon:</strong> {{store_phone}}</li>
</ul>
<p>Wir antworten in der Regel innerhalb von 24 Stunden an Werktagen.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>{{store_name}} kontaktéieren</h2>
<p>Mir sinn do fir ze hëllefen! Kontaktéiert eis.</p>
<h3>Kontakt ophuelen</h3>
<ul>
<li><strong>E-Mail:</strong> {{store_email}}</li>
<li><strong>Telefon:</strong> {{store_phone}}</li>
</ul>
<p>Mir äntweren normalerweis bannent 24 Stonnen un Aarbechtsdeeg.</p>
</div>""",
),
"meta_description": "Contact {{store_name}} for questions, support, or inquiries.",
"show_in_footer": True,
"show_in_header": True,
"display_order": 2,
},
{
"slug": "faq",
"title": "FAQ",
"title_translations": tt("FAQ", "FAQ", "FAQ", "FAQ"),
"content": """<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>How can I contact you?</h4>
<p>You can reach us at {{store_email}} or call {{store_phone}}.</p>
<h4>What are your business hours?</h4>
<p>We are available during regular business hours, Monday through Friday.</p>
<h4>Do you have a physical location?</h4>
<p>Please contact us for information about our location and visiting hours.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Frequently Asked Questions</h2>
<h4>How can I contact you?</h4>
<p>You can reach us at {{store_email}} or call {{store_phone}}.</p>
<h4>What are your business hours?</h4>
<p>We are available during regular business hours, Monday through Friday.</p>
<h4>Do you have a physical location?</h4>
<p>Please contact us for information about our location and visiting hours.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Questions fréquemment posées</h2>
<h4>Comment puis-je vous contacter ?</h4>
<p>Vous pouvez nous joindre à {{store_email}} ou appeler le {{store_phone}}.</p>
<h4>Quelles sont vos heures d'ouverture ?</h4>
<p>Nous sommes disponibles pendant les heures d'ouverture habituelles, du lundi au vendredi.</p>
<h4>Avez-vous un emplacement physique ?</h4>
<p>Veuillez nous contacter pour des informations sur notre emplacement et nos heures de visite.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Häufig gestellte Fragen</h2>
<h4>Wie kann ich Sie kontaktieren?</h4>
<p>Sie erreichen uns unter {{store_email}} oder telefonisch unter {{store_phone}}.</p>
<h4>Was sind Ihre Geschäftszeiten?</h4>
<p>Wir sind während der regulären Geschäftszeiten erreichbar, Montag bis Freitag.</p>
<h4>Haben Sie einen physischen Standort?</h4>
<p>Bitte kontaktieren Sie uns für Informationen über unseren Standort und Besuchszeiten.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Heefeg gestallte Froen</h2>
<h4>Wéi kann ech Iech kontaktéieren?</h4>
<p>Dir erreecht eis ënner {{store_email}} oder rufft eis un ënner {{store_phone}}.</p>
<h4>Wat sinn Är Geschäftszäiten?</h4>
<p>Mir sinn während de reguläre Geschäftszäiten erreichbar, Méindes bis Freides.</p>
<h4>Hutt Dir e physesche Standuert?</h4>
<p>Kontaktéiert eis w.e.g. fir Informatiounen iwwer eise Standuert an eis Besuchszäiten.</p>
</div>""",
),
"meta_description": "Frequently asked questions about {{store_name}}.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 3,
},
{
"slug": "privacy",
"title": "Privacy Policy",
"title_translations": tt("Privacy Policy", "Politique de confidentialité", "Datenschutzrichtlinie", "Dateschutzrichtlinn"),
"content": """<div class="prose-content">
<h2>Privacy Policy</h2>
<p>{{store_name}} is committed to protecting your personal information.</p>
<h3>Information We Collect</h3>
<p>We collect information necessary to process your orders and provide customer service.</p>
<h3>Your Rights</h3>
<p>Under GDPR, you have the right to access, correct, or delete your personal data. Contact us at {{store_email}}.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Privacy Policy</h2>
<p>{{store_name}} is committed to protecting your personal information.</p>
<h3>Information We Collect</h3>
<p>We collect information necessary to process your orders and provide customer service.</p>
<h3>Your Rights</h3>
<p>Under GDPR, you have the right to access, correct, or delete your personal data. Contact us at {{store_email}}.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Politique de confidentialité</h2>
<p>{{store_name}} s'engage à protéger vos informations personnelles.</p>
<h3>Informations que nous collectons</h3>
<p>Nous collectons les informations nécessaires au traitement de vos commandes et à la fourniture du service client.</p>
<h3>Vos droits</h3>
<p>En vertu du RGPD, vous avez le droit d'accéder, de corriger ou de supprimer vos données personnelles. Contactez-nous à {{store_email}}.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Datenschutzrichtlinie</h2>
<p>{{store_name}} verpflichtet sich zum Schutz Ihrer persönlichen Daten.</p>
<h3>Informationen, die wir sammeln</h3>
<p>Wir sammeln Informationen, die zur Bearbeitung Ihrer Bestellungen und zur Bereitstellung des Kundenservice erforderlich sind.</p>
<h3>Ihre Rechte</h3>
<p>Gemäß der DSGVO haben Sie das Recht, auf Ihre persönlichen Daten zuzugreifen, sie zu korrigieren oder zu löschen. Kontaktieren Sie uns unter {{store_email}}.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Dateschutzrichtlinn</h2>
<p>{{store_name}} engagéiert sech fir de Schutz vun Äre perséinlechen Informatiounen.</p>
<h3>Informatiounen déi mir sammelen</h3>
<p>Mir sammelen Informatiounen déi néideg sinn fir Är Bestellungen ze veraarbechten an de Clientsservice ze bidden.</p>
<h3>Är Rechter</h3>
<p>Ënnert der DSGVO hutt Dir d'Recht, op Är perséinlech Donnéeën zouzegräifen, se ze korrigéieren oder ze läschen. Kontaktéiert eis ënner {{store_email}}.</p>
</div>""",
),
"meta_description": "Privacy policy for {{store_name}}.",
"show_in_footer": False,
"show_in_header": False,
"show_in_legal": True,
"display_order": 10,
},
{
"slug": "terms",
"title": "Terms of Service",
"title_translations": tt("Terms of Service", "Conditions d'utilisation", "Nutzungsbedingungen", "Notzungsbedingungen"),
"content": """<div class="prose-content">
<h2>Terms of Service</h2>
<p>By using the services provided by {{store_name}}, you agree to these terms.</p>
<h3>Orders</h3>
<p>All orders are subject to availability and confirmation.</p>
<h3>Contact</h3>
<p>For questions about these terms, contact us at {{store_email}}.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Terms of Service</h2>
<p>By using the services provided by {{store_name}}, you agree to these terms.</p>
<h3>Orders</h3>
<p>All orders are subject to availability and confirmation.</p>
<h3>Contact</h3>
<p>For questions about these terms, contact us at {{store_email}}.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Conditions d'utilisation</h2>
<p>En utilisant les services fournis par {{store_name}}, vous acceptez ces conditions.</p>
<h3>Commandes</h3>
<p>Toutes les commandes sont soumises à la disponibilité et à la confirmation.</p>
<h3>Contact</h3>
<p>Pour toute question sur ces conditions, contactez-nous à {{store_email}}.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Nutzungsbedingungen</h2>
<p>Durch die Nutzung der von {{store_name}} bereitgestellten Dienste stimmen Sie diesen Bedingungen zu.</p>
<h3>Bestellungen</h3>
<p>Alle Bestellungen unterliegen der Verfügbarkeit und Bestätigung.</p>
<h3>Kontakt</h3>
<p>Für Fragen zu diesen Bedingungen kontaktieren Sie uns unter {{store_email}}.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Notzungsbedingungen</h2>
<p>Duerch d'Notzung vun de Servicer vu {{store_name}} stëmmt Dir dëse Bedingungen zou.</p>
<h3>Bestellungen</h3>
<p>All Bestellunge sinn un d'Disponibilitéit an d'Bestätegung gebonnen.</p>
<h3>Kontakt</h3>
<p>Fir Froen zu dëse Bedingunge kontaktéiert eis ënner {{store_email}}.</p>
</div>""",
),
"meta_description": "Terms of service for {{store_name}}.",
"show_in_footer": False,
"show_in_header": False,
"show_in_legal": True,
"display_order": 11,
},
]
# OMS-specific store defaults (shipping/returns)
STORE_DEFAULTS_OMS_EXTRA = [
{
"slug": "shipping",
"title": "Shipping Policy",
"title_translations": tt("Shipping Policy", "Politique de livraison", "Versandrichtlinie", "Versandrichtlinn"),
"content": """<div class="prose-content">
<h2>Shipping Policy</h2>
<h3>Shipping Methods</h3>
<p>{{store_name}} offers multiple shipping options:</p>
<ul>
<li><strong>Standard Shipping:</strong> 3-7 business days</li>
<li><strong>Express Shipping:</strong> 1-3 business days</li>
</ul>
<h3>Shipping Costs</h3>
<p>Shipping costs are calculated based on weight and destination at checkout.</p>
<h3>Tracking</h3>
<p>You will receive a tracking number by email once your order ships.</p>
<h3>Questions?</h3>
<p>Contact us at {{store_email}} for shipping inquiries.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Shipping Policy</h2>
<h3>Shipping Methods</h3>
<p>{{store_name}} offers multiple shipping options:</p>
<ul>
<li><strong>Standard Shipping:</strong> 3-7 business days</li>
<li><strong>Express Shipping:</strong> 1-3 business days</li>
</ul>
<h3>Shipping Costs</h3>
<p>Shipping costs are calculated based on weight and destination at checkout.</p>
<h3>Tracking</h3>
<p>You will receive a tracking number by email once your order ships.</p>
<h3>Questions?</h3>
<p>Contact us at {{store_email}} for shipping inquiries.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Politique de livraison</h2>
<h3>Méthodes de livraison</h3>
<p>{{store_name}} propose plusieurs options de livraison :</p>
<ul>
<li><strong>Livraison standard :</strong> 3-7 jours ouvrables</li>
<li><strong>Livraison express :</strong> 1-3 jours ouvrables</li>
</ul>
<h3>Frais de livraison</h3>
<p>Les frais de livraison sont calculés en fonction du poids et de la destination lors du paiement.</p>
<h3>Suivi</h3>
<p>Vous recevrez un numéro de suivi par e-mail dès l'expédition de votre commande.</p>
<h3>Des questions ?</h3>
<p>Contactez-nous à {{store_email}} pour toute question relative à la livraison.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Versandrichtlinie</h2>
<h3>Versandmethoden</h3>
<p>{{store_name}} bietet mehrere Versandoptionen an:</p>
<ul>
<li><strong>Standardversand:</strong> 3-7 Werktage</li>
<li><strong>Expressversand:</strong> 1-3 Werktage</li>
</ul>
<h3>Versandkosten</h3>
<p>Die Versandkosten werden basierend auf Gewicht und Zielort bei der Kasse berechnet.</p>
<h3>Sendungsverfolgung</h3>
<p>Sie erhalten eine Sendungsverfolgungsnummer per E-Mail, sobald Ihre Bestellung versandt wird.</p>
<h3>Fragen?</h3>
<p>Kontaktieren Sie uns unter {{store_email}} für Versandanfragen.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Versandrichtlinn</h2>
<h3>Versandmethoden</h3>
<p>{{store_name}} bitt verschidde Versandoptioune un:</p>
<ul>
<li><strong>Standardversand:</strong> 3-7 Aarbechtsdeeg</li>
<li><strong>Expressversand:</strong> 1-3 Aarbechtsdeeg</li>
</ul>
<h3>Versandkäschten</h3>
<p>D'Versandkäschte ginn op Basis vum Gewiicht an der Destinatioun bei der Kees berechent.</p>
<h3>Sendungsverfolgung</h3>
<p>Dir kritt eng Sendungsverfolgungsnummer per E-Mail, soubal Är Bestellung verschéckt gëtt.</p>
<h3>Froen?</h3>
<p>Kontaktéiert eis ënner {{store_email}} fir Versandufroen.</p>
</div>""",
),
"meta_description": "Shipping policy for {{store_name}} — methods, costs, and delivery times.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 4,
},
{
"slug": "returns",
"title": "Return & Refund Policy",
"title_translations": tt("Return & Refund Policy", "Politique de retour et remboursement", "Rückgabe- und Erstattungsrichtlinie", "Retour- a Rembourséierungsrichtlinn"),
"content": """<div class="prose-content">
<h2>Return & Refund Policy</h2>
<h3>Returns</h3>
<p>{{store_name}} accepts returns within 14 days of delivery, in accordance with Luxembourg consumer protection law.</p>
<h3>How to Return</h3>
<ol>
<li>Contact us at {{store_email}} to initiate a return</li>
<li>Pack the item in its original condition</li>
<li>Ship using the provided return instructions</li>
</ol>
<h3>Refunds</h3>
<p>Refunds are processed within 14 days of receiving the returned item, back to the original payment method.</p>
<h3>Damaged Items</h3>
<p>If you receive a damaged item, contact us immediately at {{store_email}} with photos.</p>
</div>""",
"content_translations": tt(
# English
"""<div class="prose-content">
<h2>Return & Refund Policy</h2>
<h3>Returns</h3>
<p>{{store_name}} accepts returns within 14 days of delivery, in accordance with Luxembourg consumer protection law.</p>
<h3>How to Return</h3>
<ol>
<li>Contact us at {{store_email}} to initiate a return</li>
<li>Pack the item in its original condition</li>
<li>Ship using the provided return instructions</li>
</ol>
<h3>Refunds</h3>
<p>Refunds are processed within 14 days of receiving the returned item, back to the original payment method.</p>
<h3>Damaged Items</h3>
<p>If you receive a damaged item, contact us immediately at {{store_email}} with photos.</p>
</div>""",
# French
"""<div class="prose-content">
<h2>Politique de retour et remboursement</h2>
<h3>Retours</h3>
<p>{{store_name}} accepte les retours dans les 14 jours suivant la livraison, conformément à la loi luxembourgeoise de protection du consommateur.</p>
<h3>Comment retourner</h3>
<ol>
<li>Contactez-nous à {{store_email}} pour initier un retour</li>
<li>Emballez l'article dans son état d'origine</li>
<li>Expédiez en suivant les instructions de retour fournies</li>
</ol>
<h3>Remboursements</h3>
<p>Les remboursements sont traités dans les 14 jours suivant la réception de l'article retourné, sur le moyen de paiement d'origine.</p>
<h3>Articles endommagés</h3>
<p>Si vous recevez un article endommagé, contactez-nous immédiatement à {{store_email}} avec des photos.</p>
</div>""",
# German
"""<div class="prose-content">
<h2>Rückgabe- und Erstattungsrichtlinie</h2>
<h3>Rückgaben</h3>
<p>{{store_name}} akzeptiert Rückgaben innerhalb von 14 Tagen nach Lieferung, gemäß dem luxemburgischen Verbraucherschutzgesetz.</p>
<h3>So geben Sie zurück</h3>
<ol>
<li>Kontaktieren Sie uns unter {{store_email}}, um eine Rückgabe einzuleiten</li>
<li>Verpacken Sie den Artikel in seinem Originalzustand</li>
<li>Versenden Sie gemäß den bereitgestellten Rücksendeanweisungen</li>
</ol>
<h3>Erstattungen</h3>
<p>Erstattungen werden innerhalb von 14 Tagen nach Erhalt des zurückgesendeten Artikels auf die ursprüngliche Zahlungsmethode verarbeitet.</p>
<h3>Beschädigte Artikel</h3>
<p>Wenn Sie einen beschädigten Artikel erhalten, kontaktieren Sie uns sofort unter {{store_email}} mit Fotos.</p>
</div>""",
# Luxembourgish
"""<div class="prose-content">
<h2>Retour- a Rembourséierungsrichtlinn</h2>
<h3>Retouren</h3>
<p>{{store_name}} akzeptéiert Retoure bannent 14 Deeg no der Liwwerung, am Aklang mat dem lëtzebuerger Konsumenteschutzgesetz.</p>
<h3>Wéi retournéieren</h3>
<ol>
<li>Kontaktéiert eis ënner {{store_email}} fir eng Retour unzefänken</li>
<li>Verpackt den Artikel a sengem originale Zoustand</li>
<li>Verschéckt no de geliwwerten Retourinstruktiounen</li>
</ol>
<h3>Rembourséierungen</h3>
<p>Rembourséierunge ginn bannent 14 Deeg no Erhalt vum retournéierten Artikel op déi ursprénglech Bezuelmethode veraarbecht.</p>
<h3>Beschiedegt Artikelen</h3>
<p>Wann Dir en beschiedegten Artikel kritt, kontaktéiert eis direkt ënner {{store_email}} mat Fotoen.</p>
</div>""",
),
"meta_description": "Return and refund policy for {{store_name}}.",
"show_in_footer": True,
"show_in_header": False,
"display_order": 5,
},
]
# ============================================================================
# SCRIPT FUNCTIONS
# ============================================================================
def _page_exists(db: Session, platform_id: int, slug: str, *, is_platform_page: bool) -> bool:
"""Check if a page already exists for the given platform, slug, and type."""
existing = db.execute(
select(ContentPage).where(
ContentPage.platform_id == platform_id,
ContentPage.store_id.is_(None),
ContentPage.slug == slug,
ContentPage.is_platform_page == is_platform_page,
)
).scalar_one_or_none()
return existing is not None
def _create_page(
db: Session,
platform_id: int,
page_data: dict,
*,
is_platform_page: bool = False,
sections: dict | None = None,
) -> bool:
"""Create a single content page. Returns True if created, False if skipped."""
slug = page_data["slug"]
title = page_data["title"]
if _page_exists(db, platform_id, slug, is_platform_page=is_platform_page):
# Backfill translations if they are currently NULL
existing = db.execute(
select(ContentPage).where(
ContentPage.platform_id == platform_id,
ContentPage.slug == slug,
ContentPage.is_platform_page == is_platform_page,
ContentPage.store_id.is_(None),
)
).scalar_one_or_none()
if existing:
updated = False
if existing.content_translations is None and page_data.get("content_translations"):
existing.content_translations = page_data["content_translations"]
updated = True
if existing.title_translations is None and page_data.get("title_translations"):
existing.title_translations = page_data["title_translations"]
updated = True
if updated:
existing.updated_at = datetime.now(UTC)
print(f" Backfilled translations: {title} (/{slug})")
return True # Count as created for reporting
print(f" Skipped: {title} (/{slug}) - already exists")
return False
page = ContentPage(
platform_id=platform_id,
store_id=None,
slug=slug,
title=title,
title_translations=page_data.get("title_translations"),
content=page_data.get("content", ""),
content_translations=page_data.get("content_translations"),
content_format="html",
template=page_data.get("template", "default"),
sections=sections,
meta_description=page_data.get("meta_description", ""),
meta_keywords=page_data.get("meta_keywords", ""),
is_platform_page=is_platform_page,
is_published=True,
published_at=datetime.now(UTC),
show_in_footer=page_data.get("show_in_footer", False),
show_in_header=page_data.get("show_in_header", False),
show_in_legal=page_data.get("show_in_legal", False),
display_order=page_data.get("display_order", 0),
created_at=datetime.now(UTC),
updated_at=datetime.now(UTC),
)
db.add(page)
tier_label = "platform" if is_platform_page else "store-default"
print(f" Created [{tier_label}]: {title} (/{slug})")
return True
def create_default_pages(db: Session) -> None:
"""
Create all default content pages for all platforms.
This function is idempotent — it skips pages that already exist.
"""
print("\n" + "=" * 70)
print("Creating Default Content Pages (CMS)")
print("=" * 70 + "\n")
# Load all platforms
platforms = db.execute(select(Platform)).scalars().all()
if not platforms:
print(" No platforms found. Run init_production.py first.")
return
total_created = 0
total_skipped = 0
for platform in platforms:
print(f"\n Platform: {platform.name} (code={platform.code})")
created_count = 0
skipped_count = 0
# ------------------------------------------------------------------
# 1. Platform Homepage (slug="home", is_platform_page=True, sections)
# ------------------------------------------------------------------
sections_fn = HOMEPAGE_SECTIONS.get(platform.code)
if sections_fn:
sections_data = sections_fn()
homepage_data = {
"slug": "home",
"title": f"{platform.name} - Home",
"content": "",
"meta_description": f"{platform.name} — digital tools for Luxembourg businesses.",
"show_in_footer": False,
"show_in_header": False,
"display_order": 0,
}
if _create_page(
db, platform.id, homepage_data,
is_platform_page=True, sections=sections_data,
):
created_count += 1
else:
skipped_count += 1
else:
print(f" Warning: No homepage sections defined for platform '{platform.code}'")
# ------------------------------------------------------------------
# 2. Platform Marketing Pages (is_platform_page=True)
# ------------------------------------------------------------------
platform_pages = _get_platform_pages(platform.code)
for page_data in platform_pages:
if _create_page(db, platform.id, page_data, is_platform_page=True):
created_count += 1
else:
skipped_count += 1
# Shared legal pages (privacy, terms) for all platforms
for page_data in SHARED_PLATFORM_PAGES:
if _create_page(db, platform.id, page_data, is_platform_page=True):
created_count += 1
else:
skipped_count += 1
# ------------------------------------------------------------------
# 3. Store Default Pages (is_platform_page=False, store_id=NULL)
# Only for platforms that host stores (not wizard.lu main)
# ------------------------------------------------------------------
if platform.code != "main":
# Store homepage (slug="home")
if _create_page(db, platform.id, STORE_DEFAULT_HOME, is_platform_page=False):
created_count += 1
else:
skipped_count += 1
for page_data in STORE_DEFAULTS_COMMON:
if _create_page(db, platform.id, page_data, is_platform_page=False):
created_count += 1
else:
skipped_count += 1
# OMS-specific: shipping + returns
if platform.code == "oms":
for page_data in STORE_DEFAULTS_OMS_EXTRA:
if _create_page(db, platform.id, page_data, is_platform_page=False):
created_count += 1
else:
skipped_count += 1
print(f" --- {created_count} created, {skipped_count} skipped")
total_created += created_count
total_skipped += skipped_count
db.commit()
print("\n" + "=" * 70)
print("Summary:")
print(f" Platforms: {len(platforms)}")
print(f" Created: {total_created} pages")
print(f" Skipped: {total_skipped} pages (already exist)")
print(f" Total: {total_created + total_skipped} pages")
print("=" * 70 + "\n")
if total_created > 0:
print("Default content pages created successfully!\n")
else:
print("All default pages already exist. No changes made.\n")
# ============================================================================
# MAIN EXECUTION
# ============================================================================
def main():
"""Main execution function."""
print("\nStarting Default Content Pages Creation Script...\n")
db = SessionLocal()
try:
create_default_pages(db)
print("Script completed successfully!\n")
except Exception as e:
print(f"\nError: {e}\n")
db.rollback()
raise
finally:
db.close()
if __name__ == "__main__":
main()