diff --git a/.github/workflows/arm-publish.yml b/.github/workflows/arm-publish.yml
deleted file mode 100644
index 6774819..0000000
--- a/.github/workflows/arm-publish.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-name: 'Publish Linux Arm builds'
-
-on:
- push:
- tags:
- - 'v*'
- workflow_dispatch:
-
-jobs:
- build:
- runs-on: ubuntu-22.04
- timeout-minutes: 120
- strategy:
- matrix:
- include:
- - cpu: cortex-a72
- base_image: https://dietpi.com/downloads/images/DietPi_RPi5-ARMv8-Bookworm.img.xz
- appimage: aarch64
- steps:
- - uses: actions/checkout@v4
-
- - name: Cache rust build artifacts
- uses: Swatinem/rust-cache@v2
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
- TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
- with:
- workspaces: src-tauri
- cache-on-failure: true
-
- - name: Build app
- uses: pguyot/arm-runner-action@v2.6.5
- with:
- base_image: ${{ matrix.base_image }}
- cpu: ${{ matrix.cpu }}
- bind_mount_repository: true
- image_additional_mb: 10240
- optimize_image: no
-
- commands: |
- # Prevent Rust from complaining about $HOME not matching eid home
- export HOME=/root
-
- # Workaround to CI worker being stuck on Updating crates.io index
- export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
-
- # Install setup prerequisites
- apt-get update -y
- apt-get install -y --no-install-recommends --no-install-suggests xz-utils xdg-utils curl libwebkit2gtk-4.1-dev build-essential libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev patchelf libfuse2 file
- curl https://sh.rustup.rs -sSf | sh -s -- -y
- . "$HOME/.cargo/env"
- curl -fsSL https://deb.nodesource.com/setup_lts.x | bash
- apt-get install -y nodejs
-
- # Install frontend dependencies
- npm install
-
- # Build the application
- npm run tauri build -- --bundles appimage --verbose
\ No newline at end of file
diff --git a/.github/workflows/publish.yml b/.github/workflows/build.yml
similarity index 84%
rename from .github/workflows/publish.yml
rename to .github/workflows/build.yml
index 1bbed46..384deb4 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/build.yml
@@ -4,6 +4,7 @@ on:
push:
tags:
- 'v*'
+ pull_request:
workflow_dispatch:
jobs:
@@ -20,6 +21,8 @@ jobs:
args: '--target x86_64-apple-darwin'
- platform: 'ubuntu-22.04'
args: ''
+ - platform: 'ubuntu-24.04-arm'
+ args: ''
- platform: 'windows-latest'
args: ''
@@ -27,8 +30,8 @@ jobs:
steps:
- uses: actions/checkout@v4
- - name: install dependencies (ubuntu only)
- if: matrix.platform == 'ubuntu-22.04'
+ - name: Install dependencies (Ubuntu only)
+ if: startsWith(matrix.platform, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y \
@@ -38,13 +41,13 @@ jobs:
librsvg2-dev \
patchelf
- - name: setup node
+ - name: Setup Node
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'npm'
- - name: install Rust stable
+ - name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
@@ -54,18 +57,19 @@ jobs:
with:
workspaces: './src-tauri -> target'
- - name: install frontend dependencies
- run: npm install
+ - name: Install frontend dependencies
+ run: npm ci
- - name: "Build a Tauri App"
+ - name: Build and Publish Release
uses: tauri-apps/tauri-action@v0
+ if: startsWith(github.ref, 'refs/tags/v')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
with:
tagName: v__VERSION__
- releaseName: "ClamAV GUI v__VERSION__"
+ releaseName: 'ClamAV GUI v__VERSION__'
releaseDraft: true
prerelease: false
generateReleaseNotes: true
@@ -80,7 +84,7 @@ jobs:
---
## Downloads
- ### :penguin: Linux
+ ### :penguin: Linux (Debian-based)
- **rpm** - [ClamAV.GUI-__VERSION__-1.x86_64.rpm][linux-rpm]
- **AppImage** - [ClamAV.GUI___VERSION___amd64.AppImage][linux-app-image]
- **deb** - [ClamAV.GUI___VERSION___amd64.deb][linux-deb]
@@ -108,4 +112,9 @@ jobs:
[linux-rpm]: https://github.com/ArsenTech/clamav-gui/releases/download/v__VERSION__/ClamAV.GUI-__VERSION__-1.x86_64.rpm
[linux-app-image]: https://github.com/ArsenTech/clamav-gui/releases/download/v__VERSION__/ClamAV.GUI___VERSION___amd64.AppImage
[linux-deb]: https://github.com/ArsenTech/clamav-gui/releases/download/v__VERSION__/ClamAV.GUI___VERSION___amd64.deb
-
\ No newline at end of file
+
+ - name: Test Build (PR / workflow_dispatch)
+ uses: tauri-apps/tauri-action@v0
+ if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
+ with:
+ args: ${{ matrix.args }} --no-bundle
\ No newline at end of file
diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml
deleted file mode 100644
index 3f39c0e..0000000
--- a/.github/workflows/test-build.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-name: "Test Build"
-
-on: [pull_request]
-
-jobs:
- test-tauri:
- strategy:
- fail-fast: false
- matrix:
- include:
- - platform: "macos-latest"
- args: "--target aarch64-apple-darwin"
- - platform: "macos-latest"
- args: "--target x86_64-apple-darwin"
- - platform: "ubuntu-22.04"
- args: ""
- - platform: "windows-latest"
- args: ""
-
- runs-on: ${{ matrix.platform }}
- steps:
- - uses: actions/checkout@v4
-
- - name: setup node
- uses: actions/setup-node@v4
- with:
- node-version: lts/*
-
- - name: install Rust stable
- uses: dtolnay/rust-toolchain@stable
- with:
- targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
-
- - name: install dependencies (ubuntu only)
- if: matrix.platform == 'ubuntu-22.04'
- run: |
- sudo apt-get update
- sudo apt-get install -y libwebkit2gtk-4.0-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
-
- - name: install frontend dependencies
- run: npm install
-
- - uses: tauri-apps/tauri-action@v0
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- args: ${{ matrix.args }}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab36247..5f8c0b0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
---
## [1.0.4] - Unreleased
+### Added Languages
+- **🇵🇱 Polish** - Thanks @Olek980!
## [1.0.3] - 2026-03-22
### Added
diff --git a/README.md b/README.md
index 6c8fa27..228985a 100644
--- a/README.md
+++ b/README.md
@@ -81,11 +81,11 @@ Built with Tauri, React, and modern desktop and web tools. This software is prov
- [ ] Clear last 7 days
- [ ] Clear last 30 days
- [ ] Clear by date
+- [ ] Fix the ARM64 build workflow
#### v1.0.5 (Planned)
- [ ] Backend Error Translation
- [ ] Add a macOS Guide inside the **No ClamAV** Page
#### v1.0.6 (Stability)
-- [ ] Fix the ARM64 build workflow
- [ ] Scheduler support for Linux and MacOS
#### v1.1.x (Major)
- [ ] Limit `helpers::scheduler::windows::get_last_run_time` only for Windows Users
@@ -169,8 +169,8 @@ ClamAV is a trademark of Cisco Systems, Inc. This project is an independent, ope
[version-shield]: https://img.shields.io/github/package-json/v/ArsenTech/clamav-gui?style=for-the-badge
[downloads-shield]: https://img.shields.io/github/downloads/ArsenTech/clamav-gui/total?style=for-the-badge&label=Total%20Downloads&color=%2322b455
[downloads-url]:https://github.com/ArsenTech/clamav-gui/releases
-[status-shield]: https://img.shields.io/github/actions/workflow/status/ArsenTech/clamav-gui/publish.yml?style=for-the-badge
-[status-url]: https://github.com/ArsenTech/clamav-gui/actions/workflows/publish.yml
+[status-shield]: https://img.shields.io/github/actions/workflow/status/ArsenTech/clamav-gui/build.yml?style=for-the-badge
+[status-url]: https://github.com/ArsenTech/clamav-gui/actions/workflows/build.yml
[commits-since-shield]: https://img.shields.io/github/commits-since/ArsenTech/clamav-gui/latest?style=for-the-badge&color=%2322b455&label=Commits%20since%20latest%20version
[created-at-shield]: https://img.shields.io/github/created-at/ArsenTech/clamav-gui?style=for-the-badge
[repo-size-shield]: https://img.shields.io/github/repo-size/ArsenTech/clamav-gui?style=for-the-badge
diff --git a/public/locales/pl/about.json b/public/locales/pl/about.json
new file mode 100644
index 0000000..f6195c0
--- /dev/null
+++ b/public/locales/pl/about.json
@@ -0,0 +1,20 @@
+{
+ "title": "O ClamAV GUI",
+ "version": "Wersja {{version}}",
+ "desc": {
+ "line1": "Minimalistyczny interfejs typu open source do skanowania plików i wykrywania zagrożeń, dzięki któremu sam program antywirusowy wygląda profesjonalnie i działa dokładnie tak samo jak ClamAV (antywirus FOSS CLI).",
+ "line2": "Zbudowany z wykorzystaniem Tauri, React oraz nowoczesnych narzędzi desktopowych i internetowych. Oprogramowanie jest udostępniane w stanie „jak jest”. Żadne dane nie są gromadzone ani przesyłane. Ten interfejs graficzny korzysta z silników clamscan i freshclam firmy ClamAV. Typy skanowania to ustawienia predefiniowane, które definiują używane lokalizacje i limity.",
+ "line3": "ClamAV jest znakiem towarowym firmy Cisco Systems, Inc. Projekt ten jest niezależnym, otwartym interfejsem graficznym i nie jest powiązany z firmą Cisco ani przez nią wspierany.",
+ "line4": "Ten projekt jest napędzany przez społeczność. Twoja opinia kształtuje przyszłość."
+ },
+ "clamav-version": "ClamAV v{{engine}}, Wersja Bazy danych: {{dbVersion}}",
+ "all-rights-reserved": "Wszelkie Prawa Zastrzezone",
+ "translated-by": "Tłumaczenie: [github.com/olek980](https://github.com/olek980)",
+ "def-version": "Wersja bazy definicji wirusów",
+ "buttons": {
+ "bug-report": "Zreportuj Bug",
+ "feature-request": "Poproś o funkcje",
+ "contribute": "Contribute",
+ "translate": "Dodaj swój język"
+ }
+}
diff --git a/public/locales/pl/confirmation.json b/public/locales/pl/confirmation.json
new file mode 100644
index 0000000..2e1201d
--- /dev/null
+++ b/public/locales/pl/confirmation.json
@@ -0,0 +1,80 @@
+{
+ "actions": {
+ "cancel": "Anuluj",
+ "clear": "Wyczyść",
+ "delete": "Usuń",
+ "restore": "Przywróć",
+ "delete-settings": "Usuń ustawienia",
+ "restore-defaults": "Przywróć ustawienia domyślne",
+ "delete-job": "Usuń zadanie",
+ "clear-jobs": "Wyczyść zadania",
+ "remove": "Usuń",
+ "stop": "Zatrzymaj",
+ "turn-off": "Wyłącz"
+ },
+ "clear-all": {
+ "title": "Wyczyścić historię?",
+ "desc": "Spowoduje to usunięcie całej historii skanowania, aktualizacji i działań. Logi oraz elementy kwarantanny pozostaną bez zmian."
+ },
+ "clear-acknowledged": {
+ "title": "Wyczyścić potwierdzone wpisy?",
+ "desc": "Spowoduje to usunięcie tylko potwierdzonych wpisów z historii. Nierozwiązane zdarzenia pozostaną."
+ },
+ "clear-errors": {
+ "title": "Wyczyścić wszystkie błędy?",
+ "desc": "Spowoduje to usunięcie wszystkich błędów z tabeli historii. Pozostałe zdarzenia pozostaną."
+ },
+ "clear-warnings": {
+ "title": "Wyczyścić wszystkie ostrzeżenia?",
+ "desc": "Spowoduje to usunięcie wszystkich ostrzeżeń z tabeli historii. Pozostałe zdarzenia pozostaną."
+ },
+ "restore": {
+ "title": "Spowoduje to przywrócenie pliku z kwarantanny.",
+ "desc": "Kontynuować?"
+ },
+ "delete": {
+ "title": "Czy na pewno chcesz trwale usunąć ten plik?",
+ "desc": "Tego procesu nie można cofnąć."
+ },
+ "bulk-restore": {
+ "title": "Spowoduje to przywrócenie wszystkich zagrożeń z kwarantanny.",
+ "desc": "Kontynuować?"
+ },
+ "bulk-delete": {
+ "title": "Czy na pewno chcesz usunąć wszystkie zagrożenia z kwarantanny?",
+ "desc": "Tego procesu nie można cofnąć."
+ },
+ "delete-settings": {
+ "title": "Spowoduje to trwałe usunięcie wszystkich ustawień, wykluczeń i preferencji GUI ClamAV.",
+ "desc": "Kontynuować?"
+ },
+ "restore-defaults": {
+ "title": "Spowoduje to trwałe przywrócenie wszystkich ustawień, wykluczeń i preferencji GUI ClamAV do wartości domyślnych.",
+ "desc": "Kontynuować?"
+ },
+ "delete-threats": {
+ "title": "Czy na pewno chcesz trwale usunąć ten plik?",
+ "desc": "Tego procesu nie można cofnąć."
+ },
+ "clear-threats": {
+ "title": "Czy na pewno chcesz usunąć wszystkie wykryte zagrożenia?",
+ "desc": "Tego procesu nie można cofnąć."
+ },
+ "delete-job": {
+ "title": "Spowoduje to usunięcie wybranego zaplanowanego zadania skanowania.",
+ "desc": "Kontynuować?"
+ },
+ "clear-jobs": {
+ "title": "Spowoduje to usunięcie wszystkich zaplanowanych skanów.",
+ "desc": "Kontynuować?"
+ },
+ "scan": {
+ "title": "Czy na pewno chcesz zatrzymać {{scanName}}?",
+ "desc": "Spowoduje to anulowanie całego procesu skanowania i powrót do menu opcji skanowania."
+ },
+ "folder-path-form-desc": "Kontynuować?",
+ "real-time-scan": {
+ "title": "Czy na pewno chcesz wyłączyć ochronę w czasie rzeczywistym?",
+ "desc": "Wyłączenie ochrony w czasie rzeczywistym narazi urządzenie na wirusy."
+ }
+}
diff --git a/public/locales/pl/credits.json b/public/locales/pl/credits.json
new file mode 100644
index 0000000..19e95a0
--- /dev/null
+++ b/public/locales/pl/credits.json
@@ -0,0 +1,54 @@
+{
+ "titles": "Podziękowania",
+ "credits-data": {
+ "coreTech": {
+ "title": "Technologie podstawowe",
+ "entries": [
+ "ClamAV (silnik antywirusowy)",
+ "ClamScan (skaner na żądanie)",
+ "FreshClam (aktualizacje sygnatur)"
+ ]
+ },
+ "interface": {
+ "title": "Interfejs i platforma",
+ "entries": [
+ "Tauri (środowisko uruchomieniowe desktop)",
+ "React (UI/UX)",
+ "Rust (backend i bezpieczeństwo)",
+ "React Router (nawigacja)",
+ "ShadCN UI (system designu)",
+ "Tailwind CSS (stylowanie)",
+ "Specta (typowane IPC)"
+ ]
+ },
+ "system": {
+ "title": "Integracja systemowa",
+ "entries": [
+ "Harmonogram zadań Windows",
+ "API zabezpieczeń Windows",
+ "Zarządzanie procesami i sygnałami",
+ "Integracja z linią poleceń (narzędzia ClamAV)"
+ ]
+ },
+ "ecosystem": {
+ "title": "Ekosystem open source",
+ "entries": [
+ "Społeczność ClamAV",
+ "Społeczność Tauri",
+ "Ekosystem Rust",
+ "Współtwórcy open source"
+ ]
+ }
+ },
+ "special-thanks": {
+ "title": "Specjalne podziękowania",
+ "notes": {
+ "early-test": "Wczesne testy i opinie",
+ "bug-report-test": "Zgłoszenia krytycznych błędów i testy w realnych warunkach"
+ },
+ "desc": {
+ "line1": "Specjalne podziękowania dla użytkowników, którzy testowali wersje przedpremierowe i zgłaszali problemy bezpośrednio.",
+ "line2": "Stworzone z szacunkiem dla użytkowników, prywatności i oprogramowania open source. Wykonane przez ArsenTech z pasją i zaufaniem"
+ }
+ }
+}
diff --git a/public/locales/pl/history.json b/public/locales/pl/history.json
new file mode 100644
index 0000000..3acdfe1
--- /dev/null
+++ b/public/locales/pl/history.json
@@ -0,0 +1,87 @@
+{
+ "title": "Historia",
+ "refresh": {
+ "original": "Odśwież",
+ "loading": "Odświeżanie..."
+ },
+ "clear": {
+ "title": "Wyczyść historię",
+ "all": "Wyczyść wszystko",
+ "acknowledged": "Wyczyść potwierdzone",
+ "errors": "Wyczyść błędy",
+ "warnings": "Wyczyść ostrzeżenia",
+ "loading": "Czyszczenie..."
+ },
+ "export": {
+ "title": "Eksportuj historię jako",
+ "dialog-title": "Eksportuj dane historii jako",
+ "csv": "Plik CSV",
+ "json": "Plik JSON"
+ },
+ "clear-messages": {
+ "all": "Historia została wyczyszczona!",
+ "acknowledged": "Potwierdzone wpisy zostały wyczyszczone!",
+ "error": "Wszystkie błędy zostały wyczyszczone!",
+ "warning": "Wszystkie ostrzeżenia zostały wyczyszczone!"
+ },
+ "events": {
+ "real-time-error": "Błąd skanowania w czasie rzeczywistym",
+ "real-time-start": "Rozpoczęto skanowanie w czasie rzeczywistym",
+ "real-time-stop": "Zatrzymano skanowanie w czasie rzeczywistym",
+ "quarantine-threat": "Zagrożenie przeniesione do kwarantanny",
+ "restore-threat": "Zagrożenie przywrócone",
+ "delete-threat": "Zagrożenie usunięte",
+ "scan-start": "Rozpoczęto skanowanie",
+ "scan-finish": "Zakończono skanowanie",
+ "def-update-start": "Rozpoczęto aktualizację baz sygnatur",
+ "def-update-finish": "Zakończono aktualizację baz sygnatur",
+ "def-update-error": "Błąd aktualizacji baz sygnatur",
+ "scheduler-create": "Utworzono nowe zaplanowane zadanie skanowania",
+ "scheduler-delete": "Usunięto zaplanowane zadanie skanowania",
+ "scheduler-trigger": "Uruchomiono zaplanowane zadanie skanowania",
+ "file-delete": "Plik usunięty",
+ "file-delete-error": "Nie udało się usunąć pliku"
+ },
+ "behavior": {
+ "balanced": "Zrównoważony",
+ "safe": "Bezpieczny",
+ "strict": "Restrykcyjny",
+ "expert": "Ekspert"
+ },
+ "details": {
+ "real-time-error": "Nie udało się uruchomić skanowania w czasie rzeczywistym: {{err}}",
+ "real-time-start_one": "Uruchomiono skanowanie w czasie rzeczywistym w trybie {{behavior}}, monitorowana jest jedna ścieżka",
+ "real-time-start_two": "Uruchomiono skanowanie w czasie rzeczywistym w trybie {{behavior}}, monitorowane są dwie ścieżki",
+ "real-time-start_few": "Uruchomiono skanowanie w czasie rzeczywistym w trybie {{behavior}}, monitorowane są {{count}} ścieżki",
+ "real-time-start_many": "Uruchomiono skanowanie w czasie rzeczywistym w trybie {{behavior}}, monitorowanych jest {{count}} ścieżek",
+ "real-time-start_other": "Uruchomiono skanowanie w czasie rzeczywistym w trybie {{behavior}}, monitorowanych jest {{count}} ścieżek",
+ "real-time-stop": "Skanowanie w czasie rzeczywistym zostało zatrzymane",
+ "quarantine-threat": "{{threat}} został przeniesiony do kwarantanny",
+ "restore-threat": "{{threat}} został przywrócony z kwarantanny",
+ "delete-threat": "{{threat}} został usunięty z kwarantanny",
+ "scan-start": "Rozpoczęto skanowanie typu: {{scanType}}",
+ "scan-finish": {
+ "state_zero": "Skanowanie zakończone pomyślnie, nie znaleziono zagrożeń",
+ "state_one": "Skanowanie zakończone pomyślnie, znaleziono jedno zagrożenie",
+ "state_two": "Skanowanie zakończone pomyślnie, znaleziono dwa zagrożenia",
+ "state_few": "Skanowanie zakończone pomyślnie, znaleziono {{count}} zagrożenia",
+ "state_many": "Skanowanie zakończone pomyślnie, znaleziono {{count}} zagrożeń",
+ "state_other": "Skanowanie zakończone pomyślnie, znaleziono {{count}} zagrożeń",
+ "partial": "Skanowanie zakończone z błędami; niektóre pliki mogły nie zostać przeskanowane",
+ "clamav-error": "Skanowanie nie powiodło się z powodu błędu ClamAV",
+ "error": "Skanowanie nie powiodło się (kod wyjścia {{code}})"
+ },
+ "def-update-start": "Rozpoczęto aktualizację bazy ClamAV",
+ "def-update-finish": {
+ "success": "Baza sygnatur jest już aktualna",
+ "warning": "Aktualizacja zakończona z ostrzeżeniami",
+ "error": "Aktualizacja nie powiodła się (kod wyjścia {{code}})"
+ },
+ "scheduler-create": "Nowe zadanie zaplanowane zostało utworzone pomyślnie: {{task}}",
+ "scheduler-delete": "Zadanie skanowania zostało usunięte pomyślnie: {{task}}",
+ "scheduler-trigger-error": "Nie udało się uruchomić zaplanowanego zadania: {{task}}",
+ "scheduler-trigger": "Zaplanowane zadanie uruchomione ręcznie: {{task}}",
+ "file-delete": "Plik został usunięty: {{path}}",
+ "file-delete-error": "Nie udało się usunąć pliku: {{path}} ({{err}})"
+ }
+}
diff --git a/public/locales/pl/messages.json b/public/locales/pl/messages.json
new file mode 100644
index 0000000..d02968c
--- /dev/null
+++ b/public/locales/pl/messages.json
@@ -0,0 +1,97 @@
+{
+ "copy-command": {
+ "success": "Polecenie skopiowane",
+ "error": "Nie udało się skopiować polecenia"
+ },
+ "fetch-error": {
+ "history": "Nie udało się załadować ostatniej historii",
+ "scheduler": "Nie udało się załadować zaplanowanych skanów",
+ "exclusions": "Nie udało się załadować istniejących wykluczeń",
+ "realtime-paths": "Nie udało się załadować ścieżek dla skanowania w czasie rzeczywistym"
+ },
+ "scan-stop-error": "Nie udało się zatrzymać skanowania",
+ "scan-start-error": "Nie udało się uruchomić skanowania",
+ "log-reveal-error": "Nie udało się otworzyć pliku logów",
+ "acknowledge-history": {
+ "success": "Wpis oznaczony jako potwierdzony!",
+ "error": "Nie udało się oznaczyć wpisu jako potwierdzonego"
+ },
+ "trigger-scan": {
+ "success": "Zadanie skanowania uruchomione",
+ "error": "Nie udało się uruchomić zaplanowanego zadania"
+ },
+ "quarantine": {
+ "success": "Zagrożenie przeniesione do kwarantanny!",
+ "error": "Nie udało się przenieść zagrożenia do kwarantanny"
+ },
+ "history-clear-errror": "Nie udało się wyczyścić historii",
+ "export": {
+ "success": "Dane historii wyeksportowano jako {{fileName}}",
+ "error": "Nie udało się wyeksportować danych historii"
+ },
+ "schedule-scan-error": "Nie udało się zaplanować zadania skanowania",
+ "remove-job": {
+ "success": "Zaplanowane zadanie skanowania zostało usunięte!",
+ "error": "Nie udało się usunąć zaplanowanego zadania skanowania"
+ },
+ "clear-jobs": {
+ "success": "Wszystkie zaplanowane zadania skanowania zostały usunięte!",
+ "error": "Nie udało się usunąć wszystkich zaplanowanych zadań skanowania"
+ },
+ "threat-deleted": {
+ "success": "Zagrożenie zostało trwale usunięte!",
+ "error": "Nie udało się usunąć zagrożenia"
+ },
+ "threat-quarantined": {
+ "success": "Wszystkie zagrożenia przeniesione do kwarantanny",
+ "error": "Nie udało się przenieść wszystkich zagrożeń do kwarantanny"
+ },
+ "threat-bulk-delete": {
+ "success": "Wszystkie zagrożenia zostały usunięte",
+ "error": "Nie udało się usunąć wszystkich zagrożeń"
+ },
+ "restore-settings": {
+ "success": "Ustawienia przywrócone do domyślnych",
+ "error": "Nie udało się przywrócić ustawień domyślnych"
+ },
+ "delete-settings": {
+ "success": "Ustawienia zostały usunięte",
+ "error": "Nie udało się usunąć ustawień"
+ },
+ "def-update-error": "Nie udało się zaktualizować baz sygnatur",
+ "save-settings-error": "Nie udało się zapisać ustawień",
+ "restore-quarantine": {
+ "success": "Plik przywrócony z kwarantanny!",
+ "error": "Nie udało się przywrócić pliku z kwarantanny"
+ },
+ "delete-quarantine": {
+ "success": "Plik został trwale usunięty",
+ "error": "Nie udało się usunąć pliku z kwarantanny"
+ },
+ "bulk-restore-quarantine": {
+ "success": "Wszystkie zagrożenia zostały przywrócone",
+ "error": "Nie udało się przywrócić wszystkich zagrożeń"
+ },
+ "bulk-delete-quarantine": {
+ "success": "Wszystkie zagrożenia zostały usunięte",
+ "error": "Nie udało się usunąć wszystkich zagrożeń"
+ },
+ "no-scan-command": "Nie znaleziono polecenia skanowania",
+ "form-validations": {
+ "interval": "Wybierz typ interwału",
+ "scanType": "Wybierz typ skanowania",
+ "days": "Wybierz dzień tygodnia",
+ "hours": {
+ "min": "Wartość musi być między 0 a 23 godzinami",
+ "max": "Wartość nie może być większa niż 23 godziny"
+ },
+ "minutes": {
+ "min": "Wartość musi być między 0 a 59 minutami",
+ "max": "Wartość nie może być większa niż 59 minut"
+ },
+ "directory-path": {
+ "required": "Ścieżka katalogu jest wymagana.",
+ "too-long": "Ścieżka katalogu jest za długa."
+ }
+ }
+}
diff --git a/public/locales/pl/no-clamav-page.json b/public/locales/pl/no-clamav-page.json
new file mode 100644
index 0000000..8d29732
--- /dev/null
+++ b/public/locales/pl/no-clamav-page.json
@@ -0,0 +1,40 @@
+{
+ "title": "Ups, ClamAV nie jest zainstalowany",
+ "step": "Krok {{current}} z {{total}}",
+ "installation": {
+ "title": "Instalacja",
+ "info": "Upewnij się, że zainstalowałeś ClamAV, korzystając z instrukcji instalacji tutaj:",
+ "linux-commands": "Zalecane polecenia dla Linuxa"
+ },
+ "add-to-path": {
+ "title": "Dodawanie do zmiennej środowiskowej PATH",
+ "windows": {
+ "cmd": "Otwórz Wiersz polecenia, a następnie wpisz:",
+ "if-returns-path": "Jeśli zostanie zwrócona ścieżka (np.: C:\\Program Files\\ClamAV):",
+ "steps": [
+ "Otwórz menu Start i wpisz env",
+ "Kliknij \"Edytuj zmienne środowiskowe systemu\".",
+ "Kliknij \"Zmienne środowiskowe\" w oknie Właściwości systemu.",
+ "Znajdź zmienną Path, kliknij Edytuj, a następnie dodaj ścieżkę zwróconą przez polecenie where clamscan.",
+ "Kliknij OK, następnie OK, Zastosuj i ponownie OK"
+ ],
+ "verification": "Sprawdź, otwierając Wiersz polecenia i wpisując:"
+ },
+ "linux": {
+ "cmd": "Otwórz preferowany terminal, a następnie wpisz:",
+ "nano": "Po uzyskaniu ścieżki (np.: /path/to/clamav/bin), otwórz plik ~/.bashrc w nano:",
+ "snippet": "Dodaj poniższy fragment na końcu pliku ~/.bashrc:",
+ "kbd-shortcut": "Naciśnij , następnie , a potem przeładuj terminal, używając:",
+ "verification": "Sprawdź, wpisując:"
+ },
+ "check-step": "Po zainstalowaniu ClamAV i dodaniu jego ścieżki do zmiennej środowiskowej PATH, kliknij poniższy przycisk Sprawdź dostępność, aby aktywować GUI ClamAV za darmo"
+ },
+ "buttons": {
+ "prev": "Wstecz",
+ "next": "Dalej",
+ "check": {
+ "pending": "Sprawdzanie...",
+ "original": "Sprawdź dostępność"
+ }
+ }
+}
diff --git a/public/locales/pl/overview.json b/public/locales/pl/overview.json
new file mode 100644
index 0000000..e283d88
--- /dev/null
+++ b/public/locales/pl/overview.json
@@ -0,0 +1,53 @@
+{
+ "main-scan": {
+ "name": "Skan szybki",
+ "desc": "Sprawdź najczęściej używane lokalizacje"
+ },
+ "full-scan": {
+ "name": "Pełne skanowanie",
+ "desc": "Przeskanuj wszystko (może to chwilę potrwać)"
+ },
+ "custom-scan": {
+ "name": "Skan niestandardowy",
+ "desc": "Wybierz folder do skanowania"
+ },
+ "file-scan": {
+ "name": "Skan pliku",
+ "desc": "Wybierz plik do skanowania"
+ },
+ "quarantine": {
+ "name": "Kwarantanna",
+ "desc": "Zobacz odizolowane złośliwe pliki"
+ },
+ "update": {
+ "name": "Aktualizacja",
+ "desc": "Zaktualizuj definicje wirusów z bazy ClamAV"
+ },
+ "history": {
+ "name": "Historia",
+ "desc": "Zobacz historię działań GUI ClamAV"
+ },
+ "real-time": {
+ "name": "Skanowanie w czasie rzeczywistym",
+ "desc": "Skanuje nowo tworzone pliki w czasie rzeczywistym"
+ },
+ "indicator": {
+ "safe": "Urządzenie jest bezpieczne!",
+ "alert": "Urządzenie jest zagrożone!",
+ "warning": "Niektóre ustawienia ochrony są wyłączone.",
+ "outdated": "Definicje są starsze niż 7 dni. Zaktualizuj natychmiast!",
+ "last-scan": "Ostatnie skanowanie:",
+ "never-scanned": "Nigdy nie skanowano"
+ },
+ "definition": {
+ "title": "Definicje: {{status}}",
+ "updated": "Aktualne",
+ "outdated": "Nieaktualne",
+ "loading": "Ładowanie..."
+ },
+ "turn-on-realtime": "Włącz skanowanie w czasie rzeczywistym",
+ "dialog-title": {
+ "file": "Wybierz plik do skanowania",
+ "folder": "Wybierz wiele folderów do skanowania"
+ }
+}
diff --git a/public/locales/pl/quarantine.json b/public/locales/pl/quarantine.json
new file mode 100644
index 0000000..e5f8709
--- /dev/null
+++ b/public/locales/pl/quarantine.json
@@ -0,0 +1,15 @@
+{
+ "title": "Kwarantanna",
+ "no-threats": {
+ "title": "Brak zagrożeń w kwarantannie",
+ "desc": "Twój system jest czysty i wszystko wygląda dobrze!"
+ },
+ "bulk-actions": {
+ "refresh": {
+ "original": "Odśwież",
+ "loading": "Odświeżanie..."
+ },
+ "clear": "Usuń wszystko",
+ "restore": "Przywróć wszystko"
+ }
+}
diff --git a/public/locales/pl/scan-settings.json b/public/locales/pl/scan-settings.json
new file mode 100644
index 0000000..8da0475
--- /dev/null
+++ b/public/locales/pl/scan-settings.json
@@ -0,0 +1,70 @@
+{
+ "labels": {
+ "recursive": "Rekursywnie",
+ "crossFs": "Skanuj inne zamontowane systemy plików",
+ "followDirSymlinks": "Śledź dowiązania symboliczne katalogów",
+ "followFileSymlinks": "Śledź dowiązania symboliczne plików",
+ "quiet": "Tłumienie standardowego wyjścia",
+ "verbose": "Wyświetl szczegółowe logi",
+ "infected": "Wyświetl tylko zainfekowane pliki",
+ "noSummary": "Ukryj podsumowanie skanowania",
+ "bell": "Odtwórz dźwięk przy wykryciu",
+ "debug": "Wyjście debug",
+ "algorithmicDetection": "Wykrywanie algorytmiczne",
+ "heuristicAlerts": "Alerty heurystyczne",
+ "heuristicPrecedence": "Priorytet skanowania heurystycznego",
+ "detectPUA": "Wykryj potencjalnie niepożądane aplikacje (PUA)",
+ "detectStructured": "Wykryj numery SSN i karty kredytowe",
+ "structuredSSNFormat": "Format SSN",
+ "structuredSSNCount": "Próg wykrywania SSN",
+ "structuredCCCount": "Próg wykrywania kart kredytowych",
+ "scanPE": "Skanuj pliki PE",
+ "scanELF": "Skanuj pliki ELF",
+ "scanOLE2": "Skanuj pliki Office / MSI",
+ "scanPDF": "Skanuj pliki PDF",
+ "scanHTML": "Skanuj pliki HTML",
+ "scanArchive": "Skanuj archiwa",
+ "scanMail": "Skanuj pliki mailowe",
+ "detectBroken": "Wykryj uszkodzone pliki wykonywalne",
+ "maxFileSize": "Maksymalny rozmiar pliku (KB)",
+ "maxScanSize": "Maksymalny rozmiar skanowania (KB)",
+ "alertEncrypted": "Alert dla zaszyfrowanych archiwów lub dokumentów",
+ "maxFiles": "Maksymalna liczba wyodrębnionych plików",
+ "maxRecursion": "Limit rekursji archiwum",
+ "maxDirRecursion": "Głębokość rekursji katalogów",
+ "noCerts": "Wyłącz weryfikację Authenticode",
+ "disableCache": "Wyłącz pamięć podręczną",
+ "officialDbOnly": "Używaj tylko oficjalnych baz danych",
+ "leaveTemps": "Nie usuwaj plików tymczasowych",
+ "bytecode": "Włącz bytecode",
+ "bytecodeUnsigned": "Pozwól na niezaufany bytecode",
+ "bytecodeTimeout": "Limit czasu bytecode (ms)",
+ "databasePath": "Ścieżka bazy danych",
+ "tempDir": "Katalog plików tymczasowych"
+ },
+ "descriptions": {
+ "debug": "Wyświetl komunikaty debug z libclamav.",
+ "heuristicAlerts": "Może zwiększyć liczbę fałszywych alarmów.",
+ "bytecodeUnsigned": "Niebezpieczne. Używaj tylko do testów."
+ },
+ "option-group": {
+ "detection": "Wykrywanie",
+ "file-types": "Typy plików",
+ "filesystem": "System plików",
+ "limits-performance": "Limity i wydajność",
+ "output": "Wyjście",
+ "advanced": "Zaawansowane opcje skanowania"
+ },
+ "choices": {
+ "sym-links": [
+ "Nigdy",
+ "Tylko jeśli podano jawnie",
+ "Zawsze"
+ ],
+ "ssn-formats": [
+ "xxx-yy-zzzz",
+ "xxxyyzzzz",
+ "Oba formaty"
+ ]
+ }
+}
diff --git a/public/locales/pl/scan.json b/public/locales/pl/scan.json
new file mode 100644
index 0000000..55ff2ca
--- /dev/null
+++ b/public/locales/pl/scan.json
@@ -0,0 +1,89 @@
+{
+ "title": "Skanowanie",
+ "scan-complete": "Skanowanie zakończone!",
+ "dialog-title": {
+ "file": "Wybierz plik do skanowania",
+ "folder": "Wybierz foldery do skanowania"
+ },
+ "scan-type": {
+ "title": "Typ skanowania: {{scanType}}",
+ "main": {
+ "name": "Skan szybki",
+ "desc": "Sprawdź najczęstsze lokalizacje pod kątem złośliwych plików"
+ },
+ "full": {
+ "name": "Pełne skanowanie",
+ "desc": "Skanuj wszystko na tym urządzeniu (może to chwilę potrwać)"
+ },
+ "custom": {
+ "name": "Skan niestandardowy",
+ "desc": "Wybierz folder do skanowania"
+ },
+ "file": {
+ "name": "Skan pliku",
+ "desc": "Wybierz plik do skanowania"
+ },
+ "fallback": "Nieznany typ skanowania"
+ },
+ "process": {
+ "preparing": "Przygotowywanie skanowania...",
+ "percentage": "{{percentage}}% - przeskanowano {{scanned}} z {{total}} plików",
+ "files": "Przeskanowano {{scanned}} plików",
+ "scanning": "Skanowanie..."
+ },
+ "items": {
+ "currently-scanned": "Aktualnie skanowane",
+ "location": "Miejsce skanowania",
+ "findings": "Wyniki",
+ "start-time": "Czas rozpoczęcia",
+ "threat": "{{threats}} zagrożeń"
+ },
+ "stop-scan": "Zatrzymaj skanowanie",
+ "full-scan-warn": "Pełne skanowanie może potrwać dłużej w zależności od rozmiaru dysku.",
+ "start-scan": "Rozpocznij skanowanie",
+ "choose": {
+ "file": "Wybierz plik",
+ "folder": "Wybierz folder"
+ },
+ "finished": {
+ "error": "Skanowanie nie powiodło się",
+ "no-threats": "Nie wykryto zagrożeń!",
+ "with-threats_one": "Jedno zagrożenie wymaga uwagi",
+ "with-threats_two": "Dwa zagrożenia wymagają uwagi",
+ "with-threats_few": "{{count}} zagrożenia wymagają uwagi",
+ "with-threats_many": "{{count}} zagrożeń wymaga uwagi",
+ "with-threats_other": "{{count}} zagrożeń wymaga uwagi"
+ },
+ "close": "Zamknij",
+ "back-to-overview": "Powrót do przeglądu",
+ "exit-code": [
+ "Skanowanie zakończone pomyślnie",
+ "Wykryto zagrożenia",
+ "Niektóre pliki nie mogły zostać przeskanowane z powodu ograniczeń dostępu"
+ ],
+ "exit-code-fallback": "Skanowanie nie powiodło się z powodu błędu wewnętrznego",
+ "exit-code-formatting": "{{msg}} (Kod wyjścia: {{exitCode}})",
+ "please-wait": "Proszę czekać...",
+ "resolve": {
+ "title": "Rozwiąż",
+ "quarantine": "Przenieś wszystkie do kwarantanny",
+ "delete": "Usuń wszystkie",
+ "success": "Pomyślnie rozwiązano!"
+ },
+ "notification": {
+ "scan-finish": {
+ "title": "Skanowanie zakończone!",
+ "desc_zero": "Nie wykryto żadnych zagrożeń",
+ "desc_one": "Wykryto jedno zagrożenie",
+ "desc_two": "Wykryto dwa zagrożenia",
+ "desc_few": "Wykryto {{count}} zagrożenia",
+ "desc_many": "Wykryto {{count}} zagrożeń",
+ "desc_other": "Wykryto {{count}} zagrożeń",
+ "with-err": "Skanowanie zakończone z błędami"
+ },
+ "scan-start": {
+ "title": "Rozpoczęto skanowanie!",
+ "desc": "Rozpoczęto skanowanie: {{scanName}}"
+ }
+ }
+}
diff --git a/public/locales/pl/scheduler.json b/public/locales/pl/scheduler.json
new file mode 100644
index 0000000..95ff8a1
--- /dev/null
+++ b/public/locales/pl/scheduler.json
@@ -0,0 +1,44 @@
+{
+ "title": "Harmonogram",
+ "refresh": {
+ "original": "Odśwież",
+ "loading": "Odświeżanie..."
+ },
+ "clear-jobs": "Wyczyść zadania",
+ "form": {
+ "title": "Zaplanuj skanowanie",
+ "interval": {
+ "label": "Interwał",
+ "values": {
+ "daily": "Codziennie",
+ "weekly": "Co tydzień",
+ "monthly": "Co miesiąc"
+ },
+ "placeholder": "Wybierz interwał zadania"
+ },
+ "scan-type": {
+ "label": "Typ skanowania",
+ "placeholder": "Wybierz typ skanowania"
+ },
+ "days": {
+ "label": "Dzień tygodnia",
+ "values": {
+ "mon": "Poniedziałek",
+ "tue": "Wtorek",
+ "wed": "Środa",
+ "thu": "Czwartek",
+ "fri": "Piątek",
+ "sat": "Sobota",
+ "sun": "Niedziela"
+ },
+ "placeholder": "Wybierz dzień tygodnia"
+ },
+ "hour": "Godzina",
+ "minute": "Minuta",
+ "button": {
+ "pending": "Proszę czekać...",
+ "original": "Zaplanuj"
+ },
+ "scheduled-time": "Zaplanowany czas: {{time}}"
+ }
+}
diff --git a/public/locales/pl/settings.json b/public/locales/pl/settings.json
new file mode 100644
index 0000000..5b11723
--- /dev/null
+++ b/public/locales/pl/settings.json
@@ -0,0 +1,173 @@
+{
+ "title": "Ustawienia",
+ "json-settings": "Ustawienia JSON",
+ "export": {
+ "button-title": "Eksportuj ustawienia",
+ "title": "Eksport ustawień GUI ClamAV",
+ "success": "Ustawienia zostały pomyślnie wyeksportowane",
+ "error": "Nie udało się wyeksportować ustawień"
+ },
+ "import": {
+ "button-title": "Importuj ustawienia",
+ "title": "Import ustawień GUI ClamAV",
+ "empty-content": "Wygląda na to, że zawartość ustawień jest prawie pusta",
+ "success": "Ustawienia zostały pomyślnie zaimportowane",
+ "error": "Nie udało się zaimportować ustawień"
+ },
+ "scan-profile": {
+ "title": "Aktywny profil skanowania",
+ "main": "Skan szybki",
+ "custom": "Skan niestandardowy",
+ "file": "Skan pliku"
+ },
+ "tabs": {
+ "general": "Ogólne",
+ "advanced": "Zaawansowane",
+ "scan": "Skanowanie",
+ "update": "Aktualizacja"
+ },
+ "appearance": {
+ "title": "Wygląd",
+ "theme": {
+ "title": "Motyw",
+ "system": "Systemowy",
+ "light": "Jasny",
+ "dark": "Ciemny"
+ },
+ "color": {
+ "title": "Kolor",
+ "blue": "Niebieski",
+ "green": "Zielony",
+ "rose": "Różowy"
+ }
+ },
+ "date-format": {
+ "title": "Format daty",
+ "us": {
+ "title": "Amerykański",
+ "format": "mm/dd/yyyy hh:mm:ss"
+ },
+ "eu": {
+ "title": "Europejski",
+ "format": "dd/mm/yyyy hh:mm:ss"
+ },
+ "iso": {
+ "title": "Międzynarodowy",
+ "format": "yyyy-mm-dd hh:mm:ss"
+ }
+ },
+ "ui": {
+ "title": "Interfejs użytkownika",
+ "scheduler-ui": {
+ "title": "Włącz UI Harmonogramu",
+ "desc": "Daje dostęp do strony Harmonogram"
+ },
+ "language": {
+ "title": "Język",
+ "desc": "Język interfejsu GUI ClamAV"
+ },
+ "badge": {
+ "title": "Widoczność odznaki",
+ "desc": "Pokaż ikony lub tekst w odznakach UI",
+ "placeholder": "Wybierz typ widoczności odznaki",
+ "options": {
+ "icon": "Tylko ikona",
+ "icon-text": "Ikona i tekst",
+ "text": "Tylko tekst"
+ }
+ }
+ },
+ "notifs": {
+ "title": "Powiadomienia",
+ "scan-start": {
+ "title": "Przy rozpoczęciu skanowania",
+ "desc": "Powiadamia po rozpoczęciu skanowania"
+ },
+ "scan-finish": {
+ "title": "Po zakończeniu skanowania",
+ "desc": "Powiadamia po zakończeniu skanowania"
+ }
+ },
+ "scan": {
+ "title": "Ustawienia skanowania",
+ "desc": "Te ustawienia są stosowane tylko do Skanu szybkiego, Skanu niestandardowego i Skanu pliku",
+ "confirm-stop": {
+ "title": "Potwierdź zatrzymanie",
+ "desc": "Pokaż komunikat potwierdzający przy zatrzymywaniu skanowania"
+ },
+ "advanced-desc": "Zaawansowane opcje dla każdego profilu skanowania. Może zmniejszyć skuteczność wykrywania"
+ },
+ "exclusions": {
+ "title": "Wykluczenia katalogów",
+ "add-button": "Dodaj wykluczenie",
+ "no-exclusions": "Brak wykluczeń folderów",
+ "form-title": "Dodaj katalog do wykluczeń",
+ "modal-title": "To spowoduje usunięcie ścieżki katalogu z wykluczeń"
+ },
+ "realtime-paths": {
+ "title": "Ścieżki monitorowane przez Skanowanie w Czasie Rzeczywistym",
+ "desc": "Lista folderów aktualnie monitorowanych przez skanowanie w czasie rzeczywistym",
+ "add-button": "Dodaj ścieżkę",
+ "no-paths": "Brak aktualnych ścieżek do monitorowania",
+ "form-title": "Dodaj ścieżkę do monitorowania",
+ "modal-title": "To spowoduje usunięcie folderu z monitorowanych ścieżek, co może narazić folder na zagrożenia."
+ },
+ "folder-path-form": {
+ "path": "Ścieżka katalogu",
+ "browse": "Przeglądaj",
+ "add": "Dodaj",
+ "close": "Zamknij",
+ "dialog-title": "Wybierz ścieżkę folderu do dodania"
+ },
+ "advanced": {
+ "title": "Zaawansowane opcje GUI",
+ "desc": "Może naruszyć niektóre funkcje i zmniejszyć skuteczność wykrywania",
+ "dev-mode": {
+ "title": "Tryb deweloperski",
+ "desc": "Pokazuje ID przy każdym danych. Idealne dla programistów!"
+ },
+ "real-time-scan": {
+ "title": "Skanowanie w czasie rzeczywistym",
+ "desc": "Automatycznie skanuje pliki przy ich tworzeniu lub modyfikacji."
+ },
+ "behavior": {
+ "title": "Zachowanie",
+ "desc": "Jak GUI ClamAV zachowuje się w innych przypadkach?",
+ "placeholder": "Zachowanie ClamAV",
+ "choices": {
+ "balanced": "Zbalansowane",
+ "safe": "Bezpieczne",
+ "strict": "Surowe",
+ "expert": "Ekspert"
+ }
+ }
+ },
+ "logs": {
+ "title": "Logi",
+ "auto-scroll": {
+ "title": "Automatyczne przewijanie",
+ "desc": "Przewija log automatycznie po dodaniu nowego wpisu"
+ },
+ "max-lines": {
+ "title": "Maksymalna liczba linii logu",
+ "desc": "Wyświetla log do wybranej maksymalnej liczby linii",
+ "placeholder": "Wybierz maksymalną liczbę linii",
+ "lines": "{{lines}} linii"
+ }
+ },
+ "danger-zone": {
+ "title": "Strefa zagrożenia",
+ "desc": "Uważaj przed usunięciem ustawień związanych z GUI ClamAV",
+ "delete": {
+ "title": "Usuń ustawienia (trwale)",
+ "desc": "To spowoduje wyczyszczenie wszystkich danych ustawień",
+ "button": "Usuń ustawienia"
+ },
+ "restore": {
+ "title": "Przywróć ustawienia domyślne",
+ "desc": "To spowoduje przywrócenie wszystkich ustawień do wartości domyślnych",
+ "button": "Przywróć domyślne"
+ },
+ "pending": "Proszę czekać..."
+ }
+}
diff --git a/public/locales/pl/stats.json b/public/locales/pl/stats.json
new file mode 100644
index 0000000..7116b0d
--- /dev/null
+++ b/public/locales/pl/stats.json
@@ -0,0 +1,71 @@
+{
+ "title": "Statystyki",
+ "refresh": {
+ "original": "Odśwież statystyki antywirusa",
+ "loading": "Odświeżanie..."
+ },
+ "device-info": {
+ "title": "Informacje o urządzeniu",
+ "os": "System operacyjny:",
+ "host-name": "Nazwa hosta:"
+ },
+ "loading": "Ładowanie...",
+ "no-data": "Brak danych",
+ "date": {
+ "last-30-secs": "Ostatnie 30 sekund",
+ "last-6-months": "Ostatnie 6 miesięcy"
+ },
+ "disk": {
+ "title": "Dysk twardy",
+ "desc": "Operacje I/O dysku twardego",
+ "read-stat": "Odczyt: {{read}}/s",
+ "write-stat": "Zapis: {{write}}/s",
+ "labels": {
+ "read": "Prędkość odczytu",
+ "write": "Prędkość zapisu"
+ }
+ },
+ "ram": {
+ "title": "Pamięć",
+ "desc": "Aktualne użycie pamięci RAM",
+ "stat": "{{total}} ({{used}} użyte)",
+ "usage": "Użycie (%):"
+ },
+ "cpu": {
+ "title": "Aktywność CPU",
+ "desc": "Aktualna aktywność CPU w oparciu o częstotliwość bazową",
+ "speed-stat": "Prędkość: {{freq}} GHz",
+ "util-stat": "Wykorzystanie: {{util}}%",
+ "utilization": "Wykorzystanie (%):"
+ },
+ "stat-label": "Zagrożenia",
+ "threats": {
+ "title": "Przegląd stanu zagrożeń",
+ "quarantined": "W kwarantannie",
+ "skipped": "Pominięte",
+ "deleted": "Oczyszczone",
+ "unresolved": "Nie rozwiązane"
+ },
+ "virus-types": {
+ "title": "Zagrożenia według typu złośliwego oprogramowania",
+ "trojan": "Koń trojański",
+ "ransomware": "Ransomware",
+ "spyware": "Spyware",
+ "rootkit": "Rootkit",
+ "other": "Inne"
+ },
+ "scan": {
+ "title": "Zagrożenia według typu skanowania",
+ "main": "Skan szybki",
+ "full": "Pełne skanowanie",
+ "custom": "Skan niestandardowy",
+ "file": "Skan pliku",
+ "real-time": "Skan w czasie rzeczywistym"
+ },
+ "activity": {
+ "title": "Aktywność skanowania",
+ "unresolved": "Nie rozwiązane",
+ "resolved": "Rozwiązane"
+ },
+ "month": ["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"]
+}
diff --git a/public/locales/pl/table.json b/public/locales/pl/table.json
new file mode 100644
index 0000000..cca95ce
--- /dev/null
+++ b/public/locales/pl/table.json
@@ -0,0 +1,89 @@
+{
+ "pagination": {
+ "rows-count": "{{selected}} z {{filtered}} wierszy wybranych.",
+ "row-per-page": "Wierszy na stronę",
+ "page-count": "Strona {{index}} z {{count}}",
+ "buttons": {
+ "first": "Przejdź do pierwszej strony",
+ "previous": "Przejdź do poprzedniej strony",
+ "next": "Przejdź do następnej strony",
+ "last": "Przejdź do ostatniej strony"
+ }
+ },
+ "view": {
+ "title": "Widok",
+ "toggle": "Przełącz kolumny"
+ },
+ "filter": {
+ "threats": "Szukaj zagrożeń...",
+ "history": {
+ "title": "Filtruj status po",
+ "all": "Wszystkie",
+ "success": "Sukces",
+ "warning": "Ostrzeżenie",
+ "error": "Błąd",
+ "acknowledged": "Potwierdzone"
+ }
+ },
+ "not-found": {
+ "threats": "Nie znaleziono zagrożeń.",
+ "history": "Nie znaleziono wpisów.",
+ "scheduler": "Nie znaleziono zaplanowanych skanowań."
+ },
+ "heading": {
+ "threats": {
+ "threat": "Zagrożenie",
+ "path": "Ścieżka",
+ "detected-at": "Wykryto"
+ },
+ "quarantine": {
+ "quarantined-at": "W kwarantannie od",
+ "size": "Rozmiar"
+ },
+ "history": {
+ "timestamp": "Znacznik czasu",
+ "event": "Zdarzenie",
+ "details": "Szczegóły"
+ },
+ "scheduler": {
+ "job-name": "Nazwa zadania",
+ "interval": "Interwał",
+ "scan-type": "Typ",
+ "last-scan": "Ostatnie skanowanie",
+ "next-scan": "Następne skanowanie"
+ },
+ "status": "Status",
+ "actions": "Akcje"
+ },
+ "actions": {
+ "open-menu": "Otwórz menu",
+ "quarantine": "Kwarantanna",
+ "delete": "Usuń trwale",
+ "open": "Otwórz folder",
+ "scan-now": "Skanuj teraz",
+ "view-log": "Pokaż log",
+ "reveal-log": "Pokaż plik logu",
+ "restore": "Przywróć",
+ "remove-job": "Usuń zadanie",
+ "view-details": "Pokaż szczegóły"
+ },
+ "status": {
+ "threats": {
+ "quarantined": "W kwarantannie",
+ "deleted": "Usunięte",
+ "detected": "Wykryte"
+ },
+ "history": {
+ "success": "Sukces",
+ "warning": "Ostrzeżenie",
+ "error": "Błąd",
+ "acknowledged": "Potwierdzone"
+ }
+ },
+ "interval": {
+ "daily": "Codziennie",
+ "weekly": "Co tydzień",
+ "monthly": "Co miesiąc"
+ },
+ "mark-as-acknowledged": "Oznacz jako potwierdzone"
+}
diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json
new file mode 100644
index 0000000..16659ff
--- /dev/null
+++ b/public/locales/pl/translation.json
@@ -0,0 +1,34 @@
+{
+ "sidebar": {
+ "overview": "Przegląd",
+ "scan": "Skanowanie",
+ "quarantine": "Kwarantanna",
+ "history": "Historia",
+ "stats": "Statystyki",
+ "scheduler": "Harmonogram",
+ "settings": "Ustawienia",
+ "about": "O ClamAV GUI"
+ },
+ "num-suffix": {
+ "kilo": "K",
+ "million": "M",
+ "billion": "B",
+ "trillion": "T"
+ },
+ "size-suffix": {
+ "byte": "Bajty",
+ "kb": "KB",
+ "mb": "MB",
+ "gb": "GB",
+ "tb": "TB"
+ },
+ "log": {
+ "title": "Log",
+ "page-name": "Przeglądarka logów",
+ "log-id": "ID logu:",
+ "back": "Powrót",
+ "please-wait": "Proszę czekać..."
+ },
+ "splash-screen-text": "Ładowanie...",
+ "copy-command": "Skopiuj polecenie"
+}
diff --git a/public/locales/pl/update.json b/public/locales/pl/update.json
new file mode 100644
index 0000000..25ee5a4
--- /dev/null
+++ b/public/locales/pl/update.json
@@ -0,0 +1,65 @@
+{
+ "definitions": {
+ "title": "Definicje",
+ "status": {
+ "updating": "Aktualizacja definicji...",
+ "checking": "Sprawdzanie statusu bazy danych...",
+ "outdated": "Wymagana aktualizacja!",
+ "updated": "Aktualne!"
+ },
+ "last-updated": "Ostatnia aktualizacja: {{date}}",
+ "update": {
+ "pending": "Aktualizacja...",
+ "original": "Aktualizuj bazę danych"
+ },
+ "exit-codes": [
+ "Definicje zostały zaktualizowane pomyślnie",
+ "Niektóre źródła aktualizacji mogły być niedostępne"
+ ],
+ "clamav-version": "ClamAV v{{engine}}, Wersja bazy danych: {{dbVersion}}",
+ "version": "Wersja bazy definicji wirusów"
+ },
+ "gui": {
+ "title": "Aktualizator GUI",
+ "checking": {
+ "main": "Sprawdzanie nowej wersji...",
+ "secondary": "Proszę czekać..."
+ },
+ "updating": {
+ "main": "Aktualizacja GUI...",
+ "secondary": "Proszę czekać aż pobieranie zostanie zakończone..."
+ },
+ "needs-update": {
+ "main": "Nowa wersja jest dostępna!",
+ "secondary": "Upewnij się, że zaktualizujesz GUI dla ulepszeń."
+ },
+ "updated": {
+ "main": "GUI jest aktualne!",
+ "secondary": "Brak nowych aktualizacji"
+ },
+ "failed-check": {
+ "main": "Nie udało się sprawdzić aktualizacji",
+ "secondary": "Spróbuj ponownie później, aby sprawdzić nową wersję."
+ },
+ "completed": {
+ "main": "GUI zostało zaktualizowane do nowej wersji!",
+ "secondary": "Upewnij się, że ponownie uruchomisz aplikację, aby zakończyć aktualizację."
+ },
+ "failed-update": {
+ "main": "Nie udało się zaktualizować GUI",
+ "secondary": "Spróbuj ponownie później."
+ },
+ "buttons": {
+ "relaunch": "Uruchom ponownie",
+ "update": {
+ "pending": "Aktualizacja...",
+ "original": "Aktualizuj"
+ },
+ "check": {
+ "pending": "Sprawdzanie...",
+ "original": "Sprawdź aktualizacje"
+ },
+ "changelog": "Otwórz dziennik zmian"
+ }
+ }
+}
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index c630ae3..e7abc13 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -40,5 +40,9 @@ notify = "8.2.0"
tauri-plugin-notification = "2"
regex = "1.12.3"
+[features]
+default = ["updater"]
+updater = ["tauri-plugin-updater"]
+
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
-tauri-plugin-updater = "2.10"
+tauri-plugin-updater = { version = "2.10", optional = true }
\ No newline at end of file
diff --git a/src-tauri/assets/i18n/pl.json b/src-tauri/assets/i18n/pl.json
new file mode 100644
index 0000000..2587009
--- /dev/null
+++ b/src-tauri/assets/i18n/pl.json
@@ -0,0 +1,17 @@
+{
+ "tray": {
+ "open": "",
+ "about": "",
+ "settings": "Ustawienia",
+ "scan": {
+ "title": "Skanowanie",
+ "main": "",
+ "full": "",
+ "custom": "",
+ "file": ""
+ },
+ "quit": "",
+ "update": "Aktualizacja",
+ "tooltip": ""
+ }
+}
\ No newline at end of file
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index b6ea42e..bb1833d 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -9,9 +9,6 @@
"beforeBuildCommand": "npm run build",
"frontendDist": "../dist"
},
- "bundle": {
- "publisher": "ArsenTech"
- },
"app": {
"windows": [
{
@@ -25,6 +22,7 @@
}
},
"bundle": {
+ "publisher": "ArsenTech",
"active": true,
"targets": "all",
"icon": [
diff --git a/src/i18n/config.ts b/src/i18n/config.ts
index 9a97b50..fcae5b1 100644
--- a/src/i18n/config.ts
+++ b/src/i18n/config.ts
@@ -1,17 +1,20 @@
-export type LangCode = "en" | "hy" | "ru"
-type CountryCode = "us" | "am" | "ru"
+export type LangCode = "en" | "hy" | "ru" | "pl"
+type CountryCode = "us" | "am" | "ru" | "pl"
type languageOption = { language: string; code: LangCode, countryCode: CountryCode };
-import {enUS,hy,ru, type Locale} from "date-fns/locale"
+import * as DateFnsLocale from "date-fns/locale"
export const languageOptions: languageOption[] = [
{ language: "English", code: "en", countryCode: "us"},
{ language: "Հայերեն", code: "hy", countryCode: "am"},
{ language: "Русский", code: "ru", countryCode: "ru"},
+ { language: "Polski", code: "pl", countryCode: "pl" }
];
-export const dateFnsLanguages: Record = {
- en: enUS,
- hy, ru
+export const dateFnsLanguages: Record = {
+ en: DateFnsLocale.enUS,
+ hy: DateFnsLocale.hy,
+ ru: DateFnsLocale.ru,
+ pl: DateFnsLocale.pl
}
export const suffixWhitelist: Set = new Set(["en"])
\ No newline at end of file
diff --git a/src/lib/constants/index.ts b/src/lib/constants/index.ts
index 6173937..1553fe7 100644
--- a/src/lib/constants/index.ts
+++ b/src/lib/constants/index.ts
@@ -1,19 +1,6 @@
import { Search, SearchCheck, FolderSearch, FileSearch } from "lucide-react";
import { IScanMenuItem, ISpecialThanksItem } from "../types/items";
import { ScanType } from "../types/enums";
-import { cn } from "@/lib/utils";
-import { buttonVariants } from "@/components/ui/button";
-import { MarkdownToJSX } from "markdown-to-jsx";
-
-export const COMPONENTS: MarkdownToJSX.Overrides = {
- h1: { props: { className: "scroll-m-40 border-b pb-2 text-3xl font-semibold tracking-tight mt-0! mb-2!" } },
- h2: { props: { className: "scroll-m-40 border-b pb-2 text-2xl font-semibold tracking-tight mt-0! mb-2!" } },
- h3: { props: { className: "scroll-m-40 text-xl font-semibold tracking-tight mt-0! mb-2!", } },
- h4: { props: { className: "scroll-m-40 text-lg font-semibold tracking-tight mt-0! mb-2!", } },
- p: { props: { className: "leading-7" } },
- a: { props: { className: cn(buttonVariants({ variant: "link" }), "px-0.5 py-0 whitespace-normal inline-block text-sm md:text-base break-all") } },
- small: { props: { className: "text-sm font-medium leading-none" } },
-}
export const DAYS_OF_THE_WEEK = ["mon","tue","wed","thu","fri","sat","sun"] as const;
export const INTERVALS = ["daily","weekly","monthly"] as const
diff --git a/src/lib/constants/md-components.tsx b/src/lib/constants/md-components.tsx
new file mode 100644
index 0000000..dd1dabe
--- /dev/null
+++ b/src/lib/constants/md-components.tsx
@@ -0,0 +1,17 @@
+import { Button } from "@/components/ui/button";
+import { openUrl } from "@tauri-apps/plugin-opener";
+import { MarkdownToJSX } from "markdown-to-jsx";
+
+export const COMPONENTS: MarkdownToJSX.Overrides = {
+ h1: { props: { className: "scroll-m-40 border-b pb-2 text-3xl font-semibold tracking-tight mt-0! mb-2!" } },
+ h2: { props: { className: "scroll-m-40 border-b pb-2 text-2xl font-semibold tracking-tight mt-0! mb-2!" } },
+ h3: { props: { className: "scroll-m-40 text-xl font-semibold tracking-tight mt-0! mb-2!", } },
+ h4: { props: { className: "scroll-m-40 text-lg font-semibold tracking-tight mt-0! mb-2!", } },
+ p: { props: { className: "leading-7" } },
+ a: (props: React.ComponentProps<"a">) => (
+
+ ),
+ small: { props: { className: "text-sm font-medium leading-none" } },
+}
\ No newline at end of file
diff --git a/src/pages/about.tsx b/src/pages/about.tsx
index 11e5968..375e941 100644
--- a/src/pages/about.tsx
+++ b/src/pages/about.tsx
@@ -2,7 +2,7 @@ import CreditsSection from "@/components/credits";
import { AppLayout } from "@/components/layout";
import Logo from "@/components/logo";
import { Button } from "@/components/ui/button";
-import { COMPONENTS } from "@/lib/constants";
+import { COMPONENTS } from "@/lib/constants/md-components";
import { INITIAL_VERSION_INFO } from "@/lib/constants/states";
import { parseClamVersion } from "@/lib/helpers";
import { IClamAvVersion } from "@/lib/types";