{% extends "@StartPlatzStyleBundle/Bootstrap4/base.homepage.event-lp.html.twig" %}
{% import "@StartPlatzEventBundle/Admin/_macros.bs4.html.twig" as layout %}
{% set currentPath = app.request.get('_route') %}
{% block metaData %}
{# Language Detection for SEO #}
{% set lang = app.request.get('lang', 'de')|lower %}
{% set isEnglish = lang == 'en' %}
{# Select SEO content based on language with fallback #}
{% set seoTitle = isEnglish and event.seoTitleEn ? event.seoTitleEn : event.seoTitle %}
{% set seoDescription = isEnglish and event.seoDescriptionEn ? event.seoDescriptionEn : event.seoDescription %}
{% set seoKeyword = isEnglish and event.seoKeywordEn ? event.seoKeywordEn : event.seoKeyword %}
{# Optimize meta description for archived events #}
{% if event.status == 'archive' %}
{% set archivePrefix = isEnglish ? 'Past event from ' ~ event.startDate|date('F j, Y') ~ ': ' : 'Vergangene Veranstaltung vom ' ~ event.startDate|date('d.m.Y') ~ ': ' %}
<meta name="description" content="{{ archivePrefix }}{{ seoDescription|slice(0, 140) }}">
{% else %}
<meta name="description" content="{{ seoDescription }}">
{% endif %}
<meta name="keywords" content="{{ seoKeyword }}">
<meta name="author" content="{{ event.trainer }}">
{% if app.environment == 'prod' %}
<meta name="robots" content="index,follow">
{% if event.seriesTag is not empty %}
<link rel="canonical" href="{{ path('event_series', {'seriesTag': event.seriesTag, 'lang': lang}) }}" />
{% else %}
<link rel="canonical" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}{% if lang == 'en' %}?lang=en{% endif %}" />
{% endif %}
{# hreflang tags for bilingual support #}
{% if event.hasEnglishVersion %}
<link rel="alternate" hreflang="de" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=de" />
<link rel="alternate" hreflang="en" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}?lang=en" />
<link rel="alternate" hreflang="x-default" href="https://www.startplatz.de/event/{{ event.slug | url_encode }}" />
{% endif %}
{% else %}
<meta name="robots" content="noindex,nofollow">
{% endif %}
<!-- Open Graph with language support -->
<meta property="og:title" content="{{ seoTitle }}">
<meta property="og:description" content="{{ seoDescription }}">
<meta property="og:image" content="{{ event.imageLink }}">
<meta property="og:locale" content="{{ lang == 'en' ? 'en_US' : 'de_DE' }}">
{% if event.hasEnglishVersion %}
<meta property="og:locale:alternate" content="{{ lang == 'en' ? 'de_DE' : 'en_US' }}">
{% endif %}
<!-- Twitter Card -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="{{ seoTitle }}">
<meta name="twitter:description" content="{{ seoDescription }}">
<meta name="twitter:image" content="{{ event.imageLink }}">
{% endblock %}
{% block title %}{{ seoTitle|default(event.seoTitle) }}{% endblock %}
{% block additionalHead %}
{#
{% include "@StartPlatzStyle/CSS/_homepage.sinlge-event.version-2023-fall.html.twig" %}
#}
{% if event.additionalCss is not empty %}
<!-- addition css styles only for this event -->
<style>
.bg-registration {
background-color: #9632FF;
}
{{ include(template_from_string(event.additionalCss), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent
}) }}
</style>
{% endif %}
{# Meta Pixel tracking for ai-coding-hackathon-2025 #}
{% if event.slug == 'ai-coding-hackathon-2025' %}
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '113165142734893');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=113165142734893&ev=PageView&noscript=1"/>
</noscript>
<!-- End Meta Pixel Code -->
{% endif %}
{% endblock %}
{% block content %}
{# Language Detection Logic #}
{% set lang = app.request.get('lang', 'de')|lower %}
{% set isEnglish = lang == 'en' %}
{# Select content based on language with fallback to German #}
{% set navbar = isEnglish and event.navbarEn ? event.navbarEn : event.navbar %}
{% set teaser = isEnglish and event.teaserEn ? event.teaserEn : event.teaser %}
{% set content = isEnglish and event.contentEn ? event.contentEn : event.content %}
{% set contentTwig = isEnglish and event.contentTwigEn ? event.contentTwigEn : event.contentTwig %}
{% set postCtaContent = isEnglish and event.postCtaContentEn ? event.postCtaContentEn : event.postCtaContent %}
<!-- start part navbar -->
{{ include(template_from_string(navbar), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
<!-- end part navbar -->
<!-- start part title, time and location -->
{{ include(template_from_string(teaser), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
<!-- end part title, time and location -->
<!-- Archive Banner (SEO-optimized: no redirect) -->
{% include '@StartPlatzEvent/Default/_event.part.archive-banner.html.twig' with {
'event': event,
'isEnglish': isEnglish
} %}
<!-- end archive banner -->
{% if app.session.flashbag.has('notice') %}
<!-- start part flashbag notices -->
<section class="bg-sp-grey py-3">
<div class="container">
<div class="content-wrapper content-background">
{% for flashMessage in app.session.flashbag.get('notice') %}
<div class="text-center alert {% if 'SUCCESS' in flashMessage %}alert-success{% elseif 'ERROR' in flashMessage %}alert-danger{% else %}alert-default{% endif %}" role="alert">{{ flashMessage|replace({'SUCCESS': ''})|raw }}</div>
{% endfor %}
{{ editFeedback|raw }}
</div> <!-- End of content-wrapper -->
</div>
</section>
<!-- end part flashbag notices -->
{% endif %}
{% if batch and application and application.applicationStatus %}
<!-- start part feedback application process -->
{% include "@StartPlatzEvent/Default/_event.part.feedback-application-process.html.twig" %}
<!-- end part feedback application process -->
{% endif %}
<!-- start part content -->
{{ include(template_from_string(content), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
<!-- end part content -->
{% if contentTwig %}
<!-- start part contentTwig (dynamic Twig content) -->
{{ include(template_from_string(contentTwig), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'futureBatches': futureBatches,
'allBatches': allBatches,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
<!-- end part contentTwig -->
{% endif %}
<!-- start part anmeldung -->
{% include "@StartPlatzEvent/Default/_section.anmeldung.html.twig" with {
'event': event,
'batch': batch,
'batchIsOpen': batchIsOpen,
'application': application,
'settings': settings,
'isMultiBatchEvent': isMultiBatchEvent,
'futureBatches': futureBatches,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
} %}
<!-- end part anmeldung -->
<!-- start tags -->
{% include "@StartPlatzEvent/Default/_section.tags.html.twig" %}
<!-- end tags -->
<!-- start post cta content -->
{% if postCtaContent %}
{{ include(template_from_string(postCtaContent), {
'event': event,
'batch': batch,
'isMultiBatchEvent': isMultiBatchEvent,
'lang': lang,
'isEnglish': isEnglish,
'phrases': phrases
}) }}
{% endif %}
<!-- end post cta content -->
{% if speakers %}
<!-- start part speakers and partners -->
{% include "@StartPlatzEvent/Default/_section.speakers-and-partners.html.twig" %}
<!-- end part speakers and partners -->
{% endif %}
<!-- start part past batches -->
{% include "@StartPlatzEvent/Default/_section.past-batches.html.twig" with {
'event': event,
'isMultiBatchEvent': isMultiBatchEvent,
'pastBatches': pastBatches,
'isEnglish': isEnglish
} %}
<!-- end part past batches -->
{% if app.user and batch %}
<!-- start part promote this event -->
{% include "@StartPlatzEvent/Default/_section.promote-this-event.html.twig" %}
<!-- end part promote this event -->
{% endif %}
{% if app.user is defined and application is defined and application is not null and application.canReadList %}
<section class="bg-sp-grey py-3">
<div class="container">
<div class="content-wrapper content-background">
Hier kannst Du die Teilnehmerliste einsehen
<a class="btn btn-outline-dark btn-sm" href="{{ path('admin_event_participants', {id: event.id} ) }}" role="button">participants</a>
</div>
</div>
</section>
{% endif %}
{% if app.user is defined %}
{% if app.user.admin is defined and app.user.admin %}
<!-- start part startplatz admin section -->
{% include "@StartPlatzEvent/Default/_section.startplatz-admin-section.html.twig" %}
<!-- end part startplatz admin section -->
{% endif %}
{% endif %}
{# Language Switcher Component #}
{% if event.hasEnglishVersion %}
<div class="language-switcher-container">
<div class="language-switcher">
<a href="?lang=de" class="lang-link {{ lang == 'de' ? 'active' : '' }}" title="Deutsch">
<span class="flag">🇩🇪</span>
<span class="lang-code">DE</span>
</a>
<span class="separator">|</span>
<a href="?lang=en" class="lang-link {{ lang == 'en' ? 'active' : '' }}" title="English">
<span class="flag">🇬🇧</span>
<span class="lang-code">EN</span>
</a>
</div>
</div>
<style>
.language-switcher-container {
position: fixed;
top: 120px;
right: 20px;
z-index: 1000;
}
.language-switcher {
background: white;
border: 2px solid #9632FF;
border-radius: 25px;
padding: 8px 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
display: flex;
align-items: center;
gap: 8px;
}
.language-switcher .lang-link {
display: flex;
align-items: center;
gap: 4px;
text-decoration: none;
color: #333;
font-weight: 500;
padding: 4px 8px;
border-radius: 15px;
transition: all 0.2s;
}
.language-switcher .lang-link:hover {
background-color: #f0f0f0;
}
.language-switcher .lang-link.active {
background-color: #9632FF;
color: white;
}
.language-switcher .flag {
font-size: 20px;
line-height: 1;
}
.language-switcher .lang-code {
font-size: 14px;
font-weight: 600;
}
.language-switcher .separator {
color: #ccc;
font-weight: 300;
}
@media (max-width: 768px) {
.language-switcher-container {
top: 80px;
right: 10px;
}
.language-switcher {
padding: 6px 12px;
}
}
</style>
{% endif %}
<!-- homepage event single page ends -->
{% endblock %}
{% block footer %}
{% if not embed|default(false) %}
{% include '@StartPlatzWebsiteBundle/Default/footerBootstrap40.html.twig' %}
{% endif %}
{% endblock %}
{% block infiniteLoop %}{% endblock %}
{% block javascriptInfiniteLoop %}{% endblock %}
{% block ajax_helpers %}{% endblock %}
{% block javascripts %}
{% if event.additionalJs is not empty %}
<!-- Additional JavaScript for this event -->
<script>
// Available variables: event, batch, lang, isEnglish
var eventData = {
id: {{ event.id }},
title: "{{ event.title|e('js') }}",
slug: "{{ event.slug|e('js') }}",
lang: "{{ lang }}",
isEnglish: {{ isEnglish ? 'true' : 'false' }}
};
{{ include(template_from_string(event.additionalJs), {
'event': event,
'batch': batch,
'lang': lang,
'isEnglish': isEnglish
})|raw }}
</script>
{% endif %}
{% endblock %}