From 1f663aa63e6d4d0e57c6c82f4ec39fd1859b0b56 Mon Sep 17 00:00:00 2001
From: magicfelix <felix@felix-zauberer.de>
Date: Wed, 29 Jan 2025 13:42:43 +0100
Subject: [PATCH] Internationalize template

---
 config.toml                               | 114 ++++++++++++++++++++++
 content/_index.en.md                      |   4 +
 content/blog/_index.en.md                 |  10 ++
 content/gemeinschaft/_index.en.md         |   2 +
 content/projekte/_index.en.md             |   2 +
 templates/404.html                        |   6 +-
 templates/base.html                       |   4 +-
 templates/blog/meta_line.html             |   6 +-
 templates/blog/overview.html              |  12 +--
 templates/blog/post.html                  |   6 +-
 templates/blog/section.html               |   4 +-
 templates/footer.html                     |  14 +--
 templates/frontpage/blog.html             |   6 +-
 templates/frontpage/claim.html            |   2 +-
 templates/frontpage/events.html           |   2 +-
 templates/frontpage/projects.html         |   6 +-
 templates/menu.html                       |  10 +-
 templates/menu/gemeinschaft.html          |   4 +-
 templates/menu/infos.html                 |   2 +-
 templates/menu/projects.html              |   4 +-
 templates/pages/content.html              |   8 +-
 templates/shortcodes/button.html          |   2 +-
 templates/shortcodes/further.html         |   2 +-
 templates/shortcodes/hero_section.html    |   2 +-
 templates/shortcodes/message.html         |   2 +-
 templates/shortcodes/teckids_contact.html |   4 +-
 templates/shortcodes/teckids_event.html   |  14 +--
 templates/shortcodes/teckids_related.html |  16 +--
 28 files changed, 199 insertions(+), 71 deletions(-)
 create mode 100644 content/_index.en.md
 create mode 100644 content/blog/_index.en.md
 create mode 100644 content/gemeinschaft/_index.en.md
 create mode 100644 content/projekte/_index.en.md

diff --git a/config.toml b/config.toml
index 2f7fd1ff..ad32621e 100644
--- a/config.toml
+++ b/config.toml
@@ -104,3 +104,117 @@ link = "https://bildung.social/@Teckids"
 icon = "fa-brands fa-git"
 rel = "me"
 link = "https://edugit.org/Teckids/"
