#!/usr/bin/env python3 """ Generera alla quiXzoom landningssidor 15 marknader × 20 use cases = 300 sidor """ import os import shutil BASE_DIR = "/home/bernt/.openclaw/workspace/quixzoom-market-pages" # Marknadskonfigurationer MARKETS = { "se": {"lang": "sv", "country": "Sverige", "country_en": "Sweden", "code": "SE", "pay": "150–500 kr", "tax": "Skatteverket", "curr": "kr", "badge": "🇸🇪 Lanseras i Sverige · 1 augusti 2026", "domain": "quixzoom.se"}, "de": {"lang": "de", "country": "Deutschland", "country_en": "Germany", "code": "DE", "pay": "15–50 €", "tax": "Finanzamt", "curr": "€", "badge": "🇩🇪 Startet in Deutschland · August 2026", "domain": "quixzoom.de"}, "fr": {"lang": "fr", "country": "France", "country_en": "France", "code": "FR", "pay": "15–50 €", "tax": "DGFiP", "curr": "€", "badge": "🇫🇷 Lance en France · Août 2026", "domain": "quixzoom.fr"}, "nl": {"lang": "nl", "country": "Nederland", "country_en": "Netherlands", "code": "NL", "pay": "15–50 €", "tax": "Belastingdienst", "curr": "€", "badge": "🇳🇱 Lanceert in Nederland · Augustus 2026", "domain": "quixzoom.nl"}, "uk": {"lang": "en-gb", "country": "United Kingdom", "country_en": "United Kingdom", "code": "GB", "pay": "£12–42", "tax": "HMRC", "curr": "£", "badge": "🇬🇧 Launching in the UK · August 2026", "domain": "quixzoom.co.uk"}, "it": {"lang": "it", "country": "Italia", "country_en": "Italy", "code": "IT", "pay": "15–50 €", "tax": "Agenzia delle Entrate", "curr": "€", "badge": "🇮🇹 Lancio in Italia · Agosto 2026", "domain": "quixzoom.it"}, "es": {"lang": "es", "country": "España", "country_en": "Spain", "code": "ES", "pay": "15–50 €", "tax": "Agencia Tributaria", "curr": "€", "badge": "🇪🇸 Lanzamiento en España · Agosto 2026", "domain": "quixzoom.es"}, "fi": {"lang": "fi", "country": "Suomi", "country_en": "Finland", "code": "FI", "pay": "15–50 €", "tax": "Verohallinto", "curr": "€", "badge": "🇫🇮 Lanserar i Finland · Elokuu 2026", "domain": "quixzoom.fi"}, "da": {"lang": "da", "country": "Danmark", "country_en": "Denmark", "code": "DK", "pay": "100–350 kr", "tax": "Skattestyrelsen", "curr": "kr", "badge": "🇩🇰 Lancering i Danmark · August 2026", "domain": "quixzoom.dk"}, "at": {"lang": "de", "country": "Österreich", "country_en": "Austria", "code": "AT", "pay": "15–50 €", "tax": "BMF", "curr": "€", "badge": "🇦🇹 Start in Österreich · August 2026", "domain": "quixzoom.at"}, "be": {"lang": "nl", "country": "België", "country_en": "Belgium", "code": "BE", "pay": "15–50 €", "tax": "FOD Financiën", "curr": "€", "badge": "🇧🇪 Lancering in België · Augustus 2026", "domain": "quixzoom.be"}, "ch": {"lang": "de", "country": "Schweiz", "country_en": "Switzerland", "code": "CH", "pay": "15–50 CHF", "tax": "ESTV", "curr": "CHF", "badge": "🇨🇭 Start in der Schweiz · August 2026", "domain": "quixzoom.ch"}, "no": {"lang": "no", "country": "Norge", "country_en": "Norway", "code": "NO", "pay": "150–500 kr", "tax": "Skatteetaten", "curr": "kr", "badge": "🇳🇴 Lansering i Norge · August 2026", "domain": "quixzoom.no"}, "ie": {"lang": "en-ie", "country": "Ireland", "country_en": "Ireland", "code": "IE", "pay": "€15–50", "tax": "Revenue Commissioners", "curr": "€", "badge": "🇮🇪 Launching in Ireland · August 2026", "domain": "quixzoom.ie"}, "pl": {"lang": "pl", "country": "Polska", "country_en": "Poland", "code": "PL", "pay": "60–200 zł", "tax": "Ministerstwo Finansów", "curr": "zł", "badge": "🇵🇱 Start w Polsce · Sierpień 2026", "domain": "quixzoom.pl"}, } # Use cases med översättningar USE_CASES = { "bridge-inspection": { "sv": "Broinspektion", "de": "Brückeninspektion", "fr": "Inspection de ponts", "nl": "Bruginspectie", "en-gb": "Bridge Inspection", "it": "Ispezione ponti", "es": "Inspección de puentes", "fi": "Sillan tarkastus", "da": "Broinspektion", "no": "Broinspeksjon", "en-ie": "Bridge Inspection", "pl": "Inspekcja mostów" }, "infrastructure-monitoring": { "sv": "Infrastrukturövervakning", "de": "Infrastrukturüberwachung", "fr": "Surveillance d'infrastructure", "nl": "Infrastructuurmonitoring", "en-gb": "Infrastructure Monitoring", "it": "Monitoraggio infrastrutture", "es": "Monitoreo de infraestructura", "fi": "Infrastruktuurin valvonta", "da": "Infrastrukturovervågning", "no": "Infrastrukturovervåking", "en-ie": "Infrastructure Monitoring", "pl": "Monitorowanie infrastruktury" }, "property-documentation": { "sv": "Fastighetsdokumentation", "de": "Immobiliendokumentation", "fr": "Documentation immobilière", "nl": "Vastgoeddocumentatie", "en-gb": "Property Documentation", "it": "Documentazione immobiliare", "es": "Documentación de propiedades", "fi": "Kiinteistödokumentaatio", "da": "Ejendomsdokumentation", "no": "Eiendomsdokumentasjon", "en-ie": "Property Documentation", "pl": "Dokumentacja nieruchomości" }, "storm-damage": { "sv": "Stormskadebedömning", "de": "Sturmschadenbewertung", "fr": "Évaluation des dégâts de tempête", "nl": "Stormschadebeoordeling", "en-gb": "Storm Damage Assessment", "it": "Valutazione danni da tempesta", "es": "Evaluación de daños por tormenta", "fi": "Myrskyvaurioarvio", "da": "Stormskadevurdering", "no": "Stormskadevurdering", "en-ie": "Storm Damage Assessment", "pl": "Ocena szkód po burzy" }, "retail-audit": { "sv": "Butiksaudit", "de": "Einzelhandelsaudit", "fr": "Audit de vente au détail", "nl": "Retail audit", "en-gb": "Retail Audit", "it": "Audit retail", "es": "Auditoría retail", "fi": "Vähittäiskaupan tarkastus", "da": "Detailhandelsaudit", "no": "Detaljhandelsrevisjon", "en-ie": "Retail Audit", "pl": "Audyt detaliczny" }, "ooh-audit": { "sv": "OOH-audit", "de": "OOH-Audit", "fr": "Audit OOH", "nl": "OOH-audit", "en-gb": "OOH Audit", "it": "Audit OOH", "es": "Auditoría OOH", "fi": "OOH-tarkastus", "da": "OOH-audit", "no": "OOH-revisjon", "en-ie": "OOH Audit", "pl": "Audyt OOH" }, "construction-progress": { "sv": "Byggframsteg", "de": "Baufortschritt", "fr": "Progrès de construction", "nl": "Bouwvoortgang", "en-gb": "Construction Progress", "it": "Avanzamento lavori", "es": "Progreso de construcción", "fi": "Rakennustyön edistyminen", "da": "Byggefremgang", "no": "Byggefremskridt", "en-ie": "Construction Progress", "pl": "Postęp budowy" }, "facade-inspection": { "sv": "Fasadinspektion", "de": "Fassadeninspektion", "fr": "Inspection de façade", "nl": "Gevelinspectie", "en-gb": "Facade Inspection", "it": "Ispezione facciata", "es": "Inspección de fachadas", "fi": "Julkisivutarkastus", "da": "Facadeinspektion", "no": "Fasadeinspeksjon", "en-ie": "Facade Inspection", "pl": "Inspekcja elewacji" }, "roof-inspection": { "sv": "Takinspektion", "de": "Dachinspektion", "fr": "Inspection de toit", "nl": "Dakinspectie", "en-gb": "Roof Inspection", "it": "Ispezione tetto", "es": "Inspección de tejados", "fi": "Kattotarkastus", "da": "Taginspektion", "no": "Takinspeksjon", "en-ie": "Roof Inspection", "pl": "Inspekcja dachu" }, "road-condition": { "sv": "Vägcondition", "de": "Straßenzustand", "fr": "État des routes", "nl": "Wegconditie", "en-gb": "Road Condition", "it": "Condizione stradale", "es": "Condición de carreteras", "fi": "Tien kunto", "da": "Vejtilstand", "no": "Veitilstand", "en-ie": "Road Condition", "pl": "Stan dróg" }, "signage-audit": { "sv": "Skyltaudit", "de": "Beschilderungsaudit", "fr": "Audit de signalisation", "nl": "Signalisatie-audit", "en-gb": "Signage Audit", "it": "Audit segnaletica", "es": "Auditoría de señalización", "fi": "Opastetarkastus", "da": "Skilteaudit", "no": "Skiltingrevisjon", "en-ie": "Signage Audit", "pl": "Audyt oznakowania" }, "parking-audit": { "sv": "Parkeringsaudit", "de": "Parkplatz-Audit", "fr": "Audit de stationnement", "nl": "Parkeer-audit", "en-gb": "Parking Audit", "it": "Audit parcheggi", "es": "Auditoría de aparcamiento", "fi": "Pysäköintitarkastus", "da": "Parkeringsaudit", "no": "Parkeringsrevisjon", "en-ie": "Parking Audit", "pl": "Audyt parkingów" }, "asset-tracking": { "sv": "Tillgångsspårning", "de": "Asset Tracking", "fr": "Suivi d'actifs", "nl": "Asset tracking", "en-gb": "Asset Tracking", "it": "Tracciamento asset", "es": "Seguimiento de activos", "fi": "Omaisuuden seuranta", "da": "Asset tracking", "no": "Eiendomssporing", "en-ie": "Asset Tracking", "pl": "Śledzenie zasobów" }, "environmental-survey": { "sv": "Miljöinventering", "de": "Umwelterhebung", "fr": "Enquête environnementale", "nl": "Milieudenquête", "en-gb": "Environmental Survey", "it": "Indagine ambientale", "es": "Estudio medioambiental", "fi": "Ympäristöselvitys", "da": "Miljøundersøgelse", "no": "Miljøundersøkelse", "en-ie": "Environmental Survey", "pl": "Badanie środowiskowe" }, "insurance-claim": { "sv": "Försäkringsärende", "de": "Versicherungsfall", "fr": "Réclamation d'assurance", "nl": "Verzekeringsclaim", "en-gb": "Insurance Claim", "it": "Sinistro assicurativo", "es": "Reclamación de seguro", "fi": "Vakuutusvaade", "da": "Forsikringskrav", "no": "Forsikringskrav", "en-ie": "Insurance Claim", "pl": "Roszczenie ubezpieczeniowe" }, "lease-audit": { "sv": "Hyresaudit", "de": "Lease-Audit", "fr": "Audit de bail", "nl": "Lease audit", "en-gb": "Lease Audit", "it": "Audit locazione", "es": "Auditoría de arrendamiento", "fi": "Vuokraustarkastus", "da": "Leasingaudit", "no": "Leasingrevisjon", "en-ie": "Lease Audit", "pl": "Audyt leasingowy" }, "event-documentation": { "sv": "Eventdokumentation", "de": "Eventdokumentation", "fr": "Documentation d'événement", "nl": "Evenementdocumentatie", "en-gb": "Event Documentation", "it": "Documentazione eventi", "es": "Documentación de eventos", "fi": "Tapahtumadokumentaatio", "da": "Begivenhedsdokumentation", "no": "Arrangementsdokumentasjon", "en-ie": "Event Documentation", "pl": "Dokumentacja wydarzeń" }, "pre-purchase-inspection": { "sv": "Köpesbesiktning", "de": "Kaufinspektion", "fr": "Inspection pré-achat", "nl": "Pre-aankoopinspectie", "en-gb": "Pre-Purchase Inspection", "it": "Ispezione pre-acquisto", "es": "Inspección pre-compra", "fi": "Esihankintatarkastus", "da": "Forhåndskøbsinspektion", "no": "Forhåndsinspeksjon", "en-ie": "Pre-Purchase Inspection", "pl": "Inspekcja przedzakupowa" }, "rental-inspection": { "sv": "Hyresinspektion", "de": "Mietinspektion", "fr": "Inspection locative", "nl": "Huurinspectie", "en-gb": "Rental Inspection", "it": "Ispezione locazione", "es": "Inspección de alquiler", "fi": "Vuokraustarkastus", "da": "Lejeinspektion", "no": "Leieinspeksjon", "en-ie": "Rental Inspection", "pl": "Inspekcja wynajmu" }, "accessibility-audit": { "sv": "Tillgänglighetsaudit", "de": "Barrierefreiheits-Audit", "fr": "Audit d'accessibilité", "nl": "Toegankelijkheidsaudit", "en-gb": "Accessibility Audit", "it": "Audit accessibilità", "es": "Auditoría de accesibilidad", "fi": "Saavutettavuustarkastus", "da": "Tilgængelighedsaudit", "no": "Universell utforming revisjon", "en-ie": "Accessibility Audit", "pl": "Audyt dostępności" }, } def generate_page(market, use_case): m = MARKETS[market] lang = m["lang"] # Hämta use case-namn på rätt språk uc_names = USE_CASES[use_case] uc_name = uc_names.get(lang, uc_names.get("en-gb", use_case.replace("-", " ").title())) # Skapa katalog dir_path = os.path.join(BASE_DIR, market, use_case) os.makedirs(dir_path, exist_ok=True) # Generera HTML html = f""" {uc_name} — quiXzoom | {m['country']}
{m['badge']}

