feat(i18n): complete message parity across all 25 locales
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s

The admin.studio.nitroCleanup section (102 keys) only existed in en and
nl, so 23 locales fell back to English for the entire Nitro Cleanup
panel. The referrals and dailyRewards keys were missing from the same
23 locales, and en itself was missing 6 keys that nl had.

Add the missing keys to every locale with translations, so all 25
locales now carry the same 6063 keys.
This commit is contained in:
openhands committed 2026-09-27 18:38:58 +02:00
1 parent 944527e078
commit bc00ecf08c
24 files changed
+4483 -182

No files matched your search

+195 -8
View File
@@ -818,8 +818,8 @@
"rateLimit": "Too many attempts. Please wait before trying again."
},
"title": "Połączone konta",
"subtitle": "Połącz konto społecznościowe, aby móc zalogować się jednym kliknięciem",
"connected": "Połączono",
"subtitle": "Połącz konto społecznościowe, aby zalogować się jednym kliknięciem",
"connected": "Połączone",
"unavailable": "Niedostępne",
"login": {
"title": "Zaloguj się",
@@ -882,7 +882,9 @@
"hidePassword": "Hide",
"accountDetails": "Account details",
"credentials": "Credentials & security",
"newestCitizens": "Newest citizens"
"newestCitizens": "Newest citizens",
"ageVerified": "Mam 18+ i akceptuję wymóg wieku.",
"invitedBy": "Zaproszony przez {username}"
},
"forgot": {
"title": "Zresetuj hasło",
@@ -1048,7 +1050,9 @@
"cmsErrors": "CMS errors",
"themeBuilder": "Theme builder",
"openSidebar": "Open menu",
"closeSidebar": "Close menu"
"closeSidebar": "Close menu",
"referrals": "Polecenia",
"dailyRewards": "Codzienne nagrody"
},
"dashboard": {
"title": "Pulpit nawigacyjny",
@@ -1255,7 +1259,7 @@
"delete": "Usuń",
"noAds": "Nie ma jeszcze reklam",
"confirmDelete": "Usunąć tę reklamę?",
"colId": "Identyfikator",
"colId": "ID",
"colName": "Imię",
"colImage": "Obraz",
"colUrl": "Adres URL",
@@ -4336,7 +4340,9 @@
"importAudit": "Audit",
"themeBuilder": "Theme Builder",
"studio": "Studio",
"cmsErrors": "CMS errors"
"cmsErrors": "CMS errors",
"referrals": "Polecenia",
"dailyRewards": "Codzienne nagrody"
},
"events": "Events",
"eventsSubtitle": "Hotel events and event types",
@@ -5843,6 +5849,64 @@
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
"Rename": "Rename"
}
},
"referrals": {
"title": "Polecenia",
"subtitle": "System zaproszeń",
"referralsToday": "Polecenia dzisiaj",
"referralsTotal": "Wszystkie polecenia",
"invitedTotal": "Zliczone zaproszenia",
"claims": "Odebrane nagrody",
"settings": "Ustawienia nagrody",
"needed": "Potrzebne polecenia",
"rewardAmount": "Kwota nagrody",
"rewardCurrency": "Waluta nagrody",
"blockSameIp": "Odrzuć polecenia współdzielące aktualny IP zapraszającego",
"save": "Zapisz ustawienia",
"saving": "Zapisywanie…",
"saved": "Ustawienia poleceń zapisane.",
"saveError": "Ustawienia poleceń nie mogły zostać zapisane.",
"recent": "Ostatnie polecenia",
"unavailable": "Dane o poleceniach są tymczasowo niedostępne.",
"empty": "Brak poleceń.",
"inviter": "Zapraszający",
"invitee": "Zaproszony użytkownik",
"ip": "IP",
"date": "Data"
},
"dailyRewards": {
"title": "Codzienne nagrody za logowanie",
"subtitle": "Harmonogram codziennych nagród za logowanie",
"enabled": "Status funkcji",
"yes": "Włączone",
"no": "Wyłączone",
"scheduleDays": "Dni harmonogramu",
"claimsToday": "Odbiory dzisiaj",
"claimsTotal": "Wszystkie odbiory",
"status": "Status funkcji",
"statusHint": "Po wyłączeniu karta nagrody jest ukrywana, a nowe odbiory są odrzucane.",
"disable": "Wyłącz",
"enable": "Włącz",
"schedule": "Harmonogram nagród",
"day": "Dzień {day}",
"reward": "Nagroda",
"amount": "Kwota",
"actions": "Akcje",
"addDay": "Dzień",
"add": "Dodaj dzień",
"save": "Zapisz",
"saving": "Zapisywanie…",
"saved": "Harmonogram nagród zapisany.",
"cancel": "Anuluj",
"edit": "Edytuj",
"delete": "Usuń",
"created": "Dzień nagrody dodany.",
"updated": "Dzień nagrody zaktualizowany.",
"deleted": "Dzień nagrody usunięty.",
"saveError": "Dzień nagrody nie mógł zostać zapisany.",
"deleteError": "Dzień nagrody nie mógł zostać usunięty.",
"confirmDeleteTitle": "Usuń dzień nagrody",
"confirmDeleteBody": "Ten dzień nagrody nie będzie już przyznawany. Wcześniejsze odbiory pozostają zapisane."
}
},
"error": {
@@ -6223,8 +6287,27 @@
"empty": "You're all caught up. No actions waiting.",
"unavailable": "Some actions could not be checked. Available actions are shown above.",
"retry": "Try again",
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again."
}
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.",
"dailyReward": "Twoja codzienna nagrada jest gotowa do odebrania"
},
"dailyClaimed": "Codzienna nagrada odebrana — do jutra!",
"dailyErrors": {
"already_claimed": "Odebrałeś już dzisiejszą codzienną nagrodę.",
"disabled": "Codzienne nagrody są obecnie wyłączone.",
"bad_config": "Harmonogram codziennych nagród nie jest poprawnie skonfigurowany. Skontaktuj się z personelem.",
"ratelimit": "Zbyt wiele prób. Poczekaj chwilę i spróbuj ponownie.",
"error": "Codzienna nagrada nie mogła zostać odebrana. Spróbuj ponownie."
},
"dailyRewardTitle": "Codzienne nagrody",
"dailyRewardHint": "Loguj się każdego dnia i odbieraj nagrodę — serie rosną do wielkich dni.",
"dailyRewardDay": "Dzień {day}",
"dailyRewardStreak": "{count, plural, one {Seria: # dzień} few {Seria: # dni} many {Seria: # dni} other {Seria: # dnia}}",
"dailyRewardNextClaim": "Następny odbiór: {amount} {currency}",
"dailyRewardTomorrow": "Jutro: {amount} {currency}",
"dailyRewardClaim": "Odbierz codzienną nagrodę",
"dailyRewardClaimedToday": "Odebrano dzisiaj — wróć jutro po następną nagrodę.",
"dailyRewardDisabled": "Codzienne nagrody są obecnie wyłączone. Możesz zwiedzać hotel.",
"dailyRewardUnavailable": "Harmonogram codziennych nagród nie mógł zostać załadowany. Spróbuj ponownie."
},
"housekeeping": {
"preview": {
@@ -6502,6 +6585,110 @@
},
"admin": {
"studio": {
"nitroCleanup": {
"alreadyRunning": "Skanowanie już trwa — połączono z nim.",
"ageUnknown": "wiek nieznany",
"ageBelow": "< 1d",
"scanButton": "Skanuj zasoby mebli",
"scanningAssets": "Skanowanie zasobów…",
"cancelButton": "Anuluj",
"deleteSelected": "Usuń wybrane ({count})",
"deleting": "Usuwanie…",
"redownloadBroken": "Pobierz ponownie uszkodzone",
"redownloading": "Pobieranie ponowne…",
"autoClean": "Automatycznie czyści stare fałszywe",
"cleaning": "Czyszczenie…",
"exportManifest": "Eksportuj manifest",
"exporting": "Eksportowanie…",
"phaseStems": "Ładowanie łodyg mebli…",
"phaseReaddir": "Odczyt katalogów zasobów…",
"phaseValidate": "Walidacja paczek .nitro…",
"phaseScanning": "Skanowanie…",
"scanProgressFiles": "{count} plików",
"repairProgress": "ok {ok}, nieudane {failed}",
"attachedNotice": "Skanowanie trwa w tle — wyniki pojawią się po zakończeniu.",
"sessionCancelled": "Skanowanie anulowane.",
"onlyOldLabel": "Pokaż tylko pliki starsze niż",
"onlyOldAgeLabel": "Minimalny wiek w dniach do wyświetlenia",
"onlyOldToggle": "Ukryj ostatnie pliki",
"daysLabel": "dni",
"autoAgeLabel": "Minimalny wiek w dniach do automatycznego czyszczenia",
"loadingResult": "Ładowanie wyniku skanowania…",
"scannedStat": "zeskanowane pliki zasobów",
"cachedNotice": "(w pamięci podręcznej — katalogi się nie zmieniły)",
"fakeStat": "Fałszywe nitro (brak pasującego elementu)",
"brokenStat": "Uszkodzone nitro (nie do odczytu)",
"groupEmpty": "Nic nie znaleziono",
"selectedCount": "wybrano {count}",
"copiesBadge": "{count} kopii",
"groupFakeLabel": "Fałszywe nitro",
"groupFakeDescription": "Te pliki nie pasują do żadnego elementu w items_base — resztki usuniętych lub zmienionych mebli.",
"groupBrokenLabel": "Uszkodzone nitro",
"groupBrokenDescription": "Te pliki należą do elementu, ale nie można ich odczytać jako prawidłowej paczki Nitro.",
"groupSwfLabel": "Osierocone pliki SWF",
"groupSwfDescription": "Pliki .swf, które nie pasują do żadnego elementu w items_base.",
"groupIconLabel": "Osierocone ikony",
"groupIconDescription": "Pliki ikon, które nie pasują do żadnego elementu w items_base.",
"warningText": "Usunięcie uszkodzonego .nitro zostawia element w bazie bez paczki — wolej pobrać ponownie, niech audyt katalogu go uzyska później. Wiersze bazy nigdy nie są usuwane przez to narzędzie.",
"onlyAssetsTouched": "Tylko pliki zasobów są zmieniane — FurnitureData.json i wiersze bazy pozostają nietknięte.",
"emptyHint": "Przeskanuj każdy katalog zasobów mebli, aby znaleźć fałszywe i uszkodzone paczki nitro oraz osierocone pliki SWF i ikony. Usuń je, pobierz ponownie uszkodzone lub automatycznie wyczyść stare resztki.",
"noResult": "Brak wyniku skanowania — uruchom najpierw skanowanie zasobów mebli.",
"scanFailed": "Skanowanie nie powiodło się.",
"confirmDeleteTitle": "Usunąć {count} plik(ów) zasobów?",
"confirmDeleteDescription": "Pliki zostaną usunięte z każdego katalogu (public + lustrzane gamedata). Wiersze bazy nigdy nie są zmieniane.",
"confirmDeleteLabel": "Usuń",
"confirmRepairTitle": "Pobrać ponownie {count} uszkodzoną(e) paczkę(i) .nitro?",
"confirmRepairDescription": "Paczki zostaną pobrane ponownie ze skonfigurowanych źródeł nitro i nadpisane w każdym katalogu (public + lustrzane gamedata).",
"confirmRepairLabel": "Pobierz ponownie",
"confirmAutoCleanTitle": "Automatycznie wyczyścić fałszywe nitro starsze niż {days} dni?",
"confirmAutoCleanDescription": "Usuwane są tylko fałszywe pliki .nitro (brak pasującego elementu) starsze niż próg. Uszkodzone paczki i ostatnie pliki nigdy nie są zmieniane.",
"confirmAutoCleanLabel": "Wyczyść automatycznie",
"toastDeletePartial": "Usunięto {copies} kopii, ale niektórych plików nie można usunąć",
"toastDeleteDone": "Usunięto {copies} kopii plików ({deleted} plików)",
"toastRepairDone": "Naprawiono {count} paczek .nitro",
"toastRepairFailed": "Nie można uzyskać żadnej paczki ({failed} nieudanych)",
"toastRepairCancelled": "Naprawa anulowana",
"toastAutoCleanDone": "Wyczyszczono {deleted} starych fałszywych plików .nitro ({copies} kopii). Pominięto {recent} ostatnich + {broken} uszkodzonych.",
"toastAutoCleanNothing": "Nic na tyle starego do usunięcia (pominięto {recent} ostatnich, {broken} uszkodzonych)",
"toastManifestDownload": "Manifest skanowania pobrany",
"gamedataTitle": "Czyszczenie danych gry",
"gamedataHint": "Najpierw podgląd: to nadpisuje FurnitureData.json, FigureMap.json i FigureData.json. W przeciwieństwie do narzędzi zasobów powyżej usuwa wiersze, które nic nie odwołują — sprawdź liczby przed uruchomieniem.",
"gamedataScan": "Podgląd danych gry",
"gamedataScanning": "Skanowanie…",
"gamedataRun": "Uruchom wybrane",
"gamedataRunning": "Czyszczenie…",
"gamedataNoResult": "Brak podglądu — najpierw zeskanuj pliki JSON danych gry.",
"gamedataCount_duplicates": "Duplikaty FurnitureData",
"gamedataCount_orphans": "Osierocone FurnitureData",
"gamedataCount_figureMap": "Problemy z FigureMap",
"gamedataCount_figureData": "Nie używany FigureData",
"gamedataPass_dedupeFurnitureData": "Dedyplikuj FurnitureData",
"gamedataPassDesc_dedupeFurnitureData": "Usuwa powtarzające się classnames wewnątrz jednej sekcji, zachowując wpis z najwyższą rewizją.",
"gamedataPass_cleanFurnitureData": "Wyczyść FurnitureData",
"gamedataPassDesc_cleanFurnitureData": "Usuwa wpisy, których paczka .nitro nie istnieje w żadnym katalogu.",
"gamedataPass_cleanFigureMap": "Wyczyść FigureMap",
"gamedataPassDesc_cleanFigureMap": "Usuwa części wskazujące na brakujący zestaw w FigureData, a także dokładne duplikaty.",
"gamedataPass_cleanFigureData": "Wyczyść FigureData",
"gamedataPassDesc_cleanFigureData": "Usuwa zestawy, do których nie odwołuje się żadna część FigureMap, potem palety, których nie używa żadny typ zestawu. Musi działać po Wyczyść FigureMap.",
"gamedataNothingSelected": "Wybierz co najmniej jeden krok czyszczenia",
"gamedataConfirmTitle": "Nadpisać pliki JSON danych gry?",
"gamedataConfirmDescription": "{passes} krok(i) uruchomi się wobec {duplicates} zduplikowanych grup, {orphans} osieroconych wierszy, {figureMap} problemów z FigureMap i {figureData} nieużywanych wpisów FigureData. Wiersze są usywane bez kopii zapasowej — tego nie można cofnąć.",
"gamedataConfirmLabel": "Nadpisz pliki",
"gamedataDifferingWarning": "Co najmniej jeden duplikat nie jest dokładną kopią zachowanego wpisu, więc usunięty wiersz zawierał dane, których ocalały nie ma.",
"gamedataCrossSectionNote": "{count} classname(y) istnieją zarówno w roomitemtypes, jak i wallitemtypes. Są tylko zgłaszane — usunięcie jednego zmieniłoby typ elementu.",
"gamedataToastDone": "Czyszczenie danych gry usunęło {removed} wierszy",
"gamedataToastNothing": "Dane gry były już czyste",
"gamedataMaxRemovalsLabel": "Maks. wiersze na krok",
"gamedataMaxRemovalsHint": "0 używa domyślnej wartości 500. Krok, który usunąłby więcej, zatrzymuje się i pyta zamiast zapisywać.",
"gamedataLimitTitle": "{pass} usunąłby {wouldRemove} wierszy, powyżej limitu {maxRemovals}.",
"gamedataLimitDescription": "Ten krok nic nie zapisał, więc pliki są niezmienione. Najpierw sprawdź ścieżki zasobów — zły katalog sprawia, że każdy wiersz wydaje się osierocony. Podniesienie limitu to osobne, świadome uruchomienie.",
"gamedataLimitOverride": "Usuń mimo to {wouldRemove} wierszy",
"historyTitle": "Historia automatycznego czyszczenia",
"historyScheduled": "zaplanowane",
"historyManual": "ręczne",
"historyEntry": "Usunięto {deleted} ({copies} kopii); pominięto {recent} ostatnich i {broken} uszkodzonych",
"historyErrors": "{count} błędów"
},
"importDiagnostics": {
"attempts": "Diagnostyka plików",
"preliminary": "Wstępna kontrola adresów; zawartość zostanie sprawdzona podczas importu.",