+
+[languages.en]
+description = "A comprehensible (digital) world – together, for everyone."
+
+taxonomies = [
+  { name = "projekt", render = false, feed = true },
+  { name = "zielgruppe", render = false, feed = true },
+  { name = "aspekt", render = false, feed = false },
+  { name = "produkt", render = false, feed = false },
+
+  { name = "tags", render = false },
+]
+
+[languages.en.translations]
+impressum = "Imprint"
+not_found_header = "Page not found (404)"
+not_found_body = "The requested page can not be found."
+published_on = "Published on"
+word_count = "Number of words"
+words = "words"
+reading_time = "Reading time"
+minutes_short = "min"
+further_related_posts = "Further related posts"
+related_blog_posts = "Teckids blog posts on this topic"
+teckids_blog_posts = "Teckids blog posts"
+teckids_blog_page = "Teckids blog – page"
+pages_of = "of"
+previous_page = "Previous"
+next_page = "Next"
+page = "Page"
+more_teckids_blog_posts = "More Teckids blog posts"
+donation_account = "Bank account for donations"
+supporters_partners = "Supporters and partners"
+further = "Further information"
+channels_networks = "Channels and Networks"
+licensed_under = "Licensed under"
+created_using = "Created using"
+and = "and"
+or = "or"
+this_page_can = "This page can"
+edited_on_edugit = "be edited on EduGit"
+improvement_suggestion = "an improvement can be suggested"
+upcoming_events = "Upcoming events"
+projects = "Projects"
+our_projects = "Our projects"
+information_for = "Information for …"
+teckids_community = "Teckids community"
+page_missing = "This page is not yet finished"
+page_missing_explanation = "Due to the creation of our new website being elaborate, the information on this page unfortunately is not complete."
+event_cost_explanation = """It's important to us that everyone interested can take part in Hack’n’Sun.
+We are aware that our prices are high for some families for any reason. If this is the case for you, please mail us the amount you want to pay. There's no need to tell us why."""
+event_fully_booked = "The event is fully booked. For further registrations or a waiting list, one can contact us via e-mail."
+event_info_registration = "All information and registration"
+write_email = "Write an e-mail"
+call_us = "Call us"
+wiki = "Wiki"
+wiki_subtitle = "Informationen and assistance in the Teckids wiki"
+forum = "Forum"
+forum_subtitle = "Questions and discussions in the Teckids forum"
+chat = "Chat"
+chat_subtitle = "Chat about it"
+help_platforms = "Information about and assistance in using our platforms"
+
+[translations]
+impressum = "Imprint"
+not_found_header = "Seite nicht gefunden (404)"
+not_found_body = "Die gesuchte Seite wurde leider nicht gefunden."
+published_on = "Veröffentlicht am"
+word_count = "Anzahl Wörter"
+words = "Wörter"
+reading_time = "Lesezeit"
+minutes_short = "min"
+further_related_posts = "Weitere Posts dazu"
+related_blog_posts = "Verwandte Posts aus dem Teckids-Blog"
+teckids_blog_posts = "Aus dem Teckids-Blog"
+teckids_blog_page = "Teckids-Blog – Seite"
+pages_of = "von"
+previous_page = "Vorherige"
+next_page = "Nächste"
+page = "Seite"
+more_teckids_blog_posts = "Mehr aus dem Teckids-Blog"
+donation_account = "Spendenkonto"
+supporters_partners = "Unterstützer und Partner*innen"
+further = "Weiteres"
+channels_networks = "Kanäle und Netzwerke"
+licensed_under = "Lizensiert unter"
+created_using = "Erstellt mit"
+and = "und"
+or = "oder"
+this_page_can = "Diese Seite kann"
+edited_on_edugit = "auf EduGit editiert werden"
+improvement_suggestion = "eine Verbesserung vorgeschlagen werden"
+upcoming_events = "Nächste Veranstaltungen"
+projects = "Projekte"
+our_projects = "Unsere Projekte"
+information_for = "Informationen für …"
+teckids_community = "Teckids-Gemeinschaft"
+page_missing = "Diese Seite fehlt leider noch"
+page_missing_explanation = "Da der Aufbau unserer neuen Website sehr aufwändig ist, sind die Informationen auf dieser Seite leider noch nicht vollständig."
+event_cost_explanation = """Uns ist wichtig, dass alle Interessierten an unserer Freizeit teilnehmen können.
+Uns ist bewusst, dass die Kosten für viele Familien sehr hoch sind, ganz egal
+aus welchen Gründen. Sollte der Betrag zu hoch sein, schickt uns bitte einfach
+eine E-Mail mit eurem Wunschbetrag. Die Gründe dafür müsst ihr nicht nennen."""
+event_fully_booked = "Die Veranstaltung ist ausgebucht. Für weitere Anmeldungen oder Plätze auf der Warteliste können uns Interessierte per E-Mail kontaktieren."
+event_info_registration = "Alle Infos und Anmeldung"
+write_email = "E-Mail schreiben"
+call_us = "Anrufen"
+wiki = "Wiki"
+wiki_subtitle = "Informationen und Handreichungen im Teckids-Wiki"
+forum = "Forum"
+forum_subtitle = "Fragen und Diskussion im Teckids-Forum"
+chat = "Chat"
+chat_subtitle = "Darüber reden im Chat"
+help_platforms = "Informationen und Hilfe zu unseren Plattformen"
diff --git a/content/_index.en.md b/content/_index.en.md
new file mode 100644
index 00000000..87c476cb
--- /dev/null
+++ b/content/_index.en.md
@@ -0,0 +1,4 @@
++++
+[extra]
+claims = []
++++
diff --git a/content/blog/_index.en.md b/content/blog/_index.en.md
new file mode 100644
index 00000000..ffd55c30
--- /dev/null
+++ b/content/blog/_index.en.md
@@ -0,0 +1,10 @@
++++
+title = "Teckids blog"
+
+template = "blog/overview.html"
+page_template = "blog/post.html"
+
+sort_by = "date"
+paginate_by = 15
+generate_feeds = true
++++
diff --git a/content/gemeinschaft/_index.en.md b/content/gemeinschaft/_index.en.md
new file mode 100644
index 00000000..ac36e062
--- /dev/null
+++ b/content/gemeinschaft/_index.en.md
@@ -0,0 +1,2 @@
++++
++++
diff --git a/content/projekte/_index.en.md b/content/projekte/_index.en.md
new file mode 100644
index 00000000..ac36e062
--- /dev/null
+++ b/content/projekte/_index.en.md
@@ -0,0 +1,2 @@
++++
++++
diff --git a/templates/404.html b/templates/404.html
index 5e5f90f7..3766236c 100644
--- a/templates/404.html
+++ b/templates/404.html
@@ -5,11 +5,11 @@
     <div class="container">
       <div class="message is-danger">
         <div class="message-header">
-          <p>Seite nicht gefunden (404)</p>
-          <a class="button delete" href="{{ get_url(path="@/_index.md") }}"></a>
+          <p>{{ trans(key="not_found_header", lang=lang) }}</p>
+          <a class="button delete" href="{{ get_url(path="@/_index.md", lang=lang) }}"></a>
         </div>
         <div class="message-body">
-          Die gesuchte Seite wurde leider nicht gefunden.
+          {{ trans(key="not_found_body", lang=lang) }}
         </div>
       </div>
     </div>
diff --git a/templates/base.html b/templates/base.html
index bb9257eb..074054bc 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -12,7 +12,7 @@
 
         {% block meta %}
             <meta name="description" content="{{ thing.description | default(value=config.description) }}" />
