Changeset 91c0a39 in Klonkt


Ignore:
Timestamp:
06/20/2026 01:50:48 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
66cfbaa
Parents:
03fa548
Message:

feat(i18n phase 2): admin dashboard + public calendar/downloads translated + language switcher in admin

  • Language switcher (select) also in the admin dashboard → choice for god/admin.
  • Translated: admin dashboard (title, tagline, all shortcuts, statistics, sections, table headers, post row), public calendar (shows) + downloads (incl. fix: loop var 't' shadowed the translate t() → label fetched upfront).
  • Dictionary extended (nl/en/de). Remaining admin sub-pages to follow.

Co-Authored-By: Claude <noreply@…>

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/services/i18n.js

    r03fa548 r91c0a39  
    3838    'footer.install': 'Installeer app',
    3939    'common.email_placeholder': 'jouw@email.nl',
     40    'common.back_to_admin': '← Beheer',
     41    // Agenda (publiek)
     42    'agenda.title': 'Agenda',
     43    'agenda.empty': 'Geen aangekondigde evenementen op dit moment.',
     44    'agenda.tickets': 'Tickets',
     45    'agenda.notify_h': 'Mis geen evenement',
     46    'agenda.notify_sub': 'Laat je e-mail achter en je krijgt een seintje bij een nieuw evenement. Uitschrijven kan altijd.',
     47    'agenda.notify_btn': 'Houd me op de hoogte',
     48    'agenda.msg_done': '✓ Je staat op de lijst — je hoort het zodra er een evenement wordt aangekondigd.',
     49    'agenda.msg_check': '✉ Check je mail om je aanmelding te bevestigen.',
     50    // Downloads (publiek)
     51    'downloads.title': 'Downloads',
     52    'downloads.sub': 'Gratis te downloaden — laat je e-mailadres achter en je krijgt het bestand.',
     53    'downloads.empty': 'Er staan momenteel geen downloads klaar.',
     54    'downloads.btn': '⬇ Download',
     55    // Beheer-dashboard
     56    'admin.title': 'Beheer',
     57    'admin.tagline_solo': 'Solo-modus — jouw site.',
     58    'admin.tagline_hub': 'Hub-modus — bedrijfssite met gebruikers, elk hun eigen Klonkt Hub.',
     59    'admin.b_sites': '🌐 Sites', 'admin.b_users': '👥 Gebruikers', 'admin.b_audio': '🎵 Audio',
     60    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Reacties', 'admin.b_seo': '🔎 SEO',
     61    'admin.b_settings': '⚙️ Instellingen', 'admin.b_newpost': '✍️ Nieuwe post', 'admin.b_look': '🎨 Uiterlijk',
     62    'admin.b_makesite': '🎨 Maak je site aan', 'admin.b_circle': '🔗 Cirkel', 'admin.b_stats': '📊 Statistieken',
     63    'admin.b_newsletter': '✉️ Nieuwsbrief', 'admin.b_perskit': '📰 Perskit', 'admin.b_downloads': '⬇ Downloads',
     64    'admin.b_linkbio': '🔗 Link-in-bio', 'admin.b_agenda': '📅 Agenda', 'admin.b_google': '🔑 Google',
     65    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Handleiding',
     66    'admin.st_users': 'Gebruikers', 'admin.st_sites': 'Sites', 'admin.st_posts': 'Posts', 'admin.st_published': 'Gepubliceerd',
     67    'admin.sec_posts': 'Posts', 'admin.sec_sites': 'Sites', 'admin.sec_users': 'Users',
     68    'admin.draft': 'Concept', 'admin.edit': 'Bewerken', 'admin.view': 'Bekijk',
     69    'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigenaar', 'admin.th_created': 'Aangemaakt',
     70    'admin.th_username': 'Gebruikersnaam', 'admin.th_email': 'E-mail', 'admin.th_role': 'Rol', 'admin.th_joined': 'Lid sinds',
    4071  },
    4172  en: {
     
    6798    'footer.install': 'Install app',
    6899    'common.email_placeholder': 'you@email.com',
     100    'common.back_to_admin': '← Admin',
     101    'agenda.title': 'Agenda',
     102    'agenda.empty': 'No announced events at the moment.',
     103    'agenda.tickets': 'Tickets',
     104    'agenda.notify_h': 'Never miss an event',
     105    'agenda.notify_sub': 'Leave your email and we’ll let you know about new events. Unsubscribe any time.',
     106    'agenda.notify_btn': 'Keep me posted',
     107    'agenda.msg_done': '✓ You’re on the list — we’ll let you know when an event is announced.',
     108    'agenda.msg_check': '✉ Check your email to confirm your sign-up.',
     109    'downloads.title': 'Downloads',
     110    'downloads.sub': 'Free to download — leave your email and you’ll get the file.',
     111    'downloads.empty': 'No downloads available right now.',
     112    'downloads.btn': '⬇ Download',
     113    'admin.title': 'Admin',
     114    'admin.tagline_solo': 'Solo mode — your site.',
     115    'admin.tagline_hub': 'Hub mode — a company site with users, each their own Klonkt Hub.',
     116    'admin.b_sites': '🌐 Sites', 'admin.b_users': '👥 Users', 'admin.b_audio': '🎵 Audio',
     117    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Comments', 'admin.b_seo': '🔎 SEO',
     118    'admin.b_settings': '⚙️ Settings', 'admin.b_newpost': '✍️ New post', 'admin.b_look': '🎨 Appearance',
     119    'admin.b_makesite': '🎨 Create your site', 'admin.b_circle': '🔗 Circle', 'admin.b_stats': '📊 Statistics',
     120    'admin.b_newsletter': '✉️ Newsletter', 'admin.b_perskit': '📰 Press kit', 'admin.b_downloads': '⬇ Downloads',
     121    'admin.b_linkbio': '🔗 Link-in-bio', 'admin.b_agenda': '📅 Agenda', 'admin.b_google': '🔑 Google',
     122    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Manual',
     123    'admin.st_users': 'Users', 'admin.st_sites': 'Sites', 'admin.st_posts': 'Posts', 'admin.st_published': 'Published',
     124    'admin.sec_posts': 'Posts', 'admin.sec_sites': 'Sites', 'admin.sec_users': 'Users',
     125    'admin.draft': 'Draft', 'admin.edit': 'Edit', 'admin.view': 'View',
     126    'admin.th_slug': 'Slug', 'admin.th_title': 'Title', 'admin.th_owner': 'Owner', 'admin.th_created': 'Created',
     127    'admin.th_username': 'Username', 'admin.th_email': 'Email', 'admin.th_role': 'Role', 'admin.th_joined': 'Joined',
    69128  },
    70129  de: {
     
    96155    'footer.install': 'App installieren',
    97156    'common.email_placeholder': 'du@email.de',
     157    'common.back_to_admin': '← Verwaltung',
     158    'agenda.title': 'Termine',
     159    'agenda.empty': 'Zurzeit keine angekündigten Termine.',
     160    'agenda.tickets': 'Tickets',
     161    'agenda.notify_h': 'Keinen Termin verpassen',
     162    'agenda.notify_sub': 'Hinterlasse deine E-Mail und wir melden uns bei neuen Terminen. Abmelden jederzeit möglich.',
     163    'agenda.notify_btn': 'Halt mich auf dem Laufenden',
     164    'agenda.msg_done': '✓ Du stehst auf der Liste — wir melden uns, sobald ein Termin angekündigt wird.',
     165    'agenda.msg_check': '✉ Prüfe deine E-Mail, um die Anmeldung zu bestätigen.',
     166    'downloads.title': 'Downloads',
     167    'downloads.sub': 'Kostenlos herunterladen — hinterlasse deine E-Mail und du bekommst die Datei.',
     168    'downloads.empty': 'Momentan keine Downloads verfügbar.',
     169    'downloads.btn': '⬇ Herunterladen',
     170    'admin.title': 'Verwaltung',
     171    'admin.tagline_solo': 'Solo-Modus — deine Seite.',
     172    'admin.tagline_hub': 'Hub-Modus — eine Firmenseite mit Nutzern, je ein eigener Klonkt Hub.',
     173    'admin.b_sites': '🌐 Seiten', 'admin.b_users': '👥 Nutzer', 'admin.b_audio': '🎵 Audio',
     174    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Kommentare', 'admin.b_seo': '🔎 SEO',
     175    'admin.b_settings': '⚙️ Einstellungen', 'admin.b_newpost': '✍️ Neuer Beitrag', 'admin.b_look': '🎨 Aussehen',
     176    'admin.b_makesite': '🎨 Seite erstellen', 'admin.b_circle': '🔗 Kreis', 'admin.b_stats': '📊 Statistik',
     177    'admin.b_newsletter': '✉️ Newsletter', 'admin.b_perskit': '📰 Pressekit', 'admin.b_downloads': '⬇ Downloads',
     178    'admin.b_linkbio': '🔗 Link-in-Bio', 'admin.b_agenda': '📅 Termine', 'admin.b_google': '🔑 Google',
     179    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Anleitung',
     180    'admin.st_users': 'Nutzer', 'admin.st_sites': 'Seiten', 'admin.st_posts': 'Beiträge', 'admin.st_published': 'Veröffentlicht',
     181    'admin.sec_posts': 'Beiträge', 'admin.sec_sites': 'Seiten', 'admin.sec_users': 'Nutzer',
     182    'admin.draft': 'Entwurf', 'admin.edit': 'Bearbeiten', 'admin.view': 'Ansehen',
     183    'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigentümer', 'admin.th_created': 'Erstellt',
     184    'admin.th_username': 'Benutzername', 'admin.th_email': 'E-Mail', 'admin.th_role': 'Rolle', 'admin.th_joined': 'Mitglied seit',
    98185  },
    99186};
  • src/views/pages/admin.ejs

    r03fa548 r91c0a39  
    11<div class="container admin-page">
    2   <h1>Beheer</h1>
     2  <% if (typeof langs !== 'undefined' && langs && langs.length > 1) { %>
     3    <select class="footer-lang" style="float:right;margin-left:1rem" aria-label="<%= t('nav.language') %>"
     4            onchange="location.href='/lang/'+this.value+'?r='+encodeURIComponent(location.pathname+location.search)">
     5      <% langs.forEach(function(l){ %><option value="<%= l.code %>"<%= l.active ? ' selected' : '' %>><%= l.name %></option><% }); %>
     6    </select>
     7  <% } %>
     8  <h1><%= t('admin.title') %></h1>
    39  <% if (tenancy === 'hub') { %>
    4     <p class="admin-tagline">Hub-modus — bedrijfssite met gebruikers, elk hun eigen Klonkt Hub.</p>
     10    <p class="admin-tagline"><%= t('admin.tagline_hub') %></p>
    511  <% } else { %>
    6     <p class="admin-tagline">Solo-modus — jouw site.</p>
     12    <p class="admin-tagline"><%= t('admin.tagline_solo') %></p>
    713  <% } %>
    814
    915  <nav class="admin-quick-links" aria-label="Beheer-snelkoppelingen">
    1016    <% if (tenancy === 'hub') { %>
    11       <a href="/admin/sites" class="btn">🌐 Sites</a>
    12       <a href="/admin/users" class="btn">👥 Gebruikers</a>
    13       <a href="/admin/audio" class="btn">🎵 Audio</a>
    14       <a href="/admin/playlists" class="btn">📃 Playlists</a>
    15       <a href="/admin/comments" class="btn">💬 Reacties</a>
    16       <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
    17       <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
     17      <a href="/admin/sites" class="btn"><%= t('admin.b_sites') %></a>
     18      <a href="/admin/users" class="btn"><%= t('admin.b_users') %></a>
     19      <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
     20      <a href="/admin/playlists" class="btn"><%= t('admin.b_playlists') %></a>
     21      <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
     22      <% if (primarySite) { %><a href="/admin/seo" class="btn"><%= t('admin.b_seo') %></a><% } %>
     23      <a href="/admin/settings" class="btn"><%= t('admin.b_settings') %></a>
    1824    <% } else { %>
    19       <a href="/posts/new" class="btn">✍️ Nieuwe post</a>
    20       <a href="/admin/audio" class="btn">🎵 Audio</a>
    21       <a href="/admin/comments" class="btn">💬 Reacties</a>
     25      <a href="/posts/new" class="btn"><%= t('admin.b_newpost') %></a>
     26      <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
     27      <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
    2228      <% if (primarySite) { %>
    23         <a href="/admin/sites/<%= primarySite.slug %>/edit" class="btn">🎨 Uiterlijk</a>
     29        <a href="/admin/sites/<%= primarySite.slug %>/edit" class="btn"><%= t('admin.b_look') %></a>
    2430      <% } else { %>
    25         <a href="/admin/sites/new" class="btn">🎨 Maak je site aan</a>
     31        <a href="/admin/sites/new" class="btn"><%= t('admin.b_makesite') %></a>
    2632      <% } %>
    2733      <% if (tenancy === 'circle') { %>
    28         <a href="/admin/circle" class="btn">🔗 Cirkel</a>
     34        <a href="/admin/circle" class="btn"><%= t('admin.b_circle') %></a>
    2935      <% } %>
    30       <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
    31       <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
     36      <% if (primarySite) { %><a href="/admin/seo" class="btn"><%= t('admin.b_seo') %></a><% } %>
     37      <a href="/admin/settings" class="btn"><%= t('admin.b_settings') %></a>
    3238    <% } %>
    3339    <% if (typeof premiumUnlocked === 'undefined' || premiumUnlocked) { %>
    34       <a href="/admin/stats" class="btn">📊 Statistieken</a>
    35       <a href="/admin/newsletter" class="btn">✉️ Nieuwsbrief</a>
    36       <% if (tenancy !== 'hub' && primarySite) { %><a href="/pers" class="btn" target="_blank">📰 Perskit</a><% } %>
    37       <% if (tenancy !== 'hub' && primarySite) { %><a href="/downloads" class="btn" target="_blank">⬇ Downloads</a><% } %>
    38       <% if (tenancy !== 'hub' && primarySite) { %><a href="/links" class="btn" target="_blank">🔗 Link-in-bio</a><% } %>
    39       <a href="/admin/shows" class="btn">📅 Agenda</a>
     40      <a href="/admin/stats" class="btn"><%= t('admin.b_stats') %></a>
     41      <a href="/admin/newsletter" class="btn"><%= t('admin.b_newsletter') %></a>
     42      <% if (tenancy !== 'hub' && primarySite) { %><a href="/pers" class="btn" target="_blank"><%= t('admin.b_perskit') %></a><% } %>
     43      <% if (tenancy !== 'hub' && primarySite) { %><a href="/downloads" class="btn" target="_blank"><%= t('admin.b_downloads') %></a><% } %>
     44      <% if (tenancy !== 'hub' && primarySite) { %><a href="/links" class="btn" target="_blank"><%= t('admin.b_linkbio') %></a><% } %>
     45      <a href="/admin/shows" class="btn"><%= t('admin.b_agenda') %></a>
    4046    <% } %>
    41     <a href="/admin/settings/google" class="btn">🔑 Google</a>
    42     <a href="/admin/updates" class="btn">🔄 Updates</a>
    43     <a href="/admin/handleiding" class="btn">📖 Handleiding</a>
     47    <a href="/admin/settings/google" class="btn"><%= t('admin.b_google') %></a>
     48    <a href="/admin/updates" class="btn"><%= t('admin.b_updates') %></a>
     49    <a href="/admin/handleiding" class="btn"><%= t('admin.b_help') %></a>
    4450  </nav>
    4551
    4652  <div class="admin-stats">
    4753    <% if (tenancy === 'hub') { %>
    48       <div class="stat-card"><div class="stat-num"><%= stats.users %></div><div class="stat-label">Gebruikers</div></div>
    49       <div class="stat-card"><div class="stat-num"><%= stats.sites %></div><div class="stat-label">Sites</div></div>
     54      <div class="stat-card"><div class="stat-num"><%= stats.users %></div><div class="stat-label"><%= t('admin.st_users') %></div></div>
     55      <div class="stat-card"><div class="stat-num"><%= stats.sites %></div><div class="stat-label"><%= t('admin.st_sites') %></div></div>
    5056    <% } %>
    51     <div class="stat-card"><div class="stat-num"><%= stats.posts %></div><div class="stat-label">Posts</div></div>
    52     <div class="stat-card"><div class="stat-num"><%= stats.published %></div><div class="stat-label">Gepubliceerd</div></div>
     57    <div class="stat-card"><div class="stat-num"><%= stats.posts %></div><div class="stat-label"><%= t('admin.st_posts') %></div></div>
     58    <div class="stat-card"><div class="stat-num"><%= stats.published %></div><div class="stat-label"><%= t('admin.st_published') %></div></div>
    5359  </div>
    5460
    5561  <% if (typeof posts !== 'undefined' && posts && posts.length) { %>
    5662    <% var _drafts = posts.filter(function(p){ return p.isDraft; }).length; %>
    57     <h2>Posts<% if (_drafts) { %> <span class="pl-draftcount"><%= _drafts %> concept<%= _drafts === 1 ? '' : 'en' %></span><% } %></h2>
     63    <h2><%= t('admin.sec_posts') %><% if (_drafts) { %> <span class="pl-draftcount"><%= _drafts %> <%= t('admin.draft').toLowerCase() %><%= _drafts === 1 ? '' : 's' %></span><% } %></h2>
    5864    <ul class="post-admin-list">
    5965      <% posts.forEach(function(p) { %>
    6066        <li class="pal-row<%= p.isDraft ? ' is-draft' : '' %>">
    6167          <a class="pal-title" href="<%= p.editUrl %>">
    62             <% if (p.isDraft) { %><span class="pal-badge">Concept</span><% } %>
     68            <% if (p.isDraft) { %><span class="pal-badge"><%= t('admin.draft') %></span><% } %>
    6369            <span class="pal-name"><%= p.title || '(zonder titel)' %></span>
    6470          </a>
    6571          <span class="pal-actions">
    66             <a class="pal-link" href="<%= p.editUrl %>">Bewerken</a>
    67             <% if (!p.isDraft) { %><a class="pal-link" href="<%= p.viewUrl %>">Bekijk</a><% } %>
     72            <a class="pal-link" href="<%= p.editUrl %>"><%= t('admin.edit') %></a>
     73            <% if (!p.isDraft) { %><a class="pal-link" href="<%= p.viewUrl %>"><%= t('admin.view') %></a><% } %>
    6874          </span>
    6975        </li>
     
    7379
    7480  <% if (sites && sites.length) { %>
    75     <h2>Sites</h2>
     81    <h2><%= t('admin.sec_sites') %></h2>
    7682    <table class="admin-table">
    7783      <thead>
    78         <tr><th>Slug</th><th>Title</th><th>Owner</th><th>Created</th></tr>
     84        <tr><th><%= t('admin.th_slug') %></th><th><%= t('admin.th_title') %></th><th><%= t('admin.th_owner') %></th><th><%= t('admin.th_created') %></th></tr>
    7985      </thead>
    8086      <tbody>
     
    9298
    9399  <% if (users && users.length) { %>
    94     <h2>Users</h2>
     100    <h2><%= t('admin.sec_users') %></h2>
    95101    <table class="admin-table">
    96102      <thead>
    97         <tr><th>Username</th><th>Email</th><th>Role</th><th>Joined</th></tr>
     103        <tr><th><%= t('admin.th_username') %></th><th><%= t('admin.th_email') %></th><th><%= t('admin.th_role') %></th><th><%= t('admin.th_joined') %></th></tr>
    98104      </thead>
    99105      <tbody>
  • src/views/pages/downloads.ejs

    r03fa548 r91c0a39  
    11<%
    22  var ts = (typeof dlTracks !== 'undefined') ? dlTracks : [];
     3  // NB: de loop hieronder gebruikt 't' als track-variabele, die de vertaal-t()
     4  // overschaduwt. Daarom het knoplabel hier al ophalen.
     5  var _dlBtn = t('downloads.btn');
    36%>
    47<article class="container post-page">
    58  <%- include('../partials/post-nav', { newerPost: (typeof newerPost !== 'undefined' ? newerPost : null), olderPost: (typeof olderPost !== 'undefined' ? olderPost : null) }) %>
    69  <section class="dls">
    7   <h1 class="dls-h1">Downloads</h1>
    8   <p class="dls-sub">Gratis te downloaden — laat je e-mailadres achter en je krijgt het bestand.</p>
     10  <h1 class="dls-h1"><%= t('downloads.title') %></h1>
     11  <p class="dls-sub"><%= t('downloads.sub') %></p>
    912
    1013  <% if (!ts.length) { %>
    11     <p class="dls-empty">Er staan momenteel geen downloads klaar.</p>
     14    <p class="dls-empty"><%= t('downloads.empty') %></p>
    1215  <% } else { %>
    1316    <ul class="dls-list">
     
    1922            <% if (t.artist) { %><span class="dls-artist"><%= t.artist %></span><% } %>
    2023          </span>
    21           <a class="dls-btn" href="<%= siteUrlBase %>/download/<%= t.id %>">⬇ Download</a>
     24          <a class="dls-btn" href="<%= siteUrlBase %>/download/<%= t.id %>"><%= _dlBtn %></a>
    2225        </li>
    2326      <% }); %>
  • src/views/pages/shows.ejs

    r03fa548 r91c0a39  
    44%>
    55<section class="sh">
    6   <h1 class="sh-h1">Agenda</h1>
     6  <h1 class="sh-h1"><%= t('agenda.title') %></h1>
    77
    8   <% if (st === 'done') { %><div class="sh-msg">✓ Je staat op de lijst — je hoort het zodra er een evenement wordt aangekondigd.</div>
    9   <% } else if (st === 'check') { %><div class="sh-msg">✉ Check je mail om je aanmelding te bevestigen.</div>
     8  <% if (st === 'done') { %><div class="sh-msg"><%= t('agenda.msg_done') %></div>
     9  <% } else if (st === 'check') { %><div class="sh-msg"><%= t('agenda.msg_check') %></div>
    1010  <% } else if (st === 'error') { %><div class="sh-msg sh-bad"><%= (typeof notifyMsg!=='undefined')?notifyMsg:'Er ging iets mis.' %></div><% } %>
    1111
    1212  <% if (!ss.length) { %>
    13     <p class="sh-empty">Geen aangekondigde evenementen op dit moment.</p>
     13    <p class="sh-empty"><%= t('agenda.empty') %></p>
    1414  <% } else { %>
    1515    <ul class="sh-list">
     
    2525            <% if (s.notes) { %><span class="sh-notes"><%= s.notes %></span><% } %>
    2626          </span>
    27           <% if (s.ticket_url) { %><a class="sh-tix" href="<%= s.ticket_url %>" target="_blank" rel="noopener">Tickets</a><% } %>
     27          <% if (s.ticket_url) { %><a class="sh-tix" href="<%= s.ticket_url %>" target="_blank" rel="noopener"><%= t('agenda.tickets') %></a><% } %>
    2828        </li>
    2929      <% }); %>
     
    3333  <% if (!(typeof footerNewsletter !== 'undefined' && footerNewsletter)) { %>
    3434  <div class="sh-notify">
    35     <h2 class="sh-h2">Mis geen evenement</h2>
    36     <p class="sh-sub">Laat je e-mail achter en je krijgt een seintje bij een nieuw evenement. Uitschrijven kan altijd.</p>
     35    <h2 class="sh-h2"><%= t('agenda.notify_h') %></h2>
     36    <p class="sh-sub"><%= t('agenda.notify_sub') %></p>
    3737    <form method="POST" action="<%= siteUrlBase %>/shows/notify" class="sh-form">
    38       <input type="email" name="email" required placeholder="jouw@email.nl" autocomplete="email">
    39       <button type="submit" class="sh-btn">Houd me op de hoogte</button>
     38      <input type="email" name="email" required placeholder="<%= t('common.email_placeholder') %>" autocomplete="email">
     39      <button type="submit" class="sh-btn"><%= t('agenda.notify_btn') %></button>
    4040    </form>
    4141  </div>
Note: See TracChangeset for help on using the changeset viewer.