Skip to content

feat(i18n): explicit fallback locale chain (closes #425)#508

Merged
ujeenet merged 1 commit into
developfrom
feat/django-parity-425-fallback-locales
May 22, 2026
Merged

feat(i18n): explicit fallback locale chain (closes #425)#508
ujeenet merged 1 commit into
developfrom
feat/django-parity-425-fallback-locales

Conversation

@ujeenet
Copy link
Copy Markdown
Owner

@ujeenet ujeenet commented May 22, 2026

Summary

  • Adds Translator::with_fallback_chain(&[\"pt\", \"es\"]) so apps can declare an ordered fallback path between the requested locale (and its base language) and the default-locale terminus. Mirrors Django's LANGUAGE_CODE + LANGUAGES fallback semantics.
  • Adds Translator::fallback_chain() accessor for diagnostics.
  • Lookup order: exact → base language → explicit chain → default → key itself.
  • Duplicates and entries equal to default_locale are silently dropped.

Closes

#425

Test plan

  • 3 new inline tests cover order-walking, default-locale terminus, and dedup behavior.
  • Existing 12 i18n inline tests still pass.
  • Litmus clean.
  • Audit row [django-parity] Fallback locales #425 flipped PARTIAL → SHIPPED; category 20 summary updated.

Adds `Translator::with_fallback_chain(&["pt", "es"])` so apps
can specify an ordered fallback path between the requested locale
(and its base language) and the default-locale terminus. Mirrors
Django's `LANGUAGE_CODE` + `LANGUAGES` fallback semantics.

Lookup order:
1. exact locale (e.g. fr-CA)
2. base language (fr)
3. explicit fallback_chain entries in declaration order
4. default_locale
5. the key itself

Duplicate entries and entries equal to default_locale are silently
dropped on insert. `Translator::fallback_chain()` exposes the
configured chain for diagnostics.

Three new inline tests cover order-walking, default-locale terminus,
and dedup behavior.
@ujeenet ujeenet merged commit 0027a98 into develop May 22, 2026
8 checks passed
@ujeenet ujeenet deleted the feat/django-parity-425-fallback-locales branch May 22, 2026 18:13
ujeenet added a commit that referenced this pull request May 23, 2026
## Summary

Rolls 11 PRs from \`develop\` into \`main\`.

## Features (5)
- **#507** \`i18n::middleware::LocaleMiddleware\` — tower layer (cookie
+ Accept-Language) + documented \`Router::nest(\"/<lang>\", ...)\`
pattern for URL-prefix locales. Closes #406, #424.
- **#508** \`Translator::with_fallback_chain(&[...])\` — explicit
fallback locale chain. Closes #425.
- **#509** \`notifications::slack::webhook_callback(url)\` — Slack
incoming-webhook provider for the \`broadcast\` channel. Closes #418.
Also bumps \`free-disk-space\` reclaim (\`large-packages: true\`).
- **#510** Notifications fix — gate the \`database\` channel behind the
\`postgres\` feature so non-PG builds compile.

## Refactor: executor reorg (#116, 7 PRs)
Pulled \`crates/rustango/src/sql/executor.rs\` (4830 LOC) apart into
\`crates/rustango/src/sql/executor/\` with 9 sibling files.

- **#511** Mount as dir.
- **#512** \`page.rs\` + \`iter.rs\` + \`get_or_create.rs\`.
- **#513** \`values.rs\` (Django \`.values()\` / \`.values_list()\`).
- **#514** \`atomic.rs\` (\`transaction.atomic\` + \`on_commit\`) +
\`tx.rs\` (\`PoolTx\`).
- **#515** \`explain.rs\` (tri-dialect \`EXPLAIN\`).
- **#516** \`prefetch.rs\` (tri-dialect \`_pool\` prefetch).
- **#517** \`row_to_json.rs\` (per-dialect dynamic row → JSON).

mod.rs is now at 2923 LOC (-1907, **-39%**). Zero public-API change
throughout — every symbol still reachable from \`use rustango::sql::*\`.

## Test plan
Every constituent PR landed with sqlite_litmus + sqlite_live +
mysql_live + postgres_test all green. The merge itself is a no-conflict
fast-forward — no new code lands beyond what's already merged into
develop. Re-running CI on the merged main confirms the integration
shape.
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