Conversation
Refines nl.json with more natural phrasing: - Kalender → Agenda (calendar/appointment terminology) - Komende → Aankomende (upcoming renewals) - autopay → automatische incasso (form placeholder) - resetlink → herstellink (auth) - SMTP labels: noun-compound → prepositional phrasing Thanks to @callmenoodles for the contribution!
Expands translation coverage across the UI:
- Calendar: month name, day abbreviations, Today button, Export to iCal,
and the JS copy-confirmation toast now respect the active language.
- Dashboard, subscription list, and subscriptions table: subscription
Status ("Active" / "Cancelled" / etc.) and schedule labels now
translate via new statusLabel and scheduleLabel template funcs.
- Subscription form: payment-method, account, URL, and notes placeholders.
- Settings: page subtitle and most section descriptions (Appearance, Export
Data, Base URL, Calendar Subscription, Data Management, Email, Pushover,
Webhook, Security, Currency, Date Format, Categories, API Keys), plus
associated placeholders and helper text.
- Hardcoded "Add Subscription" mobile-menu button across calendar,
dashboard, analytics, and settings pages.
New keys added to en.json and translated into de/es/nl with the same
AI-assisted pass convention as prior locales (282 keys, full parity).
Also adds settings handler i18n catalog injection so api-keys-list.html
can resolve the empty state via translation.
Addresses #116. Includes Dutch translation polish from PR #115.
Owner
Author
|
Playwright i18n-coverage spec results: All es/de/nl translations render on dashboard, subscriptions, form/subscription, settings, analytics, and calendar pages. No English sentinels leaked through. (Firefox/Webkit projects skipped — browsers not installed locally; chromium covers all assertions.) |
- Fix dead-code fallback in Calendar handler: catalog.T() returns the key on miss, never empty, so the if monthName == "" guard was unreachable. Now compares against the key string to properly detect a missing translation. - Remove unused monthLabelFunc template helper: not called from any template, since month translation is handled server-side in the Calendar handler. Avoids divergent fallback paths. - Drop printf "%q" in calendar.html JS string interpolations: %q doesn't HTML-escape < > /, so a translation containing </script> could close the script tag. html/template's contextual auto-escape pipeline produces a safely-quoted JS string literal.
Owner
Author
|
Addressed Greptile's review (243f344):
Verified locally:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Expands UI translation coverage across the app and merges @callmenoodles's Dutch translation polish (#115).
Closes #115 (Dutch translation improvements — merged into this branch)
Addresses #116 (i18n coverage gaps — covers most surfaces; see below)
What's covered
Calendar
Format("January 2006"))Subscriptions
Active/Cancelled/Paused/Trial) via newstatusLabeltemplate funcscheduleLabeltemplate func (handles both single-interval and "Every N Months" forms)Forms
Settings
Mobile menu
Locale parity
All four locales rebuilt to 282 keys with full parity:
en.json— canonicalde.json— German translations addedes.json— Spanish translations addednl.json— includes both the new keys and @callmenoodles's polish (Agenda, Aankomende, herstellink, etc.)Translations follow the existing AI-assisted convention documented in
web/locales/README.md— native speakers welcome to refine.Code changes
cmd/server/main.go— newstatusLabelFunc,scheduleLabelFunc,monthLabelFunctemplate funcs registered on both FuncMap sites.internal/handlers/subscription.go— Calendar handler now resolvesMonthNamethrough the i18n catalog.internal/handlers/settings.go—SettingsHandlernow receives the i18n catalog and has anactiveLang()helper;api-keys-list.htmlpartial getsLangso its empty state translates.Deferred from #116
A few items are not in this PR — they need a separate effort:
web/locales/README.md.Will follow up on these in a separate issue/PR.
Test plan
go build ./...cleango test ./...passes (handlers, i18n, models, service)npx playwright test tests/i18n-coverage.spec.js --workers=1)Greptile Summary
This PR expands i18n coverage across the app (calendar day/month names, subscription status and schedule labels, settings section descriptions, form placeholders, mobile menu) and merges Dutch translation polish from a community contributor. All four locale files (
en,de,es,nl) are rebuilt to 282 keys with full parity.statusLabelFuncandscheduleLabelFuncGo template funcs translate subscription status/schedule consistently across the dashboard, subscriptions list, and table.SettingsHandlernow accepts the i18n catalog so the API-keys partial can render its empty state in the active language.Agenda,Aankomende,herstellink) and a batch of newly added translation keys alongside the rest.Confidence Score: 5/5
This PR is safe to merge — all changes are additive i18n wiring with no logic mutations, and all four locale files are complete and in parity.
The changes are purely translational: new template functions delegate to the i18n catalog with key-miss fallbacks, existing handler logic is untouched, and the locale files are verified complete. The two findings are edge-case defensive gaps (plural schedule label and printf format string) that are unreachable with the current four locales — they would only surface if a fifth, partially-translated locale were added.
cmd/server/main.go (scheduleLabelFunc plural branch) and templates/settings.html (printf with catalog format string) both lack key-miss guards that the rest of the codebase applies consistently.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[HTTP Request] --> B{activeLang} B -->|lang setting| C[i18nCatalog.T] C -->|hit| D[Translated string] C -->|miss: returns key| E[Key string] D --> F{Template function} E --> F F -->|statusLabel| G{v != key?} G -->|yes| H[Return translation] G -->|no| I[Return raw status] F -->|scheduleLabel interval≤1| J{v != key?} J -->|yes| K[Return translation] J -->|no| L[Return raw schedule] F -->|scheduleLabel interval>1| M[fmt.Sprintf catalog.T ...] M -->|hit: has %d| N[Return 'Every 3 Months'] M -->|miss: no %d in key| O[⚠️ Garbled output] F -->|monthName in subscription.go| P{monthName == monthKey?} P -->|yes fallback| Q[Go Format January] P -->|no| R[Return translation]Reviews (2): Last reviewed commit: "Address Greptile PR #118 review" | Re-trigger Greptile