Phase 1 — Section-based store homepages:
- Store defaults use template="full" with per-platform sections JSON
- OMS: shop hero + features + CTA; Loyalty: rewards hero + features + CTA
- Hosting: services hero + features + CTA
- Deep placeholder resolution for {{store_name}} inside sections JSON
- landing-full.html uses resolved page_sections from context
Phase 2 — Module-contributed header actions:
- header_template field on MenuItemDefinition + DiscoveredMenuItem
- Catalog provides header-search.html partial
- Cart provides header-cart.html partial with badge
- Base template iterates storefront_nav.actions with {% include %}
- Generic icon fallback for actions without a template
Fixes:
- Store theme API: get_store_by_code → get_store_by_code_or_subdomain
Docs:
- CMS redesign proposal: menu restructure, page types, translations UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3145 lines
146 KiB
Python
Executable File
3145 lines
146 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": "{{store_name}}",
|
|
"title_translations": tt(
|
|
"{{store_name}}",
|
|
"{{store_name}}",
|
|
"{{store_name}}",
|
|
"{{store_name}}",
|
|
),
|
|
"content": "",
|
|
"template": "full",
|
|
"meta_description": "{{store_name}}",
|
|
"show_in_header": False,
|
|
"show_in_footer": False,
|
|
"display_order": 0,
|
|
}
|
|
|
|
|
|
def _store_homepage_sections_oms() -> dict:
|
|
"""Store homepage sections for OMS platform stores."""
|
|
return {
|
|
"hero": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Bienvenue chez {{store_name}}",
|
|
"Welcome to {{store_name}}",
|
|
"Willkommen bei {{store_name}}",
|
|
),
|
|
"subtitle": t(
|
|
"Découvrez notre sélection de produits et profitez d'une expérience d'achat exceptionnelle.",
|
|
"Discover our product selection and enjoy an exceptional shopping experience.",
|
|
"Entdecken Sie unsere Produktauswahl und genießen Sie ein außergewöhnliches Einkaufserlebnis.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("Voir nos produits", "Browse Products", "Produkte ansehen"),
|
|
"url": "products",
|
|
"style": "primary",
|
|
},
|
|
{
|
|
"text": t("À propos", "About Us", "Über uns"),
|
|
"url": "about",
|
|
"style": "secondary",
|
|
},
|
|
],
|
|
},
|
|
"features": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Pourquoi nous choisir",
|
|
"Why Choose Us",
|
|
"Warum uns wählen",
|
|
),
|
|
"subtitle": t(
|
|
"Ce qui nous distingue",
|
|
"What sets us apart",
|
|
"Was uns auszeichnet",
|
|
),
|
|
"layout": "grid",
|
|
"features": [
|
|
{
|
|
"icon": "check",
|
|
"title": t("Qualité premium", "Premium Quality", "Premium-Qualität"),
|
|
"description": t(
|
|
"Des produits soigneusement sélectionnés pour vous.",
|
|
"Carefully selected products just for you.",
|
|
"Sorgfältig ausgewählte Produkte für Sie.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "truck",
|
|
"title": t("Livraison rapide", "Fast Shipping", "Schnelle Lieferung"),
|
|
"description": t(
|
|
"Livraison rapide directement chez vous.",
|
|
"Quick delivery right to your door.",
|
|
"Schnelle Lieferung direkt zu Ihnen.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "shield-check",
|
|
"title": t("Paiement sécurisé", "Secure Payment", "Sichere Zahlung"),
|
|
"description": t(
|
|
"Vos transactions sont protégées à 100%.",
|
|
"Your transactions are 100% protected.",
|
|
"Ihre Transaktionen sind 100% geschützt.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "chat-bubble-left",
|
|
"title": t("Support client", "Customer Support", "Kundensupport"),
|
|
"description": t(
|
|
"Une équipe à votre écoute pour vous accompagner.",
|
|
"A dedicated team ready to assist you.",
|
|
"Ein engagiertes Team, das Ihnen zur Seite steht.",
|
|
),
|
|
},
|
|
],
|
|
},
|
|
"cta": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Prêt à découvrir nos produits ?",
|
|
"Ready to Explore Our Products?",
|
|
"Bereit, unsere Produkte zu entdecken?",
|
|
),
|
|
"subtitle": t(
|
|
"Parcourez notre catalogue et trouvez ce qui vous convient.",
|
|
"Browse our catalog and find what suits you.",
|
|
"Durchstöbern Sie unseren Katalog und finden Sie, was zu Ihnen passt.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("Voir les produits", "View Products", "Produkte ansehen"),
|
|
"url": "products",
|
|
"style": "primary",
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
def _store_homepage_sections_loyalty() -> dict:
|
|
"""Store homepage sections for Loyalty platform stores."""
|
|
return {
|
|
"hero": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Bienvenue chez {{store_name}}",
|
|
"Welcome to {{store_name}}",
|
|
"Willkommen bei {{store_name}}",
|
|
),
|
|
"subtitle": t(
|
|
"Rejoignez notre programme de fidélité et profitez de récompenses exclusives à chaque visite.",
|
|
"Join our loyalty program and enjoy exclusive rewards with every visit.",
|
|
"Treten Sie unserem Treueprogramm bei und genießen Sie exklusive Prämien bei jedem Besuch.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("Rejoindre le programme", "Join Rewards", "Programm beitreten"),
|
|
"url": "account/loyalty",
|
|
"style": "primary",
|
|
},
|
|
{
|
|
"text": t("En savoir plus", "Learn More", "Mehr erfahren"),
|
|
"url": "about",
|
|
"style": "secondary",
|
|
},
|
|
],
|
|
},
|
|
"features": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Votre fidélité récompensée",
|
|
"Your Loyalty Rewarded",
|
|
"Ihre Treue wird belohnt",
|
|
),
|
|
"subtitle": t(
|
|
"Découvrez les avantages de notre programme",
|
|
"Discover the benefits of our program",
|
|
"Entdecken Sie die Vorteile unseres Programms",
|
|
),
|
|
"layout": "grid",
|
|
"features": [
|
|
{
|
|
"icon": "star",
|
|
"title": t("Gagnez des points", "Earn Points", "Punkte sammeln"),
|
|
"description": t(
|
|
"Cumulez des points à chaque achat et échangez-les contre des récompenses.",
|
|
"Accumulate points with every purchase and redeem them for rewards.",
|
|
"Sammeln Sie bei jedem Einkauf Punkte und lösen Sie sie gegen Prämien ein.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "gift",
|
|
"title": t("Récompenses exclusives", "Exclusive Rewards", "Exklusive Prämien"),
|
|
"description": t(
|
|
"Accédez à des offres et récompenses réservées aux membres.",
|
|
"Access offers and rewards reserved for members.",
|
|
"Zugang zu Angeboten und Prämien nur für Mitglieder.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "heart",
|
|
"title": t("Avantages membres", "Member Benefits", "Mitgliedervorteile"),
|
|
"description": t(
|
|
"Profitez d'avantages exclusifs en tant que membre fidèle.",
|
|
"Enjoy exclusive benefits as a loyal member.",
|
|
"Genießen Sie exklusive Vorteile als treues Mitglied.",
|
|
),
|
|
},
|
|
],
|
|
},
|
|
"cta": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Rejoignez-nous aujourd'hui",
|
|
"Join Us Today",
|
|
"Treten Sie uns noch heute bei",
|
|
),
|
|
"subtitle": t(
|
|
"Inscrivez-vous à notre programme de fidélité et commencez à gagner des récompenses.",
|
|
"Sign up for our loyalty program and start earning rewards.",
|
|
"Melden Sie sich für unser Treueprogramm an und beginnen Sie, Prämien zu verdienen.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("S'inscrire", "Sign Up", "Anmelden"),
|
|
"url": "account/loyalty",
|
|
"style": "primary",
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
def _store_homepage_sections_hosting() -> dict:
|
|
"""Store homepage sections for Hosting platform stores (client sites)."""
|
|
return {
|
|
"hero": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Bienvenue chez {{store_name}}",
|
|
"Welcome to {{store_name}}",
|
|
"Willkommen bei {{store_name}}",
|
|
),
|
|
"subtitle": t(
|
|
"Votre partenaire de confiance pour des solutions numériques sur mesure.",
|
|
"Your trusted partner for tailored digital solutions.",
|
|
"Ihr vertrauenswürdiger Partner für maßgeschneiderte digitale Lösungen.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("Nous contacter", "Contact Us", "Kontaktieren Sie uns"),
|
|
"url": "contact",
|
|
"style": "primary",
|
|
},
|
|
{
|
|
"text": t("À propos", "About Us", "Über uns"),
|
|
"url": "about",
|
|
"style": "secondary",
|
|
},
|
|
],
|
|
},
|
|
"features": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Nos services",
|
|
"Our Services",
|
|
"Unsere Dienstleistungen",
|
|
),
|
|
"subtitle": t(
|
|
"Ce que nous pouvons faire pour vous",
|
|
"What we can do for you",
|
|
"Was wir für Sie tun können",
|
|
),
|
|
"layout": "grid",
|
|
"features": [
|
|
{
|
|
"icon": "globe-alt",
|
|
"title": t("Site web", "Website", "Webseite"),
|
|
"description": t(
|
|
"Un site web professionnel qui reflète votre activité.",
|
|
"A professional website that reflects your business.",
|
|
"Eine professionelle Website, die Ihr Unternehmen widerspiegelt.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "shield-check",
|
|
"title": t("Hébergement sécurisé", "Secure Hosting", "Sicheres Hosting"),
|
|
"description": t(
|
|
"Hébergement fiable avec certificat SSL inclus.",
|
|
"Reliable hosting with SSL certificate included.",
|
|
"Zuverlässiges Hosting mit SSL-Zertifikat inklusive.",
|
|
),
|
|
},
|
|
{
|
|
"icon": "mail",
|
|
"title": t("Email professionnel", "Professional Email", "Professionelle E-Mail"),
|
|
"description": t(
|
|
"Adresses email personnalisées pour votre entreprise.",
|
|
"Custom email addresses for your business.",
|
|
"Individuelle E-Mail-Adressen für Ihr Unternehmen.",
|
|
),
|
|
},
|
|
],
|
|
},
|
|
"cta": {
|
|
"enabled": True,
|
|
"title": t(
|
|
"Besoin d'aide ?",
|
|
"Need Help?",
|
|
"Brauchen Sie Hilfe?",
|
|
),
|
|
"subtitle": t(
|
|
"Contactez-nous pour discuter de votre projet.",
|
|
"Contact us to discuss your project.",
|
|
"Kontaktieren Sie uns, um Ihr Projekt zu besprechen.",
|
|
),
|
|
"background_type": "gradient",
|
|
"buttons": [
|
|
{
|
|
"text": t("Nous contacter", "Contact Us", "Kontaktieren Sie uns"),
|
|
"url": "contact",
|
|
"style": "primary",
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
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") with platform-specific sections
|
|
store_sections_map = {
|
|
"oms": _store_homepage_sections_oms,
|
|
"loyalty": _store_homepage_sections_loyalty,
|
|
"hosting": _store_homepage_sections_hosting,
|
|
}
|
|
store_sections_fn = store_sections_map.get(platform.code)
|
|
store_sections = store_sections_fn() if store_sections_fn else None
|
|
if _create_page(
|
|
db, platform.id, STORE_DEFAULT_HOME,
|
|
is_platform_page=False, sections=store_sections,
|
|
):
|
|
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()
|