""" i18n – Multi-language support (PL / EN) """ from flask import request from urllib.parse import urlparse TRANSLATIONS = { "pl": { # Nav "git": "Git", "repo": "Repozytorium", "build": "Build", "docs": "Dokumentacja", "add_pkg": "Dodaj", "login_btn": "Zaloguj", "logout_btn": "Wyloguj", "register": "Rejestracja", "profile": "Profil", "admin": "Admin", # Hero / Index "hero_title": "Polska Niezależna Dystrybucja Linux", "hero_subtitle": "Polska, niezależna dystrybucja Linux budowana od podstaw. Stabilna, szybka i przejrzysta — z własnym repozytorium, systemem buildów i dokumentacją.", "download_iso": "Pobierz ISO", "browse_repo": "Repozytorium", "browse_docs": "Dokumentacja", "pkg_count": "Pakietów", "build_count": "Buildów", "pkg_size_total": "Rozmiar paczek", "ok_count": "Udanych", "fail_count": "Nieudanych", # Features "why_title": "Dlaczego Pagan?", "feat_from_scratch": "Od podstaw", "feat_from_scratch_desc": "Zbudowany z wykorzystaniem Linux From Scratch — zero zbędnych zależności, pełna kontrola nad każdym komponentem.", "feat_pkg_mgr": "Własny menedżer pakietów", "feat_pkg_mgr_desc": "pag — prosty, szybki menedżer z wsparciem dla GPG, rollbacków i Flatpak.", "feat_toolchain": "Nowoczesny toolchain", "feat_toolchain_desc": "GCC 15, glibc 2.44, LLVM, Rust, Go — najnowsze narzędzia deweloperskie.", "feat_security": "Bezpieczeństwo", "feat_security_desc": "Podpisy GPG, izolowane buildy w chroot, weryfikacja SHA256 — każdy pakiet przechodzi pełną walidację.", # Sections "pkg_repo": "Repozytorium pakietów", "pkg_repo_desc": "pakietów w kategoriach", "browse_pkgs": "Przeglądaj pakiety →", "build_system": "System buildów", "no_build_history": "Brak historii buildów", "build_panel_link": "Panel buildów →", "missing_pkg": "Brakuje pakietu?", "missing_pkg_desc": "Wypełnij formularz, wygenerujemy PAGBUILD.yaml i dodamy pakiet do repo — po zatwierdzeniu przez admina.", "suggest_pkg": "Zaproponuj pakiet", # Download "download_title": "Pobierz PaganOS", "download_subtitle": "Obrazy ISO gotowe do instalacji. Minimalna instalacja, maksymalna kontrola.", "iso_image": "Obraz ISO", "iso_desc": "Pełny obraz instalacyjny z podstawowym zestawem narzędzi.", "dl_from_repo": "Pobierz z repo", "iso_available": "Obrazy dostępne w katalogu stable", "repo_config": "Repozytorium", "repo_config_desc": "Dodaj repo do istniejącej instalacji:", "gpg_key": "Klucz GPG", "gpg_key_desc": "Wszystkie pakiety są podpisane kluczem GPG. Zaimportuj go przed pierwszą instalacją (lub zaufaj automatycznie podczas pierwszego pag sync):", "fingerprint": "Fingerprint", # Download – obrazy ISO (upload w panelu admina) "iso_upload_title": "Wgraj nowy obraz", "iso_version": "Wersja", "iso_file": "Plik", "iso_upload_btn": "Wgraj ISO", "iso_list": "Wgrane obrazy", "iso_empty": "Brak wgranych obrazów – wgraj pierwszy powyżej.", "iso_available_images": "Dostępne obrazy", "download_iso": "Pobierz ISO", "iso_released": "Data wydania", "iso_desc_label": "Opis", "iso_changelog": "Co nowego", "iso_checksum": "Suma kontrolna (SHA-256)", "iso_copy_sha": "Kopiuj sumę", "iso_copied": "Skopiowano!", "iso_dl_sha": "Suma (.sha256)", "iso_verify": "Zweryfikuj pobrany obraz: porównaj sumę SHA-256 albo sprawdź podpis kluczem GPG poniżej.", # About "about_title": "O PaganOS", "about_subtitle": "Historia, filozofia i architektura projektu.", "philosophy": "Filozofia", "philosophy_desc": "PaganOS to dystrybucja dla tych, którzy chcą rozumieć swój system. Żadnych ukrytych procesów, żadnego bloatware — tylko to, czego naprawdę potrzebujesz.", "architecture": "Architektura", "architecture_desc": "Zbudowany na LFS 13.0 + BLFS. Własny menedżer pakietów pag, system buildów pagbuild i synchronizator pagsync.", "components": "Komponenty systemu", "toolchain_title": "Toolchain", "compiler": "Kompilator", "c_library": "Biblioteka C", "arch_label": "Architektura", # Footer "footer_about": "Polska, niezależna dystrybucja Linux. Budowana od podstaw, z własnym menedżerem pakietów i systemem kompilacji.", "footer_links": "Linki", "footer_dl": "Pobierz", "footer_repo": "Repozytorium", "footer_source": "Kod źródłowy", "footer_docs": "Dokumentacja", "footer_community": "Społeczność", "footer_suggest": "Zaproponuj pakiet", "footer_about_link": "O projekcie", "footer_copy": "PaganOS. Zbudowany z i Linux From Scratch.", # Git index "git_title": "Repozytoria Git", "repo_count_label": "repozytoriów", "public_label": "publicznych", "private_label": "prywatnych", "commits_label": "commitów", "data_label": "danych", "search_code": "Szukaj w kodzie...", "help_btn": "Pomoc", "new_repo_btn": "Nowe repo", "recent_activity": "Ostatnia aktywność", "no_activity": "Brak aktywności", "no_repos": "Brak repozytoriów.", "create_first": "Utwórz pierwsze →", "browse_btn": "Przeglądaj", "public_badge": "public", "private_badge": "prywatne", "branches_count": "gałęzi", "open_issues_count": "open", # Git repo view "files_section": "Pliki", "last_change": "Ostatnia zmiana", "empty_dir": "Pusty katalog", "filter_files": "Filtruj pliki…", "name_col": "Nazwa", "size_col": "Rozmiar", "no_files_match": "Brak pasujących plików", "show_more": "Pokaż więcej", "commits_section": "Commity", "no_commits": "Brak commitów", "about_repo": "O repozytorium", "contributors_label": "Kontrybutorzy", "issues_label": "Issues", "default_branch": "Domyślna gałąź", "actions": "Akcje", "branches_btn": "Gałęzie", "contributors_btn": "Kontrybutorzy", "issues_btn": "Issues", "download_tar": "Pobierz .tar.gz", "new_file_btn": "Nowy plik", "new_release_btn": "Nowy release", "rename_btn": "Zmień nazwę", "rename_title": "Zmień nazwę", "rename_new": "Nowa nazwa (ścieżka docelowa):", "cancel": "Anuluj", "releases_label": "Release", "all_sources_btn": "Wszystkie źródła", "settings_btn": "Ustawienia", "readme_section": "README.md", "private_access_denied": "Repozytorium prywatne – brak dostępu", # Commit view "commit_title": "Commit", "files_changed": "plików", "added_lines": "dodanych", "deleted_lines": "usuniętych", # Contributors "contributors_title": "Kontrybutorzy", "contributors_count": "osób", "contrib_commits": "commitów", "contrib_author": "Autor", "contrib_share": "Udział", # File view "lines_count": "linii", "edit_btn": "Edytuj", "raw_btn": "Raw", "back_btn": "Powrót", # Auth "login_title": "Zaloguj się", "username_placeholder": "Nazwa użytkownika", "password_placeholder": "Hasło", "remember_me": "Zapamiętaj mnie", "login_submit": "Zaloguj", "create_account": "Utwórz konto", "forgot_password": "Nie pamiętam hasła", "register_title": "Utwórz konto", "email_placeholder": "Adres e-mail", "register_submit": "Zarejestruj", "captcha_question": "Ile to", "register_info": "Po rejestracji otrzymasz e-mail z linkiem aktywacyjnym.", "register_info_admin": "Rejestracja otwarta – konto aktywuje administrator.", "already_have": "Masz już konto? Zaloguj się", "forgot_title": "Zapomniałeś hasła?", "forgot_desc": "Podaj adres e-mail użyty podczas rejestracji. Wyślemy link do resetu hasła.", "send_link": "Wyślij link", "back_to_login": "Powrót do logowania", "reset_title": "Nowe hasło", "new_password_placeholder": "Nowe hasło (min. 5 znaków)", "save_password": "Zapisz nowe hasło", # Profile "change_password": "Zmień hasło", "current_password": "Obecne hasło", "new_password": "Nowe hasło", "save": "Zapisz", "token": "Token Git", "token_help": "Użyj tokena zamiast hasła w git clone.", "generate_token": "Generuj token", # Flash messages "logged_in": "Zalogowano ", "wrong_credentials": "Nieprawidłowy login lub hasło.", "account_blocked": "Konto zablokowane. Skontaktuj się z administratorem.", "account_inactive": "Konto nieaktywowane. Sprawdź e-mail lub poczekaj na aktywację.", "too_many_attempts": "Zbyt wiele prób. Spróbuj za", "remaining_attempts": "Pozostało prób:", "password_reset_sent": "Jeśli konto istnieje, wyślemy link do resetu hasła na podany adres.", "password_changed": "Hasło zmienione! Zaloguj się nowym hasłem.", "reset_link_invalid": "Link do resetu hasła jest nieprawidłowy lub wygasł.", "email_verified": "Adres e-mail potwierdzony! Możesz się zalogować.", "verify_link_invalid": "Link weryfikacyjny jest nieprawidłowy lub wygasł.", "account_created": "Konto utworzone! Możesz się zalogować.", "account_created_admin": "Konto utworzone! Poczekaj na aktywację przez administratora.", "captcha_error": "Błędna odpowiedź CAPTCHA", "email_blocked": "Ta domena e-mail jest zablokowana (spam). Użyj innego adresu.", "registration_disabled": "Rejestracja jest tymczasowo wyłączona.", "repo_created": "Repo utworzone", "repo_deleted": "Repo usunięte", "repo_private": "prywatne", "repo_public": "publiczne", "saved": "Zapisano", "deleted": "Usunięto", "error": "Błąd", # Admin "admin_title": "Panel Admina", "admin_repo": "Repozytorium", "admin_pkgs_stable": "pakietów w stable", "admin_last_build": "Ostatni build", "admin_none": "brak", "admin_builds_today": "Buildy dziś", "admin_pagsync_running": "Działa", "admin_pagsync_stopped": "Zatrzymany", "admin_sys_tools": "Narzędzia systemowe", "admin_reset_state": "Reset stanu", "admin_clean_cache": "Clean cache", "admin_clean_output": "Clean output", "admin_clean_sources": "Clean sources", "admin_fix_sha": "Fix SHA", "admin_check_updates": "Check updates", "admin_users_title": "Użytkownicy", "admin_registration_open": "Rejestracja otwarta", "admin_activation_required": "Aktywacja przez admina", "admin_git_readonly": "Git tylko do odczytu", "admin_git_readonly_info": "Tryb tylko do odczytu blokuje edycję plików w repo (git) zwykłym użytkownikom i maintainerom – admini zachowują dostęp.", "admin_settings": "Ustawienia", "admin_settings_title": "Ustawienia", "git_readonly_notice": "🔒 Repozytorium w trybie tylko do odczytu – edycja plików jest wyłączona.", "git_repo_readonly_title": "Tylko do odczytu", "git_repo_readonly_on": "Repozytorium jest tylko do odczytu – użytkownicy nie mogą edytować plików.", "git_repo_readonly_off": "Repozytorium jest edytowalne – użytkownicy z uprawnieniami mogą edytować pliki.", "git_repo_readonly_enable": "🔒 Ustaw jako tylko do odczytu", "git_repo_readonly_disable": "Ustaw jako edytowalne", "admin_save": "Zapisz", "admin_reg_info": "Wyłączenie rejestracji zamyka nowe konta.", "admin_add_user": "Dodaj", "admin_name": "Nazwa", "admin_email": "Email", "admin_password": "Hasło", "admin_role": "Rola", "admin_status": "Status", "admin_actions": "Akcje", "admin_user": "Użytkownik", "admin_inactive": "Nieaktywne", "admin_git_repos": "Repozytoria Git", "admin_visibility": "Widoczność", "admin_size": "Rozmiar", "admin_create_repo": "Utwórz repo", "admin_permissions": "Uprawnienia do repo", "admin_submissions": "Zgłoszenia", "admin_commits_page": "Commity", "admin_confirm_start": "Uruchomić pagsync?", "admin_confirm_stop": "Zatrzymać pagsync?", "admin_confirm_reset": "Zresetować stan pagsync?", "admin_confirm_clean_cache": "Wyczyścić cache builda?", "admin_confirm_clean_output": "Wyczyścić output builda?", "admin_confirm_clean_sources": "Wyczyścić źródła z cache?", "admin_confirm_fix_sha": "Uruchomić auto-fix SHA256?", "admin_confirm_check_updates": "Sprawdzić nowsze wersje pakietów?", "admin_confirm_delete_user": "Usunąć", # Admin – karty pobierania (/download) "admin_dl_title": "Karty pobierania", "admin_dl_preview": "Podgląd strony", "admin_dl_icon": "Ikona", "admin_dl_title_label": "Tytuł", "admin_dl_desc": "Opis", "admin_dl_url": "Link (URL)", "admin_dl_btn": "Przycisk", "admin_dl_add": "Dodaj kartę", "admin_dl_list": "Lista kart", "admin_dl_edit": "Edytuj", "admin_dl_toggle": "Pokaż/ukryj", "admin_dl_on": "Widoczna", "admin_dl_off": "Ukryta", "admin_dl_empty": "Brak kart pobierania – dodaj pierwszą powyżej.", "admin_dl_delete_confirm": "Usunąć tę kartę?", # Build "build_total": "Total builds", "build_success": "Success", "build_failed": "Failed", "build_active": "Active", "build_last_sync": "Last sync", "build_current_step": "Current step", "build_live_console": "Live Console", "build_ready": "Ready.", "build_packages_list": "Pakiety", "build_loading": "Ładowanie...", "build_filter": "Filtruj...", "build_all_status": "Wszystkie", "build_status_ok": "OK", "build_status_failed": "Failed", "build_status_pending": "Pending", "build_sync_btn": "Sync & Build", "build_force_btn": "Force Build All", "build_rebuild_failed": "Rebuild Failed", "build_missing": "Build Missing", "build_download_log": "Log TXT", "build_clear_logs": "Clear Logs", "build_purge_rebuild": "Purge & Rebuild", "build_history": "Historia buildów", "build_no_entries": "Brak wpisów", "build_entries": "wpisów", "build_confirm_rebuild": "Zbudować", # Repo "repo_all": "Wszystkie", "repo_search": "Szukaj pakietu...", "repo_name_header": "Nazwa", "repo_version": "Wersja", "repo_desc": "Opis", "repo_no_results": "Nic nie znaleziono.", "size": "Rozmiar", "category": "Kategoria", # 404 "not_found": "Strona nie istnieje.", "back_home": "Strona główna", # Build login "build_login_title": "Panel Budowania", "build_login_btn": "Wejdź", "build_restricted_msg": "Zaloguj się jako admin lub opiekun repozytorium.", # Build dashboard JS strings "build_th_status": "St", "build_th_pkg": "Pakiet", "build_th_ver": "Ver", "build_th_cat": "Kat", "build_th_version": "Wersja", "build_th_time": "Czas", "build_no_entries": "Brak wpisów", "build_confirm_single": "Zbudować", "build_confirm_force": "Na pewno? Zbuduje wszystkie pakiety od nowa.", "build_confirm_purge": "Usunąć WSZYSTKIE paczki i zbudować od nowa?", "build_confirm_clear": "Wyczyścić wszystkie logi?", "build_sync_only_btn": "Sync (bez budowania)", "build_fix_sha": "Fix SHA", "recipe_label": "PAGBUILD.yaml (edytowalne)", "recipe_commit_msg": "Nazwa commita (opcjonalnie)...", "recipe_save_git": "Zapisz do gita", "recipe_close": "Zamknij", # Admin extras "admin_disk": "Dysk (VPS)", "admin_ram": "RAM", "admin_cpu": "CPU", "admin_free": "Wolne", "admin_load_avg": "Średnie obciążenie", "admin_no_repos": "Brak repozytoriów. Utwórz pierwsze wyżej", "admin_perm_user": "Użytkownik", "admin_perm_role": "Rola", "admin_submissions_title": "Zgłoszenia receptur (community)", "admin_no_submissions": "Brak zgłoszeń w kolejce.", "admin_preview": "Podgląd PAGBUILD.yaml", "admin_approve": "Zatwierdź", "admin_reject": "Odrzuć", "admin_back_panel": "Panel", "admin_confirm_approve": "Zatwierdzić", "admin_confirm_reject": "Odrzucić zgłoszenie", # Docs "docs_overview": "Lista dostępnych dokumentów i przewodników.", "getting_started": "Jak zacząć", "new_doc": "Nowa dokumentacja", "no_docs": "Brak dokumentów.", "available_in": "Dostępne w języku:", # Translate "translate_title": "Tłumaczenia", "translate_missing": "Brakujące tłumaczenia", "translate_missing_pl": "Brakuje w PL", "translate_missing_en": "Brakuje w EN", "translate_help": "Chcesz pomóc? Wyślij pull request do repo git z tłumaczeniami lub zgłoś issue.", "translate_nav": " Tłumaczenia", # Status "status_title": "Status PaganOS", "status_builds": "Buildów", "status_ok": "Udanych", "status_fail": "Nieudanych", "status_current": "Obecny build", "status_changes": "Ostatnie zmiany w recepturach", "status_no_changes": "Brak zmian / brak repozytorium recipes.", "status_auto": "Odświeżanie automatyczne co 10s.", "recent_changes": "Ostatnie zmiany w repo", "full_status": "Pełny status →", "hero_eyebrow": "Niezależna dystrybucja zbudowana od podstaw", "live_builds": "Buildy na żywo", "no_active_build": "brak aktywnego builda", "latest_build_lbl": "Ostatni build", "last_sync_lbl": "Ostatnia synchronizacja", # Watch / kopiowanie "watch_pkg": "Obserwuj (e-mail o nowych wersjach)", "watching_pkg": "Obserwujesz (nowe wersje) – kliknij by przestać", "copy_cmd": "Kopiuj", }, "en": { # Nav "git": "Git", "repo": "Repository", "build": "Build", "docs": "Docs", "add_pkg": "Add", "login_btn": "Login", "logout_btn": "Logout", "register": "Register", "profile": "Profile", "admin": "Admin", # Hero / Index "hero_title": "Polish Independent Linux Distribution", "hero_subtitle": "Polish, independent Linux distribution built from scratch. Stable, fast, and transparent — with its own repository, build system, and documentation.", "download_iso": "Download ISO", "browse_repo": "Repository", "browse_docs": "Documentation", "pkg_count": "Packages", "build_count": "Builds", "pkg_size_total": "Packages size", "ok_count": "Succeeded", "fail_count": "Failed", # Features "why_title": "Why Pagan?", "feat_from_scratch": "From Scratch", "feat_from_scratch_desc": "Built using Linux From Scratch — zero unnecessary dependencies, full control over every component.", "feat_pkg_mgr": "Custom Package Manager", "feat_pkg_mgr_desc": "pag — simple, fast manager with GPG support, rollbacks, and Flatpak.", "feat_toolchain": "Modern Toolchain", "feat_toolchain_desc": "GCC 15, glibc 2.44, LLVM, Rust, Go — latest development tools.", "feat_security": "Security", "feat_security_desc": "GPG signatures, isolated chroot builds, SHA256 verification — every package is fully validated.", # Sections "pkg_repo": "Package Repository", "pkg_repo_desc": "packages in categories", "browse_pkgs": "Browse packages →", "build_system": "Build System", "no_build_history": "No build history", "build_panel_link": "Build panel →", "missing_pkg": "Missing a package?", "missing_pkg_desc": "Fill out the form, we'll generate a PAGBUILD.yaml and add the package to the repo — after admin approval.", "suggest_pkg": "Suggest a package", # Download "download_title": "Download PaganOS", "download_subtitle": "ISO images ready for installation. Minimal install, maximum control.", "iso_image": "ISO Image", "iso_desc": "Full installation image with a basic toolset.", "dl_from_repo": "Download from repo", "iso_available": "Images available in the stable directory", "repo_config": "Repository", "repo_config_desc": "Add the repo to an existing installation:", "gpg_key": "GPG Key", "gpg_key_desc": "All packages are signed with a GPG key. Import it before the first install (or trust it automatically on the first pag sync):", "fingerprint": "Fingerprint", # Download – ISO images (admin upload) "iso_upload_title": "Upload new image", "iso_version": "Version", "iso_file": "File", "iso_upload_btn": "Upload ISO", "iso_list": "Uploaded images", "iso_empty": "No images uploaded yet – upload the first one above.", "iso_available_images": "Available images", "download_iso": "Download ISO", "iso_released": "Release date", "iso_desc_label": "Description", "iso_changelog": "What's new", "iso_checksum": "Checksum (SHA-256)", "iso_copy_sha": "Copy checksum", "iso_copied": "Copied!", "iso_dl_sha": "Checksum file (.sha256)", "iso_verify": "Verify the downloaded image: compare the SHA-256 checksum or check the GPG signature with the key below.", # About "about_title": "About PaganOS", "about_subtitle": "History, philosophy, and architecture of the project.", "philosophy": "Philosophy", "philosophy_desc": "PaganOS is a distribution for those who want to understand their system. No hidden processes, no bloatware — just what you really need.", "architecture": "Architecture", "architecture_desc": "Built on LFS 13.0 + BLFS. Custom package manager pag, build system pagbuild, and sync tool pagsync.", "components": "System Components", "toolchain_title": "Toolchain", "compiler": "Compiler", "c_library": "C Library", "arch_label": "Architecture", # Footer "footer_about": "Polish independent Linux distribution. Built from scratch, with its own package manager and build system.", "footer_links": "Links", "footer_dl": "Download", "footer_repo": "Repository", "footer_source": "Source Code", "footer_docs": "Documentation", "footer_community": "Community", "footer_suggest": "Suggest a package", "footer_about_link": "About the project", "footer_copy": "PaganOS. Built with and Linux From Scratch.", # Git index "git_title": "Git Repositories", "repo_count_label": "repositories", "public_label": "public", "private_label": "private", "commits_label": "commits", "data_label": "of data", "search_code": "Search code...", "help_btn": "Help", "new_repo_btn": "New repo", "recent_activity": "Recent Activity", "no_activity": "No activity", "no_repos": "No repositories.", "create_first": "Create the first one →", "browse_btn": "Browse", "public_badge": "public", "private_badge": "private", "branches_count": "branches", "open_issues_count": "open", # Git repo view "files_section": "Files", "last_change": "Last change", "empty_dir": "Empty directory", "filter_files": "Filter files…", "name_col": "Name", "size_col": "Size", "no_files_match": "No matching files", "show_more": "Show more", "commits_section": "Commits", "no_commits": "No commits", "about_repo": "About", "contributors_label": "Contributors", "issues_label": "Issues", "default_branch": "Default branch", "actions": "Actions", "branches_btn": "Branches", "contributors_btn": "Contributors", "issues_btn": "Issues", "download_tar": "Download .tar.gz", "new_file_btn": "New file", "new_release_btn": "New release", "rename_btn": "Rename", "rename_title": "Rename", "rename_new": "New name (target path):", "cancel": "Cancel", "releases_label": "Releases", "all_sources_btn": "All sources", "settings_btn": "Settings", "readme_section": "README.md", "private_access_denied": "Private repository – access denied", # Commit view "commit_title": "Commit", "files_changed": "files", "added_lines": "added", "deleted_lines": "deleted", # Contributors "contributors_title": "Contributors", "contributors_count": "people", "contrib_commits": "commits", "contrib_author": "Author", "contrib_share": "Share", # File view "lines_count": "lines", "edit_btn": "Edit", "raw_btn": "Raw", "back_btn": "Back", # Auth "login_title": "Sign in", "username_placeholder": "Username", "password_placeholder": "Password", "remember_me": "Remember me", "login_submit": "Sign in", "create_account": "Create an account", "forgot_password": "Forgot password?", "register_title": "Create an account", "email_placeholder": "Email address", "register_submit": "Sign up", "captcha_question": "What is", "register_info": "After registering, you'll receive an email with an activation link.", "register_info_admin": "Registration open – account will be activated by an admin.", "already_have": "Already have an account? Sign in", "forgot_title": "Forgot your password?", "forgot_desc": "Enter the email address you used to register. We'll send you a password reset link.", "send_link": "Send link", "back_to_login": "Back to login", "reset_title": "New password", "new_password_placeholder": "New password (min. 5 characters)", "save_password": "Save new password", # Profile "change_password": "Change password", "current_password": "Current password", "new_password": "New password", "save": "Save", "token": "Git Token", "token_help": "Use token instead of password for git clone.", "generate_token": "Generate token", # Flash messages "logged_in": "Logged in ", "wrong_credentials": "Invalid username or password.", "account_blocked": "Account blocked. Contact the administrator.", "account_inactive": "Account not activated. Check your email or wait for admin activation.", "too_many_attempts": "Too many attempts. Try again in", "remaining_attempts": "Remaining attempts:", "password_reset_sent": "If the account exists, we'll send a password reset link to the provided address.", "password_changed": "Password changed! Log in with your new password.", "reset_link_invalid": "The password reset link is invalid or expired.", "email_verified": "Email verified! You can now log in.", "verify_link_invalid": "The verification link is invalid or expired.", "account_created": "Account created! You can now log in.", "account_created_admin": "Account created! Wait for admin activation.", "captcha_error": "Incorrect CAPTCHA answer", "email_blocked": "This email domain is blocked (spam). Use a different address.", "registration_disabled": "Registration is temporarily disabled.", "repo_created": "Repo created", "repo_deleted": "Repo deleted", "repo_private": "private", "repo_public": "public", "saved": "Saved", "deleted": "Deleted", "error": "Error", # Admin "admin_title": "Admin Panel", "admin_repo": "Repository", "admin_pkgs_stable": "packages in stable", "admin_last_build": "Last build", "admin_none": "none", "admin_builds_today": "Builds today", "admin_pagsync_running": "Running", "admin_pagsync_stopped": "Stopped", "admin_sys_tools": "System Tools", "admin_reset_state": "Reset state", "admin_clean_cache": "Clean cache", "admin_clean_output": "Clean output", "admin_clean_sources": "Clean sources", "admin_fix_sha": "Fix SHA", "admin_check_updates": "Check updates", "admin_users_title": "Users", "admin_registration_open": "Registration open", "admin_activation_required": "Admin activation", "admin_git_readonly": "Git read-only", "admin_git_readonly_info": "Read-only mode blocks file editing in git repos for regular users and maintainers – admins keep access.", "admin_settings": "Settings", "admin_settings_title": "Settings", "git_readonly_notice": "🔒 Repository is read-only – file editing is disabled.", "git_repo_readonly_title": "Read-only", "git_repo_readonly_on": "Repository is read-only – users cannot edit files.", "git_repo_readonly_off": "Repository is writable – permitted users can edit files.", "git_repo_readonly_enable": "🔒 Set read-only", "git_repo_readonly_disable": "Set writable", "admin_save": "Save", "admin_reg_info": "Disabling registration closes new accounts.", "admin_add_user": "Add", "admin_name": "Name", "admin_email": "Email", "admin_password": "Password", "admin_role": "Role", "admin_status": "Status", "admin_actions": "Actions", "admin_user": "User", "admin_inactive": "Inactive", "admin_git_repos": "Git Repositories", "admin_visibility": "Visibility", "admin_size": "Size", "admin_create_repo": "Create repo", "admin_permissions": "Repo Permissions", "admin_submissions": "Submissions", "admin_commits_page": "Commits", "admin_confirm_start": "Start pagsync?", "admin_confirm_stop": "Stop pagsync?", "admin_confirm_reset": "Reset pagsync state?", "admin_confirm_clean_cache": "Clean build cache?", "admin_confirm_clean_output": "Clean build output?", "admin_confirm_clean_sources": "Clean source cache?", "admin_confirm_fix_sha": "Run auto-fix SHA256?", "admin_confirm_check_updates": "Check for newer package versions?", "admin_confirm_delete_user": "Delete", # Admin – download cards (/download) "admin_dl_title": "Download cards", "admin_dl_preview": "Preview page", "admin_dl_icon": "Icon", "admin_dl_title_label": "Title", "admin_dl_desc": "Description", "admin_dl_url": "Link (URL)", "admin_dl_btn": "Button", "admin_dl_add": "Add card", "admin_dl_list": "Cards", "admin_dl_edit": "Edit", "admin_dl_toggle": "Show/hide", "admin_dl_on": "Visible", "admin_dl_off": "Hidden", "admin_dl_empty": "No download cards – add the first one above.", "admin_dl_delete_confirm": "Delete this card?", # Build "build_total": "Total builds", "build_success": "Success", "build_failed": "Failed", "build_active": "Active", "build_last_sync": "Last sync", "build_current_step": "Current step", "build_live_console": "Live Console", "build_ready": "Ready.", "build_packages_list": "Packages", "build_loading": "Loading...", "build_filter": "Filter...", "build_all_status": "All", "build_status_ok": "OK", "build_status_failed": "Failed", "build_status_pending": "Pending", "build_sync_btn": "Sync & Build", "build_force_btn": "Force Build All", "build_rebuild_failed": "Rebuild Failed", "build_missing": "Build Missing", "build_download_log": "Log TXT", "build_clear_logs": "Clear Logs", "build_purge_rebuild": "Purge & Rebuild", "build_history": "Build History", "build_no_entries": "No entries", "build_entries": "entries", "build_confirm_rebuild": "Build", # Repo "repo_all": "All", "repo_search": "Search packages...", "repo_name_header": "Name", "repo_version": "Version", "repo_desc": "Description", "repo_no_results": "No results found.", "size": "Size", "category": "Category", # 404 "not_found": "Page not found.", "back_home": "Home", # Build login "build_login_title": "Build Panel", "build_login_btn": "Enter", "build_restricted_msg": "Login as admin or repo maintainer.", # Build dashboard JS strings "build_th_status": "St", "build_th_pkg": "Package", "build_th_ver": "Ver", "build_th_cat": "Cat", "build_th_version": "Version", "build_th_time": "Time", "build_no_entries": "No entries", "build_confirm_single": "Build", "build_confirm_force": "Are you sure? Will rebuild all packages.", "build_confirm_purge": "Delete ALL packages and rebuild from scratch?", "build_confirm_clear": "Clear all logs?", "build_sync_only_btn": "Sync (no build)", "build_fix_sha": "Fix SHA", "recipe_label": "PAGBUILD.yaml (editable)", "recipe_commit_msg": "Commit message (optional)...", "recipe_save_git": "Save to git", "recipe_close": "Close", # Admin extras "admin_disk": "Disk (VPS)", "admin_ram": "RAM", "admin_cpu": "CPU", "admin_free": "Free", "admin_load_avg": "Load average", "admin_no_repos": "No repositories. Create one above", "admin_perm_user": "User", "admin_perm_role": "Role", "admin_submissions_title": "Recipe Submissions (community)", "admin_no_submissions": "No pending submissions.", "admin_preview": "PAGBUILD.yaml preview", "admin_approve": "Approve", "admin_reject": "Reject", "admin_back_panel": "Panel", "admin_confirm_approve": "Approve", "admin_confirm_reject": "Reject submission", # Docs "docs_overview": "List of available docs and guides.", "getting_started": "Getting Started", "new_doc": "New documentation", "no_docs": "No docs yet.", "available_in": "Available in:", # Translate "translate_title": "Translations", "translate_missing": "Missing translations", "translate_missing_pl": "Missing in PL", "translate_missing_en": "Missing in EN", "translate_help": "Want to help? Submit a pull request to the git repo with translations or open an issue.", "translate_nav": " Translate", # Status "status_title": "PaganOS Status", "status_builds": "Builds", "status_ok": "Succeeded", "status_fail": "Failed", "status_current": "Current build", "status_changes": "Recent recipe changes", "status_no_changes": "No changes / no recipes repo.", "status_auto": "Auto-refresh every 10s.", "recent_changes": "Recent repo changes", "full_status": "Full status →", "hero_eyebrow": "Independent distribution built from scratch", "live_builds": "Live builds", "no_active_build": "no active build", "latest_build_lbl": "Latest build", "last_sync_lbl": "Last sync", # Watch / kopiowanie "watch_pkg": "Watch (email on new versions)", "watching_pkg": "Watching (new versions) – click to stop", "copy_cmd": "Copy", }, } def get_lang(): """Wykrywa język: cookie → Accept-Language → en""" lang = request.cookies.get("lang") if lang in TRANSLATIONS: return lang al = request.headers.get("Accept-Language", "") if "pl" in al: return "pl" return "en" import time as _time _content_cache = {"ts": 0, "map": {}} def _content_overrides(): """Nadpisania treści z panelu admina (tabela content) – cache 15s.""" now = _time.time() if now - _content_cache["ts"] > 15: try: from database import get_content_map _content_cache["map"] = get_content_map() _content_cache["ts"] = now except Exception: pass return _content_cache["map"] def t(key, **kwargs): """Zwraca przetłumaczony tekst (nadpisywalny z panelu admina).""" lang = get_lang() text = TRANSLATIONS.get(lang, {}).get(key, TRANSLATIONS["en"].get(key, key)) try: override = _content_overrides().get(lang, {}).get(key) if override is not None: text = override except Exception: pass if kwargs: try: text = text.format(**kwargs) except Exception: pass return text def lang_switch(): """Zwraca przeciwny język.""" return "en" if get_lang() == "pl" else "pl" def inject_i18n(): return dict(t=t, lang=get_lang(), lang_switch=lang_switch)