diff --git a/copyparty/__main__.py b/copyparty/__main__.py
index e1fcce2f..86d8cdd5 100644
--- a/copyparty/__main__.py
+++ b/copyparty/__main__.py
@@ -1319,6 +1319,7 @@ def add_optouts(ap):
ap2.add_argument("--no-del", action="store_true", help="disable delete operations")
ap2.add_argument("--no-mv", action="store_true", help="disable move/rename operations")
ap2.add_argument("--no-cp", action="store_true", help="disable copy operations")
+ ap2.add_argument("--no-fs-abrt", action="store_true", help="disable ability to abort ongoing copy/move")
ap2.add_argument("-nth", action="store_true", help="no title hostname; don't show \033[33m--name\033[0m in
")
ap2.add_argument("-nih", action="store_true", help="no info hostname -- don't show in UI")
ap2.add_argument("-nid", action="store_true", help="no info disk-usage -- don't show in UI")
@@ -1447,7 +1448,7 @@ def add_thumbnail(ap):
# ffmpeg -hide_banner -demuxers | awk '/^ D /{print$2}' | while IFS= read -r x; do ffmpeg -hide_banner -h demuxer=$x; done | grep -E '^Demuxer |extensions:'
ap2.add_argument("--th-r-pil", metavar="T,T", type=u, default="avif,avifs,blp,bmp,cbz,dcx,dds,dib,emf,eps,epub,fits,flc,fli,fpx,gif,heic,heics,heif,heifs,icns,ico,im,j2p,j2k,jp2,jpeg,jpg,jpx,pbm,pcx,pgm,png,pnm,ppm,psd,qoi,sgi,spi,tga,tif,tiff,webp,wmf,xbm,xpm", help="image formats to decode using pillow")
ap2.add_argument("--th-r-vips", metavar="T,T", type=u, default="avif,exr,fit,fits,fts,gif,hdr,heic,jp2,jpeg,jpg,jpx,jxl,nii,pfm,pgm,png,ppm,svg,tif,tiff,webp", help="image formats to decode using pyvips")
- ap2.add_argument("--th-r-raw", metavar="T,T", type=u, default="arw,cr2,crw,dcr,dng,erf,k25,kdc,mrw,nef,orf,pef,raf,raw,sr2,srf,x3f", help="image formats to decode using rawpy")
+ ap2.add_argument("--th-r-raw", metavar="T,T", type=u, default="arw,cr2,cr3,crw,dcr,dng,erf,k25,kdc,mrw,nef,orf,pef,raf,raw,sr2,srf,x3f", help="image formats to decode using rawpy")
ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,cbz,dds,dib,epub,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,qoi,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg")
ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="3gp,asf,av1,avc,avi,flv,h264,h265,hevc,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,ts,vob,webm,wmv", help="video formats to decode using ffmpeg")
ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,ac3,aif,aiff,alac,alaw,amr,apac,ape,au,bonk,dfpwm,dts,flac,gsm,ilbc,it,itgz,itxz,itz,m4a,mdgz,mdxz,mdz,mo3,mod,mp2,mp3,mpc,mptm,mt2,mulaw,oga,ogg,okt,opus,ra,s3m,s3gz,s3xz,s3z,tak,tta,ulaw,wav,wma,wv,xm,xmgz,xmxz,xmz,xpk", help="audio formats to decode using ffmpeg")
@@ -1570,7 +1571,7 @@ def add_ui(ap, retry):
ap2.add_argument("--localtime", action="store_true", help="default to local timezone instead of UTC")
ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor chi\033[0m")
ap2.add_argument("--theme", metavar="NUM", type=int, default=0, help="default theme to use (0..7)")
- ap2.add_argument("--themes", metavar="NUM", type=int, default=8, help="number of themes installed")
+ ap2.add_argument("--themes", metavar="NUM", type=int, default=10, help="number of themes installed")
ap2.add_argument("--au-vol", metavar="0-100", type=int, default=50, choices=range(0, 101), help="default audio/video volume percent")
ap2.add_argument("--sort", metavar="C,C,C", type=u, default="href", help="default sort order, comma-separated column IDs (see header tooltips), prefix with '-' for descending. Examples: \033[32mhref -href ext sz ts tags/Album tags/.tn\033[0m (volflag=sort)")
ap2.add_argument("--nsort", action="store_true", help="default-enable natural sort of filenames with leading numbers (volflag=nsort)")
diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py
index 72bff45e..a7ff303d 100644
--- a/copyparty/httpcli.py
+++ b/copyparty/httpcli.py
@@ -1987,6 +1987,9 @@ class HttpCli(object):
if "eshare" in self.uparam:
return self.handle_eshare()
+ if "fs_abrt" in self.uparam:
+ return self.handle_fs_abrt()
+
if "application/octet-stream" in ctype:
return self.handle_post_binary()
@@ -5958,7 +5961,9 @@ class HttpCli(object):
self.asrv.vfs.get(vdst, self.uname, False, True, False, True)
wunlink(self.log, dabs, dvn.flags)
- x = self.conn.hsrv.broker.ask("up2k.handle_mv", self.uname, self.ip, vsrc, vdst)
+ x = self.conn.hsrv.broker.ask(
+ "up2k.handle_mv", self.ouparam.get("akey"), self.uname, self.ip, vsrc, vdst
+ )
self.loud_reply(x.get(), status=201)
return True
@@ -5988,10 +5993,21 @@ class HttpCli(object):
self.asrv.vfs.get(vdst, self.uname, False, True, False, True)
wunlink(self.log, dabs, dvn.flags)
- x = self.conn.hsrv.broker.ask("up2k.handle_cp", self.uname, self.ip, vsrc, vdst)
+ x = self.conn.hsrv.broker.ask(
+ "up2k.handle_cp", self.ouparam.get("akey"), self.uname, self.ip, vsrc, vdst
+ )
self.loud_reply(x.get(), status=201)
return True
+ def handle_fs_abrt(self):
+ if self.args.no_fs_abrt:
+ t = "aborting an ongoing copy/move is disabled in server config"
+ raise Pebkac(403, t)
+
+ self.conn.hsrv.broker.say("up2k.handle_fs_abrt", self.uparam["fs_abrt"])
+ self.loud_reply("aborting", status=200)
+ return True
+
def tx_ls(self, ls: dict[str, Any]) -> bool:
dirs = ls["dirs"]
files = ls["files"]
diff --git a/copyparty/svchub.py b/copyparty/svchub.py
index a6f87a85..950122d0 100644
--- a/copyparty/svchub.py
+++ b/copyparty/svchub.py
@@ -39,9 +39,9 @@ from .th_srv import (
HAVE_FFPROBE,
HAVE_HEIF,
HAVE_PIL,
+ HAVE_RAW,
HAVE_VIPS,
HAVE_WEBP,
- HAVE_RAW,
ThumbSrv,
)
from .up2k import Up2k
diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py
index b37591c6..945c6d56 100644
--- a/copyparty/th_srv.py
+++ b/copyparty/th_srv.py
@@ -113,14 +113,17 @@ except:
try:
if os.environ.get("PRTY_NO_VIPS"):
- raise Exception()
+ raise ImportError()
HAVE_VIPS = True
import pyvips
logging.getLogger("pyvips").setLevel(logging.WARNING)
-except:
+except Exception as e:
HAVE_VIPS = False
+ if not isinstance(e, ImportError):
+ logging.warning("libvips found, but failed to load: " + str(e))
+
try:
if os.environ.get("PRTY_NO_RAW"):
diff --git a/copyparty/up2k.py b/copyparty/up2k.py
index b233cecb..993d5b82 100644
--- a/copyparty/up2k.py
+++ b/copyparty/up2k.py
@@ -144,6 +144,7 @@ class Up2k(object):
self.salt = self.args.warksalt
self.r_hash = re.compile("^[0-9a-zA-Z_-]{44}$")
+ self.abrt_key = ""
self.gid = 0
self.gt0 = 0
@@ -3988,6 +3989,9 @@ class Up2k(object):
except:
pass
+ def handle_fs_abrt(self, akey: str) -> None:
+ self.abrt_key = akey
+
def handle_rm(
self,
uname: str,
@@ -4197,7 +4201,7 @@ class Up2k(object):
return n_files, ok + ok2, ng + ng2
- def handle_cp(self, uname: str, ip: str, svp: str, dvp: str) -> str:
+ def handle_cp(self, abrt: str, uname: str, ip: str, svp: str, dvp: str) -> str:
if svp == dvp or dvp.startswith(svp + "/"):
raise Pebkac(400, "cp: cannot copy parent into subfolder")
@@ -4244,6 +4248,8 @@ class Up2k(object):
dvpf = dvp + svpf[len(svp) :]
self._cp_file(uname, ip, svpf, dvpf, curs)
+ if abrt and abrt == self.abrt_key:
+ raise Pebkac(400, "filecopy aborted by http-api")
for v in curs:
v.connection.commit()
@@ -4411,7 +4417,7 @@ class Up2k(object):
return "k"
- def handle_mv(self, uname: str, ip: str, svp: str, dvp: str) -> str:
+ def handle_mv(self, abrt: str, uname: str, ip: str, svp: str, dvp: str) -> str:
if svp == dvp or dvp.startswith(svp + "/"):
raise Pebkac(400, "mv: cannot move parent into subfolder")
@@ -4466,6 +4472,8 @@ class Up2k(object):
dvpf = dvp + svpf[len(svp) :]
self._mv_file(uname, ip, svpf, dvpf, curs)
+ if abrt and abrt == self.abrt_key:
+ raise Pebkac(400, "filemove aborted by http-api")
for v in curs:
v.connection.commit()
diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css
index 298de0ea..00e42cae 100644
--- a/copyparty/web/browser.css
+++ b/copyparty/web/browser.css
@@ -1930,6 +1930,11 @@ html.y #tree.nowrap .ntree a+a:hover {
padding: 0;
font-size: 1.5em;
}
+#fs_abrt {
+ margin-top: 1em;
+ text-shadow: 0;
+ box-shadow: 1px 1px 0 var(--bg-d3);
+}
#doc {
overflow: visible;
background: #fff;
@@ -3272,3 +3277,790 @@ html.d #treepar {
transition: background-color .3s ease, color .3s ease;
}
}
+html.ey {
+ --negative-space: 0em; /* Use this to change the global spacing of the 95 theme */
+ --font-main: consolas;
+ --font-serif: consolas;
+ --font-mono: consolas;
+ --w: #fff;
+ --w2: #dfdfdf;
+ --w3: grey;
+ --fg: #000;
+ --fg-max: #0000ff;
+ --fg-weak: #0000ff;
+ --bg: #c6c3c6;
+ --bg-d3: #ff0;
+ --bg-d2: var(--w3);
+ --bg-d1: var(--bg);
+ --bg-u2: var(--bg);
+ --bg-u3: var(--bg);
+ --bg-u5: var(--shadow-color-2);
+ --tab-alt: #00f;
+ --g-fsel-bg: #00f;
+ --g-sel-bg: #00f;
+ --g-fsel-b1: #fff;
+ --row-alt: var(--w);
+ --scroll: var(--silver);
+ --f-sel-sh: transparent;
+ --a: #000;
+ --a-b: #fff;
+ --a-hil: #fff;
+ --a-h-bg: var(--bg);
+ --a-dark: var(--a);
+ --a-gray: var(--fg-weak);
+ --btn-fg: var(--fg);
+ --btn-bg: var(--bg);
+ --btn-h-fg: var(--fg);
+ --btn-h-bg: var(--bg);
+ --btn-1-fg: var(--fg);
+ --btn-1-bg: var(--bg);
+ --btn-1h-bg: var(--bg-d3);
+ --txt-sh: a;
+ --txt-bg: var(--white);
+ --u2-b1-bg: var(--w2);
+ --u2-b2-bg: var(--w2);
+ --u2-txt-bg: var(--w2);
+ --u2-tab-bg: a;
+ --u2-tab-1-bg: var(--w2);
+ --sort-1: var(--fg-weak);
+ --tree-bg: var(--w);
+ --g-b1: a;
+ --g-b2: a;
+ --g-f-bg: var(--w2);
+ --f-sh1: 0.1;
+ --f-sh2: 0.02;
+ --f-sh3: 0.1;
+ --f-h-b1: a;
+ --srv-1: var(--w);
+ --srv-3: var(--a);
+ --mp-sh: a;
+ --black: #000;
+ --white: #fff;
+ --grey: grey;
+ --silver: silver;
+ --transparent: transparent;
+ --shadow-color-1: #0a0a0a;
+ --shadow-color-2: #808080;
+ --border-dashed-black: 1px dashed var(--black);
+ --radius: 0;
+ --focus-outline: 1px dashed var(--black);
+ --hover-outline: 1px dotted var(--black);
+ --fm-off: var(--w3);
+ --ttlbar: linear-gradient(90deg, navy, #1084d0);
+ --inset-bg: var(--white);
+ --scroll-bkg: var(--white);
+
+ /*All sides*/
+ --shadow-outset: inset -1px -1px var(--shadow-color-1),
+ inset 1px 1px var(--white), inset -2px -2px var(--grey),
+ inset 2px 2px var(--w2);
+
+ --shadow-inset: inset -1px -1px var(--white),
+ inset 1px 1px var(--shadow-color-1), inset -2px -2px var(--w2),
+ inset 2px 2px var(--shadow-color-2);
+
+ --shadow-input: inset -1px -1px var(--white), inset 1px 1px var(--grey),
+ inset -2px -2px var(--w2), inset 2px 2px var(--shadow-color-1);
+
+ /*Indiv sides*/
+ --shadow-outset-bottom: inset 0 -1px var(--shadow-color-1),
+ inset 0 -2px var(--grey);
+ --shadow-outset-right: inset -1px 0 var(--shadow-color-1),
+ inset -2px 0 var(--grey);
+ --shadow-outset-left: inset 1px 0 var(--white), inset 2px 0 var(--w2);
+ --shadow-outset-top: inset 0 1px var(--white), inset 0 2px var(--w2);
+
+ --shadow-inset-bottom: inset 0 -1px var(--white), inset 0 -2px var(--w2);
+ --shadow-inset-right: inset -1px 0 var(--white), inset -2px 0 var(--w2);
+ --shadow-inset-left: inset 1px 0 var(--shadow-color-1),
+ inset 2px 0 var(--shadow-color-2);
+ --shadow-inset-top: inset 0 1px var(--shadow-color-1),
+ inset 0 2px var(--shadow-color-2);
+}
+html.ez {
+ --negative-space: 0em; /* Use this to change the global spacing of your theme :) */
+ --font-main: consolas;
+ --font-serif: consolas;
+ --font-mono: consolas;
+ --w: #fff;
+ --w2: var(--inset-bg);
+ --w3: grey;
+ --fg: #cfcfcf;
+ --fg-max: #47b8ff;
+ --fg-weak: #47b8ff;
+ --bg: #383838;
+ --bg-d3: #600000;
+ --bg-d2: var(--shadow-color-1);
+ --bg-d1: var(--bg);
+ --u2-tab-1-fg: #ff0;
+ --bg-u2: var(--bg);
+ --bg-u3: var(--bg);
+ --bg-u5: var(--shadow-color-2);
+ --tab-alt: #47b8ff;
+ --g-fsel-bg: #0000b7;
+ --g-sel-bg: #00f;
+ --g-fsel-b1: #fff;
+ --row-alt: #555555;
+ --scroll: #555555;
+ --f-sel-sh: transparent;
+ --a: var(--fg);
+ --a-b: var(--fg);
+ --a-hil: var(--fg);
+ --btn-1h-bg: var(--bg-d3);
+ --a-h-bg: var(--bg);
+ --a-dark: var(--a);
+ --a-gray: var(--fg-weak);
+ --btn-fg: var(--white);
+ --btn-bg: var(--bg);
+ --btn-h-fg: var(--white);
+ --btn-h-bg: var(--bg);
+ --btn-1-fg: var(--white);
+ --btn-1-bg: var(--bg);
+ --txt-sh: a;
+ --u2-b1-bg: var(--w2);
+ --u2-b2-bg: var(--w2);
+ --u2-txt-bg: var(--w2);
+ --u2-tab-bg: a;
+ --u2-tab-1-bg: var(--w2);
+ --sort-1: var(--fg-weak);
+ --g-b1: a;
+ --g-b2: a;
+ --g-f-bg: var(--w2);
+ --f-sh1: 0.1;
+ --f-sh2: 0.02;
+ --f-sh3: 0.1;
+ --f-h-b1: a;
+ --srv-1: var(--w);
+ --srv-3: var(--a);
+ --mp-sh: a;
+ --black: #000;
+ --white: #fff;
+ --grey: grey;
+ --silver: #858585;
+ --transparent: transparent;
+ --shadow-color-1: #101010;
+ --shadow-color-2: #1f1f1f;
+ --border-dashed-black: 1px dashed var(--shadow-color-1);
+ --radius: 0;
+ --focus-outline: 1px dashed var(--white);
+ --hover-outline: 1px dotted var(--white);
+ --fm-off: var(--w3);
+ --ttlbar: linear-gradient(90deg, var(--shadow-color-1) 20%, #888888);
+ --inset-bg: #3f3f3f;
+ --tree-bg: var(--inset-bg);
+ --txt-bg: var(--inset-bg);
+ --scroll-bkg: var(--black);
+
+ /*All sides*/
+ --shadow-outset: inset -1px -1px var(--shadow-color-1), inset 1px 1px #878787,
+ inset -2px -2px var(--shadow-color-2), inset 2px 2px #575757;
+
+ --shadow-inset: inset -1px -1px #878787, inset 1px 1px var(--shadow-color-1),
+ inset -2px -2px #575757, inset 2px 2px var(--shadow-color-2);
+
+ --shadow-input: inset -1px -1px var(--white),
+ inset 1px 1px var(--shadow-color-2), inset -2px -2px #575757,
+ inset 2px 2px var(--shadow-color-1);
+
+ --shadow-outset-bottom: inset 0 -1px var(--shadow-color-1),
+ inset 0 -2px var(--shadow-color-2);
+ --shadow-outset-right: inset -1px 0 var(--shadow-color-1),
+ inset -2px 0 var(--shadow-color-2);
+ --shadow-outset-left: inset 1px 0 #878787, inset 2px 0 #575757;
+ --shadow-outset-top: inset 0 1px #878787, inset 0 2px #575757;
+
+ --shadow-inset-bottom: inset 0 -1px #878787, inset 0 -2px #575757;
+ --shadow-inset-right: inset -1px 0 #878787, inset -2px 0 #575757;
+ --shadow-inset-left: inset 1px 0 var(--shadow-color-1),
+ inset 2px 0 var(--shadow-color-2);
+ --shadow-inset-top: inset 0 1px var(--shadow-color-1),
+ inset 0 2px var(--shadow-color-2);
+}
+
+html.e {
+ text-shadow: none;
+}
+
+html.e #files,
+html.e #u2conf input[type="checkbox"]:hover + label,
+html.e .tgl.btn.on:hover,
+html.e body {
+ background: var(--bg);
+}
+html.e #pctl a,
+html.e #repl,
+html.e #u2conf a,
+html.e #u2conf input[type="checkbox"] + label,
+html.e #wfp a,
+html.e .btn,
+html.e .eq_step,
+html.e input[type="submit"] {
+ box-shadow: var(--shadow-outset);
+ border-radius: var(--radius);
+ background: var(--bg);
+ border: 0;
+}
+a.s0r,
+html.e #ghead a.s0,
+html.e #u2conf input[type="checkbox"]:checked + label,
+html.e .tgl.btn.on,
+html.e input[type="submit"]:active {
+ box-shadow: var(--shadow-inset) !important;
+}
+html.e #ops a:hover,
+html.e #pctl a:hover,
+html.e #repl:hover,
+html.e #u2conf a:hover,
+html.e #u2conf input[type="checkbox"]:hover + label,
+html.e #wfp a:hover,
+html.e .btn:hover,
+html.e .eq_step:hover,
+html.e input[type="submit"]:hover {
+ outline: var(--hover-outline);
+ outline-offset: -4px;
+}
+html.e .ntree a:hover,
+html.e :focus,
+html.e :focus + label,
+html.e a:active,
+html.e tr:focus,
+input[type="text"]:focus {
+ outline: var(--focus-outline) !important;
+}
+html.e tr:focus {
+ box-shadow: none;
+}
+html.e #pctl a:focus,
+html.e #repl:hover,
+html.e #u2conf input[type="checkbox"]:focus + label,
+html.e #wfp a:focus,
+html.e .btn:focus,
+html.e .eq_step:focus {
+ border: 0 !important;
+ outline: var(--focus-outline) !important;
+ outline-offset: 2px;
+ box-shadow: var(--shadow-outset) !important;
+}
+html.e #files tbody,
+html.e #u2cards a.act {
+ box-shadow: var(--shadow-inset);
+}
+html.e #files {
+ border: 2px groove var(--transparent);
+ box-sizing: border-box;
+ width: 100%;
+ padding: 0.3em;
+ top: 0;
+ border: 0;
+}
+html.e #files tbody tr td,
+html.e #files thead th {
+ border-radius: var(--radius);
+}
+#files td {
+ background: var(--w2);
+}
+html.e #files tr {
+ background-color: var(--black);
+}
+html.e #srv_info span,
+html.e label {
+ color: var(--btn-fg) !important;
+}
+html.e #acc_info {
+ background: var(--transparent);
+ color: var(--white);
+ height: 2em;
+ left: 1em;
+ width: fit-content;
+}
+html.e #acc_info,
+html.e #ops,
+html.e #srv_info {
+ display: flex;
+ align-items: center;
+}
+html.e #flogout:before {
+ padding-left: 0.2em;
+ padding-right: 0.4em;
+ content: " | ";
+}
+html.e #blogout {
+ color: var(--w);
+ box-shadow: none;
+ background: transparent;
+}
+html.e .opwide > div {
+ border-left: 1px solid var(--fg);
+}
+html.e #srv_info {
+ background: var(--transparent);
+ color: var(--white);
+ height: fit-content;
+ top: 3.2em;
+ left: 1em;
+ gap: 0.2em;
+}
+html.e #u2cards a.act {
+ padding: 0.2em 1em;
+}
+html.e #u2btn {
+ border: var(--border-dashed-black);
+ border-radius: var(--border-radius);
+ transform: translateY(30%);
+}
+html.e #ops,
+html.e #ops a {
+ border-radius: var(--radius);
+}
+@media only screen and (max-width: 600px) {
+ html.e #acc_info {
+ background: var(--transparent);
+ color: var(--white);
+ height: fit-content;
+ align-items: center;
+ top: 3.2em;
+ right: 1em;
+ left: auto;
+ display: flex;
+ gap: 0.2em;
+ }
+ html.e #u2btn {
+ transform: none;
+ }
+}
+html.e #ops {
+ background: var(--ttlbar);
+ /*HC*/
+ box-shadow: inset 0-1px grey, inset 0-2px var(--shadow-color-1);
+ height: 2em;
+ gap: 0.6em;
+ padding: 0.2em;
+ flex-direction: row-reverse;
+ margin-bottom: 1.2em;
+}
+html.e #srch_form,
+html.e .opbox {
+ padding-bottom: 1em;
+ padding-top: 1em;
+ max-width: 100vw;
+}
+html.e #ghead,
+html.e #ops a {
+ align-items: center;
+ display: flex;
+}
+html.e #ops a {
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
+ height: 1.4em;
+ padding: 0;
+ box-shadow: var(--shadow-outset);
+ background: var(--bg);
+ aspect-ratio: 1/1;
+ justify-content: center;
+ font-size: 1.25em;
+ z-index: 4;
+}
+html.e #blogout:focus,
+html.e #ops a:focus {
+ outline: 1px dashed var(--w) !important;
+}
+
+html.e #blogout:hover {
+ text-decoration: underline;
+}
+
+html.e #ops > a:not(:first-child).act {
+ height: 1.4em;
+ width: 1.4em;
+ padding-bottom: 0.3em;
+ margin-top: 0.3em;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ box-shadow: var(--shadow-inset-left), var(--shadow-inset-top),
+ var(--shadow-inset-right);
+ z-index: 6;
+}
+html.e #ops a.act {
+ box-shadow: var(--shadow-inset);
+ border-bottom: 0;
+}
+html.e a:active {
+ border: 0;
+}
+html.e :focus,
+html.e :focus + label {
+ border: 0 !important;
+ outline-offset: 1px;
+ border-radius: var(--radius) !important;
+ box-shadow: inherit;
+}
+html.e #opa_x {
+ text-shadow: 0 0 0 var(--transparent) !important;
+ color: var(--bg) !important;
+ display: flex;
+}
+html.e #opa_x:before {
+ content: "⨯";
+ color: var(--fg) !important;
+ margin-top: -0.1em;
+ font-size: 1.75em;
+ position: absolute;
+}
+html.e .opbox {
+ margin: -1.2em 0 0;
+ box-shadow: var(--shadow-inset-bottom), var(--shadow-inset-left),
+ var(--shadow-inset-right);
+ border-radius: var(--radius);
+ z-index: 5;
+ background: var(--bg);
+}
+html.e #srch_form {
+ margin: 0;
+ border-radius: var(--radius);
+}
+html.e #op_unpost {
+ max-width: 100vw;
+ margin: 0;
+}
+html.e label:focus {
+ box-shadow: 0 0;
+}
+html.e #tree {
+ box-shadow: none;
+ padding-right: 5px;
+}
+html.e #tt {
+ background: var(--w2);
+}
+html.e .mdo a {
+ background: 0 0;
+ text-decoration: underline;
+}
+html.e .mdo code,
+html.e .mdo pre {
+ color: var(--white);
+ background: var(--w2);
+ border: 0;
+}
+html.e .mdo h1,
+html.e .mdo h2 {
+ background: 0 0;
+ border-color: var(--w2);
+}
+html.e #tt,
+html.e .mdo ol ol,
+html.e .mdo ol ul,
+html.e .mdo ul ol,
+html.e .mdo ul ul {
+ border-color: var(--w2);
+}
+html.e .mdo li > em,
+html.e .mdo p > em,
+html.e .mdo td > em {
+ color: #fd0;
+}
+html.e input.txtbox,
+html.e input[type="text"],
+html.e select {
+ background-color: var(--txt-bg);
+ box-shadow: var(--shadow-input) !important;
+ box-sizing: border-box;
+ padding: 3px 4px;
+ border-radius: var(--radius);
+ border: 0;
+}
+html.e #gfiles {
+ box-shadow: var(--shadow-outset);
+ background: var(--bg);
+ padding: 0.4em;
+ display: flex;
+ flex-direction: column;
+ gap: 0.3em;
+}
+html.e #ggrid {
+ background-color: var(--inset-bg);
+ box-shadow: var(--shadow-input);
+ padding: 1.5em;
+ margin: 0;
+ overflow-x: scroll;
+}
+html.e #ghead {
+ margin: 0;
+ justify-content: flex-end;
+ gap: 0.4em;
+ padding: 0;
+ overflow: auto;
+ top: 0px;
+ border-radius: 0px;
+}
+html.e #ghead a {
+ margin: 0;
+ border-radius: var(--radius);
+}
+html.e ::-webkit-scrollbar,
+html.e::-webkit-scrollbar {
+ width: 16px !important;
+ height: 16px !important;
+ background: var(--transparent) !important;
+}
+html.e ::-webkit-scrollbar-button,
+html.e ::-webkit-scrollbar-thumb,
+html.e::-webkit-scrollbar-button,
+html.e::-webkit-scrollbar-thumb {
+ width: 16px !important;
+ height: 16px !important;
+ background: var(--scroll) !important;
+ /*HC*/
+ box-shadow: var(--shadow-outset);
+ border: 1px solid !important;
+ border-color: var(--silver) var(--black) var(--black) var(--silver) !important;
+}
+html.e ::-webkit-scrollbar-track,
+html.e::-webkit-scrollbar-track {
+ image-rendering: optimize-contrast !important;
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTAuNSAyIDIiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyI+CjxtZXRhZGF0YT5NYWRlIHdpdGggUGl4ZWxzIHRvIFN2ZyBodHRwczovL2NvZGVwZW4uaW8vc2hzaGF3L3Blbi9YYnh2Tmo8L21ldGFkYXRhPgo8cGF0aCBzdHJva2U9IiNjMGMwYzAiIGQ9Ik0wIDBoMU0xIDFoMSIgLz4KPC9zdmc+) !important;
+ background-position: 0 0 !important;
+ background-repeat: repeat !important;
+ background-size: 2px !important;
+ background: var(--scroll-bkg);
+}
+#tree::-webkit-scrollbar,
+#tree::-webkit-scrollbar-track {
+ background: var(--scroll-bkg);
+}
+html.e ::-webkit-scrollbar-button,
+html.e::-webkit-scrollbar-button {
+ background-repeat: no-repeat !important;
+ background-size: 16px !important;
+}
+html.e ::-webkit-scrollbar-button:single-button:vertical:decrement,
+html.e::-webkit-scrollbar-button:single-button:vertical:decrement {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTAuNSAxNiAxNiIgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj4KPG1ldGFkYXRhPk1hZGUgd2l0aCBQaXhlbHMgdG8gU3ZnIGh0dHBzOi8vY29kZXBlbi5pby9zaHNoYXcvcGVuL1hieHZOajwvbWV0YWRhdGE+CjxwYXRoIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTcgNWgxTTYgNmgzTTUgN2g1TTQgOGg3IiAvPgo8L3N2Zz4=) !important;
+}
+html.e ::-webkit-scrollbar-button:single-button:vertical:increment,
+html.e::-webkit-scrollbar-button:single-button:vertical:increment {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTAuNSAxNiAxNiIgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj4KPG1ldGFkYXRhPk1hZGUgd2l0aCBQaXhlbHMgdG8gU3ZnIGh0dHBzOi8vY29kZXBlbi5pby9zaHNoYXcvcGVuL1hieHZOajwvbWV0YWRhdGE+CjxwYXRoIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQgNWg3TTUgNmg1TTYgN2gzTTcgOGgxIiAvPgo8L3N2Zz4=) !important;
+}
+html.e ::-webkit-scrollbar-button:single-button:horizontal:decrement,
+html.e::-webkit-scrollbar-button:single-button:horizontal:decrement {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTAuNSAxNiAxNiIgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj4KPG1ldGFkYXRhPk1hZGUgd2l0aCBQaXhlbHMgdG8gU3ZnIGh0dHBzOi8vY29kZXBlbi5pby9zaHNoYXcvcGVuL1hieHZOajwvbWV0YWRhdGE+CjxwYXRoIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTggM2gxTTcgNGgyTTYgNWgzTTUgNmg0TTYgN2gzTTcgOGgyTTggOWgxIiAvPgo8L3N2Zz4=) !important;
+}
+html.e ::-webkit-scrollbar-button:single-button:horizontal:increment,
+html.e::-webkit-scrollbar-button:single-button:horizontal:increment {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTAuNSAxNiAxNiIgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj4KPG1ldGFkYXRhPk1hZGUgd2l0aCBQaXhlbHMgdG8gU3ZnIGh0dHBzOi8vY29kZXBlbi5pby9zaHNoYXcvcGVuL1hieHZOajwvbWV0YWRhdGE+CjxwYXRoIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTYgM2gxTTYgNGgyTTYgNWgzTTYgNmg0TTYgN2gzTTYgOGgyTTYgOWgxIiAvPgo8L3N2Zz4=) !important;
+}
+html.e ::-webkit-scrollbar-corner,
+html.e::-webkit-scrollbar-corner {
+ background: var(--silver) !important;
+}
+html,
+html.e #tree {
+ scrollbar-color: inherit !important;
+}
+html.e #tree {
+ background: var(--bg);
+ padding-left: 0.4em;
+ padding-top: 0;
+ margin-left: var(--negative-space);
+}
+html.e.noscroll #tree {
+ /*HC*/
+ box-shadow: 1px 1px var(--grey), 2px 2px var(--shadow-color-1),
+ var(--shadow-outset-bottom);
+}
+html.e #treeh {
+ background: var(--bg);
+ box-shadow: var(--shadow-outset-top), var(--shadow-outset-bottom);
+ width: calc(1.5em + var(--nav-sz) - var(--sbw));
+ height: 2.4em;
+ border: none;
+ top: -2px;
+ display: flex;
+ align-items: center;
+ gap: 0.6em;
+}
+html.e #treeh .btn {
+ margin: 0px;
+ top: auto;
+}
+html.e #tree ul {
+ border-left: var(--border-dashed-black);
+ margin-left: 2.15em;
+}
+html.e .ntree a:first-child {
+ font-family: scp, monospace, monospace;
+ font-size: 1.2em;
+ line-height: 0;
+ background: var(--inset-bg);
+ aspect-ratio: 1/1;
+ text-align: center;
+ align-content: center;
+ border-radius: var(--radius) !important;
+ padding: 0.057em;
+ border: 1px solid var(--black);
+}
+html.e .ntree a:first-child:after {
+ content: ".";
+ position: absolute;
+ border-top: var(--border-dashed-black);
+ color: var(--transparent);
+ font-size: 0.9em;
+ margin-left: 0.13em;
+}
+html.e #treeul {
+ border: 0 !important;
+ position: static;
+ margin: 0 !important;
+ min-height: 100%;
+ height: max-content;
+}
+html.e .ntree a:last-of-type:before {
+ content: "📁";
+ margin-left: 0.3em;
+}
+html.e .ntree {
+ padding-left: 1em !important;
+ padding-top: 0.3em !important;
+ background: var(--inset-bg);
+ box-shadow: var(--shadow-inset-left), var(--shadow-inset-bottom);
+}
+html.e #tree li {
+ margin-left: -0.5em;
+ border-top: 0;
+}
+html.e .ntree a:hover {
+ outline-offset: -2px;
+ color: var(--fg);
+ border-radius: var(--radius) !important;
+}
+html.e #treepar {
+ width: calc(-1em + var(--nav-sz) - var(--sbw));
+ overflow: hidden;
+ left: -0.7em;
+ box-shadow: var(--shadow-inset-left), var(--shadow-inset-top);
+ border-left: 0 !important;
+ border-bottom: var(--border-dashed-black);
+ margin-left: calc(2.1em - (1em - var(--negative-space))) !important;
+}
+html.e #path,
+html.e #widgeti,
+html.e #wtoggle,
+html.e #wtoggle a,
+html.e #files,
+html.e #files thead th,
+html.e #ghead a,
+html.e #tree {
+ box-shadow: var(--shadow-outset);
+}
+html.e.noscroll #treepar {
+ width: calc(var(--nav-sz) - 1em);
+}
+html.e #docul {
+ border-left: 0 !important;
+ margin-left: 0 !important;
+}
+html.e #wrap {
+ transform: translateX(calc((var(--negative-space) * 2) - 1.2em));
+ padding-right: var(--negative-space);
+ position: relative;
+ margin-right: calc((var(--negative-space) * 2) - 1.2em);
+ margin-top: var(--negative-space);
+ margin-left: 1.2em;
+ /*overflow-x: auto; fix for OOB table when screen space is limited (mobile), but removes sticky header*/
+}
+html.e input[type="radio"] {
+ accent-color: #232323;
+}
+html.e #path {
+ width: calc(100% - 0.4em);
+ display: flex;
+ align-items: center;
+ margin: 0;
+ padding: 0.2em;
+ overflow-x: auto;
+}
+html.e #path i {
+ border: 1px solid var(--w);
+ border-color: var(--w);
+ margin: 0;
+ border-width: 0.1em 0.1em 0 0;
+ height: 0.5em;
+ width: 0.5em;
+}/*
+html.e #hovertree:after {
+ color: red;
+ content: "BUGGY";
+html.ez #hovertree:after {
+ color: rgb(255 98 98);
+ content: "BUGGY";
+}
+}*/
+html.e #widget {
+ box-shadow: 0 0;
+ border: 0 !important;
+}
+html.e #wtico,
+html.e #zip1 {
+ box-shadow: 0 0 !important;
+}
+html.e #wtgrid {
+ top: -0.09em;
+}
+html.e #wfs,
+html.e #wm3u,
+html.e #wnp,
+html.e #wzip {
+ border-width: 0 1px 0 0;
+}
+html.e #wfm.act + #wzip1 + #wzip,
+html.e #wfm.act + #wzip1 + #wzip + #wnp {
+ border-left-width: 1px;
+}
+html.e #barpos {
+ /* border-radius: var(--radius); */
+ box-shadow: var(--shadow-inset);
+}
+html.e #goh + span {
+ border-left: 0.1em solid var(--bg-u5);
+}
+html.e #wfp {
+ margin: var(--negative-space);
+ font-size: 0;
+ display: inline-block;
+}
+html.e #wfp a {
+ font-size: large;
+ display: inline-block;
+}
+html.e #repl {
+ font-size: large;
+ padding: 0.33em;
+ right: calc(var(--negative-space) * 0.89);
+ position: absolute;
+}
+html.e #epi {
+ text-align: center;
+ text-wrap-mode: nowrap;
+ margin: 0px;
+}
+
+html.e #epi.logue:not(.mdo) {
+ padding: 0.8em;
+ box-shadow: var(--shadow-outset);
+}
+
+html.e #epi.logue.mdo {
+ padding-left: 3px;
+}
+
+html.e #doc {
+ box-shadow: var(--shadow-inset);
+ background: var(--inset-bg);
+ margin: 0.2em;
+ border-radius: var(--radius);
+}
+
+html.e #detree {
+ padding: 0px;
+}
diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js
index 7414102d..dcb470e0 100644
--- a/copyparty/web/browser.js
+++ b/copyparty/web/browser.js
@@ -300,9 +300,9 @@ var Ls = {
"mt_mloop": "loop the open folder\">🔁 loop",
"mt_mnext": "load the next folder and continue\">📂 next",
"mt_mstop": "stop playback\">⏸ stop",
- "mt_cflac": "convert flac / wav to opus\">flac",
- "mt_caac": "convert aac / m4a to opus\">aac",
- "mt_coth": "convert all others (not mp3) to opus\">oth",
+ "mt_cflac": "convert flac / wav to {0}\">flac",
+ "mt_caac": "convert aac / m4a to {0}\">aac",
+ "mt_coth": "convert all others (not mp3) to {0}\">oth",
"mt_c2opus": "best choice for desktops, laptops, android\">opus",
"mt_c2owa": "opus-weba, for iOS 17.5 and newer\">owa",
"mt_c2caf": "opus-caf, for iOS 11 through 17\">caf",
@@ -427,6 +427,7 @@ var Ls = {
"fcp_ok": "copy OK",
"fp_busy": "moving {0} items...\n\n{1}",
"fcp_busy": "copying {0} items...\n\n{1}",
+ "fp_abrt": "aborting...",
"fp_err": "move failed:\n",
"fcp_err": "copy failed:\n",
"fp_confirm": "move these {0} items here?",
@@ -930,9 +931,9 @@ var Ls = {
"mt_mloop": "repeter hele mappen\">🔁 gjenta",
"mt_mnext": "hopp til neste mappe og fortsett\">📂 neste",
"mt_mstop": "stopp avspilling\">⏸ stopp",
- "mt_cflac": "konverter flac / wav-filer til opus\">flac",
- "mt_caac": "konverter aac / m4a-filer til to opus\">aac",
- "mt_coth": "konverter alt annet (men ikke mp3) til opus\">andre",
+ "mt_cflac": "konverter flac / wav-filer til {0}\">flac",
+ "mt_caac": "konverter aac / m4a-filer til to {0}\">aac",
+ "mt_coth": "konverter alt annet (men ikke mp3) til {0}\">andre",
"mt_c2opus": "det beste valget for alle PCer og Android\">opus",
"mt_c2owa": "opus-weba, for iOS 17.5 og nyere\">owa",
"mt_c2caf": "opus-caf, for iOS 11 tilogmed 17\">caf",
@@ -1057,6 +1058,7 @@ var Ls = {
"fcp_ok": "kopiering OK",
"fp_busy": "flytter {0} filer...\n\n{1}",
"fcp_busy": "kopierer {0} filer...\n\n{1}",
+ "fp_abrt": "avbryter...",
"fp_err": "flytting feilet:\n",
"fcp_err": "kopiering feilet:\n",
"fp_confirm": "flytt disse {0} filene hit?",
@@ -1559,9 +1561,9 @@ var Ls = {
"mt_mloop": "循环打开的文件夹\">🔁 循环",
"mt_mnext": "加载下一个文件夹并继续\">📂 下一首",
"mt_mstop": "停止播放\">⏸ 停止", //m
- "mt_cflac": "将 flac / wav 转换为 opus\">flac",
- "mt_caac": "将 aac / m4a 转换为 opus\">aac",
- "mt_coth": "将所有其他(不是 mp3)转换为 opus\">oth",
+ "mt_cflac": "将 flac / wav 转换为 {0}\">flac",
+ "mt_caac": "将 aac / m4a 转换为 {0}\">aac",
+ "mt_coth": "将所有其他(不是 mp3)转换为 {0}\">oth",
"mt_c2opus": "适合桌面电脑、笔记本电脑和安卓设备的最佳选择\">opus", //m
"mt_c2owa": "opus-weba(适用于 iOS 17.5 及更新版本)\">owa", //m
"mt_c2caf": "opus-caf(适用于 iOS 11 到 iOS 17)\">caf", //m
@@ -1686,6 +1688,7 @@ var Ls = {
"fcp_ok": "复制成功", //m
"fp_busy": "正在移动 {0} 项...\n\n{1}",
"fcp_busy": "正在复制 {0} 项...\n\n{1}", //m
+ "fp_abrt": "正在中止...", //m
"fp_err": "移动失败:\n",
"fcp_err": "复制失败:\n", //m
"fp_confirm": "将这些 {0} 项移动到这里?",
@@ -2192,9 +2195,9 @@ var Ls = {
"mt_mloop": "opakovat otevřenou složku\">🔁 loop",
"mt_mnext": "načíst další složku a pokračovat\">📂 next",
"mt_mstop": "zastavit přehrávání\">⏸ stop",
- "mt_cflac": "převést flac / wav na opus\">flac",
- "mt_caac": "převést aac / m4a na opus\">aac",
- "mt_coth": "převést všechny ostatní (ne mp3) na opus\">oth",
+ "mt_cflac": "převést flac / wav na {0}\">flac",
+ "mt_caac": "převést aac / m4a na {0}\">aac",
+ "mt_coth": "převést všechny ostatní (ne mp3) na {0}\">oth",
"mt_c2opus": "nejlepší volba pro desktopy, laptopy, android\">opus",
"mt_c2owa": "opus-weba, pro iOS 17.5 a novější\">owa",
"mt_c2caf": "opus-caf, pro iOS 11 až 17\">caf",
@@ -2319,6 +2322,7 @@ var Ls = {
"fcp_ok": "kopírování OK",
"fp_busy": "přesouvám {0} položek...\n\n{1}",
"fcp_busy": "kopíruji {0} položek...\n\n{1}",
+ "fp_abrt": "přerušuji...", //m
"fp_err": "přesun selhal:\n",
"fcp_err": "kopírování selhalo:\n",
"fp_confirm": "přesunout těchto {0} položek sem?",
@@ -2821,9 +2825,9 @@ var Ls = {
"mt_mloop": "offenen Ordner wiederholen\">🔁 Schleife",
"mt_mnext": "nächsten Ordner laden und fortfahren\">📂 nächster",
"mt_mstop": "Wiedergabe beenden\">⏸ Stop",
- "mt_cflac": "FLAC / WAV zu OPUS konvertierebn\">flac",
- "mt_caac": "AAC / M4A zu OPUS konvertieren\">aac",
- "mt_coth": "Convertiere alle Dateien (die nicht MP3 sind) zu OPUS\">oth",
+ "mt_cflac": "FLAC / WAV zu {0} konvertierebn\">flac",
+ "mt_caac": "AAC / M4A zu {0} konvertieren\">aac",
+ "mt_coth": "Convertiere alle Dateien (die nicht MP3 sind) zu {0}\">oth",
"mt_c2opus": "Beste Wahl für Desktops, Laptops, Android\">opus",
"mt_c2owa": "opus-weba, für iOS 17.5 und neuer\">owa",
"mt_c2caf": "opus-caf, für iOS 11 bis 17\">caf",
@@ -2948,6 +2952,7 @@ var Ls = {
"fcp_ok": "Kopieren OK",
"fp_busy": "Verschiebe {0} Elemente...\n\n{1}",
"fcp_busy": "Kopiere {0} Elemente...\n\n{1}",
+ "fp_abrt": "Abbrechen...", //m
"fp_err": "Verschieben fehlgeschlagen:\n",
"fcp_err": "Kopieren fehlgeschlagen:\n",
"fp_confirm": "Diese {0} Elemente hierher verschieben?",
@@ -3450,9 +3455,9 @@ var Ls = {
"mt_mloop": "toista avoinna olevaa hakemistoa loputtomasti\">🔁 alkuun",
"mt_mnext": "lataa seuraava hakemisto ja jatka\">📂 seuraava",
"mt_mstop": "pysäytä toisto\">⏸ pysäytä",
- "mt_cflac": "muunna flac / wav opus-muotoon\">flac",
- "mt_caac": "muunna aac / m4a opus-muotoon\">aac",
- "mt_coth": "muunna kaikki muut paitsi mp3 opus-muotoon\">muut",
+ "mt_cflac": "muunna flac / wav {0}-muotoon\">flac",
+ "mt_caac": "muunna aac / m4a {0}-muotoon\">aac",
+ "mt_coth": "muunna kaikki muut paitsi mp3 {0}-muotoon\">muut",
"mt_c2opus": "paras valinta pöytäkoneille, kannettaville, androidille\">opus",
"mt_c2owa": "opus-weba, iOS 17.5:lle ja uudemmille\">owa",
"mt_c2caf": "opus-caf, iOS 11:lle - 17:lle\">caf",
@@ -3577,6 +3582,7 @@ var Ls = {
"fcp_ok": "kopiointi OK",
"fp_busy": "siirretään {0} kohdetta...\n\n{1}",
"fcp_busy": "kopioidaan {0} kohdetta...\n\n{1}",
+ "fp_abrt": "keskeytetään...", //m
"fp_err": "siirto epäonnistui:\n",
"fcp_err": "kopiointi epäonnistui:\n",
"fp_confirm": "siirrä nämä {0} kohdetta tänne?",
@@ -4079,9 +4085,9 @@ var Ls = {
"mt_mloop": "lire en boucle le dossier ouvert\">🔁 loop",
"mt_mnext": "charger le dossier suivant et continuer\">📂 next",
"mt_mstop": "arrêter la lecture\">⏸ stop",
- "mt_cflac": "convertir flac / wav en opus\">flac",
- "mt_caac": "convertir aac / m4a en opus\">aac",
- "mt_coth": "convertir tout les autres (pas mp3) en opus\">oth",
+ "mt_cflac": "convertir flac / wav en {0}\">flac",
+ "mt_caac": "convertir aac / m4a en {0}\">aac",
+ "mt_coth": "convertir tout les autres (pas mp3) en {0}\">oth",
"mt_c2opus": "meilleur choix pour PC fixe, PC portable, android\">opus",
"mt_c2owa": "opus-weba, pour iOS 17.5 et supérieur\">owa",
"mt_c2caf": "opus-caf, pour iOS 11 à 17\">caf",
@@ -4206,6 +4212,7 @@ var Ls = {
"fcp_ok": "copie OK",
"fp_busy": "déplacement de {0} éléments…\n\n{1}",
"fcp_busy": "copie de {0} éléments…\n\n{1}",
+ "fp_abrt": "abandon en cours...", //m
"fp_err": "deplacement échoué:\n",
"fcp_err": "copie échouée:\n",
"fp_confirm": "déplacer ces {0} éléments ici ?",
@@ -4708,9 +4715,9 @@ var Ls = {
"mt_mloop": "τυχαία αναπαραγωγή στον ανοικτό φάκελο\">🔁 τυχαία αναπαραγωγή",
"mt_mnext": "φόρτωση επόμενου φακέλου και συνέχιση\">📂 επόμενο",
"mt_mstop": "σταμάτησε την αναπαραγωγή\">⏸ σταμάτημα",
- "mt_cflac": "μετατροπή flac / wav σε opus\">flac",
- "mt_caac": "μετατροπή aac / m4a σε opus\">aac",
- "mt_coth": "μετατροπή όλων των άλλων (εκτός των mp3) σε opus\">άλλο",
+ "mt_cflac": "μετατροπή flac / wav σε {0}\">flac",
+ "mt_caac": "μετατροπή aac / m4a σε {0}\">aac",
+ "mt_coth": "μετατροπή όλων των άλλων (εκτός των mp3) σε {0}\">άλλο",
"mt_c2opus": "καλύτερη επιλογή για desktop, laptop, android\">opus",
"mt_c2owa": "opus-weba, για iOS 17.5 και νεότερα\">owa",
"mt_c2caf": "opus-caf, για iOS 11 έως 17\">caf",
@@ -4835,6 +4842,7 @@ var Ls = {
"fcp_ok": "αντιγραφή OK",
"fp_busy": "μετακίνηση {0} αντικειμένων...\n\n{1}",
"fcp_busy": "αντιγραφή {0} αντικειμένων...\n\n{1}",
+ "fp_abrt": "γίνεται ακύρωση...", //m
"fp_err": "αποτυχία μετακίνησης:\n",
"fcp_err": "αποτυχία αντιγραφής:\n",
"fp_confirm": "να μετακινηθούν αυτά τα {0} αντικείμενα εδώ;",
@@ -5337,9 +5345,9 @@ var Ls = {
"mt_mloop": "loop della cartella aperta\">🔁 loop",
"mt_mnext": "carica la prossima cartella e continua\">📂 succ",
"mt_mstop": "ferma riproduzione\">⏸ stop",
- "mt_cflac": "converti flac / wav in opus\">flac",
- "mt_caac": "converti aac / m4a in opus\">aac",
- "mt_coth": "converti tutti gli altri (non mp3) in opus\">oth",
+ "mt_cflac": "converti flac / wav in {0}\">flac",
+ "mt_caac": "converti aac / m4a in {0}\">aac",
+ "mt_coth": "converti tutti gli altri (non mp3) in {0}\">oth",
"mt_c2opus": "scelta migliore per desktop, laptop, android\">opus",
"mt_c2owa": "opus-weba, per iOS 17.5 e più recenti\">owa",
"mt_c2caf": "opus-caf, per iOS 11 fino a 17\">caf",
@@ -5464,6 +5472,7 @@ var Ls = {
"fcp_ok": "copia OK",
"fp_busy": "spostando {0} elementi...\n\n{1}",
"fcp_busy": "copiando {0} elementi...\n\n{1}",
+ "fp_abrt": "annullamento in corso...", //m
"fp_err": "spostamento fallito:\n",
"fcp_err": "copia fallita:\n",
"fp_confirm": "spostare questi {0} elementi qui?",
@@ -6595,9 +6604,9 @@ var Ls = {
"mt_mloop": "De open map herhalen\">🔁 loop",
"mt_mnext": "Laad de volgende map en ga verder\">📂 next",
"mt_mstop": "Stoppen met afspelen\">⏸ stop",
- "mt_cflac": "flac / wav omzetten naar opus\">flac",
- "mt_caac": "aac / m4a omzetten naar opus\">aac",
- "mt_coth": "Alle andere bestanden (geen mp3) converteren naar opus\">oth",
+ "mt_cflac": "flac / wav omzetten naar {0}\">flac",
+ "mt_caac": "aac / m4a omzetten naar {0}\">aac",
+ "mt_coth": "Alle andere bestanden (geen mp3) converteren naar {0}\">oth",
"mt_c2opus": "Beste keuze voor computers, laptops, android\">opus",
"mt_c2owa": "opus-weba, voor iOS 17.5 en nieuwer\">owa",
"mt_c2caf": "opus-caf, voor iOS 11 tot en met iOS 17\">caf",
@@ -6722,6 +6731,7 @@ var Ls = {
"fcp_ok": "Kopiëren OK",
"fp_busy": "{0} items verplaatsen...\n\n{1}",
"fcp_busy": "{0} items kopiëren...\n\n{1}",
+ "fp_abrt": "afbreken...", //m
"fp_err": "Verplaatsen mislukt:\n",
"fcp_err": "Kopieëren mislukt:\n",
"fp_confirm": "Verplaats deze {0} items hierheen?",
@@ -7225,9 +7235,9 @@ var Ls = {
"mt_mloop": "repetér heile mappa\">🔁 gjenta",
"mt_mnext": "hopp åt neste mappe og fortsett\">📂 neste",
"mt_mstop": "stopp avspeling\">⏸ stopp",
- "mt_cflac": "konvertér flac / wav-filer åt opus\">flac",
- "mt_caac": "konvertér aac / m4a-filer åt to opus\">aac",
- "mt_coth": "konvertér alt anna (men ikkje mp3) åt opus\">andre",
+ "mt_cflac": "konvertér flac / wav-filer åt {0}\">flac",
+ "mt_caac": "konvertér aac / m4a-filer åt to {0}\">aac",
+ "mt_coth": "konvertér alt anna (men ikkje mp3) åt {0}\">andre",
"mt_c2opus": "det beste valget for alle PCar og Android\">opus",
"mt_c2owa": "opus-weba, for iOS 17.5 og nyare\">owa",
"mt_c2caf": "opus-caf, for iOS 11 åt og med 17\">caf",
@@ -7352,6 +7362,7 @@ var Ls = {
"fcp_ok": "kopiering OK",
"fp_busy": "flyttar {0} filer...\n\n{1}",
"fcp_busy": "kopierar {0} filer...\n\n{1}",
+ "fp_abrt": "avbryt...",
"fp_err": "flytting feila:\n",
"fcp_err": "kopiering feila:\n",
"fp_confirm": "flytt disse {0} filene hit?",
@@ -7853,9 +7864,9 @@ var Ls = {
"mt_mloop": "odtwarzaj utwory w folderze w pętli\">🔁 loop",
"mt_mnext": "wczytaj następny folder i kontynuuj\">📂 next",
"mt_mstop": "zatrzymaj odtwarzanie\">⏸ stop",
- "mt_cflac": "przekonwertuj format flac / wav na opus\">flac",
- "mt_caac": "przekonwertuj format aac / m4a na opus\">aac",
- "mt_coth": "przekonwertuj wszystkie inne formaty (nie będące mp3) na opus\">oth",
+ "mt_cflac": "przekonwertuj format flac / wav na {0}\">flac",
+ "mt_caac": "przekonwertuj format aac / m4a na {0}\">aac",
+ "mt_coth": "przekonwertuj wszystkie inne formaty (nie będące mp3) na {0}\">oth",
"mt_c2opus": "najlepszy wybór dla komputerów, laptopów i urządzeń z androidem\">opus",
"mt_c2owa": "opus-weba, dla iOS 17.5 i nowszych\">owa",
"mt_c2caf": "opus-caf, dla iOS 11 do 17\">caf",
@@ -7978,6 +7989,7 @@ var Ls = {
"fcp_ok": "przekopiowano",
"fp_busy": "przenoszenie {0} elementów...\n\n{1}",
"fcp_busy": "kopiowanie {0} elementów...\n\n{1}",
+ "fp_abrt": "przerywanie...", //m
"fp_err": "nie udało się przenieść:\n",
"fcp_err": "nie udało się skopiować:\n",
"fp_confirm": "przenieść tutaj {0} elementy(ów)?",
@@ -8480,9 +8492,9 @@ var Ls = {
"mt_mloop": "повторять треки в папке\">🔁 цикл",
"mt_mnext": "загрузить следующую папку и продолжить в ней\">📂 след.",
"mt_mstop": "приостановить воспроизведение\">⏸ стоп",
- "mt_cflac": "конвертировать flac / wav в opus\">flac",
- "mt_caac": "конвертировать aac / m4a в opus\">aac",
- "mt_coth": "конвертировать всё остальное (кроме mp3) в opus\">др.",
+ "mt_cflac": "конвертировать flac / wav в {0}\">flac",
+ "mt_caac": "конвертировать aac / m4a в {0}\">aac",
+ "mt_coth": "конвертировать всё остальное (кроме mp3) в {0}\">др.",
"mt_c2opus": "лучший вариант для компьютеров и устройств на Android\">opus",
"mt_c2owa": "opus-weba, для iOS 17.5 и выше\">owa",
"mt_c2caf": "opus-caf, для iOS 11-17\">caf",
@@ -8607,6 +8619,7 @@ var Ls = {
"fcp_ok": "успешно скопировано",
"fp_busy": "перемещаю {0} файлов...\n\n{1}",
"fcp_busy": "копирую {0} файлов...\n\n{1}",
+ "fp_abrt": "прерывание...", //m
"fp_err": "ошибка перемещения:\n",
"fcp_err": "ошибка копирования:\n",
"fp_confirm": "переместить эти {0} файлов сюда?",
@@ -9108,9 +9121,9 @@ var Ls = {
"mt_mloop": 'repetir la carpeta actual">🔁 bucle',
"mt_mnext": 'cargar la siguiente carpeta y continuar">📂 sig',
"mt_mstop": 'detener reproducción">⏸ parar',
- "mt_cflac": 'convertir flac / wav a opus">flac',
- "mt_caac": 'convertir aac / m4a a opus">aac',
- "mt_coth": 'convertir todos los demás (no mp3) a opus">oth',
+ "mt_cflac": 'convertir flac / wav a {0}">flac',
+ "mt_caac": 'convertir aac / m4a a {0}">aac',
+ "mt_coth": 'convertir todos los demás (no mp3) a {0}">oth',
"mt_c2opus": 'la mejor opción para ordenadores, portátiles, android">opus',
"mt_c2owa": 'opus-weba, para iOS 17.5 y superior">owa',
"mt_c2caf": 'opus-caf, para iOS 11 a 17">caf',
@@ -9235,6 +9248,7 @@ var Ls = {
"fcp_ok": "copia correcta",
"fp_busy": "moviendo {0} elementos...\n\n{1}",
"fcp_busy": "copiando {0} elementos...\n\n{1}",
+ "fp_abrt": "cancelando...", //m
"fp_err": "fallo al mover:\n",
"fcp_err": "fallo al copiar:\n",
"fp_confirm": "¿mover estos {0} elementos aquí?",
@@ -9443,6 +9457,636 @@ var Ls = {
"lang_set": "¿refrescar para que el cambio surta efecto?"
},
+ "swe": {
+ "tt": "Svenska",
+
+ "cols": {
+ "c": "aktion",
+ "dur": "längd",
+ "q": "kvalitet / bitrate",
+ "Ac": "ljudkodek",
+ "Vc": "videokodek",
+ "Fmt": "format / container",
+ "Ahash": "ljudchecksumma",
+ "Vhash": "videochecksumma",
+ "Res": "upplösning",
+ "T": "filtyp",
+ "aq": "ljudkvalitet / bitrate",
+ "vq": "videokvalitet / bitrate",
+ "pixfmt": "subsampling / pixelstruktur",
+ "resw": "horisontell upplösning",
+ "resh": "vertikal upplösning",
+ "chs": "antal ljudkanaler",
+ "hz": "samplingsfrekvens"
+ },
+
+ "hks": [
+ [
+ "övrigt",
+ ["ESC", "stäng diverse paneler"],
+
+ "filhanterare",
+ ["G", "växla mellan listvy / rutnät"],
+ ["T", "växla mellan miniatyrer / ikoner"],
+ ["⇧ A/D", "miniatyrstorlek"],
+ ["ctrl-K", "radera urval"],
+ ["ctrl-X", "klipp urval till urklipp"],
+ ["ctrl-C", "kopiera urval till urklipp"],
+ ["ctrl-V", "klistra in (kopiera/flytta) hit"],
+ ["Y", "ladda ner urval"],
+ ["F2", "byt namn på urval"],
+
+ "välja filer",
+ ["Blanksteg", "växla val av fil"],
+ ["↑/↓", "flytta filvalsmarkör"],
+ ["ctrl ↑/↓", "flytta markör och vy"],
+ ["⇧ ↑/↓", "välj föregående/nästa fil"],
+ ["ctrl-A", "välj alla filer / mappar"],
+ ], [
+ "navigation",
+ ["B", "växla mellan brödsmulor / trädvy"],
+ ["I/K", "föregående/nästa mapp"],
+ ["M", "hoppa till överordnad mapp (eller kollapsa närvarande)"],
+ ["V", "växla mellan mappar / textfiler i trädvy"],
+ ["A/D", "trädvystorlek"],
+ ], [
+ "ljudspelare",
+ ["J/L", "föregående/nästa låt"],
+ ["U/O", "hoppa 10sek bakåt/framåt"],
+ ["0..9", "hoppa till 0%..90%"],
+ ["P", "play/paus (startar även uppspelning)"],
+ ["S", "välj låten som spelas"],
+ ["Y", "ladda ner låt"],
+ ], [
+ "bildvisare",
+ ["J/L, ←/→", "föregående/nästa bild"],
+ ["Hem/End", "första/sista bilden"],
+ ["F", "helskärm"],
+ ["R", "rotera medsols"],
+ ["⇧ R", "rotera motsols"],
+ ["S", "välj bild"],
+ ["Y", "ladda ner bild"],
+ ], [
+ "videospelare",
+ ["U/O", "hoppa 10sek bakåt/framåt"],
+ ["P/K/Blanksteg", "play/paus"],
+ ["C", "fortsätt med nästa"],
+ ["V", "loopa"],
+ ["M", "stäng av ljud"],
+ ["[ och ]", "ställ in loopintervall"],
+ ], [
+ "textfilsvisare",
+ ["I/K", "föregående/nästa fil"],
+ ["M", "stäng textfil"],
+ ["E", "redigera textfil"],
+ ["S", "välj fil"],
+ ]
+ ],
+
+ "m_ok": "OK",
+ "m_ng": "Avbryt",
+
+ "enable": "Aktivera",
+ "danger": "VARNING",
+ "clipped": "kopierat till urklipp",
+
+ "ht_s1": "sekund",
+ "ht_s2": "sekunder",
+ "ht_m1": "minut",
+ "ht_m2": "minuter",
+ "ht_h1": "timme",
+ "ht_h2": "timmar",
+ "ht_d1": "dag",
+ "ht_d2": "dagar",
+ "ht_and": " och ",
+
+ "goh": "kontrollpanel",
+ "gop": 'föregående mapp">föreg.',
+ "gou": 'överordnad mapp">upp',
+ "gon": 'nästa mapp">nästa',
+ "logout": "Logga ut ",
+ "access": "-rättighet",
+ "ot_close": "stäng undermeny",
+ "ot_search": "sök efter filer via attribut, sökväg / namn, musiktaggar, eller någon kombination av dessa$N$N<code>foo bar</code> = måste innehålla både «foo» och «bar»,$N<code>foo -bar</code> = måste innehålla «foo» men inte «bar»,$N<code>^yana .opus$</code> = måste börja med «yana» och vara en «opus»-fil$N<code>"try unite"</code> = måste innehålla exakt «try unite»$N$Ndatumformatet är iso-8601, t.ex.$N<code>2009-12-31</code> eller <code>2020-09-12 23:30:00</code>",
+ "ot_unpost": "unpost: radera dina senaste uppladdningar, eller avbryt pågående sådana",
+ "ot_bup": "bup: enkel uppladdare, stödjer t o m netscape 4.0",
+ "ot_mkdir": "mkdir: skapa en ny mapp",
+ "ot_md": "new-md: skapa ett nytt markdown-dokument",
+ "ot_msg": "msg: skicka ett meddelande till serverloggen",
+ "ot_mp": "mediaspelarinställningar",
+ "ot_cfg": "konfigurationsinställningar",
+ "ot_u2i": 'up2k: ladda upp filer (om du har skrivrättigheter) eller byt till sökläge för att se om de finns någonstans på servern$N$Nuppladdningarna är återupptagbara, multitrådade och filernas tidsstämpel bevaras, men den använder mer CPU än [🎈] (den enkla uppladdaren)
under uppladdningens gång blir denna ikon en förloppsindikator!',
+ "ot_u2w": 'up2k: ladda upp filer med stöd för återupptagning (stäng din webbläsare och dra in samma filer senare)$N$Nmultitrådad och filernas tidsstämpel bevaras, men den använder mer CPU än [🎈] (den enkla uppladdaren)
under uppladdningens gång blir denna ikon en förloppsindikator!',
+ "ot_noie": 'Var vänlig använd Chrome / Firefox / Edge',
+
+ "ab_mkdir": "skapa mapp",
+ "ab_mkdoc": "nytt markdown-dokument",
+ "ab_msg": "skicka medd. till serverlogg",
+
+ "ay_path": "hoppa till mappar",
+ "ay_files": "hoppa till filer",
+
+ "wt_ren": "byt namn på urval$NSnabbtangent: F2",
+ "wt_del": "radera urval$NSnabbtangent: ctrl-K",
+ "wt_cut": "klipp urval<small>(för att klistra in någonstans)</small>$NSnabbtangent: ctrl-X",
+ "wt_cpy": "kopiera urval till urklipp$N(för att klistra in någonstans)$NSnabbtangent: ctrl-C",
+ "wt_pst": "klistra in tidigare urval$NSnabbtangent: ctrl-V",
+ "wt_selall": "välj alla filer$NSnabbtangent: ctrl-A (när en fil har fokus)",
+ "wt_selinv": "invertera urval",
+ "wt_zip1": "ladda ner denna mapp som ett arkiv",
+ "wt_selzip": "ladda ner urval som ett arkiv",
+ "wt_seldl": "ladda ner urval som separata filer$NSnabbtangent: Y",
+ "wt_npirc": "kopiera IRC-formatterad låtinfo",
+ "wt_nptxt": "kopiera låtinfo i klartext",
+ "wt_m3ua": "lägg till i m3u-spellista (klicka på 📻copy senare)",
+ "wt_m3uc": "kopiera m3u-spellista till urklipp",
+ "wt_grid": "växla mellan rutnät och listvy$NSnabbtangent: G",
+ "wt_prev": "föregående låt$NSnabbtangent: J",
+ "wt_play": "play / paus$NSnabbtangent: P",
+ "wt_next": "nästa låt$NSnabbtangent: L",
+
+ "ul_par": "samtidiga uppladdningar:",
+ "ut_rand": "slumpa filnamn",
+ "ut_u2ts": "bevara tidsstämpeln för senaste ändring$Nfrån ditt filsystem till servern\">📅",
+ "ut_ow": "skriv över existerande filer på servern?$N🛡️: aldrig (skapar ett nytt filnamn istället)$N🕒: skriv över om serverns fil är äldre än din$N♻️: skriv alltid över om filerna skiljer sig",
+ "ut_mt": "fortsätt hasha filer under uppladdningens gång$N$Nstäng av om din CPU eller disk är en flaskhals",
+ "ut_ask": 'bekräfta innan uppladdningar påbörjas">💭',
+ "ut_pot": "förbättra uppladdningshastigheten på långsamma enheter$Ngenom att förenkla användargränssnittet",
+ "ut_srch": "ladda inte upp; kolla istället om filerna redan existerar på $N servern (detta kommer att skanna alla mappar med läsrättighet)",
+ "ut_par": "du kan pausa all uppladdning genom att sätta detta till 0$N$Nöka denna om din uppkoppling är långsam eller har hög latens$N$Nsätt till 1 över lokala nätverk eller om serverns disk är en flaskhals",
+ "ul_btn": "släpp filer / mappar här (eller klicka)",
+ "ul_btnu": "L A D D A U P P",
+ "ul_btns": "S Ö K",
+
+ "ul_hash": "hashar",
+ "ul_send": "skickar",
+ "ul_done": "klar",
+ "ul_idle1": "inga uppladdningar har köats",
+ "ut_etah": "medelhastighet för <em>hashning</em>, och uppskattad återstående tid",
+ "ut_etau": "medelhastighet för <em>överföring</em>, och uppskattad återstående tid",
+ "ut_etat": "<em>total</em> medelhastighet, och uppskattad återstående tid",
+
+ "uct_ok": "lyckade",
+ "uct_ng": "no-good: misslyckade / avvisade / ej funna",
+ "uct_done": "ok och ng kombinerat",
+ "uct_bz": "pågående",
+ "uct_q": "köade",
+
+ "utl_name": "filnamn",
+ "utl_ulist": "visa",
+ "utl_ucopy": "kopiera",
+ "utl_links": "länkar",
+ "utl_stat": "status",
+ "utl_prog": "förlopp",
+
+ // keep short:
+ "utl_404": "404",
+ "utl_err": "FEL",
+ "utl_oserr": "OS-fel",
+ "utl_found": "hittad",
+ "utl_defer": "väntar",
+ "utl_yolo": "YOLO",
+ "utl_done": "klar",
+
+ "ul_flagblk": "filerna lades till i kön, men det finns en upptagen up2k i en annan webbläsarflik, så vi väntar på den först",
+ "ul_btnlk": "serverkonfigurationen har låst denna inställning",
+
+ "udt_up": "Ladda upp",
+ "udt_srch": "Sök",
+ "udt_drop": "släpp här",
+
+ "u_nav_m": '
jaha, vad har du då?
Enter = Filer (en eller flera)\nESC = En mapp (inklusive undermappar)',
+ "u_nav_b": 'FilerEn mapp',
+
+ "cl_opts": "växlar",
+ "cl_themes": "tema",
+ "cl_langs": "språk",
+ "cl_ziptype": "mappnedladdning",
+ "cl_uopts": "up2k-inställningar",
+ "cl_favico": "favikon",
+ "cl_bigdir": "stora mappar",
+ "cl_hsort": "#sort.",
+ "cl_keytype": "tonartsnotering",
+ "cl_hiddenc": "dolda kolumner",
+ "cl_hidec": "dölj",
+ "cl_reset": "återställ",
+ "cl_hpick": "tryck på en kolumntitel för att dölja den i filvyn",
+ "cl_hcancel": "kolumndöljning avbruten",
+
+ "ct_grid": '田 rutnätet',
+ "ct_ttips": '◔ ◡ ◔">ℹ️ tips',
+ "ct_thumb": 'växla mellan miniatyrer och ikoner i rutnätsvyn$NSnabbtangent: T">🖼️ miniatyrer',
+ "ct_csel": 'använd CTRL och SKIFT för urval av filer i rutnätsvyn">val',
+ "ct_ihop": 'skrolla till den senast visade filen när bildvisaren stängs">g⮯',
+ "ct_dots": 'visa dolda filer (om servern tillåter detta)">dolda',
+ "ct_qdel": 'bekräfta endast en gång när filer raderas">srad',
+ "ct_dir1st": 'sortera mappar före filer">📁 först',
+ "ct_nsort": 'naturlig sortering (för filnamn med ledande siffror)">nsort',
+ "ct_utc": 'visa alla datum och tider i UTC">UTC',
+ "ct_readme": 'visa README.md i listvyn">📜 läsmig',
+ "ct_idxh": 'visa index.html istället för listvyn">htm',
+ "ct_sbars": 'visa rullningslister">⟊',
+
+ "cut_umod": "om en fil redan existerar på servern, uppdatera serverns senast modifierade tidsstämpel till att matcha din lokala fil (kräver skriv+radera-rättighet)\">re📅",
+
+ "cut_turbo": "yolo-knappen, du vill förmodligen INTE aktivera denna:$N$Nanvänd denna om du höll på att ladda upp en stor mängd filer och var tvungen att stänga webbläsaren, och du vill fortsätta uppladdningen så fort som möjligt$N$Ndetta ersätter hash-checken med en enkel "har denna fil samma filstorlek på servern?", så om filinnehållet skiljer sig kommer den INTE att laddas upp$N$Ndu bör stänga av denna när uppladdningen är klar och sedan "ladda upp" samma filer igen för att låta klienten verifiera dem\">turbo",
+
+ "cut_datechk": "har endast effekt med turbo-växeln påslagen$N$Nminskar yolo-faktorn lite grann; kollar om filtidsstämplarna på servern matchar dina$N$Ndetta bör fånga de flesta ofärdiga / korrumperade uppladdningarna, men kan inte ersätta ett fullständigt verifieringspass med turbo avstängt\">date-chk",
+
+ "cut_u2sz": "storlek (i MiB) för varje uppladdnings-chunk; stora värden flyger bättre över atlanten. Prova lägre värden på mycket opålitliga uppkopplingar",
+
+ "cut_flag": "garantera att endast en flik laddar upp samtidigt $N -- andra flikar måste också ha denna påslagen -- $N påverkar endast flikar på samma domän",
+
+ "cut_az": "ladda upp filer i alfabetisk ordning, snarare än mindre filer först$N$Nalfabetisk ordning kan göra det enklare att se var något har gått fel, men uppladdningen blir lite långsammare över fiber / lokala nätverk",
+
+ "cut_nag": "skicka en systemnotifikation när uppladdningar blir klara$N(endast om webbläsaren eller fliken inte är fokuserade)",
+ "cut_sfx": "ljudnotifikation när uppladdningar blir klara$N(endast om webbläsaren eller fliken inte är fokuserade)",
+
+ "cut_mt": "använd multitrådning för att accelerera filhashningen$N$Ndetta använder web-workers och kräver$Nmer RAM (upp till 512 MiB extra)$N$Nuppladdningar över https blir 30% snabbare, över http 4.5x snabbare\">mt",
+
+ "cut_wasm": "använd wasm istället för webbläsarens inbyggda hashare; förbättrar hastigheten i chrome-baserade webbläsare men ökar CPU-lasten, och många äldre versioner av chrome har buggar som får webbläsaren att konsumera allt RAM-minne och krascha om detta är påslaget\">wasm",
+
+ "cft_text": "favikon-text (låt stå tom och uppdatera sidan för att stänga av)",
+ "cft_fg": "förgrundsfärg",
+ "cft_bg": "bakgrundsfärg",
+
+ "cdt_lim": "högsta antal filer att visa in en mapp",
+ "cdt_ask": "när du når botten av vyn,$Nbe om en åtgärd istället för att ladda fler filer",
+ "cdt_hsort": "hur många sorteringsregler (<code>,sorthref</code>) att inkludera i media-URL:er. Sätts detta till 0 kommer regler i klickade medialänkar även att ignoreras",
+
+ "tt_entree": "visa trädvy$NSnabbtangent: B",
+ "tt_detree": "visa brödsmulor$NSnabbtangent: B",
+ "tt_visdir": "skrolla till öppnad mapp",
+ "tt_ftree": "växla mellan trädvy och textfiler$NHotkey: V",
+ "tt_pdock": "visa överordnade mappar i en panel längst upp i vyn",
+ "tt_dynt": "väx vyn när trädet expanderar",
+ "tt_wrap": "automatisk radbrytning",
+ "tt_hover": "visa överlånga rader när muspekaren hovrar över dem$N( skrollhjulet fungerar ej såvida inte pekaren$Nstår till vänster )",
+
+ "ml_pmode": "vid mappens slut...",
+ "ml_btns": "komm.",
+ "ml_tcode": "konvertera",
+ "ml_tcode2": "konvertera till",
+ "ml_tint": "hy",
+ "ml_eq": "ljudutjämnare",
+ "ml_drc": "dynamikkompressor",
+
+ "mt_loop": "upprepa en låt\">🔁",
+ "mt_one": "stoppa uppspelningen efter en låt\">1️⃣",
+ "mt_shuf": "blanda låtarna i varje mapp\">🔀",
+ "mt_aplay": "spela automatiskt om det finns en låt-ID i länkar du har klickat på för att öppna sidan$N$Nom detta är avstängt kommer sidans adress inte att bli uppdaterad med en låt-ID om du spelar musik, för att förhindra automatisk uppspelning om dessa inställningar går förlorade men webbadressen återstår\">a▶",
+ "mt_preload": "påbörja nedladdning av nästa låt i förväg för gapfri uppspelning\">ladda",
+ "mt_prescan": "hoppa till nästa mapp i förväg så att webbläsaren$Nförblir glad och inte avbryter uppspelningen\">nav",
+ "mt_fullpre": "försök att ladda ner hela låten i förväg;$N✅ aktivera på opålitliga uppkopplingar,$N❌ avaktivera kanske på långsamma uppkopplingar\">full",
+ "mt_fau": "förhindra att uppspelningen avstannar på telefoner om nästa låt inte laddas tillräckligt snabbt i förväg (kan ge upphov till buggiga musiktaggar)\">☕️",
+ "mt_waves": "vågformsreglage:$Nvisa ljudstyrkan i uppspelningsreglaget\">~s",
+ "mt_npclip": "visa knappar för att kopiera låtinfo till urklippet\">/np",
+ "mt_m3u_c": "visa knappar för att kopiera de valda$Nlåtarna som en m3u8-spellista\">📻",
+ "mt_octl": "systemintegration (mediaknappar / skärmdisplay)\">os-ctl",
+ "mt_oseek": "tillåt fram- och bakåtspolning via systemintegrationen$N$Nobs.: på vissa enheter (iPhone)$Nersätter detta knappen för nästa låt\">spola",
+ "mt_oscv": "visa skivomslag i skärmdisplayen\">omslag",
+ "mt_follow": "skrolla vyn till den spelande låten\">🎯",
+ "mt_compact": "kompakt kontrollpanel\">⟎",
+ "mt_uncache": "rensa cachen (prova detta om din webbläsare har cachat$Nen trasig kopia av en låt och den vägrar spela upp den)\">rensa",
+ "mt_mloop": "upprepa den öppna mappen\">🔁 upprepa",
+ "mt_mnext": "ladda nästa mapp och fortsätt\">📂 nästa",
+ "mt_mstop": "stoppa uppspelningen\">⏸ stopp",
+ "mt_cflac": "konvertera flac / wav till {0}\">flac",
+ "mt_caac": "konvertera aac / m4a till {0}\">aac",
+ "mt_coth": "konvertera allt annat (förutom mp3) till {0}\">annat",
+ "mt_c2opus": "bäst val för pc, laptop, android\">opus",
+ "mt_c2owa": "opus-weba, för iOS 17.5 och senare\">owa",
+ "mt_c2caf": "opus-caf, för iOS 11 till 17\">caf",
+ "mt_c2mp3": "använd detta på mycket gamla enheter\">mp3",
+ "mt_c2flac": "bäst ljudkvalitet, men enorma nedladdningar\">flac",
+ "mt_c2wav": "okomprimerad uppspelning (ännu större)\">wav",
+ "mt_c2ok": "snyggt, bra val",
+ "mt_c2nd": "det är inte det rekommenderade formatet för din enhet, men det är lungt",
+ "mt_c2ng": "din enhet verkar inte stödja det här formatet, men vi provar ändå",
+ "mt_xowa": "det finns buggar i iOS som hindrar uppspelning i bakgrunden med detta format; vänligen använd caf eller mp3 istället",
+ "mt_tint": "nivå på bakgrundsfärg (0-100) på uppspelningsreglaget;$Ngör buffring mindre distraherande",
+ "mt_eq": "aktiverar utjämning och förstärkning;$N$Nboost <code>0</code> = standard 100%-volym (omodifierad)$N$Nwidth <code>1 </code> = standard stereo (omodifierad)$Nwidth <code>0.5</code> = 50% vänster-höger crossfeed$Nwidth <code>0 </code> = mono$N$Nboost <code>-0.8</code> & width <code>10</code> = tar bort sång :^)$N$Nnär utjämningen är aktiverad blir gaplösa album verkligen gaplösa, så låt den stå påslagen med alla värden satta till 0 (förutom width = 1) om du bryr dig om det",
+ "mt_drc": "aktiverar dynamikkompressorn (volymtillplattning / brickwaller); aktiverar även utjämnaren för att balansera röran, så sätt alla fält i utjämnaren förutom 'width' till 0 om du inte vill ha den$N$Nsänker all volym över THRESHOLD dB; för varje RATIO dB över THRESHOLD blir det 1 dB av output, så standardvärdena tresh = -24 och ratio = 12 innebär att volymen aldrig bör bli högre än -22 dB och det är säkert att höja utjämnarens boost till 0.8, eller t.o.m. 1.8 med ATK 0 och ett högt RLS-värde t.ex. 90 (fungerar endast i firefox; RLS är låst till högst 1 i andra webbläsare)$N$N(se wikipedia för en bättre förklaring)",
+
+ "mb_play": "play",
+ "mm_hashplay": "spela upp den här ljudfilen?",
+ "mm_m3u": "tryck Enter/OK för att spela\ntryck ESC/Avbryt to Edit",
+ "mp_breq": "firefox 82+ eller chrome 73+ eller iOS 15+ krävs",
+ "mm_bload": "laddar...",
+ "mm_bconv": "konverterar till {0}, vänligen vänta...",
+ "mm_opusen": "din webbläsare kan inte spela upp aac- eller m4a-filer;\nkonvertering till opus är nu påslaget",
+ "mm_playerr": "uppspelning misslyckades: ",
+ "mm_eabrt": "Uppspelningen avbröts",
+ "mm_enet": "Din uppkoppling är skum",
+ "mm_edec": "Filen är korrumperad??",
+ "mm_esupp": "Din webbläsare förstår inte detta format",
+ "mm_eunk": "Okänt Fel",
+ "mm_e404": "Kunde inte spela upp ljudfil; fel 404: Filen hittades inte.",
+ "mm_e403": "Kunde inte spela upp ljudfil; fel 403: Åtkomst nekad.\n\nProva att ladda om sidan med F5, du kanske blev utloggad",
+ "mm_e500": "Kunde inte spela upp ljudfil; fel 500: Kolla serverloggen.",
+ "mm_e5xx": "Kunde inte spela upp ljudfil; serverfel ",
+ "mm_nof": "hittade inga fler låtar i närheten",
+ "mm_prescan": "Letar efter fler låtar...",
+ "mm_scank": "Hittade nästa låt:",
+ "mm_uncache": "cachen rensad; alla låtar kommer att laddas ner igen vid uppspelning",
+ "mm_hnf": "den låten finns inte längre",
+
+ "im_hnf": "den bilden finns inte längre",
+
+ "f_empty": 'mappen är tom',
+ "f_chide": 'detta kommer att dölja kolumnen «{0}»\n\ndu kan visa kolumner igen i inställningarna',
+ "f_bigtxt": "den här filen är {0} MiB stor -- vill du verkligen visa den som text?",
+ "f_bigtxt2": "visa endast slutet på filen? detta aktiverar även övervakning, vilket visar nya rader i filen i realtid",
+ "fbd_more": '
',
+ "f_anota": "endast {0} av {1} objekt valdes;\nför att välja hela mappen, skrolla först till botten av vyn",
+
+ "f_dls": 'fillänkarna i den öppna mappen har\nbytts till nedladdningslänkar',
+
+ "f_partial": "För att säkert ladda ner en fil som för tillfället laddas upp, vänligen klicka på filen som har samma filnamn men utan .PARTIAL-filändelsen. Vänligen tryck Avbryt eller Escape för att göra detta.\n\nOm du bortser från denna varning och trycker OK eller Enter kommer den tillfälliga .PARTIAL-filen istället att laddas ner, vilket är nästan garanterat att ge dig korrumperad data.",
+
+ "ft_paste": "klistra in {0} objekt$NSnabbtangent: ctrl-V",
+ "fr_eperm": 'kan ej byta namn:\ndu har inte flytträttighet i denna mapp',
+ "fd_eperm": 'kan ej radera:\ndu har inte raderingsrättighet i denna mapp',
+ "fc_eperm": 'kan ej klippa:\ndu har inte flytträttighet i denna mapp',
+ "fp_eperm": 'kan ej klistra in:\ndu har inte skrivrättighet i denna mapp',
+ "fr_emore": "välj minst en fil att byta namn på",
+ "fd_emore": "välj minst en fil att radera",
+ "fc_emore": "välj minst en fil att klippa",
+ "fcp_emore": "välj minst en fil att kopiera till urklippet",
+
+ "fs_sc": "dela den öppna mappen",
+ "fs_ss": "dela de urvalda filerna",
+ "fs_just1d": "du kan inte välja mer än en mapp\neller blanda filer och mappar i samma urval",
+ "fs_abrt": "❌ avbryt",
+ "fs_rand": "🎲 slump.namn",
+ "fs_go": "✅ skapa utdelning",
+ "fs_name": "namn",
+ "fs_src": "källa",
+ "fs_pwd": "lösen",
+ "fs_exp": "utgång",
+ "fs_tmin": "min",
+ "fs_thrs": "timmar",
+ "fs_tdays": "dagar",
+ "fs_never": "oändlig",
+ "fs_pname": "valfritt länknamn; slumpas fram om detta står tomt",
+ "fs_tsrc": "filen eller mappen att dela",
+ "fs_ppwd": "valfritt lösenord",
+ "fs_w8": "skapar utdelning...",
+ "fs_ok": "tryck Enter/OK för att kopiera länken till urklipp\ntryck ESC/Avbryt för att stänga",
+
+ "frt_dec": "kan laga vissa typer av trasiga filnamn\">avkoda-url",
+ "frt_rst": "återställ modifierade filnamn till de ursprungliga\">↺ återställ",
+ "frt_abrt": "avbryt och stäng denna panel\">❌ avbryt",
+ "frb_apply": "BYT NAMN",
+ "fr_adv": "batch-, metadata- och mönsteromskrivning\">avancerat",
+ "fr_case": "skiftlägeskänsligt reguljärt uttryck\">skift",
+ "fr_win": "windows-säkra namn; ersätt <>:"\\|?* med japanska fullbreddtecken\">win",
+ "fr_slash": "ersätt / med ett tecken som inte skapar nya mappar\">ingen /",
+ "fr_re": "reguljärt sökuttryck att tillämpa på ursprungliga filnamn; grupper kan hänvisas till i formatfältet nedan via <code>(1)</code> och <code>(2)</code> osv.",
+ "fr_fmt": "inspirerat av foobar2000:$N<code>(title)</code> ersätts av låttitel,$N<code>[(artist) - ](title)</code> skippar [detta] om artisten är tom$N<code>$lpad((tn),2,0)</code> fyller i spårnumret till 2 siffror",
+ "fr_pdel": "ta bort",
+ "fr_pnew": "spara som",
+ "fr_pname": "ge ett nytt namn på din inställning",
+ "fr_aborted": "avbrutet",
+ "fr_lold": "gammalt namn",
+ "fr_lnew": "nytt namn",
+ "fr_tags": "taggar för de valda filerna (skrivskyddat, endast som referens):",
+ "fr_busy": "byter namn på {0} objekt...\n\n{1}",
+ "fr_efail": "namnbyte misslyckades:\n",
+ "fr_nchg": "{0} av de nya namnen ändrades p g a win och/eller ingen /\n\nÄr det okej att fortsätta med de nya namnen?",
+
+ "fd_ok": "radering lyckades",
+ "fd_err": "radering misslyckades:\n",
+ "fd_none": "inget raderades; kanske blockerat av serverkonfigurationen (xbd)?",
+ "fd_busy": "raderar {0} objekt...\n\n{1}",
+ "fd_warn1": "RADERA dessa {0} objekt?",
+ "fd_warn2": "Sista chansen! Det finns inget sätt att ångra detta. Radera?",
+
+ "fc_ok": "klippte {0} objekt",
+ "fc_warn": 'klippte {0} objekt, men:\n\nendast denna webbläsarflik kan klistra in dem\n(eftersom urvalet är så enormt stort)',
+
+ "fcc_ok": "kopierade {0} objekt till urklippet",
+ "fcc_warn": 'kopierade {0} objekt till urklippet, men:\n\nendast denna webbläsarflik kan klistra in dem\n(eftersom urvalet är så enormt stort)',
+
+ "fp_apply": "använd dessa namn",
+ "fp_ecut": "klipp eller kopiera filer / mappar först för att klistra / flytta dem\n\nobs.: du kan klippa och klistra mellan webbläsarflikar",
+ "fp_ename": "{0} objekt kan ej flyttas hit eftersom filnamnen redan är tagna. Ge dem nya namn nedan för att fortsätta, eller lämna fältet tomt för att skippa:",
+ "fcp_ename": "{0} objekt kan ej kopieras hit eftersom filnamnen redan är tagna. Ge dem nya namn nedan för att fortsätta, eller lämna fältet tomt för att skippa:",
+ "fp_emore": "det finns fortfarande filnamnskrockar att fixa",
+ "fp_ok": "flytt lyckades",
+ "fcp_ok": "kopiering lyckades",
+ "fp_busy": "flyttar {0} objekt...\n\n{1}",
+ "fcp_busy": "kopierar {0} objekt...\n\n{1}",
+ "fp_abrt": "avbryter...",
+ "fp_err": "flytt misslyckades:\n",
+ "fcp_err": "kopiering misslyckades:\n",
+ "fp_confirm": "flytta dessa {0} objekt hit?",
+ "fcp_confirm": "kopiera dessa {0} objekt hit?",
+ "fp_etab": 'lyckades ej läsa urklippet från en annan webbläsarflik',
+ "fp_name": "laddar upp en fil från din enhet. Ge den ett namn:",
+ "fp_both_m": '
välj vad som ska klistras in
Enter = Flytta {0} objekt från «{1}»\nESC = Ladda upp {2} filer från din enhet',
+ "fcp_both_m": '
välj vad som ska klistras in
Enter = Kopiera {0} objekt från «{1}»\nESC = Ladda upp {2} filer från din enhet',
+ "fp_both_b": 'FlyttaLadda upp',
+ "fcp_both_b": 'KopieraLadda upp',
+
+ "mk_noname": "skriv ett namn i fältet till vänster först :p",
+
+ "tv_load": "Laddar textfil:\n\n{0}\n\n{1}% ({2} av {3} MiB laddat)",
+ "tv_xe1": "kunde ej ladda textfil:\n\nfel ",
+ "tv_xe2": "404, filen hittades inte",
+ "tv_lst": "lista av textfiler i",
+ "tvt_close": "återvänd till mapp$NSnabbtangent: M (eller Esc)\">❌ stäng",
+ "tvt_dl": "ladda ner denna fil$NSnabbtangent: Y\">💾 ladda ner",
+ "tvt_prev": "visa föregående fil$NSnabbtangent: i\">⬆ föreg.",
+ "tvt_next": "visa nästa fil$NSnabbtangent: K\">⬇ nästa",
+ "tvt_sel": "välj fil ( för klipp / kopiera / radera / ... )$NSnabbtangent: S\">välj",
+ "tvt_edit": "öppna fil i textredigerare$NSnabbtangent: E\">✏️ redigera",
+ "tvt_tail": "övervaka filen; visa nya rader i realtid\">📡 övervaka",
+ "tvt_wrap": "automatisk radbrytning\">↵",
+ "tvt_atail": "lås vyn till sidans botten\">⚓",
+ "tvt_ctail": "avkoda terminalfärger (ansi-escapesekvenser)\">🌈",
+ "tvt_ntail": "gräns för scrollback (hur många byte ska behållas laddade)",
+
+ "m3u_add1": "låt tillagd till m3u-spellista",
+ "m3u_addn": "{0} låtar tillagda till m3u-spellista",
+ "m3u_clip": "m3u-spellista kopierad till urklippet\n\ndu bör skapa en ny textfil som heter någonting.m3u och klistra in spellistan i det dokumentet; detta gör den uppspelbar",
+
+ "gt_vau": "visa inte videor, spela endast ljudet\">🎧",
+ "gt_msel": "urval av filer; ctrl-klicka en fil för standardbeteende$N$N<em>när detta är aktiverat: dubbelklicka en fil / mapp för att öppna den</em>$N$NSnabbtangent: S\">urval",
+ "gt_crop": "centrera och beskär miniatyrbilder\">beskär",
+ "gt_3x": "högupplösta miniatyrbilder\">3x",
+ "gt_zoom": "zoom",
+ "gt_chop": "klipp",
+ "gt_sort": "sortera efter",
+ "gt_name": "namn",
+ "gt_sz": "storlek",
+ "gt_ts": "datum",
+ "gt_ext": "typ",
+ "gt_c1": "förkorta filnamn (visa mindre)",
+ "gt_c2": "förläng filnamn (visa mer)",
+
+ "sm_w8": "söker...",
+ "sm_prev": "sökresultaten nedan är från en tidigare sökning:\n ",
+ "sl_close": "stäng sökresultaten",
+ "sl_hits": "visar {0} träffar",
+ "sl_moar": "ladda fler",
+
+ "s_sz": "storlek",
+ "s_dt": "datum",
+ "s_rd": "sökväg",
+ "s_fn": "namn",
+ "s_ta": "taggar",
+ "s_ua": "uppl.",
+ "s_ad": "avanc.",
+ "s_s1": "minimum MiB",
+ "s_s2": "maximum MiB",
+ "s_d1": "min. iso8601",
+ "s_d2": "max. iso8601",
+ "s_u1": "uppladdad efter",
+ "s_u2": "och/eller före",
+ "s_r1": "sökvägen innehåller (blankstegsseparerat)",
+ "s_f1": "filnamnet innehåller (invertera med -intedetta)",
+ "s_t1": "taggar innehåller (^=start, slut=$)",
+ "s_a1": "specifika metadataegenskaper",
+
+ "md_eshow": "kan ej visa ",
+ "md_off": "[📜läsmig] avstängt i [⚙️] -- dokumentet är dolt",
+
+ "badreply": "Kunde ej tolka svaret från servern",
+
+ "xhr403": "403: Åtkomst nekad\n\nProva att ladda om sidan med F5, du kanske blev utloggad",
+ "xhr0": "okänt (tappade förmodligen kontakt med servern, eller så är den nere)",
+ "cf_ok": "ledsen -- DD" + wah + "oS-skyddet har aktiverats\n\nsaker bör fungera igen om 30 sekunder\n\nom inget händer, ladda om sidan med F5",
+ "tl_xe1": "kunde inte visa undermappar:\n\nfel ",
+ "tl_xe2": "404: Mappen hittades inte",
+ "fl_xe1": "kunde inte visa filer i mapp:\n\nfel ",
+ "fl_xe2": "404: Mappen hittades inte",
+ "fd_xe1": "kunde inte skapa mapp:\n\nfel ",
+ "fd_xe2": "404: Överordnad mapp hittades inte",
+ "fsm_xe1": "kunde inte skicka meddelande:\n\ndel ",
+ "fsm_xe2": "404: Överordnad mapp hittades inte",
+ "fu_xe1": "kunde inte ladda unpost-listan från servern:\n\nfel ",
+ "fu_xe2": "404: Filen hittades inte??",
+
+ "fz_tar": "okomprimerad tar-fil i gnu-format (linux / mac)",
+ "fz_pax": "okomprimerad tar-fil i pax-format (långsammare)",
+ "fz_targz": "gnu-tar komprimerad med gzip-nivå 3$N$Ndetta är vanligtvis mycket långsamt,$Nanvänd okomprimerad tar istället",
+ "fz_tarxz": "gnu-tar komprimerad med xz-nivå 1$N$Ndetta är vanligtvis mycket långsamt,$Nanvänd okomprimerad tar istället",
+ "fz_zip8": "zip-fil med utf8-filnman (kan vara skum i windows 7 och äldre)",
+ "fz_zipd": "zip-fil med standard cp437-filnamn, för riktigt gammal mjukvara",
+ "fz_zipc": "cp437 med crc32 uträknad i förväg,$Nför MS-DOS PKZIP v2.04g (oktober 1993)$N(tar längre tid att behandla innan nedladdningen kan påbörjas)",
+
+ "un_m1": "du kan radera dina senaste uppladdningar (eller avbryta pågående sådana) nedan",
+ "un_upd": "uppdatera",
+ "un_m4": "eller, dela filerna som syns nedan:",
+ "un_ulist": "visa",
+ "un_ucopy": "kopiera",
+ "un_flt": "filter: sökvägen måste innehålla",
+ "un_fclr": "rensa filtret",
+ "un_derr": 'unpost-radering misslyckades:\n',
+ "un_f5": 'något gick sönder, prova att uppdatera eller tryck på F5',
+ "un_uf5": "ledsen men du måste uppdatera sidan (t.ex. genom att trycka på F5 eller CTRL-R) innan du kan avbryta den här uppladdningen",
+ "un_nou": 'varning: servern är för upptagen för att visa pågående uppladdningar; klicka på "uppdatera" om en stund',
+ "un_noc": 'varning: serverkonfigurationen tillåter inte unpost:ning av uppladdade filer',
+ "un_max": "visar de första 2000 filerna (använd filtret)",
+ "un_avail": "{0} av de senaste uppladdningarna kan raderas {1} pågående uppladdningar kan avbrytas",
+ "un_m2": "sorterat efter uppladdningstid; senast uppladdad först:",
+ "un_no1": "tjosan! inga uppladdningar är tillräckligt nya",
+ "un_no2": "tjosan! inga uppladdningar som matchar filtret är tillräckligt nya",
+ "un_next": "radera de {0} nästkommande filerna",
+ "un_abrt": "avbryt",
+ "un_del": "radera",
+ "un_m3": "laddar dina senaste uppladdningar...",
+ "un_busy": "raderar {0} filer...",
+ "un_clip": "{0} länkar kopierade till urklippet",
+
+ "u_https1": "du bör",
+ "u_https2": "byta till https",
+ "u_https3": "för bättre prestanda",
+ "u_ancient": 'din webbläsare är imponerande uråldrig -- du kanske borde använda bup istället',
+ "u_nowork": "firefox 53+ eller chrome 57+ eller iOS 11+ krävs",
+ "tail_2old": "firefox 105+ eller chrome 71+ eller iOS 14.5+ krävs",
+ "u_nodrop": 'din webbläsare är för gammal för dra-och-släpp-uppladdning',
+ "u_notdir": "det där är ingen mapp!\n\ndin webbläsare är för gammal,\nprova dra-och-släpp istället",
+ "u_uri": "släpp bilder från andra webbläsarfönster på den stora\nuppladdningsknappen för att ladda upp dem",
+ "u_enpot": 'byt till potatisgränssnittet (kan förbättra uppladdningshastigheten)',
+ "u_depot": 'byt till det snygga gränssnittet (kan försämra uppladdningshastigheten)',
+ "u_gotpot": 'byter till potatisgränssnittet för förbättrad uppladdningshastighet,\n\nbyt gärna tillbaka om du vill!',
+ "u_pott": "
",
+ "u_ever": "detta är den enkla uppladdaren; up2k kräver minst chrome 21 // firefox 13 // edge 12 // opera 12 // safari 5.1",
+ "u_su2k": 'detta är den enkla uppladdaren; up2k är bättre',
+ "u_uput": 'optimera hastigheten (skippa checksumman)',
+ "u_ewrite": 'du har inte skrivrättighet i denna mapp',
+ "u_eread": 'du har inte läsrättighet i denna mapp',
+ "u_enoi": 'serverkonfigurationen har inte slagit på sökning',
+ "u_enoow": "du kan inte skriva över här; raderingsrättighet krävs",
+ "u_badf": 'Dessa {0} filer (av totalt {1}) skippades, möjligtvis p.g.a. filsystemsrättigheter:\n\n',
+ "u_blankf": 'Dessa {0} filer (av totalt {1}) är tomma; ladda upp dem ändå?\n\n',
+ "u_applef": 'Dessa {0} filer (av totalt {1}) är förmodligen oönskade;\nTryck OK/Enter för att SKIPPA de följande filerna,\nTryck Avbryt/ESC för att INKLUDERA och LADDA UPP dem:\n\n',
+ "u_just1": '\nDet kanske fungerar om du endast väljer en fil',
+ "u_ff_many": "om du använder Linux / MacOS / Android, så kan denna mängd filer krascha Firefox!\nom detta händer, vänligen försök igen (eller använd Chrome).",
+ "u_up_life": "Denna uppladdning kommer att raderas från servern om\n{0} efter att den har blivit uppladdad",
+ "u_asku": 'ladda upp dessa {0} filer till {1}',
+ "u_unpt": "du kan ångra / radera denna uppladdning med 🧯 uppe till vänster",
+ "u_bigtab": 'försöker att visa {0} filer\n\ndetta kan krascha din webbläsare, är du säker?',
+ "u_scan": 'Scannar filer...',
+ "u_dirstuck": 'katalogskannern fastnade när den försökte komma åt de följande {0} objekten; dessa kommer att skippas:',
+ "u_etadone": 'Klar ({0}, {1} filer)',
+ "u_etaprep": '(förbereder uppladdning)',
+ "u_hashdone": 'hashning klar',
+ "u_hashing": 'hashar',
+ "u_hs": 'skakar hand...',
+ "u_started": "filerna laddas nu upp; se [🚀]",
+ "u_dupdefer": "duplikat; kommer att behandlas efter alla andra filer",
+ "u_actx": "klicka här för att undvika prestandaförlust när du byter till andra fönster/flikar",
+ "u_fixed": "Okej! Fixat 👍",
+ "u_cuerr": "misslyckades att ladda upp chunk {0} av {1};\nförmodligen harmlöst, fortsätter\n\nfil: {2}",
+ "u_cuerr2": "servern avvisade uppladdningen (chunk {0} av {1});\nprovar igen senare\n\nfil: {2}\n\nfel ",
+ "u_ehstmp": "provar igen; see nedåt till höger",
+ "u_ehsfin": "servern avvisade förfrågan att färdigställa uppladdningen; provar igen...",
+ "u_ehssrch": "servern avvisade förfrågan att söka; provar igen...",
+ "u_ehsinit": "servern avvisade förfrågan att påbörja uppladdningen; provar igen...",
+ "u_eneths": "nätverksfel vid handskakning; provar igen...",
+ "u_enethd": "nätverksfel när destinationens existens testades; provar igen...",
+ "u_cbusy": "väntar på att servern ska lita på oss igen efter nätverksfel...",
+ "u_ehsdf": "servern fick slut på diskutrymme!\n\nprovar igen, ifall någon rensar upp\ntillräckligt med utrymme för att fortsätta",
+ "u_emtleak1": "det verkar som att din webbläsare kanske har en minnesläcka;\nvänligen",
+ "u_emtleak2": ' byt till https (rekommenderat) eller ',
+ "u_emtleak3": ' ',
+ "u_emtleakc": 'prova följande:\n
tryck F5 för att uppdatera sidan
avaktivera sedan mt -växeln i ⚙️-inställningarna
och prova att ladda upp igen
Uppladdningar kommer att vara lite långsammare, men aja.\nBeklagar problemet!\n\nPS: chrome v107 har en buggfix för detta',
+ "u_emtleakf": 'prova följande:\n
tryck F5 för att uppdatera sidan
aktivera sedan 🥔 (potatis) i uppladdningsgränssnittet
och prova att ladda upp igen
\nPS: firefox kommer förhoppningsvis få en buggfix vid något tillfälle',
+ "u_s404": "hittades ej på servern",
+ "u_expl": "förklara",
+ "u_maxconn": "de flesta webbläsare begränsar detta till 6, men firefox låter dig höja gränsen med connections-per-server i about:config",
+ "u_tu": '
VARNING: turbo är aktiverat, det är möjligt att klienten inte upptäcker och återupptar ofärdiga uppladdningar; se tipset för turbo-växeln
',
+ "u_ts": '
VARNING: turbo är aktiverat, sökresultat kan vara felaktiga; se tipset för turbo-växeln
',
+ "u_turbo_c": "serverkonfigurationen har avaktiverat turbo",
+ "u_turbo_g": "avaktiverar turbo eftersom du inte har rättigheten\natt se mappars innehåll i den här volymen",
+ "u_life_cfg": 'radera automatiskt efter min (eller timmar)',
+ "u_life_est": 'uppladdningen kommer att raderas vid ---',
+ "u_life_max": 'denna mapp tvingar en\nhögsta livstid på {0}',
+ "u_unp_ok": 'unpost är tillåten för {0}',
+ "u_unp_ng": 'unpost är INTE tillåten',
+ "ue_ro": 'du har endast läsrättighet till denna mapp\n\n',
+ "ue_nl": 'du är inte inloggad',
+ "ue_la": 'du är inloggad som "{0}"',
+ "ue_sr": 'du är i filsökläge\n\nbyt till uppladdningsläge genom att klicka på förstoringsglaset 🔎 (bredvid den stora SÖK-knappen), och försök ladda upp igen\n\nledsen',
+ "ue_ta": 'prova att ladda upp igen nu, det bör fungera',
+ "ue_ab": "denna fil laddas redan upp till en annan mapp, och den uppladdningen måste färdigställas innan filen kan laddas upp någon annanstans.\n\nDu kan avbryta och glömma bort den uppladdningen med 🧯 uppe till vänster",
+ "ur_1uo": "Okej: Filen laddades upp med framgång",
+ "ur_auo": "Okej: Alla {0} filer laddades upp med framgång",
+ "ur_1so": "Okej: Filen fanns på servern",
+ "ur_aso": "Okej: Alla {0} filer fanns på servern",
+ "ur_1un": "Uppladdningen misslyckades, ledsen",
+ "ur_aun": "Alla {0} uppladdningar misslyckades, ledsen",
+ "ur_1sn": "Filen hittades INTE på servern",
+ "ur_asn": "De {0} filerna hittades INTE på servern",
+ "ur_um": "Klar;\n{0} uppladdningar gick okej,\n{1} uppladdningar misslyckades, ledsen",
+ "ur_sm": "Klar;\n{0} filer hittades på servern,\n{1} filer hittades INTE på servern",
+
+ "lang_set": "uppdatera för att ändringen ska ta effekt?",
+ },
"ukr": {
"tt": "Українська",
@@ -9737,9 +10381,9 @@ var Ls = {
"mt_mloop": "зациклити відкриту папку\">🔁 loop",
"mt_mnext": "завантажити наступну папку і продовжити\">📂 next",
"mt_mstop": "зупинити відтворення\">⏸ stop",
- "mt_cflac": "конвертувати flac / wav в opus\">flac",
- "mt_caac": "конвертувати aac / m4a в opus\">aac",
- "mt_coth": "конвертувати всі інші (не mp3) в opus\">oth",
+ "mt_cflac": "конвертувати flac / wav в {0}\">flac",
+ "mt_caac": "конвертувати aac / m4a в {0}\">aac",
+ "mt_coth": "конвертувати всі інші (не mp3) в {0}\">oth",
"mt_c2opus": "найкращий вибір для робочих столів, ноутбуків, android\">opus",
"mt_c2owa": "opus-weba, для iOS 17.5 і новіших\">owa",
"mt_c2caf": "opus-caf, для iOS 11 до 17\">caf",
@@ -9864,6 +10508,7 @@ var Ls = {
"fcp_ok": "копіювання OK",
"fp_busy": "переміщення {0} елементів...\n\n{1}",
"fcp_busy": "копіювання {0} елементів...\n\n{1}",
+ "fp_abrt": "переривання...", //m
"fp_err": "переміщення невдале:\n",
"fcp_err": "копіювання невдале:\n",
"fp_confirm": "перемістити ці {0} елементи сюди?",
@@ -10074,7 +10719,7 @@ var Ls = {
},
};
-var LANGS = ["eng", "nor", "nno", "chi", "cze", "deu", "fin", "fra", "grc", "ita", "kor", "nld", "rus", "spa", "ukr"];
+var LANGS = ["eng", "nor", "nno", "chi", "cze", "deu", "fin", "fra", "grc", "ita", "kor", "nld", "rus", "spa", "swe", "ukr"];
if (window.langmod)
langmod();
@@ -10511,6 +11156,7 @@ var ACtx = !IPHONE && (window.AudioContext || window.webkitAudioContext),
hash0 = location.hash,
sloc0 = '' + location,
noih = /[?&]v\b/.exec(sloc0),
+ abrt_key = "",
rtt = null,
ldks = [],
dks = {},
@@ -10786,6 +11432,9 @@ var mpl = (function () {
clmod(btns[a], 'on', fmts[a] == v)
r.ac2 = v;
+ ebi('ac_flac').setAttribute('tt', L.mt_cflac.split('"')[0].format(v));
+ ebi('ac_aac').setAttribute('tt', L.mt_caac.split('"')[0].format(v));
+ ebi('ac_oth').setAttribute('tt', L.mt_coth.split('"')[0].format(v));
};
r.pp = function () {
@@ -13040,6 +13689,15 @@ function fmt_ren(re, md, fmt) {
}
+function fs_abrt() {
+ toast.inf(30, L.fp_abrt);
+ fileman.f.length = 0;
+ var xhr = new XHR();
+ xhr.open('POST', '/?fs_abrt=' + abrt_key, true);
+ xhr.send();
+}
+
+
var fileman = (function () {
var bren = ebi('fren'),
bdel = ebi('fdel'),
@@ -13050,6 +13708,7 @@ var fileman = (function () {
t_paste,
r = {};
+ r.f = [];
r.clip = null;
try {
r.bus = new BroadcastChannel("fileman_bus");
@@ -13337,6 +13996,8 @@ var fileman = (function () {
base = vsplit(sel[0].vp)[0],
mkeys;
+ r.f = f;
+
for (var a = 0; a < sel.length; a++) {
var vp = sel[a].vp;
if (vp.endsWith('/'))
@@ -13616,7 +14277,9 @@ var fileman = (function () {
return rn_cancel();
}
- toast.show('inf r', 0, esc(L.fr_busy.format(f.length, f[0].ofn)));
+ var msg = esc(L.fr_busy.format(f.length, f[0].ofn));
+ msg += '\n' + L.fs_abrt + '';
+ toast.show('inf r', 0, msg);
var dst = base + uricom_enc(f[0].inew.value, false);
function rename_cb() {
@@ -13630,8 +14293,10 @@ var fileman = (function () {
return rn_apply_loop();
}
+ abrt_key = randstr(9);
+
var xhr = new XHR();
- xhr.open('POST', f[0].src + '?move=' + dst, true);
+ xhr.open('POST', f[0].src + '?move=' + dst + '&akey=' + abrt_key, true);
xhr.onload = xhr.onerror = rename_cb;
xhr.send();
}
@@ -13893,6 +14558,8 @@ var fileman = (function () {
srcdir = vsplit(r.clip[0])[0],
links = QSA('#files tbody td:nth-child(2) a');
+ r.f = f;
+
for (var a = 0, aa = links.length; a < aa; a++)
indir.push(uricom_dec(vsplit(noq_href(links[a]))[1]));
@@ -13924,13 +14591,17 @@ var fileman = (function () {
if (!t.dst)
return paster();
- toast.show('inf r', 0, esc((r.ccp ? L.fcp_busy : L.fp_busy).format(f.length + 1, uricom_dec(t.src))));
+ var msg = esc((r.ccp ? L.fcp_busy : L.fp_busy).format(f.length + 1, uricom_dec(t.src)));
+ msg += '\n' + L.fs_abrt + '';
+ toast.show('inf r', 0, msg);
var xhr = new XHR(),
act = r.ccp ? '?copy=' : '?move=',
dst = get_evpath() + uricom_enc(t.dst);
- xhr.open('POST', t.src + act + dst, true);
+ abrt_key = randstr(9);
+
+ xhr.open('POST', t.src + act + dst + '&akey=' + abrt_key, true);
xhr.onload = xhr.onerror = paste_cb;
xhr.send();
}
@@ -17375,7 +18046,7 @@ var settheme = (function () {
var html = [],
cb = ebi('themes'),
itheme = ax.indexOf(theme[0]) * 2 + (light ? 1 : 0),
- names = ['classic dark', 'classic light', 'pm-monokai', 'flat light', 'vice', 'hotdog stand', 'hacker', 'hi-con'];
+ names = ['classic dark', 'classic light', 'pm-monokai', 'flat light', 'vice', 'hotdog stand', 'hacker', 'hi-con', 'phi95 dark', 'phi95'];
for (var a = 0; a < themes; a++)
html.push(''.format(a, names[a] || 'custom'));
diff --git a/copyparty/web/splash.js b/copyparty/web/splash.js
index 0df5fabe..aad6ad2a 100644
--- a/copyparty/web/splash.js
+++ b/copyparty/web/splash.js
@@ -552,6 +552,48 @@ var Ls = {
"af1": "mostrar subidas recientes",
"ag1": "mostrar usuarios IdP conocidos"
},
+ "swe": {
+ "a1": "uppdatera",
+ "b1": "tjena främling (du är inte inloggad)",
+ "c1": "logga ut",
+ "d1": "dumpa stacken",
+ "d2": "visar tillståndet på alla aktiva trådar",
+ "e1": "ladda om konfig.",
+ "e2": "ladda om konfigurationsfiler (konton/volymer/volflaggor),$Noch skanna om alla e2ds-volymer$N$Nobs.: ändrade globala inställningar$Nkräver en fullständig omstart",
+ "f1": "du kan bläddra:",
+ "g1": "du kan ladda upp till:",
+ "cc1": "annat:",
+ "h1": "avaktivera k304",
+ "i1": "aktivera k304",
+ "j1": "med k304 aktiverad kommer klienten att koppla bort sig vid varje HTTP 304-fel, vilket kan hindra vissa buggiga proxyservrar från att fastna (sidor slutar ladda), men saker kommer också att bli långsammare i allmänhet",
+ "k1": "återställ klientinställningar",
+ "l1": "logga in för att se mer:",
+ "m1": "välkommen tillbaka,",
+ "n1": "404 hittades inte ┐( ´ -`)┌",
+ "o1": 'eller så har du kanske inte tillgång -- prova ett lösenord eller åk hem',
+ "p1": "403 nekat ~┻━┻",
+ "q1": 'använd ett lösenord eller åk hem',
+ "r1": "åk hem",
+ ".s1": "skanna om",
+ "t1": "åtgärd",
+ "u2": "tid sedan senaste serverskrivning$N( uppladdning / namnbyte / ... )$N$N17d = 17 dagar$N1h23 = 1 timme 23 minuter$N4m56 = 4 minuter 56 sekunder",
+ "v1": "koppla upp",
+ "v2": "använd denna server som en lokal disk",
+ "w1": "byt till https",
+ "x1": "byt lösenord",
+ "y1": "redigera utdelningar",
+ "z1": "lås upp denna utdelning:",
+ "ta1": "fyll i ditt nya lösenord",
+ "ta2": "upprepa det nya lösenordet:",
+ "ta3": "det blev fel; vänligen försök igen",
+ "aa1": "inkommande filer:",
+ "ab1": "avaktivera no304",
+ "ac1": "aktivera no304",
+ "ad1": "detta stänger av all cachning; prova detta om k304 inte räckte till. Detta kommer att slösa enorma mängder nätverkstrafik!",
+ "ae1": "aktiva nedladdningar:",
+ "af1": "visa senaste uppladdningar",
+ "ag1": "visa idp-cache"
+ },
"ukr": {
"a1": "оновити",
"b1": "привітик, незнайомцю (ви не авторизовані)",
diff --git a/tests/util.py b/tests/util.py
index f02f81ba..bbd0b215 100644
--- a/tests/util.py
+++ b/tests/util.py
@@ -143,7 +143,7 @@ class Cfg(Namespace):
def __init__(self, a=None, v=None, c=None, **ka0):
ka = {}
- ex = "allow_flac allow_wav chpw cookie_lax daw dav_auth dav_mac dav_rt e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only ih ihead localtime magic nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_fnugg no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_zip nrand nsort nw og og_no_head og_s_title ohead q rand re_dirsz reflink rmagic rss smb srch_dbg srch_excl stats uqe usernames vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs"
+ ex = "allow_flac allow_wav chpw cookie_lax daw dav_auth dav_mac dav_rt e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only ih ihead localtime magic nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_fnugg no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_u2abrt no_zip nrand nsort nw og og_no_head og_s_title ohead q rand re_dirsz reflink rmagic rss smb srch_dbg srch_excl stats uqe usernames vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs"
ka.update(**{k: False for k in ex.split()})
ex = "dav_inf dedup dotpart dotsrch hook_v no_dhash no_fastboot no_fpool no_htp no_rescan no_sendfile no_ses no_snap no_up_list no_voldump re_dhash see_dots plain_ip"