🔒 Repository is read-only – file editing is disabled.

PaganLinux/pagan-web-v2/i18n.py main

895 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
"""
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)