Skip to content

Fix French text appearing when English is selected - #1

Open
Phoenix-Grand wants to merge 12 commits into
kubuno:mainfrom
Phoenix-Grand:translation-updates
Open

Phoenix-Grand wants to merge 12 commits into
kubuno:mainfrom
Phoenix-Grand:translation-updates

Conversation

@Phoenix-Grand

@Phoenix-Grand Phoenix-Grand commented Oct 26, 2026 •

Copy link
Copy Markdown

Optional module-owned Marketplace descriptions

Module publishers can now opt in with [marketplace] summary = "…" in their existing module.toml, plus optional locale-keyed summaries/descriptions. The longer description and existing module description translations are reused. Existing manifests and .kbpkg files need no changes; the runtime manifest parser and archive format remain unchanged.

  • kubuno marketplace:metadata module.toml --catalog catalog.json imports only publisher text for the exact module ID and released version. It preserves unknown catalog fields, categories, badges, artifact URLs, checksums, signatures and other listings. Without [marketplace], the catalog is unchanged. The standalone exporter requires no database, running Core, credentials or network.
  • A self-hosted operator can explicitly set KUBUNO_MARKETPLACE_METADATA_DIR and supply <module-id>/module.toml files. List/detail refreshes apply the same importer. Missing, invalid, oversized or mismatched files retain catalog data. This option defaults to off and does not fetch repositories, scan installed modules, change installation behavior, or provide a disconnected catalog cache.
  • English and French Mail summaries are published in Mail commit fd19e82: six added manifest lines, no module code or packaging changes.
  • The public api.kubuno.com service has not been modified. Its operator must connect the reusable importer to its publishing pipeline for automatic public updates. The image has no built-in Mail override; testing uses an explicit read-only metadata mount.

Validation for this extension: 33 backend Marketplace tests, 3 CLI integration tests and 16 targeted frontend tests pass. Coverage includes legacy and opted-in .kbpkg extraction/loading, unchanged legacy listings, ID/version guards, stale/duplicate locale handling, empty translations, bounded local metadata, and machine-readable CLI output without instance configuration. Both production binaries and the frontend build. Importing the actual public Mail record preserves every non-text field. The packaged non-root CLI and isolated SQLite setup/login, Mail summaries/descriptions, live refresh, invalid/version-mismatched metadata fallback, legacy opt-out, frontend and health checks pass. The previously documented two unrelated full-frontend-suite failures remain outside this change; the full suite was not rerun for this backend-only extension.

Core can show French while English is selected: several screens hard-code their labels, newer translation keys have only French fallback text, and server responses displayed verbatim use French defaults. This updates the English UI and default messages across Core and prevents a delayed locale load from replacing a newer language selection.

