i18n slice 1 release C: storage, sharing, sign-in, guest, catch-all and debug pages in English
- 11 templates converted (storage, storage_network, storage_init, storage_attach, sharing, login,
claim, launcher_shared, launcher_share_password, catchall, debug); every key translated.
Six ASCII-only Hungarian JS fragments the extractor missed were found by eye and converted by hand
(", majd a(z)", "FIGYELEM:", "jelenlegi:", "mp", "p", " db").
- login, claim, both guest share pages and the catch-all render through executeTemplateLang (the
household language; no session CSRF, no escrow reminder). renderLogin now takes the request.
- Page titles: TitleKey for storage, network storage, the two drive wizards and sharing.
TestHandlerTitleKeysMatchHungarianTitle pins handler literal == hu.json value for every TitleKey.
- Tests: TestDirectRenderHandlersFollowLanguage (real routes, en + hu),
TestI18nDirectRenderPagesHaveNoAdminChrome (escrow reminder due; none on the guest page).
- Fixture correction: the release C cases had invented page titles; the cases now carry the handlers'
real titles (and the wizard pages their real page name), and those 12 fixtures were RE-CAPTURED from
the unconverted templates at 0555091. The diff to the old fixtures is the <title> line (and the nav
highlight on the two wizard pages) only.
- i18n gate: HU_FORMAL_CEILING 12 -> 16 — four more „ön" forms in the converted copy, unchanged by rule (R-516).
Hungarian: byte-identical (TestI18nParity against fixtures from unconverted templates).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -3,52 +3,50 @@
|
||||
|
||||
<div class="page-header">
|
||||
<div style="display:flex;align-items:center;gap:.5rem">
|
||||
<a href="/storage" class="btn btn-sm btn-outline">← Vissza</a>
|
||||
<h2>Meglévő meghajtó csatolása</h2>
|
||||
<a href="/storage" class="btn btn-sm btn-outline">{{T "storage_attach.vissza"}}</a>
|
||||
<h2>{{T "storage_attach.meglevo_meghajto_csatolasa"}}</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-card">
|
||||
<h3>1. Meghajtó kiválasztása</h3>
|
||||
<p class="settings-card-desc">Válassza ki a már fájlrendszerrel rendelkező meghajtót.
|
||||
<strong>A meghajtón lévő adatok nem törlődnek</strong> — a csatolás csak elérhetővé teszi azokat.</p>
|
||||
<h3>{{T "storage_attach.1_meghajto_kivalasztasa"}}</h3>
|
||||
<p class="settings-card-desc">{{T "storage_attach.valassza_ki_a_mar_fajlrendszerrel"}}</p>
|
||||
<div id="disk-error" class="alert alert-error" style="display:none;margin-bottom:1rem"></div>
|
||||
<div id="disk-list">Betöltés…</div>
|
||||
<div id="disk-list">{{T "storage_attach.betoltes"}}</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-card" id="cfg-card" style="display:none">
|
||||
<h3>2. Konfiguráció</h3>
|
||||
<h3>{{T "storage_attach.2_konfiguracio"}}</h3>
|
||||
<form id="attach-form" onsubmit="return submitAttach(event)">
|
||||
<div class="form-group">
|
||||
<label>Kiválasztott eszköz</label>
|
||||
<label>{{T "storage_attach.kivalasztott_eszkoz"}}</label>
|
||||
<span class="settings-value mono" id="sel-device">—</span>
|
||||
</div>
|
||||
<!-- R-280: an already-mounted store has no mount name to choose — it is already at its path,
|
||||
and the action is to register that path. The group is hidden for those. -->
|
||||
<div class="form-group" id="mount-name-group">
|
||||
<label for="mount-name">Csatlakoztatási név <span class="required">*</span></label>
|
||||
<label for="mount-name">{{T "storage_attach.csatlakoztatasi_nev"}} <span class="required">*</span></label>
|
||||
<div style="display:flex;align-items:center;gap:.25rem">
|
||||
<span class="mono" style="opacity:.6">/mnt/</span>
|
||||
<input type="text" id="mount-name" class="form-control" placeholder="hdd_1"
|
||||
pattern="[a-zA-Z0-9_-]+" required style="max-width:180px">
|
||||
</div>
|
||||
<span class="form-hint">A meghajtó a /mnt/<név> útvonalra kerül.</span>
|
||||
<span class="form-hint">{{T "storage_attach.a_meghajto_a_mnt_nev"}}</span>
|
||||
</div>
|
||||
<p class="form-hint" id="mounted-note" style="display:none">
|
||||
Ez a meghajtó már csatlakoztatva van, csak a gép nem tartja nyilván. A „Csatolás" a
|
||||
meglévő helyén veszi nyilvántartásba — <strong>semmi nem törlődik</strong>.
|
||||
{{T "storage_attach.ez_a_meghajto_mar_csatlakoztatva"}}
|
||||
</p>
|
||||
<div class="form-group">
|
||||
<label for="storage-label">Megnevezés</label>
|
||||
<input type="text" id="storage-label" class="form-control" placeholder="Külső HDD 1TB" maxlength="50">
|
||||
<label for="storage-label">{{T "storage_attach.megnevezes"}}</label>
|
||||
<input type="text" id="storage-label" class="form-control" placeholder="{{T "storage_attach.kulso_hdd_1tb"}}" maxlength="50">
|
||||
</div>
|
||||
<label class="toggle" style="margin-bottom:1.25rem">
|
||||
<input type="checkbox" id="set-default">
|
||||
<span class="toggle-label">Beállítás alapértelmezett adattárolóként új telepítéseknél</span>
|
||||
<span class="toggle-label">{{T "storage_attach.beallitas_alapertelmezett_adattarolokent"}}</span>
|
||||
</label>
|
||||
<div class="form-actions" style="gap:.75rem">
|
||||
<button type="submit" class="btn btn-primary" id="attach-btn">Csatolás</button>
|
||||
<a href="/settings" class="btn btn-outline">Mégsem</a>
|
||||
<button type="submit" class="btn btn-primary" id="attach-btn">{{T "storage_attach.csatolas"}}</button>
|
||||
<a href="/settings" class="btn btn-outline">{{T "storage_attach.megsem"}}</a>
|
||||
</div>
|
||||
<div id="attach-result" style="margin-top:1rem"></div>
|
||||
</form>
|
||||
@@ -69,9 +67,9 @@ async function loadDisks(){
|
||||
// carrying a mountable ext4/xfs FS (mounted + bound, NO format — data preserved). The agent's filter
|
||||
// excludes OS/enrolled/claimed disks, so we trust the list as-is.
|
||||
var r = await fetch('/api/disks/candidates'); var j = await r.json();
|
||||
if(!j.ok){ throw new Error(j.error||'Hiba'); }
|
||||
if(!j.ok){ throw new Error(j.error||'{{T "storage_attach.hiba"}}'); }
|
||||
var cands = (j.data&&j.data.attach)||[];
|
||||
if(cands.length===0){ document.getElementById('disk-list').innerHTML='<p class="form-hint">Nincs csatolható meghajtó — a csatoláshoz olyan (még nem használt) meghajtó kell, amelyen már van fájlrendszer. Új, üres meghajtóhoz használja az „Inicializálás” lehetőséget.</p>'; return; }
|
||||
if(cands.length===0){ document.getElementById('disk-list').innerHTML='<p class="form-hint">{{T "storage_attach.nincs_csatolhato_meghajto_a_csatolashoz"}}</p>'; return; }
|
||||
var html='<div class="drive-list">';
|
||||
cands.forEach(function(d,i){
|
||||
var title = d.model ? esc(d.model) : esc(d.device);
|
||||
@@ -88,11 +86,11 @@ async function loadDisks(){
|
||||
html+='<label class="drive-card role-user-data is-selectable" id="dc-'+i+'">'
|
||||
+'<div class="drive-card-top"><div class="drive-select"><input type="radio" name="disk" value="'+esc(dev)+'" data-fs="'+esc(d.fstype)+'" data-i="'+i+'" data-mounted="'+(mounted?'1':'')+'" onchange="pickDisk(this)">'
|
||||
+'<div class="drive-id"><span class="drive-name">'+title+'</span><span class="drive-sub">'+sub+'</span></div></div>'
|
||||
+'<div class="drive-badges">'+(mounted?'<span class="badge badge-ok">Már csatlakoztatva</span>':'<span class="badge badge-ok">Fájlrendszer: '+esc(d.fstype)+'</span>')+'</div></div></label>';
|
||||
+'<div class="drive-badges">'+(mounted?'<span class="badge badge-ok">{{T "storage_attach.mar_csatlakoztatva"}}</span>':'<span class="badge badge-ok">{{T "storage_attach.fajlrendszer"}} '+esc(d.fstype)+'</span>')+'</div></div></label>';
|
||||
});
|
||||
html+='</div>';
|
||||
document.getElementById('disk-list').innerHTML=html;
|
||||
}catch(e){ var el=document.getElementById('disk-error'); el.style.display='block'; el.textContent='Meghajtók betöltése sikertelen: '+e.message; }
|
||||
}catch(e){ var el=document.getElementById('disk-error'); el.style.display='block'; el.textContent='{{T "storage_attach.meghajtok_betoltese_sikertelen"}} '+e.message; }
|
||||
}
|
||||
|
||||
function pickDisk(radio){
|
||||
@@ -114,7 +112,7 @@ function pickDisk(radio){
|
||||
async function submitAttach(ev){
|
||||
ev.preventDefault();
|
||||
var btn=document.getElementById('attach-btn'); var out=document.getElementById('attach-result');
|
||||
btn.disabled=true; out.innerHTML='<p class="form-hint">Csatlakoztatás folyamatban…</p>';
|
||||
btn.disabled=true; out.innerHTML='<p class="form-hint">{{T "storage_attach.csatlakoztatas_folyamatban"}}</p>';
|
||||
try{
|
||||
// R-280: an already-mounted store is REGISTERED in place. Sending it to /api/storage/attach would
|
||||
// ask the agent to mount an in-guest path as if it were a raw device.
|
||||
@@ -130,9 +128,9 @@ async function submitAttach(ev){
|
||||
}
|
||||
var r=await fetch(url,{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify(body)});
|
||||
var j=await r.json();
|
||||
if(!j.ok){ throw new Error(j.error||'Hiba'); }
|
||||
out.innerHTML='<div class="alert alert-success">A meghajtó sikeresen '+(selMounted?'nyilvántartásba véve':'csatolva és regisztrálva')+': <strong class="mono">'+(j.data.where||'')+'</strong>. <a href="/settings">Vissza a Beállításokhoz →</a></div>';
|
||||
}catch(e){ out.innerHTML='<div class="alert alert-error">Hiba: '+e.message+'</div>'; btn.disabled=false; }
|
||||
if(!j.ok){ throw new Error(j.error||'{{T "storage_attach.hiba"}}'); }
|
||||
out.innerHTML='<div class="alert alert-success">{{T "storage_attach.a_meghajto_sikeresen"}} '+(selMounted?'{{T "storage_attach.nyilvantartasba_veve"}}':'{{T "storage_attach.csatolva_es_regisztralva"}}')+': <strong class="mono">'+(j.data.where||'')+'</strong>{{T "storage_attach.vissza_a_beallitasokhoz"}}</div>';
|
||||
}catch(e){ out.innerHTML='<div class="alert alert-error">{{T "storage_attach.hiba_2"}} '+e.message+'</div>'; btn.disabled=false; }
|
||||
return false;
|
||||
}
|
||||
loadDisks();
|
||||
|
||||
Reference in New Issue
Block a user