## opendatadiscovery/odd-platform — 0.27.13…0.28.0

_31 commits._

### Features
- **feat(i18n): wrap tab/menu/status LABEL literals defined in TS object arrays (#1751 / PLT-205 wave 3)** (408cf03)
- **feat(i18n): wrap the remaining hardcoded attribute strings + deterministic guard (#1751 / PLT-205 wave 2)** (6392017)
- **feat(i18n): wrap all hardcoded user-facing strings in t() + add a no-literal-string guard (#1751 / PLT-205)** (6036c49)
- **feat(i18n): complete + translate all seven locale catalogs to parity (#1751)** (fcf1b15)

### Fixes
- **fix(search): escape tsquery operators in JooqFTSHelper.tsQuery (#1756) (#1788)** (f9d2063)
- **fix(ui): DQ test severity - confirm-gate the edit + stop the sibling-test render bleed (#1750) (#1786)** (1f32deb)
- **fix(i18n): correct wrong/untranslated catalog values — "Term" mistranslated as "condition" + untranslated leftovers (#1751 quality pass)** (ce457e1)
- **fix(i18n): language switcher shows only English (PLT-226 / #1783 regression)** (586ac8d)
- **fix(attachment): make the REMOTE S3 region configurable via attachment.remote.region (#1784)** (09f0624)
- **fix(i18n): stop foreign-language fallback leak; complete en.json; add key-parity guard (#1783)** (9c6fb07)
- **fix(data-quality): relabel the DQ dashboard "Title" filter to "Owner title" (#1767) (#1782)** (3e182fc)
- **fix(activity): make the Activity feed's User vs Owner distinction explicit (#1657) (#1780)** (697a3b3)
- **fix(api): null-guard class-specific details DTOs in DataEntityMapperImpl - a partially-ingested entity no longer 500s search results + entity detail (#1755) (#1779)** (05ecf0a)
- **fix(build): springdoc-openapi 2.2.0 -> 2.8.17 - revive the OpenAPI/Swagger surface dead since the Spring 6.2 upgrade (#1777)** (3f02dd6)
- **fix(tags): listMostPopular aggregates usage before paginating - most-popular, not oldest-by-id (#1773 Thread A) (#1775)** (7f905a5)
- **fix(search): load deep-linked sessions, graceful expired state, pass framework error statuses through the advice (#1771)** (39b54ee)
- **fix(ui): count one view per detail-page open — drop the response-derived useEffect dep (#1770)** (026fd3f)
- **fix(ui): add i18n keys for the Data Quality / Data Modelling / Master Data toolbar tabs (#1749)** (8c142e1)
- **fix(terms): aggregate linked terms' namespaces, not the parent's, in term details (#1747)** (fbb2eb4)
- **fix(activity): de-duplicate tag+owner filtered feed via EXISTS semi-joins (#1745)** (921e8c9)

### Backend
- **Merge commit from fork** (e67461d)
- **Merge commit from fork** (f1170c5)
- **Merge commit from fork** (b046bf3)
- **Merge commit from fork** (3552cd6)
- **Update maintenance badge reference (#1778)** (cc248ba)
- **feat brazilian portuguese translation (#1564)** (8b0155f)
- **Relationships hardening: Target column renders the target; default visibility predicates; ?type= fallback; graph detail labels; relationship_id contract in the spec (#1752) (#1772)** (6f356b7)
- **Test/adr enforcement units (#1743)** (7f5ea17)

### Tests
- **test(search): happy-path unit coverage for catalog search suggestions + results (#1789)** (cebb512)
- **test: regression pins for LSN-001 (attachment ephemeral) + LSN-002 (m… (#1742)** (2febc79)

### Docs
- **docs(ui): remove unresolvable workspace-internal refs from SelectableSeverity comments (#1787)** (19618ea)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/opendatadiscovery/odd-platform?utm_source=github-action)._