Changeset 03fa548 in Klonkt for src/views/partials/footer.ejs


Ignore:
Timestamp:
06/20/2026 01:39:41 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
91c0a39
Parents:
d0f4c10
Message:

feat(i18n): interface language NL/EN/DE with visitor switcher (phase 1: chrome)

  • i18n.js (t helper + nl/en/de dictionary + resolveLang: session → browser → nl).
  • render.js passes t/lang/langs to all views; /lang/:code sets the language in the session.
  • Language switcher (select) in the footer; chrome translated: topnav (Archive/Login/Account/Admin/Logout/…), pill (Agenda/Solo/Circle/Timeline/Grid), post nav (Newer/Older), footer.
  • Content (posts/site name/bio) stays in the author's language. Admin + deeper page strings follow in a next phase.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/partials/footer.ejs

    rd0f4c10 r03fa548  
    22  <% if (typeof footerNewsletter !== 'undefined' && footerNewsletter && (typeof premiumUnlocked === 'undefined' || premiumUnlocked) && typeof site !== 'undefined' && site) { %>
    33    <div class="container footer-nl">
    4       <span class="footer-nl-label">📬 Blijf op de hoogte</span>
     4      <span class="footer-nl-label">📬 <%= t('footer.subscribe_cta') %></span>
    55      <form method="post" action="<%= (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '' %>/nieuwsbrief" class="footer-nl-form">
    6         <input type="email" name="email" required placeholder="jouw@email.nl" autocomplete="email" aria-label="E-mailadres">
    7         <button type="submit">Inschrijven</button>
     6        <input type="email" name="email" required placeholder="<%= t('common.email_placeholder') %>" autocomplete="email" aria-label="E-mailadres">
     7        <button type="submit"><%= t('footer.subscribe') %></button>
    88      </form>
    99    </div>
     
    1717    <button type="button" class="install-app-btn install-app-btn--footer" data-pcms-install-app>
    1818      <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><path d="M5 20h14v-2H5v2zm7-18L5.33 9h3.84v6h5.66V9h3.84L12 2z" fill="currentColor"/></svg>
    19       <span>Installeer app</span>
     19      <span><%= t('footer.install') %></span>
    2020    </button>
    2121    <div class="footer-meta">
     22      <% if (typeof langs !== 'undefined' && langs && langs.length > 1) { %>
     23        <select class="footer-lang" aria-label="<%= t('nav.language') %>"
     24                onchange="location.href='/lang/'+this.value+'?r='+encodeURIComponent(location.pathname+location.search)">
     25          <% langs.forEach(function(l){ %><option value="<%= l.code %>"<%= l.active ? ' selected' : '' %>><%= l.name %></option><% }); %>
     26        </select>
     27      <% } %>
    2228      <a class="footer-version" href="<%= (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '' %>/changelog" title="Bekijk wat er per release veranderd is">Klonkt Beta<%= (typeof appVersion !== 'undefined' && appVersion) ? ' v' + appVersion : '' %></a>
    2329      <%# Mobile-only theme toggle. On desktop the topnav has its own toggle
     
    101107  display: inline-flex; align-items: center; gap: 0.75rem;
    102108}
     109.footer-lang {
     110  background: transparent; color: var(--ink); opacity: 1;
     111  border: 1px solid var(--rule); border-radius: 999px;
     112  padding: 0.3rem 0.5rem; font-size: 0.78rem; cursor: pointer;
     113  font-family: inherit;
     114}
     115.footer-lang:hover { border-color: var(--accent); }
    103116.footer-version { color: inherit; text-decoration: none; }
    104117.footer-version:hover { color: var(--accent); text-decoration: underline; }
Note: See TracChangeset for help on using the changeset viewer.