diff --git a/CHANGELOG.md b/CHANGELOG.md index b2a4d14..1fd89fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,46 @@ +## v0.248.0 — English for apps and settings: ten more pages, Hungarian byte-identical (2026-09-17, R-556 release A) + +**MinAgent: 0.131.0** (unchanged). **No hub release needed.** Nothing changes for a Hungarian household: +the switch is still shown only on English pages (decision 6 stands until release C). + +- **Converted:** `dashboard`, `stacks`, `logs`, `monitoring`, `app_import`, `app_export`, `deploy`, + `settings_system`, `settings_security`, `settings_notifications` (572 markers). `app_row`, + `meta_badge`, `icons` carry no copy (verified). 16 repeated strings now share `common.*` keys + where the meaning is the same everywhere; „Mentés" (Save/Backup), „Frissítés" (Update/Refresh), + „Indítás" (Start/Boot) deliberately stay per page. +- **Parity:** 25 new fixture states captured from the UNCONVERTED templates (commit `6be55a0`) before + any of these pages carried a marker. Five v0.247.0 fixtures were re-captured from v0.246.0 + (`89dd3e94`) because their one-word Hungarian data had to become multi-word (below). +- **New test — `TestI18nParityCoversEveryMarker`:** every marker occurrence must be rendered by some + parity case. It found two gaps in v0.247.0's own pages (the app page's Install button; one „Due" + tag), closed with two new cases captured from v0.246.0. +- **English page test widened:** only fixture strings of 2+ words or 12+ characters are masked; titles + go through `addLanguageData`. Measured: with one English nav key deleted, the old test flagged 8 + cases and missed the 6 launcher cases; the new one flags all 14. +- **Retrieval-promise gate reads English** (`EN_PATTERNS`, `ALLOWLIST_EN`): HEAD passed a planted + „Your old backups can be restored at any time." in `en.json`; the gate now convicts it and accepts the + same place carrying a sentence that promises nothing. Decoys in `test_gate_decoys.py`. +- **Go-side copy on these pages:** titles via `TitleKey` (dashboard, stacks, monitoring, the three + settings pages); `infraMeta` descriptions (and samba's name) from the bundle, Hungarian pinned equal + to `inframeta.go`. +- **Found, not converted:** `backups_remote.html` decides with `indexOf('Fut')` against its own + Hungarian status text (row filed); converting that word would silently break the English page's + progress poll. Composite page titles (logs, deploy, export) and `lifecycleBadge`/`updateBadge` + remain Hungarian — slice 2. +- **Extractor:** ASCII-only Hungarian it missed on these pages — Mind, Folyamat, Titkos, Processzor, + Hamarosan, aldomain, „Az adatai itt voltak", Figyelem, pelda@email.hu — converted by hand; words added + to its list (not „Mind": an English homograph). It also learnt that a JS string can start inside an + attribute value. +- `HU_FORMAL_CEILING` 6 → 10: the converted copy carries four more „ön" forms (R-516), unchanged by rule. +- Old wording tests (`TestDiskMeter_*`, `TestNetworkBadgeTemplates_DistinctStrings`, + `TestSettingsSectionInventory`) read the Hungarian expansion (`huTemplateSource`), not the raw file. +- `loadTemplates` logs its parse duration per language (DEBUG). + +**Red-proofs** (`felhom.eu/documentation/audits/i18n-slice1-2026-09-17/A/redproofs.txt`): parity (one byte +of `dashboard.lemezek_allapota` → 4 dashboard cases name line and bytes); coverage (a marker in an +unreachable launcher branch → named, while parity stayed green); mask widening (8 vs 14 cases); +retrieval gate (HEAD rc 0 on the planted promise → fixed gate convicts, negative control accepted). + ## v0.247.0 — the dashboard can speak English: mechanism proven on three pages, Hungarian byte-identical (2026-09-17, i18n spike) **MinAgent: 0.131.0** (unchanged — nothing here talks to the agent). **No hub release needed:** the diff --git a/REUSE.md b/REUSE.md index 4b120d8..6654667 100644 --- a/REUSE.md +++ b/REUSE.md @@ -231,6 +231,7 @@ | `getBudapestLocation` | controller/internal/scheduler/scheduler.go | `() *time.Location` | Local-time math | web has its own `getTimezone` (§6); quiesce has its own `budapestLocation` (window gate) — 3rd copy, see §6 | | `Server.templateFuncMap` | controller/internal/web/funcmap.go | template.FuncMap | ALL template functions | `stateColor` outputs v2 suffixes `run/progress/warn/neutral/off`; stopped = NEUTRAL not red (operator-approved); `stateLabel` copy is frozen byte-identical (unit-tested) | | `i18n.Bundle` (`Shared` / `Msg` / `Plural` / `Expand`) | controller/internal/i18n/i18n.go | `Msg(lang, key) string` | ALL customer copy that has been converted (v0.247.0) | hu.json is authoritative; a key missing in en shows Hungarian (counted), never blank; `Expand` runs BEFORE template parse — never add a runtime `T` func (escaping would change Hungarian bytes). A template edit to converted copy goes in hu.json + en.json, then `TestI18nParity` must still pass | +| `huTemplateSource` (test) | controller/internal/web/i18n_wiring_test.go | `(name) ([]byte, error)` | A test that asserts a template's Hungarian WORDING | Reads the expansion, not the raw file — since slice 1 the wording lives in hu.json. Never use `templateFS.ReadFile` for a wording assertion | | `Server.langFor` / `templatesFor` / `addLanguageData` | controller/internal/web/server.go + i18n_web.go | request → lang → template set | Rendering a page in the household's language | Only `executeTemplate` is language-aware; `s.tmpl` is the Hungarian set; Go-side titles via `data["TitleKey"]` | | `timeAgoStr` | controller/internal/web/funcmap.go | `(s RFC3339 string) string` | Ago-format for STRING timestamps | Exists because `timeAgo(time.Time)` 500'd on strings (v0.93 bug) | | `Server.baseData` / `executeTemplate` | controller/internal/web/handlers.go + server.go | page-data plumbing | New pages | baseData injects nav/alerts/version; templates must pass `controller/scripts/template_id_gate.py` + `controller/scripts/emoji_gate.py` | diff --git a/controller/README.md b/controller/README.md index 797e43b..669262d 100644 --- a/controller/README.md +++ b/controller/README.md @@ -3621,8 +3621,10 @@ Design: `felhom.eu/documentation/architecture/10-localisation.md`. Inventory: **What a household sees:** nothing new. Hungarian is the default and the only language shown unless the language is switched. English covers the **launcher**, the **backups overview** (`/backups`), the -**app page** (`/apps/`) and the shared **layout** (menu, banners, the layout's modals) — other -pages keep their Hungarian body inside an English menu. +**app page** (`/apps/`), the shared **layout**, and since v0.248.0 the **dashboard, apps list, +logs, monitoring, import, export, deploy/settings-of-an-app and the three settings pages** — other +pages keep their Hungarian body inside an English menu. Server-built messages and catalog copy stay +Hungarian (slices 2 and 5). - **Bundles:** `internal/i18n/locales/hu.json` (authoritative, every key) and `en.json`, embedded. Flat `key → text`; a value may carry template actions (`{{.RecoveryAbandonDate}}`) and inline @@ -3650,7 +3652,9 @@ pages keep their Hungarian body inside an English menu. exist, no orphans, the English gap and the formal „ön" count only shrink (ratchets), no pleading English. The emoji, native-confirm, secret-in-markup and retrieval-promise gates read templates **expanded** through `scripts/i18n_bundle.py`; mojibake scans the bundles. -- **Release gate:** `TestI18nParity` compares the Hungarian render of 14 fixture states with HTML +- **Coverage:** `TestI18nParityCoversEveryMarker` fails when any marker occurrence is rendered by no + parity case. Fixtures are written only when missing (`-update-i18n-golden`, `-i18n-golden-only`). +- **Release gate:** `TestI18nParity` compares the Hungarian render of every fixture state with HTML captured from the unconverted templates (`internal/web/testdata/i18n_parity/`). Fixtures are never regenerated to make a conversion pass. diff --git a/controller/internal/i18n/i18n_test.go b/controller/internal/i18n/i18n_test.go index 7714c94..6e3a5d6 100644 --- a/controller/internal/i18n/i18n_test.go +++ b/controller/internal/i18n/i18n_test.go @@ -111,7 +111,9 @@ func TestEmbeddedBundles(t *testing.T) { } var fieldRefRe = regexp.MustCompile(`\.[A-Z][A-Za-z0-9_]*(\.[A-Z][A-Za-z0-9_]*)*`) -var verbRe = regexp.MustCompile(`%[-+# 0-9.]*[sdvq]`) +// verbRe counts printf verbs OUTSIDE template actions ({{printf "%.0f" .X}} is a parameter, not a verb +// of the message), and without the space flag — „50% szabad" is prose, not „% s". +var verbRe = regexp.MustCompile(`%[-+#0-9.]*[sdvq]`) func refs(s string) []string { var out []string @@ -153,10 +155,12 @@ func TestBundleParametersMatchAcrossLanguages(t *testing.T) { if a, c := strings.Join(refs(hu), ","), strings.Join(refs(v), ","); a != c { t.Errorf("%s %q: template fields %q, Hungarian has %q", lang, f, c, a) } - if a, c := len(verbRe.FindAllString(hu, -1)), len(verbRe.FindAllString(v, -1)); a != c { + if a, c := len(verbRe.FindAllString(stripActions(hu), -1)), len(verbRe.FindAllString(stripActions(v), -1)); a != c { t.Errorf("%s %q: %d printf verbs, Hungarian has %d", lang, f, c, a) } } } } } + +func stripActions(s string) string { return regexp.MustCompile(`\{\{.*?\}\}`).ReplaceAllString(s, "") } diff --git a/controller/internal/i18n/locales/en.json b/controller/internal/i18n/locales/en.json index 2ac40e3..62f9e89 100644 --- a/controller/internal/i18n/locales/en.json +++ b/controller/internal/i18n/locales/en.json @@ -1,4 +1,20 @@ { + "common.bezaras": "Close", + "common.elavult": "Outdated", + "common.eltavolitas": "Remove", + "common.hdd_szukseges": "Needs a hard drive", + "common.hiba": "Error", + "common.hiba_kettospont": "Error:", + "common.hiba_tortent": "An error occurred", + "common.jelszo": "Password", + "common.levalasztva": "Disconnected", + "common.magyar_felulet": "Hungarian interface", + "common.megsem": "Cancel", + "common.pi_kompatibilis": "Runs on Pi", + "common.rendszer_gyoker": "System (/)", + "common.torles": "Delete", + "common.ugyfel_azonosito": "Customer ID", + "common.ujrainditas": "Restart", "layout.html_lang": "en", "launcher.inditopult": "Launcher", "launcher.inditopult_megosztasa": "Share the launcher", @@ -10,7 +26,6 @@ "launcher.megosztas": "Share…", "launcher.qr_kod_a_megosztasi_linkhez": "QR code for the share link", "launcher.olvassa_be_telefonnal_a_gyors": "Scan it with your phone to open it quickly.", - "launcher.jelszo": "Password", "launcher.a_megosztas_jelszoval_vedett": "The share is protected by a password.", "launcher.jelszo_torlese": "Remove password", "launcher.jelszo_nem_kotelezo": "Password (optional)", @@ -21,7 +36,6 @@ "launcher.biztosan_kikapcsolja_a_megosztast_a": "Turn off sharing? The link stops working immediately.", "launcher.megosztas_kikapcsolasa": "Turn off sharing", "launcher.a_megosztas_jelenleg_ki_van": "Sharing is off.", - "launcher.bezaras": "Close", "launcher.megosztas_bekapcsolasa": "Turn on sharing", "launcher.masolva": "Copied", "launcher.inditopult_2": "Launcher — {{.Domain}}", @@ -30,8 +44,6 @@ "backups.kijelolod_ezt_a_meghajtot_a": "Use this drive for the system backup?", "backups.kijelolom": "Use this drive", "backups.tarhely_attekintes": "Storage overview", - "backups.rendszer": "System (/)", - "backups.levalasztva": "Disconnected", "backups.db_mentesek": "Database backups", "backups.fajl": "{{$n := len .Backup.DumpFiles}}{{$n}} {{if eq $n 1}}file{{else}}files{{end}}", "backups.rendszermentes_teljes_mentes": "System backup (full backup)", @@ -68,9 +80,7 @@ "backups.beagyazott_db_k_a_kotetmentesben": "embedded databases, inside the volume backup", "backups.elinditod_a_teljes_rendszermentest_most": "Start the full system backup now? Your apps stop during the backup — usually for a few minutes, longer with more data.", "backups.mentes_inditasa": "Starting the backup…", - "backups.hiba": "Error", "backups.mentes_folyamatban": "Backup in progress…", - "backups.hiba_2": "Error:", "backups.allapot": "Status:", "backups.a_rendszermentes_elkeszult": "The system backup is done.", "backups.a_mentes_sikertelen": "The backup failed.", @@ -79,20 +89,15 @@ "backups.a_meghajto_kijelolve_a_beallitas": "The drive is assigned. The setting takes effect after the host agent next restarts.", "backups.a_meghajto_kijelolve": "The drive is assigned.", "app_info.alkalmazasok": "← Apps", - "app_info.elavult": "Outdated", "app_info.megnyitas": "Open ↗", "app_info.naplo": "Log", - "app_info.torles": "Delete", "app_info.exportalas": "Export", "app_info.beallitasok": "Settings", "app_info.telepites": "Install", "app_info.mentesek": "Backups", "app_info.hianyzo_tarhely": "Missing storage:", "app_info.ennek_az_alkalmazasnak_az_adattaroloja": "This app’s data storage is not available right now, so the app is stopped. Connect the drive again, or move the data to another storage.", - "app_info.hdd_szukseges": "Needs a hard drive", - "app_info.pi_kompatibilis": "Runs on Pi", "app_info.csak_x86": "x86 only", - "app_info.magyar_felulet": "Hungarian interface", "app_info.az_alkalmazas_fejlesztoje_felhagyott_a": "The developer of this app has stopped working on it. The installed version still works,\n but it gets no more updates or security fixes.", "app_info.hova_tegyem_a_fajlokat": "Where do I put my files?", "app_info.ezeket_a_mappakat_a_fajlkezeloben": "You reach these folders in the File manager. You may need to sign in to the File manager first.", @@ -113,14 +118,12 @@ "app_info.athelyezed_a_z": "Move the", "app_info.adatait_ide": "data to:", "app_info.az_alkalmazas_rovid_idore_leall": "? The app stops briefly. The old data is deleted only after a successful move.", - "app_info.hiba": "Error:", "app_info.ismeretlen": "unknown", "app_info.mire_hasznalhato": "What is it for?", "app_info.elso_lepesek": "First steps", "app_info.elofeltetelek": "Before you start", "app_info.kezdeti_belepesi_adatok": "First sign-in details", "app_info.felhasznalonev": "Username", - "app_info.jelszo": "Password", "app_info.az_uzemelteto_allitotta_be": "set by the operator", "app_info.megjelenites": "Show", "app_info.masolas": "Copy", @@ -169,7 +172,6 @@ "layout.ez_az_alkalmazas_mar_telepitve": "This app is already installed.", "layout.frissites": "↻ Refreshing...", "layout.sablonok_frissitve": "Templates refreshed", - "layout.hiba": "Error:", "layout.ismeretlen_hiba": "Unknown error", "layout.halozati_hiba": "Network error:", "layout.folyamatban": "In progress...", @@ -180,11 +182,7 @@ "layout.alkalmazas_torlese": "Delete app:", "layout.ez_a_muvelet_eltavolitja_a": "This removes the containers, the volumes and the configuration files.", "layout.ez_a_muvelet_nem_visszavonhato": "You cannot undo this!", - "layout.megsem": "Cancel", - "layout.torles": "Delete", - "layout.hiba_2": "Error", "layout.nem_sikerult_lekerni_az_adatokat": "Could not load the details:", - "layout.bezaras": "Close", "layout.torles_folyamatban": "Deleting...", "layout.torolt_adatok": "Deleted data:", "layout.megorzott_adatok": "Kept data:", @@ -202,7 +200,6 @@ "layout.az_ejszakai_restic_pillanatkepek_nem": "The nightly restic snapshots cannot be deleted one by one — they expire automatically under the retention rules.", "layout.alkalmazas_eltavolitasa": "Remove app:", "layout.az_alkalmazas_visszaall_nincs_telepitve": "The app goes back to \"Not installed\". The template stays, and you can install it again.", - "layout.eltavolitas": "Remove", "layout.eltavolitas_folyamatban": "Removing...", "layout.torolt_mentesek": "Deleted backups:", "layout.nem_torolt_mentesek": "Backups not deleted:", @@ -236,5 +233,473 @@ "func.restore_status.restoring": "Restoring...", "func.restore_status.done": "Done", "func.restore_status.failed": "Failed", - "func.restore_status.skipped": "Skipped" + "func.restore_status.skipped": "Skipped", + "dashboard.vezerlopult": "Dashboard", + "dashboard.futo_alkalmazas": "Running apps", + "dashboard.leallitva": "Stopped", + "dashboard.osszes_alkalmazas": "All apps", + "dashboard.memoria": "Memory", + "dashboard.homerseklet": "Temperature", + "dashboard.nem_ismert": "unknown", + "dashboard.a_tarhely_merete_most_nem": "The storage size cannot be read right now.", + "dashboard.fogyoban_a_hely": "Running out of space", + "dashboard.kritikusan_keves_hely": "Critically low on space", + "dashboard.lemezek_allapota": "Disk health", + "dashboard.nincs_adat": "No data", + "dashboard.biztonsagi_mentes": "Backup", + "dashboard.utolso_mentes": "Last backup:", + "dashboard.sikertelen": "Failed", + "dashboard.meg_nem_futott": "Not run yet", + "dashboard.adatbazisok": "Databases:", + "dashboard.mentve": "{{len .DBDumpStatus.Results}} backed up", + "dashboard.telepitett_alkalmazasok": "Installed apps", + "dashboard.az_alkalmazas_adattaroloja_nem_elerheto": "The app’s data storage is not available. Connect the drive again, or move the data to another storage.", + "dashboard.hianyzo_tarhely": "Missing storage: {{$ms}}", + "dashboard.az_alkalmazas_egyik_folyamatat_a": "The system stopped one of the app’s processes because it ran out of memory. A task may not have finished. Restart the app; if it happens again, tell the operator.", + "dashboard.memoria_elfogyott": "Out of memory", + "dashboard.az_alkalmazas_kornyezeteben_a_halozati": "In the app’s environment there is an empty local folder where the network storage should be — the data is not going to the NAS. Tell the operator.", + "dashboard.halozati_tarhely_hibas_az_alkalmazas": "Network storage broken — the app does not see the NAS", + "dashboard.a_halozati_tarhely_nas_jelenleg": "The network storage (NAS) is not reachable right now. The app is running; access to the data comes back when the NAS returns.", + "dashboard.halozati_tarhely_nem_elerheto": "Network storage not reachable: {{$nw}}", + "dashboard.a_proxy_traefik_csak_egeszseges": "The proxy (Traefik) publishes a public route only for a healthy container. While the app is not healthy, the URL returns 404, even though the container is running.", + "dashboard.url_nem_elerheto": "URL not reachable", + "dashboard.vedett": "Protected", + "dashboard.megnyitas": "Open", + "dashboard.telepites": "Install", + "dashboard.leallitas": "Stop", + "dashboard.inditas": "Start", + "dashboard.naplo": "Log", + "dashboard.nincs_elerheto_alkalmazas": "No app available.", + "stacks.alkalmazasok": "Apps", + "stacks.alkalmazas_visszaallitasa_exportalt_csom": "Restore an app from an exported package", + "stacks.importalas": "Import", + "stacks.sablonok_frissitese_a_kozponti_katalogus": "Refresh the templates from the central catalog", + "stacks.sablonok_frissitese": "↻ Refresh templates", + "stacks.futo": "Running", + "stacks.leallitva": "Stopped", + "stacks.telepitheto": "Installable", + "stacks.a_proxy_traefik_csak_egeszseges": "The proxy (Traefik) publishes a public route only for a healthy container. While the app is not healthy, the URL is not reachable (404), even though the container is running.", + "stacks.url_nem_elerheto_utvonal_nincs": "URL not reachable – route not published", + "stacks.az_alkalmazas_adattaroloja_nem_elerheto": "The app’s data storage is not available. Connect the drive again, or move the data.", + "stacks.hianyzo_tarhely": "Missing storage: {{$ms}}", + "stacks.az_alkalmazas_kornyezeteben_a_halozati": "In the app’s environment there is an empty local folder where the network storage should be — the data is not going to the NAS. Tell the operator.", + "stacks.halozati_tarhely_hibas_az_alkalmazas": "Network storage broken — the app does not see the NAS", + "stacks.a_halozati_tarhely_nas_jelenleg": "The network storage (NAS) is not reachable right now. The app is running; access to the data comes back when the NAS returns.", + "stacks.halozati_tarhely_nem_elerheto": "Network storage not reachable: {{$nw}}", + "stacks.adattarolo": "Data storage: {{index $.StorageLabels .Name}}", + "stacks.vedett_rendszerkomponens": "Protected system component", + "stacks.reszletek": "Details", + "stacks.telepites": "Install", + "stacks.mentesek": "Backups", + "stacks.frissites": "Update", + "stacks.leallitas": "Stop", + "stacks.inditas": "Start", + "stacks.naplok": "Logs", + "logs.vissza": "← Back", + "logs.naplok": "{{.Stack.Meta.DisplayName}} — Logs", + "logs.elo": "Live", + "logs.szuneteltetes": "Pause", + "logs.frissites": "Refresh", + "logs.szunetelve": "Paused", + "logs.folytatas": "Resume", + "monitoring.rendszermonitor": "System monitor", + "monitoring.szerver_allapota_gazdagep": "Server health (host)", + "monitoring.a_gazdagep_metrikai_jelenleg_nem": "The host metrics are not available right now.", + "monitoring.cpu_hasznalat": "CPU usage", + "monitoring.terheles_load": "Load", + "monitoring.memoria": "Memory", + "monitoring.cpu_homerseklet": "CPU temperature", + "monitoring.uzemido": "Uptime", + "monitoring.tarolok_kapacitasa": "Storage capacity", + "monitoring.rendszer_attekintes": "System overview", + "monitoring.gepnev": "Hostname", + "monitoring.operacios_rendszer": "Operating system", + "monitoring.inditas": "Boot time", + "monitoring.tarhely": "Storage", + "monitoring.hub_kapcsolat": "Hub connection", + "monitoring.kapcsolodva_a_kozponti_rendszer_aktivan": "Connected — the central system is actively watching the server.", + "monitoring.nem_elerheto_a_kozponti_rendszer": "Not reachable — the central system has not received a recent report.", + "monitoring.utolso_sikeres_jelentes": "Last successful report", + "monitoring.utolso_hiba": "Last error", + "monitoring.a_hub_kapcsolat_nincs_bekapcsolva": "The hub connection is not turned on — central monitoring is not active.", + "monitoring.rendszer_metrikak": "System metrics", + "monitoring.1_ora": "1 hour", + "monitoring.6_ora": "6 hours", + "monitoring.24_ora": "24 hours", + "monitoring.7_nap": "7 days", + "monitoring.30_nap": "30 days", + "monitoring.cpu_hasznalat_2": "CPU usage (%)", + "monitoring.memoria_hasznalat_gb": "Memory usage (GB)", + "monitoring.homerseklet_c": "Temperature (°C)", + "monitoring.terheles_load_average": "Load average", + "monitoring.meg_nincsenek_adatok_a_metrikak": "No data yet. Metric collection has started; the first data appears in a few minutes.", + "monitoring.memoria_eloszlas": "Memory breakdown", + "monitoring.alkalmazas_eroforrasok": "App resources", + "monitoring.memoria_hasznalat_mb": "Memory usage (MB)", + "monitoring.meg_nincsenek_kontener_adatok": "No container data yet.", + "monitoring.memoria_mb": "Memory (MB)", + "monitoring.hasznalt": "Used:", + "monitoring.rendszer_title": "System:", + "monitoring.rendszer_2": "System (", + "monitoring.szabad": "Free (", + "monitoring.eroforras_elozmenyek": "— Resource history", + "monitoring.nincs_tarolo_adat": "No storage data.", + "monitoring.nem_elerheto": "Not reachable", + "monitoring.kopas": "wear:", + "monitoring.frissitve": "Updated:", + "monitoring.nap": "d,", + "monitoring.ora": "h", + "monitoring.ora_2": "h,", + "monitoring.perc": "min", + "app_import.alkalmazasok": "← Apps", + "app_import.alkalmazas_importalas": "Import an app", + "app_import.fab_csomag_feltoltese_huzza_ide": "Upload a .fab package — drag it here, or choose the file", + "app_import.fajl_kivalasztasa": "Choose file", + "app_import.feltoltes_0": "Upload: 0%", + "app_import.megszakitas": "Cancel upload", + "app_import.nem_talalhato_fab_csomag_a": "No .fab package found on the registered storages.", + "app_import.exportalj_egy_alkalmazast_az_alkalmazas": "Export an app from its page, upload a .fab file above, or copy one into the {storage}/felhom-data/exports/ folder.", + "app_import.alkalmazas": "App", + "app_import.datum": "Date", + "app_import.meret": "Size", + "app_import.tarolo": "Storage", + "app_import.reszletek": "Details »", + "app_import.csomag_reszletei": "Package details", + "app_import.ez_a_csomag_jelszoval_vedett": "This package is protected by a password. Enter the password:", + "app_import.megnyitas": "Open", + "app_import.alkalmazas_2": "App:", + "app_import.exportalva": "Exported:", + "app_import.controller_verzio": "Controller version:", + "app_import.adatbazis": "Database:", + "app_import.adatok": "Data:", + "app_import.meret_2": "Size:", + "app_import.figyelem_a_meglevo": "⚠ WARNING: The existing", + "app_import.alkalmazas_konfiguracioja_es_osszes_adat": "app’s configuration and all its data will be overwritten!", + "app_import.visszaallitas_inditasa": "Start restore", + "app_import.importalas_folyamata": "Import progress", + "app_import.importalas_kesz": "Import done!", + "app_import.az_alkalmazas_sikeresen_visszaallitva": "The app was restored.", + "app_import.alkalmazasok_megtekintese": "View apps", + "app_import.hibas_jelszo": "Wrong password", + "app_import.csomag_reszletei_2": "— Package details", + "app_import.nincs": "None", + "app_import.alkalmazas_megtekintese": "View app", + "app_import.a_feltoltes_megszakadt_ellenorizze_a": "The upload stopped — check the connection, then try again.", + "app_import.feltoltes": "Upload:", + "app_import.csak_fab_fajl_toltheto_fel": "Only a .fab file can be uploaded.", + "app_import.feltoltes_kesz": "Upload done:", + "app_export.alkalmazasok": "← Apps", + "app_export.exportalas": "{{.Stack.Meta.DisplayName}} — Export", + "app_export.mentes_helye": "Save to", + "app_export.valassz_tarolot": "Choose a storage...", + "app_export.konfiguracio": "Configuration:", + "app_export.felhasznaloi_adatok": "Your data:", + "app_export.osszesen": "Total:", + "app_export.szabad": "(free: -)", + "app_export.becsult_ido": "Estimated time:", + "app_export.mindig_resze_a_mentesnek": "Always part of the export:", + "app_export.valaszthato_tartalom": "Optional content:", + "app_export.a_kihagyott_mappak_tartalma_a": "The content of the skipped folders is always reachable in the File manager, and you can save it separately.", + "app_export.kihagyott_tartalom_megjelenitese": "Show skipped content", + "app_export.jelszo_opcionalis": "Password (optional)", + "app_export.titkositasi_jelszo": "Encryption password", + "app_export.jelszo_mutatasa": "Show password", + "app_export.alkalmazas_leallitasa_mentes_elott_ajanl": "Stop the app before the export (recommended)", + "app_export.az_adatok_konzisztenciaja_erdekeben_java": "To keep the data consistent, stop the app during the export.", + "app_export.exportalas_inditasa": "Start export", + "app_export.kesz": "Done!", + "app_export.megnyitas_filebrowser_ben": "Open in FileBrowser ↗", + "app_export.szabad_2": "(free:", + "app_export.perc": "min", + "app_export.nincs_eleg_szabad_hely_a": "Not enough free space on the chosen storage!", + "app_export.alap_mentes": "Base export: ~", + "app_export.a_kihagyott_nagy_meretu_tartalommal": ". With the large skipped content: ~", + "app_export.kihagyott_tartalom_elrejtese": "Hide skipped content", + "deploy.vissza": "← Back", + "deploy.beallitasok": "Settings", + "deploy.telepites": "Install", + "deploy.leallitas": "Stop", + "deploy.inditas": "Start", + "deploy.megnyitas": "Open ↗", + "deploy.reszletek": "Details", + "deploy.reszletes_leiras_kepernyokepek": "Full description, screenshots", + "deploy.ez_az_alkalmazas_mar_telepitve": "This app is already installed. The settings below are read-only.", + "deploy.adattarolas": "Data storage", + "deploy.tarhely": "Storage", + "deploy.adatmeret": "Data size", + "deploy.szabad_hely": "Free space", + "deploy.szabad": "{{.StorageInfo.FreeHuman}} ({{printf \"%.0f\" .StorageInfo.FreePercent}}% free)", + "deploy.mozgatas_masik_tarolora": "Move to another storage", + "deploy.korabbi_adatok": "Earlier data", + "deploy.az_alkalmazas_adatainak_masolata_megtala": "A copy of this app’s data is also on another storage.\n This is usually left behind after a move.", + "deploy.meret": "Size", + "deploy.mappak": "Folders", + "deploy.korabbi_adatok_torlese": "Delete earlier data", + "deploy.biztonsagi_mentes": "Backup", + "deploy.az_alkalmazas_adatbazisa_es_docker": "The app’s database and Docker volumes go into the nightly backup automatically.\n Backup status → · Backup settings →", + "deploy.integraciok": "Integrations", + "deploy.mas_telepitett_alkalmazasokkal_valo_ossz": "Connections to other installed apps. An integration pauses by itself when either app stops, and turns on again when it starts.", + "deploy.nincs_telepitve": "Not installed", + "deploy.celalkalmazas_leallitva": "Target app stopped", + "deploy.aktiv": "Active", + "deploy.a_celalkalmazas_nincs_telepitve": "The target app is not installed", + "deploy.a_celalkalmazas_nem_fut": "The target app is not running", + "deploy.halozati_hiba": "Network error", + "deploy.foldrajzi_korlatozas": "Country restriction", + "deploy.az_alkalmazas_egyeni_orszagkorlatozas_ne": "Without its own country restriction, the app follows the global setting.", + "deploy.egyeni_orszagkorlatozas": "Own country restriction", + "deploy.engedelyezett_orszagok_ehhez_az_alkalmaz": "Allowed countries for this app", + "deploy.orszag_keresese": "Search country...", + "deploy.mentes": "Save", + "deploy.nincs_talalat": "No match", + "deploy.mentve": "Saved", + "deploy.opcionalis_beallitasok": "Optional settings", + "deploy.regisztracios_utmutato": "Sign-up guide ↗", + "deploy.mentes_2": "Saving...", + "deploy.email_kuldes": "Sending e-mail", + "deploy.ez_az_alkalmazas_tud_emailt": "This app can send e-mail (for example password resets, invitations) through Felhom,\n without setting up a separate provider. The sender address: {{.AppEmailFromAddress}}.", + "deploy.az_alkalmazas_email_jelenleg_ki": "App e-mail is turned off globally right now. Turn it on on the\n Settings page for it to work here too.", + "deploy.email_kuldes_engedelyezese_ennel_az": "Allow sending e-mail for this app", + "deploy.a_mentes_ujrainditja_az_alkalmazast": "Saving restarts the app.", + "deploy.nincs_eleg_memoria_foglalas_telepites": "Not enough memory! Reserved after install: {{.AfterMB}} MB / {{.UsableMB}} MB", + "deploy.memoria": "Memory", + "deploy.jelenlegi_hasznalat_mb": "Current usage: {{.UsedMB}} MB", + "deploy.jelenlegi_hasznalat_mb_2": "Current usage ({{.UsedMB}} MB)", + "deploy.az_alkalmazasok_csucsterhelese_meghaladh": "The apps’ peak load can go above the available memory.\n In normal use this causes no problem.", + "deploy.ennek_az_alkalmazasnak_van_korabbi": "This app has an earlier backup, so we filled in the fields below from its own backup.", + "deploy.korabbi_webcim": "Earlier web address: {{.RestoreRecordedAddress}}.", + "deploy.ha_most_mashova_szeretned_telepiteni": "If you want to install it somewhere else now, change it — we will point out the difference before the restore.", + "deploy.az_alkalmazas_adatai_az_alabb": "The app’s data goes to the data drive chosen below.", + "deploy.hol_lesznek_az_adatok_ennel": "Where the data goes: this app has no separate data drive choice,\n so its data goes to the system drive ({{.SystemDataPath}}). Its backups are made all the same.", + "deploy.nincs_eleg_szabad_tarhely_a": "Not enough free storage for the install. {{.DockerFreeHuman}} is free now, and the system keeps\n {{.DockerReserveHuman}} in reserve to protect the core services (controller, proxy).\n So the install is blocked for now — free up space, or add storage.", + "deploy.automatikusan_generalt_ertekek": "Automatically generated values", + "deploy.ezek_az_ertekek_automatikusan_jottek": "These values were created automatically at install.", + "deploy.ezek_az_ertekek_a_telepitessel": "These values are saved together with the install. Write down the passwords you need!", + "deploy.automatikusan_generalva": "Generated automatically", + "deploy.megjelenites": "Show", + "deploy.telepites_utan_nem_modosithato": "cannot be changed after install", + "deploy.az_aldomain_telepites_utan_nem": "The subdomain cannot be changed after install. To change it, remove the app and install it again (all data is deleted).", + "deploy.generalas": "Generate", + "deploy.telepiteskor_beallitott_kezdeti_jelszo_h": "The first password set at install — if you changed it in the app, it is not updated here.", + "deploy.jelszo_megerositese": "Confirm password", + "deploy.igen": "Yes", + "deploy.szabad_2": "{{.Label}} — {{.FreeHuman}} free", + "deploy.alapertelmezett": "(default)", + "deploy.nem_elerheto": "{{$.CurrentHDDPath}} (not available)", + "deploy.a_kivalasztott_tarhely_majdnem_megtelt": "The chosen storage is almost full.", + "deploy.a_kivalasztott_meghajton_az_alkalmazas": "The chosen drive stores the app’s files (media, documents).\n The database runs on the fast internal SSD — and it is backed up together with the app.", + "deploy.nincs_regisztralt_adattarolo_adja_meg": "No registered data storage — enter the path by hand", + "deploy.nincs_eleg_szabad_tarhely": "Not enough free storage", + "deploy.nincs_eleg_memoria": "Not enough memory", + "deploy.telepites_inditasa": "Start install", + "deploy.telepites_folyamatban": "Installing...", + "deploy.konfiguracio_mentese": "Saving the configuration...", + "deploy.kontener_ek_inditasa": "Starting the container(s)...", + "deploy.alkalmazas_inicializalasa": "Initialising the app...", + "deploy.alkalmazas_megnyitasa": "Open the app ↗", + "deploy.elso_lepesek": "First steps", + "deploy.masolas": "Copy", + "deploy.bejelentkezes": "Sign-in", + "deploy.dokumentacio": "Documentation ↗", + "deploy.beallitasok_es_jelszavak_megtekintese": "View settings and passwords", + "deploy.alkalmazasok": "← Apps", + "deploy.a_lekeres_nem_sikerult": "The request failed.", + "deploy.elrejtes": "Hide", + "deploy.masolva": "Copied!", + "deploy.biztosan_torolni_szeretned_a_korabbi": "Delete the earlier data? Storage:", + "deploy.figyelem_a_muvelet_visszavonhatatlan_elo": "— WARNING: this cannot be undone! First make sure the app works properly from the new storage.", + "deploy.utolso_figyelmeztetes_a_torles_visszavon": "LAST WARNING! The deletion cannot be undone. Continue?", + "deploy.torles_folyamatban": "Deleting...", + "deploy.ismeretlen_hiba": "Unknown error", + "deploy.korabbi_adatok_torolve_n_nfelszabaditott": "Earlier data deleted!\\n\\nSpace freed:", + "deploy.n_nnehany_hiba_tortent_n": "\\n\\nSome errors occurred:\\n", + "deploy.halozati_hiba_2": "Network error:", + "deploy.kotelezo_mezo": "Required field:", + "deploy.nhasznalja_a_generalas_gombot_vagy": "\\nUse the Generate button or type a password.", + "deploy.a_ket_jelszo_nem_egyezik": "The two passwords do not match:", + "deploy.az_aldomain_csak_kisbetuket_szamokat": "The subdomain may contain only lowercase letters, digits and hyphens, and cannot start or end with a hyphen.", + "deploy.konfiguracio_mentve": "Configuration saved", + "deploy.masodperce": "seconds ago...", + "deploy.idotullepes_az_alkalmazas_meg_indulhat": "Timed out — the app may still be starting", + "deploy.a_telepites_idotullepesbe_futott_az": "The install timed out. The app may still be starting.", + "deploy.telepites_sikertelen": "Install failed", + "deploy.a_telepites_nem_sikerult": "The install failed:", + "deploy.naplok_megtekintese": "View logs", + "deploy.alkalmazasok_2": "Apps", + "deploy.kepek_letoltese_kontenerek_inditasa": "Downloading images, starting containers...", + "deploy.kontenerek_elindultak": "Containers started", + "deploy.alkalmazas_kesz": "App ready!", + "deploy.telepites_sikeres": "Install succeeded!", + "deploy.az_alkalmazas_sikeresen_telepitve_es": "The app is installed and running!", + "deploy.allapotjelzo_meg_inicializal": "Health check: still initialising", + "deploy.az_alkalmazas_elindult_de_meg": "The app started, but it is still initialising.", + "deploy.ez_normalis_az_elso_percekben": "This is normal in the first minutes — the app may already be reachable.", + "deploy.a_kontener_leallt": "The container stopped", + "deploy.a_kontener_leallt_ellenorizze_a": "The container stopped. Check the logs.", + "settings_system.beallitasok_rendszer": "Settings — System", + "settings_system.rendszer_konfiguracio": "System configuration", + "settings_system.az_uzemelteto_altal_beallitott_ertekek": "Values set by the operator. Ask the operator to change them.", + "settings_system.ugyfel_neve": "Customer name", + "settings_system.alkalmazas_sablon_forras": "App template source", + "settings_system.sablon_szinkronizalas": "Template sync", + "settings_system.biztonsagi_mentes": "Backup", + "settings_system.aktiv": "Active", + "settings_system.inaktiv": "Inactive", + "settings_system.mentes_utemezes": "Backup schedule", + "settings_system.hub_jelentes": "Hub reporting", + "settings_system.verzio_es_frissites": "Version and update", + "settings_system.jelenlegi_verzio": "Current version", + "settings_system.legujabb_verzio": "Latest version", + "settings_system.frissites_elerheto": "● Update available", + "settings_system.naprakesz": "— up to date", + "settings_system.utolso_ellenorzes": "Last check", + "settings_system.nyilvanos_hitelesites_nelkul": "public (no authentication)", + "settings_system.hitelesitett": "authenticated", + "settings_system.automatikus_frissites": "Automatic update", + "settings_system.minimalis_verzio_uzemelteto": "Minimum version (operator)", + "settings_system.a_rendszer_automatikusan_erre_a": "— the system updates to this version automatically if it is older", + "settings_system.allapot": "Status", + "settings_system.frissites_folyamatban_a_vezerlo_hamarosa": "Update in progress — the controller restarts soon…", + "settings_system.utolso_frissites": "Last update", + "settings_system.sikeres": "Succeeded", + "settings_system.sikertelen": "Failed", + "settings_system.folyamatban": "In progress", + "settings_system.frissites_keresese": "Check for updates", + "settings_system.frissites_telepitese": "Install update", + "settings_system.halozat": "Network", + "settings_system.helyi_cim_lan": "Local address (LAN)", + "settings_system.nem_allapithato_meg": "cannot be determined", + "settings_system.halozati_nev": "Network name", + "settings_system.atjaro": "Gateway", + "settings_system.ezek_az_ertekek_a_helyi": "These values depend on the local network and can change. For remote troubleshooting, we ask you to read out this page.", + "settings_system.szerver_memoria_ram": "Server memory (RAM)", + "settings_system.jelenlegi_memoria": "Current memory", + "settings_system.felhasznalt": "Used", + "settings_system.megengedett_tartomany": "Allowed range", + "settings_system.uj_meret_mb": "New size (MB)", + "settings_system.atmeretezes": "Resize", + "settings_system.a_kiszolgalo_ugynok_jelenleg_nem": "The host agent is not reachable right now — try again later.", + "settings_system.a_memoria_atmeretezesehez_a_kiszolgalo": "Resizing memory needs a system update on the host.", + "settings_system.megerosites": "Confirm", + "settings_system.ellenorzes": "Checking...", + "settings_system.kapcsolodasi_hiba": "Connection error", + "settings_system.vezerlo_frissitese": "Update controller", + "settings_system.frissites": "Update", + "settings_system.biztosan_frissiti_a_controllert_n": "Update the controller?\\n\\nThe dashboard is unreachable for a short time during the update.", + "settings_system.frissites_2": "Updating...", + "settings_system.frissites_folyamatban": "Update in progress...", + "settings_system.ujraindulas": "Restarting...", + "settings_system.ervenytelen_memoria_ertek": "Invalid memory value", + "settings_system.memoria_csokkentese": "Reduce memory", + "settings_system.csokkentes": "Reduce", + "settings_system.a_memoria_csokkentese_hatassal_lehet": "Reducing memory can affect the performance of running apps. Continue?", + "settings_system.atmeretezes_2": "Resizing...", + "settings_system.kesz": "Done.", + "settings_system.a_muvelet_nem_sikerult": "The operation failed", + "settings_system.vezerlo_ujrainditasa": "Restart controller", + "settings_system.ha_a_vezerlo_hibasan_mukodik": "If the controller misbehaves, you can safely restart it here — no need to restart the whole server.\n Your apps keep running; only the controller restarts (a few seconds).", + "settings_system.kiszolgalo_ujrainditasa": "Restart server", + "settings_system.az_egesz_kiszolgalo_szerver_ujrainditasa": "Restarts the whole server. Every app stops for a short time, and the dashboard is unreachable for about 30 seconds. Use it when the whole system needs a restart — otherwise “Restart controller” above is enough.", + "settings_system.biztosan_ujrainditja_a_vezerlot_a": "Restart the controller? It takes a few seconds, and the page is unreachable for a short time.", + "settings_system.ujrainditas_folyamatban_ujracsatlakozas": "Restarting… reconnecting…", + "settings_system.biztosan_ujrainditja_a_kiszolgalot_az": "Restart the server? The apps and the dashboard become unreachable for about 30 seconds.", + "settings_system.ujrainditas_folyamatban_a_vezerlopult_ne": "Restarting… the dashboard reloads in a few seconds.", + "settings_system.az_ujrainditas_a_vartnal_tovabb": "The restart is taking longer than expected. Reload the page by hand.", + "settings_security.beallitasok_biztonsag_es_hozzaferes": "Settings — Security and access", + "settings_security.jelszo_modositas": "Change password", + "settings_security.jelenlegi_jelszo": "Current password", + "settings_security.adja_meg_a_jelenlegi_jelszavat": "Enter your current password", + "settings_security.uj_jelszo": "New password", + "settings_security.legalabb_8_karakter": "At least 8 characters", + "settings_security.uj_jelszo_megerositese": "Confirm new password", + "settings_security.jelszo_megegyszer": "Password again", + "settings_security.jelszo_modositasa": "Change password", + "settings_security.a_jelszavas_vedelem_nincs_beallitva": "Password protection is not set up. Ask the operator to set it up.", + "settings_security.foldrajzi_korlatozas": "Country restriction", + "settings_security.orszag_alapjan_korlatozhato_a_webes": "Access to the web apps can be limited by country with the Cloudflare WAF.", + "settings_security.a_helyi_halozati_hozzaferes_mindig": "Access from the local network is always allowed (it does not pass through Cloudflare).", + "settings_security.a_cloudflare_api_token_nincs": "The Cloudflare API token is not configured. Ask the operator to set it up.
\n The token needs the Zone WAF:Edit permission.", + "settings_security.geo_korlatozas_aktiv": "Country restriction active", + "settings_security.engedelyezett_orszagok_globalis": "Allowed countries (global)", + "settings_security.orszag_keresese": "Search country...", + "settings_security.csak_a_kivalasztott_orszagokbol_erheto": "The system is reachable only from the chosen countries.", + "settings_security.alkalmazas_specifikus_felulirasok": "Per-app overrides", + "settings_security.alkalmazas_kivalasztasa": "— Choose an app —", + "settings_security.hozzaadas": "+ Add", + "settings_security.mentes_es_szinkronizalas": "Save and sync", + "settings_security.kezi_szinkronizalas": "Sync by hand", + "settings_security.utolso_szinkronizalas": "Last sync: {{.GeoLastSync}}", + "settings_security.megerosites": "Confirm", + "settings_security.nincs_talalat": "No match", + "settings_security.figyelem_magyarorszag_eltavolitasa_azt_j": "Warning: removing Hungary means the system is not reachable remotely from a Hungarian IP either. Continue?", + "settings_security.magyarorszag_eltavolitasa_nem_ajanlott_f": "Removing Hungary is not recommended. Continue?", + "settings_security.nincs_alkalmazas_specifikus_beallitas_mi": "No per-app setting. Every app follows the global setting.", + "settings_security.szerkesztes": "Edit", + "settings_security.engedelyezett_orszagok": "Allowed countries:", + "settings_security.kesz": "Done", + "settings_security.mentes": "Saving...", + "settings_security.mentve": "Saved", + "settings_security.halozati_hiba": "Network error", + "settings_security.szinkronizalas_elinditva": "Sync started...", + "settings_security.utolso": "Last:", + "settings_security.veszhelyzeti_informaciok": "Emergency information", + "settings_security.ezeket_az_adatokat_mentse_el": "Keep these details in a safe place. You need them to restore the system after a reinstall.", + "settings_security.visszaallitasi_jelszo": "Retrieval password", + "settings_security.megjelenit": "Show", + "settings_security.tamogatas": "Support", + "settings_security.felhom_eu_kapcsolat": "{{.SupportEmail}}\n  | \n felhom.eu/kapcsolat", + "settings_security.a_visszaallitasi_jelszo_lekerese_nem": "The retrieval password could not be loaded.", + "settings_security.elrejt": "Hide", + "settings_notifications.beallitasok_ertesitesek": "Settings — Notifications", + "settings_notifications.ertesitesek": "Notifications", + "settings_notifications.e_mail_cim": "E-mail address", + "settings_notifications.hibak_es_figyelmeztetesek": "Errors and warnings:", + "settings_notifications.biztonsagi_mentes_sikertelen": "Backup failed", + "settings_notifications.adatbazis_mentes_sikertelen": "Database backup failed", + "settings_notifications.mentes_serules_eszlelve": "Backup damage detected", + "settings_notifications.masodlagos_mentes_sikertelen": "Secondary backup failed", + "settings_notifications.tavoli_mentes_tarhelykeret_figyelmeztete": "Remote backup — storage quota warning", + "settings_notifications.lemez_beteloben_90_felett": "Disk filling up (over 90%)", + "settings_notifications.lemez_megtelt_vagy_meghibasodott": "Disk full or failed", + "settings_notifications.meghajto_levalasztva": "Drive disconnected", + "settings_notifications.szerver_nem_elerheto": "Server not reachable", + "settings_notifications.rendszer_allapot_kritikus": "System health critical", + "settings_notifications.elvart_fajlmentes_elmaradt": "Expected file backup missed", + "settings_notifications.elvart_adatbazismentes_elmaradt": "Expected database backup missed", + "settings_notifications.alkalmazas_nem_fut": "App not running", + "settings_notifications.tajekoztato": "For information:", + "settings_notifications.meghajto_ujra_csatlakoztatva": "Drive connected again", + "settings_notifications.rendszer_allapot_helyreallt": "System health recovered", + "settings_notifications.ertesitesi_szunet": "Notification pause", + "settings_notifications.ora_azonos_problema_eseten_ennyi": "hours (for the same problem, no new message is sent for this long)", + "settings_notifications.mentes": "Save", + "settings_notifications.teszt_email_kuldese": "Send test e-mail", + "settings_notifications.az_ertesitesek_a_kozponti_rendszeren": "Notifications work through the central system, which is not turned on right now.", + "settings_notifications.alkalmazas_email": "App e-mail", + "settings_notifications.az_alkalmazasok_a_felhom_on": "Apps can send e-mail through Felhom (for example password resets, invitations),\n without setting up a separate e-mail provider. Each app’s sender address is its own\n <app>@felhom.eu address.", + "settings_notifications.alkalmazas_email_engedelyezese": "Allow app e-mail", + "settings_notifications.felado_neve_opcionalis": "Sender name (optional)", + "settings_notifications.pl_a_haztartas_neve": "for example the household name", + "settings_notifications.ez_jelenik_meg_a_kimeno": "This appears as the sender of outgoing e-mails, next to the app name.", + "settings_notifications.bekapcsolas_utan_az_egyes_alkalmazasokna": "After turning it on, allow sending e-mail for each app too (on the app’s page).", + "stacks.mind": "All", + "app_export.folyamat": "Progress", + "app_import.titkos": "Encrypted", + "monitoring.processzor": "Processor", + "deploy.hamarosan": "Coming soon", + "deploy.az_adatai_itt_voltak": "Its data was here: {{.RestoreRecordedDrive}}.", + "deploy.aldomain_placeholder": "subdomain", + "settings_security.figyelem": "Warning", + "settings_notifications.pelda_email": "example@email.com", + "page.title.dashboard": "Dashboard", + "page.title.stacks": "Apps", + "page.title.monitoring": "System monitor", + "page.title.settings": "Settings", + "page.title.settings_notifications": "Notifications", + "page.title.settings_security": "Security and access", + "func.infra.cloudflared.description": "Secure internet connection — the server is reachable from outside without opening ports.", + "func.infra.traefik.description": "Traffic router (reverse proxy) — sends each request to the right app.", + "func.infra.filebrowser.description": "File manager — browse the storage files from your browser.", + "func.infra.samba.display": "Network sharing", + "func.infra.samba.description": "File sharing on the local network — the folders appear in Windows Explorer and the Mac Finder." } diff --git a/controller/internal/i18n/locales/hu.json b/controller/internal/i18n/locales/hu.json index b2022ad..b1f0da2 100644 --- a/controller/internal/i18n/locales/hu.json +++ b/controller/internal/i18n/locales/hu.json @@ -1,4 +1,20 @@ { + "common.bezaras": "Bezárás", + "common.elavult": "Elavult", + "common.eltavolitas": "Eltávolítás", + "common.hdd_szukseges": "HDD szükséges", + "common.hiba": "Hiba", + "common.hiba_kettospont": "Hiba:", + "common.hiba_tortent": "Hiba történt", + "common.jelszo": "Jelszó", + "common.levalasztva": "Leválasztva", + "common.magyar_felulet": "Magyar felület", + "common.megsem": "Mégsem", + "common.pi_kompatibilis": "Pi kompatibilis", + "common.rendszer_gyoker": "Rendszer (/)", + "common.torles": "Törlés", + "common.ugyfel_azonosito": "Ügyfél azonosító", + "common.ujrainditas": "Újraindítás", "layout.html_lang": "hu", "launcher.inditopult": "Indítópult", "launcher.inditopult_megosztasa": "Indítópult megosztása", @@ -10,7 +26,6 @@ "launcher.megosztas": "Megosztás…", "launcher.qr_kod_a_megosztasi_linkhez": "QR-kód a megosztási linkhez", "launcher.olvassa_be_telefonnal_a_gyors": "Olvassa be telefonnal a gyors megnyitáshoz.", - "launcher.jelszo": "Jelszó", "launcher.a_megosztas_jelszoval_vedett": "A megosztás jelszóval védett.", "launcher.jelszo_torlese": "Jelszó törlése", "launcher.jelszo_nem_kotelezo": "Jelszó (nem kötelező)", @@ -21,7 +36,6 @@ "launcher.biztosan_kikapcsolja_a_megosztast_a": "Biztosan kikapcsolja a megosztást? A link azonnal érvénytelenné válik.", "launcher.megosztas_kikapcsolasa": "Megosztás kikapcsolása", "launcher.a_megosztas_jelenleg_ki_van": "A megosztás jelenleg ki van kapcsolva.", - "launcher.bezaras": "Bezárás", "launcher.megosztas_bekapcsolasa": "Megosztás bekapcsolása", "launcher.masolva": "Másolva", "launcher.inditopult_2": "Indítópult — {{.Domain}}", @@ -30,8 +44,6 @@ "backups.kijelolod_ezt_a_meghajtot_a": "Kijelölöd ezt a meghajtót a rendszermentés helyéül?", "backups.kijelolom": "Kijelölöm", "backups.tarhely_attekintes": "Tárhely áttekintés", - "backups.rendszer": "Rendszer (/)", - "backups.levalasztva": "Leválasztva", "backups.db_mentesek": "DB mentések", "backups.fajl": "{{len .Backup.DumpFiles}} fájl", "backups.rendszermentes_teljes_mentes": "Rendszermentés (teljes mentés)", @@ -68,9 +80,7 @@ "backups.beagyazott_db_k_a_kotetmentesben": "beágyazott DB-k a kötetmentésben", "backups.elinditod_a_teljes_rendszermentest_most": "Elindítod a teljes rendszermentést most? A mentés alatt az alkalmazások leállnak — általában néhány perc, nagyobb adatnál több.", "backups.mentes_inditasa": "Mentés indítása…", - "backups.hiba": "Hiba", "backups.mentes_folyamatban": "Mentés folyamatban…", - "backups.hiba_2": "Hiba:", "backups.allapot": "Állapot:", "backups.a_rendszermentes_elkeszult": "A rendszermentés elkészült.", "backups.a_mentes_sikertelen": "A mentés sikertelen.", @@ -79,20 +89,15 @@ "backups.a_meghajto_kijelolve_a_beallitas": "A meghajtó kijelölve. A beállítás a host-ügynök következő újraindulása után lép életbe.", "backups.a_meghajto_kijelolve": "A meghajtó kijelölve.", "app_info.alkalmazasok": "← Alkalmazások", - "app_info.elavult": "Elavult", "app_info.megnyitas": "Megnyitás ↗", "app_info.naplo": "Napló", - "app_info.torles": "Törlés", "app_info.exportalas": "Exportálás", "app_info.beallitasok": "Beállítások", "app_info.telepites": "Telepítés", "app_info.mentesek": "Mentések", "app_info.hianyzo_tarhely": "Hiányzó tárhely:", "app_info.ennek_az_alkalmazasnak_az_adattaroloja": "Ennek az alkalmazásnak az adattárolója jelenleg nem elérhető, ezért le van állítva. Csatlakoztasd újra a meghajtót, vagy helyezd át az adatokat egy másik tárhelyre.", - "app_info.hdd_szukseges": "HDD szükséges", - "app_info.pi_kompatibilis": "Pi kompatibilis", "app_info.csak_x86": "Csak x86", - "app_info.magyar_felulet": "Magyar felület", "app_info.az_alkalmazas_fejlesztoje_felhagyott_a": "Az alkalmazás fejlesztője felhagyott a fejlesztéssel. A telepített verzió továbbra is használható,\n de frissítések és biztonsági javítások már nem érkeznek hozzá.", "app_info.hova_tegyem_a_fajlokat": "Hova tegyem a fájlokat?", "app_info.ezeket_a_mappakat_a_fajlkezeloben": "Ezeket a mappákat a Fájlkezelőben éred el. Előfordulhat, hogy először be kell jelentkezned a Fájlkezelőbe.", @@ -113,14 +118,12 @@ "app_info.athelyezed_a_z": "Áthelyezed a(z)", "app_info.adatait_ide": "adatait ide:", "app_info.az_alkalmazas_rovid_idore_leall": "? Az alkalmazás rövid időre leáll. A régi adatok csak sikeres áthelyezés után törlődnek.", - "app_info.hiba": "Hiba:", "app_info.ismeretlen": "ismeretlen", "app_info.mire_hasznalhato": "Mire használható?", "app_info.elso_lepesek": "Első lépések", "app_info.elofeltetelek": "Előfeltételek", "app_info.kezdeti_belepesi_adatok": "Kezdeti belépési adatok", "app_info.felhasznalonev": "Felhasználónév", - "app_info.jelszo": "Jelszó", "app_info.az_uzemelteto_allitotta_be": "az üzemeltető állította be", "app_info.megjelenites": "Megjelenítés", "app_info.masolas": "Másolás", @@ -169,7 +172,6 @@ "layout.ez_az_alkalmazas_mar_telepitve": "Ez az alkalmazás már telepítve van.", "layout.frissites": "↻ Frissítés...", "layout.sablonok_frissitve": "Sablonok frissítve", - "layout.hiba": "Hiba:", "layout.ismeretlen_hiba": "Ismeretlen hiba", "layout.halozati_hiba": "Hálózati hiba:", "layout.folyamatban": "Folyamatban...", @@ -180,11 +182,7 @@ "layout.alkalmazas_torlese": "Alkalmazás törlése:", "layout.ez_a_muvelet_eltavolitja_a": "Ez a művelet eltávolítja a konténereket, a köteteket és a konfigurációs fájlokat.", "layout.ez_a_muvelet_nem_visszavonhato": "Ez a művelet nem visszavonható!", - "layout.megsem": "Mégsem", - "layout.torles": "Törlés", - "layout.hiba_2": "Hiba", "layout.nem_sikerult_lekerni_az_adatokat": "Nem sikerült lekérni az adatokat:", - "layout.bezaras": "Bezárás", "layout.torles_folyamatban": "Törlés folyamatban...", "layout.torolt_adatok": "Törölt adatok:", "layout.megorzott_adatok": "Megőrzött adatok:", @@ -202,7 +200,6 @@ "layout.az_ejszakai_restic_pillanatkepek_nem": "Az éjszakai restic pillanatképek nem törölhetők egyenként — a megőrzési szabályok szerint automatikusan elavulnak.", "layout.alkalmazas_eltavolitasa": "Alkalmazás eltávolítása:", "layout.az_alkalmazas_visszaall_nincs_telepitve": "Az alkalmazás visszaáll \"Nincs telepítve\" állapotba. A sablon megmarad, újratelepíthető.", - "layout.eltavolitas": "Eltávolítás", "layout.eltavolitas_folyamatban": "Eltávolítás folyamatban...", "layout.torolt_mentesek": "Törölt mentések:", "layout.nem_torolt_mentesek": "Nem törölt mentések:", @@ -233,5 +230,473 @@ "func.restore_status.restoring": "Visszaállítás...", "func.restore_status.done": "Kész", "func.restore_status.failed": "Sikertelen", - "func.restore_status.skipped": "Kihagyva" + "func.restore_status.skipped": "Kihagyva", + "dashboard.vezerlopult": "Vezérlőpult", + "dashboard.futo_alkalmazas": "Futó alkalmazás", + "dashboard.leallitva": "Leállítva", + "dashboard.osszes_alkalmazas": "Összes alkalmazás", + "dashboard.memoria": "Memória", + "dashboard.homerseklet": "Hőmérséklet", + "dashboard.nem_ismert": "nem ismert", + "dashboard.a_tarhely_merete_most_nem": "A tárhely mérete most nem olvasható ki.", + "dashboard.fogyoban_a_hely": "Fogyóban a hely", + "dashboard.kritikusan_keves_hely": "Kritikusan kevés hely", + "dashboard.lemezek_allapota": "Lemezek állapota", + "dashboard.nincs_adat": "Nincs adat", + "dashboard.biztonsagi_mentes": "Biztonsági mentés", + "dashboard.utolso_mentes": "Utolsó mentés:", + "dashboard.sikertelen": "Sikertelen", + "dashboard.meg_nem_futott": "Még nem futott", + "dashboard.adatbazisok": "Adatbázisok:", + "dashboard.mentve": "{{len .DBDumpStatus.Results}} mentve", + "dashboard.telepitett_alkalmazasok": "Telepített alkalmazások", + "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.hianyzo_tarhely": "Hiányzó tárhely: {{$ms}}", + "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.memoria_elfogyott": "Memória elfogyott", + "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.halozati_tarhely_hibas_az_alkalmazas": "Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja", + "dashboard.a_halozati_tarhely_nas_jelenleg": "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.", + "dashboard.halozati_tarhely_nem_elerheto": "Hálózati tárhely nem elérhető: {{$nw}}", + "dashboard.a_proxy_traefik_csak_egeszseges": "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.", + "dashboard.url_nem_elerheto": "URL nem elérhető", + "dashboard.vedett": "Védett", + "dashboard.megnyitas": "Megnyitás", + "dashboard.telepites": "Telepítés", + "dashboard.leallitas": "Leállítás", + "dashboard.inditas": "Indítás", + "dashboard.naplo": "Napló", + "dashboard.nincs_elerheto_alkalmazas": "Nincs elérhető alkalmazás.", + "stacks.alkalmazasok": "Alkalmazások", + "stacks.alkalmazas_visszaallitasa_exportalt_csom": "Alkalmazás visszaállítása exportált csomagból", + "stacks.importalas": "Importálás", + "stacks.sablonok_frissitese_a_kozponti_katalogus": "Sablonok frissítése a központi katalógusból", + "stacks.sablonok_frissitese": "↻ Sablonok frissítése", + "stacks.futo": "Futó", + "stacks.leallitva": "Leállítva", + "stacks.telepitheto": "Telepíthető", + "stacks.a_proxy_traefik_csak_egeszseges": "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 nem érhető el (404), pedig a konténer fut.", + "stacks.url_nem_elerheto_utvonal_nincs": "URL nem elérhető – útvonal nincs publikálva", + "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.hianyzo_tarhely": "Hiányzó tárhely: {{$ms}}", + "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.halozati_tarhely_hibas_az_alkalmazas": "Hálózati tárhely hibás — az alkalmazás nem a NAS-t látja", + "stacks.a_halozati_tarhely_nas_jelenleg": "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.", + "stacks.halozati_tarhely_nem_elerheto": "Hálózati tárhely nem elérhető: {{$nw}}", + "stacks.adattarolo": "Adattároló: {{index $.StorageLabels .Name}}", + "stacks.vedett_rendszerkomponens": "Védett rendszerkomponens", + "stacks.reszletek": "Részletek", + "stacks.telepites": "Telepítés", + "stacks.mentesek": "Mentések", + "stacks.frissites": "Frissítés", + "stacks.leallitas": "Leállítás", + "stacks.inditas": "Indítás", + "stacks.naplok": "Naplók", + "logs.vissza": "← Vissza", + "logs.naplok": "{{.Stack.Meta.DisplayName}} — Naplók", + "logs.elo": "Élő", + "logs.szuneteltetes": "Szüneteltetés", + "logs.frissites": "Frissítés", + "logs.szunetelve": "Szünetelve", + "logs.folytatas": "Folytatás", + "monitoring.rendszermonitor": "Rendszermonitor", + "monitoring.szerver_allapota_gazdagep": "Szerver állapota (gazdagép)", + "monitoring.a_gazdagep_metrikai_jelenleg_nem": "A gazdagép metrikái jelenleg nem elérhetők.", + "monitoring.cpu_hasznalat": "CPU használat", + "monitoring.terheles_load": "Terhelés (load)", + "monitoring.memoria": "Memória", + "monitoring.cpu_homerseklet": "CPU hőmérséklet", + "monitoring.uzemido": "Üzemidő", + "monitoring.tarolok_kapacitasa": "Tárolók kapacitása", + "monitoring.rendszer_attekintes": "Rendszer áttekintés", + "monitoring.gepnev": "Gépnév", + "monitoring.operacios_rendszer": "Operációs rendszer", + "monitoring.inditas": "Indítás", + "monitoring.tarhely": "Tárhely", + "monitoring.hub_kapcsolat": "Hub kapcsolat", + "monitoring.kapcsolodva_a_kozponti_rendszer_aktivan": "Kapcsolódva — a központi rendszer aktívan figyeli a szervert.", + "monitoring.nem_elerheto_a_kozponti_rendszer": "Nem elérhető — a központi rendszer nem kapott friss jelentést.", + "monitoring.utolso_sikeres_jelentes": "Utolsó sikeres jelentés", + "monitoring.utolso_hiba": "Utolsó hiba", + "monitoring.a_hub_kapcsolat_nincs_bekapcsolva": "A Hub kapcsolat nincs bekapcsolva — a központi monitoring nem aktív.", + "monitoring.rendszer_metrikak": "Rendszer metrikák", + "monitoring.1_ora": "1 óra", + "monitoring.6_ora": "6 óra", + "monitoring.24_ora": "24 óra", + "monitoring.7_nap": "7 nap", + "monitoring.30_nap": "30 nap", + "monitoring.cpu_hasznalat_2": "CPU használat (%)", + "monitoring.memoria_hasznalat_gb": "Memória használat (GB)", + "monitoring.homerseklet_c": "Hőmérséklet (°C)", + "monitoring.terheles_load_average": "Terhelés (Load Average)", + "monitoring.meg_nincsenek_adatok_a_metrikak": "Még nincsenek adatok. A metrikák gyűjtése elindult, az első adatok néhány perc múlva megjelennek.", + "monitoring.memoria_eloszlas": "Memória eloszlás", + "monitoring.alkalmazas_eroforrasok": "Alkalmazás erőforrások", + "monitoring.memoria_hasznalat_mb": "Memória használat (MB)", + "monitoring.meg_nincsenek_kontener_adatok": "Még nincsenek konténer adatok.", + "monitoring.memoria_mb": "Memória (MB)", + "monitoring.hasznalt": "Használt:", + "monitoring.rendszer_title": "Rendszer:", + "monitoring.rendszer_2": "Rendszer (", + "monitoring.szabad": "Szabad (", + "monitoring.eroforras_elozmenyek": "— Erőforrás előzmények", + "monitoring.nincs_tarolo_adat": "Nincs tároló adat.", + "monitoring.nem_elerheto": "Nem elérhető", + "monitoring.kopas": "kopás:", + "monitoring.frissitve": "Frissítve:", + "monitoring.nap": "nap,", + "monitoring.ora": "óra", + "monitoring.ora_2": "óra,", + "monitoring.perc": "perc", + "app_import.alkalmazasok": "← Alkalmazások", + "app_import.alkalmazas_importalas": "Alkalmazás importálás", + "app_import.fab_csomag_feltoltese_huzza_ide": ".fab csomag feltöltése — húzza ide, vagy válassza ki a fájlt", + "app_import.fajl_kivalasztasa": "Fájl kiválasztása", + "app_import.feltoltes_0": "Feltöltés: 0%", + "app_import.megszakitas": "Megszakítás", + "app_import.nem_talalhato_fab_csomag_a": "Nem található .fab csomag a regisztrált tárolókon.", + "app_import.exportalj_egy_alkalmazast_az_alkalmazas": "Exportálj egy alkalmazást az alkalmazás oldaláról, tölts fel egy .fab fájlt itt fent, vagy másolj egyet a {tároló}/felhom-data/exports/ könyvtárba.", + "app_import.alkalmazas": "Alkalmazás", + "app_import.datum": "Dátum", + "app_import.meret": "Méret", + "app_import.tarolo": "Tároló", + "app_import.reszletek": "Részletek »", + "app_import.csomag_reszletei": "Csomag részletei", + "app_import.ez_a_csomag_jelszoval_vedett": "Ez a csomag jelszóval védett. Kérlek add meg a jelszót:", + "app_import.megnyitas": "Megnyitás", + "app_import.alkalmazas_2": "Alkalmazás:", + "app_import.exportalva": "Exportálva:", + "app_import.controller_verzio": "Controller verzió:", + "app_import.adatbazis": "Adatbázis:", + "app_import.adatok": "Adatok:", + "app_import.meret_2": "Méret:", + "app_import.figyelem_a_meglevo": "⚠ FIGYELEM: A meglévő", + "app_import.alkalmazas_konfiguracioja_es_osszes_adat": "alkalmazás konfigurációja és összes adata felül lesz írva!", + "app_import.visszaallitas_inditasa": "Visszaállítás indítása", + "app_import.importalas_folyamata": "Importálás folyamata", + "app_import.importalas_kesz": "Importálás kész!", + "app_import.az_alkalmazas_sikeresen_visszaallitva": "Az alkalmazás sikeresen visszaállítva.", + "app_import.alkalmazasok_megtekintese": "Alkalmazások megtekintése", + "app_import.hibas_jelszo": "Hibás jelszó", + "app_import.csomag_reszletei_2": "— Csomag részletei", + "app_import.nincs": "Nincs", + "app_import.alkalmazas_megtekintese": "Alkalmazás megtekintése", + "app_import.a_feltoltes_megszakadt_ellenorizze_a": "A feltöltés megszakadt — ellenőrizze a kapcsolatot, majd próbálja újra.", + "app_import.feltoltes": "Feltöltés:", + "app_import.csak_fab_fajl_toltheto_fel": "Csak .fab fájl tölthető fel.", + "app_import.feltoltes_kesz": "Feltöltés kész:", + "app_export.alkalmazasok": "← Alkalmazások", + "app_export.exportalas": "{{.Stack.Meta.DisplayName}} — Exportálás", + "app_export.mentes_helye": "Mentés helye", + "app_export.valassz_tarolot": "Válassz tárolót...", + "app_export.konfiguracio": "Konfiguráció:", + "app_export.felhasznaloi_adatok": "Felhasználói adatok:", + "app_export.osszesen": "Összesen:", + "app_export.szabad": "(szabad: -)", + "app_export.becsult_ido": "Becsült idő:", + "app_export.mindig_resze_a_mentesnek": "Mindig része a mentésnek:", + "app_export.valaszthato_tartalom": "Választható tartalom:", + "app_export.a_kihagyott_mappak_tartalma_a": "A kihagyott mappák tartalma a Fájlkezelőben bármikor elérhető, és külön is lementhető.", + "app_export.kihagyott_tartalom_megjelenitese": "Kihagyott tartalom megjelenítése", + "app_export.jelszo_opcionalis": "Jelszó (opcionális)", + "app_export.titkositasi_jelszo": "Titkosítási jelszó", + "app_export.jelszo_mutatasa": "Jelszó mutatása", + "app_export.alkalmazas_leallitasa_mentes_elott_ajanl": "Alkalmazás leállítása mentés előtt (ajánlott)", + "app_export.az_adatok_konzisztenciaja_erdekeben_java": "Az adatok konzisztenciája érdekében javasolt leállítani az alkalmazást mentés közben.", + "app_export.exportalas_inditasa": "Exportálás indítása", + "app_export.kesz": "Kész!", + "app_export.megnyitas_filebrowser_ben": "Megnyitás FileBrowser-ben ↗", + "app_export.szabad_2": "(szabad:", + "app_export.perc": "perc", + "app_export.nincs_eleg_szabad_hely_a": "Nincs elég szabad hely a kiválasztott tárolón!", + "app_export.alap_mentes": "Alap mentés: ~", + "app_export.a_kihagyott_nagy_meretu_tartalommal": ". A kihagyott, nagy méretű tartalommal együtt: ~", + "app_export.kihagyott_tartalom_elrejtese": "Kihagyott tartalom elrejtése", + "deploy.vissza": "← Vissza", + "deploy.beallitasok": "Beállítások", + "deploy.telepites": "Telepítés", + "deploy.leallitas": "Leállítás", + "deploy.inditas": "Indítás", + "deploy.megnyitas": "Megnyitás ↗", + "deploy.reszletek": "Részletek", + "deploy.reszletes_leiras_kepernyokepek": "Részletes leírás, képernyőképek", + "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.adattarolas": "Adattárolás", + "deploy.tarhely": "Tárhely", + "deploy.adatmeret": "Adatméret", + "deploy.szabad_hely": "Szabad hely", + "deploy.szabad": "{{.StorageInfo.FreeHuman}} ({{printf \"%.0f\" .StorageInfo.FreePercent}}% szabad)", + "deploy.mozgatas_masik_tarolora": "Mozgatás másik tárolóra", + "deploy.korabbi_adatok": "Korábbi adatok", + "deploy.az_alkalmazas_adatainak_masolata_megtala": "Az alkalmazás adatainak másolata megtalálható egy másik tárolón is.\n Ez általában áthelyezés után marad hátra.", + "deploy.meret": "Méret", + "deploy.mappak": "Mappák", + "deploy.korabbi_adatok_torlese": "Korábbi adatok törlése", + "deploy.biztonsagi_mentes": "Biztonsági mentés", + "deploy.az_alkalmazas_adatbazisa_es_docker": "Az alkalmazás adatbázisa és Docker kötetei automatikusan bekerülnek az éjszakai biztonsági mentésbe.\n Mentési állapot → · Mentési beállítások →", + "deploy.integraciok": "Integrációk", + "deploy.mas_telepitett_alkalmazasokkal_valo_ossz": "Más telepített alkalmazásokkal való összekapcsolás. Az integráció automatikusan felfüggesztődik, ha bármelyik alkalmazás leáll, és újraaktiválódik indításkor.", + "deploy.nincs_telepitve": "Nincs telepítve", + "deploy.celalkalmazas_leallitva": "Célalkalmazás leállítva", + "deploy.aktiv": "Aktív", + "deploy.a_celalkalmazas_nincs_telepitve": "A célalkalmazás nincs telepítve", + "deploy.a_celalkalmazas_nem_fut": "A célalkalmazás nem fut", + "deploy.halozati_hiba": "Hálózati hiba", + "deploy.foldrajzi_korlatozas": "Földrajzi korlátozás", + "deploy.az_alkalmazas_egyeni_orszagkorlatozas_ne": "Az alkalmazás egyéni országkorlátozás nélkül a globális beállítást követi.", + "deploy.egyeni_orszagkorlatozas": "Egyéni országkorlátozás", + "deploy.engedelyezett_orszagok_ehhez_az_alkalmaz": "Engedélyezett országok ehhez az alkalmazáshoz", + "deploy.orszag_keresese": "Ország keresése...", + "deploy.mentes": "Mentés", + "deploy.nincs_talalat": "Nincs találat", + "deploy.mentve": "Mentve", + "deploy.opcionalis_beallitasok": "Opcionális beállítások", + "deploy.regisztracios_utmutato": "Regisztrációs útmutató ↗", + "deploy.mentes_2": "Mentés...", + "deploy.email_kuldes": "Email-küldés", + "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: {{.AppEmailFromAddress}}.", + "deploy.az_alkalmazas_email_jelenleg_ki": "Az alkalmazás-email jelenleg ki van kapcsolva globálisan. Kapcsold be a\n Beállítások oldalon, hogy itt is működjön.", + "deploy.email_kuldes_engedelyezese_ennel_az": "Email-küldés engedélyezése ennél az alkalmazásnál", + "deploy.a_mentes_ujrainditja_az_alkalmazast": "A mentés újraindítja az alkalmazást.", + "deploy.nincs_eleg_memoria_foglalas_telepites": "Nincs elég memória! Foglalás telepítés után: {{.AfterMB}} MB / {{.UsableMB}} MB", + "deploy.memoria": "Memória", + "deploy.jelenlegi_hasznalat_mb": "Jelenlegi használat: {{.UsedMB}} MB", + "deploy.jelenlegi_hasznalat_mb_2": "Jelenlegi használat ({{.UsedMB}} MB)", + "deploy.az_alkalmazasok_csucsterhelese_meghaladh": "Az alkalmazások csúcsterhelése meghaladhatja a rendelkezésre álló memóriát.\n Normál használat mellett ez nem okoz problémát.", + "deploy.ennek_az_alkalmazasnak_van_korabbi": "Ennek az alkalmazásnak van korábbi mentése, ezért az alábbi mezőket a saját mentése alapján töltöttük ki.", + "deploy.korabbi_webcim": "Korábbi webcím: {{.RestoreRecordedAddress}}.", + "deploy.ha_most_mashova_szeretned_telepiteni": "Ha most máshová szeretnéd telepíteni, nyugodtan átírhatod — a visszaállítás előtt jelezni fogjuk az eltérést.", + "deploy.az_alkalmazas_adatai_az_alabb": "Az alkalmazás adatai az alább kiválasztott adatmeghajtóra kerülnek.", + "deploy.hol_lesznek_az_adatok_ennel": "Hol lesznek az adatok: ennél az alkalmazásnál nincs külön adatmeghajtó-választás,\n ezért az adatai a rendszermeghajtóra kerülnek ({{.SystemDataPath}}). A mentései így is elkészülnek.", + "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.automatikusan_generalt_ertekek": "Automatikusan generált értékek", + "deploy.ezek_az_ertekek_automatikusan_jottek": "Ezek az értékek automatikusan jöttek létre a telepítéskor.", + "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.automatikusan_generalva": "Automatikusan generálva", + "deploy.megjelenites": "Megjelenítés", + "deploy.telepites_utan_nem_modosithato": "telepítés után nem módosítható", + "deploy.az_aldomain_telepites_utan_nem": "Az aldomain telepítés után nem módosítható. Megváltoztatáshoz az alkalmazás eltávolítása és újratelepítése szükséges (minden adat törlődik).", + "deploy.generalas": "Generálás", + "deploy.telepiteskor_beallitott_kezdeti_jelszo_h": "Telepítéskor beállított kezdeti jelszó — ha az alkalmazásban megváltoztattad, az itt nem frissül.", + "deploy.jelszo_megerositese": "Jelszó megerősítése", + "deploy.igen": "Igen", + "deploy.szabad_2": "{{.Label}} — {{.FreeHuman}} szabad", + "deploy.alapertelmezett": "(alapértelmezett)", + "deploy.nem_elerheto": "{{$.CurrentHDDPath}} (nem elérhető)", + "deploy.a_kivalasztott_tarhely_majdnem_megtelt": "A kiválasztott tárhely majdnem megtelt.", + "deploy.a_kivalasztott_meghajton_az_alkalmazas": "A kiválasztott meghajtón az alkalmazás fájljai (média, dokumentumok) tárolódnak.\n Az adatbázis a gyors belső SSD-n fut — és az alkalmazással együtt készül róla biztonsági mentés.", + "deploy.nincs_regisztralt_adattarolo_adja_meg": "Nincs regisztrált adattároló — adja meg kézzel az útvonalat", + "deploy.nincs_eleg_szabad_tarhely": "Nincs elég szabad tárhely", + "deploy.nincs_eleg_memoria": "Nincs elég memória", + "deploy.telepites_inditasa": "Telepítés indítása", + "deploy.telepites_folyamatban": "Telepítés folyamatban...", + "deploy.konfiguracio_mentese": "Konfiguráció mentése...", + "deploy.kontener_ek_inditasa": "Konténer(ek) indítása...", + "deploy.alkalmazas_inicializalasa": "Alkalmazás inicializálása...", + "deploy.alkalmazas_megnyitasa": "Alkalmazás megnyitása ↗", + "deploy.elso_lepesek": "Első lépések", + "deploy.masolas": "Másolás", + "deploy.bejelentkezes": "Bejelentkezés", + "deploy.dokumentacio": "Dokumentáció ↗", + "deploy.beallitasok_es_jelszavak_megtekintese": "Beállítások és jelszavak megtekintése", + "deploy.alkalmazasok": "← Alkalmazások", + "deploy.a_lekeres_nem_sikerult": "A lekérés nem sikerült.", + "deploy.elrejtes": "Elrejtés", + "deploy.masolva": "Másolva!", + "deploy.biztosan_torolni_szeretned_a_korabbi": "Biztosan törölni szeretnéd a korábbi adatokat? Tárhely:", + "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.utolso_figyelmeztetes_a_torles_visszavon": "UTOLSÓ FIGYELMEZTETÉS! A törlés visszavonhatatlan. Biztosan folytatod?", + "deploy.torles_folyamatban": "Törlés folyamatban...", + "deploy.ismeretlen_hiba": "Ismeretlen hiba", + "deploy.korabbi_adatok_torolve_n_nfelszabaditott": "Korábbi adatok törölve!\\n\\nFelszabadított hely:", + "deploy.n_nnehany_hiba_tortent_n": "\\n\\nNéhány hiba történt:\\n", + "deploy.halozati_hiba_2": "Hálózati hiba:", + "deploy.kotelezo_mezo": "Kötelező mező:", + "deploy.nhasznalja_a_generalas_gombot_vagy": "\\nHasználja a Generálás gombot vagy írjon be egy jelszót.", + "deploy.a_ket_jelszo_nem_egyezik": "A két jelszó nem egyezik:", + "deploy.az_aldomain_csak_kisbetuket_szamokat": "Az aldomain csak kisbetűket, számokat és kötőjelet tartalmazhat, és nem kezdődhet/végződhet kötőjellel.", + "deploy.konfiguracio_mentve": "Konfiguráció mentve", + "deploy.masodperce": "másodperce...", + "deploy.idotullepes_az_alkalmazas_meg_indulhat": "Időtúllépés — az alkalmazás még indulhat", + "deploy.a_telepites_idotullepesbe_futott_az": "A telepítés időtúllépésbe futott. Az alkalmazás még indulhat.", + "deploy.telepites_sikertelen": "Telepítés sikertelen", + "deploy.a_telepites_nem_sikerult": "A telepítés nem sikerült:", + "deploy.naplok_megtekintese": "Naplók megtekintése", + "deploy.alkalmazasok_2": "Alkalmazások", + "deploy.kepek_letoltese_kontenerek_inditasa": "Képek letöltése, konténerek indítása...", + "deploy.kontenerek_elindultak": "Konténerek elindultak", + "deploy.alkalmazas_kesz": "Alkalmazás kész!", + "deploy.telepites_sikeres": "Telepítés sikeres!", + "deploy.az_alkalmazas_sikeresen_telepitve_es": "Az alkalmazás sikeresen telepítve és fut!", + "deploy.allapotjelzo_meg_inicializal": "Állapotjelző: még inicializál", + "deploy.az_alkalmazas_elindult_de_meg": "Az alkalmazás elindult, de még inicializálódik.", + "deploy.ez_normalis_az_elso_percekben": "Ez normális az első percekben — az alkalmazás már elérhető lehet.", + "deploy.a_kontener_leallt": "A konténer leállt", + "deploy.a_kontener_leallt_ellenorizze_a": "A konténer leállt. Ellenőrizze a naplókat.", + "settings_system.beallitasok_rendszer": "Beállítások — Rendszer", + "settings_system.rendszer_konfiguracio": "Rendszer konfiguráció", + "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.ugyfel_neve": "Ügyfél neve", + "settings_system.alkalmazas_sablon_forras": "Alkalmazás sablon forrás", + "settings_system.sablon_szinkronizalas": "Sablon szinkronizálás", + "settings_system.biztonsagi_mentes": "Biztonsági mentés", + "settings_system.aktiv": "Aktív", + "settings_system.inaktiv": "Inaktív", + "settings_system.mentes_utemezes": "Mentés ütemezés", + "settings_system.hub_jelentes": "Hub jelentés", + "settings_system.verzio_es_frissites": "Verzió és frissítés", + "settings_system.jelenlegi_verzio": "Jelenlegi verzió", + "settings_system.legujabb_verzio": "Legújabb verzió", + "settings_system.frissites_elerheto": "● Frissítés elérhető", + "settings_system.naprakesz": "— naprakész", + "settings_system.utolso_ellenorzes": "Utolsó ellenőrzés", + "settings_system.nyilvanos_hitelesites_nelkul": "nyilvános (hitelesítés nélkül)", + "settings_system.hitelesitett": "hitelesített", + "settings_system.automatikus_frissites": "Automatikus frissítés", + "settings_system.minimalis_verzio_uzemelteto": "Minimális verzió (üzemeltető)", + "settings_system.a_rendszer_automatikusan_erre_a": "— a rendszer automatikusan erre a verzióra frissít, ha régebbi", + "settings_system.allapot": "Állapot", + "settings_system.frissites_folyamatban_a_vezerlo_hamarosa": "Frissítés folyamatban — a vezérlő hamarosan újraindul…", + "settings_system.utolso_frissites": "Utolsó frissítés", + "settings_system.sikeres": "Sikeres", + "settings_system.sikertelen": "Sikertelen", + "settings_system.folyamatban": "Folyamatban", + "settings_system.frissites_keresese": "Frissítés keresése", + "settings_system.frissites_telepitese": "Frissítés telepítése", + "settings_system.halozat": "Hálózat", + "settings_system.helyi_cim_lan": "Helyi cím (LAN)", + "settings_system.nem_allapithato_meg": "nem állapítható meg", + "settings_system.halozati_nev": "Hálózati név", + "settings_system.atjaro": "Átjáró", + "settings_system.ezek_az_ertekek_a_helyi": "Ezek az értékek a helyi hálózattól függenek és változhatnak. Távoli hibaelhárításnál ezt az oldalt kérjük felolvasni.", + "settings_system.szerver_memoria_ram": "Szerver memória (RAM)", + "settings_system.jelenlegi_memoria": "Jelenlegi memória", + "settings_system.felhasznalt": "Felhasznált", + "settings_system.megengedett_tartomany": "Megengedett tartomány", + "settings_system.uj_meret_mb": "Új méret (MB)", + "settings_system.atmeretezes": "Átméretezés", + "settings_system.a_kiszolgalo_ugynok_jelenleg_nem": "A kiszolgáló ügynök jelenleg nem elérhető — próbáld meg később.", + "settings_system.a_memoria_atmeretezesehez_a_kiszolgalo": "A memória átméretezéséhez a kiszolgáló rendszerfrissítése szükséges.", + "settings_system.megerosites": "Megerősítés", + "settings_system.ellenorzes": "Ellenőrzés...", + "settings_system.kapcsolodasi_hiba": "Kapcsolódási hiba", + "settings_system.vezerlo_frissitese": "Vezérlő frissítése", + "settings_system.frissites": "Frissíté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.frissites_2": "Frissítés...", + "settings_system.frissites_folyamatban": "Frissítés folyamatban...", + "settings_system.ujraindulas": "Újraindulás...", + "settings_system.ervenytelen_memoria_ertek": "Érvénytelen memória érték", + "settings_system.memoria_csokkentese": "Memória csökkentése", + "settings_system.csokkentes": "Csökkentés", + "settings_system.a_memoria_csokkentese_hatassal_lehet": "A memória csökkentése hatással lehet a futó alkalmazások teljesítményére. Biztosan folytatod?", + "settings_system.atmeretezes_2": "Átméretezés...", + "settings_system.kesz": "Kész.", + "settings_system.a_muvelet_nem_sikerult": "A művelet nem sikerült", + "settings_system.vezerlo_ujrainditasa": "Vezérlő újraindítása", + "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.kiszolgalo_ujrainditasa": "Kiszolgáló újraindítása", + "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.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.ujrainditas_folyamatban_ujracsatlakozas": "Újraindítás folyamatban… újracsatlakozás…", + "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.ujrainditas_folyamatban_a_vezerlopult_ne": "Újraindítás folyamatban… a vezérlőpult néhány másodperc múlva újratölt.", + "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_security.beallitasok_biztonsag_es_hozzaferes": "Beállítások — Biztonság és hozzáférés", + "settings_security.jelszo_modositas": "Jelszó módosítás", + "settings_security.jelenlegi_jelszo": "Jelenlegi jelszó", + "settings_security.adja_meg_a_jelenlegi_jelszavat": "Adja meg a jelenlegi jelszavát", + "settings_security.uj_jelszo": "Új jelszó", + "settings_security.legalabb_8_karakter": "Legalább 8 karakter", + "settings_security.uj_jelszo_megerositese": "Új jelszó megerősítése", + "settings_security.jelszo_megegyszer": "Jelszó mégegyszer", + "settings_security.jelszo_modositasa": "Jelszó módosítása", + "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.foldrajzi_korlatozas": "Földrajzi korlátozás", + "settings_security.orszag_alapjan_korlatozhato_a_webes": "Ország alapján korlátozható a webes alkalmazások elérése a Cloudflare WAF segítségével.", + "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_cloudflare_api_token_nincs": "A Cloudflare API token nincs konfigurálva. Kérd az üzemeltetőt a beállításhoz.
\n A tokennek Zone WAF:Edit jogosultsággal kell rendelkeznie.", + "settings_security.geo_korlatozas_aktiv": "Geo-korlátozás aktív", + "settings_security.engedelyezett_orszagok_globalis": "Engedélyezett országok (globális)", + "settings_security.orszag_keresese": "Ország keresése...", + "settings_security.csak_a_kivalasztott_orszagokbol_erheto": "Csak a kiválasztott országokból érhető el a rendszer.", + "settings_security.alkalmazas_specifikus_felulirasok": "Alkalmazás-specifikus felülírások", + "settings_security.alkalmazas_kivalasztasa": "— Alkalmazás kiválasztása —", + "settings_security.hozzaadas": "+ Hozzáadás", + "settings_security.mentes_es_szinkronizalas": "Mentés és szinkronizálás", + "settings_security.kezi_szinkronizalas": "Kézi szinkronizálás", + "settings_security.utolso_szinkronizalas": "Utolsó szinkronizálás: {{.GeoLastSync}}", + "settings_security.megerosites": "Megerősítés", + "settings_security.nincs_talalat": "Nincs találat", + "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.magyarorszag_eltavolitasa_nem_ajanlott_f": "Magyarország eltávolítása nem ajánlott. Folytatja?", + "settings_security.nincs_alkalmazas_specifikus_beallitas_mi": "Nincs alkalmazás-specifikus beállítás. Minden alkalmazás a globális beállítást követi.", + "settings_security.szerkesztes": "Szerkesztés", + "settings_security.engedelyezett_orszagok": "Engedélyezett országok:", + "settings_security.kesz": "Kész", + "settings_security.mentes": "Mentés...", + "settings_security.mentve": "Mentve", + "settings_security.halozati_hiba": "Hálózati hiba", + "settings_security.szinkronizalas_elinditva": "Szinkronizálás elindítva...", + "settings_security.utolso": "Utolsó:", + "settings_security.veszhelyzeti_informaciok": "Vészhelyzeti információk", + "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.visszaallitasi_jelszo": "Visszaállítási jelszó", + "settings_security.megjelenit": "Megjelenít", + "settings_security.tamogatas": "Támogatás", + "settings_security.felhom_eu_kapcsolat": "{{.SupportEmail}}\n  | \n felhom.eu/kapcsolat", + "settings_security.a_visszaallitasi_jelszo_lekerese_nem": "A visszaállítási jelszó lekérése nem sikerült.", + "settings_security.elrejt": "Elrejt", + "settings_notifications.beallitasok_ertesitesek": "Beállítások — Értesítések", + "settings_notifications.ertesitesek": "Értesítések", + "settings_notifications.e_mail_cim": "E-mail cím", + "settings_notifications.hibak_es_figyelmeztetesek": "Hibák és figyelmeztetések:", + "settings_notifications.biztonsagi_mentes_sikertelen": "Biztonsági mentés sikertelen", + "settings_notifications.adatbazis_mentes_sikertelen": "Adatbázis mentés sikertelen", + "settings_notifications.mentes_serules_eszlelve": "Mentés sérülés észlelve", + "settings_notifications.masodlagos_mentes_sikertelen": "Másodlagos mentés sikertelen", + "settings_notifications.tavoli_mentes_tarhelykeret_figyelmeztete": "Távoli mentés — tárhelykeret-figyelmeztetés", + "settings_notifications.lemez_beteloben_90_felett": "Lemez betelőben (90% felett)", + "settings_notifications.lemez_megtelt_vagy_meghibasodott": "Lemez megtelt vagy meghibásodott", + "settings_notifications.meghajto_levalasztva": "Meghajtó leválasztva", + "settings_notifications.szerver_nem_elerheto": "Szerver nem elérhető", + "settings_notifications.rendszer_allapot_kritikus": "Rendszer állapot kritikus", + "settings_notifications.elvart_fajlmentes_elmaradt": "Elvárt fájlmentés elmaradt", + "settings_notifications.elvart_adatbazismentes_elmaradt": "Elvárt adatbázismentés elmaradt", + "settings_notifications.alkalmazas_nem_fut": "Alkalmazás nem fut", + "settings_notifications.tajekoztato": "Tájékoztató:", + "settings_notifications.meghajto_ujra_csatlakoztatva": "Meghajtó újra csatlakoztatva", + "settings_notifications.rendszer_allapot_helyreallt": "Rendszer állapot helyreállt", + "settings_notifications.ertesitesi_szunet": "Értesítési szünet", + "settings_notifications.ora_azonos_problema_eseten_ennyi": "óra (azonos probléma esetén ennyi ideig nem küld újat)", + "settings_notifications.mentes": "Mentés", + "settings_notifications.teszt_email_kuldese": "Teszt email küldése", + "settings_notifications.az_ertesitesek_a_kozponti_rendszeren": "Az értesítések a központi rendszeren keresztül működnek, ami jelenleg nincs bekapcsolva.", + "settings_notifications.alkalmazas_email": "Alkalmazás-email", + "settings_notifications.az_alkalmazasok_a_felhom_on": "Az alkalmazások a Felhom-on keresztül küldhetnek emailt (pl. jelszó-visszaállítás, meghívók),\n külön email-szolgáltató beállítása nélkül. A feladó címe minden alkalmazásnál a saját\n <alkalmazás>@felhom.eu címe lesz.", + "settings_notifications.alkalmazas_email_engedelyezese": "Alkalmazás-email engedélyezése", + "settings_notifications.felado_neve_opcionalis": "Feladó neve (opcionális)", + "settings_notifications.pl_a_haztartas_neve": "pl. a háztartás neve", + "settings_notifications.ez_jelenik_meg_a_kimeno": "Ez jelenik meg a kimenő emailek feladójaként az alkalmazás neve mellett.", + "settings_notifications.bekapcsolas_utan_az_egyes_alkalmazasokna": "Bekapcsolás után az egyes alkalmazásoknál is engedélyezni kell az email-küldést (az alkalmazás oldalán).", + "stacks.mind": "Mind", + "app_export.folyamat": "Folyamat", + "app_import.titkos": "Titkos", + "monitoring.processzor": "Processzor", + "deploy.hamarosan": "Hamarosan", + "deploy.az_adatai_itt_voltak": "Az adatai itt voltak: {{.RestoreRecordedDrive}}.", + "deploy.aldomain_placeholder": "aldomain", + "settings_security.figyelem": "Figyelem", + "settings_notifications.pelda_email": "pelda@email.hu", + "page.title.dashboard": "Vezérlőpult", + "page.title.stacks": "Alkalmazások", + "page.title.monitoring": "Rendszermonitor", + "page.title.settings": "Beállítások", + "page.title.settings_notifications": "Értesítések", + "page.title.settings_security": "Biztonság és hozzáférés", + "func.infra.cloudflared.description": "Biztonságos internetkapcsolat — a szerver portnyitás nélkül érhető el kívülről.", + "func.infra.traefik.description": "Forgalomirányító (reverse proxy) — a kéréseket a megfelelő alkalmazáshoz irányítja.", + "func.infra.filebrowser.description": "Fájlkezelő — a tárhely fájljainak böngészése a böngészőből.", + "func.infra.samba.display": "Hálózati megosztás", + "func.infra.samba.description": "Fájlmegosztás a helyi hálózaton — a mappák a Windows Intézőben és a Mac Finderben jelennek meg." } diff --git a/controller/internal/web/dashboard_diskknown_test.go b/controller/internal/web/dashboard_diskknown_test.go index 2fa9d71..ab4c45b 100644 --- a/controller/internal/web/dashboard_diskknown_test.go +++ b/controller/internal/web/dashboard_diskknown_test.go @@ -20,7 +20,7 @@ import ( // now hit twice (R-262, and the OOB fixture in hub v0.99.0). func diskMeterBlock(t *testing.T) string { t.Helper() - raw, err := templateFS.ReadFile("templates/dashboard.html") + raw, err := huTemplateSource("templates/dashboard.html") if err != nil { t.Fatalf("read dashboard.html: %v", err) } diff --git a/controller/internal/web/handlers.go b/controller/internal/web/handlers.go index c79ccf7..b9e6729 100644 --- a/controller/internal/web/handlers.go +++ b/controller/internal/web/handlers.go @@ -176,6 +176,7 @@ func (s *Server) dashboardHandler(w http.ResponseWriter, r *http.Request) { sysInfo := system.GetInfo(s.primaryHDDPath(), s.cpuCollector) data := s.baseData("dashboard", "Vezérlőpult") + data["TitleKey"] = "page.title.dashboard" // i18n: the Hungarian title above is what hu renders s.addRecoveryBanner(data, r) // R-241: the reminder bar, per visit data["SettingsWarning"] = s.settings.LoadWarning // non-empty if settings.json was recovered from corruption data["Stacks"] = deployedStacks @@ -356,6 +357,7 @@ func visibleCatalogStacks(in []stacks.Stack) []stacks.Stack { func (s *Server) stacksHandler(w http.ResponseWriter, r *http.Request) { data := s.baseData("stacks", "Alkalmazások") + data["TitleKey"] = "page.title.stacks" // i18n: the Hungarian title above is what hu renders allStacks := visibleCatalogStacks(s.stackMgr.GetStacks()) data["Stacks"] = allStacks data["MissingStorage"] = s.missingStorageMap(allStacks) @@ -793,6 +795,7 @@ func (s *Server) appDetailHandler(w http.ResponseWriter, r *http.Request, slug s func (s *Server) monitoringHandler(w http.ResponseWriter, r *http.Request) { data := s.baseData("monitoring", "Rendszermonitor") + data["TitleKey"] = "page.title.monitoring" // i18n: the Hungarian title above is what hu renders data["SystemInfo"] = system.GetInfo(s.primaryHDDPath(), s.cpuCollector) data["StorageBars"] = s.buildStorageBars() @@ -2043,6 +2046,7 @@ func (s *Server) settingsBaseData(page, title string) map[string]interface{} { // controller + server restart. func (s *Server) systemPageData() map[string]interface{} { data := s.settingsBaseData("settings", "Beállítások") + data["TitleKey"] = "page.title.settings" // i18n: the Hungarian title above is what hu renders data["GitRepoURL"] = s.cfg.Git.RepoURL data["GitSyncInterval"] = s.cfg.Git.SyncInterval data["BackupEnabled"] = s.cfg.Backup.Enabled @@ -2157,6 +2161,7 @@ func (s *Server) networkStoragePageData() map[string]interface{} { // notificationsPageData builds the Értesítések subpage: notification prefs + app-email. func (s *Server) notificationsPageData() map[string]interface{} { data := s.settingsBaseData("settings-notifications", "Értesítések") + data["TitleKey"] = "page.title.settings_notifications" // i18n: the Hungarian title above is what hu renders data["HubEnabled"] = s.cfg.Hub.Enabled data["NotificationPrefs"] = s.settings.GetNotificationPrefs() @@ -2173,6 +2178,7 @@ func (s *Server) notificationsPageData() map[string]interface{} { // emergency/recovery info. func (s *Server) securityPageData() map[string]interface{} { data := s.settingsBaseData("settings-security", "Biztonság és hozzáférés") + data["TitleKey"] = "page.title.settings_security" // i18n: the Hungarian title above is what hu renders // Recovery info for emergency section. // diff --git a/controller/internal/web/i18n_parity_test.go b/controller/internal/web/i18n_parity_test.go index f19567d..b95d5f6 100644 --- a/controller/internal/web/i18n_parity_test.go +++ b/controller/internal/web/i18n_parity_test.go @@ -35,6 +35,7 @@ import ( // TestI18nParity fails naming the page and the first differing line. var updateI18nGolden = flag.Bool("update-i18n-golden", false, "write MISSING testdata/i18n_parity fixtures from the current templates (an existing fixture is never overwritten)") +var i18nDumpDir = flag.String("i18n-dump-dir", "", "TestI18nEnglishPages: also write every case's hu and en render to this directory (evidence, per-page review)") var i18nGoldenOnly = flag.String("i18n-golden-only", "", "with -update-i18n-golden: only cases whose name matches this regexp") var relativeAgeRe = regexp.MustCompile(`\d+ (napja|órája|perce)`) @@ -52,6 +53,12 @@ func i18nFixtureTime() time.Time { return time.Date(2026, 9, 14, 3, 12, 0, 0, ti var i18nTitleKeys = map[string]string{ "Indítópult": "page.title.launcher", "Biztonsági mentés": "page.title.backups", + "Vezérlőpult": "page.title.dashboard", + "Alkalmazások": "page.title.stacks", + "Rendszermonitor": "page.title.monitoring", + "Beállítások": "page.title.settings", + "Értesítések": "page.title.settings_notifications", + "Biztonság és hozzáférés": "page.title.settings_security", } func i18nLayoutData(page, title string) map[string]interface{} { @@ -376,7 +383,7 @@ func fixtureStrings(v reflect.Value, out map[string]bool) { } } -var i18nKeyLikeRe = regexp.MustCompile(`\b(launcher|backups|backups_shared|app_info|layout|func)\.[a-z0-9_]+\b`) +var i18nKeyLikeRe = regexp.MustCompile(`\b[a-z][a-z_]*\.[a-z0-9_.]+\b`) var emptyElemRe = regexp.MustCompile(`<(h[1-6]|button|label|li|strong|option|p)(\s[^>]*)?>\s*`) // TestI18nEnglishPages — the three pages in English: no Hungarian letter from the TEMPLATE copy, no @@ -395,14 +402,22 @@ func TestI18nEnglishPages(t *testing.T) { for _, c := range i18nCases() { hu := renderI18nCase(t, s, "hu", c) en := renderI18nCase(t, s, "en", c) + if *i18nDumpDir != "" { + _ = os.MkdirAll(*i18nDumpDir, 0o755) + _ = os.WriteFile(filepath.Join(*i18nDumpDir, c.name+".hu.html"), []byte(hu), 0o644) + _ = os.WriteFile(filepath.Join(*i18nDumpDir, c.name+".en.html"), []byte(en), 0o644) + } if !huLetter(hu) { t.Fatalf("%s: positive control failed — the Hungarian render carries no Hungarian letter", c.name) } if strings.Contains(en, `{{T `) { t.Errorf("%s: an unexpanded marker reached the English page", c.name) } - if m := i18nKeyLikeRe.FindString(en); m != "" && s.i18n.Has(i18n.Default, m) { - t.Errorf("%s: a raw bundle key reached the English page: %q", c.name, m) + for _, m := range i18nKeyLikeRe.FindAllString(en, -1) { + if s.i18n.Has(i18n.Default, m) { + t.Errorf("%s: a raw bundle key reached the English page: %q", c.name, m) + break + } } if a, b := len(emptyElemRe.FindAllString(hu, -1)), len(emptyElemRe.FindAllString(en, -1)); b > a { t.Errorf("%s: English has %d empty elements, Hungarian %d — a translation rendered blank", c.name, b, a) diff --git a/controller/internal/web/i18n_web.go b/controller/internal/web/i18n_web.go index 9e7764d..7e21699 100644 --- a/controller/internal/web/i18n_web.go +++ b/controller/internal/web/i18n_web.go @@ -129,6 +129,22 @@ func (s *Server) localeFuncs(lang string) template.FuncMap { } return lt.Format("2006-01-02") + " " + hm }, + // infraMeta: the protected infra stacks' curated identity (inframeta.go). Names that are product + // names stay; descriptions — and samba's display name — come from the bundle. + "infraMeta": func(name string) *InfraMeta { + m := infraMetaFor(name) + if m == nil { + return nil + } + out := *m + if v, _, ok := b.Text(lang, "func.infra."+name+".description"); ok { + out.Description = v + } + if v, _, ok := b.Text(lang, "func.infra."+name+".display"); ok { + out.DisplayName = v + } + return &out + }, "statusText": func(status string) string { switch status { case "pending", "restoring", "done", "failed", "skipped": diff --git a/controller/internal/web/i18n_wiring_test.go b/controller/internal/web/i18n_wiring_test.go index 740ad13..d994786 100644 --- a/controller/internal/web/i18n_wiring_test.go +++ b/controller/internal/web/i18n_wiring_test.go @@ -156,6 +156,15 @@ func TestLocaleFuncsHungarianBundleMatchesFuncMap(t *testing.T) { if got, want := b.Msg("hu", "func.time.yesterday"), timeAgo(now.Add(-30*time.Hour)); got != want { t.Errorf("yesterday: %q vs %q", got, want) } + // infraMeta (slice 1): the Hungarian bundle carries the same curated words as inframeta.go. + for name, m := range infraMetaMap { + if got := b.Msg("hu", "func.infra."+name+".description"); got != m.Description { + t.Errorf("infra %s description: hu.json %q, inframeta.go %q", name, got, m.Description) + } + if k := "func.infra." + name + ".display"; b.Has("hu", k) && b.Msg("hu", k) != m.DisplayName { + t.Errorf("infra %s display: hu.json %q, inframeta.go %q", name, b.Msg("hu", k), m.DisplayName) + } + } // And the English funcs really are English. en := s.localeFuncs("en") if got := en["timeAgo"].(func(time.Time) string)(now.Add(-time.Minute - time.Second)); got != "1 minute ago" { @@ -238,3 +247,19 @@ func TestLanguageSwitch_EndToEnd(t *testing.T) { t.Error("back on Hungarian: the page must be Hungarian with no switch") } } + +// huTemplateSource returns an embedded template AS THE HUNGARIAN SET PARSES IT — markers expanded. Tests +// that assert on a template's Hungarian wording read this, never the raw file: since slice 1 the +// wording lives in hu.json, and a raw read would find a marker where the sentence used to be. +func huTemplateSource(name string) ([]byte, error) { + raw, err := templateFS.ReadFile(name) + if err != nil { + return nil, err + } + b, err := i18n.Shared() + if err != nil { + return nil, err + } + out, _ := b.Expand(i18n.Default, string(raw)) + return []byte(out), nil +} diff --git a/controller/internal/web/networkstub_test.go b/controller/internal/web/networkstub_test.go index fa7aed2..847f2bd 100644 --- a/controller/internal/web/networkstub_test.go +++ b/controller/internal/web/networkstub_test.go @@ -92,7 +92,7 @@ func TestNetworkStorageWarningsIn_UnreachableAloneUnchanged(t *testing.T) { // must never reuse the recoverable-unreachable copy; the unreachable line stays byte-identical). func TestNetworkBadgeTemplates_DistinctStrings(t *testing.T) { for _, tpl := range []string{"templates/dashboard.html", "templates/stacks.html"} { - body, err := os.ReadFile(tpl) + body, err := huTemplateSource(tpl) if err != nil { t.Fatal(err) } diff --git a/controller/internal/web/settings_split_test.go b/controller/internal/web/settings_split_test.go index 68db62c..fd8910d 100644 --- a/controller/internal/web/settings_split_test.go +++ b/controller/internal/web/settings_split_test.go @@ -114,7 +114,7 @@ func TestSettingsSectionInventory(t *testing.T) { } var union strings.Builder for _, f := range []string{"settings_system.html", "settings_notifications.html", "settings_security.html", "storage.html", "storage_network.html"} { - b, err := templateFS.ReadFile("templates/" + f) + b, err := huTemplateSource("templates/" + f) if err != nil { t.Fatalf("read %s: %v", f, err) } @@ -224,7 +224,7 @@ func TestStorageNoNativeConfirm(t *testing.T) { // allow the pre-existing type-to-confirm overlay helper names allow := regexp.MustCompile(`openConfirm|__closeConfirm|confirmEject|confirmWipe|typeToConfirm|confirm-`) for _, f := range []string{"storage.html", "storage_network.html", "settings_system.html", "settings_notifications.html", "settings_security.html"} { - b, err := templateFS.ReadFile("templates/" + f) + b, err := huTemplateSource("templates/" + f) if err != nil { t.Fatalf("read %s: %v", f, err) } @@ -239,7 +239,7 @@ func TestStorageNoNativeConfirm(t *testing.T) { // TestStorageAgentDownNote (D1 Scenario C, static): the enrichment JS has an error path that // renders the exact warn note into #agent-warn-note (graceful degradation when the agent is down). func TestStorageAgentDownNote(t *testing.T) { - b, err := templateFS.ReadFile("templates/storage.html") + b, err := huTemplateSource("templates/storage.html") if err != nil { t.Fatal(err) } @@ -282,7 +282,7 @@ func TestNoEmojiInTemplates(t *testing.T) { if !strings.HasSuffix(e.Name(), ".html") { continue } - b, err := templateFS.ReadFile("templates/" + e.Name()) + b, err := huTemplateSource("templates/" + e.Name()) if err != nil { t.Fatal(err) } diff --git a/controller/internal/web/storage_handlers_test.go b/controller/internal/web/storage_handlers_test.go index bb76064..1fcfa3a 100644 --- a/controller/internal/web/storage_handlers_test.go +++ b/controller/internal/web/storage_handlers_test.go @@ -342,7 +342,7 @@ func TestStorageInit_PollsAgentFormatStatusOnTimeout(t *testing.T) { // /storage, not /settings. One assertion per template. func TestStorageWizardBackAnchors_PointToStorage(t *testing.T) { for _, file := range []string{"templates/storage_init.html", "templates/storage_attach.html"} { - b, err := templateFS.ReadFile(file) + b, err := huTemplateSource(file) if err != nil { t.Fatalf("read %s: %v", file, err) } diff --git a/controller/internal/web/templates/app_export.html b/controller/internal/web/templates/app_export.html index c3a1d8d..5496c2a 100644 --- a/controller/internal/web/templates/app_export.html +++ b/controller/internal/web/templates/app_export.html @@ -3,15 +3,15 @@
-

Mentés helye

+

{{T "app_export.mentes_helye"}}

- + +
diff --git a/controller/internal/web/templates/logs.html b/controller/internal/web/templates/logs.html index 2850dbc..03e4572 100644 --- a/controller/internal/web/templates/logs.html +++ b/controller/internal/web/templates/logs.html @@ -1,18 +1,18 @@ {{define "logs"}} {{template "layout_start" .}}
{{.Logs}}
- Élő + {{T "logs.elo"}} - - + +