Changes:

  • Localize marketplace category headings, including legacy catalog labels and the missing-category fallback. Group and match companion modules by stable category identity. Preserve optional category_id and locale-keyed localizations through the server API; resolve each display field by selected locale, parent locale, English, then original content without mutating publisher metadata. Language changes update cached catalog content immediately without another request.
  • Render installation progress, errors, and completion notices in the selected language, including language changes during an operation. Add structured dependency parameters and stable error codes while retaining the existing progress fields. Keep original diagnostics accessible in an expandable details section. Document the backwards-compatible catalog contract and external publishing work in server/src/modules/marketplace/README.md. Catalog descriptions without translations remain in their original language; the external catalog/content pipeline must publish translations.
  • Localize Core's built-in service label/description in the personal-data wizard and admin export dialog, using the service/module identifiers. Preserve module-owned metadata, service IDs, and required selections. Make file-size choices and archive/history sizes follow the selected language; the shared size formatter now uses locale-aware units and numbers rather than hard-coded French suffixes.
  • Localize the three seeded system groups and the built-in everyone audience in lists, editor fields, audience details/breadcrumbs, search/filtering, and related group pickers/member rows. Resolve exact factory wording using the system/everyone flags, independently of the lazy French bundle. Preserve custom/cleared fields; group edits omit untouched names/descriptions so a permission or other property change does not persist displayed translations.
  • Localize the inherited factory instance description ("Mon cloud personnel" / "My personal cloud") in its settings input and inheritance details. Translate only factory values; explicit overrides, drafts, custom text, and cleared values stay unchanged. Add the five missing seeded settings-category headings and category coverage.
  • Fix the role/privilege resolver for fresh English sessions before the French bundle is loaded. Compare against a checked snapshot of the 7 role and 51 privilege factory records rather than a locale lookup that can fall back to English. Add 40 missing English privilege labels/descriptions and readable privilege-group headings. Preserve custom text and explicitly empty descriptions.
  • Localize all 14 seeded detector names and descriptions in the overview, editor fields/headings/breadcrumbs, and rule picker/summaries. Translate only unchanged factory metadata; custom labels/descriptions remain verbatim, and saving unrelated thresholds keeps the original stored text. Detection patterns and keywords are not altered.
  • Complete a broader audit of all seeded settings: add 148 missing English labels/descriptions across 103 settings, covering background jobs, security, alerts, storage, networking, email, rules, and fallback/module settings. Preserve the corresponding French catalogue values.
  • Expand regression coverage to every mapped settings group, all 287 nonempty seeded metadata fields across 158 settings, all French catalogue translation families, and the installer namespace.
  • Localize the missing-page message, sidebar Home link, and widget resize controls; inherit the current UI language in an unset profile field. Make remaining shared preview, accessibility, designer, storage, MCP, schema-management, native control, and sync-message defaults English. Regenerate the component registries.
  • Fill the SSO overview/settings tab captions, provider heading, and all SSO setting labels and descriptions, including password policy, account recovery, administrator two-factor authentication, and every CAPTCHA mode. Preserve French translations and add coverage for descriptor-based tab keys and dynamically selected SSO metadata.
  • Add missing English catalogue entries and localize labels/sharing, clipboard and image dialogs, account/sidebar menus, notification settings, OIDC configuration, and the login-animation editor. Preserve the French wording in catalogue entries for the newly localized screens.
  • Make shared control defaults English, including confirmation dialogs, color/font controls, file previews, and theme previews. Calendar month/weekday labels and country names follow the selected document language, including changes while a control is open.
  • Use the shared language setter for profile/setup selections. Keep an explicit English account preference over the instance default, and ignore stale asynchronous locale requests.
  • Translate exposed server validation messages, rule-catalogue descriptions, diagnostics, notifications, and progress messages to an English baseline. The baseline-message edits preserve error codes, format parameters, and application logic. Marketplace endpoints additionally preserve optional localized catalog metadata and return structured progress parameters/error codes; raw diagnostic messages retain a single baseline language.
  • Make neutral mobile sign-in/UI resources English. Preserve the existing Android French strings in values-fr, and move viewer labels into English/French resources.

