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)<br /><br />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)<br /><br />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å <code>📻copy</code> 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<br>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,</b><br>men det finns en upptagen up2k i en annan webbläsarflik,<br>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": '<h6>jaha, vad har du då?</h6><code>Enter</code> = Filer (en eller flera)\n<code>ESC</code> = En mapp (inklusive undermappar)', + "u_nav_b": '<a href="#" id="modal-ok">Filer</a><a href="#" id="modal-ng">En mapp</a>', + + "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 <em>"har denna fil samma filstorlek på servern?"</em>, 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 <em>bör</em> 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å <b>opålitliga</b> uppkopplingar,$N❌ <b>avaktivera</b> 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 <code>Enter/OK</code> för att spela\ntryck <code>ESC/Avbryt</code> 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": '<div id="blazy"><code>{0}</code> av <code>{1}</code> filer visas; <a href="#" id="bd_more">visa {2}</a> eller <a href="#" id="bd_all">visa alla</a></div>', + "fbd_all": '<div id="blazy"><code>{0}</code> av <code>{1}</code> filer visas; <a href="#" id="bd_all">visa alla</a></div>', + "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 <code>.PARTIAL</code>-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 <code>.PARTIAL</code>-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 <code>Enter/OK</code> för att kopiera länken till urklipp\ntryck <code>ESC/Avbryt</code> 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 <code><>:"\\|?*</code> med japanska fullbreddtecken\">win", + "fr_slash": "ersätt <code>/</code> 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 <code>win</code> och/eller <code>ingen /</code>\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": "<b>Sista chansen!</b> Det finns inget sätt att ångra detta. Radera?", + + "fc_ok": "klippte {0} objekt", + "fc_warn": 'klippte {0} objekt, men:\n\nendast <b>denna</b> 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 <b>denna</b> 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": '<h6>välj vad som ska klistras in</h6><code>Enter</code> = Flytta {0} objekt från «{1}»\n<code>ESC</code> = Ladda upp {2} filer från din enhet', + "fcp_both_m": '<h6>välj vad som ska klistras in</h6><code>Enter</code> = Kopiera {0} objekt från «{1}»\n<code>ESC</code> = Ladda upp {2} filer från din enhet', + "fp_both_b": '<a href="#" id="modal-ok">Flytta</a><a href="#" id="modal-ng">Ladda upp</a>', + "fcp_both_b": '<a href="#" id="modal-ok">Kopiera</a><a href="#" id="modal-ng">Ladda upp</a>', + + "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": "[📜<em>läsmig</em>] 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": '<b>varning:</b> servern är för upptagen för att visa pågående uppladdningar; klicka på "uppdatera" om en stund', + "un_noc": '<b>varning:</b> 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<br />{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 <a href="#" onclick="goto(\'bup\')">använda bup istället</a>', + "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 <a href="#">potatisgränssnittet</a> (kan förbättra uppladdningshastigheten)', + "u_depot": 'byt till <a href="#">det snygga gränssnittet</a> (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": "<p>filer:   <b>{0}</b> färdiga,   <b>{1}</b> misslyckade,   <b>{2}</b> pågående,   <b>{3}</b> köade</p>", + "u_ever": "detta är den enkla uppladdaren; up2k kräver minst<br>chrome 21 // firefox 13 // edge 12 // opera 12 // safari 5.1", + "u_su2k": 'detta är den enkla uppladdaren; <a href="#" id="u2yea">up2k</a> ä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 <code>OK/Enter</code> för att SKIPPA de följande filerna,\nTryck <code>Avbryt/ESC</code> 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 <b>Linux / MacOS / Android,</b> så <em>kan</em> denna mängd filer <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=1790500\" target=\"_blank\">krascha Firefox!</a>\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 <code>{1}</code>', + "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<br />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": ' <a href="{0}">byt till https (rekommenderat)</a> eller ', + "u_emtleak3": ' ', + "u_emtleakc": 'prova följande:\n<ul><li>tryck <code>F5</code> för att uppdatera sidan</li><li>avaktivera sedan  <code>mt</code> -växeln i  <code>⚙️-inställningarna</code></li><li>och prova att ladda upp igen</li></ul>Uppladdningar kommer att vara lite långsammare, men aja.\nBeklagar problemet!\n\nPS: chrome v107 <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1354816" target="_blank">har en buggfix</a> för detta', + "u_emtleakf": 'prova följande:\n<ul><li>tryck <code>F5</code> för att uppdatera sidan</li><li>aktivera sedan <code>🥔</code> (potatis) i uppladdningsgränssnittet<li>och prova att ladda upp igen</li></ul>\nPS: firefox <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790500" target="_blank">kommer förhoppningsvis få en buggfix</a> 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 <code>connections-per-server</code> i <code>about:config</code>", + "u_tu": '<p class="warn">VARNING: turbo är aktiverat, <span> det är möjligt att klienten inte upptäcker och återupptar ofärdiga uppladdningar; se tipset för turbo-växeln</span></p>', + "u_ts": '<p class="warn">VARNING: turbo är aktiverat, <span> sökresultat kan vara felaktiga; se tipset för turbo-växeln</span></p>', + "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 <input id="lifem" p="60" /> min (eller <input id="lifeh" p="3600" /> timmar)', + "u_life_est": 'uppladdningen kommer att raderas vid <span id="lifew" tt="local time">---</span>', + "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<a id="fs_abrt" class="btn" href="#" onclick="fs_abrt()">' + L.fs_abrt + '</a>'; + 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<a id="fs_abrt" class="btn" href="#" onclick="fs_abrt()">' + L.fs_abrt + '</a>'; + 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('<option value="{0}">{0} ┃ {1}</option>'.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   <small>(du är inte inloggad)</small>", + "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), <em>men</em> 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 <a href="' + SR + '/?h">åk hem</a>', + "p1": "403 nekat  ~┻━┻", + "q1": 'använd ett lösenord eller <a href="' + SR + '/?h">åk hem</a>', + "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": "привітик, незнайомцю   <small>(ви не авторизовані)</small>", 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"