-            <link rel="alternate" type="application/atom+xml" href="{{ get_url(path="atom.xml", trailing_slash=false) }}" />
+            <link rel="alternate" type="application/atom+xml" href="{{ get_url(path="atom.xml", trailing_slash=false, lang=lang) }}" />
         {% endblock %}
 
         {% block meta_extra %}{% endblock %}
@@ -25,7 +25,7 @@
                 <meta property="og:type" content="{% block og_type %}{{ thing.extra.og.type | default(value='article') }}{% endblock og_type %}" />
                 <meta property="og:url" content="{% block og_url %}{{ thing.permalink | safe }}{% endblock og_url %}" />
                 {% if thing.extra.depiction %}
-                    <meta property="og:image" content="{{ get_url(path="@/" ~ thing.relative_path, trailing_slash=true) }}{{ thing.extra.depiction.image | safe }}" />              <meta property="og:image:alt" content="{{ thing.extra.depiction.alt }}" />
+                    <meta property="og:image" content="{{ get_url(path="@/" ~ thing.relative_path, trailing_slash=true, lang=lang) }}{{ thing.extra.depiction.image | safe }}" />              <meta property="og:image:alt" content="{{ thing.extra.depiction.alt }}" />
                 {% elif config.extra.og.image %}
                     <meta property="og:image" content="{{ get_url(path=config.extra.og.image.url) }}" />
                     <meta property="og:image:alt" content="{{ config.extra.og.image.alt }}" />
diff --git a/templates/blog/meta_line.html b/templates/blog/meta_line.html
index 09b900d5..052f2efc 100644
--- a/templates/blog/meta_line.html
+++ b/templates/blog/meta_line.html
@@ -1,5 +1,5 @@
 <p class="subtitle is-7 py-2">
-  <span title="Veröffentlicht am"><i class="fa-solid fa-calendar-days"></i> <time datetime="{{ post.date }}" property="schema:datePublished">{{ post.date }}</time></span> ·
-  <span title="Anzahl Wörter"><i class="fa-solid fa-ruler"></i> <span property="schema:wordCount">{{ post.word_count }} Wörter</span></span> ·
-  <span title="Lesezeit"><i class="fa-solid fa-hourglass-start"></i> {{ post.reading_time }} min</span>
+  <span title="{{ trans(key="published_on", lang=lang) }}"><i class="fa-solid fa-calendar-days"></i> <time datetime="{{ post.date }}" property="schema:datePublished">{{ post.date }}</time></span> ·
+  <span title="{{ trans(key="word_count", lang=lang) }}"><i class="fa-solid fa-ruler"></i> <span property="schema:wordCount">{{ post.word_count }} {{ trans(key="words", lang=lang) }}</span></span> ·
+  <span title="{{ trans(key="reading_time", lang=lang) }}"><i class="fa-solid fa-hourglass-start"></i> {{ post.reading_time }} {{ trans(key="minutes_short", lang=lang) }}</span>
 </p>
diff --git a/templates/blog/overview.html b/templates/blog/overview.html
index 9598470f..fc8ff63d 100644
--- a/templates/blog/overview.html
+++ b/templates/blog/overview.html
@@ -3,17 +3,17 @@
 {% block rdfa_type %}schema:Blog{% endblock %}
 
 {% block main %}
-  {% set title = "Teckids-Blog – Seite " ~ paginator.current_index ~ " von " ~ paginator.number_pagers %}
+  {% set title = trans(key="teckids_blog_page", lang=lang) ~ paginator.current_index ~ " " ~ trans(key="pages_of", lang=lang) ~ " " ~ paginator.number_pagers %}
   {% set posts = paginator.pages %}
   {% set count = paginator.paginate_by %}
   {% include "blog/section.html" %}
 
   {% if paginator.number_pagers > 1 %}
     <nav class="pagination is-centered section" role="navigation" aria-label="pagination">
-      <a href="{{ paginator.previous }}" class="pagination-previous">Vorherige</a>
-      <a href="{{ paginator.next }}" class="pagination-next">Nächste</a>
+      <a href="{{ paginator.previous }}" class="pagination-previous">{{ trans(key="previous_page", lang=lang) }}</a>
+      <a href="{{ paginator.next }}" class="pagination-next">{{ trans(key="next_page", lang=lang) }}</a>
       <ul class="pagination-list">
-        <li><a href="{{ paginator.first }}" class="pagination-link {% if paginator.current_index == 1 %}is-current{% endif %}" aria-label="Seite 1">1</a></li>
+        <li><a href="{{ paginator.first }}" class="pagination-link {% if paginator.current_index == 1 %}is-current{% endif %}" aria-label="{{ trans(key="page", lang=lang) }} 1">1</a></li>
         {% set range_start = paginator.current_index - 3 %}
         {% if range_start < 2 %}{% set range_start = 2 %}{% endif %}
         {% set range_end = paginator.current_index + 3 %}
@@ -22,12 +22,12 @@
           <li><span class="pagination-ellipsis">&hellip;</span></li>
         {% endif %}
         {% for pn in range(start=range_start, end=range_end + 1) %}