Validation:

  • Marketplace validation: 11 new frontend tests pass, including the rendered screen, locale fallback, English/French switching without refetching, stable grouping, live installation status, and error diagnostics. The targeted run with existing translation-key coverage passes all 16 tests. All 25 backend marketplace tests pass with cargo test --release --locked --lib modules::marketplace.
  • The refreshed Linux AMD64 image passes isolated first-time SQLite setup, login, frontend loading, health checks, and real Core API checks against a fixture catalog containing both localized and legacy module metadata. The production Rust binary and frontend both build successfully. These image checks do not install any modules or modify the existing test instance.
  • npm run build passes, including TypeScript/view compilation and the production bundle.
  • Full frontend suite: 341 passed, 2 failed (343 total). Both remaining failures were reproduced on the untouched base during the initial audit: TextField.Bare is absent from the conformance allowlist, and a designer test refers to the missing web/packages/ui/kbview-registry.web.json path. Regenerating the registry resolved the third original failure.
  • The existing 34 translation regression tests pass: export API metadata coverage, service selection and locale-aware file sizes, directory seed coverage and group editor payloads, factory settings values and categories, role/privilege seed coverage and fresh English-session rendering without French resources, detector seed coverage, English/French metadata rendering and preservation of custom values, catalogue coverage for literal and descriptor-based keys, all mapped settings groups and seeded metadata, English equivalents of French catalogue families, installer coverage, language-selection races/account precedence, interpolation/plurals, and calendar/country locale updates.
  • Personal-export browser checks verify the real API's account service text and size choices in English, required-service selection, and French/English switching. Mocked export request/progress/ready/history responses verify unchanged request IDs/limits and English archive/history sizes without creating or downloading an export. The admin export dialog's built-in service text is checked with eligibility mocked for that view. The refreshed original port 8181 is checked again against the real overview.
  • Directory browser checks cover English names/descriptions for all three groups and their editor fields, the everyone audience list/detail/breadcrumb, English filtering, custom group/audience text, cleared descriptions, and English group names in the member picker and added-member row. A real group save of another property succeeds and preserves the stored factory name/description. French/English switching passes with no JavaScript errors; temporary test records and changes are restored afterward.
  • Instance-settings browser checks verify all 29 labels/descriptions, the English factory description in the input and inheritance chain, readable category headings, and French/English switching. Mocked resolved responses verify custom/empty descriptions, and a mocked write verifies that editing another field sends only that field. A real local SQLite settings write returns HTTP 500 (UPDATE core.settings s fails near s in the existing mirror query); successful persistence is not claimed for that check. That SQL query is unchanged by the display fixes. Port 8181 is refreshed and its displayed values are checked again.
  • Browser verification on a fresh SQLite instance checks all 19 settings pages and 127 unique displayed setting rows against their English catalogue labels/descriptions. The reported stalled-task description is English. An account with no saved language inherits English, its profile selector shows English, and the background-task page switches from English to French and back correctly. No JavaScript errors.
  • Role browser checks cover all 7 names/descriptions in a fresh English session, all 51 privilege names in the creation picker, every role detail, English/French switching, custom names, empty descriptions, and partial saves that preserve untouched metadata. The original port 8181 is refreshed.
  • Additional browser checks cover English names and descriptions for all 14 detectors, metadata preservation when saving a threshold, custom text, and English/French switching. Detector settings (6 rows) and data-export settings (10 rows) are verified on the refreshed original port 8181.
  • Earlier SSO browser checks cover the overview, add-provider form, and all three CAPTCHA modes.
  • The updated Rust server builds successfully in Docker with cargo build --release --locked --bin kubuno-core.
  • The earlier baseline-message audit checked 21 Rust files and 193 changed string literals for preserved formatting parameters and text-only changes. The additional marketplace model/progress changes are covered by the backend tests and release build above. Native desktop/Android builds and tests were not run. Neutral/French native resource catalogues were also checked for English equivalents.
  • git diff --check passes.

The shared/native baseline changes and the web catalogue/display changes are kept in separate commits for review.

Container test image

  • Source revision: 56f5a15ffe6ef233eeafebdc280f9fda401a8583
  • Image: git.cdsfellows.com/kudjo/kubuno-core:pr-1
  • Immutable tag: git.cdsfellows.com/kudjo/kubuno-core:pr-1-56f5a15f
  • Digest: sha256:e239f70f97b1319d2cd70370621ab381fdd9ad3700158e4b839ede887045375d
  • Platform: linux/amd64; Core-only; runtime UID/GID 99:100.
  • Data volume: /data; container port: 8080.
  • Both the server and the kubuno marketplace:metadata CLI are included. Build provenance is in /usr/share/kubuno/build.json and the metadata contract in /usr/share/kubuno/marketplace-metadata.md.

To preview module-owned text, mount a directory read-only, containing mail/module.toml from the Mail commit above, and set KUBUNO_MARKETPLACE_METADATA_DIR to its container path. Refresh Marketplace after editing a valid manifest. Its ID/version must match the selected catalog listing. Without this option or an updated catalog, existing descriptions remain unchanged.

This tag follows PR #1's translation branch. The separate package-management PR #2 is not included. Test with a separate data volume if your current instance is running that branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant