From 53f4812adc0863df32064802cbe98eb0c8e8995e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 5 Nov 2026 14:03:43 +0100 Subject: [PATCH] v0.2.26 --- src/web/i18n/pl.json | 490 ++++++++++++++++++++++++++- src/web/index.html | 29 +- src/web/js/10-core.js | 20 +- src/web/js/20-preferences-auth.js | 55 ++- src/web/js/30-folders-tags.js | 20 +- src/web/js/40-messages-reader.js | 64 ++-- src/web/js/50-compose.js | 8 +- src/web/js/60-mail-actions-search.js | 94 ++--- src/web/js/70-contacts.js | 10 +- src/web/js/71-calendar.js | 4 +- src/web/js/72-openpgp-identities.js | 32 +- src/web/js/80-settings-realtime.js | 60 ++-- src/web/js/90-sieve.js | 32 +- src/web/js/91-sieve-apply.js | 4 - 14 files changed, 730 insertions(+), 192 deletions(-) diff --git a/src/web/i18n/pl.json b/src/web/i18n/pl.json index 305bd2f..0f7107d 100644 --- a/src/web/i18n/pl.json +++ b/src/web/i18n/pl.json @@ -791,7 +791,495 @@ "Rust server with an embedded HTML, CSS and JavaScript interface": "Serwer w Rust z wbudowanym interfejsem HTML, CSS i JavaScript", "RustBox is free software under the GNU Affero General Public License v3: you may use, modify and share it, also in a company. If you run a modified version as a network service, you must offer its source code to its users.": "RustBox jest wolnym oprogramowaniem na licencji GNU Affero General Public License v3: możesz go używać, zmieniać i udostępniać, także w firmie. Jeśli uruchamiasz zmodyfikowaną wersję jako usługę sieciową, musisz udostępnić jej kod źródłowy jej użytkownikom.", "Companies that prefer different terms — for example to keep their changes private — can obtain a paid commercial license. Contacting the author is voluntary: it is never required for use that follows the AGPL.": "Firmy, które wolą inne warunki — na przykład zachować swoje zmiany dla siebie — mogą uzyskać płatną licencję komercyjną. Kontakt z autorem jest dobrowolny: nie jest wymagany przy korzystaniu zgodnym z AGPL.", - "The first version of RustBox was created as a fork of the Oxi project (MIT License).": "Pierwsza wersja RustBox powstała jako fork projektu Oxi (licencja MIT)." + "The first version of RustBox was created as a fork of the Oxi project (MIT License).": "Pierwsza wersja RustBox powstała jako fork projektu Oxi (licencja MIT).", + "Connected": "Połączono", + "Connecting…": "Łączenie…", + "Reconnecting": "Ponowne łączenie", + "Offline": "Brak połączenia", + "Connection error": "Błąd połączenia", + "Checking": "Sprawdzanie", + "Unavailable": "Niedostępne", + "Partial": "Częściowo", + "never": "nigdy", + "yes": "tak", + "no": "nie", + "Dismiss notification": "Zamknij powiadomienie", + "Action failed": "Nie udało się wykonać akcji", + "RustBox cannot reach the server. Read-only cached content may still be visible.": "RustBox nie może połączyć się z serwerem. Nadal może być widoczna buforowana zawartość tylko do odczytu.", + "You are offline. RustBox will reconnect when the network returns.": "Brak połączenia z siecią. RustBox połączy się ponownie, gdy sieć będzie dostępna.", + "RustBox server is temporarily unreachable": "Serwer RustBox jest chwilowo niedostępny", + "You are offline": "Brak połączenia z siecią", + "Upload failed: network error": "Wysyłanie nie powiodło się: błąd sieci", + "Upload cancelled": "Anulowano wysyłanie", + "Confirm action": "Potwierdź działanie", + "Snooze until…": "Odłóż do…", + "Snoozed messages": "Odłożone wiadomości", + "No snoozed messages.": "Brak odłożonych wiadomości.", + "Unsnooze now": "Przywróć teraz", + "Message unsnoozed": "Przywrócono wiadomość", + "Later today ({time})": "Później dzisiaj ({time})", + "Tomorrow ({time})": "Jutro ({time})", + "This weekend ({time})": "W ten weekend ({time})", + "Next week ({time})": "W przyszłym tygodniu ({time})", + "Wakes {time}": "Wraca {time}", + "Snoozed until {time}": "Odłożono do {time}", + "(no subject)": "(brak tematu)", + "Mail synchronization": "Synchronizacja poczty", + "Switch account": "Przełącz konto", + "Resize folder pane": "Zmień szerokość panelu folderów", + "Sort messages": "Sortuj wiadomości", + "Newest": "Najnowsze", + "Oldest": "Najstarsze", + "Smallest": "Najmniejsze", + "Largest": "Największe", + "0 selected": "0 zaznaczonych", + "Move selected": "Przenieś zaznaczone", + "Copy selected": "Kopiuj zaznaczone", + "Label selected": "Nadaj etykietę zaznaczonym", + "Done": "Gotowe", + "Load more": "Wczytaj więcej", + "Select messages": "Zaznacz wiadomości", + "Actions for selected messages": "Akcje dla zaznaczonych wiadomości", + "First page": "Pierwsza strona", + "Last page": "Ostatnia strona", + "Resize message list": "Zmień szerokość listy wiadomości", + "No message selected": "Nie wybrano wiadomości", + "Select a message from the list.": "Wybierz wiadomość z listy.", + "Thread": "Wątek", + "Remote images are blocked.": "Zdalne obrazy są zablokowane.", + "Load images": "Wczytaj obrazy", + "Trust sender": "Zaufaj nadawcy", + "Verify / decrypt": "Zweryfikuj / odszyfruj", + "Find signer key": "Znajdź klucz podpisującego", + "Back": "Wstecz", + "Previous message": "Poprzednia wiadomość", + "Next message": "Następna wiadomość", + "Open message full screen": "Otwórz wiadomość na pełnym ekranie", + "Exit message full screen": "Wyłącz pełny ekran wiadomości", + "Mark read or unread": "Oznacz jako przeczytaną lub nieprzeczytaną", + "Toggle thread": "Rozwiń lub zwiń wątek", + "Select message": "Zaznacz wiadomość", + "Has attachments": "Ma załączniki", + "No matching messages.": "Brak pasujących wiadomości.", + "No messages in this folder.": "Brak wiadomości w tym folderze.", + "Searching…": "Wyszukiwanie…", + "{count} message": "{count} wiadomość", + "{count} messages": "{count} wiadomości", + "{count} results": "{count} wyników", + "{count} result": "{count} wynik", + "{count} selected": "{count} zaznaczona", + "{count} selected_plural": "{count} zaznaczonych", + "{count} messages · cached view": "{count} wiadomości · widok z pamięci podręcznej", + "No next message": "Brak następnej wiadomości", + "No previous message": "Brak poprzedniej wiadomości", + "to me": "do mnie", + "Inline image": "Obraz w treści", + "Inline": "W treści", + "Left": "Do lewej", + "Center": "Do środka", + "More…": "Więcej…", + "Keep as attachment": "Zostaw jako załącznik", + "Notifications from accounts": "Powiadomienia z kont", + "Choose which signed-in accounts can show combined new-mail notifications in this browser.": "Wybierz, z których zalogowanych kont ta przeglądarka może pokazywać wspólne powiadomienia o nowej poczcie.", + "Reset settings": "Resetuj ustawienia", + "Restore appearance, mailbox, notifications, folder, calendar and OpenPGP preferences. Messages, identities, keys and templates are kept.": "Przywróć ustawienia wyglądu, skrzynki, powiadomień, folderów, kalendarza i OpenPGP. Wiadomości, tożsamości, klucze i szablony pozostaną bez zmian.", + "Reset all settings": "Resetuj wszystkie ustawienia", + "Show account color": "Pokaż kolor konta", + "Compose size limits": "Limity rozmiaru wiadomości", + "Text-only signature used in plain-text messages": "Podpis tekstowy używany w wiadomościach w zwykłym tekście", + "Signature formatting": "Formatowanie podpisu", + "Import image": "Importuj obraz", + "Paste or edit HTML source": "Wklej lub edytuj kod HTML", + "HTML signature editor": "Edytor podpisu HTML", + "HTML source": "Kod HTML", + "Refresh preview": "Odśwież podgląd", + "Scripts, forms and unsafe attributes are removed before the signature is used.": "Skrypty, formularze i niebezpieczne atrybuty są usuwane przed użyciem podpisu.", + "Visual editor": "Edytor wizualny", + "You can add images and adjust the rendered signature.": "Możesz dodawać obrazy i dostosowywać wygląd podpisu.", + "Use this HTML": "Użyj tego HTML", + "Paste a complete HTML signature or an HTML fragment here": "Wklej tutaj pełny podpis HTML lub fragment HTML", + "HTML signature formatting": "Formatowanie podpisu HTML", + "Rendered HTML signature": "Wyrenderowany podpis HTML", + "Search contacts": "Szukaj kontaktów", + "One address per line": "Jeden adres w wierszu", + "One number per line": "Jeden numer w wierszu", + "Calendar view": "Widok kalendarza", + "No OpenPGP keys yet": "Brak kluczy OpenPGP", + "Export public": "Eksportuj publiczny", + "Test passphrase": "Sprawdź hasło", + "Change passphrase": "Zmień hasło", + "Export private": "Eksportuj prywatny", + "No identities yet": "Brak tożsamości", + "No named rules found. Rules using # rule:[name] are parsed automatically.": "Nie znaleziono nazwanych reguł. Reguły używające # rule:[name] są rozpoznawane automatycznie.", + "No scripts": "Brak skryptów", + "No saved searches": "Brak zapisanych wyszukiwań", + "Run": "Uruchom", + "Folder properties": "Właściwości folderu", + "Create filter from message": "Utwórz filtr z wiadomości", + "Stop processing after this rule": "Zatrzymaj przetwarzanie po tej regule", + "Also mark matching mail as read": "Oznacz pasującą pocztę także jako przeczytaną", + "Activate selected script after saving": "Aktywuj wybrany skrypt po zapisaniu", + "Advanced editor": "Edytor zaawansowany", + "No duplicate contacts found": "Nie znaleziono zduplikowanych kontaktów", + "Keep this": "Zachowaj ten", + "No groups": "Brak grup", + "No contacts": "Brak kontaktów", + "No events in this range": "Brak wydarzeń w tym zakresie", + "Notify": "Powiadamiaj", + "No active accounts.": "Brak aktywnych kont.", + "Loading sessions…": "Ładowanie sesji…", + "No active sessions.": "Brak aktywnych sesji.", + "Current": "Bieżące", + "Switch": "Przełącz", + "Unknown device": "Nieznane urządzenie", + "Attachment preview": "Podgląd załącznika", + "Close preview": "Zamknij podgląd", + "No capabilities reported": "Brak zgłoszonych możliwości", + "Authenticated connection · TLS enabled": "Uwierzytelnione połączenie · TLS włączony", + "Authenticated connection · plaintext transport": "Uwierzytelnione połączenie · transmisja nieszyfrowana", + "SMTP unavailable": "SMTP niedostępny", + "body cache enabled": "bufor treści włączony", + "body cache disabled": "bufor treści wyłączony", + "{folders} cached folders · {messages} cached messages · folder list {folderSync} · messages {messageSync}{pending} · {idleTasks} IDLE task(s) / {subscribers} subscriber(s)": "foldery w pamięci podręcznej: {folders} · wiadomości w pamięci podręcznej: {messages} · lista folderów: {folderSync} · wiadomości: {messageSync}{pending} · zadania IDLE: {idleTasks} / subskrybenci: {subscribers}", + " · {count} folders awaiting message sync": " · foldery oczekujące na synchronizację wiadomości: {count}", + "{indexed} indexed · {messages} cached messages · {bodies} cached bodies · {bodyCache}{excluded}": "zindeksowane: {indexed} · wiadomości w pamięci podręcznej: {messages} · treści w pamięci podręcznej: {bodies} · {bodyCache}{excluded}", + " · {count} excluded": " · pominięte: {count}", + "OpenPGP trust updated": "Zaktualizowano poziom zaufania OpenPGP", + "OpenPGP private key unlocked successfully": "Pomyślnie odblokowano prywatny klucz OpenPGP", + "OpenPGP passphrase changed": "Zmieniono hasło klucza OpenPGP", + "OpenPGP key deleted": "Usunięto klucz OpenPGP", + "OpenPGP policy saved": "Zapisano politykę OpenPGP", + "Paste or choose an OpenPGP key first": "Najpierw wklej lub wybierz klucz OpenPGP", + "The selected OpenPGP key file is empty": "Wybrany plik klucza OpenPGP jest pusty", + "All recipient OpenPGP keys are already available": "Klucze OpenPGP wszystkich odbiorców są już dostępne", + "HTML signature is too large. Reduce imported image sizes.": "Podpis HTML jest zbyt duży. Zmniejsz rozmiary importowanych obrazów.", + "Identity saved": "Zapisano tożsamość", + "Identity deleted": "Usunięto tożsamość", + "Choose a PNG, JPEG, GIF or WebP image": "Wybierz obraz PNG, JPEG, GIF lub WebP", + "Signature image must be 2 MB or smaller": "Obraz podpisu może mieć maksymalnie 2 MB", + "Could not import signature image": "Nie udało się zaimportować obrazu podpisu", + "Folder settings saved": "Zapisano ustawienia folderów", + "Notification settings saved": "Zapisano ustawienia powiadomień", + "Notifications are not supported by this browser": "Ta przeglądarka nie obsługuje powiadomień", + "Browser notifications are not allowed": "Powiadomienia przeglądarki są zablokowane", + "Test notification sent": "Wysłano powiadomienie testowe", + "This rule uses Sieve syntax the visual editor cannot safely rewrite. Edit it in Advanced Sieve source.": "Ta reguła używa składni Sieve, której edytor wizualny nie może bezpiecznie zmienić. Edytuj ją w zaawansowanym źródle Sieve.", + "No Sieve scripts to back up": "Brak skryptów Sieve do utworzenia kopii zapasowej", + "Script name is required": "Nazwa skryptu jest wymagana", + "Select a script first": "Najpierw wybierz skrypt", + "Sieve script deactivated": "Dezaktywowano skrypt Sieve", + "Sieve backup is too large": "Kopia zapasowa Sieve jest zbyt duża", + "This is not a supported RustBox Sieve backup": "To nie jest obsługiwana kopia zapasowa Sieve RustBox", + "Backup contains an invalid script name": "Kopia zapasowa zawiera nieprawidłową nazwę skryptu", + "Backup contains too many scripts": "Kopia zapasowa zawiera zbyt wiele skryptów", + "Backup marks more than one Sieve script as active": "Kopia zapasowa oznacza więcej niż jeden skrypt Sieve jako aktywny", + "validation failed": "walidacja nie powiodła się", + "Move undone": "Cofnięto przeniesienie", + "Configure an Archive folder in Settings → Folders": "Skonfiguruj folder Archiwum w Ustawienia → Foldery", + "Configure a Junk folder in Settings → Folders": "Skonfiguruj folder Spam w Ustawienia → Foldery", + "Message deleted": "Usunięto wiadomość", + "Choose at least one search criterion": "Wybierz co najmniej jedno kryterium wyszukiwania", + "Saved search deleted": "Usunięto zapisane wyszukiwanie", + "Search saved": "Zapisano wyszukiwanie", + "Folder created": "Utworzono folder", + "Folder renamed": "Zmieniono nazwę folderu", + "Folder deleted": "Usunięto folder", + "Folder list preference saved": "Zapisano ustawienie listy folderów", + "Subfolder created": "Utworzono podfolder", + ".eml exceeds the 50 MB import limit": "Plik .eml przekracza limit importu 50 MB", + "All messages marked read": "Oznaczono wszystkie wiadomości jako przeczytane", + "Folder emptied": "Opróżniono folder", + "This message does not provide List-Unsubscribe": "Ta wiadomość nie zawiera nagłówka List-Unsubscribe", + "Unsubscribe request sent": "Wysłano żądanie rezygnacji z subskrypcji", + "No supported HTTPS or mailto unsubscribe target": "Brak obsługiwanego celu HTTPS lub mailto do rezygnacji z subskrypcji", + "Message source copied": "Skopiowano źródło wiadomości", + "Could not copy source": "Nie udało się skopiować źródła", + "Select a message before printing": "Wybierz wiadomość przed drukowaniem", + "Print dialog opened": "Otwarto okno drukowania", + "Could not open the print dialog": "Nie udało się otworzyć okna drukowania", + "Message-ID is not available": "Message-ID jest niedostępny", + "Message-ID copied": "Skopiowano Message-ID", + "Could not copy Message-ID": "Nie udało się skopiować Message-ID", + "Sender address copied": "Skopiowano adres nadawcy", + "Could not copy address": "Nie udało się skopiować adresu", + "Downloading .eml": "Pobieranie .eml", + "Headers copied": "Skopiowano nagłówki", + "Could not copy headers": "Nie udało się skopiować nagłówków", + "Switch to HTML mode to embed attachments in the message": "Przełącz na tryb HTML, aby osadzać załączniki w wiadomości", + "Saved response deleted": "Usunięto zapisaną odpowiedź", + "Select an inline image first": "Najpierw wybierz obraz w treści", + "The inline image attachment is no longer available": "Załącznik obrazu w treści nie jest już dostępny", + "Save the current draft before recovering another one": "Zapisz bieżący szkic przed odzyskaniem innego", + "No recoverable drafts found": "Nie znaleziono szkiców do odzyskania", + "Browser recovery snapshot is no longer available": "Kopia odzyskiwania w przeglądarce nie jest już dostępna", + "Recovered unsaved browser draft": "Odzyskano niezapisany szkic z przeglądarki", + "Draft recovered": "Odzyskano szkic", + "Draft kept in this browser for recovery": "Szkic zachowano w tej przeglądarce do odzyskania", + "Sending…": "Wysyłanie…", + "Send cancelled": "Anulowano wysyłanie", + "Message sent": "Wiadomość wysłana", + "Wait for the attachment upload to finish": "Poczekaj na zakończenie wysyłania załącznika", + "Inline OpenPGP cannot carry attachments. Disable inline mode to use PGP/MIME.": "OpenPGP inline nie obsługuje załączników. Wyłącz tryb inline, aby użyć PGP/MIME.", + "Add at least one To/Cc recipient before attaching recipient OpenPGP keys": "Dodaj co najmniej jednego odbiorcę Do/DW przed dołączeniem kluczy OpenPGP odbiorców", + "No OpenPGP public key is available for any To/Cc recipient": "Brak publicznego klucza OpenPGP dla odbiorców Do/DW", + "Calendar exported": "Wyeksportowano kalendarz", + "vCard file is too large": "Plik vCard jest zbyt duży", + "Contacts merged": "Scalono kontakty", + "Group created": "Utworzono grupę", + "Group renamed": "Zmieniono nazwę grupy", + "Group deleted": "Usunięto grupę", + "Contact photo exceeds the 2 MB limit": "Zdjęcie kontaktu przekracza limit 2 MB", + "Contact photo saved": "Zapisano zdjęcie kontaktu", + "Contact photo removed": "Usunięto zdjęcie kontaktu", + "Contact saved": "Zapisano kontakt", + "Contact deleted": "Usunięto kontakt", + "Switch to HTML mode to paste inline images": "Przełącz na tryb HTML, aby wklejać obrazy w treści", + "Message sort updated": "Zmieniono sortowanie wiadomości", + "Select signature text before inserting a link": "Zaznacz tekst podpisu przed wstawieniem linku", + "ICS file is too large": "Plik ICS jest zbyt duży", + "Start and end are required": "Data rozpoczęcia i zakończenia są wymagane", + "Event saved": "Zapisano wydarzenie", + "Event deleted": "Usunięto wydarzenie", + "Label saved": "Zapisano etykietę", + "Label deleted": "Usunięto etykietę", + "Create a label first": "Najpierw utwórz etykietę", + "Mailbox settings saved": "Zapisano ustawienia skrzynki", + "Enable IMAP keyword synchronization first": "Najpierw włącz synchronizację słów kluczowych IMAP", + "Appearance reset": "Przywrócono ustawienia wyglądu", + "Session revoked": "Unieważniono sesję", + "Multiple accounts are disabled by the RustBox administrator": "Administrator RustBox wyłączył obsługę wielu kont", + "Account added": "Dodano konto", + "OpenPGP signature is cryptographically valid, but this key is marked untrusted": "Podpis OpenPGP jest kryptograficznie prawidłowy, ale ten klucz jest oznaczony jako niezaufany", + "OpenPGP signature verified": "Zweryfikowano podpis OpenPGP", + "OpenPGP message decrypted": "Odszyfrowano wiadomość OpenPGP", + "OpenPGP signature could not be verified": "Nie udało się zweryfikować podpisu OpenPGP", + "Unable to decode decrypted attachment": "Nie udało się zdekodować odszyfrowanego załącznika", + "This message has no attachments": "Ta wiadomość nie ma załączników", + "Too many attachments for a browser ZIP": "Zbyt wiele załączników, aby utworzyć ZIP w przeglądarce", + "OpenPGP decrypted + verified": "OpenPGP odszyfrowane i zweryfikowane", + "OpenPGP decrypted": "OpenPGP odszyfrowane", + "OpenPGP signature not verified": "Podpis OpenPGP niezweryfikowany", + "No matching public key verified this signature.": "Żaden pasujący klucz publiczny nie zweryfikował tego podpisu.", + "Reprocess": "Przetwórz ponownie", + "Unable to open message": "Nie udało się otworzyć wiadomości", + "Generated OpenPGP key {key}": "Wygenerowano klucz OpenPGP {key}", + "Imported OpenPGP key {key}": "Zaimportowano klucz OpenPGP {key}", + "OpenPGP key discovered via {source}": "Znaleziono klucz OpenPGP przez {source}", + "No OpenPGP key found for {email}": "Nie znaleziono klucza OpenPGP dla {email}", + "Notification permission: {permission}": "Uprawnienie do powiadomień: {permission}", + "IMAP reconnected · {count} capabilities": "Połączono ponownie z IMAP · możliwości: {count}", + "Search index rebuilt: {count} messages": "Przebudowano indeks wyszukiwania: {count} wiadomości", + "Backed up {count} Sieve script": "Utworzono kopię zapasową {count} skryptu Sieve", + "Backed up {count} Sieve scripts": "Utworzono kopię zapasową {count} skryptów Sieve", + "Restored {count} Sieve script": "Przywrócono {count} skrypt Sieve", + "Restored {count} Sieve scripts": "Przywrócono {count} skryptów Sieve", + "Sieve script “{name}” saved": "Zapisano skrypt Sieve „{name}”", + "Sieve script “{name}” activated": "Aktywowano skrypt Sieve „{name}”", + "Sieve script “{name}” deleted": "Usunięto skrypt Sieve „{name}”", + "Undo completed: {count} message": "Cofnięto operację dla {count} wiadomości", + "Undo completed: {count} messages": "Cofnięto operację dla {count} wiadomości", + "Moved to {folder}": "Przeniesiono do {folder}", + "Copied to {folder}": "Skopiowano do {folder}", + "{action}: {count} message": "{action}: {count} wiadomość", + "{action}: {count} messages": "{action}: {count} wiadomości", + "{done}/{total} completed: {error}": "Ukończono {done}/{total}: {error}", + "Imported {file}": "Zaimportowano {file}", + "{address} is already in contacts": "{address} jest już w kontaktach", + "{address} added to contacts": "Dodano {address} do kontaktów", + "{email} is now trusted; remote images will load automatically": "{email} jest teraz zaufanym nadawcą; zdalne obrazy będą wczytywane automatycznie", + "{email} removed from trusted senders": "Usunięto {email} z zaufanych nadawców", + "ManageSieve unavailable: {error}": "ManageSieve niedostępny: {error}", + "Could not send: {error}": "Nie udało się wysłać: {error}", + "Missing OpenPGP key for {emails}": "Brak klucza OpenPGP dla: {emails}", + "OpenPGP key marked untrusted for {emails}": "Klucz OpenPGP oznaczony jako niezaufany dla: {emails}", + "OpenPGP policy requires trusted keys: {emails}": "Polityka OpenPGP wymaga zaufanych kluczy dla: {emails}", + "vCard import: {created} created, {updated} updated, {skipped} skipped": "Import vCard: utworzono {created}, zaktualizowano {updated}, pominięto {skipped}", + "ICS import: {created} created, {skipped} skipped": "Import ICS: utworzono {created}, pominięto {skipped}", + "Selected all {count} search result": "Zaznaczono cały {count} wynik wyszukiwania", + "Selected all {count} search results": "Zaznaczono wszystkie wyniki wyszukiwania: {count}", + "Label “{name}” added": "Dodano etykietę „{name}”", + "Labels reconciled: +{added}, −{removed}": "Zsynchronizowano etykiety: +{added}, −{removed}", + "Revoked {count} session(s)": "Unieważniono sesje: {count}", + "Downloading {filename}": "Pobieranie {filename}", + "Preparing ZIP with {count} attachment…": "Przygotowywanie ZIP z {count} załącznikiem…", + "Preparing ZIP with {count} attachments…": "Przygotowywanie ZIP z {count} załącznikami…", + "Downloaded {count} attachment as ZIP": "Pobrano {count} załącznik jako ZIP", + "Downloaded {count} attachments as ZIP": "Pobrano {count} załączników jako ZIP", + "Calendar: {count} event(s) imported": "Kalendarz: zaimportowano wydarzenia: {count}", + "Contacts: {created} created, {updated} updated": "Kontakty: utworzono {created}, zaktualizowano {updated}", + "Archived": "Zarchiwizowano", + "Marked read": "Oznaczono jako przeczytane", + "Marked unread": "Oznaczono jako nieprzeczytane", + "Unflagged": "Usunięto flagę", + "Deleted": "Usunięto", + "Moved": "Przeniesiono", + "Copied": "Skopiowano", + "Updated": "Zaktualizowano", + "Rule order changed — save to apply": "Zmieniono kolejność reguł — zapisz, aby zastosować", + "Incomplete": "Niekompletna", + "Autoresponder appended": "Dodano autoresponder", + "Loaded": "Wczytano", + "Quick-filter values loaded. Review the rule, add it, validate, then save.": "Wczytano wartości szybkiego filtra. Sprawdź regułę, dodaj ją, zweryfikuj i zapisz.", + "Reconciling…": "Synchronizowanie…", + "Discovered {count} OpenPGP key": "Znaleziono {count} klucz OpenPGP", + "Discovered {count} OpenPGP keys": "Znaleziono {count} kluczy OpenPGP", + "No missing OpenPGP keys were discovered": "Nie znaleziono brakujących kluczy OpenPGP", + "Mailbox storage is {percent}% full": "Pamięć skrzynki jest zapełniona w {percent}%", + "Mailbox storage is {percent}% used": "Wykorzystano {percent}% pamięci skrzynki", + "Flag removed": "Usunięto flagę", + "Message flagged": "Oznaczono wiadomość flagą", + "Folder subscribed": "Subskrybowano folder", + "Folder unsubscribed": "Anulowano subskrypcję folderu", + "Could not embed {filename}": "Nie udało się osadzić {filename}", + "Saved response updated": "Zaktualizowano zapisaną odpowiedź", + "Saved response created": "Utworzono zapisaną odpowiedź", + "Image cropped": "Przycięto obraz", + "Image layout updated": "Zaktualizowano układ obrazu", + "Too late to cancel": "Jest już za późno na anulowanie", + "unknown error": "nieznany błąd", + "Remove passphrase protection from this private key? The key file will still be protected by server filesystem permissions, but anyone who obtains it could use it immediately.": "Usunąć ochronę hasłem z tego klucza prywatnego? Plik klucza nadal będzie chroniony uprawnieniami systemu plików serwera, ale osoba, która go uzyska, będzie mogła użyć go od razu.", + "Export the private OpenPGP key? Anyone with this file and its passphrase may use your identity.": "Wyeksportować prywatny klucz OpenPGP? Każdy, kto uzyska ten plik i jego hasło, może użyć Twojej tożsamości.", + "Delete this identity?": "Usunąć tę tożsamość?", + "Test OpenPGP passphrase": "Sprawdź hasło OpenPGP", + "Current OpenPGP passphrase": "Bieżące hasło OpenPGP", + "New OpenPGP passphrase": "Nowe hasło OpenPGP", + "Remove OpenPGP passphrase": "Usuń hasło OpenPGP", + "Export private key": "Eksportuj klucz prywatny", + "Delete OpenPGP key": "Usuń klucz OpenPGP", + "Delete identity": "Usuń tożsamość", + "Enter the passphrase for this private key. It is used only for this test and is not stored.": "Wprowadź hasło tego klucza prywatnego. Jest używane tylko do tego testu i nie jest zapisywane.", + "Enter the current passphrase. Leave it empty if the key is currently unprotected.": "Wprowadź bieżące hasło. Pozostaw puste, jeśli klucz nie jest obecnie chroniony hasłem.", + "Enter the new passphrase. Leave it empty only if you intentionally want to remove passphrase protection.": "Wprowadź nowe hasło. Pozostaw puste tylko wtedy, gdy celowo chcesz usunąć ochronę hasłem.", + "Test": "Testuj", + "Change": "Zmień", + "Remove passphrase": "Usuń hasło", + "Export": "Eksportuj", + "Rebuild the search index from the local message cache?": "Przebudować indeks wyszukiwania z lokalnej pamięci podręcznej wiadomości?", + "Rebuild search index": "Przebuduj indeks wyszukiwania", + "Rebuild": "Przebuduj", + "Delete filter rule": "Usuń regułę filtra", + "Restore Sieve backup": "Przywróć kopię Sieve", + "Overwrite active filter script": "Nadpisz aktywny skrypt filtrów", + "Delete Sieve script": "Usuń skrypt Sieve", + "Overwrite": "Nadpisz", + "Permanently delete this message?": "Trwale usunąć tę wiadomość?", + "Unsubscribe from this mailing list?": "Zrezygnować z tej listy mailingowej?", + "This mailing list does not support one-click unsubscribe. Open its external unsubscribe page?": "Ta lista mailingowa nie obsługuje rezygnacji jednym kliknięciem. Otworzyć zewnętrzną stronę rezygnacji?", + "Rename folder": "Zmień nazwę folderu", + "Create subfolder": "Utwórz podfolder", + "Flagged messages on top": "Wiadomości z flagą na górze", + "Delete message permanently": "Trwale usuń wiadomość", + "Delete selected messages": "Usuń zaznaczone wiadomości", + "Delete saved search": "Usuń zapisane wyszukiwanie", + "Delete folder": "Usuń folder", + "Empty folder": "Opróżnij folder", + "One-click unsubscribe": "Rezygnacja jednym kliknięciem", + "Open unsubscribe page": "Otwórz stronę rezygnacji", + "Name this search so you can run it again later.": "Nadaj nazwę temu wyszukiwaniu, aby móc uruchomić je ponownie.", + "Delete permanently": "Usuń trwale", + "Unsubscribe": "Zrezygnuj", + "Open page": "Otwórz stronę", + "Search name": "Nazwa wyszukiwania", + "Subfolder name": "Nazwa podfolderu", + "The message mentions an attachment but no file is attached. Send anyway?": "Treść wiadomości sugeruje załącznik, ale żaden plik nie został dołączony. Wysłać mimo to?", + "Inline OpenPGP sends the plain-text representation and drops HTML/Markdown formatting. Continue?": "OpenPGP inline wysyła wersję tekstową i usuwa formatowanie HTML/Markdown. Kontynuować?", + "Response format": "Format odpowiedzi", + "Delete saved response": "Usuń zapisaną odpowiedź", + "Missing attachment": "Brak załącznika", + "Name shown in the composer response menu.": "Nazwa wyświetlana w menu zapisanych odpowiedzi edytora.", + "Recover": "Odzyskaj", + "Send anyway": "Wyślij mimo to", + "Response name": "Nazwa odpowiedzi", + "Delete this contact?": "Usunąć ten kontakt?", + "New contact group": "Nowa grupa kontaktów", + "Rename contact group": "Zmień nazwę grupy kontaktów", + "Merge duplicate contacts": "Scal zduplikowane kontakty", + "Delete contact group": "Usuń grupę kontaktów", + "Delete contact": "Usuń kontakt", + "Merge": "Scal", + "Group name": "Nazwa grupy", + "Switching away from HTML can hide or discard formatting when the message is sent. Continue?": "Przełączenie z HTML może ukryć lub usunąć formatowanie podczas wysyłania wiadomości. Kontynuować?", + "Insert signature link": "Wstaw link w podpisie", + "Change compose format": "Zmień format wiadomości", + "Switch format": "Zmień format", + "Insert": "Wstaw", + "Delete this event?": "Usunąć to wydarzenie?", + "Delete event": "Usuń wydarzenie", + "Delete this label? Messages will not be deleted.": "Usunąć tę etykietę? Wiadomości nie zostaną usunięte.", + "Delete label": "Usuń etykietę", + "Choose label": "Wybierz etykietę", + "Revoke this RustBox session?": "Unieważnić tę sesję RustBox?", + "Revoke every other active RustBox session for this account?": "Unieważnić wszystkie pozostałe aktywne sesje RustBox tego konta?", + "Revoke session": "Unieważnij sesję", + "Remove account": "Usuń konto", + "Revoke": "Unieważnij", + "Revoke sessions": "Unieważnij sesje", + "Decrypt OpenPGP message": "Odszyfruj wiadomość OpenPGP", + "Enter the private-key passphrase if this key is protected. It is used only for this request and is not stored.": "Jeśli klucz jest chroniony, wprowadź hasło klucza prywatnego. Jest używane tylko dla tego żądania i nie jest zapisywane.", + "Decrypt": "Odszyfruj", + "Inline image actions": "Akcje obrazu w treści", + "Colors plus the style's layout: density, row height, pane widths and type size.": "Kolory oraz układ stylu: gęstość, wysokość wierszy, szerokości paneli i rozmiar tekstu.", + "Maximum attachment size:": "Maksymalny rozmiar załącznika:", + "Maximum message size:": "Maksymalny rozmiar wiadomości:", + "Account color": "Kolor konta", + "Sage": "Szałwiowy", + "Blue": "Niebieski", + "Teal": "Morski", + "Cyan": "Cyjan", + "Indigo": "Indygo", + "Slate": "Łupkowy", + "Amber": "Bursztynowy", + "Orange": "Pomarańczowy", + "Violet": "Fioletowy", + "Rose": "Różany", + "Red": "Czerwony", + "Emerald": "Szmaragdowy", + "Lime": "Limonkowy", + "Sky": "Błękitny", + "Navy": "Granatowy", + "Plum": "Śliwkowy", + "Magenta": "Magenta", + "Copper": "Miedziany", + "Sand": "Piaskowy", + "Delete OpenPGP key {key}?": "Usunąć klucz OpenPGP {key}?", + "Delete Sieve rule “{name}”?": "Usunąć regułę Sieve „{name}”?", + "“{name}” is the active Sieve script. Validate and overwrite it?": "„{name}” jest aktywnym skryptem Sieve. Zweryfikować i nadpisać go?", + "Delete Sieve script “{name}”?": "Usunąć skrypt Sieve „{name}”?", + "Permanently delete {count} selected messages?": "Trwale usunąć zaznaczone wiadomości: {count}?", + "Delete saved search “{name}”?": "Usunąć zapisane wyszukiwanie „{name}”?", + "Delete folder “{name}”?": "Usunąć folder „{name}”?", + "Folder: {folder}": "Folder: {folder}", + "Parent folder: {folder}": "Folder nadrzędny: {folder}", + "Permanently remove every message from “{name}”?": "Trwale usunąć wszystkie wiadomości z „{name}”?", + "Delete saved response “{name}”?": "Usunąć zapisaną odpowiedź „{name}”?", + "Merge {count} duplicate contact(s) into {contact}?": "Scalić zduplikowane kontakty ({count}) z {contact}?", + "Delete group “{name}”? Contacts will be kept.": "Usunąć grupę „{name}”? Kontakty zostaną zachowane.", + "Remove {email} from this browser session?": "Usunąć {email} z tej sesji przeglądarki?", + "Sender address": "Adres nadawcy", + "Sender domain": "Domena nadawcy", + "Flag message": "Oznacz wiadomość flagą", + "Destination folder": "Folder docelowy", + "Comparison": "Porównanie", + "active": "aktywny", + "new": "nowy", + "Download all as ZIP": "Pobierz wszystkie jako ZIP", + "Thread ({count})": "Wątek ({count})", + "account": "konto", + "Automatic IMAP Junk/Spam": "Automatyczny IMAP Junk/Spam", + "{folder} (not available in this account)": "{folder} (niedostępny na tym koncie)", + "Label: {name}": "Etykieta: {name}", + "enabled": "włączona", + "disabled": "wyłączona", + "{name} {state} — save to apply": "{name} {state} — zapisz, aby zastosować", + "Rule “{name}” removed — save to apply": "Usunięto regułę „{name}” — zapisz, aby zastosować", + "ACTIVE": "AKTYWNY", + "{count} key · {privateCount} private": "{count} klucz · prywatne: {privateCount}", + "{count} keys · {privateCount} private": "klucze: {count} · prywatne: {privateCount}", + "No email": "Brak e-maila", + "private + public": "prywatny + publiczny", + "public": "publiczny", + "import": "import", + "default": "domyślna" }, "fixed_interface_style_note": "gotowy styl interfejsu. Włącz edycję poniżej, aby dopasować jego układ i typografię.", "custom_interface_style_note": "RustBox można w pełni dostosować: kolory, odstępy, panele, typografię i zaawansowane ustawienia interfejsu.", diff --git a/src/web/index.html b/src/web/index.html index e5b65c0..49d0bcf 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -130,13 +130,14 @@ aria-label="Resize folder pane"> -
+
-
Inbox0 messages
+
Inbox0 + messages
`; + row.innerHTML = ``; const refresh = () => { syncSieveRowValueFields(row); updateSieveBuilder(); }; row.querySelector(".sieve-dynamic-kind").addEventListener("change", refresh); row.querySelectorAll("select,input").forEach((node) => node.addEventListener("input", updateSieveBuilder)); @@ -785,7 +785,7 @@ function buildSieveException(row) { function createSieveDynamicAction() { const row = el("div", "sieve-dynamic-row sieve-dynamic-action-row"); - row.innerHTML = ``; + row.innerHTML = ``; const refresh = () => { configureSieveDynamicAction(row); updateSieveBuilder(); }; row.querySelector(".sieve-dynamic-action").addEventListener("change", refresh); row.querySelector(".sieve-dynamic-target").addEventListener("input", updateSieveBuilder); @@ -910,7 +910,7 @@ function renderSieveBuilderPreview() { } catch (error) { preview.textContent = error.message; code.textContent = ""; - statePill.textContent = "Incomplete"; + statePill.textContent = trText("Incomplete"); statePill.className = "sieve-status-pill error"; } } @@ -922,7 +922,7 @@ function updateSieveBuilder() { const kind = $(`#sieve-builder-condition${suffix}`).value; const value = $(`#sieve-builder-value${suffix}`); value.closest("label")?.classList.toggle("hidden", valuelessSieveKinds.has(kind)); - if (sizeSieveKinds.has(kind)) value.placeholder = "2M"; + if (sizeSieveKinds.has(kind)) value.placeholder = trText("2M"); else value.placeholder = suffix ? trText("optional") : "example.com"; if (!suffix) $("#sieve-builder-match").disabled = valuelessSieveKinds.has(kind) || sizeSieveKinds.has(kind); } @@ -1024,7 +1024,7 @@ async function appendSieveVacation() { const built = buildSieveVacationRule(); const editor = $("#sieve-editor"); editor.value = mergeSieveRequirements([editor.value.trim(), built.rule].filter(Boolean).join("\n\n"), built.requirements); - $("#sieve-result").textContent = "Autoresponder appended"; + $("#sieve-result").textContent = trText("Autoresponder appended"); await validateSieve(); } catch (error) { toast(error.message, "error"); } } @@ -1060,11 +1060,11 @@ async function applySieveVisualRule(updateSelected) { function renderSieveScripts() { const list = $("#sieve-scripts"); list.replaceChildren(); - if (!state.sieveScripts.length) list.append(el("div", "empty-list", "No scripts")); + if (!state.sieveScripts.length) list.append(el("div", "empty-list", trText("No scripts"))); for (const script of state.sieveScripts) { const button = el("button", `sieve-script ${script.active ? "active" : ""}`); button.type = "button"; - button.innerHTML = `${escapeHtml(script.name)}${script.active ? "ACTIVE" : ""}`; + button.innerHTML = `${escapeHtml(script.name)}${script.active ? escapeHtml(trText("ACTIVE")) : ""}`; button.addEventListener("click", () => openSieveScript(script.name)); list.append(button); } @@ -1078,7 +1078,7 @@ async function openSieveScript(name) { state.sieveEditingRuleId = null; clearSieveRuleBuilder(); renderManagedSieveRules(); - $("#sieve-result").textContent = "Loaded"; + $("#sieve-result").textContent = trText("Loaded"); } catch (error) { toast(error.message, "error"); } } @@ -1088,7 +1088,7 @@ function newSieveScript() { state.sieveEditingRuleId = null; clearSieveRuleBuilder(); renderManagedSieveRules(); - $("#sieve-result").textContent = "New script"; + $("#sieve-result").textContent = trText("New script"); $("#sieve-name").focus(); } diff --git a/src/web/js/91-sieve-apply.js b/src/web/js/91-sieve-apply.js index f974c41..124863f 100644 --- a/src/web/js/91-sieve-apply.js +++ b/src/web/js/91-sieve-apply.js @@ -1,9 +1,5 @@ // Filter templates, missing-folder creation and "Apply now" for existing mail. -function fmtText(template, values = {}) { - return trText(template).replace(/\{(\w+)\}/g, (_, key) => String(values[key] ?? "")); -} - // ---------------------------------------------------------------- templates const sieveRuleTemplates = [