R-516: the formal forms the gate did not count are in the te-form; the gate's stems widened

49 Hungarian values on the debug (RESET prompt), storage, network-storage, security, system,
deploy, restore and remote-backup copy moved from the formal („ön") to the product's te-form
(„írd be", „add meg", „hozz létre", „biztosan eltávolítod", „engedélyezd", „próbáld", ...).
i18n_missing_gate.py's stem list widened by 33 stems (+ one listed third-person exception,
„sora adja meg"); it counted 61 on the previous bundle and counts 0 now, ceiling stays 0.
Decoys: a widened-stem form convicts, its te-form twin and the third-person phrase pass.
38 parity fixtures changed by exactly those bytes. Seven Go-side keys listed as REWORDED in the
go-parity map. Pinned by TestR516_WidenedFormalFormsAreGone; two tests that quoted the old
words follow them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-06 02:36:55 +02:00
parent 2fc314d491
commit 4c3c2037fd
45 changed files with 253 additions and 175 deletions
+49 -49
View File
@@ -26,9 +26,9 @@
"api.backup.tier2_started": "2. mentés elindítva", "api.backup.tier2_started": "2. mentés elindítva",
"api.config.applied": "Konfiguráció alkalmazva — a vezérlő újraindul.", "api.config.applied": "Konfiguráció alkalmazva — a vezérlő újraindul.",
"api.config.unchanged": "A konfiguráció változatlan — nincs szükség újraindításra.", "api.config.unchanged": "A konfiguráció változatlan — nincs szükség újraindításra.",
"api.deploy.netstorage_unreachable": "A kiválasztott hálózati tárhely jelenleg nem érhető el az alkalmazások környezetéből — a telepítés nem indítható. Próbálja újra pár perc múlva, vagy jelezze az üzemeltetőnek.", "api.deploy.netstorage_unreachable": "A kiválasztott hálózati tárhely jelenleg nem érhető el az alkalmazások környezetéből — a telepítés nem indítható. Próbáld újra pár perc múlva, vagy jelezd az üzemeltetőnek.",
"api.deploy.hdd_path_inside_drive": "Az alkalmazás adatainak helye egy meghajtó lehet, nem egy mappa a meghajtón belül. Válaszd ezt: %s.", "api.deploy.hdd_path_inside_drive": "Az alkalmazás adatainak helye egy meghajtó lehet, nem egy mappa a meghajtón belül. Válaszd ezt: %s.",
"api.deploy.no_space": "Nincs elég szabad tárhely a telepítéshez: csak %.0f GB szabad, és a rendszer %.0f GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében. Szabadítson fel helyet, vagy bővítse a tárhelyet.", "api.deploy.no_space": "Nincs elég szabad tárhely a telepítéshez: csak %.0f GB szabad, és a rendszer %.0f GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében. Szabadíts fel helyet, vagy bővítsd a tárhelyet.",
"api.deploy.not_installable": "Ez az alkalmazás jelenleg nem telepíthető.", "api.deploy.not_installable": "Ez az alkalmazás jelenleg nem telepíthető.",
"api.deploy.started": "Telepítés elindítva – az állapot a kártyán követhető", "api.deploy.started": "Telepítés elindítva – az állapot a kártyán követhető",
"api.geo.app_removed": "Alkalmazás geo-korlátozás eltávolítva", "api.geo.app_removed": "Alkalmazás geo-korlátozás eltávolítva",
@@ -305,8 +305,8 @@
"backups_apps.utolso_adatbazis_mentes": "Utolsó adatbázis mentés:", "backups_apps.utolso_adatbazis_mentes": "Utolsó adatbázis mentés:",
"backups_apps.utolso_sikeres": "Utolsó sikeres: {{timeAgoStr .Tier2LastSuccess}}", "backups_apps.utolso_sikeres": "Utolsó sikeres: {{timeAgoStr .Tier2LastSuccess}}",
"backups_apps.visszaallitas_a_mentesbol": "Visszaállítás a mentésből", "backups_apps.visszaallitas_a_mentesbol": "Visszaállítás a mentésből",
"backups_apps.visszaallitja_a_hianyzo_fajlokat_a": "Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: {{fmtTimeStr .Tier2LastRun}}", "backups_apps.visszaallitja_a_hianyzo_fajlokat_a": "Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: {{fmtTimeStr .Tier2LastRun}}",
"backups_apps.visszaallitja_legutobbi_sikeres_masolat": "Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: {{fmtTimeStr .Tier2LastSuccess}}.", "backups_apps.visszaallitja_legutobbi_sikeres_masolat": "Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: {{fmtTimeStr .Tier2LastSuccess}}.",
"backups_escrow.1_elofeltetelek_ellenorzese": "1. Előfeltételek ellenőrzése", "backups_escrow.1_elofeltetelek_ellenorzese": "1. Előfeltételek ellenőrzése",
"backups_escrow.2_fontos_tudnivalok": "2. Fontos tudnivalók", "backups_escrow.2_fontos_tudnivalok": "2. Fontos tudnivalók",
"backups_escrow.3_megerosites": "3. Megerősítés", "backups_escrow.3_megerosites": "3. Megerősítés",
@@ -318,7 +318,7 @@
"backups_escrow.a_folyamat_a_piros_feltetelek": "A folyamat a piros feltételek teljesüléséig nem indítható.", "backups_escrow.a_folyamat_a_piros_feltetelek": "A folyamat a piros feltételek teljesüléséig nem indítható.",
"backups_escrow.a_folyamat_inditasa_nem_sikerult": "A folyamat indítása nem sikerült.", "backups_escrow.a_folyamat_inditasa_nem_sikerult": "A folyamat indítása nem sikerült.",
"backups_escrow.a_folytatashoz_adja_meg_a": "A folytatáshoz add meg a bejelentkezési jelszavadat", "backups_escrow.a_folytatashoz_adja_meg_a": "A folytatáshoz add meg a bejelentkezési jelszavadat",
"backups_escrow.a_funkciohoz_az_ugynok_frissitese": "A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik. Próbálja újra később.", "backups_escrow.a_funkciohoz_az_ugynok_frissitese": "A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik. Próbáld újra később.",
"backups_escrow.a_funkciohoz_az_ugynok_frissitese_2": "A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.", "backups_escrow.a_funkciohoz_az_ugynok_frissitese_2": "A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.",
"backups_escrow.a_helyreallitasi_kod_a_mentesei": "A helyreállítási kód a mentéseid utolsó kulcsa. Pontosan egyszer jelenik meg — a rendszer\n sehol nem tárolja, és a Felhom sem ismeri. Ha a szerver megsemmisül, a távoli mentések CSAK\n ezzel a kóddal állíthatók vissza. Írd fel papírra, vagy mentsd jelszókezelőbe — de NE ezen a\n szerveren tárold.", "backups_escrow.a_helyreallitasi_kod_a_mentesei": "A helyreállítási kód a mentéseid utolsó kulcsa. Pontosan egyszer jelenik meg — a rendszer\n sehol nem tárolja, és a Felhom sem ismeri. Ha a szerver megsemmisül, a távoli mentések CSAK\n ezzel a kóddal állíthatók vissza. Írd fel papírra, vagy mentsd jelszókezelőbe — de NE ezen a\n szerveren tárold.",
"backups_escrow.a_kod_lekerese_nem_sikerult": "A kód lekérése nem sikerült.", "backups_escrow.a_kod_lekerese_nem_sikerult": "A kód lekérése nem sikerült.",
@@ -375,13 +375,13 @@
"backups_remote.a_korabbi_mentesek_torlese_folyamatban": "A korábbi mentések törlése folyamatban", "backups_remote.a_korabbi_mentesek_torlese_folyamatban": "A korábbi mentések törlése folyamatban",
"backups_remote.a_korabbi_tavoli_menteseid_torlese": "A korábbi távoli mentéseid törlése megtörtént. A hozzájuk tartozó lezárt helyreállítási csomag eltávolítása még folyamatban van.", "backups_remote.a_korabbi_tavoli_menteseid_torlese": "A korábbi távoli mentéseid törlése megtörtént. A hozzájuk tartozó lezárt helyreállítási csomag eltávolítása még folyamatban van.",
"backups_remote.a_kulcsot_0600_as_fajlba": "A kulcsot 0600-as fájlba írjuk; sosem naplózzuk és nem tároljuk a beállításokban.", "backups_remote.a_kulcsot_0600_as_fajlba": "A kulcsot 0600-as fájlba írjuk; sosem naplózzuk és nem tároljuk a beállításokban.",
"backups_remote.a_letetben_levo_helyreallitasi_csomag": "A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozzon létre új helyreállítási kódot.", "backups_remote.a_letetben_levo_helyreallitasi_csomag": "A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozz létre új helyreállítási kódot.",
"backups_remote.a_megerosites_nem_erkezett_meg": "A megerősítés nem érkezett meg a várt időn belül. Ellenőrizd az internetkapcsolatot, majd készíts új helyreállítási kódot.", "backups_remote.a_megerosites_nem_erkezett_meg": "A megerősítés nem érkezett meg a várt időn belül. Ellenőrizd az internetkapcsolatot, majd készíts új helyreállítási kódot.",
"backups_remote.a_mentendo_adatok_felmerese": "— a mentendő adatok felmérése…", "backups_remote.a_mentendo_adatok_felmerese": "— a mentendő adatok felmérése…",
"backups_remote.a_pillanatkepek_szama_meg_ismeretlen": "a pillanatképek száma még ismeretlen", "backups_remote.a_pillanatkepek_szama_meg_ismeretlen": "a pillanatképek száma még ismeretlen",
"backups_remote.a_regi_elozmeny_felreteve_marad": "A régi előzmény <strong>félretéve marad a tárhelyen — nem töröljük</strong>. Új, üres tárolót hozunk létre, és a következő mentés oda készül.", "backups_remote.a_regi_elozmeny_felreteve_marad": "A régi előzmény <strong>félretéve marad a tárhelyen — nem töröljük</strong>. Új, üres tárolót hozunk létre, és a következő mentés oda készül.",
"backups_remote.a_tavoli_mentes_ki_van": "A távoli mentés ki van kapcsolva", "backups_remote.a_tavoli_mentes_ki_van": "A távoli mentés ki van kapcsolva",
"backups_remote.a_tavoli_mentesek_csak_akkor": "A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozza a helyreállítási kódot.", "backups_remote.a_tavoli_mentesek_csak_akkor": "A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozod a helyreállítási kódot.",
"backups_remote.a_tavoli_tarhelyen_levo_mentesek": "A távoli tárhelyen lévő mentések egy korábbi, már nem elérhető kulccsal készültek (jellemzően újratelepítés után). Emiatt új mentés jelenleg nem írható a tárolóba. A meglévő mentések nem sérültek. Azt viszont ez a gép nem tudja megállapítani, hogy később megnyithatók-e — ez attól függ, megvan-e még a hozzájuk tartozó kulcs. Ha szükséged van rájuk, írj nekünk.", "backups_remote.a_tavoli_tarhelyen_levo_mentesek": "A távoli tárhelyen lévő mentések egy korábbi, már nem elérhető kulccsal készültek (jellemzően újratelepítés után). Emiatt új mentés jelenleg nem írható a tárolóba. A meglévő mentések nem sérültek. Azt viszont ez a gép nem tudja megállapítani, hogy később megnyithatók-e — ez attól függ, megvan-e még a hozzájuk tartozó kulcs. Ha szükséged van rájuk, írj nekünk.",
"backups_remote.a_tavoli_tarolo_masik_kulccsal": "A távoli tároló másik kulccsal készült mentéseket tartalmaz", "backups_remote.a_tavoli_tarolo_masik_kulccsal": "A távoli tároló másik kulccsal készült mentéseket tartalmaz",
"backups_remote.a_teljes_mentes_tullepne_a": "A teljes mentés túllépné a tárhelykeretet — csak a konfiguráció és az adatbázis kerül mentésre.", "backups_remote.a_teljes_mentes_tullepne_a": "A teljes mentés túllépné a tárhelykeretet — csak a konfiguráció és az adatbázis kerül mentésre.",
@@ -510,8 +510,8 @@
"backups_restore.teljes_visszaallitas_adatbazis_konfigura": "Teljes visszaállítás: adatbázis + konfiguráció + felhasználói adatok a kiválasztott pillanatképből.", "backups_restore.teljes_visszaallitas_adatbazis_konfigura": "Teljes visszaállítás: adatbázis + konfiguráció + felhasználói adatok a kiválasztott pillanatképből.",
"backups_restore.uresen_hagyva_a_csomag_titkositas": "Üresen hagyva a csomag titkosítás nélkül készül.", "backups_restore.uresen_hagyva_a_csomag_titkositas": "Üresen hagyva a csomag titkosítás nélkül készül.",
"backups_restore.utolso_megerosites_a_masolat_veglegesen": "UTOLSÓ MEGERŐSÍTÉS: a másolat véglegesen törlődik.", "backups_restore.utolso_megerosites_a_masolat_veglegesen": "UTOLSÓ MEGERŐSÍTÉS: a másolat véglegesen törlődik.",
"backups_restore.valasszon": "— Válasszon —", "backups_restore.valasszon": "— Válassz —",
"backups_restore.valasszon_alkalmazast": "— Válasszon alkalmazást —", "backups_restore.valasszon_alkalmazast": "— Válassz alkalmazást —",
"backups_restore.valaszd_ki_az_alkalmazast_es": "Válaszd ki az alkalmazást, és a következő oldalon döntsd el, mit szeretnél: ellenőrzést külön mappába, csak a hiányzó fájlok visszahozását, vagy teljes visszaállítást. Egyik sem indul el kérdés nélkül.", "backups_restore.valaszd_ki_az_alkalmazast_es": "Válaszd ki az alkalmazást, és a következő oldalon döntsd el, mit szeretnél: ellenőrzést külön mappába, csak a hiányzó fájlok visszahozását, vagy teljes visszaállítást. Egyik sem indul el kérdés nélkül.",
"backups_restore.vasarnap": "vasárnap", "backups_restore.vasarnap": "vasárnap",
"backups_restore.visszaallitas": "Visszaállítás", "backups_restore.visszaallitas": "Visszaállítás",
@@ -873,7 +873,7 @@
"dashboard.adatbazisok": "Adatbázisok:", "dashboard.adatbazisok": "Adatbázisok:",
"dashboard.az_alkalmazas_adattaroloja_nem_elerheto": "Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat egy másik tárhelyre.", "dashboard.az_alkalmazas_adattaroloja_nem_elerheto": "Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat egy másik tárhelyre.",
"dashboard.az_alkalmazas_egyik_folyamatat_a": "Az alkalmazás egyik folyamatát a rendszer leállította, mert elfogyott a memóriája. Lehet, hogy egy feladat nem fejeződött be. Indítsd újra az alkalmazást; ha ismétlődik, jelezd az üzemeltetőnek.", "dashboard.az_alkalmazas_egyik_folyamatat_a": "Az alkalmazás egyik folyamatát a rendszer leállította, mert elfogyott a memóriája. Lehet, hogy egy feladat nem fejeződött be. Indítsd újra az alkalmazást; ha ismétlődik, jelezd az üzemeltetőnek.",
"dashboard.az_alkalmazas_kornyezeteben_a_halozati": "Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezze az üzemeltetőnek.", "dashboard.az_alkalmazas_kornyezeteben_a_halozati": "Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezd az üzemeltetőnek.",
"dashboard.biztonsagi_mentes": "Biztonsági mentés", "dashboard.biztonsagi_mentes": "Biztonsági mentés",
"dashboard.fogyoban_a_hely": "Fogyóban a hely", "dashboard.fogyoban_a_hely": "Fogyóban a hely",
"dashboard.futo_alkalmazas": "Futó alkalmazás", "dashboard.futo_alkalmazas": "Futó alkalmazás",
@@ -942,7 +942,7 @@
"debug.esemeny_tipus": "Esemény típus:", "debug.esemeny_tipus": "Esemény típus:",
"debug.export_konyvtarak": "Export könyvtárak", "debug.export_konyvtarak": "Export könyvtárak",
"debug.ez_torli_az_ugyfel_azonositot": "Ez törli az ügyfél azonosítót és újraindítja a controllert setup módba. A konfigurációs fájlok megmaradnak a meghajtókon.", "debug.ez_torli_az_ugyfel_azonositot": "Ez törli az ügyfél azonosítót és újraindítja a controllert setup módba. A konfigurációs fájlok megmaradnak a meghajtókon.",
"debug.figyelem_ez_ujrainditja_a_controllert": "FIGYELEM! Ez újraindítja a controllert setup módba. Biztosan folytatja?", "debug.figyelem_ez_ujrainditja_a_controllert": "FIGYELEM! Ez újraindítja a controllert setup módba. Biztosan folytatod?",
"debug.figyelmeztetesek": "Figyelmeztetések", "debug.figyelmeztetesek": "Figyelmeztetések",
"debug.folyamatban": "Folyamatban...", "debug.folyamatban": "Folyamatban...",
"debug.frissites": "Frissítés", "debug.frissites": "Frissítés",
@@ -966,8 +966,8 @@
"debug.igen": "Igen", "debug.igen": "Igen",
"debug.igen_2": "igen", "debug.igen_2": "igen",
"debug.inaktiv": "Inaktív", "debug.inaktiv": "Inaktív",
"debug.irja_be_reset": "Írja be: RESET", "debug.irja_be_reset": "Írd be: RESET",
"debug.irja_be_reset_a_megerositeshez": "Írja be \"RESET\" a megerősítéshez:", "debug.irja_be_reset_a_megerositeshez": "Írd be \"RESET\" a megerősítéshez:",
"debug.jelenlegi": "Jelenlegi:", "debug.jelenlegi": "Jelenlegi:",
"debug.katalogus_limit": "Katalógus limit", "debug.katalogus_limit": "Katalógus limit",
"debug.kattintson_a_gombra_a_telemetria": "Kattints a gombra a telemetria futtatásához.", "debug.kattintson_a_gombra_a_telemetria": "Kattints a gombra a telemetria futtatásához.",
@@ -1057,7 +1057,7 @@
"debug.api.gitea_reachable": "Gitea elérhető (HTTP %d, %dms)", "debug.api.gitea_reachable": "Gitea elérhető (HTTP %d, %dms)",
"debug.api.telemetry_collected": "Telemetria összegyűjtve: %d app, %d hiba, %d figyelmeztetés (%dms)", "debug.api.telemetry_collected": "Telemetria összegyűjtve: %d app, %d hiba, %d figyelmeztetés (%dms)",
"debug.api.selfupdate_unconfigured": "Self-update nincs konfigurálva", "debug.api.selfupdate_unconfigured": "Self-update nincs konfigurálva",
"debug.api.reset_confirm_invalid": "Érvénytelen megerősítés — írja be: RESET", "debug.api.reset_confirm_invalid": "Érvénytelen megerősítés — írd be: RESET",
"debug.api.marker_write_failed": "Marker fájl írási hiba: %v", "debug.api.marker_write_failed": "Marker fájl írási hiba: %v",
"debug.api.restarting_to_setup": "Controller újraindítása setup módba...", "debug.api.restarting_to_setup": "Controller újraindítása setup módba...",
"debug.api.agent_unconfigured": "Az ügynök nincs konfigurálva ezen a rendszeren.", "debug.api.agent_unconfigured": "Az ügynök nincs konfigurálva ezen a rendszeren.",
@@ -1117,7 +1117,7 @@
"deploy.ez_az_alkalmazas_mar_telepitve": "Ez az alkalmazás már telepítve van. Az alábbi beállítások csak olvashatók.", "deploy.ez_az_alkalmazas_mar_telepitve": "Ez az alkalmazás már telepítve van. Az alábbi beállítások csak olvashatók.",
"deploy.ez_az_alkalmazas_tud_emailt": "Ez az alkalmazás tud emailt küldeni (pl. jelszó-visszaállítás, meghívók) a Felhom-on keresztül,\n külön szolgáltató beállítása nélkül. A feladó címe: <strong>{{.AppEmailFromAddress}}</strong>.", "deploy.ez_az_alkalmazas_tud_emailt": "Ez az alkalmazás tud emailt küldeni (pl. jelszó-visszaállítás, meghívók) a Felhom-on keresztül,\n külön szolgáltató beállítása nélkül. A feladó címe: <strong>{{.AppEmailFromAddress}}</strong>.",
"deploy.ez_normalis_az_elso_percekben": "Ez normális az első percekben — az alkalmazás már elérhető lehet.", "deploy.ez_normalis_az_elso_percekben": "Ez normális az első percekben — az alkalmazás már elérhető lehet.",
"deploy.ezek_az_ertekek_a_telepitessel": "Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezze fel a szükséges jelszavakat!", "deploy.ezek_az_ertekek_a_telepitessel": "Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezd fel a szükséges jelszavakat!",
"deploy.ezek_az_ertekek_automatikusan_jottek": "Ezek az értékek automatikusan jöttek létre a telepítéskor.", "deploy.ezek_az_ertekek_automatikusan_jottek": "Ezek az értékek automatikusan jöttek létre a telepítéskor.",
"deploy.figyelem_a_muvelet_visszavonhatatlan_elo": "— FIGYELEM: a művelet visszavonhatatlan! Előtte győződj meg róla, hogy az alkalmazás az új tárolóról megfelelően működik.", "deploy.figyelem_a_muvelet_visszavonhatatlan_elo": "— FIGYELEM: a művelet visszavonhatatlan! Előtte győződj meg róla, hogy az alkalmazás az új tárolóról megfelelően működik.",
"deploy.foldrajzi_korlatozas": "Földrajzi korlátozás", "deploy.foldrajzi_korlatozas": "Földrajzi korlátozás",
@@ -1162,12 +1162,12 @@
"deploy.n_nnehany_hiba_tortent_n": "\\n\\nNéhány hiba történt:\\n", "deploy.n_nnehany_hiba_tortent_n": "\\n\\nNéhány hiba történt:\\n",
"deploy.naplok_megtekintese": "Naplók megtekintése", "deploy.naplok_megtekintese": "Naplók megtekintése",
"deploy.nem_elerheto": "{{$.CurrentHDDPath}} (nem elérhető)", "deploy.nem_elerheto": "{{$.CurrentHDDPath}} (nem elérhető)",
"deploy.nhasznalja_a_generalas_gombot_vagy": "\\nHasználja a Generálás gombot vagy írjon be egy jelszót.", "deploy.nhasznalja_a_generalas_gombot_vagy": "\\nHasználd a Generálás gombot vagy írj be egy jelszót.",
"deploy.nincs_eleg_memoria": "Nincs elég memória", "deploy.nincs_eleg_memoria": "Nincs elég memória",
"deploy.nincs_eleg_memoria_foglalas_telepites": "Nincs elég memória! Foglalás telepítés után: {{.AfterMB}} MB / {{.UsableMB}} MB", "deploy.nincs_eleg_memoria_foglalas_telepites": "Nincs elég memória! Foglalás telepítés után: {{.AfterMB}} MB / {{.UsableMB}} MB",
"deploy.nincs_eleg_szabad_tarhely": "Nincs elég szabad tárhely", "deploy.nincs_eleg_szabad_tarhely": "Nincs elég szabad tárhely",
"deploy.nincs_eleg_szabad_tarhely_a": "Nincs elég szabad tárhely a telepítéshez. Jelenleg {{.DockerFreeHuman}} szabad, és a rendszer\n {{.DockerReserveHuman}} tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében.\n A telepítés ezért átmenetileg le van tiltva — szabadítson fel helyet, vagy bővítse a tárhelyet.", "deploy.nincs_eleg_szabad_tarhely_a": "Nincs elég szabad tárhely a telepítéshez. Jelenleg {{.DockerFreeHuman}} szabad, és a rendszer\n {{.DockerReserveHuman}} tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében.\n A telepítés ezért átmenetileg le van tiltva — szabadíts fel helyet, vagy bővítsd a tárhelyet.",
"deploy.nincs_regisztralt_adattarolo_adja_meg": "Nincs regisztrált adattároló — adja meg kézzel az útvonalat", "deploy.nincs_regisztralt_adattarolo_adja_meg": "Nincs regisztrált adattároló — add meg kézzel az útvonalat",
"deploy.nincs_talalat": "Nincs találat", "deploy.nincs_talalat": "Nincs találat",
"deploy.nincs_telepitve": "Nincs telepítve", "deploy.nincs_telepitve": "Nincs telepítve",
"deploy.opcionalis_beallitasok": "Opcionális beállítások", "deploy.opcionalis_beallitasok": "Opcionális beállítások",
@@ -1307,7 +1307,7 @@
"err.selfupdate.docker_pull_hianyos_registry_hitelesito_adatok": "docker pull: hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)", "err.selfupdate.docker_pull_hianyos_registry_hitelesito_adatok": "docker pull: hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)",
"err.selfupdate.frissites_mar_folyamatban": "Frissítés már folyamatban", "err.selfupdate.frissites_mar_folyamatban": "Frissítés már folyamatban",
"err.selfupdate.hianyos_registry_hitelesito_adatok_felhasznalonev_es": "hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)", "err.selfupdate.hianyos_registry_hitelesito_adatok_felhasznalonev_es": "hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)",
"err.selfupdate.mentes_fut_probalja_kesobb": "Mentés fut, próbálja később", "err.selfupdate.mentes_fut_probalja_kesobb": "Mentés fut, próbáld később",
"err.selfupdate.nincs_elerheto_frissites": "Nincs elérhető frissítés", "err.selfupdate.nincs_elerheto_frissites": "Nincs elérhető frissítés",
"err.settings.a_halozati_tarhely_nem_lehet_a": "a hálózati tárhely nem lehet a rendszermentés célja: %s", "err.settings.a_halozati_tarhely_nem_lehet_a": "a hálózati tárhely nem lehet a rendszermentés célja: %s",
"err.settings.a_kiszolgalo_neve_csak_betut_szamot": "a kiszolgáló neve csak betűt, számot, kötőjelet és aláhúzást tartalmazhat", "err.settings.a_kiszolgalo_neve_csak_betut_szamot": "a kiszolgáló neve csak betűt, számot, kötőjelet és aláhúzást tartalmazhat",
@@ -1345,7 +1345,7 @@
"err.stacks.ellenorzes_sikertelen_appdata": "ellenőrzés sikertelen (%s appdata): %s", "err.stacks.ellenorzes_sikertelen_appdata": "ellenőrzés sikertelen (%s appdata): %s",
"err.stacks.ellenorzes_sikertelen_mentes": "ellenőrzés sikertelen (%s mentés): %s", "err.stacks.ellenorzes_sikertelen_mentes": "ellenőrzés sikertelen (%s mentés): %s",
"err.stacks.field_required": "a(z) %q (%s) mező kitöltése kötelező", "err.stacks.field_required": "a(z) %q (%s) mező kitöltése kötelező",
"err.stacks.field_required_password": "a(z) %q mező kitöltése kötelező — használja a Generálás gombot vagy írjon be egy jelszót", "err.stacks.field_required_password": "a(z) %q mező kitöltése kötelező — használd a Generálás gombot vagy írj be egy jelszót",
"err.stacks.forras_nevter_olvasasa_sikertelen": "forrás névtér olvasása sikertelen: %s", "err.stacks.forras_nevter_olvasasa_sikertelen": "forrás névtér olvasása sikertelen: %s",
"err.stacks.forras_torlese_sikertelen": "forrás törlése sikertelen (%s): %s", "err.stacks.forras_torlese_sikertelen": "forrás törlése sikertelen (%s): %s",
"err.stacks.forras_torlese_sikertelen_appdata": "forrás törlése sikertelen (%s appdata): %s", "err.stacks.forras_torlese_sikertelen_appdata": "forrás törlése sikertelen (%s appdata): %s",
@@ -1379,7 +1379,7 @@
"err.web.ervenytelen_csatlakoztatasi_nev_csak_betuk_szamok": "érvénytelen csatlakoztatási név (csak betűk, számok, _ és - engedélyezett)", "err.web.ervenytelen_csatlakoztatasi_nev_csak_betuk_szamok": "érvénytelen csatlakoztatási név (csak betűk, számok, _ és - engedélyezett)",
"err.web.ez_a_mappa_nem_oszthato_meg": "Ez a mappa nem osztható meg.", "err.web.ez_a_mappa_nem_oszthato_meg": "Ez a mappa nem osztható meg.",
"err.web.ez_az_egyetlen_hasznalhato_tarhely_a": "ez az egyetlen használható tárhely — a leszerelés megtagadva (előbb adj hozzá vagy állíts be másik alapértelmezett meghajtót)", "err.web.ez_az_egyetlen_hasznalhato_tarhely_a": "ez az egyetlen használható tárhely — a leszerelés megtagadva (előbb adj hozzá vagy állíts be másik alapértelmezett meghajtót)",
"err.web.formazas_kesz_de_az_uj_fajlrendszer": "formázás kész, de az új fájlrendszer-azonosító nem feloldható — frissítsen és használja a Csatolás funkciót", "err.web.formazas_kesz_de_az_uj_fajlrendszer": "formázás kész, de az új fájlrendszer-azonosító nem feloldható — frissítsd az oldalt, és használd a Csatolás funkciót",
"err.web.formazas_sikertelen": "formázás sikertelen: %s", "err.web.formazas_sikertelen": "formázás sikertelen: %s",
"err.web.formazas_sikertelen_2": "formázás sikertelen: %s", "err.web.formazas_sikertelen_2": "formázás sikertelen: %s",
"err.web.leszereles_visszavonasa_sikertelen": "leszerelés visszavonása sikertelen: %s", "err.web.leszereles_visszavonasa_sikertelen": "leszerelés visszavonása sikertelen: %s",
@@ -1444,7 +1444,7 @@
"event.storage_disconnected": "Meghajtó váratlanul leválasztva: %s", "event.storage_disconnected": "Meghajtó váratlanul leválasztva: %s",
"event.storage_reconnected": "Meghajtó újra csatlakoztatva: %s", "event.storage_reconnected": "Meghajtó újra csatlakoztatva: %s",
"flash.backup.not_configured": "Mentés nincs beállítva", "flash.backup.not_configured": "Mentés nincs beállítva",
"flash.backup.window_invalid_time": "Érvénytelen időpont. Használja a ÓÓ:PP formátumot (például 02:30).", "flash.backup.window_invalid_time": "Érvénytelen időpont. Használd az ÓÓ:PP formátumot (például 02:30).",
"flash.backup.window_save_failed": "A mentési időablak mentése nem sikerült.", "flash.backup.window_save_failed": "A mentési időablak mentése nem sikerült.",
"flash.backup.window_updated": "Mentési időablak frissítve.", "flash.backup.window_updated": "Mentési időablak frissítve.",
"flash.login.password_changed": "Jelszó sikeresen módosítva. Jelentkezz be az új jelszóval.", "flash.login.password_changed": "Jelszó sikeresen módosítva. Jelentkezz be az új jelszóval.",
@@ -1948,7 +1948,7 @@
"settings_security.a_helyi_halozati_hozzaferes_mindig": "A helyi hálózati hozzáférés mindig engedélyezett (nem halad át a Cloudflare-en).", "settings_security.a_helyi_halozati_hozzaferes_mindig": "A helyi hálózati hozzáférés mindig engedélyezett (nem halad át a Cloudflare-en).",
"settings_security.a_jelszavas_vedelem_nincs_beallitva": "A jelszavas védelem nincs beállítva. Kérd az üzemeltetőt a beállításhoz.", "settings_security.a_jelszavas_vedelem_nincs_beallitva": "A jelszavas védelem nincs beállítva. Kérd az üzemeltetőt a beállításhoz.",
"settings_security.a_visszaallitasi_jelszo_lekerese_nem": "A visszaállítási jelszó lekérése nem sikerült.", "settings_security.a_visszaallitasi_jelszo_lekerese_nem": "A visszaállítási jelszó lekérése nem sikerült.",
"settings_security.adja_meg_a_jelenlegi_jelszavat": "Adja meg a jelenlegi jelszavát", "settings_security.adja_meg_a_jelenlegi_jelszavat": "Add meg a jelenlegi jelszavad",
"settings_security.alkalmazas_kivalasztasa": "— Alkalmazás kiválasztása —", "settings_security.alkalmazas_kivalasztasa": "— Alkalmazás kiválasztása —",
"settings_security.alkalmazas_specifikus_felulirasok": "Alkalmazás-specifikus felülírások", "settings_security.alkalmazas_specifikus_felulirasok": "Alkalmazás-specifikus felülírások",
"settings_security.beallitasok_biztonsag_es_hozzaferes": "Beállítások — Biztonság és hozzáférés", "settings_security.beallitasok_biztonsag_es_hozzaferes": "Beállítások — Biztonság és hozzáférés",
@@ -1956,10 +1956,10 @@
"settings_security.elrejt": "Elrejt", "settings_security.elrejt": "Elrejt",
"settings_security.engedelyezett_orszagok": "Engedélyezett országok:", "settings_security.engedelyezett_orszagok": "Engedélyezett országok:",
"settings_security.engedelyezett_orszagok_globalis": "Engedélyezett országok (globális)", "settings_security.engedelyezett_orszagok_globalis": "Engedélyezett országok (globális)",
"settings_security.ezeket_az_adatokat_mentse_el": "Ezeket az adatokat mentse el biztos helyre. Újratelepítés esetén szükség lesz rájuk a rendszer visszaállításához.", "settings_security.ezeket_az_adatokat_mentse_el": "Ezeket az adatokat mentsd el biztos helyre. Újratelepítés esetén szükség lesz rájuk a rendszer visszaállításához.",
"settings_security.felhom_eu_kapcsolat": "<a href=\"mailto:{{.SupportEmail}}\" style=\"color: var(--blue);\">{{.SupportEmail}}</a>\n &nbsp;|&nbsp;\n <a href=\"{{.SupportURL}}\" target=\"_blank\" style=\"color: var(--blue);\">felhom.eu/kapcsolat</a>", "settings_security.felhom_eu_kapcsolat": "<a href=\"mailto:{{.SupportEmail}}\" style=\"color: var(--blue);\">{{.SupportEmail}}</a>\n &nbsp;|&nbsp;\n <a href=\"{{.SupportURL}}\" target=\"_blank\" style=\"color: var(--blue);\">felhom.eu/kapcsolat</a>",
"settings_security.figyelem": "Figyelem", "settings_security.figyelem": "Figyelem",
"settings_security.figyelem_magyarorszag_eltavolitasa_azt_j": "Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatja?", "settings_security.figyelem_magyarorszag_eltavolitasa_azt_j": "Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatod?",
"settings_security.foldrajzi_korlatozas": "Földrajzi korlátozás", "settings_security.foldrajzi_korlatozas": "Földrajzi korlátozás",
"settings_security.geo_korlatozas_aktiv": "Geo-korlátozás aktív", "settings_security.geo_korlatozas_aktiv": "Geo-korlátozás aktív",
"settings_security.halozati_hiba": "Hálózati hiba", "settings_security.halozati_hiba": "Hálózati hiba",
@@ -1971,7 +1971,7 @@
"settings_security.kesz": "Kész", "settings_security.kesz": "Kész",
"settings_security.kezi_szinkronizalas": "Kézi szinkronizálás", "settings_security.kezi_szinkronizalas": "Kézi szinkronizálás",
"settings_security.legalabb_8_karakter": "Legalább 8 karakter", "settings_security.legalabb_8_karakter": "Legalább 8 karakter",
"settings_security.magyarorszag_eltavolitasa_nem_ajanlott_f": "Magyarország eltávolítása nem ajánlott. Folytatja?", "settings_security.magyarorszag_eltavolitasa_nem_ajanlott_f": "Magyarország eltávolítása nem ajánlott. Folytatod?",
"settings_security.megerosites": "Megerősítés", "settings_security.megerosites": "Megerősítés",
"settings_security.megjelenit": "Megjelenít", "settings_security.megjelenit": "Megjelenít",
"settings_security.mentes": "Mentés...", "settings_security.mentes": "Mentés...",
@@ -2002,14 +2002,14 @@
"settings_system.atmeretezes": "Átméretezés", "settings_system.atmeretezes": "Átméretezés",
"settings_system.atmeretezes_2": "Átméretezés...", "settings_system.atmeretezes_2": "Átméretezés...",
"settings_system.automatikus_frissites": "Automatikus frissítés", "settings_system.automatikus_frissites": "Automatikus frissítés",
"settings_system.az_egesz_kiszolgalo_szerver_ujrainditasa": "Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használja, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.", "settings_system.az_egesz_kiszolgalo_szerver_ujrainditasa": "Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használd, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.",
"settings_system.az_ujrainditas_a_vartnal_tovabb": "Az újraindítás a vártnál tovább tart. Töltse újra az oldalt kézzel.", "settings_system.az_ujrainditas_a_vartnal_tovabb": "Az újraindítás a vártnál tovább tart. Töltsd újra az oldalt kézzel.",
"settings_system.az_uzemelteto_altal_beallitott_ertekek": "Az üzemeltető által beállított értékek. Módosításhoz kérd az üzemeltetőt.", "settings_system.az_uzemelteto_altal_beallitott_ertekek": "Az üzemeltető által beállított értékek. Módosításhoz kérd az üzemeltetőt.",
"settings_system.beallitasok_rendszer": "Beállítások — Rendszer", "settings_system.beallitasok_rendszer": "Beállítások — Rendszer",
"settings_system.biztonsagi_mentes": "Biztonsági mentés", "settings_system.biztonsagi_mentes": "Biztonsági mentés",
"settings_system.biztosan_frissiti_a_controllert_n": "Biztosan frissíti a controllert?\\n\\nA folyamat alatt a vezérlőpult rövid időre elérhetetlenné válik.", "settings_system.biztosan_frissiti_a_controllert_n": "Biztosan frissíti a controllert?\\n\\nA folyamat alatt a vezérlőpult rövid időre elérhetetlenné válik.",
"settings_system.biztosan_ujrainditja_a_kiszolgalot_az": "Biztosan újraindítja a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.", "settings_system.biztosan_ujrainditja_a_kiszolgalot_az": "Biztosan újraindítod a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.",
"settings_system.biztosan_ujrainditja_a_vezerlot_a": "Biztosan újraindítja a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.", "settings_system.biztosan_ujrainditja_a_vezerlot_a": "Biztosan újraindítod a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.",
"settings_system.csokkentes": "Csökkentés", "settings_system.csokkentes": "Csökkentés",
"settings_system.ellenorzes": "Ellenőrzés...", "settings_system.ellenorzes": "Ellenőrzés...",
"settings_system.ervenytelen_memoria_ertek": "Érvénytelen memória érték", "settings_system.ervenytelen_memoria_ertek": "Érvénytelen memória érték",
@@ -2023,7 +2023,7 @@
"settings_system.frissites_folyamatban_a_vezerlo_hamarosa": "Frissítés folyamatban — a vezérlő hamarosan újraindul…", "settings_system.frissites_folyamatban_a_vezerlo_hamarosa": "Frissítés folyamatban — a vezérlő hamarosan újraindul…",
"settings_system.frissites_keresese": "Frissítés keresése", "settings_system.frissites_keresese": "Frissítés keresése",
"settings_system.frissites_telepitese": "Frissítés telepítése", "settings_system.frissites_telepitese": "Frissítés telepítése",
"settings_system.ha_a_vezerlo_hibasan_mukodik": "Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatja — nem kell az egész szervert újraindítani.\n Az alkalmazásai futnak tovább; csak a vezérlő indul újra (néhány másodperc).", "settings_system.ha_a_vezerlo_hibasan_mukodik": "Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatod — nem kell az egész szervert újraindítani.\n Az alkalmazásaid futnak tovább; csak a vezérlő indul újra (néhány másodperc).",
"settings_system.halozat": "Hálózat", "settings_system.halozat": "Hálózat",
"settings_system.halozati_nev": "Hálózati név", "settings_system.halozati_nev": "Hálózati név",
"settings_system.helyi_cim_lan": "Helyi cím (LAN)", "settings_system.helyi_cim_lan": "Helyi cím (LAN)",
@@ -2137,7 +2137,7 @@
"stacks.alkalmazas_visszaallitasa_exportalt_csom": "Alkalmazás visszaállítása exportált csomagból", "stacks.alkalmazas_visszaallitasa_exportalt_csom": "Alkalmazás visszaállítása exportált csomagból",
"stacks.alkalmazasok": "Alkalmazások", "stacks.alkalmazasok": "Alkalmazások",
"stacks.az_alkalmazas_adattaroloja_nem_elerheto": "Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat.", "stacks.az_alkalmazas_adattaroloja_nem_elerheto": "Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat.",
"stacks.az_alkalmazas_kornyezeteben_a_halozati": "Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezze az üzemeltetőnek.", "stacks.az_alkalmazas_kornyezeteben_a_halozati": "Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezd az üzemeltetőnek.",
"stacks.frissites": "Frissítés", "stacks.frissites": "Frissítés",
"stacks.futo": "Futó", "stacks.futo": "Futó",
"stacks.halozati_tarhely_hibas_az_alkalmazas": "Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja", "stacks.halozati_tarhely_hibas_az_alkalmazas": "Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja",
@@ -2163,7 +2163,7 @@
"storage.a_masolatok_redundansak_az_eredetik": "(A másolatok redundánsak — az eredetik a forrás-meghajtón maradnak.)", "storage.a_masolatok_redundansak_az_eredetik": "(A másolatok redundánsak — az eredetik a forrás-meghajtón maradnak.)",
"storage.a_meghajto_biztonsagosan_eltavolithato": "A meghajtó biztonságosan eltávolítható.", "storage.a_meghajto_biztonsagosan_eltavolithato": "A meghajtó biztonságosan eltávolítható.",
"storage.a_meghajto_kimarad_az_uj": "A meghajtó kimarad az új alkalmazás-telepítésekből. A rajta lévő alkalmazások változatlanul futnak.", "storage.a_meghajto_kimarad_az_uj": "A meghajtó kimarad az új alkalmazás-telepítésekből. A rajta lévő alkalmazások változatlanul futnak.",
"storage.a_meghajto_levalasztasra_kerul_az": "A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolja.", "storage.a_meghajto_levalasztasra_kerul_az": "A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolod.",
"storage.a_meghajto_ujra_valaszthato_az": "A meghajtó újra választható az új alkalmazás-telepítéseknél.", "storage.a_meghajto_ujra_valaszthato_az": "A meghajtó újra választható az új alkalmazás-telepítéseknél.",
"storage.a_meghajto_vegleges_kivonasa_a": "A meghajtó végleges kivonása a rendszerből. Ha céltárolót választ, előbb minden adat átkerül oda; áthelyezés nélkül az adatok a meghajtón maradnak.", "storage.a_meghajto_vegleges_kivonasa_a": "A meghajtó végleges kivonása a rendszerből. Ha céltárolót választ, előbb minden adat átkerül oda; áthelyezés nélkül az adatok a meghajtón maradnak.",
"storage.a_muvelet_utan_a_kovetkezo": "A művelet után a következő alkalmazások <strong>nem fognak működni</strong>:", "storage.a_muvelet_utan_a_kovetkezo": "A művelet után a következő alkalmazások <strong>nem fognak működni</strong>:",
@@ -2193,9 +2193,9 @@
"storage.belso_ssd_a_szerver_rendszere": "Belső SSD — a szerver rendszere, a Docker és a telepített alkalmazások adatbázisai itt találhatók.", "storage.belso_ssd_a_szerver_rendszere": "Belső SSD — a szerver rendszere, a Docker és a telepített alkalmazások adatbázisai itt találhatók.",
"storage.biztonsagi_mentes_vedett": "Biztonsági mentés — védett", "storage.biztonsagi_mentes_vedett": "Biztonsági mentés — védett",
"storage.biztonsagos_levalasztas": "Biztonságos leválasztás", "storage.biztonsagos_levalasztas": "Biztonságos leválasztás",
"storage.biztos_levalasztja_a_meghajtot": "Biztos leválasztja a meghajtót:", "storage.biztos_levalasztja_a_meghajtot": "Biztosan leválasztod a meghajtót:",
"storage.biztosan_eltavolitja_adattarolot": "Biztosan eltávolítja a(z) {{.Path}} adattárolót?", "storage.biztosan_eltavolitja_adattarolot": "Biztosan eltávolítod a(z) {{.Path}} adattárolót?",
"storage.biztosan_eltavolitja_meghajtot": "Biztosan eltávolítja a(z) {{.Label}} ({{.Path}}) meghajtót a rendszerből?\\n\\nA meghajtó adatai NEM törlődnek.", "storage.biztosan_eltavolitja_meghajtot": "Biztosan eltávolítod a(z) {{.Label}} ({{.Path}}) meghajtót a rendszerből?\\n\\nA meghajtó adatai NEM törlődnek.",
"storage.csak_a_nyilvantartasbol_torli_a": "Csak a nyilvántartásból törli a meghajtót — az adatok és a fájlrendszer érintetlenül maradnak.", "storage.csak_a_nyilvantartasbol_torli_a": "Csak a nyilvántartásból törli a meghajtót — az adatok és a fájlrendszer érintetlenül maradnak.",
"storage.csatlakoztatas": "Csatlakoztatás", "storage.csatlakoztatas": "Csatlakoztatás",
"storage.csatlakoztatas_2": "Csatlakoztatás...", "storage.csatlakoztatas_2": "Csatlakoztatás...",
@@ -2246,7 +2246,7 @@
"storage.leszereles_athelyezessel_minden_adat_atm": "Leszerelés áthelyezéssel: minden adat átmásolása ide:", "storage.leszereles_athelyezessel_minden_adat_atm": "Leszerelés áthelyezéssel: minden adat átmásolása ide:",
"storage.leszereles_elinditva": "Leszerelés elindítva.", "storage.leszereles_elinditva": "Leszerelés elindítva.",
"storage.leszerelese_n_naz_adatok_nem": "leszerelése?\\n\\nAz adatok NEM törlődnek.", "storage.leszerelese_n_naz_adatok_nem": "leszerelése?\\n\\nAz adatok NEM törlődnek.",
"storage.leszerelesehez_athelyezes_nelkul_irja_be": "leszereléséhez (áthelyezés nélkül) írja be a meghajtó nevét megerősítésként.", "storage.leszerelesehez_athelyezes_nelkul_irja_be": "leszereléséhez (áthelyezés nélkül) írd be a meghajtó nevét megerősítésként.",
"storage.levalasztas": "Leválasztás", "storage.levalasztas": "Leválasztás",
"storage.levalasztas_folyamatban": "Leválasztás folyamatban…", "storage.levalasztas_folyamatban": "Leválasztás folyamatban…",
"storage.levalasztva": "Leválasztva", "storage.levalasztva": "Leválasztva",
@@ -2254,8 +2254,8 @@
"storage.majd_a_z": "majd a(z)", "storage.majd_a_z": "majd a(z)",
"storage.mar_csatlakoztatott_tarhely_hozzaadasa_k": "Már csatlakoztatott tárhely hozzáadása kézzel", "storage.mar_csatlakoztatott_tarhely_hozzaadasa_k": "Már csatlakoztatott tárhely hozzáadása kézzel",
"storage.megerosites": "Megerősítés", "storage.megerosites": "Megerősítés",
"storage.megerositeshez_irja_be": "Megerősítéshez írja be:", "storage.megerositeshez_irja_be": "Megerősítéshez írd be:",
"storage.megerositeshez_irja_be_a_csatlakoztatasi": "Megerősítéshez írja be a csatlakoztatási nevet:", "storage.megerositeshez_irja_be_a_csatlakoztatasi": "Megerősítéshez írd be a csatlakoztatási nevet:",
"storage.meghajto_eltavolitasa": "Meghajtó eltávolítása", "storage.meghajto_eltavolitasa": "Meghajtó eltávolítása",
"storage.meghajto_leszerelese": "Meghajtó leszerelése", "storage.meghajto_leszerelese": "Meghajtó leszerelése",
"storage.meghajto_levalasztasa": "Meghajtó leválasztása", "storage.meghajto_levalasztasa": "Meghajtó leválasztása",
@@ -2302,7 +2302,7 @@
"storage.vedett_csak_operatori_alairassal_modosit": "védett — csak operátori aláírással módosíthatók", "storage.vedett_csak_operatori_alairassal_modosit": "védett — csak operátori aláírással módosíthatók",
"storage.vegleges_leszereles": "Végleges leszerelés", "storage.vegleges_leszereles": "Végleges leszerelés",
"storage.visszacsatlakoztatas": "Visszacsatlakoztatás", "storage.visszacsatlakoztatas": "Visszacsatlakoztatás",
"storage.visszacsatlakoztatja_a_z": "Visszacsatlakoztatja a(z)", "storage.visszacsatlakoztatja_a_z": "Visszacsatlakoztatod a(z)",
"storage_attach.1_meghajto_kivalasztasa": "1. Meghajtó kiválasztása", "storage_attach.1_meghajto_kivalasztasa": "1. Meghajtó kiválasztása",
"storage_attach.2_konfiguracio": "2. Konfiguráció", "storage_attach.2_konfiguracio": "2. Konfiguráció",
"storage_attach.a_meghajto_a_mnt_nev": "A meghajtó a /mnt/&lt;név&gt; útvonalra kerül.", "storage_attach.a_meghajto_a_mnt_nev": "A meghajtó a /mnt/&lt;név&gt; útvonalra kerül.",
@@ -2324,14 +2324,14 @@
"storage_attach.meglevo_meghajto_csatolasa": "Meglévő meghajtó csatolása", "storage_attach.meglevo_meghajto_csatolasa": "Meglévő meghajtó csatolása",
"storage_attach.megnevezes": "Megnevezés", "storage_attach.megnevezes": "Megnevezés",
"storage_attach.megsem": "Mégsem", "storage_attach.megsem": "Mégsem",
"storage_attach.nincs_csatolhato_meghajto_a_csatolashoz": "Nincs csatolható meghajtó — a csatoláshoz olyan (még nem használt) meghajtó kell, amelyen már van fájlrendszer. Új, üres meghajtóhoz használja az „Inicializálás” lehetőséget.", "storage_attach.nincs_csatolhato_meghajto_a_csatolashoz": "Nincs csatolható meghajtó — a csatoláshoz olyan (még nem használt) meghajtó kell, amelyen már van fájlrendszer. Új, üres meghajtóhoz használd az „Inicializálás” lehetőséget.",
"storage_attach.nyilvantartasba_veve": "nyilvántartásba véve", "storage_attach.nyilvantartasba_veve": "nyilvántartásba véve",
"storage_attach.valassza_ki_a_mar_fajlrendszerrel": "Válaszd ki a már fájlrendszerrel rendelkező meghajtót.\n <strong>A meghajtón lévő adatok nem törlődnek</strong> — a csatolás csak elérhetővé teszi azokat.", "storage_attach.valassza_ki_a_mar_fajlrendszerrel": "Válaszd ki a már fájlrendszerrel rendelkező meghajtót.\n <strong>A meghajtón lévő adatok nem törlődnek</strong> — a csatolás csak elérhetővé teszi azokat.",
"storage_attach.vissza": "← Vissza", "storage_attach.vissza": "← Vissza",
"storage_attach.vissza_a_beallitasokhoz": ". <a href=\"/settings\">Vissza a Beállításokhoz →</a>", "storage_attach.vissza_a_beallitasokhoz": ". <a href=\"/settings\">Vissza a Beállításokhoz →</a>",
"storage_init.1_meghajto_kivalasztasa": "1. Meghajtó kiválasztása", "storage_init.1_meghajto_kivalasztasa": "1. Meghajtó kiválasztása",
"storage_init.2_konfiguracio": "2. Konfiguráció", "storage_init.2_konfiguracio": "2. Konfiguráció",
"storage_init.a_kivalasztott_meghajto_adatot_tartalmaz": "A kiválasztott meghajtó <strong>adatot tartalmaz</strong>. Az inicializálás (formázás) törli a rajta lévő\n összes adatot — a folytatáshoz meg kell erősítenie.", "storage_init.a_kivalasztott_meghajto_adatot_tartalmaz": "A kiválasztott meghajtó <strong>adatot tartalmaz</strong>. Az inicializálás (formázás) törli a rajta lévő\n összes adatot — a folytatáshoz meg kell erősítened.",
"storage_init.a_meghajto_a_mnt_nev": "A meghajtó a /mnt/&lt;név&gt; útvonalra kerül.", "storage_init.a_meghajto_a_mnt_nev": "A meghajtó a /mnt/&lt;név&gt; útvonalra kerül.",
"storage_init.a_meghajto_adatot_tartalmaz_a": "A meghajtó adatot tartalmaz. A formázás <strong>véglegesen törli</strong> a rajta lévő összes adatot.", "storage_init.a_meghajto_adatot_tartalmaz_a": "A meghajtó adatot tartalmaz. A formázás <strong>véglegesen törli</strong> a rajta lévő összes adatot.",
"storage_init.a_meghajto_sikeresen_inicializalva_es": "A meghajtó sikeresen inicializálva és regisztrálva:", "storage_init.a_meghajto_sikeresen_inicializalva_es": "A meghajtó sikeresen inicializálva és regisztrálva:",
@@ -2352,7 +2352,7 @@
"storage_init.kivalasztott_eszkoz": "Kiválasztott eszköz", "storage_init.kivalasztott_eszkoz": "Kiválasztott eszköz",
"storage_init.kulso_hdd_1tb": "Külső HDD 1TB", "storage_init.kulso_hdd_1tb": "Külső HDD 1TB",
"storage_init.mar_folyamatban_van_egy_inicializalas": "Már folyamatban van egy inicializálás.", "storage_init.mar_folyamatban_van_egy_inicializalas": "Már folyamatban van egy inicializálás.",
"storage_init.megerositeshez_irja_be_a_csatlakoztatasi": "Megerősítéshez írja be a csatlakoztatási nevet:", "storage_init.megerositeshez_irja_be_a_csatlakoztatasi": "Megerősítéshez írd be a csatlakoztatási nevet:",
"storage_init.meghajtok_betoltese_sikertelen": "Meghajtók betöltése sikertelen:", "storage_init.meghajtok_betoltese_sikertelen": "Meghajtók betöltése sikertelen:",
"storage_init.megnevezes": "Megnevezés", "storage_init.megnevezes": "Megnevezés",
"storage_init.megsem": "Mégsem", "storage_init.megsem": "Mégsem",
@@ -2374,7 +2374,7 @@
"storage_network.a_legtobb_mediaalkalmazas_1000_es": "A legtöbb médiaalkalmazás 1000-es azonosítóval fut.", "storage_network.a_legtobb_mediaalkalmazas_1000_es": "A legtöbb médiaalkalmazás 1000-es azonosítóval fut.",
"storage_network.a_megosztas_a_gazdagepen_elerheto": "A megosztás a gazdagépen elérhető, de az alkalmazások környezetében üres helyi könyvtár látszik — az adatok NEM a NAS-ra kerülnének", "storage_network.a_megosztas_a_gazdagepen_elerheto": "A megosztás a gazdagépen elérhető, de az alkalmazások környezetében üres helyi könyvtár látszik — az adatok NEM a NAS-ra kerülnének",
"storage_network.a_megosztas_a_mnt_felhom": "A megosztás a /mnt/felhom-drives/&lt;név&gt; útvonalon lesz elérhető.", "storage_network.a_megosztas_a_mnt_felhom": "A megosztás a /mnt/felhom-drives/&lt;név&gt; útvonalon lesz elérhető.",
"storage_network.a_megosztas_be_van_allitva": "A megosztás be van állítva a gazdagépen, de nincs regisztrálva — egy megszakadt csatlakoztatás maradványa. Távolítsa el, vagy adja hozzá újra ugyanezzel a névvel.", "storage_network.a_megosztas_be_van_allitva": "A megosztás be van állítva a gazdagépen, de nincs regisztrálva — egy megszakadt csatlakoztatás maradványa. Távolítsd el, vagy add hozzá újra ugyanezzel a névvel.",
"storage_network.a_megosztas_elerheto_es_csatlakoztatva": "A megosztás elérhető és csatlakoztatva van", "storage_network.a_megosztas_elerheto_es_csatlakoztatva": "A megosztás elérhető és csatlakoztatva van",
"storage_network.a_nas_jelenleg_nem_erheto": "A NAS jelenleg nem érhető el — az érintett alkalmazások átmenetileg nem olvasnak róla", "storage_network.a_nas_jelenleg_nem_erheto": "A NAS jelenleg nem érhető el — az érintett alkalmazások átmenetileg nem olvasnak róla",
"storage_network.a_qnap_feluletere_szabott_lepesrol": "A QNAP felületére szabott lépésről lépésre útmutató készül.", "storage_network.a_qnap_feluletere_szabott_lepesrol": "A QNAP felületére szabott lépésről lépésre útmutató készül.",
@@ -2383,21 +2383,21 @@
"storage_network.arva": "Árva", "storage_network.arva": "Árva",
"storage_network.az_allapot_jelenleg_nem_lekerdezheto": "Az állapot jelenleg nem lekérdezhető", "storage_network.az_allapot_jelenleg_nem_lekerdezheto": "Az állapot jelenleg nem lekérdezhető",
"storage_network.beallitva_a_gazdagepen_de_nincs": "Beállítva a gazdagépen, de nincs regisztrálva", "storage_network.beallitva_a_gazdagepen_de_nincs": "Beállítva a gazdagépen, de nincs regisztrálva",
"storage_network.biztosan_eltavolitja_a_z": "Biztosan eltávolítja a(z)", "storage_network.biztosan_eltavolitja_a_z": "Biztosan eltávolítod a(z)",
"storage_network.csatlakoztatas": "Csatlakoztatás", "storage_network.csatlakoztatas": "Csatlakoztatás",
"storage_network.csatolasi_teszt": "Csatolási teszt…", "storage_network.csatolasi_teszt": "Csatolási teszt…",
"storage_network.egy_nas_megosztas_nfs_vagy": "Egy NAS-megosztás (NFS vagy SMB) csatlakoztatása nagy méretű médiatartalomhoz (film, fotó, zene).\n A megosztás kiválasztható médiaalkalmazás adatkönyvtáraként. A hálózati tárhely nem fizikai\n meghajtó — nincs leszerelés/áthelyezés, csak eltávolítás.", "storage_network.egy_nas_megosztas_nfs_vagy": "Egy NAS-megosztás (NFS vagy SMB) csatlakoztatása nagy méretű médiatartalomhoz (film, fotó, zene).\n A megosztás kiválasztható médiaalkalmazás adatkönyvtáraként. A hálózati tárhely nem fizikai\n meghajtó — nincs leszerelés/áthelyezés, csak eltávolítás.",
"storage_network.egyszeru_mas_nas_okhoz_kapcsolja": "Egyszerű (más NAS-okhoz): kapcsolja be az exporton a „minden felhasználó leképezése” (map all\n users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok\n tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.", "storage_network.egyszeru_mas_nas_okhoz_kapcsolja": "Egyszerű (más NAS-okhoz): kapcsold be az exporton a „minden felhasználó leképezése” (map all\n users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok\n tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.",
"storage_network.elerheto": "Elérhető", "storage_network.elerheto": "Elérhető",
"storage_network.elerheto_jelenleg_keszenletben_igeny_sze": "Elérhető, jelenleg készenlétben (igény szerint csatlakozik)", "storage_network.elerheto_jelenleg_keszenletben_igeny_sze": "Elérhető, jelenleg készenlétben (igény szerint csatlakozik)",
"storage_network.eltavolitas": "Eltávolítás", "storage_network.eltavolitas": "Eltávolítás",
"storage_network.engedelyezze_a_felhom_gep_ip": "Engedélyezze a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.", "storage_network.engedelyezze_a_felhom_gep_ip": "Engedélyezd a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.",
"storage_network.halozati_tarhely_eltavolitasa": "Hálózati tárhely eltávolítása", "storage_network.halozati_tarhely_eltavolitasa": "Hálózati tárhely eltávolítása",
"storage_network.halozati_tarhely_hozzaadasa": "Hálózati tárhely hozzáadása", "storage_network.halozati_tarhely_hozzaadasa": "Hálózati tárhely hozzáadása",
"storage_network.halozati_tarhelyet_n_na_megosztas": "hálózati tárhelyet?\\n\\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.", "storage_network.halozati_tarhelyet_n_na_megosztas": "hálózati tárhelyet?\\n\\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.",
"storage_network.hiba": "Hiba:", "storage_network.hiba": "Hiba:",
"storage_network.hibas_az_alkalmazasok_nem_a": "Hibás — az alkalmazások nem a NAS-t látják", "storage_network.hibas_az_alkalmazasok_nem_a": "Hibás — az alkalmazások nem a NAS-t látják",
"storage_network.hozzon_letre_vagy_jeloljon_ki": "Hozzon létre (vagy jelöljön ki) egy felhasználót a NAS-on, és adjon neki írás-olvasás jogot a\n megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében\n jönnek létre.", "storage_network.hozzon_letre_vagy_jeloljon_ki": "Hozz létre (vagy jelölj ki) egy felhasználót a NAS-on, és adj neki írás-olvasás jogot a\n megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében\n jönnek létre.",
"storage_network.igy_a_tulajdonos_informaciok_is": "— így a tulajdonos-információk is hibátlanok.", "storage_network.igy_a_tulajdonos_informaciok_is": "— így a tulajdonos-információk is hibátlanok.",
"storage_network.ip_cim_vagy_dns_nev": "IP-cím vagy DNS-név. A Windows-hálózati név (pl. FELHOM) itt általában nem oldható fel — a Megosztás oldal »közvetlen cím« sora adja meg a másik eszköz IP-címét.", "storage_network.ip_cim_vagy_dns_nev": "IP-cím vagy DNS-név. A Windows-hálózati név (pl. FELHOM) itt általában nem oldható fel — a Megosztás oldal »közvetlen cím« sora adja meg a másik eszköz IP-címét.",
"storage_network.irasteszt": "Írásteszt…", "storage_network.irasteszt": "Írásteszt…",
@@ -2423,7 +2423,7 @@
"storage_network.smb_felhasznalonev": "SMB felhasználónév", "storage_network.smb_felhasznalonev": "SMB felhasználónév",
"storage_network.smb_jelszo": "SMB jelszó", "storage_network.smb_jelszo": "SMB jelszó",
"storage_network.smb_synology_qnap_a_legtobb": "SMB (Synology, QNAP — a legtöbb NAS)", "storage_network.smb_synology_qnap_a_legtobb": "SMB (Synology, QNAP — a legtöbb NAS)",
"storage_network.synology_dsm_ellenorzott_lepesek_eloszor": "Synology (DSM, ellenőrzött lépések): először kapcsolja be az NFS-t — Vezérlőpult → File\n Services → NFS fül → „Enable NFS service”, és állítsa a „Maximum NFS protocol” értékét\n NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott\n mappa szerkesztésében az „NFS Permissions” fülön hozzon létre szabályt a Felhom gép\n IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval.\n A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a\n fenti „Megosztás” mezőbe.", "storage_network.synology_dsm_ellenorzott_lepesek_eloszor": "Synology (DSM, ellenőrzött lépések): először kapcsold be az NFS-t — Vezérlőpult → File\n Services → NFS fül → „Enable NFS service”, és állítsd a „Maximum NFS protocol” értékét\n NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott\n mappa szerkesztésében az „NFS Permissions” fülön hozz létre szabályt a Felhom gép\n IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval.\n A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a\n fenti „Megosztás” mezőbe.",
"storage_network.szerver_ip_vagy_hosztnev": "Szerver (IP vagy hosztnév)", "storage_network.szerver_ip_vagy_hosztnev": "Szerver (IP vagy hosztnév)",
"storage_network.tarhely_halozati_tarhely_nas": "Tárhely — Hálózati tárhely (NAS)", "storage_network.tarhely_halozati_tarhely_nas": "Tárhely — Hálózati tárhely (NAS)",
"storage_network.technikai_reszletek": "Technikai részletek", "storage_network.technikai_reszletek": "Technikai részletek",
@@ -71,7 +71,7 @@ func TestR553_DeployProducersCarryKindAndKeepTheirWords(t *testing.T) {
yml: "display_name: R553\ndeploy_fields:\n - env_var: ADMIN_PW\n label: Jelszó\n type: password\n", yml: "display_name: R553\ndeploy_fields:\n - env_var: ADMIN_PW\n label: Jelszó\n type: password\n",
values: map[string]string{}, values: map[string]string{},
kind: ErrRequiredField, kind: ErrRequiredField,
wantMsg: `a(z) "Jelszó" mező kitöltése kötelező — használja a Generálás gombot vagy írjon be egy jelszót`, wantMsg: `a(z) "Jelszó" mező kitöltése kötelező — használd a Generálás gombot vagy írj be egy jelszót`,
}, },
{ {
name: "path field naming something that is not there", name: "path field naming something that is not there",
@@ -106,7 +106,7 @@ func TestR103_ConfirmStatesTheOverwrite(t *testing.T) {
html := renderBackupPage(t, "backups_apps", baseBackupData([]AppBackupRow{ html := renderBackupPage(t, "backups_apps", baseBackupData([]AppBackupRow{
r103Row(t, true, "2026-08-25T03:30:00Z", true), r103Row(t, true, "2026-08-25T03:30:00Z", true),
})) }))
fileConfirmStart := strings.Index(html, "Visszaállítja a hiányzó fájlokat") fileConfirmStart := strings.Index(html, "Visszaállítod a hiányzó fájlokat")
if fileConfirmStart < 0 { if fileConfirmStart < 0 {
t.Fatal("the additive confirm is gone — the negative control has nothing to check") t.Fatal("the additive confirm is gone — the negative control has nothing to check")
} }
@@ -153,3 +153,45 @@ func TestR516_FormalFormsAreGone(t *testing.T) {
t.Fatal("the ASCII fold does not work — the negative control proves nothing") t.Fatal("the ASCII fold does not work — the negative control proves nothing")
} }
} }
// R-516 (2026-10-06) — the formal („ön") forms the gate's first stem list did not see: the debug RESET
// prompt, the storage and network-storage confirms and guides, the security and system pages, the
// deploy and restore copy. They are in the te-form now; the i18n gate's widened stems keep new ones out.
func TestR516_WidenedFormalFormsAreGone(t *testing.T) {
b, err := i18n.Shared()
if err != nil {
t.Fatal(err)
}
want := map[string]string{
"debug.irja_be_reset": "Írd be: RESET",
"debug.api.reset_confirm_invalid": "Érvénytelen megerősítés — írd be: RESET",
"settings_security.adja_meg_a_jelenlegi_jelszavat": "Add meg a jelenlegi jelszavad",
"storage.biztosan_eltavolitja_adattarolot": "Biztosan eltávolítod a(z) {{.Path}} adattárolót?",
"storage_network.engedelyezze_a_felhom_gep_ip": "Engedélyezd a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.",
"backups_remote.a_letetben_levo_helyreallitasi_csomag": "A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozz létre új helyreállítási kódot.",
"err.selfupdate.mentes_fut_probalja_kesobb": "Mentés fut, próbáld később",
"flash.backup.window_invalid_time": "Érvénytelen időpont. Használd az ÓÓ:PP formátumot (például 02:30).",
}
for key, w := range want {
got, fellBack, ok := b.Text("hu", key)
if !ok || fellBack || got != w {
t.Errorf("%s: %q, want %q", key, got, w)
}
}
fold := strings.NewReplacer("á", "a", "é", "e", "í", "i", "ó", "o", "ö", "o", "ő", "o", "ú", "u", "ü", "u", "ű", "u")
stems := []string{"irja be", "hozzon letre", "biztosan eltavolitja", "engedelyezze", "probalja", "valasszon",
"jelezze", "biztosan ujrainditja", "folytatja?", "szabaditson", "mentse el", "tavolitsa el"}
for _, key := range b.Keys("hu") {
v, _, _ := b.Text("hu", key)
lv := fold.Replace(strings.ToLower(v))
for _, st := range stems {
if strings.Contains(lv, st) {
t.Errorf("%s still carries the formal %q: %q", key, st, v)
}
}
}
// Positive control: the fold must turn a formal sentence into a matching stem, or the loop judged nothing.
if lv := fold.Replace(strings.ToLower("Írja be a nevet")); !strings.Contains(lv, "irja be") {
t.Fatal("the ASCII fold does not work — the negative control proves nothing")
}
}
@@ -820,7 +820,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -903,7 +903,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -851,7 +851,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -934,7 +934,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -855,7 +855,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -938,7 +938,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -849,7 +849,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -932,7 +932,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -763,7 +763,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -846,7 +846,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -763,7 +763,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -846,7 +846,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12.">Fájlok visszaállítása</button>
</form> </form>
@@ -849,7 +849,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="okrun"> <input type="hidden" name="stack_name" value="okrun">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi másolat: 2026-09-14 05:12">Fájlok visszaállítása</button>
</form> </form>
@@ -932,7 +932,7 @@
<form method="POST" action="/backup/tier2/restore" style="display:inline"> <form method="POST" action="/backup/tier2/restore" style="display:inline">
<input type="hidden" name="stack_name" value="oksucc"> <input type="hidden" name="stack_name" value="oksucc">
<button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítja a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12. Figyelem: a legutóbbi mentési kísérlet nem sikerült, ezért a visszaállított fájlok ennél régebbiek lehetnek.">Fájlok visszaállítása</button> <button type="submit" class="btn btn-xs btn-outline" data-confirm="Visszaállítod a hiányzó fájlokat a másodlagos másolatból? A meglévő fájlok NEM módosulnak és NEM törlődnek. Az alkalmazás a művelet idejére leáll. Legutóbbi sikeres másolat: 2026-09-14 05:12. Figyelem: a legutóbbi mentési kísérlet nem sikerült, ezért a visszaállított fájlok ennél régebbiek lehetnek.">Fájlok visszaállítása</button>
</form> </form>
@@ -224,7 +224,7 @@
<div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem"> <div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem">
<p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p> <p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p>
<p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozza a helyreállítási kódot.</p> <p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozod a helyreállítási kódot.</p>
<a href="/backup/escrow" class="btn btn-sm btn-primary">Helyreállítási kód létrehozása</a> <a href="/backup/escrow" class="btn btn-sm btn-primary">Helyreállítási kód létrehozása</a>
@@ -224,7 +224,7 @@
<div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem"> <div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem">
<p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p> <p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p>
<p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozza a helyreállítási kódot.</p> <p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozod a helyreállítási kódot.</p>
<p class="form-hint" style="margin:0">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.</p> <p class="form-hint" style="margin:0">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.</p>
@@ -234,7 +234,7 @@
<div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem"> <div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem">
<p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p> <p style="margin:0 0 .35rem"><strong>Helyreállítási kód szükséges</strong></p>
<p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozza a helyreállítási kódot.</p> <p class="form-hint" style="margin:0 0 .5rem">A távoli mentések csak akkor állíthatók vissza egy teljes meghibásodás után, ha létrehozod a helyreállítási kódot.</p>
<p class="form-hint" style="margin:0"> <p class="form-hint" style="margin:0">
@@ -223,7 +223,7 @@
<div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem"> <div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem">
<p class="form-hint" style="color:var(--warn);margin:0 0 .5rem">A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozzon létre új helyreállítási kódot.</p> <p class="form-hint" style="color:var(--warn);margin:0 0 .5rem">A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozz létre új helyreállítási kódot.</p>
<a href="/backup/escrow" class="btn btn-sm btn-primary">Új helyreállítási kód készítése</a> <a href="/backup/escrow" class="btn btn-sm btn-primary">Új helyreállítási kód készítése</a>
@@ -223,7 +223,7 @@
<div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem"> <div class="card" style="border-left:3px solid var(--warn);margin:.75rem 0;padding:.75rem 1rem">
<p class="form-hint" style="color:var(--warn);margin:0 0 .5rem">A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozzon létre új helyreállítási kódot.</p> <p class="form-hint" style="color:var(--warn);margin:0 0 .5rem">A letétben lévő helyreállítási csomag nem fedi a jelenlegi távoli mentési jelszót. Hozz létre új helyreállítási kódot.</p>
<p class="form-hint" style="margin:0">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.</p> <p class="form-hint" style="margin:0">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik.</p>
@@ -336,7 +336,7 @@ function onRestoreAppChange() {
typeInfo.style.display = 'none'; typeInfo.style.display = 'none';
if (!appName) { if (!appName) {
snapSel.innerHTML = '<option value="">— Válasszon alkalmazást —</option>'; snapSel.innerHTML = '<option value="">— Válassz alkalmazást —</option>';
return; return;
} }
@@ -363,7 +363,7 @@ function onRestoreAppChange() {
fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName)) fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName))
.then(function(r) { return r.json(); }) .then(function(r) { return r.json(); })
.then(function(data) { .then(function(data) {
snapSel.innerHTML = '<option value="">— Válasszon —</option>'; snapSel.innerHTML = '<option value="">— Válassz —</option>';
if (data.ok && data.data && data.data.length > 0) { if (data.ok && data.data && data.data.length > 0) {
var tier1 = data.data.filter(function(s) { return s.tier !== 2; }); var tier1 = data.data.filter(function(s) { return s.tier !== 2; });
@@ -202,7 +202,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Alkalmazás:</label> <label class="restore-label">Alkalmazás:</label>
<select id="restore-app" class="restore-select" onchange="onRestoreAppChange()"> <select id="restore-app" class="restore-select" onchange="onRestoreAppChange()">
<option value="">— Válasszon —</option> <option value="">— Válassz —</option>
<option value="immich" data-has-hdd="true" data-has-db="true" data-has-volumes="true">Immich Photos</option> <option value="immich" data-has-hdd="true" data-has-db="true" data-has-volumes="true">Immich Photos</option>
@@ -219,7 +219,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Pillanatkép:</label> <label class="restore-label">Pillanatkép:</label>
<select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()"> <select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()">
<option value="">— Válasszon alkalmazást —</option> <option value="">— Válassz alkalmazást —</option>
</select> </select>
</div> </div>
<div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem"> <div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem">
@@ -565,7 +565,7 @@ function onRestoreAppChange() {
typeInfo.style.display = 'none'; typeInfo.style.display = 'none';
if (!appName) { if (!appName) {
snapSel.innerHTML = '<option value="">— Válasszon alkalmazást —</option>'; snapSel.innerHTML = '<option value="">— Válassz alkalmazást —</option>';
return; return;
} }
@@ -592,7 +592,7 @@ function onRestoreAppChange() {
fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName)) fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName))
.then(function(r) { return r.json(); }) .then(function(r) { return r.json(); })
.then(function(data) { .then(function(data) {
snapSel.innerHTML = '<option value="">— Válasszon —</option>'; snapSel.innerHTML = '<option value="">— Válassz —</option>';
if (data.ok && data.data && data.data.length > 0) { if (data.ok && data.data && data.data.length > 0) {
var tier1 = data.data.filter(function(s) { return s.tier !== 2; }); var tier1 = data.data.filter(function(s) { return s.tier !== 2; });
@@ -193,7 +193,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Alkalmazás:</label> <label class="restore-label">Alkalmazás:</label>
<select id="restore-app" class="restore-select" onchange="onRestoreAppChange()"> <select id="restore-app" class="restore-select" onchange="onRestoreAppChange()">
<option value="">— Válasszon —</option> <option value="">— Válassz —</option>
<option value="privatebin" data-has-hdd="" data-has-db="" data-has-volumes=""></option> <option value="privatebin" data-has-hdd="" data-has-db="" data-has-volumes=""></option>
@@ -204,7 +204,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Pillanatkép:</label> <label class="restore-label">Pillanatkép:</label>
<select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()"> <select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()">
<option value="">— Válasszon alkalmazást —</option> <option value="">— Válassz alkalmazást —</option>
</select> </select>
</div> </div>
<div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem"> <div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem">
@@ -424,7 +424,7 @@ function onRestoreAppChange() {
typeInfo.style.display = 'none'; typeInfo.style.display = 'none';
if (!appName) { if (!appName) {
snapSel.innerHTML = '<option value="">— Válasszon alkalmazást —</option>'; snapSel.innerHTML = '<option value="">— Válassz alkalmazást —</option>';
return; return;
} }
@@ -451,7 +451,7 @@ function onRestoreAppChange() {
fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName)) fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName))
.then(function(r) { return r.json(); }) .then(function(r) { return r.json(); })
.then(function(data) { .then(function(data) {
snapSel.innerHTML = '<option value="">— Válasszon —</option>'; snapSel.innerHTML = '<option value="">— Válassz —</option>';
if (data.ok && data.data && data.data.length > 0) { if (data.ok && data.data && data.data.length > 0) {
var tier1 = data.data.filter(function(s) { return s.tier !== 2; }); var tier1 = data.data.filter(function(s) { return s.tier !== 2; });
@@ -193,7 +193,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Alkalmazás:</label> <label class="restore-label">Alkalmazás:</label>
<select id="restore-app" class="restore-select" onchange="onRestoreAppChange()"> <select id="restore-app" class="restore-select" onchange="onRestoreAppChange()">
<option value="">— Válasszon —</option> <option value="">— Válassz —</option>
<option value="privatebin" data-has-hdd="" data-has-db="" data-has-volumes=""></option> <option value="privatebin" data-has-hdd="" data-has-db="" data-has-volumes=""></option>
@@ -204,7 +204,7 @@
<div class="restore-form-row"> <div class="restore-form-row">
<label class="restore-label">Pillanatkép:</label> <label class="restore-label">Pillanatkép:</label>
<select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()"> <select id="restore-snapshot" class="restore-select" onchange="onRestoreConfirmChange()">
<option value="">— Válasszon alkalmazást —</option> <option value="">— Válassz alkalmazást —</option>
</select> </select>
</div> </div>
<div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem"> <div id="restore-type-info" class="restore-info" style="display:none;margin-bottom:0.5rem">
@@ -412,7 +412,7 @@ function onRestoreAppChange() {
typeInfo.style.display = 'none'; typeInfo.style.display = 'none';
if (!appName) { if (!appName) {
snapSel.innerHTML = '<option value="">— Válasszon alkalmazást —</option>'; snapSel.innerHTML = '<option value="">— Válassz alkalmazást —</option>';
return; return;
} }
@@ -439,7 +439,7 @@ function onRestoreAppChange() {
fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName)) fetch('/api/backup/snapshots?stack=' + encodeURIComponent(appName))
.then(function(r) { return r.json(); }) .then(function(r) { return r.json(); })
.then(function(data) { .then(function(data) {
snapSel.innerHTML = '<option value="">— Válasszon —</option>'; snapSel.innerHTML = '<option value="">— Válassz —</option>';
if (data.ok && data.data && data.data.length > 0) { if (data.ok && data.data && data.data.length > 0) {
var tier1 = data.data.filter(function(s) { return s.tier !== 2; }); var tier1 = data.data.filter(function(s) { return s.tier !== 2; });
@@ -379,7 +379,7 @@
<span class="tag tag-warn" title="Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat egy másik tárhelyre."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hiányzó tárhely: HDD egy</span> <span class="tag tag-warn" title="Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat egy másik tárhelyre."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hiányzó tárhely: HDD egy</span>
<span class="tag tag-warn" title="Az alkalmazás egyik folyamatát a rendszer leállította, mert elfogyott a memóriája. Lehet, hogy egy feladat nem fejeződött be. Indítsd újra az alkalmazást; ha ismétlődik, jelezd az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Memória elfogyott</span> <span class="tag tag-warn" title="Az alkalmazás egyik folyamatát a rendszer leállította, mert elfogyott a memóriája. Lehet, hogy egy feladat nem fejeződött be. Indítsd újra az alkalmazást; ha ismétlődik, jelezd az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Memória elfogyott</span>
<span class="tag tag-warn" title="Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezze az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja</span> <span class="tag tag-warn" title="Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezd az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja</span>
<span class="tag tag-warn" title="A hálózati tárhely (NAS) jelenleg nem érhető el. Az alkalmazás fut; az adatok elérése a NAS visszatértével helyreáll."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely nem elérhető: NAS egy</span> <span class="tag tag-warn" title="A hálózati tárhely (NAS) jelenleg nem érhető el. Az alkalmazás fut; az adatok elérése a NAS visszatértével helyreáll."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely nem elérhető: NAS egy</span>
<span class="tag tag-warn" title="A proxy (Traefik) csak egészséges konténerhez publikál nyilvános útvonalat. Amíg az alkalmazás nem egészséges, az URL 404-et ad, pedig a konténer fut."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>URL nem elérhető</span> <span class="tag tag-warn" title="A proxy (Traefik) csak egészséges konténerhez publikál nyilvános útvonalat. Amíg az alkalmazás nem egészséges, az URL 404-et ad, pedig a konténer fut."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>URL nem elérhető</span>
+3 -3
View File
@@ -327,7 +327,7 @@
<p style="color:var(--crit);font-weight:600">Vészhelyzet szimuláció</p> <p style="color:var(--crit);font-weight:600">Vészhelyzet szimuláció</p>
<p class="text-muted" style="font-size:.85rem;margin-bottom:.5rem">Ez törli az ügyfél azonosítót és újraindítja a controllert setup módba. A konfigurációs fájlok megmaradnak a meghajtókon.</p> <p class="text-muted" style="font-size:.85rem;margin-bottom:.5rem">Ez törli az ügyfél azonosítót és újraindítja a controllert setup módba. A konfigurációs fájlok megmaradnak a meghajtókon.</p>
<div class="debug-form-row"> <div class="debug-form-row">
<label>Írja be "RESET" a megerősítéshez:</label> <label>Írd be "RESET" a megerősítéshez:</label>
<input type="text" id="dr-confirm-input" class="form-control debug-confirm-input" placeholder="RESET" autocomplete="off"> <input type="text" id="dr-confirm-input" class="form-control debug-confirm-input" placeholder="RESET" autocomplete="off">
<button class="btn btn-danger btn-sm" id="btn-dr-trigger" data-label="Újraindítás setup módban" onclick="triggerDR()">Újraindítás setup módban</button> <button class="btn btn-danger btn-sm" id="btn-dr-trigger" data-label="Újraindítás setup módban" onclick="triggerDR()">Újraindítás setup módban</button>
<span class="debug-result" id="btn-dr-trigger-result"></span> <span class="debug-result" id="btn-dr-trigger-result"></span>
@@ -624,11 +624,11 @@ function triggerDR() {
if (input.value !== 'RESET') { if (input.value !== 'RESET') {
var result = document.getElementById('btn-dr-trigger-result'); var result = document.getElementById('btn-dr-trigger-result');
result.className = 'debug-result debug-result-error'; result.className = 'debug-result debug-result-error';
result.textContent = 'Írja be: RESET'; result.textContent = 'Írd be: RESET';
return; return;
} }
var btn = document.getElementById('btn-dr-trigger'); var btn = document.getElementById('btn-dr-trigger');
felhomConfirm(btn, 'FIGYELEM! Ez újraindítja a controllert setup módba. Biztosan folytatja?', function () { felhomConfirm(btn, 'FIGYELEM! Ez újraindítja a controllert setup módba. Biztosan folytatod?', function () {
var result = document.getElementById('btn-dr-trigger-result'); var result = document.getElementById('btn-dr-trigger-result');
btn.disabled = true; btn.disabled = true;
btn.textContent = 'Folyamatban...'; btn.textContent = 'Folyamatban...';
@@ -1207,7 +1207,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -1210,7 +1210,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -623,7 +623,7 @@
<div class="alert alert-warning" style="margin-bottom:1rem"> <div class="alert alert-warning" style="margin-bottom:1rem">
<svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> Nincs elég szabad tárhely a telepítéshez. Jelenleg 1 GB szabad, és a rendszer <svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> Nincs elég szabad tárhely a telepítéshez. Jelenleg 1 GB szabad, és a rendszer
5 GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében. 5 GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében.
A telepítés ezért átmenetileg le van tiltva — szabadítson fel helyet, vagy bővítse a tárhelyet. A telepítés ezért átmenetileg le van tiltva — szabadíts fel helyet, vagy bővítsd a tárhelyet.
</div> </div>
@@ -778,7 +778,7 @@
placeholder="/mnt/valahol" placeholder="/mnt/valahol"
required required
disabled> disabled>
<span class="form-hint" style="color:var(--warn)">Nincs regisztrált adattároló — adja meg kézzel az útvonalat</span> <span class="form-hint" style="color:var(--warn)">Nincs regisztrált adattároló — add meg kézzel az útvonalat</span>
@@ -1137,7 +1137,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -636,7 +636,7 @@
<div class="form-section"> <div class="form-section">
<h4>Automatikusan generált értékek</h4> <h4>Automatikusan generált értékek</h4>
<p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezze fel a szükséges jelszavakat!</p> <p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezd fel a szükséges jelszavakat!</p>
@@ -1189,7 +1189,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -606,14 +606,14 @@
<div class="alert alert-warning" style="margin-bottom:1rem"> <div class="alert alert-warning" style="margin-bottom:1rem">
<svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> Nincs elég szabad tárhely a telepítéshez. Jelenleg 1 GB szabad, és a rendszer <svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> Nincs elég szabad tárhely a telepítéshez. Jelenleg 1 GB szabad, és a rendszer
5 GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében. 5 GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében.
A telepítés ezért átmenetileg le van tiltva — szabadítson fel helyet, vagy bővítse a tárhelyet. A telepítés ezért átmenetileg le van tiltva — szabadíts fel helyet, vagy bővítsd a tárhelyet.
</div> </div>
<div class="form-section"> <div class="form-section">
<h4>Automatikusan generált értékek</h4> <h4>Automatikusan generált értékek</h4>
<p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezze fel a szükséges jelszavakat!</p> <p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezd fel a szükséges jelszavakat!</p>
@@ -774,7 +774,7 @@
placeholder="/mnt/valahol" placeholder="/mnt/valahol"
required required
> >
<span class="form-hint" style="color:var(--warn)">Nincs regisztrált adattároló — adja meg kézzel az útvonalat</span> <span class="form-hint" style="color:var(--warn)">Nincs regisztrált adattároló — add meg kézzel az útvonalat</span>
@@ -1138,7 +1138,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -613,7 +613,7 @@
<div class="form-section"> <div class="form-section">
<h4>Automatikusan generált értékek</h4> <h4>Automatikusan generált értékek</h4>
<p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezze fel a szükséges jelszavakat!</p> <p class="form-section-desc">Ezek az értékek a telepítéssel együtt mentésre kerülnek. Jegyezd fel a szükséges jelszavakat!</p>
@@ -1168,7 +1168,7 @@ document.getElementById('deploy-form').addEventListener('submit', async function
for (const pf of passwordFields) { for (const pf of passwordFields) {
if (!pf.disabled && pf.value.trim() === '') { if (!pf.disabled && pf.value.trim() === '') {
const label = pf.closest('.form-group').querySelector('label').textContent.trim(); const label = pf.closest('.form-group').querySelector('label').textContent.trim();
showAlert('Kötelező mező: ' + label + '\nHasználja a Generálás gombot vagy írjon be egy jelszót.'); showAlert('Kötelező mező: ' + label + '\nHasználd a Generálás gombot vagy írj be egy jelszót.');
pf.focus(); pf.focus();
return; return;
} }
@@ -178,7 +178,7 @@
</div> </div>
<div class="alert alert-info">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik. Próbálja újra később.</div> <div class="alert alert-info">A funkcióhoz az ügynök frissítése szükséges — a frissítés automatikusan megérkezik. Próbáld újra később.</div>
</main> </main>
@@ -181,7 +181,7 @@
<div class="form-group"> <div class="form-group">
<label for="current_password">Jelenlegi jelszó</label> <label for="current_password">Jelenlegi jelszó</label>
<input type="password" id="current_password" name="current_password" required <input type="password" id="current_password" name="current_password" required
placeholder="Adja meg a jelenlegi jelszavát" class="form-control"> placeholder="Add meg a jelenlegi jelszavad" class="form-control">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="new_password">Új jelszó</label> <label for="new_password">Új jelszó</label>
@@ -346,7 +346,7 @@ function openDialog(opts){
window.removeCountry = function(code) { window.removeCountry = function(code) {
if (code === 'HU') { if (code === 'HU') {
openDialog({title:'Figyelem', confirmLabel:'Eltávolítás', openDialog({title:'Figyelem', confirmLabel:'Eltávolítás',
message:'Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatja?', message:'Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatod?',
onConfirm:function(){ doRemoveCountry(code); }}); onConfirm:function(){ doRemoveCountry(code); }});
return; return;
} }
@@ -405,7 +405,7 @@ function openDialog(opts){
if (idx >= 0) { if (idx >= 0) {
if (code === 'HU') { if (code === 'HU') {
openDialog({title:'Figyelem', confirmLabel:'Eltávolítás', openDialog({title:'Figyelem', confirmLabel:'Eltávolítás',
message:'Magyarország eltávolítása nem ajánlott. Folytatja?', message:'Magyarország eltávolítása nem ajánlott. Folytatod?',
onConfirm:function(){ ov.allowed_countries.splice(ov.allowed_countries.indexOf(code), 1); }, onConfirm:function(){ ov.allowed_countries.splice(ov.allowed_countries.indexOf(code), 1); },
onCancel:function(){ el.checked = true; }}); onCancel:function(){ el.checked = true; }});
return; return;
@@ -624,7 +624,7 @@ function openDialog(opts){
<div class="settings-card"> <div class="settings-card">
<h3>Vészhelyzeti információk</h3> <h3>Vészhelyzeti információk</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Ezeket az adatokat mentse el biztos helyre. Újratelepítés esetén szükség lesz rájuk a rendszer visszaállításához. Ezeket az adatokat mentsd el biztos helyre. Újratelepítés esetén szükség lesz rájuk a rendszer visszaállításához.
</p> </p>
<div class="settings-grid"> <div class="settings-grid">
<div class="settings-row"> <div class="settings-row">
@@ -277,7 +277,7 @@ function openDialog(opts){
window.removeCountry = function(code) { window.removeCountry = function(code) {
if (code === 'HU') { if (code === 'HU') {
openDialog({title:'Figyelem', confirmLabel:'Eltávolítás', openDialog({title:'Figyelem', confirmLabel:'Eltávolítás',
message:'Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatja?', message:'Figyelem: Magyarország eltávolítása azt jelenti, hogy magyar IP-ről sem lesz elérhető a rendszer távolról. Biztosan folytatod?',
onConfirm:function(){ doRemoveCountry(code); }}); onConfirm:function(){ doRemoveCountry(code); }});
return; return;
} }
@@ -336,7 +336,7 @@ function openDialog(opts){
if (idx >= 0) { if (idx >= 0) {
if (code === 'HU') { if (code === 'HU') {
openDialog({title:'Figyelem', confirmLabel:'Eltávolítás', openDialog({title:'Figyelem', confirmLabel:'Eltávolítás',
message:'Magyarország eltávolítása nem ajánlott. Folytatja?', message:'Magyarország eltávolítása nem ajánlott. Folytatod?',
onConfirm:function(){ ov.allowed_countries.splice(ov.allowed_countries.indexOf(code), 1); }, onConfirm:function(){ ov.allowed_countries.splice(ov.allowed_countries.indexOf(code), 1); },
onCancel:function(){ el.checked = true; }}); onCancel:function(){ el.checked = true; }});
return; return;
@@ -465,8 +465,8 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Vezérlő újraindítása</h3> <h3>Vezérlő újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatja — nem kell az egész szervert újraindítani. Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatod — nem kell az egész szervert újraindítani.
Az alkalmazásai futnak tovább; csak a vezérlő indul újra (néhány másodperc). Az alkalmazásaid futnak tovább; csak a vezérlő indul újra (néhány másodperc).
</p> </p>
<div id="restart-status"></div> <div id="restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button>
@@ -476,7 +476,7 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Kiszolgáló újraindítása</h3> <h3>Kiszolgáló újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használja, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő. Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használd, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.
</p> </p>
<div id="server-restart-status"></div> <div id="server-restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button>
@@ -485,7 +485,7 @@ function pollUntilBack() {
<script> <script>
function restartController() { function restartController() {
openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.', message:'Biztosan újraindítod a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.',
onConfirm:doRestartController}); onConfirm:doRestartController});
} }
function doRestartController() { function doRestartController() {
@@ -499,7 +499,7 @@ function doRestartController() {
} }
function restartServer() { function restartServer() {
openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.', message:'Biztosan újraindítod a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.',
onConfirm:doRestartServer}); onConfirm:doRestartServer});
} }
function doRestartServer() { function doRestartServer() {
@@ -514,7 +514,7 @@ function doRestartServer() {
function pollRestart(attempt) { function pollRestart(attempt) {
if (attempt > 60) { if (attempt > 60) {
document.getElementById('restart-status').innerHTML = document.getElementById('restart-status').innerHTML =
'<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltse újra az oldalt kézzel.</div>'; '<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltsd újra az oldalt kézzel.</div>';
return; return;
} }
setTimeout(function(){ setTimeout(function(){
@@ -529,8 +529,8 @@ pollUntilBack();
<div class="settings-card"> <div class="settings-card">
<h3>Vezérlő újraindítása</h3> <h3>Vezérlő újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatja — nem kell az egész szervert újraindítani. Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatod — nem kell az egész szervert újraindítani.
Az alkalmazásai futnak tovább; csak a vezérlő indul újra (néhány másodperc). Az alkalmazásaid futnak tovább; csak a vezérlő indul újra (néhány másodperc).
</p> </p>
<div id="restart-status"></div> <div id="restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button>
@@ -540,7 +540,7 @@ pollUntilBack();
<div class="settings-card"> <div class="settings-card">
<h3>Kiszolgáló újraindítása</h3> <h3>Kiszolgáló újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használja, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő. Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használd, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.
</p> </p>
<div id="server-restart-status"></div> <div id="server-restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button>
@@ -549,7 +549,7 @@ pollUntilBack();
<script> <script>
function restartController() { function restartController() {
openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.', message:'Biztosan újraindítod a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.',
onConfirm:doRestartController}); onConfirm:doRestartController});
} }
function doRestartController() { function doRestartController() {
@@ -563,7 +563,7 @@ function doRestartController() {
} }
function restartServer() { function restartServer() {
openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.', message:'Biztosan újraindítod a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.',
onConfirm:doRestartServer}); onConfirm:doRestartServer});
} }
function doRestartServer() { function doRestartServer() {
@@ -578,7 +578,7 @@ function doRestartServer() {
function pollRestart(attempt) { function pollRestart(attempt) {
if (attempt > 60) { if (attempt > 60) {
document.getElementById('restart-status').innerHTML = document.getElementById('restart-status').innerHTML =
'<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltse újra az oldalt kézzel.</div>'; '<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltsd újra az oldalt kézzel.</div>';
return; return;
} }
setTimeout(function(){ setTimeout(function(){
@@ -414,8 +414,8 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Vezérlő újraindítása</h3> <h3>Vezérlő újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatja — nem kell az egész szervert újraindítani. Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatod — nem kell az egész szervert újraindítani.
Az alkalmazásai futnak tovább; csak a vezérlő indul újra (néhány másodperc). Az alkalmazásaid futnak tovább; csak a vezérlő indul újra (néhány másodperc).
</p> </p>
<div id="restart-status"></div> <div id="restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button>
@@ -425,7 +425,7 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Kiszolgáló újraindítása</h3> <h3>Kiszolgáló újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használja, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő. Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használd, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.
</p> </p>
<div id="server-restart-status"></div> <div id="server-restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button>
@@ -434,7 +434,7 @@ function pollUntilBack() {
<script> <script>
function restartController() { function restartController() {
openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.', message:'Biztosan újraindítod a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.',
onConfirm:doRestartController}); onConfirm:doRestartController});
} }
function doRestartController() { function doRestartController() {
@@ -448,7 +448,7 @@ function doRestartController() {
} }
function restartServer() { function restartServer() {
openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.', message:'Biztosan újraindítod a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.',
onConfirm:doRestartServer}); onConfirm:doRestartServer});
} }
function doRestartServer() { function doRestartServer() {
@@ -463,7 +463,7 @@ function doRestartServer() {
function pollRestart(attempt) { function pollRestart(attempt) {
if (attempt > 60) { if (attempt > 60) {
document.getElementById('restart-status').innerHTML = document.getElementById('restart-status').innerHTML =
'<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltse újra az oldalt kézzel.</div>'; '<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltsd újra az oldalt kézzel.</div>';
return; return;
} }
setTimeout(function(){ setTimeout(function(){
@@ -455,8 +455,8 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Vezérlő újraindítása</h3> <h3>Vezérlő újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatja — nem kell az egész szervert újraindítani. Ha a vezérlő hibásan működik, itt biztonságosan újraindíthatod — nem kell az egész szervert újraindítani.
Az alkalmazásai futnak tovább; csak a vezérlő indul újra (néhány másodperc). Az alkalmazásaid futnak tovább; csak a vezérlő indul újra (néhány másodperc).
</p> </p>
<div id="restart-status"></div> <div id="restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-controller" onclick="restartController()">Vezérlő újraindítása</button>
@@ -466,7 +466,7 @@ function pollUntilBack() {
<div class="settings-card"> <div class="settings-card">
<h3>Kiszolgáló újraindítása</h3> <h3>Kiszolgáló újraindítása</h3>
<p class="settings-card-desc"> <p class="settings-card-desc">
Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használja, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő. Az egész kiszolgáló (szerver) újraindítása. Minden alkalmazás rövid időre leáll, és a vezérlőpult kb. 30 másodpercig nem elérhető. Akkor használd, ha a teljes rendszer újraindítására van szükség — egyébként a fenti „Vezérlő újraindítása” elegendő.
</p> </p>
<div id="server-restart-status"></div> <div id="server-restart-status"></div>
<button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button> <button type="button" class="btn btn-outline" id="btn-restart-server" onclick="restartServer()">Kiszolgáló újraindítása</button>
@@ -475,7 +475,7 @@ function pollUntilBack() {
<script> <script>
function restartController() { function restartController() {
openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Vezérlő újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.', message:'Biztosan újraindítod a vezérlőt? A művelet néhány másodpercig tart, és a felület rövid időre elérhetetlen lesz.',
onConfirm:doRestartController}); onConfirm:doRestartController});
} }
function doRestartController() { function doRestartController() {
@@ -489,7 +489,7 @@ function doRestartController() {
} }
function restartServer() { function restartServer() {
openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás', openDialog({title:'Kiszolgáló újraindítása', confirmLabel:'Újraindítás',
message:'Biztosan újraindítja a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.', message:'Biztosan újraindítod a kiszolgálót? Az alkalmazások és a vezérlőpult kb. 30 másodpercre elérhetetlenné válnak.',
onConfirm:doRestartServer}); onConfirm:doRestartServer});
} }
function doRestartServer() { function doRestartServer() {
@@ -504,7 +504,7 @@ function doRestartServer() {
function pollRestart(attempt) { function pollRestart(attempt) {
if (attempt > 60) { if (attempt > 60) {
document.getElementById('restart-status').innerHTML = document.getElementById('restart-status').innerHTML =
'<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltse újra az oldalt kézzel.</div>'; '<div class="alert alert-error">Az újraindítás a vártnál tovább tart. Töltsd újra az oldalt kézzel.</div>';
return; return;
} }
setTimeout(function(){ setTimeout(function(){
@@ -518,7 +518,7 @@
<span class="tag tag-warn" title="Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hiányzó tárhely: HDD egy</span> <span class="tag tag-warn" title="Az alkalmazás adattárolója nem elérhető. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hiányzó tárhely: HDD egy</span>
<span class="tag tag-warn" title="Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezze az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja</span> <span class="tag tag-warn" title="Az alkalmazás környezetében a hálózati tárhely helyén üres helyi könyvtár van — az adatok nem a NAS-ra kerülnek. Jelezd az üzemeltetőnek."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja</span>
<span class="tag tag-warn" title="A hálózati tárhely (NAS) jelenleg nem érhető el. Az alkalmazás fut; az adatok elérése a NAS visszatértével helyreáll."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely nem elérhető: NAS egy</span> <span class="tag tag-warn" title="A hálózati tárhely (NAS) jelenleg nem érhető el. Az alkalmazás fut; az adatok elérése a NAS visszatértével helyreáll."><svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg>Hálózati tárhely nem elérhető: NAS egy</span>
</div> </div>
@@ -236,7 +236,7 @@ async function loadDisks(){
var r = await fetch('/api/disks/candidates'); var j = await r.json(); var r = await fetch('/api/disks/candidates'); var j = await r.json();
if(!j.ok){ throw new Error(j.error||'Hiba'); } if(!j.ok){ throw new Error(j.error||'Hiba'); }
var cands = (j.data&&j.data.attach)||[]; var cands = (j.data&&j.data.attach)||[];
if(cands.length===0){ document.getElementById('disk-list').innerHTML='<p class="form-hint">Nincs csatolható meghajtó — a csatoláshoz olyan (még nem használt) meghajtó kell, amelyen már van fájlrendszer. Új, üres meghajtóhoz használja az „Inicializálás” lehetőséget.</p>'; return; } if(cands.length===0){ document.getElementById('disk-list').innerHTML='<p class="form-hint">Nincs csatolható meghajtó — a csatoláshoz olyan (még nem használt) meghajtó kell, amelyen már van fájlrendszer. Új, üres meghajtóhoz használd az „Inicializálás” lehetőséget.</p>'; return; }
var html='<div class="drive-list">'; var html='<div class="drive-list">';
cands.forEach(function(d,i){ cands.forEach(function(d,i){
var title = d.model ? esc(d.model) : esc(d.device); var title = d.model ? esc(d.model) : esc(d.device);
@@ -412,7 +412,7 @@ window.__registeredPaths=[];
+'<div class="alert alert-warning">'+esc(opts.danger)+'</div>' +'<div class="alert alert-warning">'+esc(opts.danger)+'</div>'
+appsHtml +appsHtml
+copiesHtml +copiesHtml
+'<div class="confirm-input"><label>Megerősítéshez írja be a csatlakoztatási nevet: <strong class="mono">'+esc(opts.mountName)+'</strong></label>' +'<div class="confirm-input"><label>Megerősítéshez írd be a csatlakoztatási nevet: <strong class="mono">'+esc(opts.mountName)+'</strong></label>'
+'<input type="text" id="confirm-type" class="form-control" autocomplete="off" placeholder="'+esc(opts.mountName)+'" oninput="document.getElementById(\'confirm-go\').disabled=(this.value!==\''+esc(opts.mountName)+'\')"></div>' +'<input type="text" id="confirm-type" class="form-control" autocomplete="off" placeholder="'+esc(opts.mountName)+'" oninput="document.getElementById(\'confirm-go\').disabled=(this.value!==\''+esc(opts.mountName)+'\')"></div>'
+'<div class="form-actions"><button id="confirm-go" class="btn btn-danger-outline" disabled>Megerősítés</button>' +'<div class="form-actions"><button id="confirm-go" class="btn btn-danger-outline" disabled>Megerősítés</button>'
+'<button class="btn btn-outline" onclick="__closeConfirm()">Mégsem</button></div>' +'<button class="btn btn-outline" onclick="__closeConfirm()">Mégsem</button></div>'
@@ -434,7 +434,7 @@ window.__registeredPaths=[];
var name=where.split('/').filter(Boolean).pop()||where; var name=where.split('/').filter(Boolean).pop()||where;
openConfirm({title:'Meghajtó leválasztása', mount:where, mountName:name, openConfirm({title:'Meghajtó leválasztása', mount:where, mountName:name,
danger:'A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolja.', danger:'A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolod.',
onConfirm:async function(){ onConfirm:async function(){
var out=document.getElementById('confirm-result'); out.innerHTML='<p class="form-hint">Leválasztás folyamatban…</p>'; var out=document.getElementById('confirm-result'); out.innerHTML='<p class="form-hint">Leválasztás folyamatban…</p>';
try{ try{
@@ -500,7 +500,7 @@ function openDialog(opts){
+'<h3>'+escText(opts.title||'Megerősítés')+'</h3>' +'<h3>'+escText(opts.title||'Megerősítés')+'</h3>'
+'<p style="white-space:pre-line">'+escText(opts.message||'')+'</p>'; +'<p style="white-space:pre-line">'+escText(opts.message||'')+'</p>';
if(typeGate){ if(typeGate){
html+='<div class="confirm-input"><label>Megerősítéshez írja be: <strong class="mono">'+escText(typeGate)+'</strong></label>' html+='<div class="confirm-input"><label>Megerősítéshez írd be: <strong class="mono">'+escText(typeGate)+'</strong></label>'
+'<input type="text" id="dialog-type" class="form-control" autocomplete="off" placeholder="'+escText(typeGate)+'"></div>'; +'<input type="text" id="dialog-type" class="form-control" autocomplete="off" placeholder="'+escText(typeGate)+'"></div>';
} }
html+='<div class="form-actions"><button id="dialog-go" class="btn '+(typeGate?'btn-danger-outline':'btn-primary')+'"'+(typeGate?' disabled':'')+'>'+escText(opts.confirmLabel||'Megerősítés')+'</button>' html+='<div class="form-actions"><button id="dialog-go" class="btn '+(typeGate?'btn-danger-outline':'btn-primary')+'"'+(typeGate?' disabled':'')+'>'+escText(opts.confirmLabel||'Megerősítés')+'</button>'
@@ -535,7 +535,7 @@ function editStorageLabel(path, currentLabel) {
wrap.querySelector('input[name=storage_label]').focus(); wrap.querySelector('input[name=storage_label]').focus();
} }
function storageDisconnect(path, label, appCount) { function storageDisconnect(path, label, appCount) {
var msg = 'Biztos leválasztja a meghajtót: ' + label + '?'; var msg = 'Biztosan leválasztod a meghajtót: ' + label + '?';
if (appCount > 0) msg += '\n\nA rajta futó ' + appCount + ' alkalmazás le fog állni.'; if (appCount > 0) msg += '\n\nA rajta futó ' + appCount + ' alkalmazás le fog állni.';
msg += '\n\nA meghajtó ezután biztonságosan eltávolítható.'; msg += '\n\nA meghajtó ezután biztonságosan eltávolítható.';
openDialog({title:'Meghajtó leválasztása', message:msg, confirmLabel:'Leválasztás', onConfirm:function(){ doStorageDisconnect(path); }}); openDialog({title:'Meghajtó leválasztása', message:msg, confirmLabel:'Leválasztás', onConfirm:function(){ doStorageDisconnect(path); }});
@@ -600,7 +600,7 @@ function storageDecommission(path, label, appCount) {
} else { } else {
var name = path.split('/').pop(); var name = path.split('/').pop();
openDialog({title:'Meghajtó leszerelése', confirmLabel:'Leszerelés', typeToConfirm:name, openDialog({title:'Meghajtó leszerelése', confirmLabel:'Leszerelés', typeToConfirm:name,
message:'A(z) ' + label + ' leszereléséhez (áthelyezés nélkül) írja be a meghajtó nevét megerősítésként.' + message:'A(z) ' + label + ' leszereléséhez (áthelyezés nélkül) írd be a meghajtó nevét megerősítésként.' +
(appCount > 0 ? '\n\nFIGYELEM: ' + appCount + ' alkalmazás leáll (az adatok megmaradnak).' : ''), (appCount > 0 ? '\n\nFIGYELEM: ' + appCount + ' alkalmazás leáll (az adatok megmaradnak).' : ''),
onConfirm:function(){ doStorageDecommission({where: path, mode: 'anyway', mount_name: name}); }}); onConfirm:function(){ doStorageDecommission({where: path, mode: 'anyway', mount_name: name}); }});
} }
@@ -619,7 +619,7 @@ function doStorageDecommission(body) {
function storageReEnroll(path, label) { function storageReEnroll(path, label) {
openDialog({title:'Visszacsatlakoztatás', confirmLabel:'Visszacsatlakoztatás', openDialog({title:'Visszacsatlakoztatás', confirmLabel:'Visszacsatlakoztatás',
message:'Visszacsatlakoztatja a(z) ' + label + ' meghajtót?\n\nAz adatok érintetlenek; a leállított alkalmazások újraindulnak.', message:'Visszacsatlakoztatod a(z) ' + label + ' meghajtót?\n\nAz adatok érintetlenek; a leállított alkalmazások újraindulnak.',
onConfirm:function(){ doStorageReEnroll(path); }}); onConfirm:function(){ doStorageReEnroll(path); }});
} }
function doStorageReEnroll(path) { function doStorageReEnroll(path) {
@@ -238,7 +238,7 @@
<div class="storage-path-actions"> <div class="storage-path-actions">
<button class="btn btn-xs btn-primary" onclick="storageReEnroll('\/mnt\/old','Régi lemez kettő')">Visszacsatlakoztatás</button> <button class="btn btn-xs btn-primary" onclick="storageReEnroll('\/mnt\/old','Régi lemez kettő')">Visszacsatlakoztatás</button>
<form method="POST" action="/settings/storage/remove" style="display:inline" <form method="POST" action="/settings/storage/remove" style="display:inline"
onsubmit="return storageRemoveDialog(event, this, 'Biztosan eltávolítja a(z) Régi lemez kettő (\/mnt\/old) meghajtót a rendszerből?\n\nA meghajtó adatai NEM törlődnek.')"> onsubmit="return storageRemoveDialog(event, this, 'Biztosan eltávolítod a(z) Régi lemez kettő (\/mnt\/old) meghajtót a rendszerből?\n\nA meghajtó adatai NEM törlődnek.')">
<input type="hidden" name="storage_path" value="/mnt/old"> <input type="hidden" name="storage_path" value="/mnt/old">
<button type="submit" class="btn btn-xs btn-outline">Eltávolítás a rendszerből</button> <button type="submit" class="btn btn-xs btn-outline">Eltávolítás a rendszerből</button>
@@ -405,7 +405,7 @@
<form method="POST" action="/settings/storage/remove" style="display:inline" <form method="POST" action="/settings/storage/remove" style="display:inline"
onsubmit="return storageRemoveDialog(event, this, 'Biztosan eltávolítja a(z) \/mnt\/hdd2 adattárolót?')"> onsubmit="return storageRemoveDialog(event, this, 'Biztosan eltávolítod a(z) \/mnt\/hdd2 adattárolót?')">
<input type="hidden" name="storage_path" value="/mnt/hdd2"> <input type="hidden" name="storage_path" value="/mnt/hdd2">
<button type="submit" class="btn btn-xs btn-danger-outline" title="Csak a nyilvántartásból törli a meghajtót — az adatok és a fájlrendszer érintetlenül maradnak.">Eltávolítás a listából</button> <button type="submit" class="btn btn-xs btn-danger-outline" title="Csak a nyilvántartásból törli a meghajtót — az adatok és a fájlrendszer érintetlenül maradnak.">Eltávolítás a listából</button>
@@ -712,7 +712,7 @@ window.__registeredPaths=["\/mnt\/usb1","\/mnt\/old","\/mnt\/hdd1","\/mnt\/hdd2"
+'<div class="alert alert-warning">'+esc(opts.danger)+'</div>' +'<div class="alert alert-warning">'+esc(opts.danger)+'</div>'
+appsHtml +appsHtml
+copiesHtml +copiesHtml
+'<div class="confirm-input"><label>Megerősítéshez írja be a csatlakoztatási nevet: <strong class="mono">'+esc(opts.mountName)+'</strong></label>' +'<div class="confirm-input"><label>Megerősítéshez írd be a csatlakoztatási nevet: <strong class="mono">'+esc(opts.mountName)+'</strong></label>'
+'<input type="text" id="confirm-type" class="form-control" autocomplete="off" placeholder="'+esc(opts.mountName)+'" oninput="document.getElementById(\'confirm-go\').disabled=(this.value!==\''+esc(opts.mountName)+'\')"></div>' +'<input type="text" id="confirm-type" class="form-control" autocomplete="off" placeholder="'+esc(opts.mountName)+'" oninput="document.getElementById(\'confirm-go\').disabled=(this.value!==\''+esc(opts.mountName)+'\')"></div>'
+'<div class="form-actions"><button id="confirm-go" class="btn btn-danger-outline" disabled>Megerősítés</button>' +'<div class="form-actions"><button id="confirm-go" class="btn btn-danger-outline" disabled>Megerősítés</button>'
+'<button class="btn btn-outline" onclick="__closeConfirm()">Mégsem</button></div>' +'<button class="btn btn-outline" onclick="__closeConfirm()">Mégsem</button></div>'
@@ -734,7 +734,7 @@ window.__registeredPaths=["\/mnt\/usb1","\/mnt\/old","\/mnt\/hdd1","\/mnt\/hdd2"
var name=where.split('/').filter(Boolean).pop()||where; var name=where.split('/').filter(Boolean).pop()||where;
openConfirm({title:'Meghajtó leválasztása', mount:where, mountName:name, openConfirm({title:'Meghajtó leválasztása', mount:where, mountName:name,
danger:'A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolja.', danger:'A meghajtó leválasztásra kerül. Az adatok megmaradnak, de az ott tárolt alkalmazások elvesztik a tárhelyüket, amíg újra nem csatolod.',
onConfirm:async function(){ onConfirm:async function(){
var out=document.getElementById('confirm-result'); out.innerHTML='<p class="form-hint">Leválasztás folyamatban…</p>'; var out=document.getElementById('confirm-result'); out.innerHTML='<p class="form-hint">Leválasztás folyamatban…</p>';
try{ try{
@@ -800,7 +800,7 @@ function openDialog(opts){
+'<h3>'+escText(opts.title||'Megerősítés')+'</h3>' +'<h3>'+escText(opts.title||'Megerősítés')+'</h3>'
+'<p style="white-space:pre-line">'+escText(opts.message||'')+'</p>'; +'<p style="white-space:pre-line">'+escText(opts.message||'')+'</p>';
if(typeGate){ if(typeGate){
html+='<div class="confirm-input"><label>Megerősítéshez írja be: <strong class="mono">'+escText(typeGate)+'</strong></label>' html+='<div class="confirm-input"><label>Megerősítéshez írd be: <strong class="mono">'+escText(typeGate)+'</strong></label>'
+'<input type="text" id="dialog-type" class="form-control" autocomplete="off" placeholder="'+escText(typeGate)+'"></div>'; +'<input type="text" id="dialog-type" class="form-control" autocomplete="off" placeholder="'+escText(typeGate)+'"></div>';
} }
html+='<div class="form-actions"><button id="dialog-go" class="btn '+(typeGate?'btn-danger-outline':'btn-primary')+'"'+(typeGate?' disabled':'')+'>'+escText(opts.confirmLabel||'Megerősítés')+'</button>' html+='<div class="form-actions"><button id="dialog-go" class="btn '+(typeGate?'btn-danger-outline':'btn-primary')+'"'+(typeGate?' disabled':'')+'>'+escText(opts.confirmLabel||'Megerősítés')+'</button>'
@@ -835,7 +835,7 @@ function editStorageLabel(path, currentLabel) {
wrap.querySelector('input[name=storage_label]').focus(); wrap.querySelector('input[name=storage_label]').focus();
} }
function storageDisconnect(path, label, appCount) { function storageDisconnect(path, label, appCount) {
var msg = 'Biztos leválasztja a meghajtót: ' + label + '?'; var msg = 'Biztosan leválasztod a meghajtót: ' + label + '?';
if (appCount > 0) msg += '\n\nA rajta futó ' + appCount + ' alkalmazás le fog állni.'; if (appCount > 0) msg += '\n\nA rajta futó ' + appCount + ' alkalmazás le fog állni.';
msg += '\n\nA meghajtó ezután biztonságosan eltávolítható.'; msg += '\n\nA meghajtó ezután biztonságosan eltávolítható.';
openDialog({title:'Meghajtó leválasztása', message:msg, confirmLabel:'Leválasztás', onConfirm:function(){ doStorageDisconnect(path); }}); openDialog({title:'Meghajtó leválasztása', message:msg, confirmLabel:'Leválasztás', onConfirm:function(){ doStorageDisconnect(path); }});
@@ -900,7 +900,7 @@ function storageDecommission(path, label, appCount) {
} else { } else {
var name = path.split('/').pop(); var name = path.split('/').pop();
openDialog({title:'Meghajtó leszerelése', confirmLabel:'Leszerelés', typeToConfirm:name, openDialog({title:'Meghajtó leszerelése', confirmLabel:'Leszerelés', typeToConfirm:name,
message:'A(z) ' + label + ' leszereléséhez (áthelyezés nélkül) írja be a meghajtó nevét megerősítésként.' + message:'A(z) ' + label + ' leszereléséhez (áthelyezés nélkül) írd be a meghajtó nevét megerősítésként.' +
(appCount > 0 ? '\n\nFIGYELEM: ' + appCount + ' alkalmazás leáll (az adatok megmaradnak).' : ''), (appCount > 0 ? '\n\nFIGYELEM: ' + appCount + ' alkalmazás leáll (az adatok megmaradnak).' : ''),
onConfirm:function(){ doStorageDecommission({where: path, mode: 'anyway', mount_name: name}); }}); onConfirm:function(){ doStorageDecommission({where: path, mode: 'anyway', mount_name: name}); }});
} }
@@ -919,7 +919,7 @@ function doStorageDecommission(body) {
function storageReEnroll(path, label) { function storageReEnroll(path, label) {
openDialog({title:'Visszacsatlakoztatás', confirmLabel:'Visszacsatlakoztatás', openDialog({title:'Visszacsatlakoztatás', confirmLabel:'Visszacsatlakoztatás',
message:'Visszacsatlakoztatja a(z) ' + label + ' meghajtót?\n\nAz adatok érintetlenek; a leállított alkalmazások újraindulnak.', message:'Visszacsatlakoztatod a(z) ' + label + ' meghajtót?\n\nAz adatok érintetlenek; a leállított alkalmazások újraindulnak.',
onConfirm:function(){ doStorageReEnroll(path); }}); onConfirm:function(){ doStorageReEnroll(path); }});
} }
function doStorageReEnroll(path) { function doStorageReEnroll(path) {
@@ -216,7 +216,7 @@
</label> </label>
<div class="alert alert-warning" id="warn-databearing" style="display:none;margin-bottom:1rem"> <div class="alert alert-warning" id="warn-databearing" style="display:none;margin-bottom:1rem">
<svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> A kiválasztott meghajtó <strong>adatot tartalmaz</strong>. Az inicializálás (formázás) törli a rajta lévő <svg class="ico ico-sm"><use href="#i-triangle-alert"/></svg> A kiválasztott meghajtó <strong>adatot tartalmaz</strong>. Az inicializálás (formázás) törli a rajta lévő
összes adatot — a folytatáshoz meg kell erősítenie. összes adatot — a folytatáshoz meg kell erősítened.
</div> </div>
<div class="form-actions" style="gap:.75rem"> <div class="form-actions" style="gap:.75rem">
<button type="submit" class="btn btn-danger-outline" id="init-btn">Inicializálás indítása</button> <button type="submit" class="btn btn-danger-outline" id="init-btn">Inicializálás indítása</button>
@@ -341,7 +341,7 @@ async function submitInit(ev){
function renderConfirm(durableId, out, btn){ function renderConfirm(durableId, out, btn){
var name=document.getElementById('mount-name').value; var name=document.getElementById('mount-name').value;
out.innerHTML='<div class="alert alert-warning">A meghajtó adatot tartalmaz. A formázás <strong>véglegesen törli</strong> a rajta lévő összes adatot.</div>' out.innerHTML='<div class="alert alert-warning">A meghajtó adatot tartalmaz. A formázás <strong>véglegesen törli</strong> a rajta lévő összes adatot.</div>'
+'<div class="confirm-input"><label>Megerősítéshez írja be a csatlakoztatási nevet: <strong class="mono">'+esc(name)+'</strong></label>' +'<div class="confirm-input"><label>Megerősítéshez írd be a csatlakoztatási nevet: <strong class="mono">'+esc(name)+'</strong></label>'
+'<input type="text" id="init-confirm-type" class="form-control" autocomplete="off" oninput="document.getElementById(\'init-confirm-go\').disabled=(this.value!==\''+esc(name)+'\')"></div>' +'<input type="text" id="init-confirm-type" class="form-control" autocomplete="off" oninput="document.getElementById(\'init-confirm-go\').disabled=(this.value!==\''+esc(name)+'\')"></div>'
+'<div class="form-actions" style="gap:.6rem;margin-top:.75rem"><button id="init-confirm-go" class="btn btn-danger-outline" disabled>Törlés és inicializálás megerősítése</button></div>' +'<div class="form-actions" style="gap:.6rem;margin-top:.75rem"><button id="init-confirm-go" class="btn btn-danger-outline" disabled>Törlés és inicializálás megerősítése</button></div>'
+'<div id="init-confirm-result" style="margin-top:.6rem"></div>'; +'<div id="init-confirm-result" style="margin-top:.6rem"></div>';
@@ -190,7 +190,7 @@
<div class="storage-path-info"> <div class="storage-path-info">
<span class="storage-path-label">NAS a</span> <span class="storage-path-label">NAS a</span>
<span class="storage-path-path mono">nfs · nas.example:/export/a → /mnt/net/a</span> <span class="storage-path-path mono">nfs · nas.example:/export/a → /mnt/net/a</span>
<span class="form-hint">A megosztás be van állítva a gazdagépen, de nincs regisztrálva — egy megszakadt csatlakoztatás maradványa. Távolítsa el, vagy adja hozzá újra ugyanezzel a névvel.</span> <span class="form-hint">A megosztás be van állítva a gazdagépen, de nincs regisztrálva — egy megszakadt csatlakoztatás maradványa. Távolítsd el, vagy add hozzá újra ugyanezzel a névvel.</span>
</div> </div>
<div class="storage-path-badges"> <div class="storage-path-badges">
<span class="badge badge-warn" title="Beállítva a gazdagépen, de nincs regisztrálva">Árva</span> <span class="badge badge-warn" title="Beállítva a gazdagépen, de nincs regisztrálva">Árva</span>
@@ -346,20 +346,20 @@
<h3>Mit kell beállítani a NAS-on?</h3> <h3>Mit kell beállítani a NAS-on?</h3>
<details> <details>
<summary>Útmutató megjelenítése</summary> <summary>Útmutató megjelenítése</summary>
<p>Engedélyezze a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.</p> <p>Engedélyezd a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.</p>
<h4>SMB (Synology, QNAP — a legtöbb NAS)</h4> <h4>SMB (Synology, QNAP — a legtöbb NAS)</h4>
<p>Hozzon létre (vagy jelöljön ki) egy felhasználót a NAS-on, és adjon neki írás-olvasás jogot a <p>Hozz létre (vagy jelölj ki) egy felhasználót a NAS-on, és adj neki írás-olvasás jogot a
megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében
jönnek létre.</p> jönnek létre.</p>
<h4>NFS</h4> <h4>NFS</h4>
<p>Synology (DSM, ellenőrzött lépések): először kapcsolja be az NFS-t — Vezérlőpult → File <p>Synology (DSM, ellenőrzött lépések): először kapcsold be az NFS-t — Vezérlőpult → File
Services → NFS fül → „Enable NFS service”, és állítsa a „Maximum NFS protocol” értékét Services → NFS fül → „Enable NFS service”, és állítsd a „Maximum NFS protocol” értékét
NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott
mappa szerkesztésében az „NFS Permissions” fülön hozzon létre szabályt a Felhom gép mappa szerkesztésében az „NFS Permissions” fülön hozz létre szabályt a Felhom gép
IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval. IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval.
A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a
fenti „Megosztás” mezőbe.</p> fenti „Megosztás” mezőbe.</p>
<p>Egyszerű (más NAS-okhoz): kapcsolja be az exporton a „minden felhasználó leképezése” (map all <p>Egyszerű (más NAS-okhoz): kapcsold be az exporton a „minden felhasználó leképezése” (map all
users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok
tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.</p> tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.</p>
<p>Teljes értékű (TrueNAS / Linux szerver): export a következő opciókkal: <p>Teljes értékű (TrueNAS / Linux szerver): export a következő opciókkal:
@@ -452,7 +452,7 @@ function nsShowError(message, detail){
function netStorageRemove(name,label){ function netStorageRemove(name,label){
openDialog({title:'Hálózati tárhely eltávolítása', confirmLabel:'Eltávolítás', openDialog({title:'Hálózati tárhely eltávolítása', confirmLabel:'Eltávolítás',
message:'Biztosan eltávolítja a(z) '+label+' hálózati tárhelyet?\n\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.', message:'Biztosan eltávolítod a(z) '+label+' hálózati tárhelyet?\n\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.',
onConfirm:function(){ onConfirm:function(){
fetch('/api/storage/netstorage/remove',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({name:name})}) fetch('/api/storage/netstorage/remove',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({name:name})})
.then(function(r){return r.json();}).then(function(d){ .then(function(r){return r.json();}).then(function(d){
@@ -201,20 +201,20 @@
<h3>Mit kell beállítani a NAS-on?</h3> <h3>Mit kell beállítani a NAS-on?</h3>
<details> <details>
<summary>Útmutató megjelenítése</summary> <summary>Útmutató megjelenítése</summary>
<p>Engedélyezze a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.</p> <p>Engedélyezd a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.</p>
<h4>SMB (Synology, QNAP — a legtöbb NAS)</h4> <h4>SMB (Synology, QNAP — a legtöbb NAS)</h4>
<p>Hozzon létre (vagy jelöljön ki) egy felhasználót a NAS-on, és adjon neki írás-olvasás jogot a <p>Hozz létre (vagy jelölj ki) egy felhasználót a NAS-on, és adj neki írás-olvasás jogot a
megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében
jönnek létre.</p> jönnek létre.</p>
<h4>NFS</h4> <h4>NFS</h4>
<p>Synology (DSM, ellenőrzött lépések): először kapcsolja be az NFS-t — Vezérlőpult → File <p>Synology (DSM, ellenőrzött lépések): először kapcsold be az NFS-t — Vezérlőpult → File
Services → NFS fül → „Enable NFS service”, és állítsa a „Maximum NFS protocol” értékét Services → NFS fül → „Enable NFS service”, és állítsd a „Maximum NFS protocol” értékét
NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott NFSv4.1-re (az alapértelmezett NFSv3 nem elegendő a csatlakoztatáshoz). Ezután a megosztott
mappa szerkesztésében az „NFS Permissions” fülön hozzon létre szabályt a Felhom gép mappa szerkesztésében az „NFS Permissions” fülön hozz létre szabályt a Felhom gép
IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval. IP-címére, Read/Write jogosultsággal, a Squash mezőben a „Map all users to admin” opcióval.
A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a A megosztás elérési útja ugyanezen a fülön látható (pl. /volume1/&lt;mappa&gt;) — ez kerül a
fenti „Megosztás” mezőbe.</p> fenti „Megosztás” mezőbe.</p>
<p>Egyszerű (más NAS-okhoz): kapcsolja be az exporton a „minden felhasználó leképezése” (map all <p>Egyszerű (más NAS-okhoz): kapcsold be az exporton a „minden felhasználó leképezése” (map all
users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok
tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.</p> tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.</p>
<p>Teljes értékű (TrueNAS / Linux szerver): export a következő opciókkal: <p>Teljes értékű (TrueNAS / Linux szerver): export a következő opciókkal:
@@ -307,7 +307,7 @@ function nsShowError(message, detail){
function netStorageRemove(name,label){ function netStorageRemove(name,label){
openDialog({title:'Hálózati tárhely eltávolítása', confirmLabel:'Eltávolítás', openDialog({title:'Hálózati tárhely eltávolítása', confirmLabel:'Eltávolítás',
message:'Biztosan eltávolítja a(z) '+label+' hálózati tárhelyet?\n\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.', message:'Biztosan eltávolítod a(z) '+label+' hálózati tárhelyet?\n\nA megosztás leválasztásra kerül; a NAS-on lévő adatok érintetlenek maradnak.',
onConfirm:function(){ onConfirm:function(){
fetch('/api/storage/netstorage/remove',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({name:name})}) fetch('/api/storage/netstorage/remove',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({name:name})})
.then(function(r){return r.json();}).then(function(d){ .then(function(r){return r.json();}).then(function(d){
+7 -7
View File
@@ -162,6 +162,13 @@
"err.backup.restore_drive_gone": "BORN AS A KEY (R-362) -- names the drive a restore could not reach instead of a raw permission error; a NEW sentence, never a Go literal. Pinned in both languages by TestR362_DetachedDriveIsNamed.", "err.backup.restore_drive_gone": "BORN AS A KEY (R-362) -- names the drive a restore could not reach instead of a raw permission error; a NEW sentence, never a Go literal. Pinned in both languages by TestR362_DetachedDriveIsNamed.",
"restore.refuse.files.second_drive_whole": "BORN AS A KEY (R-675) -- the unit-restore refusal names the second drive's WHOLE restore (decision 26); a NEW sentence, never a Go literal. Pinned in both languages by TestR675_RefusalNamesTheWholeCopy.", "restore.refuse.files.second_drive_whole": "BORN AS A KEY (R-675) -- the unit-restore refusal names the second drive's WHOLE restore (decision 26); a NEW sentence, never a Go literal. Pinned in both languages by TestR675_RefusalNamesTheWholeCopy.",
"flash.login.password_changed": "R-516 item 12 -- REWORDED on purpose: the formal „Kérjük, jelentkezzen be\" became the product's te-form „Jelentkezz be\"; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_FormalFormsAreGone.", "flash.login.password_changed": "R-516 item 12 -- REWORDED on purpose: the formal „Kérjük, jelentkezzen be\" became the product's te-form „Jelentkezz be\"; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_FormalFormsAreGone.",
"flash.backup.window_invalid_time": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"api.deploy.netstorage_unreachable": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"api.deploy.no_space": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"debug.api.reset_confirm_invalid": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"err.web.formazas_kesz_de_az_uj_fajlrendszer": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"err.selfupdate.mentes_fut_probalja_kesobb": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"err.stacks.field_required_password": "R-516 (2026-10-06) -- REWORDED on purpose: the formal („ön\") verb forms in this sentence became the product's te-form; the row is about exactly these bytes, so byte parity with the base literal cannot hold. Pinned by TestR516_WidenedFormalFormsAreGone.",
"health.system_disk_high": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.", "health.system_disk_high": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.",
"health.system_disk_critical": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.", "health.system_disk_critical": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.",
"health.data_disk_high": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.", "health.data_disk_high": "BORN AS A KEY (R-516 item 10) -- the dashboard banner's own sentence for a health-check warning/issue whose wire text (report health.*) is English and stays so; a NEW sentence, never a Go literal. Pinned in both languages by TestR516_HealthBannersFollowTheHousehold.",
@@ -198,7 +205,6 @@
"flash.restore.started": "Visszaállítás elindult — az állapot itt frissül.", "flash.restore.started": "Visszaállítás elindult — az állapot itt frissül.",
"flash.restore.file_started": "Fájl-visszaállítás elindult — az állapot itt frissül.", "flash.restore.file_started": "Fájl-visszaállítás elindult — az állapot itt frissül.",
"flash.restore.full_started": "Teljes visszaállítás elindult — az állapot itt frissül.", "flash.restore.full_started": "Teljes visszaállítás elindult — az állapot itt frissül.",
"flash.backup.window_invalid_time": "Érvénytelen időpont. Használja a ÓÓ:PP formátumot (például 02:30).",
"flash.backup.window_save_failed": "A mentési időablak mentése nem sikerült.", "flash.backup.window_save_failed": "A mentési időablak mentése nem sikerült.",
"flash.backup.window_updated": "Mentési időablak frissítve.", "flash.backup.window_updated": "Mentési időablak frissítve.",
"flash.sharing.save_failed": "A mentés nem sikerült.", "flash.sharing.save_failed": "A mentés nem sikerült.",
@@ -594,9 +600,7 @@
"country.YE": "Jemen", "country.YE": "Jemen",
"country.ZM": "Zambia", "country.ZM": "Zambia",
"country.ZW": "Zimbabwe", "country.ZW": "Zimbabwe",
"api.deploy.netstorage_unreachable": "A kiválasztott hálózati tárhely jelenleg nem érhető el az alkalmazások környezetéből — a telepítés nem indítható. Próbálja újra pár perc múlva, vagy jelezze az üzemeltetőnek.",
"api.deploy.not_installable": "Ez az alkalmazás jelenleg nem telepíthető.", "api.deploy.not_installable": "Ez az alkalmazás jelenleg nem telepíthető.",
"api.deploy.no_space": "Nincs elég szabad tárhely a telepítéshez: csak %.0f GB szabad, és a rendszer %.0f GB tartalékot tart fenn az alapszolgáltatások (vezérlő, proxy) védelmében. Szabadítson fel helyet, vagy bővítse a tárhelyet.",
"api.deploy.started": "Telepítés elindítva – az állapot a kártyán követhető", "api.deploy.started": "Telepítés elindítva – az állapot a kártyán követhető",
"api.start.drive_missing": "A(z) %s tárhely jelenleg nem elérhető — az alkalmazás nem indítható, amíg a meghajtó vissza nem csatlakozik.", "api.start.drive_missing": "A(z) %s tárhely jelenleg nem elérhető — az alkalmazás nem indítható, amíg a meghajtó vissza nem csatlakozik.",
"api.start.not_enough_memory": "Nincs elég memória az indításhoz. Szükséges: %d MB, elérhető: %d MB (használt: %d MB / használható: %d MB)", "api.start.not_enough_memory": "Nincs elég memória az indításhoz. Szükséges: %d MB, elérhető: %d MB (használt: %d MB / használható: %d MB)",
@@ -638,7 +642,6 @@
"debug.api.gitea_reachable": "Gitea elérhető (HTTP %d, %dms)", "debug.api.gitea_reachable": "Gitea elérhető (HTTP %d, %dms)",
"debug.api.telemetry_collected": "Telemetria összegyűjtve: %d app, %d hiba, %d figyelmeztetés (%dms)", "debug.api.telemetry_collected": "Telemetria összegyűjtve: %d app, %d hiba, %d figyelmeztetés (%dms)",
"debug.api.selfupdate_unconfigured": "Self-update nincs konfigurálva", "debug.api.selfupdate_unconfigured": "Self-update nincs konfigurálva",
"debug.api.reset_confirm_invalid": "Érvénytelen megerősítés — írja be: RESET",
"debug.api.marker_write_failed": "Marker fájl írási hiba: %v", "debug.api.marker_write_failed": "Marker fájl írási hiba: %v",
"debug.api.restarting_to_setup": "Controller újraindítása setup módba...", "debug.api.restarting_to_setup": "Controller újraindítása setup módba...",
"debug.api.agent_unconfigured": "Az ügynök nincs konfigurálva ezen a rendszeren.", "debug.api.agent_unconfigured": "Az ügynök nincs konfigurálva ezen a rendszeren.",
@@ -857,7 +860,6 @@
"err.web.formazas_sikertelen": [ "err.web.formazas_sikertelen": [
"formázás sikertelen: %w" "formázás sikertelen: %w"
], ],
"err.web.formazas_kesz_de_az_uj_fajlrendszer": "formázás kész, de az új fájlrendszer-azonosító nem feloldható — frissítsen és használja a Csatolás funkciót",
"err.web.csatlakoztatas_sikertelen": [ "err.web.csatlakoztatas_sikertelen": [
"csatlakoztatás sikertelen: %w" "csatlakoztatás sikertelen: %w"
], ],
@@ -924,7 +926,6 @@
"err.selfupdate.hianyos_registry_hitelesito_adatok_felhasznalonev_es": "hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)", "err.selfupdate.hianyos_registry_hitelesito_adatok_felhasznalonev_es": "hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)",
"err.selfupdate.frissites_mar_folyamatban": "Frissítés már folyamatban", "err.selfupdate.frissites_mar_folyamatban": "Frissítés már folyamatban",
"err.selfupdate.dev_verzio_nem_frissitheto": "Dev verzió nem frissíthető", "err.selfupdate.dev_verzio_nem_frissitheto": "Dev verzió nem frissíthető",
"err.selfupdate.mentes_fut_probalja_kesobb": "Mentés fut, próbálja később",
"err.selfupdate.a_frissites_nem_erheto_el_nincs": "A frissítés nem érhető el (nincs gazda-ügynök)", "err.selfupdate.a_frissites_nem_erheto_el_nincs": "A frissítés nem érhető el (nincs gazda-ügynök)",
"err.selfupdate.nincs_elerheto_frissites": "Nincs elérhető frissítés", "err.selfupdate.nincs_elerheto_frissites": "Nincs elérhető frissítés",
"err.selfupdate.docker_pull_hianyos_registry_hitelesito_adatok": "docker pull: hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)", "err.selfupdate.docker_pull_hianyos_registry_hitelesito_adatok": "docker pull: hiányos registry hitelesítő adatok (felhasználónév és token együtt szükséges)",
@@ -943,7 +944,6 @@
"err.notify.hub_elerhetetlen": [ "err.notify.hub_elerhetetlen": [
"hub elérhetetlen: %w" "hub elérhetetlen: %w"
], ],
"err.stacks.field_required_password": "a(z) %q mező kitöltése kötelező — használja a Generálás gombot vagy írjon be egy jelszót",
"err.stacks.field_required": "a(z) %q (%s) mező kitöltése kötelező", "err.stacks.field_required": "a(z) %q (%s) mező kitöltése kötelező",
"err.backup.offsite_over_quota": "A távoli mentés túllépte a tárhelykeretet (%d/%d GB) — törölj régi mentéseket vagy kérj nagyobb keretet.", "err.backup.offsite_over_quota": "A távoli mentés túllépte a tárhelykeretet (%d/%d GB) — törölj régi mentéseket vagy kérj nagyobb keretet.",
"err.stacks.not_enough_memory": [ "err.stacks.not_enough_memory": [
+29 -3
View File
@@ -55,6 +55,20 @@ EN_FORBIDDEN = re.compile(r"\b(please|kindly)\b", re.I)
HU_FORMAL = [ HU_FORMAL = [
"olvassa be", "kerjuk", "vegye fel", "ujratelepiti az", "importalnia", "biztosan kikapcsolja", "olvassa be", "kerjuk", "vegye fel", "ujratelepiti az", "importalnia", "biztosan kikapcsolja",
"ellenorizze", "csatlakoztassa", "adjon hozza", "nezze meg", "kattintson", "valassza ki", "ellenorizze", "csatlakoztassa", "adjon hozza", "nezze meg", "kattintson", "valassza ki",
# Widened 2026-10-06 (R-516, the forms the list above did not see on the debug, storage,
# network-storage, security and system pages). Each was in hu.json and is now te-form.
"irja be", "adja meg", "adja hozza", "adjon neki", "hozzon letre", "biztosan eltavolitja",
"engedelyezze", "probalja", "valasszon", "jelezze", "jegyezze fel", "mentse el", "kapcsolja be",
"hasznalja a", "akkor hasznalja", "szabaditson", "bovitse", "irjon be", "toltse", "folytatja?",
"biztosan ujrainditja", "ujraindithatja", "alkalmazasai ", "tavolitsa el", "jeloljon ki",
"allitsa a", "nem csatolja", "levalasztja a", "visszacsatlakoztatja", "visszaallitja a hianyzo",
"erositenie", "frissitsen", "letrehozza a",
]
# Third-person statements that contain a formal stem but address nobody (ASCII-folded). Removed from
# a value before the stems are matched; a phrase is listed here only with the key that needs it.
HU_FORMAL_NOT = [
"sora adja meg", # storage_network.ip_cim_vagy_dns_nev: "the Sharing page's line gives the address"
] ]
@@ -63,6 +77,13 @@ def fold(s):
return "".join(c for c in s if not unicodedata.combining(c)).lower() return "".join(c for c in s if not unicodedata.combining(c)).lower()
def formal_text(s):
f = fold(s)
for phrase in HU_FORMAL_NOT:
f = f.replace(phrase, " ")
return f
def load(lang): def load(lang):
p = os.path.join(LOCALES, lang + ".json") p = os.path.join(LOCALES, lang + ".json")
if not os.path.exists(p): if not os.path.exists(p):
@@ -91,8 +112,13 @@ def main():
if "kerjuk" not in fold("Kérjük, vegye fel"): if "kerjuk" not in fold("Kérjük, vegye fel"):
print("i18n gate INCONCLUSIVE: positive control failed (folding does not strip accents)") print("i18n gate INCONCLUSIVE: positive control failed (folding does not strip accents)")
return 2 return 2
if any(stem in fold("Csatlakoztasd újra a meghajtót") for stem in HU_FORMAL): for informal in ("Csatlakoztasd újra a meghajtót",
print("i18n gate INCONCLUSIVE: negative control failed (an informal te-form sentence matched a formal stem)") "Írd be, add meg, hozz létre, engedélyezd, próbáld újra. Biztosan eltávolítod?"):
if any(stem in fold(informal) for stem in HU_FORMAL):
print("i18n gate INCONCLUSIVE: negative control failed (an informal te-form sentence matched a formal stem)")
return 2
if not any(stem in formal_text("Írja be a meghajtó nevét") for stem in HU_FORMAL):
print("i18n gate INCONCLUSIVE: positive control failed (a widened stem does not match its formal form)")
return 2 return 2
problems = [] problems = []
@@ -113,7 +139,7 @@ def main():
problems.append("en.json %r says %r -- plain second person, no pleading" % (k, EN_FORBIDDEN.search(en[k]).group(0))) problems.append("en.json %r says %r -- plain second person, no pleading" % (k, EN_FORBIDDEN.search(en[k]).group(0)))
missing = [k for k in hu if k not in en and (k + ".other") not in en] missing = [k for k in hu if k not in en and (k + ".other") not in en]
formal = [(k, stem) for k in hu for stem in HU_FORMAL if stem in fold(hu[k])] formal = [(k, stem) for k in hu for stem in HU_FORMAL if stem in formal_text(hu[k])]
print("i18n: %d markers in %d templates; hu %d keys, en %d keys" % (used, len(tpls), len(hu), len(en))) print("i18n: %d markers in %d templates; hu %d keys, en %d keys" % (used, len(tpls), len(hu), len(en)))
print("i18n: English missing %d (ceiling %d); Hungarian formal forms %d (ceiling %d, R-516)" print("i18n: English missing %d (ceiling %d); Hungarian formal forms %d (ceiling %d, R-516)"
+10
View File
@@ -171,6 +171,16 @@ swapped("i18n/gap-grew", "i18n_missing_gate.py", EN_JSON,
_one(' "launcher.link_masolasa": "Copy link",\n', '')) _one(' "launcher.link_masolasa": "Copy link",\n', ''))
swapped("i18n/new-formal-form", "i18n_missing_gate.py", HU_JSON, swapped("i18n/new-formal-form", "i18n_missing_gate.py", HU_JSON,
_one('"launcher.link_masolasa": "Link másolása"', '"launcher.link_masolasa": "Kattintson a link másolásához"')) _one('"launcher.link_masolasa": "Link másolása"', '"launcher.link_masolasa": "Kattintson a link másolásához"'))
# R-516 (2026-10-06): the widened stems -- a form the original list did not see convicts, its te-form
# twin and the one listed third-person statement pass.
swapped("i18n/new-formal-wide", "i18n_missing_gate.py", HU_JSON,
_one('"launcher.link_masolasa": "Link másolása"', '"launcher.link_masolasa": "Írja be a link nevét"'))
swapped("i18n/te-form-wide", "i18n_missing_gate.py", HU_JSON,
_one('"launcher.link_masolasa": "Link másolása"', '"launcher.link_masolasa": "Írd be a link nevét"'),
expect="accept")
swapped("i18n/third-person-ok", "i18n_missing_gate.py", HU_JSON,
_one('"launcher.link_masolasa": "Link másolása"', '"launcher.link_masolasa": "A Megosztás oldal sora adja meg"'),
expect="accept")
# Scope: the copy gates read the page AS RENDERED, so copy that lives in a bundle is still judged. # Scope: the copy gates read the page AS RENDERED, so copy that lives in a bundle is still judged.
swapped("emoji/bundle", "emoji_gate.py", EN_JSON, swapped("emoji/bundle", "emoji_gate.py", EN_JSON,
_one('"launcher.link_masolasa": "Copy link"', '"launcher.link_masolasa": "Copy link \U0001F600"')) _one('"launcher.link_masolasa": "Copy link"', '"launcher.link_masolasa": "Copy link \U0001F600"'))