-          <li><a href="{{ paginator.base_url ~ pn ~ "/" }}" class="pagination-link {% if pn == paginator.current_index %}is-current{% endif %}" aria-label="Seite {{ pn }}">{{ pn }}</a></li>
+          <li><a href="{{ paginator.base_url ~ pn ~ "/" }}" class="pagination-link {% if pn == paginator.current_index %}is-current{% endif %}" aria-label="{{ trans(key="page", lang=lang) }}" {{ pn }}">{{ pn }}</a></li>
         {% endfor %}
         {% if range_end < paginator.number_pagers - 1 %}
           <li><span class="pagination-ellipsis">&hellip;</span></li>
         {% endif %}
-        <li><a href="{{ paginator.last }}" class="pagination-link {% if paginator.current_index == paginator.number_pagers %}is-current{% endif %}" aria-label="Seite {{ paginator.number_pagers }}">{{ paginator.number_pagers }}</a></li>
+	<li><a href="{{ paginator.last }}" class="pagination-link {% if paginator.current_index == paginator.number_pagers %}is-current{% endif %}" aria-label="{{ trans(key="page", lang=lang) }}" {{ paginator.number_pagers }}">{{ paginator.number_pagers }}</a></li>
       </ul>
     </nav>
   {% endif %}
diff --git a/templates/blog/post.html b/templates/blog/post.html
index 3d78ea53..6b08e72f 100644
--- a/templates/blog/post.html
+++ b/templates/blog/post.html
@@ -10,7 +10,7 @@
 {% endblock %}
 
 {% block content %}
-  {% set blog_section = get_section(path="blog/_index.md") %}
+  {% set blog_section = get_section(path="blog/_index.md", lang=lang) %}
   {% set post = page -%}
   <div class="columns mt-4">
     <meta property="schema:isPartOf" href="{{ blog_section.permalink }}" />
@@ -45,10 +45,10 @@
         </div>
       </div>
       <nav class="panel is-light mt-6">
-        <p class="panel-heading">Weitere Posts dazu</p>
+        <p class="panel-heading">{{ trans(key="further_related_posts", lang=lang) }}</p>
         {% for kind, terms in page.taxonomies %}
           {% for term in terms %}
-            {% set taxonomy = get_taxonomy_term(kind=kind, term=term) %}
+            {% set taxonomy = get_taxonomy_term(kind=kind, term=term, lang=lang) %}
             {% set posts = taxonomy.pages | filter(attribute="date") %}
             {% if posts %}
               <p class="panel-block subtitle is-7">{{ kind | title }}: {{ term }}</p>
diff --git a/templates/blog/section.html b/templates/blog/section.html
index 0342704c..5b81a761 100644
--- a/templates/blog/section.html
+++ b/templates/blog/section.html
@@ -1,11 +1,11 @@
-{% set main_blog_section = get_section(path="blog/_index.md") %}
+{% set main_blog_section = get_section(path="blog/_index.md", lang=lang) %}
 {% if not posts is defined %}
   {% set posts = main_blog_section.pages %}
 {% endif %}
 <section class="section" resource="{{ main_blog_section.permalink }}" typeof="schema:Blog">
   <meta property="schema:publisher" href="https://teckids.org/" />
   <div class="container">
-    <h2 class="title is-2">{{ title | default(value="Aus dem Teckids-Blog") }}</h2>
+    <h2 class="title is-2">{{ title | default(value=trans(key="teckids_blog_posts", lang=lang)) }}</h2>
     <div class="columns is-multiline is-same-height mt-4">
       {% for post in posts | slice(end=count|default(value=6)) %}
         <div class="column is-one-third">
diff --git a/templates/footer.html b/templates/footer.html
index 78d3fd8a..4accca90 100644
--- a/templates/footer.html
+++ b/templates/footer.html
@@ -11,12 +11,12 @@
       <span property="schema:addressLocality">{{config.extra.footer.address.city|safe}}</span>
     </address>
     <aside class="mt-5">
-      <p class="title is-6">Spendenkonto</p>
+      <p class="title is-6">{{ trans(key="donation_account", lang=lang) }}</p>
       <p>{{config.extra.footer.bank|safe}}</p>
     </aside>
   </div>
   <div class="column is-half">
-    <p class="title is-5">Unterstützer und Partner*innen</p>
+    <p class="title is-5">{{ trans(key="supporters_partners", lang=lang) }}</p>
     <div class="columns is-centered is-vcentered is-multiline">
       {% for sponsor in config.extra.footer.sponsor %}
         <div class="column is-one-quarter" property="schema:sponsor" typeof="schema:Organization">
@@ -31,7 +31,7 @@
     </div>
   </div>
   <div class="column is-onw-fourth">
-    <p class="title is-5">Weiteres</p>
+    <p class="title is-5">{{ trans(key="further", lang=lang) }}</p>
     <aside class="menu">
       {% for menu in config.extra.footer.menu %}
         <p class="menu-label">{{menu.label}}</p>
