Andrey Antukh bc3cb4bddf
🌐 Complete Catalan translations in frontend (#11741)
* 🌐 Complete Catalan translations in frontend

Complete the Catalan (ca.po) locale to 100% coverage against en.po,
using es.po as support reference. Adds the 1439 missing entries
across workspace, dashboard, labels, shortcuts, subscription,
errors, modals and onboarding, keeping vosaltres treatment and
IEC/Termcat terminology consistent with the existing strings.
Normalizes placeholders and plural forms, drops the 14 stale
obsolete entries and canonicalizes the file with the repo
translations script.

Closes #11739

AI-assisted-by: muse-spark-1.3-contributor

* 📚 Add frontend translations memory with Catalan criteria

Record the PO workflow, the sync fuzzy-flag gotcha and the
Catalan glossary and tone agreed upon while completing ca.po,
and link the new memory from the frontend core routing.

AI-assisted-by: muse-spark-1.3-contributor

* 🔧 Add gettext to devenv image

Provide msgfmt and msgattrib in the dev environment for
checking PO translation files.

AI-assisted-by: muse-spark-1.3-contributor

* 🌐 Fix Catalan translations and add PO checker

Review of the missing-whitespace pattern found ~90 glued words
across 75 entries, plus 4 lost plural forms and 2 placeholder
mismatches verified against tr call sites. All fixed in ca.po.

Adds frontend/scripts/check-translations.js (vocabulary-free PO
QA: glued words, punctuation, placeholders, plurals) with
--self-test, wired as pnpm run check-translations and
documented in mem:frontend/translations.

AI-assisted-by: muse-spark-1.3-contributor

* 🌐 Multi-locale PO checker with word catalogs

Split the checker engine from its word lists: ca/es catalogs now
live in scripts/check-translations/words.<locale>.txt and all
messages are in English. Adds an es seed (calibrated to zero
errors) and fixes 7 typos it found in es.po. Universal checks
(placeholders, plurals, punctuation) run without a catalog.

AI-assisted-by: muse-spark-1.3-contributor

* 🌐 Merge PO checker into translations.js

Fold check-translations.js into translations.js as a check
subcommand reusing its locale helpers; word lists stay in
scripts/check-translations/words.<locale>.txt. Also fixes the
getopts stopEarly bug that made -l useless after the command
(sync -l ca synced every locale), drops dead lodash import
and code, unifies help and exit codes. Removes the
check-translations package alias; use translations.js
check -l <locale> with explicit -l.

AI-assisted-by: muse-spark-1.3-contributor

* 🌐 Keep unused placeholders out of the gate

Reverts the %s-stripping on unused auth.terms-privacy-agreement:
the links mirror its markdown sibling and a reactivation may
need them. Placeholder mismatches on #, unused keys now warn
instead of failing, and the rule is recorded in
mem:frontend/translations.

AI-assisted-by: muse-spark-1.3-contributor
2026-09-22 14:10:01 +02:00

4.1 KiB

Frontend Architecture and Workflow

Frontend: CLJS SPA; React/Rumext; Potok; RxJS; okulary refs; SCSS modules; shared common/; JS/TS workspace packages.

Stable namespace map

  • app.main.ui.*: Rumext/React UI components for workspace, dashboard, viewer, settings, auth, nitrate, etc.
  • app.main.data.*: Potok event handlers and side effects.
  • app.main.refs: reactive refs/lenses over store and derived workspace data.
  • app.main.store: Potok store and emit!.
  • app.plugins.* and app.plugins: CLJS implementation of Plugin JS API proxies.
  • app.render_wasm.*: frontend bridge to Rust/WASM renderer.
  • app.util.*: DOM, HTTP, i18n, keyboard, codegen, and general frontend utilities.
  • frontend/packages/* and frontend/text-editor: JS/TS workspace packages consumed by the app.
  • Nitrate subscription/organization UI and flows live under app.main.data.nitrate and app.main.ui.nitrate*; backend/API behavior is covered by backend memories, and shared permission rules are in common/src/app/common/types/nitrate_permissions.cljc.
  • app.config external bridges (external-feature-flag, external-session-id, external-context-info, external-notify-register-success, initialize-external-context-info) delegate to globalThis hooks injected by the SaaS host. Never delete external-feature-flag, even with zero call sites: it is the seam for future A/B tests.

Lint and Format

From frontend/:

  • CLJ/CLJS lint: pnpm run lint:clj.
  • JS lint currently no-ops via pnpm run lint:js.
  • SCSS lint: pnpm run lint:scss.
  • Format checks: pnpm run check-fmt:clj, pnpm run check-fmt:js, pnpm run check-fmt:scss.
  • Format fix: pnpm run fmt, or targeted fmt:clj / fmt:js / fmt:scss. After running fmt:*, check-fmt:* is redundant.
  • Translation formatting after i18n edits: pnpm run translations.

Before linting: if delimiter errors are suspected (after LLM edits, or lint/compiler reports syntax errors), run scripts/paren-repair on the affected files first. Delimiter errors produce misleading linter output. See mem:scripts/paren-repair.

Focused memory routing

UI and packages:

  • App UI components, SCSS modules, style-system boundaries, accessibility, i18n, and render performance: mem:frontend/ui-conventions-and-style-system.
  • JS/TS packages, shared UI package, text editor, Storybook, and package builds: mem:frontend/ui-packages-text-editor-workflow.
  • PO translation workflow and per-locale conventions: mem:frontend/translations.

Workspace behavior:

  • Workspace state, commits, persistence, undo, repo calls, and refs: mem:frontend/workspace-state-persistence-subtleties.
  • Workspace transforms, modifier previews, WASM modifier integration, and transform commits: mem:frontend/workspace-transform-subtleties.
  • Workspace token application/propagation: mem:frontend/workspace-token-subtleties; shared token data/schema: mem:common/tokens-schema-subtleties.

App shell and product flows:

  • Routing, root app shell, websocket, and global errors: mem:frontend/routing-app-shell-subtleties.
  • Dashboard and viewer flows: mem:frontend/dashboard-viewer-subtleties.
  • Plugin JS API runtime inside the frontend app: mem:frontend/plugin-api-to-cljs-binding.

Diagnostics and validation:

  • Runtime inspection and navigation: mem:frontend/cljs-repl.
  • Source-edit compile/hot-reload diagnostics: mem:frontend/compile-diagnostics.
  • Runtime crash recovery: mem:frontend/handling-crashes.
  • Tests and live verification: mem:frontend/testing.
  • CI end-to-end workflow (build-once frontend bundle, check names): mem:frontend/e2e-ci-workflow.
  • Cross-cutting testing principles and anti-patterns: mem:testing.
  • Real pointer/keyboard gesture reproduction: mem:frontend/playwright-gestures.

Areas without focused memories

These frontend areas currently have no dedicated Serena memory beyond this architecture entry and nearby source/tests: clipboard, drawing tools, boolean/path operations, interactions/prototyping, color/style asset management, grid-layout editing UI, comments UI, fonts UI, and many dashboard/settings subflows. Treat work there as less memory-covered and inspect source/tests more carefully.