{uc_name}

quiXzoom — Crowdsourcad datainsamling i {m['country']}. Tjäna {m['pay']} per uppdrag.

Bli Zoomer nu

Hur det fungerar

1. Hitta uppdrag

Se tillgängliga {uc_name}-uppdrag nära dig i appen.

2. Dokumentera

Följ instruktionerna och ta bilder med din smartphone.

3. Få betalt

Betalt varje vecka. {m['pay']} per godkänt uppdrag.

Varför quiXzoom?

Flexibelt

Jobba när du vill. Inga scheman, inga minimikrav.

Betalt snabbt

Varje vecka direkt till ditt konto via Stripe.

Tillförlitligt

Global plattform med verifierade uppdrag och tydlig feedback.

""" filepath = os.path.join(dir_path, "index.html") with open(filepath, 'w', encoding='utf-8') as f: f.write(html) return True def main(): total = 0 done = 0 # Räkna totalt for market in MARKETS: for use_case in USE_CASES: total += 1 print(f"Genererar {total} landningssidor...") print() # Generera alla sidor for market in sorted(MARKETS.keys()): print(f"=== Marknad: {market} ===") for use_case in USE_CASES: if generate_page(market, use_case): done += 1 print() print() print(f"✅ Klart! {done} landningssidor genererade.") print() print("Nästa steg:") print("1. Deploya till S3: aws s3 sync quixzoom-market-pages s3://quixzoom-landing-prod/markets/") print("2. Invalida CloudFront-cache") print("3. Verifiera att alla sidor är tillgängliga") if __name__ == "__main__": main()