diff --git a/client/public/assets/locales/pl.json b/client/public/assets/locales/pl.json
new file mode 100644
index 00000000..8baa21ae
--- /dev/null
+++ b/client/public/assets/locales/pl.json
@@ -0,0 +1,393 @@
+{
+ "failed": "Nie powodzenie",
+ "welcome": {
+ "step": "Krok",
+ "title": "Witamy w MySpeed!",
+ "subtext": "Skonfigurujmy MySpeed po raz pierwszy. Nie martw się, to nie zajmie dużo czasu.",
+ "provider_title": "Wybierz dostawcę",
+ "provider_subtext": "Wybierz dostawcę, którego chcesz używać. To on będzie przeprowadzał Twoje testy.",
+ "data_title": "Ustaw optymalne prędkości",
+ "data_subtext": "Wybierz prędkości określone w Twojej umowie",
+ "ms": "(w ms)",
+ "mbps": "(w Mbps)",
+ "accept_title": "Akceptuj warunki",
+ "accept_subtext": "W tym kroku chcielibyśmy poinformować Cię o licencji Ookla. Przeczytaj ją i potwierdź, że ją zaakceptowałeś, klikając „Gotowe”."
+ },
+ "dialog": {
+ "okay": "OK",
+ "done": "Gotowe",
+ "continue": "Kontynuuj",
+ "apply": "Tak, zastosuj",
+ "update": "Aktualizuj",
+ "close": "Zamknij",
+ "unset": "Usuń",
+ "retry": "Spróbuj ponownie",
+ "login": "Zaloguj się",
+ "password": {
+ "title": "Wymagane hasło",
+ "placeholder": "Twoje hasło",
+ "wrong": "Wprowadzone hasło jest niepoprawne",
+ "unlock": "Odblokuj"
+ },
+ "api": {
+ "title": "API niedostępne",
+ "description": "MySpeed nie mógł połączyć się z API tej instancji. Spróbuj ponownie później."
+ },
+ "provider": {
+ "interface": "Interfejs",
+ "server": "Serwer",
+ "server_id": "ID serwera",
+ "choose_automatically": "Wybierz automatycznie",
+ "ookla_license": "Przeczytałem i akceptuję EULA, politykę prywatności oraz regulamin Ookla."
+ }
+ },
+ "dropdown": {
+ "settings": "Ustawienia",
+ "changes_applied": "Twoje zmiany zostały zapisane.",
+ "language_changed": "Język został zmieniony.",
+ "provider_changed": "Dostawca został zmieniony.",
+ "changes_unsaved": "Twoje zmiany nie zostały zapisane. Sprawdź wprowadzone dane.",
+ "invalid": "Nieprawidłowe dane",
+ "ping": "Optymalny ping",
+ "upload": "Optymalna prędkość wysyłania",
+ "download": "Optymalna prędkość pobierania",
+ "recommendations": "Rekomendacje",
+ "change_provider": "Zmień dostawcę",
+ "password": "Zmień hasło",
+ "cron": "Ustaw częstotliwość",
+ "time": "Ustaw okres",
+ "storage": "Zarządzaj przechowywaniem",
+ "pause_tests": "Wstrzymaj testy",
+ "resume_tests": "Wznów testy",
+ "language": "Zmień język",
+ "info": "O projekcie",
+ "provider": "O dostawcy",
+ "integrations": "Integracje"
+ },
+ "options": {
+ "time": {
+ "24hours": "24 godziny (domyślnie)",
+ "2days": "2 dni (łącznie)",
+ "7days": "7 dni (średnio)",
+ "30days": "30 dni (średnio)"
+ },
+ "cron": {
+ "continuous": "Ciągły (co minutę)",
+ "frequent": "Bardzo często (co 30 minut)",
+ "default": "Domyślnie (co godzinę)",
+ "rare": "Rzadko (co 3 godziny)",
+ "really_rare": "Bardzo rzadko (co 6 godzin)"
+ },
+ "level": {
+ "no_access": "Brak dostępu",
+ "read_access": "Tylko do odczytu"
+ }
+ },
+ "page": {
+ "overview": "Przegląd",
+ "statistics": "Statystyki"
+ },
+ "update": {
+ "ping_title": "Ustaw optymalny ping (ms)",
+ "ping_placeholder": "Ping (ms)",
+ "upload_title": "Ustaw optymalną prędkość wysyłania (Mbps)",
+ "upload_placeholder": "Prędkość wysyłania (Mbps)",
+ "download_title": "Ustaw optymalną prędkość pobierania (Mbps)",
+ "download_placeholder": "Prędkość pobierania (Mbps)",
+ "recommendations_title": "Optymalne rekomendacje",
+ "recommendations_set": "Ustawić automatyczne rekomendacje?",
+ "provider_title": "Wybierz dostawcę testów prędkości",
+ "manually": "Ustaw ręcznie",
+ "new_password": "Ustaw nowe hasło",
+ "password_placeholder": "Nowe hasło",
+ "password_removed": "Blokada hasłem została usunięta, a zapisane hasło zostało usunięte.",
+ "level": "Zmień poziom",
+ "level_title": "Uprawnienia dla odwiedzających",
+ "cron_title": "Ustaw częstotliwość testów",
+ "cron_rules": "Reguła Cron",
+ "cron_next_test": "Następny test:",
+ "time_title": "Pokaż testy z ostatnich ...",
+ "download": "Pobierz",
+ "pause_title": "Wstrzymaj testy prędkości na...",
+ "hours": "Godziny",
+ "pause": "Wstrzymaj",
+ "release_manually": "Wznów ręcznie",
+ "language": "Zmień język",
+ "view_title": "Zmień widok"
+ },
+ "header": {
+ "title": "MySpeed",
+ "running_tooltip": "Test prędkości w trakcie",
+ "start_tooltip": "Uruchom test prędkości",
+ "new_update": "Aktualizacja dostępna",
+ "download": "Pobierz",
+ "paused": "Testy prędkości są obecnie wstrzymane. Wznów je, jeśli chcesz wykonać test.",
+ "running": "Test prędkości już trwa. Proszę, poczekaj chwilę.",
+ "admin_login": "Logowanie administratora",
+ "beta": {
+ "title": "Wersja beta",
+ "description": "Ta funkcja jest wciąż w fazie beta. Jeśli znajdziesz błędy, zgłoś je tutaj."
+ }
+ },
+ "storage": {
+ "speedtests": "Testy prędkości",
+ "configuration": "Konfiguracja",
+ "stored_tests": "Zapisane testy",
+ "tests": "Testy",
+ "export_tests": "Eksportuj testy",
+ "tests_exported": "Testy zostały wyeksportowane",
+ "csv": "CSV",
+ "json": "JSON",
+ "import_tests": "Importuj testy",
+ "tests_imported": "Testy zostały zaimportowane",
+ "import_test_error": "Wystąpił błąd podczas importu testów",
+ "import_config_error": "Wystąpił błąd podczas importu konfiguracji",
+ "export": "Eksportuj",
+ "import": "Importuj",
+ "clear_history": "Wyczyść historię",
+ "history_cleared": "Historia została wyczyszczona",
+ "delete": "Usuń",
+ "confirm_delete": "Tak, usuń",
+ "export_settings": "Eksportuj ustawienia",
+ "import_settings": "Importuj ustawienia",
+ "factory_reset": "Przywracanie ustawień fabrycznych",
+ "factory_reset_completed": "Przywracanie ustawień fabrycznych zakończone",
+ "reset": "Resetuj",
+ "confirm_reset": "Tak, resetuj",
+ "settings_exported": "Ustawienia zostały wyeksportowane",
+ "settings_imported": "Ustawienia zostały zaimportowane"
+ },
+ "latest": {
+ "ping": "Ping",
+ "ping_unit": "ms",
+ "down": "Pobieranie",
+ "speed_unit": "Mbps",
+ "up": "Wysyłanie",
+ "latest": "Ostatni test",
+ "before": "przed"
+ },
+ "info": {
+ "credits": "MySpeed to projekt open source dostarczony przez GNMYT. Daj gwiazdkę na GitHub lub wpłać darowiznę, aby wesprzeć projekt.",
+ "recommendations_error": "Musisz wykonać co najmniej 10 testów, aby uzyskać średnią. Nieważne, czy testy były wykonane ręcznie, czy automatycznie.",
+ "recommendations_info": "Na podstawie ostatnich 10 testów stwierdzono, że optymalny ping wynosił {{ping}} ms, pobieranie {{down}} Mbps oraz wysyłanie {{up}} Mbps. Najlepiej kierować się warunkami Twojej umowy internetowej i dostosować ustawienia tylko wtedy, gdy się zgadzają.",
+ "update": "Dostępna jest aktualizacja do wersji {{version}}. Zobacz zmiany oraz pobierz aktualizację.",
+ "down": {
+ "title": "Prędkość pobierania",
+ "description": "Prędkość pobierania wpływa na komfort przeglądania. Im wyższa, tym szybciej komputer może odbierać dane."
+ },
+ "ping": {
+ "title": "Ping",
+ "description": "Ping pokazuje, jak szybko reaguje dany dostawca. Im krótszy, tym lepszy."
+ },
+ "up": {
+ "title": "Prędkość wysyłania",
+ "description": "Prędkość wysyłania wpływa na komfort korzystania z internetu. Im wyższa, tym szybciej komputer może wysyłać dane."
+ },
+ "latest": {
+ "title": "Ostatni test",
+ "description": "To czas, który pokazuje, kiedy ostatni test został przeprowadzony. W tym przypadku odbył się on {{date}} o {{time}}."
+ }
+ },
+ "time": {
+ "now": "Właśnie teraz",
+ "seconds": "{{seconds}} sekund",
+ "minute": "1 minuta",
+ "minutes": "{{minutes}} minut",
+ "hour": "1 godzina",
+ "hours": "{{hours}} godzin",
+ "on": "W dniu",
+ "at": "o"
+ },
+ "test": {
+ "not_available": "Obecnie nie ma dostępnych testów",
+ "no_latest": "Nie ma aktualnie dostępnego testu. Wykonaj test lub poczekaj na kolejny.",
+ "unknown_error": "Nieznany błąd:",
+ "failed": "Test nie powiódł się",
+ "recheck": "Sprawdź, czy to zdarza się często.",
+ "delete": "Usuń test",
+ "deleted": "Test został usunięty",
+ "average": {
+ "title": "Średnia prędkość",
+ "description": "{{amount}} testów wykazało, że {{date}} średnia prędkość pobierania wynosiła {{down}} Mbps, a wysyłania {{up}} Mbps. Średni czas testów wynosił {{duration}} sekund."
+ },
+ "result": {
+ "title": "Wynik testu",
+ "description": "Ten test osiągnął maksymalną prędkość pobierania {{down}} Mbps oraz maksymalną prędkość wysyłania {{up}} Mbps. Test został wykonany {{type}} i trwał {{duration}} sekund.",
+ "from_you": "przez Ciebie",
+ "automatic": "automatycznie"
+ },
+ "overview": {
+ "title": "Przegląd testów z ostatnich {{amount}}",
+ "1": "24 godziny",
+ "2": "2 dni",
+ "3": "7 dni",
+ "4": "30 dni"
+ }
+ },
+ "errors": {
+ "network_unreachable": "Połączenie internetowe było niestabilne podczas testu",
+ "took_too_long": "Test trwał zbyt długo i został anulowany",
+ "no_permission": "MySpeed nie ma uprawnień do rozpoczęcia tego testu",
+ "resource_unavailable": "Test nie mógł zostać przeprowadzony, ponieważ zasób był chwilowo niedostępny",
+ "no_route": "Test nie mógł zostać wykonany, ponieważ nie ma trasy do hosta",
+ "connection_refused": "Test nie mógł zostać wykonany, ponieważ połączenie zostało odrzucone",
+ "timed_out": "Połączenie internetowe było niestabilne podczas testu",
+ "config": "Nie udało się załadować pliku konfiguracyjnego",
+ "invalid_view": "Nieprawidłowy widok"
+ },
+ "statistics": {
+ "overview": {
+ "total_title": "Łączna liczba testów",
+ "total_description": "Liczba wykonanych testów",
+ "failed_title": "Nieudane testy",
+ "failed_description": "Liczba nieudanych testów",
+ "average_title": "Średni czas trwania",
+ "average_description": "Średni czas trwania testów"
+ },
+ "failed": {
+ "title": "Nieudane testy",
+ "success": "Pomyślne",
+ "failed": "Nieudane",
+ "label": "Testy"
+ },
+ "speed": {
+ "title": "Prędkość"
+ },
+ "manual": {
+ "title": "Testy ręczne",
+ "yes": "Wykonane ręcznie",
+ "no": "Wykonane automatycznie"
+ },
+ "duration": {
+ "title": "Czas trwania testu",
+ "label": "Ilość"
+ },
+ "values": {
+ "min": "Minimum",
+ "max": "Maksimum",
+ "avg": "Średnia",
+ "down": "Wartości pobierania",
+ "up": "Wartości wysyłania"
+ }
+ },
+ "nodes": {
+ "add": "Dodaj serwer",
+ "create": "Dodaj",
+ "this_server": "Ten serwer",
+ "created": "Serwer został pomyślnie dodany",
+ "password_required": "Ten węzeł wymaga hasła",
+ "update_password": "Proszę zaktualizować hasło dla tego węzła",
+ "password_outdated": "Hasło nieaktualne",
+ "password_updated": "Hasło zostało pomyślnie zaktualizowane",
+ "preview_active": "Dodawanie i usuwanie serwerów jest wyłączone w trybie demo.",
+ "placeholder": {
+ "name": "Instancja MySpeed",
+ "url": "https://your-server.com"
+ },
+ "group": {
+ "name": "Nazwa serwera",
+ "url": "Adres serwera"
+ },
+ "delete": {
+ "title": "Usuń serwer",
+ "description": "Serwer {{name}} (#{{id}}) zostanie usunięty. Czynność ta jest nieodwracalna. Czy chcesz kontynuować?",
+ "yes": "Tak, usuń",
+ "success": "Serwer został pomyślnie usunięty"
+ },
+ "messages": {
+ "not_reachable": "Serwer jest niedostępny",
+ "password_changed": "Hasło zmienione",
+ "tests_pending": "Wyniki testów nie są jeszcze dostępne"
+ }
+ },
+ "preview": {
+ "title": "Tryb demo",
+ "info": "DEMO",
+ "description": "Aktualnie jesteś w trybie demo. Niektóre funkcje są wyłączone, a niektóre ustawienia nie mogą być zmienione. Jeśli chcesz korzystać ze wszystkich funkcji, możesz zainstalować MySpeed na własnym serwerze."
+ },
+ "integrations": {
+ "none_active": "Ta integracja nie jest aktywna.
Utwórz",
+ "preview_active": "Integracje są wyłączone w trybie demo.",
+ "display_name": "Nazwa integracji",
+ "create": "Utwórz",
+ "activity": {
+ "never_executed": "Nigdy nie wykonano",
+ "last_run": "Ostatnie uruchomienie przed "
+ },
+ "discord": {
+ "title": "Discord",
+ "fields": {
+ "url": "Webhook-URL",
+ "url_placeholder": "https://discord.com/api/webhooks/...",
+ "display_name": "Nazwa wyświetlana",
+ "display_name_placeholder": "Powiadomienie MySpeed",
+ "error_message": "Komunikat o błędzie",
+ "error_message_placeholder": "Błąd: %error%",
+ "send_failed": "Wysyłaj komunikaty o błędach",
+ "send_finished": "Wysyłaj komunikaty o zakończeniu",
+ "finished_message": "Komunikat o zakończeniu",
+ "finished_message_placeholder": "%ping% ms, %download% Mbps, %upload% Mbps"
+ }
+ },
+ "gotify": {
+ "title": "Gotify",
+ "fields": {
+ "url": "URL serwera",
+ "key": "Token aplikacji",
+ "priority": "Priorytet",
+ "error_message": "Komunikat o błędzie",
+ "error_message_placeholder": "Błąd: %error%",
+ "send_failed": "Wysyłaj komunikaty o błędach",
+ "send_finished": "Wysyłaj komunikaty o zakończeniu",
+ "finished_message": "Komunikat o zakończeniu",
+ "finished_message_placeholder": "%ping% ms, %download% Mbps, %upload% Mbps"
+ }
+ },
+ "pushover": {
+ "title": "Pushover",
+ "fields": {
+ "token": "Token aplikacji",
+ "user_key": "Klucz użytkownika",
+ "error_message": "Komunikat o błędzie",
+ "error_message_placeholder": "Błąd: %error%",
+ "send_failed": "Wysyłaj komunikaty o błędach",
+ "send_finished": "Wysyłaj komunikaty o zakończeniu",
+ "finished_message": "Komunikat o zakończeniu",
+ "finished_message_placeholder": "%ping% ms, %download% Mbps, %upload% Mbps"
+ }
+ },
+ "healthChecks": {
+ "title": "HealthChecks",
+ "fields": {
+ "url": "URL HealthChecks",
+ "url_placeholder": "https://hc-ping.com/"
+ }
+ },
+ "telegram": {
+ "title": "Telegram",
+ "fields": {
+ "token": "Token bota",
+ "chat_id": "ID czatu",
+ "error_message": "Komunikat o błędzie",
+ "error_message_placeholder": "Błąd: %error%",
+ "send_failed": "Wysyłaj komunikaty o błędach",
+ "send_finished": "Wysyłaj komunikaty o zakończeniu",
+ "finished_message": "Komunikat o zakończeniu",
+ "finished_message_placeholder": "%ping% ms, %download% Mbps, %upload% Mbps"
+ }
+ },
+ "webhook": {
+ "title": "Webhook",
+ "fields": {
+ "url": "Webhook-URL",
+ "url_placeholder": "https://your-server.com/hook",
+ "send_started": "Wyślij informację o rozpoczęciu",
+ "send_failed": "Wyślij komunikaty o błędach",
+ "send_finished": "Wyślij komunikaty o zakończeniu",
+ "send_alive": "Wyślij komunikaty o aktywności",
+ "send_recommendations": "Wyślij rekomendacje",
+ "send_config_updates": "Wyślij aktualizacje konfiguracji"
+ }
+ }
+ }
+}