@@ -42,7 +42,7 @@
         </ul>
       {% endfor %}
     </aside>
-    <p class="title is-5 mt-5">Kanäle und Netzwerke</p>
+    <p class="title is-5 mt-5">{{ trans(key="channels_networks", lang=lang) }}</p>
     <aside class="columns is-centered is-vcentered is-multiline is-mobile">
       {% for social in config.extra.footer.social %}
         <div class="column is-one-third">
@@ -55,7 +55,7 @@
   </div>
 </div>
 <aside class="section has-text-centered is-size-7">
-  © {{ config.author }} · Lizenziert unter <a property="schema:license" href="{{ config.extra.footer.license.url }}">{{ config.extra.footer.license.name }}</a><br/>
-  Erstellt mit <a href="https://www.getzola.org/">Zola</a> und <a href="https://bulma.io/">Bulma</a><br/>
-  {% if thing.path %}Diese Seite kann <a href="{{ config.extra.repo.web.tree }}/{{ thing.relative_path }}">auf EduGit editiert werden</a> oder <a href="{{ config.extra.repo.web.issues }}">eine Verbesserung vorgeschlagen werden</a>.<br/>{% endif %}
+  © {{ config.author }} · {{ trans(key="licensed_under", lang=lang) }} <a property="schema:license" href="{{ config.extra.footer.license.url }}">{{ config.extra.footer.license.name }}</a><br/>
+  {{ trans(key="created_using", lang=lang) }} <a href="https://www.getzola.org/">Zola</a> {{ trans(key="and", lang=lang) }} <a href="https://bulma.io/">Bulma</a><br/>
+  {% if thing.path %}{{ trans(key="this_page_can", lang=lang) }} <a href="{{ config.extra.repo.web.tree }}/{{ thing.relative_path }}">{{ trans(key="edited_on_edugit", lang=lang) }}</a> {{ trans(key="or", lang=lang) }} <a href="{{ config.extra.repo.web.issues }}">{{ trans(key="improvement_suggestion", lang=lang) }}</a>.<br/>{% endif %}
 </aside>
diff --git a/templates/frontpage/blog.html b/templates/frontpage/blog.html
index 5eec3901..a870a54f 100644
--- a/templates/frontpage/blog.html
+++ b/templates/frontpage/blog.html
@@ -1,10 +1,10 @@
-{% set blog_section = get_section(path="blog/_index.md") %}
+{% set blog_section = get_section(path="blog/_index.md", lang=lang) %}
 {% set count = 3 %}
 {% include "blog/section.html" %}
 <nav class="section pt-0">
   <div class="container">
-    <a href="{{ get_url(path="@/blog/_index.md") }}" class="button is-large is-fullwidth is-link is-rounded">
-      Mehr aus dem Teckids-Blog
+    <a href="{{ get_url(path="@/blog/_index.md", lang=lang) }}" class="button is-large is-fullwidth is-link is-rounded">
+      {{ trans(key="more_teckids_blog_posts", lang=lang) }}
     </a>
   </div>
 </nav>
diff --git a/templates/frontpage/claim.html b/templates/frontpage/claim.html
index 8969298c..2854f1ea 100644
--- a/templates/frontpage/claim.html
+++ b/templates/frontpage/claim.html
@@ -23,7 +23,7 @@
               </div>
               <footer class="card-footer">
                 {% for link in claim.links %}
-                  <a href="{{ get_url(path=link.url) }}" class="card-footer-item">
+                  <a href="{{ get_url(path=link.url, lang=lang) }}" class="card-footer-item">
                     <span class="icon-text">
                       <span>{{ link.title }}</span>
                       <span class="icon"><i class="fa-solid fa-arrow-right"></i></span>
