214 lines
14 KiB
Bash
214 lines
14 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# Generera alla quiXzoom landningssidor
|
|||
|
|
# 15 marknader × 20 use cases = 300 sidor
|
|||
|
|
|
|||
|
|
set -e
|
|||
|
|
|
|||
|
|
BASE_DIR="/home/bernt/.openclaw/workspace/quixzoom-market-pages"
|
|||
|
|
TEMPLATE_DIR="$BASE_DIR/se"
|
|||
|
|
|
|||
|
|
# Marknadskonfigurationer
|
|||
|
|
declare -A MARKETS=(
|
|||
|
|
["se"]="sv|Sverige|Sweden|SE|150–500 kr|Skatteverket|kr|🇸🇪 Lanseras i Sverige · 1 augusti 2026|quixzoom.se"
|
|||
|
|
["de"]="de|Deutschland|Germany|DE|15–50 €|Finanzamt|€|🇩🇪 Startet in Deutschland · August 2026|quixzoom.de"
|
|||
|
|
["fr"]="fr|France|France|FR|15–50 €|Direction générale des Finances publiques|€|🇫🇷 Lance en France · Août 2026|quixzoom.fr"
|
|||
|
|
["nl"]="nl|Nederland|Netherlands|NL|15–50 €|Belastingdienst|€|🇳🇱 Lanceert in Nederland · Augustus 2026|quixzoom.nl"
|
|||
|
|
["uk"]="en-gb|United Kingdom|United Kingdom|GB|£12–42|HMRC|£|🇬🇧 Launching in the UK · August 2026|quixzoom.co.uk"
|
|||
|
|
["it"]="it|Italia|Italy|IT|15–50 €|Agenzia delle Entrate|€|🇮🇹 Lancio in Italia · Agosto 2026|quixzoom.it"
|
|||
|
|
["es"]="es|España|Spain|ES|15–50 €|Agencia Tributaria|€|🇪🇸 Lanzamiento en España · Agosto 2026|quixzoom.es"
|
|||
|
|
["fi"]="fi|Suomi|Finland|FI|15–50 €|Verohallinto|€|🇫🇮 Lanserar i Finland · Elokuu 2026|quixzoom.fi"
|
|||
|
|
["da"]="da|Danmark|Denmark|DK|100–350 kr|Skattestyrelsen|kr|🇩🇰 Lancering i Danmark · August 2026|quixzoom.dk"
|
|||
|
|
["at"]="de|Österreich|Austria|AT|15–50 €|Bundesministerium für Finanzen|€|🇦🇹 Start in Österreich · August 2026|quixzoom.at"
|
|||
|
|
["be"]="nl|België|Belgium|BE|15–50 €|FOD Financiën|€|🇧🇪 Lancering in België · Augustus 2026|quixzoom.be"
|
|||
|
|
["ch"]="de|Schweiz|Switzerland|CH|15–50 CHF|ESTV|CHF|🇨🇭 Start in der Schweiz · August 2026|quixzoom.ch"
|
|||
|
|
["no"]="no|Norge|Norway|NO|150–500 kr|Skatteetaten|kr|🇳🇴 Lansering i Norge · August 2026|quixzoom.no"
|
|||
|
|
["ie"]="en-ie|Ireland|Ireland|IE|€15–50|Revenue Commissioners|€|🇮🇪 Launching in Ireland · August 2026|quixzoom.ie"
|
|||
|
|
["pl"]="pl|Polska|Poland|PL|60–200 zł|Ministerstwo Finansów|zł|🇵🇱 Start w Polsce · Sierpień 2026|quixzoom.pl"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Use cases med översättningar
|
|||
|
|
declare -A USE_CASES=(
|
|||
|
|
["bridge-inspection"]="Bridge Inspection|Broinspektion|Brückeninspektion|Inspection de ponts|Bruginspectie|Bridge Inspection|Ispezione ponti|Inspección de puentes|Sillan tarkastus|Broinspektion|Brückeninspektion|Bruginspectie|Brückeninspektion|Broinspeksjon|Bridge Inspection|Inspekcja mostów"
|
|||
|
|
["infrastructure-monitoring"]="Infrastructure Monitoring|Infrastrukturövervakning|Infrastrukturüberwachung|Surveillance d'infrastructure|Infrastructuurmonitoring|Infrastructure Monitoring|Monitoraggio infrastrutture|Monitoreo de infraestructura|Infrastruktuurin valvonta|Infrastrukturovervågning|Infrastrukturüberwachung|Infrastructuurmonitoring|Infrastrukturüberwachung|Infrastrukturovervåking|Infrastructure Monitoring|Monitorowanie infrastruktury"
|
|||
|
|
["property-documentation"]="Property Documentation|Fastighetsdokumentation|Immobiliendokumentation|Documentation immobilière|Vastgoeddocumentatie|Property Documentation|Documentazione immobiliare|Documentación de propiedades|Kiinteistödokumentaatio|Ejendomsdokumentation|Immobiliendokumentation|Vastgoeddocumentatie|Immobiliendokumentation|Eiendomsdokumentasjon|Property Documentation|Dokumentacja nieruchomości"
|
|||
|
|
["storm-damage"]="Storm Damage Assessment|Stormskadebedömning|Sturmschadenbewertung|Évaluation des dégâts de tempête|Stormschadebeoordeling|Storm Damage Assessment|Valutazione danni da tempesta|Evaluación de daños por tormenta|Myrskyvaurioarvio|Stormskadevurdering|Sturmschadenbewertung|Stormschadebeoordeling|Sturmschadenbewertung|Stormskadevurdering|Storm Damage Assessment|Ocena szkód po burzy"
|
|||
|
|
["retail-audit"]="Retail Audit|Butiksaudit|Einzelhandelsaudit|Audit de vente au détail|Retail audit|Retail Audit|Audit retail|Auditoría retail|Vähittäiskaupan tarkastus|Detailhandelsaudit|Einzelhandelsaudit|Retail audit|Einzelhandelsaudit|Detaljhandelsrevisjon|Retail Audit|Audyt detaliczny"
|
|||
|
|
["ooh-audit"]="OOH Audit|OOH-audit|OOH-Audit|Audit OOH|OOH-audit|OOH Audit|Audit OOH|Auditoría OOH|OOH-tarkastus|OOH-audit|OOH-Audit|OOH-audit|OOH-Audit|OOH-revisjon|OOH Audit|Audyt OOH"
|
|||
|
|
["construction-progress"]="Construction Progress|Byggframsteg|Baufortschritt|Progrès de construction|Bouwvoortgang|Construction Progress|Avanzamento lavori|Progreso de construcción|Rakennustyön edistyminen|Byggefremgang|Baufortschritt|Bouwvoortgang|Baufortschritt|Byggefremskridt|Construction Progress|Postęp budowy"
|
|||
|
|
["facade-inspection"]="Facade Inspection|Fasadinspektion|Fassadeninspektion|Inspection de façade|Gevelinspectie|Facade Inspection|Ispezione facciata|Inspección de fachadas|Julkisivutarkastus|Facadeinspektion|Fassadeninspektion|Gevelinspectie|Fassadeninspektion|Fasadeinspeksjon|Facade Inspection|Inspekcja elewacji"
|
|||
|
|
["roof-inspection"]="Roof Inspection|Takinspektion|Dachinspektion|Inspection de toit|Dakinspectie|Roof Inspection|Ispezione tetto|Inspección de tejados|Kattotarkastus|Taginspektion|Dachinspektion|Dakinspectie|Dachinspektion|Takinspeksjon|Roof Inspection|Inspekcja dachu"
|
|||
|
|
["road-condition"]="Road Condition|Vägcondition|Straßenzustand|État des routes|Wegconditie|Road Condition|Condizione stradale|Condición de carreteras|Tien kunto|Vejtilstand|Straßenzustand|Wegconditie|Straßenzustand|Veitilstand|Road Condition|Stan dróg"
|
|||
|
|
["signage-audit"]="Signage Audit|Skyltaudit|Beschilderungsaudit|Audit de signalisation|Signalisatie-audit|Signage Audit|Audit segnaletica|Auditoría de señalización|Opastetarkastus|Skilteaudit|Beschilderungsaudit|Signalisatie-audit|Beschilderungsaudit|Skiltingrevisjon|Signage Audit|Audyt oznakowania"
|
|||
|
|
["parking-audit"]="Parking Audit|Parkeringsaudit|Parkplatz-Audit|Audit de stationnement|Parkeer-audit|Parking Audit|Audit parcheggi|Auditoría de aparcamiento|Pysäköintitarkastus|Parkeringsaudit|Parkplatz-Audit|Parkeer-audit|Parkplatz-Audit|Parkeringsrevisjon|Parking Audit|Audyt parkingów"
|
|||
|
|
["asset-tracking"]="Asset Tracking|Tillgångsspårning|Asset Tracking|Suivi d'actifs|Asset tracking|Asset Tracking|Tracciamento asset|Seguimiento de activos|Omaisuuden seuranta|Asset tracking|Asset Tracking|Asset tracking|Asset Tracking|Eiendomssporing|Asset Tracking|Śledzenie zasobów"
|
|||
|
|
["environmental-survey"]="Environmental Survey|Miljöinventering|Umwelterhebung|Enquête environnementale|Milieudenquête|Environmental Survey|Indagine ambientale|Estudio medioambiental|Ympäristöselvitys|Miljøundersøgelse|Umwelterhebung|Milieudenquête|Umwelterhebung|Miljøundersøkelse|Environmental Survey|Badanie środowiskowe"
|
|||
|
|
["insurance-claim"]="Insurance Claim|Försäkringsärende|Versicherungsfall|Réclamation d'assurance|Verzekeringsclaim|Insurance Claim|Sinistro assicurativo|Reclamación de seguro|Vakuutusvaade|Forsikringskrav|Versicherungsfall|Verzekeringsclaim|Versicherungsfall|Forsikringskrav|Insurance Claim|Roszczenie ubezpieczeniowe"
|
|||
|
|
["lease-audit"]="Lease Audit|Hyresaudit|Lease-Audit|Audit de bail|Lease audit|Lease Audit|Audit locazione|Auditoría de arrendamiento|Vuokraustarkastus|Leasingaudit|Lease-Audit|Lease audit|Lease-Audit|Leasingrevisjon|Lease Audit|Audyt leasingowy"
|
|||
|
|
["event-documentation"]="Event Documentation|Eventdokumentation|Eventdokumentation|Documentation d'événement|Evenementdocumentatie|Event Documentation|Documentazione eventi|Documentación de eventos|Tapahtumadokumentaatio|Begivenhedsdokumentation|Eventdokumentation|Evenementdocumentatie|Eventdokumentation|Arrangementsdokumentasjon|Event Documentation|Dokumentacja wydarzeń"
|
|||
|
|
["pre-purchase-inspection"]="Pre-Purchase Inspection|Köpesbesiktning|Kaufinspektion|Inspection pré-achat|Pre-aankoopinspectie|Pre-Purchase Inspection|Ispezione pre-acquisto|Inspección pre-compra|Esihankintatarkastus|Forhåndskøbsinspektion|Kaufinspektion|Pre-aankoopinspectie|Kaufinspektion|Forhåndsinspeksjon|Pre-Purchase Inspection|Inspekcja przedzakupowa"
|
|||
|
|
["rental-inspection"]="Rental Inspection|Hyresinspektion|Mietinspektion|Inspection locative|Huurinspectie|Rental Inspection|Ispezione locazione|Inspección de alquiler|Vuokraustarkastus|Lejeinspektion|Mietinspektion|Huurinspectie|Mietinspektion|Leieinspeksjon|Rental Inspection|Inspekcja wynajmu"
|
|||
|
|
["accessibility-audit"]="Accessibility Audit|Tillgänglighetsaudit|Barrierefreiheits-Audit|Audit d'accessibilité|Toegankelijkheidsaudit|Accessibility Audit|Audit accessibilità|Auditoría de accesibilidad|Saavutettavuustarkastus|Tilgængelighedsaudit|Barrierefreiheits-Audit|Toegankelijkheidsaudit|Barrierefreiheits-Audit|Universell utforming revisjon|Accessibility Audit|Audyt dostępności"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Funktion för att generera en landningssida
|
|||
|
|
generate_page() {
|
|||
|
|
local market=$1
|
|||
|
|
local use_case=$2
|
|||
|
|
local lang=$(echo "${MARKETS[$market]}" | cut -d'|' -f1)
|
|||
|
|
local country_name=$(echo "${MARKETS[$market]}" | cut -d'|' -f2)
|
|||
|
|
local country_en=$(echo "${MARKETS[$market]}" | cut -d'|' -f3)
|
|||
|
|
local country_code=$(echo "${MARKETS[$market]}" | cut -d'|' -f4)
|
|||
|
|
local pay_range=$(echo "${MARKETS[$market]}" | cut -d'|' -f5)
|
|||
|
|
local tax_authority=$(echo "${MARKETS[$market]}" | cut -d'|' -f6)
|
|||
|
|
local currency=$(echo "${MARKETS[$market]}" | cut -d'|' -f7)
|
|||
|
|
local badge=$(echo "${MARKETS[$market]}" | cut -d'|' -f8)
|
|||
|
|
local domain=$(echo "${MARKETS[$market]}" | cut -d'|' -f9)
|
|||
|
|
|
|||
|
|
# Hämta use case-namn baserat på språk
|
|||
|
|
local use_case_names="${USE_CASES[$use_case]}"
|
|||
|
|
local use_case_name=""
|
|||
|
|
|
|||
|
|
case $lang in
|
|||
|
|
sv) use_case_name=$(echo "$use_case_names" | cut -d'|' -f2) ;;
|
|||
|
|
de) use_case_name=$(echo "$use_case_names" | cut -d'|' -f3) ;;
|
|||
|
|
fr) use_case_name=$(echo "$use_case_names" | cut -d'|' -f4) ;;
|
|||
|
|
nl) use_case_name=$(echo "$use_case_names" | cut -d'|' -f5) ;;
|
|||
|
|
en-gb|en-ie) use_case_name=$(echo "$use_case_names" | cut -d'|' -f6) ;;
|
|||
|
|
it) use_case_name=$(echo "$use_case_names" | cut -d'|' -f7) ;;
|
|||
|
|
es) use_case_name=$(echo "$use_case_names" | cut -d'|' -f8) ;;
|
|||
|
|
fi) use_case_name=$(echo "$use_case_names" | cut -d'|' -f9) ;;
|
|||
|
|
da) use_case_name=$(echo "$use_case_names" | cut -d'|' -f10) ;;
|
|||
|
|
at) use_case_name=$(echo "$use_case_names" | cut -d'|' -f11) ;;
|
|||
|
|
be) use_case_name=$(echo "$use_case_names" | cut -d'|' -f12) ;;
|
|||
|
|
ch) use_case_name=$(echo "$use_case_names" | cut -d'|' -f13) ;;
|
|||
|
|
no) use_case_name=$(echo "$use_case_names" | cut -d'|' -f14) ;;
|
|||
|
|
ie) use_case_name=$(echo "$use_case_names" | cut -d'|' -f15) ;;
|
|||
|
|
pl) use_case_name=$(echo "$use_case_names" | cut -d'|' -f16) ;;
|
|||
|
|
*) use_case_name=$(echo "$use_case_names" | cut -d'|' -f1) ;;
|
|||
|
|
esac
|
|||
|
|
|
|||
|
|
# Skapa katalog
|
|||
|
|
mkdir -p "$BASE_DIR/$market/$use_case"
|
|||
|
|
|
|||
|
|
# Generera HTML (förenklad version)
|
|||
|
|
cat > "$BASE_DIR/$market/$use_case/index.html" << EOF
|
|||
|
|
<!DOCTYPE html>
|
|||
|
|
<html lang="$lang">
|
|||
|
|
<head>
|
|||
|
|
<meta charset="UTF-8">
|
|||
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|||
|
|
<title>$use_case_name — quiXzoom | $country_name</title>
|
|||
|
|
<meta name="description" content="$use_case_name med quiXzoom i $country_name. Tjäna $pay_range per uppdrag. Betalt varje vecka.">
|
|||
|
|
<meta name="geo.region" content="$country_code">
|
|||
|
|
<meta name="geo.country" content="$country_en">
|
|||
|
|
<meta name="language" content="$country_name">
|
|||
|
|
<link rel="canonical" href="https://$domain/$use_case/">
|
|||
|
|
<style>
|
|||
|
|
:root{--qx-black:#0a0a0a;--qx-white:#fff;--qx-blue:#06f;--qx-gray:#f5f5f7;--qx-dark-gray:#1a1a1a}
|
|||
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|||
|
|
body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Helvetica Neue',sans-serif;color:var(--qx-black);line-height:1.5}
|
|||
|
|
.hero{background:var(--qx-black);color:var(--qx-white);padding:80px 20px;text-align:center}
|
|||
|
|
.hero h1{font-size:2.5rem;margin-bottom:1rem}
|
|||
|
|
.hero p{font-size:1.25rem;color:#ccc;margin-bottom:2rem}
|
|||
|
|
.badge{display:inline-block;background:var(--qx-blue);color:#fff;padding:8px 16px;border-radius:20px;font-size:.875rem;margin-bottom:1rem}
|
|||
|
|
.container{max-width:1200px;margin:0 auto;padding:40px 20px}
|
|||
|
|
.section{padding:60px 20px}
|
|||
|
|
.section-gray{background:var(--qx-gray)}
|
|||
|
|
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:24px}
|
|||
|
|
.card{background:#fff;padding:24px;border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,.1)}
|
|||
|
|
.card h3{margin-bottom:.5rem}
|
|||
|
|
.cta{display:inline-block;background:var(--qx-blue);color:#fff;padding:16px 32px;border-radius:8px;text-decoration:none;font-weight:600;margin-top:1rem}
|
|||
|
|
.footer{background:var(--qx-dark-gray);color:#fff;padding:40px 20px;text-align:center}
|
|||
|
|
</style>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<div class="hero">
|
|||
|
|
<div class="badge">$badge</div>
|
|||
|
|
<h1>$use_case_name</h1>
|
|||
|
|
<p>quiXzoom — Crowdsourcad datainsamling i $country_name. Tjäna $pay_range per uppdrag.</p>
|
|||
|
|
<a href="https://app.quixzoom.com/join" class="cta">Bli Zoomer nu</a>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="container">
|
|||
|
|
<div class="section">
|
|||
|
|
<h2>Hur det fungerar</h2>
|
|||
|
|
<div class="grid">
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>1. Hitta uppdrag</h3>
|
|||
|
|
<p>Se tillgängliga $use_case_name-uppdrag nära dig i appen.</p>
|
|||
|
|
</div>
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>2. Dokumentera</h3>
|
|||
|
|
<p>Följ instruktionerna och ta bilder med din smartphone.</p>
|
|||
|
|
</div>
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>3. Få betalt</h3>
|
|||
|
|
<p>Betalt varje vecka. $pay_range per godkänt uppdrag.</p>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="section section-gray">
|
|||
|
|
<div class="container">
|
|||
|
|
<h2>Varför quiXzoom?</h2>
|
|||
|
|
<div class="grid">
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>Flexibelt</h3>
|
|||
|
|
<p>Jobba när du vill. Inga scheman, inga minimikrav.</p>
|
|||
|
|
</div>
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>Betalt snabbt</h3>
|
|||
|
|
<p>Varje vecka direkt till ditt konto via Stripe.</p>
|
|||
|
|
</div>
|
|||
|
|
<div class="card">
|
|||
|
|
<h3>Tillförlitligt</h3>
|
|||
|
|
<p>Global plattform med verifierade uppdrag och tydlig feedback.</p>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="footer">
|
|||
|
|
<p>© 2026 quiXzoom AB — En del av <a href="https://aamos.systems" style="color:#fff">AAMOS</a></p>
|
|||
|
|
<p>$domain</p>
|
|||
|
|
</div>
|
|||
|
|
</body>
|
|||
|
|
</html>
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
echo "✓ $market/$use_case/index.html"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Räknare
|
|||
|
|
TOTAL=0
|
|||
|
|
DONE=0
|
|||
|
|
|
|||
|
|
# Räkna totalt
|
|||
|
|
for market in "${!MARKETS[@]}"; do
|
|||
|
|
for use_case in "${!USE_CASES[@]}"; do
|
|||
|
|
((TOTAL++))
|
|||
|
|
done
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
echo "Genererar $TOTAL landningssidor..."
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Generera alla sidor
|
|||
|
|
for market in se de fr nl uk it es fi da at be ch no ie pl; do
|
|||
|
|
echo "=== Marknad: $market ==="
|
|||
|
|
for use_case in "${!USE_CASES[@]}"; do
|
|||
|
|
generate_page "$market" "$use_case"
|
|||
|
|
((DONE++))
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "✅ Klart! $DONE landningssidor genererade."
|
|||
|
|
echo ""
|
|||
|
|
echo "Nästa steg:"
|
|||
|
|
echo "1. Deploya till S3: aws s3 sync $BASE_DIR s3://quixzoom-landing-prod/markets/"
|
|||
|
|
echo "2. Invalida CloudFront-cache"
|
|||
|
|
echo "3. Verifiera att alla sidor är tillgängliga"
|