Changeset 91c0a39 in Klonkt
- Timestamp:
- 06/20/2026 01:50:48 PM (3 months ago)
- Branches:
- main
- Children:
- 66cfbaa
- Parents:
- 03fa548
- Location:
- src
- Files:
-
- 4 edited
-
services/i18n.js (modified) (3 diffs)
-
views/pages/admin.ejs (modified) (3 diffs)
-
views/pages/downloads.ejs (modified) (2 diffs)
-
views/pages/shows.ejs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/i18n.js
r03fa548 r91c0a39 38 38 'footer.install': 'Installeer app', 39 39 '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', 40 71 }, 41 72 en: { … … 67 98 'footer.install': 'Install app', 68 99 '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', 69 128 }, 70 129 de: { … … 96 155 'footer.install': 'App installieren', 97 156 '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', 98 185 }, 99 186 }; -
src/views/pages/admin.ejs
r03fa548 r91c0a39 1 1 <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> 3 9 <% 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> 5 11 <% } else { %> 6 <p class="admin-tagline"> Solo-modus — jouw site.</p>12 <p class="admin-tagline"><%= t('admin.tagline_solo') %></p> 7 13 <% } %> 8 14 9 15 <nav class="admin-quick-links" aria-label="Beheer-snelkoppelingen"> 10 16 <% 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> 18 24 <% } 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> 22 28 <% 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> 24 30 <% } 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> 26 32 <% } %> 27 33 <% if (tenancy === 'circle') { %> 28 <a href="/admin/circle" class="btn"> 🔗 Cirkel</a>34 <a href="/admin/circle" class="btn"><%= t('admin.b_circle') %></a> 29 35 <% } %> 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> 32 38 <% } %> 33 39 <% 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> 40 46 <% } %> 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> 44 50 </nav> 45 51 46 52 <div class="admin-stats"> 47 53 <% 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> 50 56 <% } %> 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> 53 59 </div> 54 60 55 61 <% if (typeof posts !== 'undefined' && posts && posts.length) { %> 56 62 <% 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> 58 64 <ul class="post-admin-list"> 59 65 <% posts.forEach(function(p) { %> 60 66 <li class="pal-row<%= p.isDraft ? ' is-draft' : '' %>"> 61 67 <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><% } %> 63 69 <span class="pal-name"><%= p.title || '(zonder titel)' %></span> 64 70 </a> 65 71 <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><% } %> 68 74 </span> 69 75 </li> … … 73 79 74 80 <% if (sites && sites.length) { %> 75 <h2> Sites</h2>81 <h2><%= t('admin.sec_sites') %></h2> 76 82 <table class="admin-table"> 77 83 <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> 79 85 </thead> 80 86 <tbody> … … 92 98 93 99 <% if (users && users.length) { %> 94 <h2> Users</h2>100 <h2><%= t('admin.sec_users') %></h2> 95 101 <table class="admin-table"> 96 102 <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> 98 104 </thead> 99 105 <tbody> -
src/views/pages/downloads.ejs
r03fa548 r91c0a39 1 1 <% 2 2 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'); 3 6 %> 4 7 <article class="container post-page"> 5 8 <%- include('../partials/post-nav', { newerPost: (typeof newerPost !== 'undefined' ? newerPost : null), olderPost: (typeof olderPost !== 'undefined' ? olderPost : null) }) %> 6 9 <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> 9 12 10 13 <% if (!ts.length) { %> 11 <p class="dls-empty"> Er staan momenteel geen downloads klaar.</p>14 <p class="dls-empty"><%= t('downloads.empty') %></p> 12 15 <% } else { %> 13 16 <ul class="dls-list"> … … 19 22 <% if (t.artist) { %><span class="dls-artist"><%= t.artist %></span><% } %> 20 23 </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> 22 25 </li> 23 26 <% }); %> -
src/views/pages/shows.ejs
r03fa548 r91c0a39 4 4 %> 5 5 <section class="sh"> 6 <h1 class="sh-h1"> Agenda</h1>6 <h1 class="sh-h1"><%= t('agenda.title') %></h1> 7 7 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> 10 10 <% } else if (st === 'error') { %><div class="sh-msg sh-bad"><%= (typeof notifyMsg!=='undefined')?notifyMsg:'Er ging iets mis.' %></div><% } %> 11 11 12 12 <% if (!ss.length) { %> 13 <p class="sh-empty"> Geen aangekondigde evenementen op dit moment.</p>13 <p class="sh-empty"><%= t('agenda.empty') %></p> 14 14 <% } else { %> 15 15 <ul class="sh-list"> … … 25 25 <% if (s.notes) { %><span class="sh-notes"><%= s.notes %></span><% } %> 26 26 </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><% } %> 28 28 </li> 29 29 <% }); %> … … 33 33 <% if (!(typeof footerNewsletter !== 'undefined' && footerNewsletter)) { %> 34 34 <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> 37 37 <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> 40 40 </form> 41 41 </div>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)