diff --git a/templates/frontpage/events.html b/templates/frontpage/events.html
index cb4f7207..cec012d9 100644
--- a/templates/frontpage/events.html
+++ b/templates/frontpage/events.html
@@ -1,4 +1,4 @@
 {# FIXME generate dynamically #}
-{% set title = "Nächste Veranstaltungen" %}
+{% set title = trans(key="upcoming_events", lang=lang) %}
 {% set slug = "hacknsun-2025-bn" %}
 {% include "shortcodes/event_section.html" %}
diff --git a/templates/frontpage/projects.html b/templates/frontpage/projects.html
index 50ac2f20..f6150a06 100644
--- a/templates/frontpage/projects.html
+++ b/templates/frontpage/projects.html
@@ -1,11 +1,11 @@
-{% set projects_section = get_section(path="projekte/_index.md") %}
+{% set projects_section = get_section(path="projekte/_index.md", lang=lang) %}
 
 <section class="section" resource="https://teckids.org/">
   <div class="container">
-    <h2 class="title is-2">Unsere Projekte</h2>
+    <h2 class="title is-2">{{ trans(key="our_projects", lang=lang) }}</h2>
     <div class="columns is-same-height mt-4">
       {% for project_section_path in projects_section.subsections %}
-        {% set project_section = get_section(path=project_section_path) %}
+        {% set project_section = get_section(path=project_section_path, lang=lang) %}
         <div class="column is-one-third" property="schema:brand" resource="{{ project_section.permalink }}" typeof="schema:Brand">
           <div class="card is-shadowless">
             <div class="card-image">
diff --git a/templates/menu.html b/templates/menu.html
index f93974c8..a17816ab 100644
--- a/templates/menu.html
+++ b/templates/menu.html
@@ -1,7 +1,7 @@
 <nav class="navbar is-fixed-top is-boxed" role="navigation" aria-label="main navigation" id="main-navbar">
     <input type="checkbox" id="burger-toggle" role="button" class="navbar-toggle" aria-label="menu" aria-expanded="false" data-target="main-menu" />
     <div class="navbar-brand">
-        <a href="{{ get_url(path="@/_index.md") }}" class="navbar-item">
+        <a href="{{ get_url(path="@/_index.md", lang=lang) }}" class="navbar-item">
             <figure class="image" id="navbar-logo">
                 <img src="{{ get_url(path="artwork/logo-teckids-orange.svg") }}" alt="Logo Teckids" />
             </figure>
@@ -18,28 +18,28 @@
     <div class="navbar-menu" id="main-menu">
         <div class="navbar-start">
             <div class="navbar-item has-dropdown is-hoverable is-mega">
-                <a href="#" class="navbar-item">Projekte</a>
+                <a href="#" class="navbar-item">{{ trans(key="projects", lang=lang) }}</a>
                 <div class="navbar-dropdown is-boxed">
                     {% include "menu/projects.html" %}
                 </div>
             </div>
 
             <div class="navbar-item has-dropdown is-hoverable is-mega">
-                <a href="#" class="navbar-item">Informationen für…</a>
+                <a href="#" class="navbar-item">{{ trans(key="information_for", lang=lang) }}</a>
                 <div class="navbar-dropdown is-boxed">
                     {% include "menu/infos.html" %}
                 </div>
             </div>
 
             <div class="navbar-item has-dropdown is-hoverable">
-                <a href="#" class="navbar-item">Teckids-Gemeinschaft</a>
+                <a href="#" class="navbar-item">{{ trans(key="teckids_community", lang=lang) }}</a>
                 <div class="navbar-dropdown is-boxed">
                     {% include "menu/gemeinschaft.html" %}
                 </div>
             </div>
 
             {% for item in config.extra.main_menu_item %}
-                <a href="{{ get_url(path=item.path) }}" class="navbar-item is-hoverable">{{ item.title }}</a>
+                <a href="{{ get_url(path=item.path, lang=lang) }}" class="navbar-item is-hoverable">{{ item.title }}</a>
             {% endfor %}
         </div>
     </div>
diff --git a/templates/menu/gemeinschaft.html b/templates/menu/gemeinschaft.html
index 0ccbabfd..9dc0e540 100644
--- a/templates/menu/gemeinschaft.html
+++ b/templates/menu/gemeinschaft.html
@@ -1,9 +1,9 @@
-{% set gemeinschaft_section = get_section(path="gemeinschaft/_index.md") %}
+{% set gemeinschaft_section = get_section(path="gemeinschaft/_index.md", lang=lang) %}
 
 <div class="container is-fluid">
   <div class="columns">
     {% for gemeinschaft_section_path in gemeinschaft_section.subsections %}
-      {% set gemeinschaft_subsection = get_section(path=gemeinschaft_section_path) %}
+      {% set gemeinschaft_subsection = get_section(path=gemeinschaft_section_path, lang=lang) %}
       <section class="column">
         <div class="card p-0 m-0 is-shadowless is-radiusless is-overlay is-flex is-flex-direction-column is-fullheight is-justify-content-space-between">
           <div class="card-content p-0 m-0">
diff --git a/templates/menu/infos.html b/templates/menu/infos.html
index 0e634d38..c85f01af 100644
--- a/templates/menu/infos.html
+++ b/templates/menu/infos.html
@@ -1,4 +1,4 @@
-{% set zielgruppen = get_taxonomy(kind = "zielgruppe") %}
+{% set zielgruppen = get_taxonomy(kind = "zielgruppe", lang=lang) %}
 
 <div class="container is-fluid">
   <div class="columns">
diff --git a/templates/menu/projects.html b/templates/menu/projects.html
index dbd5d91b..8175e8d2 100644
--- a/templates/menu/projects.html
+++ b/templates/menu/projects.html
@@ -1,9 +1,9 @@
-{% set projects_section = get_section(path="projekte/_index.md") %}
+{% set projects_section = get_section(path="projekte/_index.md", lang=lang) %}
 
 <div class="container is-fluid">
   <div class="columns">
     {% for project_section_path in projects_section.subsections %}
-      {% set project_section = get_section(path=project_section_path) %}
+      {% set project_section = get_section(path=project_section_path, lang=lang) %}
       <section class="column menu-project-section" id="menu-project-section-{{ project_section.components[1] }}">
         <div class="card p-0 m-0 is-shadowless is-radiusless is-overlay is-flex is-flex-direction-column is-fullheight is-justify-content-space-between">
           <div class="card-content p-0 m-0">
diff --git a/templates/pages/content.html b/templates/pages/content.html
index 19059e6e..372b52a3 100644
--- a/templates/pages/content.html
+++ b/templates/pages/content.html
@@ -10,19 +10,19 @@
             {{ page.content | safe }}
           </div>
         {% else %}
-          {% set title = "Diese Seite fehlt leider noch" -%}
-          {% set body = "Da der Aufbau unserer neuen Website sehr aufwendig ist, sind die Informationen auf dieser Seite leider noch nicht vollständig." -%}
+          {% set title = trans(key="page_missing", lang=lang) -%}
+          {% set body = trans(key="page_missing_explanation", lang=lang) -%}
           {% include "shortcodes/message.html" %}
         {% endif %}
       {% endblock content %}
     </div>
   </section>
-  {% set blog_taxonomy = get_taxonomy_term(kind="aspekt", term=page.title, include_pages=true, required=false) %}
+  {% set blog_taxonomy = get_taxonomy_term(kind="aspekt", term=page.title, include_pages=true, required=false, lang=lang) %}
   {% if blog_taxonomy and blog_taxonomy.pages %}
     {% set posts = blog_taxonomy.pages | filter(attribute="date") %}
     {% if posts %}
       <aside>
-        {% set title="Verwandte Posts aus dem Teckids-Blog" %}
+        {% set title=trans(key="related_blog_posts", lang=lang) %}
         {% include "blog/section.html" %}
       </aside>
     {% endif %}
diff --git a/templates/shortcodes/button.html b/templates/shortcodes/button.html
index 5af33cb4..55ad650e 100644
--- a/templates/shortcodes/button.html
+++ b/templates/shortcodes/button.html
@@ -1,5 +1,5 @@
 {% if url is starting_with("@/") -%}
-  {% set url = get_url(path=url) -%}
+  {% set url = get_url(path=url, lang=lang) -%}
 {% endif %}
 <a class="button {{ class | default(value="") }}" href="{{ url }}">
   {{ body }}
diff --git a/templates/shortcodes/further.html b/templates/shortcodes/further.html
index 7f8b0ace..5c9a92e5 100644
--- a/templates/shortcodes/further.html
+++ b/templates/shortcodes/further.html
@@ -5,7 +5,7 @@
       {% if further.link is matching("^[^:/]+://") -%}
         {% set link = further.link -%}
       {% else -%}
-        {% set link = get_url(path=further.link) -%}
+        {% set link = get_url(path=further.link, lang=lang) -%}
       {% endif -%}
       <div class="column is-one-third">
         <div class="card">
diff --git a/templates/shortcodes/hero_section.html b/templates/shortcodes/hero_section.html
index 2da93b04..f5008c84 100644
--- a/templates/shortcodes/hero_section.html
+++ b/templates/shortcodes/hero_section.html
@@ -9,7 +9,7 @@
         <h1 class="title is-1 mb-5">
           {% if page.extra.title.image -%}
             <figure>
-              <img src="{{ get_url(path=page.extra.title.image) }}" alt="{{ title | default(value=page.title) | safe }}" />
+              <img src="{{ get_url(path=page.extra.title.image, lang=lang) }}" alt="{{ title | default(value=page.title) | safe }}" />
             </figure>
           {% else -%}
             {{ title | default(value=page.title) | safe }}
diff --git a/templates/shortcodes/message.html b/templates/shortcodes/message.html
index d0153fdc..2bce8b2f 100644
--- a/templates/shortcodes/message.html
+++ b/templates/shortcodes/message.html
@@ -1,7 +1,7 @@
 <div class="message is-{{ color | default(value="info") }}">
   <div class="message-header">
     <p>{{ title }}</p>
-    <a class="button delete" href="{{ get_url(path="@/_index.md") }}"></a>
+    <a class="button delete" href="{{ get_url(path="@/_index.md", lang=lang) }}"></a>
   </div>
   <div class="message-body">
     {{ body }}
diff --git a/templates/shortcodes/teckids_contact.html b/templates/shortcodes/teckids_contact.html
index 482730dd..2cc6e44e 100644
--- a/templates/shortcodes/teckids_contact.html
+++ b/templates/shortcodes/teckids_contact.html
@@ -9,13 +9,13 @@
         <a class="button is-primary is-fullwidth" href="mailto:{{ mail|default(value="verein@teckids.org") }}">
           <div class="icon-text">
             <span class="icon"><i class="fa-solid fa-envelope-open-text"></i></span>
-            <span>E-Mail schreiben</span>
+            <span>{{ trans(key="write_email", lang=lang) }}</span>
           </div>
         </a>
         <a class="button is-link is-fullwidth" href="tel:{{ phone|default(value="+4922892934160") }}">
           <div class="icon-text">
             <span class="icon"><i class="fa-solid fa-phone"></i></span>
-            <span>Anrufen</span>
+            <span>{{ trans(key="call_us", lang=lang) }}</span>
           </div>
         </a>
       </div>
diff --git a/templates/shortcodes/teckids_event.html b/templates/shortcodes/teckids_event.html
index c388f437..3a8e22ff 100644
--- a/templates/shortcodes/teckids_event.html
+++ b/templates/shortcodes/teckids_event.html
@@ -30,18 +30,14 @@
           </div>
           <div class="message is-success">
             <div class="message-body">
-              Uns ist wichtig, dass alle Interessierten an unserer Freizeit teilnehmen können.
-              Uns ist bewusst, dass die Kosten für viele Familien sehr hoch sind, ganz egal
-              aus welchen Gründen. Sollte der Betrag zu hoch sein, schickt uns bitte einfach
-              eine E-Mail mit eurem Wunschbetrag. Die Gründe dafür müsst ihr nicht nennen.
+              {{ trans(key="event_cost_explanation", lang=lang) }}
             </div>
           </div>
           {% if event.fully_booked %}
             <meta property="remainingAttendeeCapacity" content="0"/>
             <div class="message is-danger">
               <div class="message-body">
-                Die Veranstaltung ist ausgebucht. Für weitere Anmeldungen oder Plätze auf der
-                Warteliste können uns Interessierte per E-Mail kontaktieren.
+                {{ trans(key="event_fully_booked", lang=lang) }}
               </div>
             </div>
           {% endif %}
@@ -56,17 +52,17 @@
             <a class="button is-primary is-fullwidth is-justify-content-start"
                href="https://ticdesk.teckids.org/app/paweljong/event/{{ slug }}">
               <span class="icon"><i class="fa-regular fa-paper-plane"></i></span>
-              <span>Alle Infos und Anmeldung</span>
+              <span>{{ trans(key="event_info_registration", lang=lang) }}</span>
             </a>
             <a class="button is-link is-fullwidth is-justify-content-start" href="mailto:{{ mail|default(value="
                verein@teckids.org") }}">
               <span class="icon"><i class="fa-regular fa-envelope-open-text"></i></span>
-              <span>E-Mail schreiben</span>
+              <span>{{ trans(key="write_email", lang=lang) }}</span>
             </a>
             <a class="button is-link is-fullwidth is-justify-content-start mb-0" href="tel:{{ phone|default(value="
                +4922892934160") }}">
               <span class="icon"><i class="fa-regular fa-phone"></i></span>
-              <span>Anrufen</span>
+              <span>{{ trans(key="call_us", lang=lang) }}</span>
             </a>
           </div>
         </div>
diff --git a/templates/shortcodes/teckids_related.html b/templates/shortcodes/teckids_related.html
index 1691c820..e42183ae 100644
--- a/templates/shortcodes/teckids_related.html
+++ b/templates/shortcodes/teckids_related.html
@@ -14,8 +14,8 @@
           </div>
           <div class="media-content">
             <a href="https://wiki.teckids.org/{{page.extra.platforms.wiki}}">
-              <p class="title is-4">Wiki</p>
-              <p class="subtitle is-6">Informationen und Handreichungen im Teckids-Wiki</p>
+              <p class="title is-4">{{ trans(key="wiki", lang=lang) }}</p>
+              <p class="subtitle is-6">{{ trans(key="wiki", lang=lang) }}</p>
             </a>
           </div>
         </div>
@@ -29,8 +29,8 @@
           </div>
           <div class="media-content">
             <a href="https://forum.teckids.org/c/{{page.extra.platforms.forum}}">
-              <p class="title is-4">Forum</p>
-              <p class="subtitle is-6">Fragen und Diskussion im Teckids-Forum</p>
+              <p class="title is-4">{{ trans(key="wiki", lang=lang) }}</p>
+              <p class="subtitle is-6">{{ trans(key="wiki", lang=lang) }}</p>
             </a>
           </div>
         </div>
@@ -44,8 +44,8 @@
           </div>
           <div class="media-content">
             <a href="https://matrix.to/#/{{page.extra.platforms.chat}}">
-              <p class="title is-4">Chat</p>
-              <p class="subtitle is-6">Darüber reden im Chat</p>
+              <p class="title is-4">{{ trans(key="wiki", lang=lang) }}</p>
+              <p class="subtitle is-6">{{ trans(key="wiki", lang=lang) }}</p>
             </a>
           </div>
         </div>
@@ -58,8 +58,8 @@
         </div>
         <div class="media-content">
           <p class="is-subtitle is-6">
-            <a href="{{ get_url(path="@/gemeinschaft/offene-gemeinschaft/plattformen.md") }}">
-              Informationen und Hilfe zu unseren Plattformen
+            <a href="{{ get_url(path="@/gemeinschaft/offene-gemeinschaft/plattformen.md", lang=lang) }}">
+              {{ trans(key="help_platforms", lang=lang) }}
             </a>
           </p>
         </div>
-- 
GitLab