Files
Verso/services/web/app/views/layout/thin-footer.pug
T
claudeandClaude Sonnet 4.6 1a0197812d
Build and Deploy Verso / deploy (push) Successful in 14m53s
feat: cookie+DB language preference, eliminating subdomain requirement
Users can now select their UI language directly without relying on
subdomain routing (fr.verso.alocoq.fr etc.).

Resolution order: (1) verso-lang cookie, (2) subdomain host header,
(3) OVERLEAF_SITE_LANGUAGE default — fully backward compatible.

Changes:
- Translations.mjs: read verso-lang cookie in middleware; include all
  bundled locale files in availableLanguageCodes regardless of subdomain
  config so every loaded locale appears in the picker
- User.mjs: add languageCode field to persist preference per user
- UserController.mjs: setLanguage handler — sets cookie (1 year) and
  writes languageCode to DB when called by a logged-in user
- AuthenticationController.mjs: on login, sync DB languageCode to cookie
  so preference follows the user to any new browser/device after login
- ExpressLocals.mjs: expose availableLanguages to all Pug templates
- router.mjs: GET /set-language?lng=<code> (anonymous + logged-in),
  POST /user/language (logged-in, REST-style)
- language-picker.pug: replace subdomain href links with /set-language
  redirect links; iterate availableLanguages instead of subdomainLang
- thin-footer.pug: show picker whenever availableLanguages.length > 1,
  not only when multiple subdomains are configured

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 11:44:56 +00:00

50 lines
1.4 KiB
Plaintext

footer.site-footer
- var showLanguagePicker = availableLanguages.length > 1
- var hasCustomLeftNav = nav.left_footer && nav.left_footer.length > 0
.site-footer-content.hidden-print
.row
ul.site-footer-items.col-lg-9
li
| © #{new Date().getFullYear()}
|
a(href='https://alocoq.fr' target='_blank' rel='noopener noreferrer') Aloïs Coquillard
li
strong.text-muted |
li
| Built on
|
a(href='https://github.com/overleaf/overleaf' target='_blank' rel='noopener noreferrer') Overleaf
if showLanguagePicker || hasCustomLeftNav
li
strong.text-muted |
if showLanguagePicker
include language-picker
if showLanguagePicker && hasCustomLeftNav
li
strong.text-muted |
each item in nav.left_footer
li
if item.url
a(href=item.url class=item.class) !{translate(item.text)}
else
| !{item.text}
ul.site-footer-items.col-lg-3.text-end
li
a(href='https://git.alocoq.fr/alois/verso/src/branch/main/LICENSE' target='_blank' rel='noopener noreferrer') AGPL licence
li
strong.text-muted |
li
a(href='https://git.alocoq.fr/alois/verso' target='_blank' rel='noopener noreferrer') Source code
each item in nav.right_footer
li
if item.url
a(href=item.url class=item.class aria-label=item.label) !{item.text}
else
| !{item.text}