From 05c7c84e7c5ceae69d1c35a90acdbd582a83e1a8 Mon Sep 17 00:00:00 2001 From: iammukeshm Date: Tue, 3 Nov 2026 22:55:08 +0530 Subject: [PATCH] docs(i18n): FSH_DEFAULT_LANGUAGE for both containers, switcher If-Match (#1459) --- src/content/docs/changelog/index.mdx | 1 + .../docs/cross-cutting-concerns/internationalization.mdx | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/content/docs/changelog/index.mdx b/src/content/docs/changelog/index.mdx index ee7e43dd..644dd7c3 100644 --- a/src/content/docs/changelog/index.mdx +++ b/src/content/docs/changelog/index.mdx @@ -13,6 +13,7 @@ Notable changes to the kit, newest first. ## 2026-11-03 +- **Frontends: i18n follow-ups (fix).** The admin language switcher now saves with `If-Match`, so a profile edit made in between is no longer silently overwritten (it retries once on `412`). The dashboard container now honours `FSH_DEFAULT_LANGUAGE` like the admin one; before, a containerized dashboard always started in `en-US`. `deploy/docker` and Terraform pass the setting to both apps. The dashboard no longer matches the English text of the deactivated-tenant error, because the API always sends its `code` now. See [Internationalization](/docs/cross-cutting-concerns/internationalization/#per-deployment-default) and [#1459](https://github.com/fullstackhero/dotnet-starter-kit/pull/1459). - **Eventing: one failing integration-event handler no longer blocks the others (fix).** `InMemoryEventBus` ran an event's handlers in order and stopped at the first exception, so the rest waited for the outbox retry, and if the failing one kept failing until the row dead-lettered they never ran. For `FileStorageKeyChangedIntegrationEvent` that meant a store rejecting Files' superseded-object delete also skipped Catalog's product-image URL rewrite. The bus now runs every handler, then rethrows (the single exception, or an `AggregateException` when several fail) so the outbox still retries; the inbox already records each handler that succeeded, so a retry re-runs only the failed ones. See [Eventing](/docs/building-blocks/eventing/#event-bus-implementations) and [#1423](https://github.com/fullstackhero/dotnet-starter-kit/issues/1423). - **Files: finalize no longer answers `500` for a file it already committed (fix).** `FinalizeUpload` moves an upload presigned before visibility roots existed after the finalize commit; when that move failed the client got a `500` for a file that was already `Available`, and a retried finalize answered `409`. The move is now best-effort: finalize returns the file and logs a warning, the file stays at its legacy key, and `MigrateLegacyPublicFileKeysJob` moves a public one on its next run (a private one stays presigned-only). See [Files](/docs/modules/files/#visibility-and-storage-moves). - **Files: a storage move whose commit fails no longer leaves an orphaned, quota-charged copy (fix).** `FileStorageRelocator` copies the object before committing the row; if the commit then failed, the copy stayed in the bucket, charged to the tenant's `StorageBytes`, with nothing pointing at it. The copy is now deleted again (refunding its bytes), best-effort and logged. diff --git a/src/content/docs/cross-cutting-concerns/internationalization.mdx b/src/content/docs/cross-cutting-concerns/internationalization.mdx index 3897dfb6..3ca70c1b 100644 --- a/src/content/docs/cross-cutting-concerns/internationalization.mdx +++ b/src/content/docs/cross-cutting-concerns/internationalization.mdx @@ -1,6 +1,6 @@ --- title: Internationalization (i18n) -lastUpdated: 2026-10-02 +lastUpdated: 2026-11-03 description: End-to-end localization across the backend and both React apps - en-US as default and fallback, pt-BR included, with per-user language, IStringLocalizer, RequestLocalization, and react-i18next. sidebar: label: Internationalization @@ -157,7 +157,7 @@ Dates, numbers, and currency are formatted in the browser with `Intl` under the ### Per-deployment default -The default language for a deployment is set at runtime through the app's `config.json`, via the `defaultLanguage` key - consistent with how the front-ends take the rest of their environment configuration at runtime rather than from `VITE_*` build-time variables. +The default language for a deployment is set at runtime through the app's `config.json`, via the `defaultLanguage` key - consistent with how the front-ends take the rest of their environment configuration at runtime rather than from `VITE_*` build-time variables. In the container images of both apps, set `FSH_DEFAULT_LANGUAGE` (for example `pt-BR`); leaving it unset gives `en-US`. `deploy/docker` passes it through from `.env`, and Terraform sets it on both static sites from `frontend_default_language`. ## Adding a language