diff --git a/changelog.d/fixes/16649-pl-untranslated-ui-strings.md b/changelog.d/fixes/16649-pl-untranslated-ui-strings.md new file mode 100644 index 000000000000..cb2f687e12af --- /dev/null +++ b/changelog.d/fixes/16649-pl-untranslated-ui-strings.md @@ -0,0 +1 @@ +- **fix(i18n):** UI strings of the Polish locale were still English (the quota-share time windows, the Codex cooldown and paid credits, the proxy subscription core errors, the per-model concurrency caps, the request timeline labels); they are now translated with the wording of the neighbouring pl keys ([#16649](https://github.com/diegosouzapw/OmniRoute/pull/16649)) — thanks @pacocartones. diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 71bc50b20b24..565e8a158c17 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -5268,11 +5268,11 @@ } }, "providers": { - "codexReleaseCooldown": "Clear local cooldown", - "codexReleaseCooldownHint": "Allow this Codex account to be tried again. Does not redeem a reset credit or change upstream limits.", - "codexReleasingCooldown": "Clearing…", - "codexCooldownReleased": "Local cooldown cleared.", - "codexCooldownReleaseFailed": "Could not clear cooldown. Please try again.", + "codexReleaseCooldown": "Wyczyść lokalny cooldown", + "codexReleaseCooldownHint": "Pozwala ponownie spróbować użyć tego konta Codex. Nie wykorzystuje kredytu resetu i nie zmienia limitów upstream.", + "codexReleasingCooldown": "Czyszczenie…", + "codexCooldownReleased": "Lokalny cooldown wyczyszczony.", + "codexCooldownReleaseFailed": "Nie udało się wyczyścić cooldownu. Spróbuj ponownie.", "title": "Dostawcy", "Account Deactivated": "Konto dezaktywowane", "allProviders": "Wszystkie Providers", @@ -5543,7 +5543,7 @@ "modelsImported": "Zaimportowano {count} models", "allModelsAlreadyImported": "Wszystkie models zostały już zaimportowane", "noNewModelsToImport": "Brak nowych models do zaimportowania — wszystkie models znajdują się już w rejestrze lub na liście niestandardowych models", - "localCatalogFallbackStatus": "Couldn't reach the provider's model list — showing the built-in catalog", + "localCatalogFallbackStatus": "Nie udało się pobrać listy modeli dostawcy — wyświetlany jest wbudowany katalog", "skippingExistingModels": "Pomijanie {count} istniejących models", "autoSync": "Automatyczna synchronizacja", "autoSyncShort": "Synchronizuj", @@ -6729,16 +6729,16 @@ "searchByModelAria": "Szukaj według modelu", "selectSupportedEndpoint": "Wybierz przynajmniej jeden obsługiwany punkt końcowy", "antigravityClientProfileHarness": "Harness / CLI", - "rateLimitOverridesModelConcurrencyLabel": "Per-model concurrency caps", + "rateLimitOverridesModelConcurrencyLabel": "Limity współbieżności dla poszczególnych modeli", "rateLimitOverridesModelConcurrencyPlaceholder": "glm-5=1\nglm-4.7=3", - "rateLimitOverridesModelConcurrencyHint": "Optional: one model=cap per line, matched against the exact upstream model id. Queues excess requests locally; blank means no per-model cap.", - "rateLimitOverridesModelConcurrencyInvalid": "Invalid per-model concurrency entry \"{entry}\" — use model=cap with a whole number from 1 to {max}.", - "codexPaidCreditsShort": "Extra credits", - "codexPaidCreditsToggleTitle": "Allow paid Codex credits after subscription quota runs out (additional charges may apply)", - "codexPaidCreditsEnabled": "Codex paid credits enabled (additional charges may apply)", - "codexPaidCreditsDisabled": "Codex paid credits disabled", - "failedUpdateCodexPaidCredits": "Failed to update Codex paid-credit policy", - "allowCodexPaidCreditsLabel": "Allow paid Codex credits", + "rateLimitOverridesModelConcurrencyHint": "Opcjonalne: jeden wpis model=cap w wierszu, dopasowywany do dokładnego identyfikatora modelu upstream. Nadmiarowe żądania są kolejkowane lokalnie; puste oznacza brak limitu dla modelu.", + "rateLimitOverridesModelConcurrencyInvalid": "Nieprawidłowy wpis współbieżności dla modelu „{entry}” — użyj model=cap, gdzie cap jest liczbą całkowitą od 1 do {max}.", + "codexPaidCreditsShort": "Dodatkowe kredyty", + "codexPaidCreditsToggleTitle": "Zezwalaj na płatne kredyty Codex po wyczerpaniu limitu subskrypcji (mogą obowiązywać dodatkowe opłaty)", + "codexPaidCreditsEnabled": "Płatne kredyty Codex włączone (mogą obowiązywać dodatkowe opłaty)", + "codexPaidCreditsDisabled": "Płatne kredyty Codex wyłączone", + "failedUpdateCodexPaidCredits": "Nie udało się zaktualizować zasad płatnych kredytów Codex", + "allowCodexPaidCreditsLabel": "Zezwalaj na płatne kredyty Codex", "allowCodexPaidCreditsDescription": "Allow this account to use paid credits after its subscription quota reaches the cutoff. Requires available credits reported by OpenAI; may incur charges. Spark limits and upstream cooldowns still apply. Credit availability is checked even if quota preflight is disabled." }, "settings": { @@ -7089,10 +7089,10 @@ "NEEDS_CORE_NOT_CONFIGURED": "Ta subskrypcja zawiera węzły, które wymagają lokalnego rdzenia proxy (SS/VMess/Trojan/VLESS); nie są one trasowane, dopóki nie skonfigurujesz punktu końcowego SOCKS5 lokalnego rdzenia.", "NO_USABLE_NODES": "Subskrypcja nie zwróciła żadnych użytecznych węzłów (http/https/socks5 lub węzłów z punktem końcowym lokalnego rdzenia).", "SELECTOR_SWITCH_FAILED": "Wywołanie sterujące rdzenia proxy nie powiodło się; poprzednia trasa pozostaje aktywna. Sprawdź adres URL i sekret sterowania, a następnie odśwież.", - "CORE_CONFIG_NOT_GENERATED": "The local-core config was not generated; the adopted file is unchanged. Check the path and refresh.", + "CORE_CONFIG_NOT_GENERATED": "Konfiguracja lokalnego rdzenia nie została wygenerowana; przyjęty plik pozostał bez zmian. Sprawdź ścieżkę i odśwież.", "CORE_CONFIG_NOT_APPLIED": "Wygenerowana konfiguracja rdzenia nie mogła zastąpić przyjętego pliku; zamiast tego zachowano kopię obok.", - "CORE_RELOAD_UNDECLARED": "No reload channel is declared for the replaced core config. Declare one: a control URL on a compatible core, the OMNIROUTE_PROXY_CORE_RELOAD_COMMAND variable as a JSON argument array, or the value external for an outside observer.", - "CORE_RELOAD_FAILED": "The proxy core reload failed; the new config file stays in place. Check the reload command, then refresh.", + "CORE_RELOAD_UNDECLARED": "Dla zastąpionej konfiguracji rdzenia nie zadeklarowano kanału przeładowania. Zadeklaruj jeden: adres URL sterowania w zgodnym rdzeniu, zmienną OMNIROUTE_PROXY_CORE_RELOAD_COMMAND jako tablicę argumentów JSON albo wartość external dla zewnętrznego obserwatora.", + "CORE_RELOAD_FAILED": "Przeładowanie rdzenia proxy nie powiodło się; nowy plik konfiguracji pozostaje na miejscu. Sprawdź polecenie przeładowania, a następnie odśwież.", "CORE_CONFIG_ENTRIES_SKIPPED": "Niektóre wpisy zostały pominięte podczas generowania. Zobacz log serwera." }, "description": "Wklej link do subskrypcji proxy. Po włączeniu ruch jest kierowany przez pulę proxy w trybie globalnym lub regułowym (określony dostawca). Węzły subskrypcyjne są automatycznie synchronizowane z pulą proxy i ponownie wykorzystują istniejące mechanizmy odpytywania, sprawdzania stanu i zapobiegania wyciekom.", @@ -7180,17 +7180,17 @@ "lastSwitchMember": "Obsługujący element", "nextSwitch": "Następne możliwe przełączenie", "nextSwitchNow": "Teraz", - "coreConfigPath": "Core config file", + "coreConfigPath": "Plik konfiguracji rdzenia", "coreConfigPathPlaceholder": "/var/lib/omniroute/sing-box/config.json", - "coreConfigPathDesc": "Absolute .json path (lowercase extension). Empty = no generation. Each sync writes ''.generated beside the adopted file, never into it.", - "lastSwitchKind": "Switch reason", + "coreConfigPathDesc": "Bezwzględna ścieżka do pliku .json (rozszerzenie małymi literami). Puste = bez generowania. Każda synchronizacja zapisuje ''.generated obok przyjętego pliku, nigdy do niego.", + "lastSwitchKind": "Powód przełączenia", "switchKind": { - "ip_quota_429": "quota", - "proxy_unreachable": "unreachable", + "ip_quota_429": "limit", + "proxy_unreachable": "niedostępny", "transport": "transport", - "slow": "slow" + "slow": "wolny" }, - "coreReloadAppliedBy": "Applied by: {mode}", + "coreReloadAppliedBy": "Zastosowane przez: {mode}", "coreBinaryPath": "Ścieżka pliku binarnego rdzenia", "coreBinaryPathPlaceholder": "/usr/bin/sing-box", "coreBinaryPathHelp": "Opcjonalne: weryfikuje wygenerowany plik plikiem binarnym rdzenia przed zastąpieniem przyjętego pliku. Pozostaw puste, aby nadal zapisywać obok niego. Katalog zostanie utworzony, jeśli nie istnieje." @@ -10123,10 +10123,10 @@ "lastRefreshed": "Ostatnio odświeżono", "providerQuota": "Limit dostawcy", "providerQuotaHomeHint": "Status na żywo na połączonych kontach", - "codexPaidCreditsLabel": "Paid Codex credits", - "codexPaidCreditsAvailable": "Available (balance not reported)", - "codexPaidCreditsUnavailable": "Unavailable or spending limit reached", - "codexPaidCreditsUnlimited": "Unlimited" + "codexPaidCreditsLabel": "Płatne kredyty Codex", + "codexPaidCreditsAvailable": "Dostępne (saldo nie jest raportowane)", + "codexPaidCreditsUnavailable": "Niedostępne lub osiągnięto limit wydatków", + "codexPaidCreditsUnlimited": "Bez limitu" }, "modals": { "waitingAuth": "Oczekiwanie na autoryzację", @@ -12147,33 +12147,33 @@ "accountQuotaNone": "—", "logTitle": "Dziennik użycia", "logEmpty": "Brak użycia", - "schedulesTitle": "Time windows", - "schedulesHint": "Say when OmniRoute may use these accounts, and how much it may take. Allow windows act as a whitelist: add one and the pool is closed outside it. A block window is a blackout and always wins over an allow window it overlaps.", - "schedulesEmpty": "No time windows — the pool is available around the clock", - "schedulesAdd": "Add window", - "schedulesRemove": "Remove window", - "schedulesEnabled": "Window enabled", - "schedulesMode": "Window type", - "schedulesModeAllow": "Allow", - "schedulesModeBlock": "Block", - "schedulesFrom": "From", - "schedulesTo": "To", - "schedulesReserve": "Keep free", - "schedulesReserveHint": "Stop using the account once less than this share of a quota window is left. Counts everyone's usage, so someone else working on the same account pushes OmniRoute out first. Add one floor per window: a weekly reserve that protects the whole week would throttle every short burst if it also governed the 5h window.", - "schedulesReserveNone": "no floor — OmniRoute may use the account down to empty", - "schedulesReserveAdd": "Add floor", - "schedulesReserveRemove": "Remove floor", - "schedulesReserveWindow": "Quota window this floor guards", - "schedulesReserveWindowAny": "any window", - "schedulesBudget": "OmniRoute budget", - "schedulesBudgetHint": "How much OmniRoute itself may spend in this window. Counts only its own traffic, so usage by anyone else neither eats nor inflates it.", - "schedulesBudgetUnit": "Budget unit", - "schedulesBudgetWindow": "Budget window", - "schedulesTimezone": "Time zone", - "schedulesPriority": "Priority", - "schedulesSaved": "Time windows saved", - "schedulesSaveError": "Could not save the time windows", - "schedulesLoadError": "Could not load the time windows", + "schedulesTitle": "Okna czasowe", + "schedulesHint": "Określ, kiedy OmniRoute może używać tych kont i ile może zużyć. Okna zezwalające działają jak biała lista: po dodaniu jednego pula jest zamknięta poza nim. Okno blokujące to przerwa w działaniu i zawsze wygrywa z nakładającym się oknem zezwalającym.", + "schedulesEmpty": "Brak okien czasowych — pula jest dostępna przez całą dobę", + "schedulesAdd": "Dodaj okno", + "schedulesRemove": "Usuń okno", + "schedulesEnabled": "Okno włączone", + "schedulesMode": "Typ okna", + "schedulesModeAllow": "Zezwalaj", + "schedulesModeBlock": "Blokuj", + "schedulesFrom": "Od", + "schedulesTo": "Do", + "schedulesReserve": "Zostaw wolne", + "schedulesReserveHint": "Przestań używać konta, gdy w oknie limitu zostanie mniej niż ten udział. Liczy się użycie wszystkich, więc jeśli ktoś inny pracuje na tym samym koncie, OmniRoute wycofa się jako pierwszy. Dodaj jeden próg na okno: tygodniowa rezerwa chroniąca cały tydzień dławiłaby każdy krótki szczyt, gdyby obejmowała też okno 5-godzinne.", + "schedulesReserveNone": "brak progu — OmniRoute może zużyć konto do zera", + "schedulesReserveAdd": "Dodaj próg", + "schedulesReserveRemove": "Usuń próg", + "schedulesReserveWindow": "Okno limitu chronione przez ten próg", + "schedulesReserveWindowAny": "dowolne okno", + "schedulesBudget": "Budżet OmniRoute", + "schedulesBudgetHint": "Ile samo OmniRoute może wydać w tym oknie. Liczy tylko własny ruch, więc użycie przez innych ani go nie zużywa, ani nie zwiększa.", + "schedulesBudgetUnit": "Jednostka budżetu", + "schedulesBudgetWindow": "Okno budżetu", + "schedulesTimezone": "Strefa czasowa", + "schedulesPriority": "Priorytet", + "schedulesSaved": "Zapisano okna czasowe", + "schedulesSaveError": "Nie udało się zapisać okien czasowych", + "schedulesLoadError": "Nie udało się wczytać okien czasowych", "groupLabel": "Grupa", "newGroup": "Nowa grupa", "renameGroup": "Zmień nazwę grupy", @@ -14635,11 +14635,11 @@ "day": "dzień", "unknownModel": "nieznany", "pending": "oczekujące", - "allApiKeys": "All API keys", + "allApiKeys": "Wszystkie klucze API", "mcp": "MCP", - "mcpTool": "MCP tool", - "scope": "Scope", - "apiKey": "API key" + "mcpTool": "Narzędzie MCP", + "scope": "Zakres", + "apiKey": "Klucz API" }, "metadata": { "compressionTitle": "Kompresja",