diff --git a/CHANGELOG.md b/CHANGELOG.md index 11bef1abe..4a4d80fb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -97,6 +97,12 @@ Thanks to everyone whose work landed in v3.8.47: --- +### 🐛 Bug Fixes + +- **fix(i18n):** the provider-detail (`/dashboard/providers/[id]`) visibility + free/paid model filter labels (`showVisibleOnly`, `showHiddenOnly`, `freeFilterAll`, `freeFilterFreeOnly`, `freeFilterPaidOnly`, `hideAllModels`, plus the currently-unused `filterVisible`/`filterHidden`/`filterByVisibility`) rendered as the literal `__MISSING__:` sentinel in 15 locales, including pt-BR ([#6694](https://github.com/diegosouzapw/OmniRoute/issues/6694)) — `providerText()` (`providerPageHelpers.ts`) checks `t.has(key)` before falling back to clean English, and `t.has()` returns `true` even when the stored value is the `__MISSING__:` sentinel `scripts/i18n/sync-ui-keys.mjs` writes when mirroring keys across locales, so the sentinel rendered verbatim instead of the fallback. Disjoint key set from #6290 (`filterAll`/`filterActive`/`filterError`/`filterBanned`/`filterCreditsExhausted`). All 9 keys now carry real translations across the 15 affected locale files (`it`, `ja`, `ko`, `mr`, `ms`, `nl`, `no`, `phi`, `pl`, `pt`, `pt-BR`, `ro`, `ru`, `sk`, `sv`). Regression guard: `tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts`. + +--- + ## [3.8.46] — 2026-07-07 ### ✨ New Features diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index a42125799..19f5df65a 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -3988,13 +3988,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Solo visibili", + "freeFilterAll": "Tutti", + "freeFilterFreeOnly": "Solo gratuiti", + "freeFilterPaidOnly": "Solo a pagamento", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Solo nascosti", + "filterByVisibility": "Filtra per visibilità", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Connesso", @@ -4003,8 +4003,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Tutti", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Solo visibili", + "filterHidden": "Solo nascosti", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Attenzione", "noConnections": "Nessuna connessione", @@ -4172,7 +4172,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Nascondi tutti", "modelsActive": "attivi", "showModel": "Mostra modello", "hideModel": "Nascondi modello", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 2916c859c..84a4b2e88 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "表示のみ", + "freeFilterAll": "すべて", + "freeFilterFreeOnly": "無料のみ", + "freeFilterPaidOnly": "有料のみ", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "非表示のみ", + "filterByVisibility": "表示状態で絞り込み", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} 接続されました", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "すべて", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "表示のみ", + "filterHidden": "非表示のみ", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} 警告", "noConnections": "接続がありません", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "すべて非表示", "modelsActive": "有効", "showModel": "モデルを表示", "hideModel": "モデルを非表示", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 95dc29e1d..0fd5de9cd 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "표시된 항목만", + "freeFilterAll": "전체", + "freeFilterFreeOnly": "무료만", + "freeFilterPaidOnly": "유료만", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "숨겨진 항목만", + "filterByVisibility": "표시 여부로 필터링", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} 연결됨", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "전체", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "표시된 항목만", + "filterHidden": "숨겨진 항목만", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} 경고", "noConnections": "연결 없음", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "모두 숨기기", "modelsActive": "활성", "showModel": "모델 표시", "hideModel": "모델 숨기기", diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index de8621ab0..54c1008d3 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "फक्त दृश्यमान", + "freeFilterAll": "सर्व", + "freeFilterFreeOnly": "फक्त मोफत", + "freeFilterPaidOnly": "फक्त सशुल्क", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "फक्त लपवलेले", + "filterByVisibility": "दृश्यमानतेनुसार फिल्टर करा", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Connected", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "सर्व", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "फक्त दृश्यमान", + "filterHidden": "फक्त लपवलेले", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} चेतावणी", "noConnections": "No connections", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "सर्व लपवा", "modelsActive": "Active", "showModel": "Show model", "hideModel": "Hide model", diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index bb1c3d7c3..f62546e33 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Kelihatan sahaja", + "freeFilterAll": "Semua", + "freeFilterFreeOnly": "Percuma sahaja", + "freeFilterPaidOnly": "Berbayar sahaja", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Tersembunyi sahaja", + "filterByVisibility": "Tapis mengikut keterlihatan", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Disambungkan", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Semua", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Kelihatan sahaja", + "filterHidden": "Tersembunyi sahaja", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Amaran", "noConnections": "Tiada sambungan", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Sembunyikan semua", "modelsActive": "aktif", "showModel": "Tunjukkan model", "hideModel": "Sembunyikan model", diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index b9b0d5af2..fba50a4dc 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Alleen zichtbaar", + "freeFilterAll": "Alle", + "freeFilterFreeOnly": "Alleen gratis", + "freeFilterPaidOnly": "Alleen betaald", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Alleen verborgen", + "filterByVisibility": "Filteren op zichtbaarheid", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Verbonden", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Alle", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Alleen zichtbaar", + "filterHidden": "Alleen verborgen", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Waarschuwing", "noConnections": "Geen verbindingen", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Alles verbergen", "modelsActive": "actief", "showModel": "Model tonen", "hideModel": "Model verbergen", diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index a2801707e..3c9b0a24b 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Kun synlige", + "freeFilterAll": "Alle", + "freeFilterFreeOnly": "Kun gratis", + "freeFilterPaidOnly": "Kun betalte", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Kun skjulte", + "filterByVisibility": "Filtrer etter synlighet", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Tilkoblet", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Alle", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Kun synlige", + "filterHidden": "Kun skjulte", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Advarsel", "noConnections": "Ingen tilkoblinger", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Skjul alle", "modelsActive": "aktive", "showModel": "Vis modell", "hideModel": "Skjul modell", diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index 8d3f43923..19369618f 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Nakikita lang", + "freeFilterAll": "Lahat", + "freeFilterFreeOnly": "Libre lang", + "freeFilterPaidOnly": "Bayad lang", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Nakatago lang", + "filterByVisibility": "I-filter ayon sa pagkakita", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Nakakonekta", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Lahat", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Nakikita lang", + "filterHidden": "Nakatago lang", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Babala", "noConnections": "Walang koneksyon", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Itago lahat", "modelsActive": "aktibo", "showModel": "Ipakita ang modelo", "hideModel": "Itago ang modelo", diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index f87bd5c1e..6ef4a7676 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Tylko widoczne", + "freeFilterAll": "Wszystkie", + "freeFilterFreeOnly": "Tylko darmowe", + "freeFilterPaidOnly": "Tylko płatne", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Tylko ukryte", + "filterByVisibility": "Filtruj według widoczności", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Połączono", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Wszystkie", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Tylko widoczne", + "filterHidden": "Tylko ukryte", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Ostrzeżenie", "noConnections": "Brak połączeń", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Ukryj wszystkie", "modelsActive": "aktywne", "showModel": "Pokaż model", "hideModel": "Ukryj model", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index dbf0fb0ee..eb7666a1a 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Somente visíveis", + "freeFilterAll": "Todos", + "freeFilterFreeOnly": "Somente gratuitos", + "freeFilterPaidOnly": "Somente pagos", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Somente ocultos", + "filterByVisibility": "Filtrar por visibilidade", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Conectado(s)", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Todos", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Somente visíveis", + "filterHidden": "Somente ocultos", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Aviso", "noConnections": "Sem conexões", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Selecionar todos", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Ocultar todos", "modelsActive": "ativos", "showModel": "Mostrar modelo", "hideModel": "Ocultar modelo", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index f54e987b5..b529e5637 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Apenas visíveis", + "freeFilterAll": "Todos", + "freeFilterFreeOnly": "Apenas gratuitos", + "freeFilterPaidOnly": "Apenas pagos", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Apenas ocultos", + "filterByVisibility": "Filtrar por visibilidade", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Conectado", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Todos", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Apenas visíveis", + "filterHidden": "Apenas ocultos", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Aviso", "noConnections": "Sem conexões", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Selecionar todos", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Ocultar todos", "modelsActive": "ativos", "showModel": "Mostrar modelo", "hideModel": "Ocultar modelo", diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 2d87bda06..9010ed140 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Doar vizibile", + "freeFilterAll": "Toate", + "freeFilterFreeOnly": "Doar gratuite", + "freeFilterPaidOnly": "Doar plătite", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Doar ascunse", + "filterByVisibility": "Filtrează după vizibilitate", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Conectat", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Toate", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Doar vizibile", + "filterHidden": "Doar ascunse", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Avertisment", "noConnections": "Fără conexiuni", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Ascunde tot", "modelsActive": "active", "showModel": "Afișează modelul", "hideModel": "Ascunde modelul", diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index c1233276f..9ebc7f3a5 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Только видимые", + "freeFilterAll": "Все", + "freeFilterFreeOnly": "Только бесплатные", + "freeFilterPaidOnly": "Только платные", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Только скрытые", + "filterByVisibility": "Фильтр по видимости", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} подключено", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Все", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Только видимые", + "filterHidden": "Только скрытые", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Предупреждение", "noConnections": "Нет соединений", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Скрыть все", "modelsActive": "активные", "showModel": "Показать модель", "hideModel": "Скрыть модель", diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index 64f6ce123..fa886993d 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Len viditeľné", + "freeFilterAll": "Všetky", + "freeFilterFreeOnly": "Len bezplatné", + "freeFilterPaidOnly": "Len platené", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Len skryté", + "filterByVisibility": "Filtrovať podľa viditeľnosti", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Pripojené", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Všetky", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Len viditeľné", + "filterHidden": "Len skryté", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Upozornenie", "noConnections": "Žiadne spojenia", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Skryť všetky", "modelsActive": "aktívne", "showModel": "Zobraziť model", "hideModel": "Skryť model", diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 1ca536672..a6d1eb089 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -3960,13 +3960,13 @@ "testAllResults": "__MISSING__:{ok} of {total} models working", "noModelsToTest": "__MISSING__:No models match the current filter", "showAllModels": "__MISSING__:All", - "showVisibleOnly": "__MISSING__:Visible only", - "freeFilterAll": "__MISSING__:All", - "freeFilterFreeOnly": "__MISSING__:Free only", - "freeFilterPaidOnly": "__MISSING__:Paid only", + "showVisibleOnly": "Endast synliga", + "freeFilterAll": "Alla", + "freeFilterFreeOnly": "Endast gratis", + "freeFilterPaidOnly": "Endast betalda", "sortFreeFirst": "__MISSING__:Free first", - "showHiddenOnly": "__MISSING__:Hidden only", - "filterByVisibility": "__MISSING__:Filter by visibility", + "showHiddenOnly": "Endast dolda", + "filterByVisibility": "Filtrera efter synlighet", "autoHideFailed": "__MISSING__:Auto-hide failed models", "autoHideFailedHint": "__MISSING__:When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", "connected": "{count} Ansluten", @@ -3975,8 +3975,8 @@ "testAllCompleted": "__MISSING__:Tested {total} models: {ok} OK, {failed} failed", "modelAutoHidden": "__MISSING__:Model {model} auto-hidden (test failed)", "filterAll": "Alla", - "filterVisible": "__MISSING__:Visible only", - "filterHidden": "__MISSING__:Hidden only", + "filterVisible": "Endast synliga", + "filterHidden": "Endast dolda", "modelsHiddenCount": "__MISSING__:{count} hidden", "warningCount": "{count} Varning", "noConnections": "Inga anslutningar", @@ -4144,7 +4144,7 @@ "testAllRateLimited": "__MISSING__:Rate limit reached, stopped early", "hideFailedAuto": "__MISSING__:Auto-hide failed models", "selectAllModels": "Select all", - "hideAllModels": "__MISSING__:Hide all", + "hideAllModels": "Dölj alla", "modelsActive": "aktiva", "showModel": "Visa modell", "hideModel": "Dölj modell", diff --git a/tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts b/tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts new file mode 100644 index 000000000..57041bd9a --- /dev/null +++ b/tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts @@ -0,0 +1,66 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { readdirSync, readFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +/** + * Regression guard for #6694. + * + * On the provider detail page the visibility + free/paid filter row + * (`providers.filterVisible/filterHidden/freeFilterAll/freeFilterFreeOnly/ + * freeFilterPaidOnly/showVisibleOnly/showHiddenOnly/filterByVisibility/ + * hideAllModels`) rendered as the literal `__MISSING__:` sentinel in + * 15 locales (including pt-BR) because those keys were mirrored by + * scripts/i18n/sync-ui-keys.mjs but never translated. + * + * This is a DISJOINT key set from #6290 (filterAll/filterActive/filterError/ + * filterBanned/filterCreditsExhausted, guarded by + * tests/unit/i18n-provider-filter-keys-6290.test.ts). + */ + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const MESSAGES_DIR = path.resolve(__dirname, "..", "..", "src", "i18n", "messages"); +const PLACEHOLDER_PREFIX = "__MISSING__:"; +const FILTER_KEYS = [ + "filterVisible", + "filterHidden", + "freeFilterAll", + "freeFilterFreeOnly", + "freeFilterPaidOnly", + "showVisibleOnly", + "showHiddenOnly", + "filterByVisibility", + "hideAllModels", +] as const; + +function localeFiles(): string[] { + return readdirSync(MESSAGES_DIR) + .filter((f) => f.endsWith(".json")) + .sort(); +} + +test("every shipped locale has real (non-__MISSING__) providers visibility filter labels (#6694)", () => { + const offenders: string[] = []; + + for (const file of localeFiles()) { + const locale = file.replace(/\.json$/, ""); + const json = JSON.parse(readFileSync(path.join(MESSAGES_DIR, file), "utf8")); + const providers = json.providers ?? {}; + + for (const key of FILTER_KEYS) { + const value = providers[key]; + // Absent is harmless here (t.has() is false -> clean English fallback fires). + if (value === undefined || value === null) continue; + if (typeof value === "string" && value.startsWith(PLACEHOLDER_PREFIX)) { + offenders.push(`${locale}: providers.${key} is sentinel "${value}"`); + } + } + } + + assert.equal( + offenders.length, + 0, + `Untranslated provider visibility filter labels (#6694 regression):\n${offenders.join("\n")}` + ); +});