mirror of
https://github.com/9001/copyparty.git
synced 2026-01-12 07:44:08 -07:00
Compare commits
27 commits
v1.20.0
...
hovudstrau
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d223d6ca7 | ||
|
|
caf831fc28 | ||
|
|
ae56f3bdae | ||
|
|
25a8b96fd1 | ||
|
|
7357d46f43 | ||
|
|
3aebfabd5c | ||
|
|
8914f0af70 | ||
|
|
a9ae6d5131 | ||
|
|
ecd4fcc1b3 | ||
|
|
738a419b2b | ||
|
|
3a16d3461d | ||
|
|
3a52096205 | ||
|
|
87a5c22a34 | ||
|
|
7d6e59f347 | ||
|
|
b918b592ca | ||
|
|
cbeb439ad2 | ||
|
|
74a6ce1c1e | ||
|
|
2f4a30b620 | ||
|
|
6c41bac6d2 | ||
|
|
8c9e1016de | ||
|
|
9030828494 | ||
|
|
13055c6451 | ||
|
|
038af50777 | ||
|
|
7ffb1fd0ca | ||
|
|
364f74a1bd | ||
|
|
feabbf3e6a | ||
|
|
5b2c84752d |
|
|
@ -1730,7 +1730,7 @@ set upload rules using volflags, some examples:
|
|||
* just to avoid additional complexity in up2k which is enough of a mess already
|
||||
* `:c,lifetime=300` delete uploaded files when they become 5 minutes old
|
||||
|
||||
you can also set transaction limits which apply per-IP and per-volume, but these assume `-j 1` (default) otherwise the limits will be off, for example `-j 4` would allow anywhere between 1x and 4x the limits you set depending on which processing node the client gets routed to
|
||||
you can also set transaction limits which apply per-IP and per-volume, but these assume `-j 1` (default) otherwise the limits will be messed up, for example `-j 4` would allow anywhere between 1x and 4x the limits you set depending on which processing node the client gets routed to
|
||||
|
||||
* `:c,maxn=250,3600` allows 250 files over 1 hour from each IP (tracked per-volume)
|
||||
* `:c,maxb=1g,300` allows 1 GiB total over 5 minutes from each IP (tracked per-volume)
|
||||
|
|
@ -2813,12 +2813,12 @@ below are some tweaks roughly ordered by usefulness:
|
|||
* `--no-htp --hash-mt=0 --mtag-mt=1 --th-mt=1` minimizes the number of threads; can help in some eccentric environments (like the vscode debugger)
|
||||
* when running on AlpineLinux or other musl-based distro, try mimalloc for higher performance (and twice as much RAM usage); `apk add mimalloc2` and run copyparty with env-var `LD_PRELOAD=/usr/lib/libmimalloc-secure.so.2`
|
||||
* note that mimalloc requires special care when combined with prisonparty and/or bubbleparty/bubblewrap; you must give it access to `/proc` and `/sys` otherwise you'll encounter issues with FFmpeg (audio transcoding, thumbnails)
|
||||
* `-j0` enables multiprocessing (actual multithreading), can reduce latency to `20+80/numCores` percent and generally improve performance in cpu-intensive workloads, for example:
|
||||
* `-j0` (usually *not* recommended) enables multiprocessing (actual multithreading), can reduce latency to `20+80/numCores` percent and generally improve performance in cpu-intensive workloads, for example:
|
||||
* lots of connections (many users or heavy clients)
|
||||
* simultaneous downloads and uploads saturating a 20gbps connection
|
||||
* if `-e2d` is enabled, `-j2` gives 4x performance for directory listings; `-j4` gives 16x
|
||||
|
||||
...however it also increases the server/filesystem/HDD load during uploads, and adds an overhead to internal communication, so it is usually a better idea to don't
|
||||
...however it will probably *reduce* performance in most cases, since it also increases the server/filesystem/HDD load during uploads, and adds an overhead to internal communication, so keeping the default is generally best
|
||||
* using [pypy](https://www.pypy.org/) instead of [cpython](https://www.python.org/) *can* be 70% faster for some workloads, but slower for many others
|
||||
* and pypy can sometimes crash on startup with `-j0` (TODO make issue)
|
||||
|
||||
|
|
@ -3172,6 +3172,9 @@ and then copypaste the following command into `a-Shell`:
|
|||
curl -L https://github.com/9001/copyparty/raw/refs/heads/hovudstraum/contrib/setup-ashell.sh | sh
|
||||
```
|
||||
|
||||
> if you want the latest copyparty beta, then do this instead:
|
||||
> `curl -L https://copyparty.eu/beta/setup-ashell.sh | sh`
|
||||
|
||||
what this does:
|
||||
* creates a basic [config file](#accounts-and-volumes) named `cpc` which you can edit with `vim cpc`
|
||||
* adds the command `cpp` to launch copyparty with that config file
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
#
|
||||
# to reverse-proxy a specific path/subpath/location below a domain
|
||||
# (rather than a complete subdomain), for example "/qw/er", you must
|
||||
# run copyparty with --rp-loc /qw/as and also change the following:
|
||||
# run copyparty with --rp-loc /qw/er and also change the following:
|
||||
# location / {
|
||||
# proxy_pass http://cpp_tcp;
|
||||
# to this:
|
||||
|
|
|
|||
|
|
@ -69,11 +69,8 @@ in
|
|||
options.services.copyparty = {
|
||||
enable = mkEnableOption "web-based file manager";
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.copyparty;
|
||||
defaultText = "pkgs.copyparty";
|
||||
description = ''
|
||||
package = mkPackageOption pkgs "copyparty" {
|
||||
extraDescription = ''
|
||||
Package of the application to run, exposed for overriding purposes.
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
# NOTE: You generally shouldn't use this PKGBUILD on Arch, as it is mainly for testing purposes. Install copyparty using pacman instead.
|
||||
|
||||
pkgname=copyparty
|
||||
pkgver="1.19.23"
|
||||
pkgver="1.20.1"
|
||||
pkgrel=1
|
||||
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
|
||||
arch=("any")
|
||||
|
|
@ -24,7 +24,7 @@ optdepends=("ffmpeg: thumbnails for videos, images (slower) and audio, music tag
|
|||
)
|
||||
source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
|
||||
backup=("etc/${pkgname}/copyparty.conf" )
|
||||
sha256sums=("2d0c5d126ca2f4b78c40ae4d03cac191526d98e5072f4ace121601d2af40e3cf")
|
||||
sha256sums=("4f513ca9e3d1c11a7bb4e1a8a925dda2449b9565e91f6ef7cbe10367fa4e2935")
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
|
||||
pkgname=copyparty
|
||||
pkgver=1.19.23
|
||||
pkgver=1.20.1
|
||||
pkgrel=1
|
||||
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
|
||||
arch=("any")
|
||||
|
|
@ -21,7 +21,7 @@ optdepends=("ffmpeg: thumbnails for videos, images (slower) and audio, music tag
|
|||
)
|
||||
source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
|
||||
backup=("/etc/${pkgname}.d/init" )
|
||||
sha256sums=("2d0c5d126ca2f4b78c40ae4d03cac191526d98e5072f4ace121601d2af40e3cf")
|
||||
sha256sums=("4f513ca9e3d1c11a7bb4e1a8a925dda2449b9565e91f6ef7cbe10367fa4e2935")
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"url": "https://github.com/9001/copyparty/releases/download/v1.19.23/copyparty-1.19.23.tar.gz",
|
||||
"version": "1.19.23",
|
||||
"hash": "sha256-LQxdEmyi9LeMQK5NA8rBkVJtmOUHL0rOEhYB0q9A488="
|
||||
"url": "https://github.com/9001/copyparty/releases/download/v1.20.1/copyparty-1.20.1.tar.gz",
|
||||
"version": "1.20.1",
|
||||
"hash": "sha256-T1E8qePRwRp7tOGoqSXdokSblWXpH273y+EDZ/pOKTU="
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
# https://apps.apple.com/us/app/a-shell/id1473805438
|
||||
#
|
||||
# step 2: copypaste the following command into a-Shell:
|
||||
# curl -L https://github.com/9001/copyparty/raw/refs/heads/hovudstraum/contrib/setup-ashell.sh
|
||||
# curl -L https://github.com/9001/copyparty/raw/refs/heads/hovudstraum/contrib/setup-ashell.sh | sh
|
||||
#
|
||||
# step 3: launch copyparty with this command: cpp
|
||||
#
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@ web/tl/fin.js
|
|||
web/tl/fra.js
|
||||
web/tl/grc.js
|
||||
web/tl/ita.js
|
||||
web/tl/jpn.js
|
||||
web/tl/kor.js
|
||||
web/tl/nld.js
|
||||
web/tl/nno.js
|
||||
|
|
|
|||
|
|
@ -1429,6 +1429,7 @@ def add_sftp(ap):
|
|||
ap2.add_argument("--sftp", metavar="PORT", type=int, default=0, help="enable SFTP server on \033[33mPORT\033[0m, for example \033[32m3922")
|
||||
ap2.add_argument("--sftpv", action="store_true", help="verbose")
|
||||
ap2.add_argument("--sftpvv", action="store_true", help="verboser")
|
||||
ap2.add_argument("--sftp-i", metavar="IP", type=u, default="-i", help="IPs to listen on (comma-separated list). Set this to override \033[33m-i\033[0m for this protocol")
|
||||
ap2.add_argument("--sftp4", action="store_true", help="only listen on IPv4")
|
||||
ap2.add_argument("--sftp-key", metavar="U K", type=u, action="append", help="\033[34mREPEATABLE:\033[0m add ssh-key \033[33mK\033[0m for user \033[33mU\033[0m (username, space, key-type, space, base64); if user has multiple keys, then repeat this option for each key\n └─commandline example: --sftp-key 'david ssh-ed25519 AAAAC3NzaC...'\n └─config-file example: sftp-key: david ssh-ed25519 AAAAC3NzaC...")
|
||||
ap2.add_argument("--sftp-key2u", action="append", help=argparse.SUPPRESS)
|
||||
|
|
@ -1444,6 +1445,7 @@ def add_ftp(ap):
|
|||
ap2.add_argument("--ftp", metavar="PORT", type=int, default=0, help="enable FTP server on \033[33mPORT\033[0m, for example \033[32m3921")
|
||||
ap2.add_argument("--ftps", metavar="PORT", type=int, default=0, help="enable FTPS server on \033[33mPORT\033[0m, for example \033[32m3990")
|
||||
ap2.add_argument("--ftpv", action="store_true", help="verbose")
|
||||
ap2.add_argument("--ftp-i", metavar="IP", type=u, default="-i", help="IPs to listen on (comma-separated list). Set this to override \033[33m-i\033[0m for this protocol")
|
||||
ap2.add_argument("--ftp4", action="store_true", help="only listen on IPv4")
|
||||
ap2.add_argument("--ftp-ipa", metavar="CIDR", type=u, default="", help="only accept connections from IP-addresses inside \033[33mCIDR\033[0m (comma-separated); specify [\033[32many\033[0m] to disable inheriting \033[33m--ipa\033[0m / \033[33m--ipar\033[0m. Examples: [\033[32mlan\033[0m] or [\033[32m10.89.0.0/16, 192.168.33.0/24\033[0m]")
|
||||
ap2.add_argument("--ftp-no-ow", action="store_true", help="if target file exists, reject upload instead of overwrite")
|
||||
|
|
@ -1468,6 +1470,7 @@ def add_webdav(ap):
|
|||
def add_tftp(ap):
|
||||
ap2 = ap.add_argument_group("TFTP options (UDP only)")
|
||||
ap2.add_argument("--tftp", metavar="PORT", type=int, default=0, help="enable TFTP server on \033[33mPORT\033[0m, for example \033[32m69 \033[0mor \033[32m3969")
|
||||
ap2.add_argument("--tftp-i", metavar="IP", type=u, default="-i", help="IPs to listen on (comma-separated list). Set this to override \033[33m-i\033[0m for this protocol")
|
||||
ap2.add_argument("--tftp4", action="store_true", help="only listen on IPv4")
|
||||
ap2.add_argument("--tftpv", action="store_true", help="verbose")
|
||||
ap2.add_argument("--tftpvv", action="store_true", help="verboser")
|
||||
|
|
@ -1481,6 +1484,7 @@ def add_tftp(ap):
|
|||
def add_smb(ap):
|
||||
ap2 = ap.add_argument_group("SMB/CIFS options")
|
||||
ap2.add_argument("--smb", action="store_true", help="enable smb (read-only) -- this requires running copyparty as root on linux and macos unless \033[33m--smb-port\033[0m is set above 1024 and your OS does port-forwarding from 445 to that.\n\033[1;31mWARNING:\033[0m this protocol is DANGEROUS and buggy! Never expose to the internet!")
|
||||
ap2.add_argument("--smb-i", metavar="IP", type=u, default="-i", help="IPs to listen on (comma-separated list). Set this to override \033[33m-i\033[0m for this protocol")
|
||||
ap2.add_argument("--smbw", action="store_true", help="enable write support (please dont)")
|
||||
ap2.add_argument("--smb1", action="store_true", help="disable SMBv2, only enable SMBv1 (CIFS)")
|
||||
ap2.add_argument("--smb-port", metavar="PORT", type=int, default=445, help="port to listen on -- if you change this value, you must NAT from TCP:445 to this port using iptables or similar")
|
||||
|
|
@ -1491,11 +1495,13 @@ def add_smb(ap):
|
|||
ap2.add_argument("--smbvv", action="store_true", help="verboser")
|
||||
ap2.add_argument("--smbvvv", action="store_true", help="verbosest")
|
||||
|
||||
|
||||
def add_opds(ap):
|
||||
ap2 = ap.add_argument_group("OPDS options")
|
||||
ap2.add_argument("--opds", action="store_true", help="enable opds -- allows e-book readers to browse and download files (volflag=opds)")
|
||||
ap2.add_argument("--opds-exts", metavar="T,T", type=u, default="epub,cbz,pdf", help="file formats to list in OPDS feeds; leave empty to show everything (volflag=opds_exts)")
|
||||
|
||||
|
||||
def add_handlers(ap):
|
||||
ap2 = ap.add_argument_group("handlers (see --help-handlers)")
|
||||
ap2.add_argument("--on404", metavar="PY", type=u, action="append", help="\033[34mREPEATABLE:\033[0m handle 404s by executing \033[33mPY\033[0m file")
|
||||
|
|
@ -2150,10 +2156,17 @@ def main(argv: Optional[list[str]] = None) -> None:
|
|||
if getattr(al, k1):
|
||||
setattr(al, k2, False)
|
||||
|
||||
if not HAVE_IPV6 and al.i == "::":
|
||||
al.i = "0.0.0.0"
|
||||
protos = "ftp tftp sftp smb".split()
|
||||
opts = ["%s_i" % (zs,) for zs in protos]
|
||||
for opt in opts:
|
||||
if getattr(al, opt) == "-i":
|
||||
setattr(al, opt, al.i)
|
||||
for opt in ["i"] + opts:
|
||||
zs = getattr(al, opt)
|
||||
if not HAVE_IPV6 and zs == "::":
|
||||
zs = "0.0.0.0"
|
||||
setattr(al, opt, [x.strip() for x in zs.split(",")])
|
||||
|
||||
al.i = [x.strip() for x in al.i.split(",")]
|
||||
try:
|
||||
if "-" in al.p:
|
||||
lo, hi = [int(x) for x in al.p.split("-")]
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# coding: utf-8
|
||||
|
||||
VERSION = (1, 20, 0)
|
||||
VERSION = (1, 20, 1)
|
||||
CODENAME = "sftp is fine too"
|
||||
BUILD_DT = (2026, 1, 2)
|
||||
BUILD_DT = (2026, 1, 9)
|
||||
|
||||
S_VERSION = ".".join(map(str, VERSION))
|
||||
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
|
||||
|
|
|
|||
|
|
@ -1829,7 +1829,7 @@ class AuthSrv(object):
|
|||
if self.args.ipu and not self.args.have_idp_hdrs:
|
||||
# syntax (CIDR=UNAME) is verified in load_ipu
|
||||
zsl = [x.split("=", 1)[1] for x in self.args.ipu]
|
||||
zsl = [x for x in zsl if x not in acct]
|
||||
zsl = [x for x in zsl if x and x not in acct]
|
||||
if zsl:
|
||||
t = "ERROR: unknown users in ipu: %s" % (zsl,)
|
||||
self.log(t, 1)
|
||||
|
|
@ -2650,6 +2650,13 @@ class AuthSrv(object):
|
|||
self.log(t, 1)
|
||||
raise Exception(t)
|
||||
|
||||
if (
|
||||
"dedup" in vol.flags
|
||||
and "reflink" not in vol.flags
|
||||
and vol.flags["apnd_who"] != "no"
|
||||
):
|
||||
vol.flags["apnd_who"] = "ndd"
|
||||
|
||||
# verify tags mentioned by -mt[mp] are used by -mte
|
||||
local_mtp = {}
|
||||
local_only_mtp = {}
|
||||
|
|
@ -3030,6 +3037,7 @@ class AuthSrv(object):
|
|||
shn.realpath = s_vfs.canonical(s_rem)
|
||||
|
||||
o_vn, _ = shn._get_share_src("")
|
||||
shn.lim = o_vn.lim
|
||||
shn.flags = o_vn.flags.copy()
|
||||
shn.dbpath = o_vn.dbpath
|
||||
shn.histpath = o_vn.histpath
|
||||
|
|
|
|||
|
|
@ -641,7 +641,7 @@ class Ftpd(object):
|
|||
lgr = logging.getLogger("pyftpdlib")
|
||||
lgr.setLevel(logging.DEBUG if self.args.ftpv else logging.INFO)
|
||||
|
||||
ips = self.args.i
|
||||
ips = self.args.ftp_i
|
||||
if "::" in ips:
|
||||
ips.append("0.0.0.0")
|
||||
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ H_CONN_KEEPALIVE = "Connection: Keep-Alive"
|
|||
H_CONN_CLOSE = "Connection: Close"
|
||||
|
||||
RSS_SORT = {"m": "mt", "u": "at", "n": "fn", "s": "sz"}
|
||||
ACODE2_FMT = set(["opus", "owa", "caf", "mp3", "flac", "wav"])
|
||||
|
||||
A_FILE = os.stat_result(
|
||||
(0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101)
|
||||
|
|
@ -2553,6 +2554,8 @@ class HttpCli(object):
|
|||
or (zs == "dw" and self.can_delete)
|
||||
):
|
||||
pass
|
||||
elif zs == "ndd":
|
||||
raise Pebkac(400, "append is denied here due to non-reflink dedup")
|
||||
else:
|
||||
raise Pebkac(400, "you do not have permission to append")
|
||||
zs = os.path.join(params["fdir"], fn)
|
||||
|
|
@ -6684,6 +6687,8 @@ class HttpCli(object):
|
|||
|
||||
if th_fmt == "p":
|
||||
raise Pebkac(404)
|
||||
elif th_fmt in ACODE2_FMT:
|
||||
raise Pebkac(415)
|
||||
|
||||
return self.tx_ico(rem)
|
||||
|
||||
|
|
|
|||
|
|
@ -286,10 +286,26 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.uname: str = ssh.uname # type: ignore
|
||||
self.args = self.hub.args
|
||||
self.asrv: "AuthSrv" = self.hub.asrv
|
||||
self.v = self.args.sftpv
|
||||
self.vv = self.args.sftpvv
|
||||
|
||||
if self.uname == LEELOO_DALLAS:
|
||||
raise Exception("send her back")
|
||||
|
||||
self.vols = [
|
||||
vp
|
||||
for vp, vn in self.asrv.vfs.all_vols.items()
|
||||
if self.uname in vn.axs.uread
|
||||
or self.uname in vn.axs.uwrite
|
||||
or self.uname in vn.axs.uget
|
||||
]
|
||||
self.vis = set()
|
||||
for zs in self.vols:
|
||||
self.vis.add(zs)
|
||||
while zs:
|
||||
zs = zs.rsplit("/", 1)[0] if "/" in zs else ""
|
||||
self.vis.add(zs)
|
||||
|
||||
def log(self, msg: str, c: Union[int, str] = 0) -> None:
|
||||
self.hub.log("sftp:%s" % (self.ip,), msg, c)
|
||||
|
||||
|
|
@ -353,29 +369,35 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _list_folder(self, path: str) -> list[SATTR] | int:
|
||||
if self.v:
|
||||
self.log("ls(%s):" % (path,))
|
||||
path = path.strip("/")
|
||||
try:
|
||||
ap, vn, rem = self.v2a(path, r=True)
|
||||
except Pebkac:
|
||||
try:
|
||||
self.v2a(path, w=True)
|
||||
self.log("ls(%s): [] (write-only)" % (path,))
|
||||
return [] # display write-only folders as empty
|
||||
except:
|
||||
pass
|
||||
if self.asrv.vfs.realpath or path.strip("/"):
|
||||
if path not in self.vis:
|
||||
self.log("ls(%s): EPERM" % (path,))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
# list of accessible volumes
|
||||
ret = []
|
||||
zi = int(time.time())
|
||||
vst = os.stat_result((16877, -1, -1, 1, 1000, 1000, 8, zi, zi, zi))
|
||||
for vn in self.asrv.vfs.all_vols.values():
|
||||
if "/" in vn.vpath or not vn.vpath:
|
||||
continue # only include toplevel-mounted vols
|
||||
try:
|
||||
self.hub.asrv.vfs.get(vn.vpath, self.uname, True, False)
|
||||
ret.append(SATTR.from_stat(vst, filename=vn.vpath))
|
||||
except:
|
||||
pass
|
||||
prefix = path + "/"
|
||||
for vn in self.asrv.vfs.all_nodes.values():
|
||||
if path and not vn.vpath.startswith(prefix):
|
||||
continue # vn is parent
|
||||
vname = vn.vpath[len(prefix) :]
|
||||
if "/" in vname or not vname:
|
||||
continue # only include vols at current level
|
||||
ret.append(SATTR.from_stat(vst, filename=vn.vpath))
|
||||
ret.sort(key=lambda x: x.filename)
|
||||
self.log("ls(%s): vfs-vols; |%d|" % (path, len(ret)))
|
||||
return ret
|
||||
|
||||
_, vfs_ls, vfs_virt = vn.ls(
|
||||
|
|
@ -394,6 +416,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
if self.uname not in vn.axs.udot:
|
||||
ret = [x for x in ret if not x.filename.split("/")[-1].startswith(".")]
|
||||
ret.sort(key=lambda x: x.filename)
|
||||
self.log("ls(%s): |%d|" % (path, len(ret)))
|
||||
return ret
|
||||
|
||||
def stat(self, path: str) -> SATTR | int:
|
||||
|
|
@ -411,17 +434,25 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _stat(self, vp: str) -> SATTR | int:
|
||||
vp = vp.strip("/")
|
||||
try:
|
||||
ap = self.v2a(vp, r=True)[0]
|
||||
ap, vn, _ = self.v2a(vp)
|
||||
if (
|
||||
self.uname not in vn.axs.uread
|
||||
and self.uname not in vn.axs.uwrite
|
||||
and self.uname not in vn.axs.uget
|
||||
):
|
||||
self.log("stat(%s): EPERM" % (vp,))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
st = bos.stat(ap)
|
||||
self.log("stat(%s): %s" % (vp, st))
|
||||
except:
|
||||
if vp.strip("/") or self.asrv.vfs.realpath:
|
||||
try:
|
||||
self.v2a(vp, w=True)[0]
|
||||
except:
|
||||
return SFTP_PERMISSION_DENIED
|
||||
if vp not in self.vis:
|
||||
self.log("stat(%s): ENOENT" % (vp,))
|
||||
return SFTP_NO_SUCH_FILE
|
||||
zi = int(time.time())
|
||||
st = os.stat_result((16877, -1, -1, 1, 1000, 1000, 8, zi, zi, zi))
|
||||
self.log("stat(%s): vfs-vols")
|
||||
return SATTR.from_stat(st)
|
||||
|
||||
def open(self, path: str, flags: int, attr: SATTR) -> paramiko.SFTPHandle | int:
|
||||
|
|
@ -457,10 +488,12 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
ap = os.path.join(vn.realpath, rem)
|
||||
vf = vn.flags
|
||||
except Pebkac as ex:
|
||||
t = "denied open file [%s], iflag=%s, attr=%s, read=%s, write=%s: %s"
|
||||
self.log(t % (vp, iflag, attr, rd, wr, ex))
|
||||
t = "denied open file [%s], iflag=%s, read=%s, write=%s: %s"
|
||||
self.log(t % (vp, iflag, rd, wr, ex))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
|
||||
self.log("open(%s, %x, %s)" % (vp, iflag, smode))
|
||||
|
||||
if wr:
|
||||
try:
|
||||
st = bos.stat(ap)
|
||||
|
|
@ -496,6 +529,8 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.log(t, 3)
|
||||
return SFTP_PERMISSION_DENIED
|
||||
|
||||
self.log("writing to [%s] => [%s]" % (vp, ap))
|
||||
|
||||
if wr and need_unlink: # type: ignore # !rm
|
||||
assert td # type: ignore # !rm
|
||||
if td >= -1 and td <= self.args.ftp_wt:
|
||||
|
|
@ -519,13 +554,16 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
|
||||
chmod = getattr(attr, "st_mode", None)
|
||||
if chmod is None:
|
||||
chmod = vf.get("chmod_f", 644)
|
||||
chmod = vf.get("chmod_f", 0o644)
|
||||
self.log("open(%s, %x): client did not chmod" % (vp, iflag))
|
||||
else:
|
||||
self.log("open(%s, %x): client set chmod 0%o" % (vp, iflag, chmod))
|
||||
|
||||
try:
|
||||
fd = os.open(ap, iflag, chmod)
|
||||
except OSError as ex:
|
||||
t = "failed to os.open [%s] -> [%s] with iflag [%s] and chmod [%s]"
|
||||
self.log(t % (vp, ap, iflag, chmod), 3)
|
||||
t = "failed to os.open [%s] -> [%s] with iflag [%s] and chmod [%s]: %r"
|
||||
self.log(t % (vp, ap, iflag, chmod, ex), 3)
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
if iflag & os.O_CREAT:
|
||||
|
|
@ -534,8 +572,8 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
try:
|
||||
f = os.fdopen(fd, smode)
|
||||
except OSError as ex:
|
||||
t = "failed to os.fdpen [%s] -> [%s] with smode [%s]"
|
||||
self.log(t % (vp, ap, smode), 3)
|
||||
t = "failed to os.fdpen [%s] -> [%s] with smode [%s]: %r"
|
||||
self.log(t % (vp, ap, smode, ex), 3)
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
ret = SFTP_FH(iflag)
|
||||
|
|
@ -552,17 +590,37 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _remove(self, vp: str) -> int:
|
||||
self.log("rm(%s)" % (vp,))
|
||||
if self.args.no_del:
|
||||
self.log("The delete feature is disabled in server config")
|
||||
return SFTP_PERMISSION_DENIED
|
||||
try:
|
||||
self.hub.up2k.handle_rm(self.uname, self.ip, [vp], [], False, False)
|
||||
self.log("rm(%s): ok" % (vp,))
|
||||
return SFTP_OK
|
||||
except Pebkac as ex:
|
||||
t = "denied delete [%s]: %s"
|
||||
self.log(t % (vp, ex))
|
||||
if str(ex).startswith("file not found"):
|
||||
return SFTP_NO_SUCH_FILE
|
||||
try:
|
||||
# write-only client trying to rm before upload?
|
||||
ap, vn, _ = self.v2a(vp)
|
||||
if (
|
||||
self.uname not in vn.axs.uread
|
||||
and self.uname not in vn.axs.uwrite
|
||||
and self.uname not in vn.axs.uget
|
||||
):
|
||||
self.log("rm(%s): EPERM" % (vp,))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
if not bos.path.exists(ap):
|
||||
self.log(" `- file didn't exist; returning ENOENT")
|
||||
return SFTP_NO_SUCH_FILE
|
||||
except:
|
||||
pass
|
||||
return SFTP_PERMISSION_DENIED
|
||||
except OSError as ex:
|
||||
self.log("failed: rm(%s): %r" % (vp, ex))
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
def rename(self, oldpath: str, newpath: str) -> int:
|
||||
|
|
@ -573,6 +631,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _rename(self, svp: str, dvp: str) -> int:
|
||||
self.log("mv(%s, %s)" % (svp, dvp))
|
||||
if self.args.no_mv:
|
||||
self.log("The rename/move feature is disabled in server config")
|
||||
svp = svp.strip("/")
|
||||
|
|
@ -585,6 +644,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.log(t % (svp, dvp, ex))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
except OSError as ex:
|
||||
self.log("mv(%s, %s): %r" % (svp, dvp, ex))
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
def mkdir(self, path: str, attr: SATTR) -> int:
|
||||
|
|
@ -595,6 +655,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _mkdir(self, vp: str, attr: SATTR) -> int:
|
||||
self.log("mkdir(%s)" % (vp,))
|
||||
try:
|
||||
vn, rem = self.asrv.vfs.get(vp, self.uname, False, True)
|
||||
ap = os.path.join(vn.realpath, rem)
|
||||
|
|
@ -607,6 +668,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.log(t % (vp, ex))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
except OSError as ex:
|
||||
self.log("mkdir(%s): %r" % (vp, ex))
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
def rmdir(self, path: str) -> int:
|
||||
|
|
@ -617,6 +679,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _rmdir(self, vp: str) -> int:
|
||||
self.log("rmdir(%s)" % (vp,))
|
||||
try:
|
||||
vn, rem = self.asrv.vfs.get(vp, self.uname, False, False, will_del=True)
|
||||
ap = os.path.join(vn.realpath, rem)
|
||||
|
|
@ -627,6 +690,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.log(t % (vp, ex))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
except OSError as ex:
|
||||
self.log("rmdir(%s): %r" % (vp, ex))
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
def chattr(self, path: str, attr: SATTR) -> int:
|
||||
|
|
@ -637,6 +701,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
return SFTP_FAILURE
|
||||
|
||||
def _chattr(self, vp: str, attr: SATTR) -> int:
|
||||
self.log("chattr(%s, %s)" % (vp, attr))
|
||||
try:
|
||||
vn, rem = self.asrv.vfs.get(vp, self.uname, False, True, will_del=True)
|
||||
ap = os.path.join(vn.realpath, rem)
|
||||
|
|
@ -647,6 +712,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
|
|||
self.log(t % (vp, ex))
|
||||
return SFTP_PERMISSION_DENIED
|
||||
except OSError as ex:
|
||||
self.log("chattr(%s): %r" % (vp, ex))
|
||||
return paramiko.SFTPServer.convert_errno(ex.errno)
|
||||
|
||||
def symlink(self, target_path: str, path: str) -> int:
|
||||
|
|
@ -668,7 +734,7 @@ class Sftpd(object):
|
|||
self.bound: list[str] = []
|
||||
self.sessions = {}
|
||||
|
||||
ips = args.i
|
||||
ips = args.sftp_i
|
||||
if "::" in ips:
|
||||
ips.append("0.0.0.0")
|
||||
|
||||
|
|
@ -714,7 +780,7 @@ class Sftpd(object):
|
|||
for ip in ips:
|
||||
self._bind(ip)
|
||||
|
||||
self.log("listening on %s port %s" % (self.srv, args.sftp))
|
||||
self.log("listening @ %s port %s" % (self.bound, args.sftp))
|
||||
|
||||
def log(self, msg: str, c: Union[int, str] = 0) -> None:
|
||||
self.hub.log("sftp", msg, c)
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ class SMB(object):
|
|||
smbserver.isInFileJail = self._is_in_file_jail
|
||||
self._disarm()
|
||||
|
||||
ip = next((x for x in self.args.i if ":" not in x), None)
|
||||
ip = next((x for x in self.args.smb_i if ":" not in x), None)
|
||||
if not ip:
|
||||
self.log("smb", "IPv6 not supported for SMB; listening on 0.0.0.0", 3)
|
||||
ip = "0.0.0.0"
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ class Tftpd(object):
|
|||
p1, p2 = [int(x) for x in self.args.tftp_pr.split("-")]
|
||||
ports = list(range(p1, p2 + 1))
|
||||
|
||||
ips = self.args.i
|
||||
ips = self.args.tftp_i
|
||||
if "::" in ips:
|
||||
ips.append("0.0.0.0")
|
||||
|
||||
|
|
|
|||
|
|
@ -4182,6 +4182,7 @@ class Up2k(object):
|
|||
st = bos.lstat(atop)
|
||||
is_dir = stat.S_ISDIR(st.st_mode)
|
||||
except:
|
||||
# NOTE: "file not found" *sftpd
|
||||
raise Pebkac(400, "file not found on disk (already deleted?)")
|
||||
|
||||
if "bcasechk" in vn.flags and not vn.casechk(rem, False):
|
||||
|
|
|
|||
|
|
@ -352,6 +352,7 @@ HTTPCODE = {
|
|||
411: "Length Required",
|
||||
412: "Precondition Failed",
|
||||
413: "Payload Too Large",
|
||||
415: "Unsupported Media Type",
|
||||
416: "Requested Range Not Satisfiable",
|
||||
422: "Unprocessable Entity",
|
||||
423: "Locked",
|
||||
|
|
@ -377,6 +378,7 @@ IMPLICATIONS = [
|
|||
["tftpvv", "tftpv"],
|
||||
["nodupem", "nodupe"],
|
||||
["no_dupe_m", "no_dupe"],
|
||||
["sftpvv", "sftpv"],
|
||||
["smbw", "smb"],
|
||||
["smb1", "smb"],
|
||||
["smbvvv", "smbvv"],
|
||||
|
|
@ -3655,7 +3657,11 @@ def retchk(
|
|||
|
||||
t = "error {} from [{}]".format(t, c)
|
||||
if serr:
|
||||
t += "\n" + serr
|
||||
if len(serr) > 8192:
|
||||
zs = "%s\n[ ...TRUNCATED... ]\n%s\n[ NOTE: full msg was %d chars ]"
|
||||
serr = zs % (serr[:4096], serr[-4096:].rstrip(), len(serr))
|
||||
serr = serr.replace("\n", "\nstderr: ")
|
||||
t += "\nstderr: " + serr
|
||||
|
||||
if logger:
|
||||
logger(t, color)
|
||||
|
|
|
|||
|
|
@ -269,6 +269,7 @@ if (1)
|
|||
"cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do",
|
||||
"cdt_hsort": "how many sorting rules (<code>,sorthref</code>) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them",
|
||||
"cdt_ren": "enable custom right-click menu, you can still access the regular menu by pressing the shift key and right-clicking",
|
||||
"cdt_rdb": "show the regular right-click menu when the custom one is already open and right-clicking again",
|
||||
|
||||
"tt_entree": "show navpane (directory tree sidebar)$NHotkey: B",
|
||||
"tt_detree": "show breadcrumbs$NHotkey: B",
|
||||
|
|
@ -339,6 +340,7 @@ if (1)
|
|||
"mm_eunk": "Unknown Errol",
|
||||
"mm_e404": "Could not play audio; error 404: File not found.",
|
||||
"mm_e403": "Could not play audio; error 403: Access denied.\n\nTry pressing F5 to reload, maybe you got logged out",
|
||||
"mm_e415": "Could not play audio; error 415: File transcoding failed; check server logs.",
|
||||
"mm_e500": "Could not play audio; error 500: Check server logs.",
|
||||
"mm_e5xx": "Could not play audio; server error ",
|
||||
"mm_nof": "not finding any more audio files nearby",
|
||||
|
|
@ -649,7 +651,7 @@ if (1)
|
|||
"rc_ply": "play",
|
||||
"rc_pla": "play as audio",
|
||||
"rc_txt": "open in textfile viewer",
|
||||
"rc_md": "open in text editor",
|
||||
"rc_md": "open in markdown viewer",
|
||||
"rc_dl": "download",
|
||||
"rc_zip": "download as archive",
|
||||
"rc_cpl": "copy link",
|
||||
|
|
@ -657,6 +659,7 @@ if (1)
|
|||
"rc_cut": "cut",
|
||||
"rc_cpy": "copy",
|
||||
"rc_pst": "paste",
|
||||
"rc_rnm": "rename",
|
||||
"rc_nfo": "new folder",
|
||||
"rc_nfi": "new file",
|
||||
"rc_sal": "select all",
|
||||
|
|
@ -676,6 +679,7 @@ var LANGN = [
|
|||
["fra", "français"],
|
||||
["grc", "Ελληνικά"],
|
||||
["ita", "Italiano"],
|
||||
["jpn", "日本語"],
|
||||
["kor", "한국어"],
|
||||
["nld", "Nederlands"],
|
||||
["nno", "Nynorsk"],
|
||||
|
|
@ -988,7 +992,7 @@ ebi('op_cfg').innerHTML = (
|
|||
' </div>\n' +
|
||||
'</div>\n' +
|
||||
'<div><h3>' + L.cl_keytype + '</h3><div><select id="key_notation"></select></div></div>\n' +
|
||||
(!MOBILE ? '<div><h3>' + L.cl_rcm + '</h3><div><a id="ren" class="tgl btn" href="#" tt="' + L.cdt_ren + '">enable</a></div></div>' : '') +
|
||||
(!MOBILE ? '<div><h3>' + L.cl_rcm + '</h3><div><a id="ren" class="tgl btn" href="#" tt="' + L.cdt_ren + '">enable</a><a id="rdb" class="tgl btn" href="#" tt="' + L.cdt_rdb + '">double</a></div></div>' : '') +
|
||||
'<div><h3>' + L.cl_hiddenc + ' ' + (MOBILE ? '<a href="#" id="hcolsh">' + L.cl_hidec + '</a> / ' : '') + '<a href="#" id="hcolsr">' + L.cl_reset + '</a></h3><div id="hcols"></div></div>'
|
||||
);
|
||||
|
||||
|
|
@ -1032,13 +1036,12 @@ ebi('rcm').innerHTML = (
|
|||
'<a href="#" id="rzip">' + L.rc_zip + '</a>'
|
||||
: '') +
|
||||
'<div id="rs2" class="sep"></div>' +
|
||||
(has(perms, "move") ?
|
||||
'<a href="#" id="rdel">' + L.rc_del + '</a>' +
|
||||
'<a href="#" id="rcut">' + L.rc_cut + '</a>'
|
||||
: '') +
|
||||
(have_del ? '<a href="#" id="rdel">' + L.rc_del + '</a>' : '') +
|
||||
(have_mv ? '<a href="#" id="rcut">' + L.rc_cut + '</a>' : '') +
|
||||
'<a href="#" id="rcpy">' + L.rc_cpy + '</a>' +
|
||||
(has(perms, "write") ?
|
||||
'<a href="#" id="rpst">' + L.rc_pst + '</a>' +
|
||||
(have_mv ? '<a href="#" id="rrnm">' + L.rc_rnm + '</a>' : '') +
|
||||
'<div id="rs3" class="sep"></div>' +
|
||||
'<a href="#" id="rnfo">' + L.rc_nfo + '</a>' +
|
||||
'<a href="#" id="rnfi">' + L.rc_nfi + '</a>'
|
||||
|
|
@ -3280,6 +3283,7 @@ function evau_error(e) {
|
|||
var em = '' + eplaya.error.message,
|
||||
mfile = '\n\nFile: «' + uricom_dec(eplaya.src.split('/').pop()) + '»',
|
||||
e500 = L.mm_e500,
|
||||
e415 = L.mm_e415,
|
||||
e404 = L.mm_e404,
|
||||
e403 = L.mm_e403;
|
||||
|
||||
|
|
@ -3292,6 +3296,9 @@ function evau_error(e) {
|
|||
if (em.startsWith('404: '))
|
||||
err = e404;
|
||||
|
||||
if (em.startsWith('415: '))
|
||||
err = e415;
|
||||
|
||||
if (em.startsWith('500: '))
|
||||
err = e500;
|
||||
|
||||
|
|
@ -3308,6 +3315,7 @@ function evau_error(e) {
|
|||
|
||||
err = this.status == 403 ? e403 :
|
||||
this.status == 404 ? e404 :
|
||||
this.status == 415 ? e415 :
|
||||
this.status == 500 ? e500 :
|
||||
L.mm_e5xx + this.status;
|
||||
|
||||
|
|
@ -9473,19 +9481,23 @@ var rcm = (function () {
|
|||
return {enabled: false}
|
||||
|
||||
var r = {
|
||||
enabled: true
|
||||
enabled: true,
|
||||
double: false
|
||||
};
|
||||
bcfg_bind(r, 'enabled', 'ren', true);
|
||||
bcfg_bind(r, 'double', 'rdb', false);
|
||||
|
||||
var menu = ebi('rcm');
|
||||
var selFile = {
|
||||
var nsFile = {
|
||||
elem: null,
|
||||
type: null,
|
||||
path: null,
|
||||
url: null,
|
||||
id: null,
|
||||
relpath: null,
|
||||
no_dsel: false
|
||||
};
|
||||
var selFile = jcp(nsFile);
|
||||
|
||||
function mktemp(is_dir) {
|
||||
var row = mknod('tr', 'temp',
|
||||
|
|
@ -9540,15 +9552,15 @@ var rcm = (function () {
|
|||
switch(e.target.id.slice(1)) {
|
||||
case 'opn':
|
||||
var a = mknod('a');
|
||||
a.href = selFile.path;
|
||||
a.href = selFile.url;
|
||||
a.target = selFile.type == "dir" ? '' : '_blank';
|
||||
a.click();
|
||||
break;
|
||||
case 'ply': selFile.type == 'gf' ? thegrid.imshow(selFile.relpath) : play('f-' + selFile.id); break;
|
||||
case 'pla': play('f-' + selFile.id); break;
|
||||
case 'txt': location = '?doc=' + selFile.relpath; break;
|
||||
case 'md': location = selFile.path + '?v'; break;
|
||||
case 'cpl': cliptxt(location.protocol + '//' + location.host + selFile.path, function() {toast.ok(2, L.clipped)}); break;
|
||||
case 'md': location = selFile.path + (has(selFile.path, '?') ? '&v' : '?v'); break;
|
||||
case 'cpl': cliptxt(selFile.url, function() {toast.ok(2, L.clipped)}); break;
|
||||
case 'dl': ebi('seldl').click(); break;
|
||||
case 'zip': ebi('selzip').click(); break;
|
||||
case 'del': fileman.delete(); break;
|
||||
|
|
@ -9558,6 +9570,7 @@ var rcm = (function () {
|
|||
fileman.paste();
|
||||
fileman.clip = [];
|
||||
break;
|
||||
case 'rnm': fileman.rename(); break;
|
||||
case 'nfo': mktemp(true); break;
|
||||
case 'nfi': mktemp(); break;
|
||||
case 'sal':
|
||||
|
|
@ -9570,18 +9583,22 @@ var rcm = (function () {
|
|||
};
|
||||
}
|
||||
|
||||
function show(x, y, target) {
|
||||
selFile.elem = selFile.type = selFile.path = selFile.id = selFile.relpath = null;
|
||||
selFile.no_dsel = false;
|
||||
function show(x, y, target, isGrid) {
|
||||
selFile = jcp(nsFile);
|
||||
if (target) {
|
||||
var file = target.closest("#files tbody tr");
|
||||
if (isGrid && target.matches && target.matches('#ggrid > a')) {
|
||||
var ref = ebi(target.getAttribute('ref'));
|
||||
file = ref && ref.closest('#files tbody tr');
|
||||
}
|
||||
if (file) {
|
||||
selFile.no_dsel = clgot(file, "sel");
|
||||
clmod(file, "sel", true);
|
||||
selFile.elem = file;
|
||||
|
||||
selFile.path = basenames(file.children[1].firstChild.href).split('?')[0];
|
||||
selFile.relpath = selFile.path.split('/').slice(-1)[0];
|
||||
selFile.url = file.children[1].firstChild.href;
|
||||
selFile.path = basenames(selFile.url).replace(/(&|\?)v/, '');
|
||||
selFile.relpath = selFile.path.split('/').slice(-1)[0].split("?")[0];
|
||||
if (noq_href(file.children[1].firstChild).endsWith("/"))
|
||||
selFile.type = "dir";
|
||||
else {
|
||||
|
|
@ -9591,6 +9608,7 @@ var rcm = (function () {
|
|||
}
|
||||
}
|
||||
}
|
||||
console.log(selFile);
|
||||
msel.selui();
|
||||
|
||||
var has_sel = msel.getsel().length;
|
||||
|
|
@ -9601,7 +9619,7 @@ var rcm = (function () {
|
|||
clmod(ebi('rpla'), 'hide', selFile.type != 'gf');
|
||||
clmod(ebi('rtxt'), 'hide', !selFile.id);
|
||||
clmod(ebi('rs1'), 'hide', !selFile.path);
|
||||
clmod(ebi('rmd'), 'hide', !selFile.id || selFile.path.slice(-3) != '.md');
|
||||
clmod(ebi('rmd'), 'hide', !selFile.id || selFile.relpath.slice(-3) != ".md");
|
||||
clmod(ebi('rcpl'), 'hide', !selFile.path);
|
||||
clmod(ebi('rdl'), 'hide', !has_sel);
|
||||
clmod(ebi('rzip'), 'hide', !has_sel);
|
||||
|
|
@ -9610,7 +9628,9 @@ var rcm = (function () {
|
|||
clmod(ebi('rdel'), 'hide', !has_sel);
|
||||
clmod(ebi('rcpy'), 'hide', !has_sel);
|
||||
clmod(ebi('rpst'), 'hide', !has_clip);
|
||||
clmod(ebi('rs3'), 'hide', !has_sel || !has_clip);
|
||||
clmod(ebi('rrnm'), 'hide', !has_sel);
|
||||
clmod(ebi('rs3'), 'hide', !has_sel);
|
||||
clmod(ebi('rs4'), 'hide', !has_sel && !has(perms, "write"));
|
||||
|
||||
menu.style.left = x + 5 + 'px';
|
||||
menu.style.top = y + 5 + 'px';
|
||||
|
|
@ -9618,26 +9638,30 @@ var rcm = (function () {
|
|||
menu.focus();
|
||||
}
|
||||
|
||||
r.hide = function (force) {
|
||||
r.hide = function(force) {
|
||||
if (!menu.style.display || (!force && menu.contains(document.activeElement)))
|
||||
return;
|
||||
if (selFile.elem && !selFile.no_dsel)
|
||||
if (selFile.elem && !selFile.no_dsel) {
|
||||
clmod(selFile.elem, "sel", false);
|
||||
selFile.elem = selFile.type = selFile.path = selFile.id = selFile.relpath = null;
|
||||
selFile.no_dsel = false;
|
||||
msel.selui();
|
||||
}
|
||||
selFile = jcp(nsFile);
|
||||
menu.style.display = '';
|
||||
}
|
||||
|
||||
ebi('wrap').oncontextmenu = function(e) {
|
||||
if (thegrid.en || !r.enabled || e.shiftKey || menu.style.display) {
|
||||
r.hide(true);
|
||||
r.hide(true);
|
||||
if (!r.enabled || e.shiftKey || (r.double && menu.style.display)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
ev(e);
|
||||
show(xscroll() + e.clientX, yscroll() + e.clientY, e.target);
|
||||
return false;
|
||||
if (selFile.elem && !selFile.no_dsel) {
|
||||
clmod(selFile.elem, "sel", false);
|
||||
msel.selui();
|
||||
}
|
||||
ev(e);
|
||||
var gfile = thegrid.en && e.target && e.target.closest('#ggrid > a');
|
||||
show(xscroll() + e.clientX, yscroll() + e.clientY, gfile || e.target, gfile);
|
||||
return false;
|
||||
};
|
||||
menu.onblur = function() {setTimeout(r.hide)};
|
||||
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.chi = {
|
|||
"mm_eunk": "未知错误",
|
||||
"mm_e404": "无法播放音频;错误 404:文件未找到。",
|
||||
"mm_e403": "无法播放音频;错误 403:访问被拒绝。\n\n尝试按 F5 重新加载,也许你已被注销",
|
||||
"mm_e415": "无法播放音频;错误 415:文件转码失败;检查服务器日志。", //m
|
||||
"mm_e500": "无法播放音频;错误 500:检查服务器日志。", //m
|
||||
"mm_e5xx": "无法播放音频;服务器错误",
|
||||
"mm_nof": "附近找不到更多音频文件",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.chi = {
|
|||
"rc_md": "在文本编辑器中打开", //m
|
||||
"rc_dl": "下载", //m
|
||||
"rc_zip": "下载为压缩包", //m
|
||||
"rc_cpl": "复制链接", //m
|
||||
"rc_del": "删除", //m
|
||||
"rc_cut": "剪切", //m
|
||||
"rc_cpy": "复制", //m
|
||||
|
|
|
|||
|
|
@ -338,6 +338,7 @@ Ls.cze = {
|
|||
"mm_eunk": "Neznámá chyba",
|
||||
"mm_e404": "Nelze přehrát audio; chyba 404: Soubor nenalezen.",
|
||||
"mm_e403": "Nelze přehrát audio; chyba 403: Přístup odepřen.\n\nZkuste stisknout F5 pro obnovení, možná jste se odhlásili",
|
||||
"mm_e415": "Nelze přehrát audio; chyba 415: Převod souboru selhal; zkontrolujte logy serveru.", //m
|
||||
"mm_e500": "Nelze přehrát audio; chyba 500: Zkontrolujte logy serveru.",
|
||||
"mm_e5xx": "Nelze přehrát audio; chyba serveru ",
|
||||
"mm_nof": "žádné další audio soubory v okolí nenalezeny",
|
||||
|
|
@ -651,6 +652,7 @@ Ls.cze = {
|
|||
"rc_md": "otevřít v textovém editoru", //m
|
||||
"rc_dl": "stáhnout", //m
|
||||
"rc_zip": "stáhnout jako archiv", //m
|
||||
"rc_cpl": "kopírovat odkaz", //m
|
||||
"rc_del": "smazat", //m
|
||||
"rc_cut": "vyjmout", //m
|
||||
"rc_cpy": "kopírovat", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.deu = {
|
|||
"mm_eunk": "Unbekannter Fehler",
|
||||
"mm_e404": "Konnte Datei nicht abspielen; Fehler 404: Datei nicht gefunden.",
|
||||
"mm_e403": "Konnte Datei nicht abspielen; Fehler 403: Zugriff verweigert.\n\nDrücke F5 zum Neuladen, vielleicht wurdest du abgemeldet",
|
||||
"mm_e415": "Konnte Datei nicht abspielen; Fehler 415: Umwandlung der Datei fehlgeschlagen; Serverlogs prüfen.", //m
|
||||
"mm_e500": "Konnte Datei nicht abspielen; Fehler 500: Prüfe die Serverlogs.",
|
||||
"mm_e5xx": "Konnte Datei nicht abspielen; Server Fehler ",
|
||||
"mm_nof": "finde keine weiteren Audiodateien in der Nähe",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.deu = {
|
|||
"rc_md": "im Texteditor öffnen",
|
||||
"rc_dl": "herunterladen",
|
||||
"rc_zip": "als Archiv herunterladen",
|
||||
"rc_cpl": "Link kopieren", //m
|
||||
"rc_del": "löschen",
|
||||
"rc_cut": "ausschneiden",
|
||||
"rc_cpy": "kopieren",
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.epo = {
|
|||
"mm_eunk": "Nekonata eraro",
|
||||
"mm_e404": "Ne povas ludi aŭdiaĵon; eraro 404: Dosiero ne trovita.",
|
||||
"mm_e403": "Ne povas ludi aŭdiaĵon; eraro 403: Atingo malpermesita.\n\nKlopodu reŝargi paĝon per klavo F5, eble via seanco senvalidiĝis",
|
||||
"mm_e415": "Ne povas ludi aŭdiaĵon; eraro 415: Transkodigo de dosiero malsukcesis; rigardu la protokolojn de servilo.", //m
|
||||
"mm_e500": "Ne povas ludi aŭdiaĵon; eraro 500: Rigardu la protokolojn de servilo.",
|
||||
"mm_e5xx": "Ne povas ludi aŭdiaĵon; servila eraro ",
|
||||
"mm_nof": "neniuj aŭdio-dosieroj trovitaj proksime",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.epo = {
|
|||
"rc_md": "malfermi en tekstredaktilo", //m
|
||||
"rc_dl": "elŝuti", //m
|
||||
"rc_zip": "elŝuti kiel arkivon", //m
|
||||
"rc_cpl": "kopii ligilon", //m
|
||||
"rc_del": "forigi", //m
|
||||
"rc_cut": "eltondi", //m
|
||||
"rc_cpy": "kopii", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.fin = {
|
|||
"mm_eunk": "Tuntematon virhe",
|
||||
"mm_e404": "Kappaletta ei voitu toistaa; virhe 404: Tiedostoa ei löydy.",
|
||||
"mm_e403": "Kappaletta ei voitu toistaa; virhe 403: Pääsy kielletty.\n\nKokeile painaa F5 päivittääksesi, ehkä kirjauduit ulos",
|
||||
"mm_e415": "Kappaletta ei voitu toistaa; virhe 415: Tiedoston muunnos epäonnistui; tarkista palvelinlokit.", //m
|
||||
"mm_e500": "Kappaletta ei voitu toistaa; virhe 500: Tarkista palvelinlokit.",
|
||||
"mm_e5xx": "Kappaletta ei voitu toistaa; palvelinvirhe ",
|
||||
"mm_nof": "ei löydy enempää äänitiedostoja lähistöltä",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.fin = {
|
|||
"rc_md": "avaa tekstieditorissa", //m
|
||||
"rc_dl": "Lataa", //m
|
||||
"rc_zip": "Lataa arkistona", //m
|
||||
"rc_cpl": "kopioi linkki", //m
|
||||
"rc_del": "poista", //m
|
||||
"rc_cut": "Leikkaa", //m
|
||||
"rc_cpy": "kopioi", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.fra = {
|
|||
"mm_eunk": "Erreur inconnue",
|
||||
"mm_e404": "Impossible de lire l'audio ; erreur 404 : fichier introuvable.",
|
||||
"mm_e403": "Impossible de lire l'audio ; erreur 403 : accès refusé.\n\nEssayez d'appuyer sur F5 pour recharger, peut-être que vous avez été déconnecté",
|
||||
"mm_e415": "Impossible de lire l'audio ; erreur 415 : échec de la conversion du fichier ; vérifiez les journaux du serveur.", //m
|
||||
"mm_e500": "Impossible de lire l'audio ; erreur 500 : vérifiez les journaux du serveur.",
|
||||
"mm_e5xx": "Impossible de lire l'audio ; erreur serveur ",
|
||||
"mm_nof": "Pas d'autres fichiers audio trouvés par ici",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.fra = {
|
|||
"rc_md": "ouvrir dans l’éditeur de texte", //m
|
||||
"rc_dl": "télécharger", //m
|
||||
"rc_zip": "télécharger comme archive", //m
|
||||
"rc_cpl": "copier le lien", //m
|
||||
"rc_del": "supprimer", //m
|
||||
"rc_cut": "couper", //m
|
||||
"rc_cpy": "copier", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.grc = {
|
|||
"mm_eunk": "Άγνωστο σφάλμα",
|
||||
"mm_e404": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 404: Το αρχείο δεν βρέθηκε.",
|
||||
"mm_e403": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 403: Άρνηση πρόσβασης.\n\nΔοκίμασε F5 για επαναφόρτωση, ίσως να έχεις αποσυνδεθεί",
|
||||
"mm_e415": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 415: Απέτυχε η μετατροπή αρχείου; έλεγξε τα logs του διακομιστή.", //m
|
||||
"mm_e500": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 500: Έλεγξε τα logs του διακομιστή.",
|
||||
"mm_e5xx": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα διακομιστή",
|
||||
"mm_nof": "δεν βρέθηκαν άλλα αρχεία ήχου τριγύρω",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.grc = {
|
|||
"rc_md": "άνοιγμα στον επεξεργαστή κειμένου", //m
|
||||
"rc_dl": "λήψη", //m
|
||||
"rc_zip": "λήψη ως αρχείο", //m
|
||||
"rc_cpl": "ἀντίγραφε σύνδεσμον", //m
|
||||
"rc_del": "διαγραφή", //m
|
||||
"rc_cut": "αποκοπή", //m
|
||||
"rc_cpy": "αντιγραφή", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.ita = {
|
|||
"mm_eunk": "Errore Sconosciuto",
|
||||
"mm_e404": "Non è stato possibile riprodurre audio; errore 404: File non trovato.",
|
||||
"mm_e403": "Non è stato possibile riprodurre audio; errore 403: Accesso negato.\n\nProva a premere F5 per ricaricare, forse sei stato disconnesso",
|
||||
"mm_e415": "Non è stato possibile riprodurre audio; errore 415: Conversione del file non riuscita; controlla i log del server.", //m
|
||||
"mm_e500": "Non è stato possibile riprodurre audio; errore 500: Controlla i log del server.",
|
||||
"mm_e5xx": "Non è stato possibile riprodurre audio; errore server ",
|
||||
"mm_nof": "non trovo altri file audio nelle vicinanze",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.ita = {
|
|||
"rc_md": "apri nell’editor di testo", //m
|
||||
"rc_dl": "scarica", //m
|
||||
"rc_zip": "scarica come archivio", //m
|
||||
"rc_cpl": "copia link", //m
|
||||
"rc_del": "elimina", //m
|
||||
"rc_cut": "taglia", //m
|
||||
"rc_cpy": "copia", //m
|
||||
|
|
|
|||
712
copyparty/web/tl/jpn.js
Normal file
712
copyparty/web/tl/jpn.js
Normal file
|
|
@ -0,0 +1,712 @@
|
|||
|
||||
//末尾が //m の行は未検証の機械翻訳です
|
||||
|
||||
Ls.jpn = {
|
||||
"tt": "日本語",
|
||||
|
||||
"cols": {
|
||||
"c": "アクションボタン",
|
||||
"dur": "間隔",
|
||||
"q": "品質 / ビットレート",
|
||||
"Ac": "オーディオコーデック",
|
||||
"Vc": "ビデオコーデック",
|
||||
"Fmt": "フォーマット / コンテナ",
|
||||
"Ahash": "オーディオチェックサム",
|
||||
"Vhash": "ビデオチェックサム",
|
||||
"Res": "解像度",
|
||||
"T": "ファイル形式",
|
||||
"aq": "オーディオ 品質 / ビットレート",
|
||||
"vq": "ビデオ 品質 / ビットレート",
|
||||
"pixfmt": "サブサンプリング / ピクセル構造",
|
||||
"resw": "水平解像度",
|
||||
"resh": "垂直解像度",
|
||||
"chs": "オーディオチャンネル",
|
||||
"hz": "サンプリングレート",
|
||||
},
|
||||
|
||||
"hks": [
|
||||
[
|
||||
"misc",
|
||||
["ESC", "閉じる"],
|
||||
|
||||
"file-manager",
|
||||
["G", "リスト / グリッド表示を切り替える"],
|
||||
["T", "サムネイル / アイコンを切り替える"],
|
||||
["⇧ A/D", "サムネイルサイズ"],
|
||||
["ctrl-K", "選択した項目を削除"],
|
||||
["ctrl-X", "選択範囲をクリップボードに切り取る"],
|
||||
["ctrl-C", "選択範囲をクリップボードにコピー"],
|
||||
["ctrl-V", "ここに貼り付け(移動/コピー)"],
|
||||
["Y", "選択した項目をダウンロード"],
|
||||
["F2", "選択した項目の名前を変更"],
|
||||
|
||||
"file-list-sel",
|
||||
["space", "ファイル選択の切り替え"],
|
||||
["↑/↓", "選択カーソルを移動"],
|
||||
["ctrl ↑/↓", "カーソルとビューポートを移動"],
|
||||
["⇧ ↑/↓", "前/次のファイルを選択"],
|
||||
["ctrl-A", "すべてのファイル / フォルダを選択"],
|
||||
], [
|
||||
"navigation",
|
||||
["B", "パンくずリスト / ナビペインを切り替える"],
|
||||
["I/K", "前/次のフォルダ"],
|
||||
["M", "親フォルダ(または現在のフォルダを展開解除)"],
|
||||
["V", "ナビペインのフォルダ / テキストファイルを切り替える"],
|
||||
["A/D", "ナビペインサイズ"],
|
||||
], [
|
||||
"audio-player",
|
||||
["J/L", "前/次の曲"],
|
||||
["U/O", "10秒前/後スキップ"],
|
||||
["0..9", "0%~90%へジャンプ"],
|
||||
["P", "再生/一時停止(開始も)"],
|
||||
["S", "再生中の曲を選択"],
|
||||
["Y", "曲をダウンロード"],
|
||||
], [
|
||||
"image-viewer",
|
||||
["J/L, ←/→", "前/次の画像"],
|
||||
["Home/End", "最初/最後の画像"],
|
||||
["F", "フルスクリーン"],
|
||||
["R", "時計回りに回転"],
|
||||
["⇧ R", "反時計回りに回転"],
|
||||
["S", "画像を選択"],
|
||||
["Y", "画像をダウンロード"],
|
||||
], [
|
||||
"video-player",
|
||||
["U/O", "10秒前/後へスキップ"],
|
||||
["P/K/Space", "再生/一時停止"],
|
||||
["C", "自動再生"],
|
||||
["V", "ループ"],
|
||||
["M", "ミュート"],
|
||||
["[ and ]", "ループ間隔を設定"],
|
||||
], [
|
||||
"textfile-viewer",
|
||||
["I/K", "前/次のファイル"],
|
||||
["M", "テキストファイルを閉じる"],
|
||||
["E", "テキストファイルの編集"],
|
||||
["S", "ファイルを選択(切り取り/コピー/名前変更)"],
|
||||
["Y", "テキストファイルをダウンロード"],
|
||||
["⇧ J", "JSONを整形する"],
|
||||
]
|
||||
],
|
||||
|
||||
"m_ok": "OK",
|
||||
"m_ng": "キャンセル",
|
||||
|
||||
"enable": "有効",
|
||||
"danger": "危険",
|
||||
"clipped": "クリップボードにコピーされました",
|
||||
|
||||
"ht_s1": "秒",
|
||||
"ht_s2": "秒",
|
||||
"ht_m1": "分",
|
||||
"ht_m2": "分",
|
||||
"ht_h1": "時間",
|
||||
"ht_h2": "時間",
|
||||
"ht_d1": "日",
|
||||
"ht_d2": "日",
|
||||
"ht_and": " と ",
|
||||
|
||||
"goh": "コントロールパネル",
|
||||
"gop": '前のフォルダ">prev',
|
||||
"gou": '親フォルダ">up',
|
||||
"gon": '次のフォルダ">next',
|
||||
"logout": "ログアウト ",
|
||||
"login": "ログイン",
|
||||
"access": " アクセス",
|
||||
"ot_close": "サブメニューを閉じる",
|
||||
"ot_search": "属性、パス/名前、音楽タグ、またはそれらの組み合わせでファイルを検索$N$N<code>foo bar</code> = «foo» と «bar» の両方を含める。$N<code>foo -bar</code> = «foo» を含み、«bar» を含まない必要があります。$N<code>^yana .opus$</code> = «yana» で始まり、«opus» ファイルである$N<code>"try unite"</code> = «try unite» だけを含む$N$N日付形式は iso-8601。たとえば、$N<code>2009-12-31</code> や <code>2020-09-12 23:30:00</code>",
|
||||
"ot_unpost": "unpost: 最近アップロードした投稿を削除するか、未完成の投稿を中止",
|
||||
"ot_bup": "bup: 基本的なアップローダー。Netscape 4.0 もサポートしています。",
|
||||
"ot_mkdir": "mkdir: 新しいディレクトリを作成",
|
||||
"ot_md": "new-file: 新しいテキストファイルを作成",
|
||||
"ot_msg": "msg: サーバーログにメッセージを送信",
|
||||
"ot_mp": "メディアプレーヤー設定",
|
||||
"ot_cfg": "設定オプション",
|
||||
"ot_u2i": 'up2k: ファイルをアップロードする (書き込みアクセス権がある場合)、または検索モードに切り替えてファイルがサーバーのどこかに存在するかどうかを確認$N$Nアップロードは再開可能で、マルチスレッドであり、ファイルのタイムスタンプが保持されますが、[🎈] (基本的なアップローダー) よりも多くの CPU を使用します<br /><br />アップロード中、このアイコンは進行状況インジケーターになります。',
|
||||
"ot_u2w": 'up2k: 再開サポート付きのファイルのアップロード(ブラウザを閉じて、後で同じファイルをドロップします)$N$Nマルチスレッドで、ファイルのタイムスタンプが保持されますが、[🎈](基本的なアップローダー)よりも多くの CPU を使用します。<br /><br />アップロード中は、このアイコンが進行状況インジケーターになります。',
|
||||
"ot_noie": 'Chrome / Firefox / Edgeを利用してください',
|
||||
|
||||
"ab_mkdir": "ディレクトリを作成",
|
||||
"ab_mkdoc": "新しいテキストファイル",
|
||||
"ab_msg": "メッセージをサーバーログに送信",
|
||||
|
||||
"ay_path": "フォルダへジャンプ",
|
||||
"ay_files": "ファイルへジャンプ",
|
||||
|
||||
"wt_ren": "選択した項目の名前を変更する$Nホットキー: F2",
|
||||
"wt_del": "選択した項目を削除$Nホットキー: ctrl-K",
|
||||
"wt_cut": "選択した項目を切り取る <small>(その後別の場所に貼り付ける)</small>$Nホットキー: ctrl-X",
|
||||
"wt_cpy": "選択した項目をクリップボード$Nにコピー(別の場所に貼り付ける)$Nホットキー: ctrl-C",
|
||||
"wt_pst": "以前に切り取った/コピーした選択範囲を貼り付ける$Nホットキー: ctrl-V",
|
||||
"wt_selall": "すべてのファイルを選択$Nホットキー: ctrl-A(ファイルにフォーカスがあるとき)",
|
||||
"wt_selinv": "選択を反転",
|
||||
"wt_zip1": "このフォルダを圧縮してダウンロード",
|
||||
"wt_selzip": "選択内容を圧縮してダウンロード",
|
||||
"wt_seldl": "選択した項目を個別のファイルとしてダウンロード$Nホットキー: Y",
|
||||
"wt_npirc": "IRC形式のトラック情報をコピーする",
|
||||
"wt_nptxt": "プレーンテキストのトラック情報をコピー",
|
||||
"wt_m3ua": "m3uプレイリストに追加 (後で <code>📻コピー</code> をクリック)",
|
||||
"wt_m3uc": "m3uプレイリストをクリップボードにコピー",
|
||||
"wt_grid": "グリッド / リスト表示を切り替える$Nホットキー: G",
|
||||
"wt_prev": "前のトラック$Nホットキー: J",
|
||||
"wt_play": "再生 / 一時停止$Nホットキー: P",
|
||||
"wt_next": "次のトラック$Nホットキー: L",
|
||||
|
||||
"ul_par": "並列アップロード:",
|
||||
"ut_rand": "ファイル名をランダム化する",
|
||||
"ut_u2ts": "最終更新日時のタイムスタンプ$Nファイルシステムからサーバーへコピーする\">📅",
|
||||
"ut_ow": "サーバー上の既存のファイルを上書きする?$N🛡️: しない(代わりに新しいファイル名を生成する)$N🕒: サーバーのファイルが古い場合は上書きする$N♻️: ファイルが異なる場合は常に上書きする$N⏭️: 既存のファイルをすべて無条件にスキップする",
|
||||
"ut_mt": "アップロード中に他のファイルのハッシュを継続する$N$NCPUやHDDがボトルネックになっている場合は無効にしてください",
|
||||
"ut_ask": 'aアップロードを開始する前に確認を求める">💭',
|
||||
"ut_pot": "UIをシンプルにすることで$N低速デバイスでのアップロード速度を向上させる",
|
||||
"ut_srch": "実際にはアップロードせず、代わりにファイルが既にアップロードされているかどうかを確認 $N すでにサーバー上に存在(読み取り可能なすべてのフォルダをスキャン)",
|
||||
"ut_par": "0に設定するとアップロードを一時停止$N$N接続が遅い / 遅延が大きい場合は増やす$N$NLANやサーバーのHDDがボトルネックになっている場合は1にする",
|
||||
"ul_btn": "ファイル / フォルダを<br>ここにドロップしてください(またはクリックしてください)",
|
||||
"ul_btnu": "ア ッ プ ロ ー ド",
|
||||
"ul_btns": "検 索",
|
||||
|
||||
"ul_hash": "ハッシュ",
|
||||
"ul_send": "送信",
|
||||
"ul_done": "完了",
|
||||
"ul_idle1": "キューにはまだアップロードは登録されていない",
|
||||
"ut_etah": "平均 <em>ハッシュ化</em> 速度と完了予想時間",
|
||||
"ut_etau": "平均 <em>アップロード</em> 速度と完了予想時間",
|
||||
"ut_etat": "平均 <em>合計</em> 速度と完了予想時間",
|
||||
|
||||
"uct_ok": "正常に完了",
|
||||
"uct_ng": "NG: 失敗 / 拒否 / 見つからない",
|
||||
"uct_done": "OKとNGの組み合わせ",
|
||||
"uct_bz": "ハッシュ化またはアップロード",
|
||||
"uct_q": "アイドル状態、保留中",
|
||||
|
||||
"utl_name": "ファイル名",
|
||||
"utl_ulist": "リスト",
|
||||
"utl_ucopy": "コピー",
|
||||
"utl_links": "リンク",
|
||||
"utl_stat": "状態",
|
||||
"utl_prog": "進捗",
|
||||
|
||||
// keep short:
|
||||
"utl_404": "404",
|
||||
"utl_err": "エラー",
|
||||
"utl_oserr": "OS-エラー",
|
||||
"utl_found": "発見",
|
||||
"utl_defer": "延期",
|
||||
"utl_yolo": "YOLO",
|
||||
"utl_done": "完了",
|
||||
|
||||
"ul_flagblk": "ファイルがキューに追加されました</b><br>しかし、別のブラウザタブにはビジー状態のup2kがあり、<br>それが終わるまで待機します",
|
||||
"ul_btnlk": "サーバー構成によりこのスイッチはこの状態にロックされています",
|
||||
|
||||
"udt_up": "アップロード",
|
||||
"udt_srch": "検索",
|
||||
"udt_drop": "ここにドロップ",
|
||||
|
||||
"u_nav_m": '<h6>はい、何かもってますか?</h6><code>Enter</code> = ファイル(1つ以上)\n<code>ESC</code> = 1つのフォルダ(サブフォルダを含む)',
|
||||
"u_nav_b": '<a href="#" id="modal-ok">ファイル</a><a href="#" id="modal-ng">フォルダ</a>',
|
||||
|
||||
"cl_opts": "スイッチ",
|
||||
"cl_hfsz": "ファイルサイズ",
|
||||
"cl_themes": "テーマ",
|
||||
"cl_langs": "言語",
|
||||
"cl_ziptype": "フォルダダウロード",
|
||||
"cl_uopts": "up2kスイッチ",
|
||||
"cl_favico": "ファビコン",
|
||||
"cl_bigdir": "ディレクトリの最大数",
|
||||
"cl_hsort": "#ソート",
|
||||
"cl_keytype": "キーの表記タイプ",
|
||||
"cl_hiddenc": "非表示の列",
|
||||
"cl_hidec": "非表示",
|
||||
"cl_reset": "リセット",
|
||||
"cl_hpick": "下の表で非表示にするには列ヘッダーをタップします",
|
||||
"cl_hcancel": "列の非表示を解除",
|
||||
"cl_rcm": "右クリックメニュー",
|
||||
|
||||
"ct_grid": '田 グリッド',
|
||||
"ct_ttips": '◔ ◡ ◔">ℹ️ ツールチップ',
|
||||
"ct_thumb": 'グリッドビューではアイコンまたはサムネイルを切り替える$Nホットキー: T">🖼️ サムネイル',
|
||||
"ct_csel": 'グリッドビューでファイルを選択するにはCtrlとShiftを使用する。">選択',
|
||||
"ct_dl": 'ファイルをクリックしたときに強制的にダウンロードする(インラインで表示しない)">dl',
|
||||
"ct_ihop": '画像ビューアを閉じたら最後に表示したファイルまでスクロールする。">g⮯',
|
||||
"ct_dots": '隠しファイルを表示する(サーバーが許可している場合)">隠しファイル',
|
||||
"ct_qdel": 'ファイルを削除するときは確認を一度だけ求める">qdel',
|
||||
"ct_dir1st": 'ファイルの前にフォルダを並べ替える">📁 優先',
|
||||
"ct_nsort": '自然ソート(先頭に数字があるファイル名の場合)">nsort',
|
||||
"ct_utc": 'すべての日時をUTCで表示">UTC',
|
||||
"ct_readme": 'フォルダ一覧にREADME.mdを表示">📜 readme',
|
||||
"ct_idxh": 'フォルダ一覧の代わりにindex.htmlを表示">htm',
|
||||
"ct_sbars": 'スクロールバーを表示">⟊',
|
||||
|
||||
"cut_umod": "サーバー上にファイルが既に存在する場合はサーバーの最終更新タイムスタンプをローカルファイルと一致するように更新します(書き込み+削除権限が必要です)\">re📅",
|
||||
|
||||
"cut_turbo": "yoloボタンを使用する場合できればこれを有効にしないでください:$N$N大量のファイルをアップロードしていて何らかの理由で再起動する必要があり、できるだけ早くアップロードを続行したい場合にこれを使用します。$N$Nこれはハッシュチェックを単純な<em>"これはサーバー上で同じファイルサイズですか?"</em>に置き換えます。そのため、ファイルの内容が異なる場合はアップロードされません。$N$Nアップロードが完了したらこれをオフにし、同じファイルを再度 "アップロード" してクライアントに検証させる必要があります。\">turbo",
|
||||
|
||||
"cut_datechk": "turboボタンが有効になっていなければ効果はありません$N$Nyolo要素をわずかに減らしサーバー上のファイルのタイムスタンプが一致するかどうかを確認します。$N$N<em>理論的</em>にはほとんどの未完了 / 破損したアップロードを把握できるはずですが、その後ターボを無効にして検証パスを実行する代わりにはなりません。\">date-chk",
|
||||
|
||||
"cut_u2sz": "各アップロードチャンクのサイズ(MiB); 大西洋を横断する場合は大きな値の方が飛行効率が良いです。接続の信頼性が低い場合は、小さな値を試してください。",
|
||||
|
||||
"cut_flag": "一度にアップロードするタブは1つだけにしてください $N -- 他のタブでもこれを有効にする必要があります $N -- 同じドメインのタブにのみ影響します",
|
||||
|
||||
"cut_az": "ファイルの最小サイズ順ではなくアルファベット順にファイルをアップロードします。$N$アルファベット順にするとサーバー上で何か問題が発生した場合に簡単に確認できるようになりますが、光ファイバー / LANでのアップロードが若干遅くなります。",
|
||||
|
||||
"cut_nag": "アップロード完了時のOS通知$N(ブラウザまたはタブがアクティブでない場合のみ)",
|
||||
"cut_sfx": "アップロードが完了すると音声アラートが鳴ります$N(ブラウザまたはタブがアクティブでない場合のみ)",
|
||||
|
||||
"cut_mt": "マルチスレッドを使用してファイルハッシュを高速化する$N$NこれはWebワーカーを使用し$N追加のRAM(最大512 MiB)が必要$N$Nこれによりhttpsは30%高速化、httpは4.5倍高速化r\">mt",
|
||||
|
||||
"cut_wasm": "ブラウザの組込みのハッシュ関数の代わりにwasmを使用します。Chromeベースのブラウザでは速度が向上しますがCPU負荷が増加します。また、Chromeの古いバージョンの多くにはこれを有効にするとブラウザがすべてのRAMを消費してクラッシュするというバグがあります。\">wasm",
|
||||
|
||||
"cft_text": "ファビコンテキスト(無効にするには空白にして更新してください)",
|
||||
"cft_fg": "テキストカラー",
|
||||
"cft_bg": "背景色",
|
||||
|
||||
"cdt_lim": "フォルダに表示するファイルの最大数",
|
||||
"cdt_ask": "一番下までスクロールしたときに$N更にファイルを読み込む代わりに$N何をするか尋ねる",
|
||||
"cdt_hsort": "メディアURLに含めるソートルール (<code>,sorthref</code>) の数。0に設定するとメディアリンクをクリックした際にそのリンクに含まれるソートルールも無視されます。",
|
||||
"cdt_ren": "カスタム右クリックメニューを有効にしてもShiftキーを押しながら右クリックすることで通常のメニューにアクセスできます。",
|
||||
|
||||
"tt_entree": "ナビペインを表示(ディレクトリツリーサイドバー)$Nホットキー: B",
|
||||
"tt_detree": "パンくずリストを表示$Nホットキー: B",
|
||||
"tt_visdir": "選択したフォルダまでスクロール",
|
||||
"tt_ftree": "フォルダツリー / テキストファイルの切り替え$Nホットキー: V",
|
||||
"tt_pdock": "上部のドッキングされたペインに親フォルダを表示",
|
||||
"tt_dynt": "ツリーが拡大するにつれて自動的に増加",
|
||||
"tt_wrap": "単語の折り返し",
|
||||
"tt_hover": "ホバーすると溢れた線を表示する$N( マウスを押さない限りスクロールが中断されます $N カーソルは左余白です )",
|
||||
|
||||
"ml_pmode": "フォルダの末尾...",
|
||||
"ml_btns": "コマンド",
|
||||
"ml_tcode": "変換",
|
||||
"ml_tcode2": "この形式に変換",
|
||||
"ml_tint": "色合い",
|
||||
"ml_eq": "オーディオイコライザー",
|
||||
"ml_drc": "ダイナミックレンジコンプレッサー",
|
||||
|
||||
"mt_loop": "1曲をループ/リピート再生\">🔁",
|
||||
"mt_one": "1曲で止める\">1️⃣",
|
||||
"mt_shuf": "各フォルダ内の曲をシャッフルする\">🔀",
|
||||
"mt_aplay": "サーバーにアクセスするためにクリックしたリンクに曲IDがある場合は自動再生されます$N$Nこれを無効にすると、音楽を再生するときにページのURLが曲IDで更新されなくなります。これにより設定が失われてもURLが残っている場合の自動再生が防止されます。\">a▶",
|
||||
"mt_preload": "ギャップレス再生のために曲の終わり近くに次の曲の読み込みを開始する\">preload",
|
||||
"mt_prescan": "最後の曲が終了する前に次のフォルダへ移動し$Nウェブブラウザが$N再生を停止しないようにする\">nav",
|
||||
"mt_fullpre": "曲全体を事前ロードしてみる;$N✅ <b>信頼できない</b>接続で有効にする、$N❌ 低速接続では<b>無効</b>にする\">full",
|
||||
"mt_fau": "携帯電話では、次の曲が十分に早く読み込まれない場合に音楽が停止しないようにする(タグの表示が不安定になる可能性があります)\">☕️",
|
||||
"mt_waves": "波形シークバー:$Nスクラバーにオーディオ振幅を表示する\">~s",
|
||||
"mt_npclip": "現在再生中の曲をクリップボードに保存するためのボタンを表示する\">/np",
|
||||
"mt_m3u_c": "選択した曲をm3u8プレイリストエントリとして$Nクリップボードに保存するためのボタンを表示する\">📻",
|
||||
"mt_octl": "OS統合(メディアホットキー / OSD)\">os-ctl",
|
||||
"mt_oseek": "OS統合によるシークを許可する$N$N注: 一部のデバイス(iPhone)では$N次の曲ボタンの代わりになります\">シーク",
|
||||
"mt_oscv": "OSDでアルバムカバーを表示する\">art",
|
||||
"mt_follow": "再生中の曲をスクロールして表示したままにする\">🎯",
|
||||
"mt_compact": "コントローラーを小さく\">⟎",
|
||||
"mt_uncache": "キャッシュクリア (ブラウザが破損した曲のコピーをキャッシュしているために$N再生できない場合はこれを試してください)\">uncache",
|
||||
"mt_mloop": "開いているフォルダをループ\">🔁 ループ",
|
||||
"mt_mnext": "次のフォルダを読み込んで続行\">📂 次",
|
||||
"mt_mstop": "再生を停止\">⏸ 停止",
|
||||
"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",
|
||||
"mt_c2mp3": "非常に古いデバイスでこれを使用\">mp3",
|
||||
"mt_c2flac": "最高の音質、ダウンロードサイズが大きい\">flac",
|
||||
"mt_c2wav": "非圧縮再生(さらに大きい)\">wav",
|
||||
"mt_c2ok": "素晴らしい、良い選択です",
|
||||
"mt_c2nd": "これは現在のデバイスに推奨される出力形式ではありませんが、問題ありません",
|
||||
"mt_c2ng": "現在のデバイスはこの出力形式をサポートしていないようですが、とにかく試してみましょう",
|
||||
"mt_xowa": "iOSにはこのフォーマットを使用したバックグラウンド再生を妨げるバグがあります; 代わりにcafまたはmp3を使用してください",
|
||||
"mt_tint": "シークバーの背景レベル(0~100)を調整し$Nバッファリングの邪魔にならにようにする",
|
||||
"mt_eq": "イコライザーとゲイン制御を有効にします;$N$Nブースト <code>0</code> = 標準音量100%(変更なし)$N$N幅 <code>1 </code> = 標準ステレオ(変更なし)$N幅 <code>0.5</code> = 左右のクロスフィード50%$N幅 <code>0 </code> = モノラル$N$Nブースト <code>-0.8</code> & 幅 <code>10</code> = ボーカル除去 :^)$N$Nイコライザーを有効にするとギャップレスアルバムは完全にギャップレスになります。そのため、それを気に場合すべての値をゼロ(幅 = 1を除く)にしてイコライザーをオンにしたままにしてください。",
|
||||
"mt_drc": "ダイナミックレンジコンプレッサー(ボリュームフラットナー / ブリックウォーラー)を有効にします; EQでスパゲッティのバランスをとることもできます。そのため、EQのフィールドを「幅」以外すべて0に設定してください。$N$Nしきい値を超えるオーディオの音量を下げる; しきい値を超えるRATIO dBごとに1dBの出力されますしきい値-24と比率12のデフォルト値は、-22dBを超えることはなく、イコライザーのブーストを0.8に、またはATK 0とRLS 90などの非常に大きな値にした場合1.8まで安全に上げられます (Firefoxでのみ機能し、他のブラウザーではRLSは最大 1 です)。$N$N(Wikipedia を参照してください。もっとわかりやすく説明されています)",
|
||||
|
||||
"mb_play": "再生",
|
||||
"mm_hashplay": "このオーディオファイルを再生しますか?",
|
||||
"mm_m3u": "再生するには<code>Enter/OK</code>を押します\n編集するには<code>ESC/キャンセル</code>を押してください",
|
||||
"mp_breq": "Firefox 82以降、Chrome 73以降、またはiOS 15以降が必要です",
|
||||
"mm_bload": "読み込み中...",
|
||||
"mm_bconv": "{0}に変換中。お待ちください。...",
|
||||
"mm_opusen": "現在のブラウザはaac / m4aファイルを再生できません;\nOpusへのトランスコードが有効になりました",
|
||||
"mm_playerr": "再生に失敗: ",
|
||||
"mm_eabrt": "再生の試行はキャンセルされました",
|
||||
"mm_enet": "インターネット接続が不安定です",
|
||||
"mm_edec": "このファイルは破損している??",
|
||||
"mm_esupp": "現在のブラウザはこのオーディオ形式に対応していません",
|
||||
"mm_eunk": "不明なエラー",
|
||||
"mm_e404": "オーディオを再生できませんでした。エラー404: ファイルが見つかりません。",
|
||||
"mm_e403": "オーディオを再生できませんでした。エラー403: アクセス拒否。\n\nF5キーを押してリロードしてみてください。ログアウトしている可能性があります。",
|
||||
"mm_e415": "オーディオを再生できませんでした。エラー415: ファイルの変換に失敗しました。サーバーログを確認してください。", //m
|
||||
"mm_e500": "オーディオを再生できませんでした。エラー500: サーバーログを確認してください。",
|
||||
"mm_e5xx": "オーディオを再生できませんでした。サーバーエラー ",
|
||||
"mm_nof": "近くにオーディオファイルが見つかりません",
|
||||
"mm_prescan": "次に再生する曲を探しています...",
|
||||
"mm_scank": "次の曲を見つけました:",
|
||||
"mm_uncache": "キャッシュがクリアされました; 次回の再生時にすべての曲が再ダウンロードされます",
|
||||
"mm_hnf": "その曲はもう存在しません",
|
||||
|
||||
"im_hnf": "その画像はもう存在しません",
|
||||
|
||||
"f_empty": 'このフォルダは空です',
|
||||
"f_chide": 'これにより列 «{0}» が非表示になります\n\n設定タブで列の非表示を解除できます',
|
||||
"f_bigtxt": "このファイルは {0} MiB の大きさです -- 本当にテキストとして表示しますか?",
|
||||
"f_bigtxt2": "代わりにファイルの末尾だけを表示しませんか?これにより追跡も有効になり、新しく追加されたテキスト行がリアルタイムで表示されます。",
|
||||
"fbd_more": '<div id="blazy">表示中 <code>{0}</code> / <code>{1}</code> ファイル; <a href="#" id="bd_more">{2}件を表示</a> または <a href="#" id="bd_all">すべて表示</a></div>',
|
||||
"fbd_all": '<div id="blazy">表示中 <code>{0}</code> / <code>{1}</code> ファイル; <a href="#" id="bd_all">すべて表示</a></div>',
|
||||
"f_anota": "{1}件のアイテムのうち {0}件が選択されました;\nフォルダ全体を選択するには、まず一番下までスクロールします",
|
||||
|
||||
"f_dls": '現在のフォルダ内のファイルリンクは\nダウンロードリンクに変更されました',
|
||||
|
||||
"f_partial": "現在アップロード中のファイルを安全にダウンロードするには、同じファイル名で<code>.PARTIAL</code>拡張子がないファイルをクリックしてください。これを行うにはキャンセルまたはEscキーを押してください。\n\nOK / Enter を押すとこの警告は無視され、代わりに<code>.PARTIAL</code>スクラッチファイルのダウンロードが続行されますが、ほとんどの場合データが破損することになります。",
|
||||
|
||||
"ft_paste": "{0}件のアイテムを貼り付け$Nホットキー: ctrl-V",
|
||||
"fr_eperm": '名前を変更できません:\nこのフォルダではの"移動"の権限がありません',
|
||||
"fd_eperm": '削除できません:\nこのフォルダではの"削除"の権限がありません',
|
||||
"fc_eperm": '切り取りできません:\nこのフォルダではの"移動"の権限がありません',
|
||||
"fp_eperm": '貼付けできません:\nこのフォルダではの"書込"の権限がありません',
|
||||
"fr_emore": "名前を変更する項目を1つ以上選択してください",
|
||||
"fd_emore": "削除する項目を1つ以上選択してください",
|
||||
"fc_emore": "切り取る項目を1つ以上選択してください",
|
||||
"fcp_emore": "クリップボードにコピーする項目を1つ以上選択してください",
|
||||
|
||||
"fs_sc": "現在表示中のフォルダを共有する",
|
||||
"fs_ss": "選択したファイルを共有する",
|
||||
"fs_just1d": "複数のフォルダを選択することはできません\nまた、1回の選択でファイルとフォルダを混在させることはできません。",
|
||||
"fs_abrt": "❌ 中止",
|
||||
"fs_rand": "🎲 ランダム名",
|
||||
"fs_go": "✅ 共有を作成",
|
||||
"fs_name": "名前",
|
||||
"fs_src": "ソース",
|
||||
"fs_pwd": "パスワード",
|
||||
"fs_exp": "有効期限",
|
||||
"fs_tmin": "分",
|
||||
"fs_thrs": "時間",
|
||||
"fs_tdays": "日",
|
||||
"fs_never": "無期限",
|
||||
"fs_pname": "任意のリンク名; 空白の場合はランダムになります",
|
||||
"fs_tsrc": "共有するファイルまたはフォルダ",
|
||||
"fs_ppwd": "任意のパスワード",
|
||||
"fs_w8": "共有の作成...",
|
||||
"fs_ok": "<code>Enter/OK</code>を押してクリップボードに保存します\n<code>ESC/キャンセル</code>を押して閉じます",
|
||||
|
||||
"frt_dec": "壊れたファイル名を修正するかもしれません\">url-decode",
|
||||
"frt_rst": "変更したファイル名を元の名前に戻す\">↺ リセット",
|
||||
"frt_abrt": "中止してこのウィンドウを閉じる\">❌ キャンセル",
|
||||
"frb_apply": "名前の変更を適用",
|
||||
"fr_adv": "バッチ / メタデータ / パターン名変更\">詳細設定",
|
||||
"fr_case": "大文字と小文字を区別する正規表現\">case",
|
||||
"fr_win": "Windowsで安全な名前; <code><>:"\\|?*</code>を日本語の全角文字に置き換える\">win",
|
||||
"fr_slash": "<code>/</code>を新しいフォルダが作成されない文字に置き換える\">no /",
|
||||
"fr_re": "元のファイル名に適用する正規表現検索パターン; キャプチャグループは、<code>(1)</code> や <code>(2)</code> のように、以下のフォーマットフィールドで参照することができるので、",
|
||||
"fr_fmt": "foobar2000 を参考にしています:$N<code>(title)</code> は曲名に置き換えられます。$N<code>[(artist) - ](title)</code> はアーティストが空白の場合は[この]部分をスキップします。$N<code>$lpad((tn),2,0)</code> はトラック番号を2桁にパディングします。",
|
||||
"fr_pdel": "削除",
|
||||
"fr_pnew": "名前をつけて保存",
|
||||
"fr_pname": "新しいプリセットの名前を入力します",
|
||||
"fr_aborted": "中止されました",
|
||||
"fr_lold": "古い名前",
|
||||
"fr_lnew": "新しい名前",
|
||||
"fr_tags": "選択したファイルのタグ(読み取り専用、参照のみ):",
|
||||
"fr_busy": "{0}件のアイテムの名前を変更...\n\n{1}",
|
||||
"fr_efail": "名前の変更に失敗:\n",
|
||||
"fr_nchg": "新しい名前のうち {0}件は、<code>win</code> および/または <code>no /</code> により変更されました。\n\nこれらを変更後の新しい名前で続行しますか?",
|
||||
|
||||
"fd_ok": "削除成功",
|
||||
"fd_err": "削除失敗:\n",
|
||||
"fd_none": "何も削除されませんでした; サーバー構成 (xbd) によってブロックされた可能性があります。",
|
||||
"fd_busy": "{0}件のアイテムを削除中...\n\n{1}",
|
||||
"fd_warn1": "これら {0}件のアイテムを削除しますか?",
|
||||
"fd_warn2": "<b>最後の警告!</b> 取り消し不可。削除しますか?",
|
||||
|
||||
"fc_ok": "{0}件のアイテムを切り取り",
|
||||
"fc_warn": '{0}件のアイテムを切り取りました\n\nしかし: <b>この</b>ブラウザタブでのみ貼り付けることができます\n(選択範囲が非常に大きいため)',
|
||||
|
||||
"fcc_ok": "{0}件のアイテムをクリップボードにコピー",
|
||||
"fcc_warn": '{0}件のアイテムをクリップボードにコピーしました\n\nしかし: <b>この</b>ブラウザタブでのみ貼り付けることができます\n(選択範囲が非常に大きいため)',
|
||||
|
||||
"fp_apply": "これらの名前を使用する",
|
||||
"fp_skip": "競合をスキップ", // トピックノート: "既存の名前をスキップ" (対象フォルダ内のファイル名)
|
||||
"fp_ecut": "最初にファイル / フォルダを切り取りまたはコピーし、貼り付け / 移動します\n\n注: 異なるブラウザタブ間で切り取り / 貼り付けが可能です",
|
||||
"fp_ename": "名前がすでに使用されているため、{0}件のアイテムはここに移動することはできません。続行するには、以下に新しい名前を入力するか名前を空白(\"競合をスキップ\")にしてスキップしてください:",
|
||||
"fcp_ename": "名前がすでに使用されているため、{0}件のアイテムはここにコピーすることはできません。続行するには、以下に新しい名前を入力するか名前を空白(\"競合をスキップ\")にしてスキップしてください:",
|
||||
"fp_emore": "まだ修正すべきファイル名の競合がいくつか残っています",
|
||||
"fp_ok": "移動完了",
|
||||
"fcp_ok": "コピー完了",
|
||||
"fp_busy": "{0}件のアイテムを移動中...\n\n{1}",
|
||||
"fcp_busy": "{0}件のアイテムをコピー中...\n\n{1}",
|
||||
"fp_abrt": "中止しています...",
|
||||
"fp_err": "移動に失敗:\n",
|
||||
"fcp_err": "コピーに失敗:\n",
|
||||
"fp_confirm": "これらの{0}件のアイテムをここに移動しますか?",
|
||||
"fcp_confirm": "これらの{0}件のアイテムをここにコピーしますか?",
|
||||
"fp_etab": '他のブラウザタブからクリップボードを読み取ることができませんでした',
|
||||
"fp_name": "デバイスからファイルをアップロードします。ファイル名を入力してください:",
|
||||
"fp_both_m": '<h6>貼り付けるものを選択</h6><code>Enter</code> = «{1}»から{0}件のファイルを移動\n<code>ESC</code> = デバイスから{2}件のファイルをアップロード',
|
||||
"fcp_both_m": '<h6>貼り付けるものを選択</h6><code>Enter</code> = «{1}»から{0}件のファイルをコピー\n<code>ESC</code> = デバイスから{2}件のファイルをアップロード',
|
||||
"fp_both_b": '<a href="#" id="modal-ok">移動</a><a href="#" id="modal-ng">アップロード</a>',
|
||||
"fcp_both_b": '<a href="#" id="modal-ok">コピー</a><a href="#" id="modal-ng">アップロード</a>',
|
||||
|
||||
"mk_noname": "それをする前に左側のテキストフィールドに名前を入力してください :p",
|
||||
"nmd_i1": "必要なファイル拡張子も追加します。例: <code>.md</code>",
|
||||
"nmd_i2": "削除権限がないため、<code>.md</code> ファイルのみを作成できます",
|
||||
|
||||
"tv_load": "テキストドキュメントの読み込み中:\n\n{0}\n\n{1}%({2} / {3} MiB ロード済み)",
|
||||
"tv_xe1": "テキストファイルを読み込めませんでした:\n\nエラー ",
|
||||
"tv_xe2": "404、ファイルが見つかりません",
|
||||
"tv_lst": "テキストファイルの一覧",
|
||||
"tvt_close": "フォルダビューに戻る$Nホットキー: M(または Esc)\">❌ 閉じる",
|
||||
"tvt_dl": "このファイルをダウンロード$Nホットキー: Y\">💾 ダウンロード",
|
||||
"tvt_prev": "前のドキュメントを表示$Nホットキー: i\">⬆ 前へ",
|
||||
"tvt_next": "次のドキュメントを表示$Nホットキー: K\">⬇ 次へ",
|
||||
"tvt_sel": "ファイルの選択 (切り取り/コピー/削除/...)$Nホットキー: S\">選択",
|
||||
"tvt_j": "jsonの整形$Nホットキー: shift-J\">j",
|
||||
"tvt_edit": "テキストエディタでファイルを開く$Nホットキー: E\">✏️ 編集",
|
||||
"tvt_tail": "ファイルの変更を監視する; 新しい行をリアルタイムで表示する\">📡 監視",
|
||||
"tvt_wrap": "ワードラップ\">↵",
|
||||
"tvt_atail": "ページ最下部までスクロールをロック\">⚓",
|
||||
"tvt_ctail": "端末カラーをデコード(ANSIエスケープコード)\">🌈",
|
||||
"tvt_ntail": "スクロールバック制限(読み込むテキストの最大バイト数)",
|
||||
|
||||
"m3u_add1": "曲がm3uプレイリストに追加されました",
|
||||
"m3u_addn": "{0}曲をm3uプレイリストに追加しました",
|
||||
"m3u_clip": "m3uプレイリストがクリップボードにコピーされました\n\nsomething.m3uという新しいテキストファイルを作成し、そのドキュメントにプレイリストを貼り付けます; これで再生可能になります",
|
||||
|
||||
"gt_vau": "動画は表示せず音声のみを再生する\">🎧",
|
||||
"gt_msel": "ファイル選択を有効にする; ファイルをCtrlキーを押しながらクリックすると上書き保存します$N$N<em>有効時: ファイル / フォルダをダブルクリックすると開きます</em>$N$Nホットキー: S\">複数選択",
|
||||
"gt_crop": "中央切り抜きのサムネイル\">切抜き",
|
||||
"gt_3x": "高解像度サムネイル\">3x",
|
||||
"gt_zoom": "拡大",
|
||||
"gt_chop": "切断",
|
||||
"gt_sort": "並べ替え",
|
||||
"gt_name": "名前",
|
||||
"gt_sz": "サイズ",
|
||||
"gt_ts": "日付",
|
||||
"gt_ext": "種類",
|
||||
"gt_c1": "ファイル名をさらに短縮する(表示を減らす)",
|
||||
"gt_c2": "ファイル名を短縮する(詳細を表示)",
|
||||
|
||||
"sm_w8": "検索中...",
|
||||
"sm_prev": "以下の検索結果は以前のクエリからのものです:\n ",
|
||||
"sl_close": "検索結果を閉じる",
|
||||
"sl_hits": "{0}件の結果を表示中",
|
||||
"sl_moar": "さらに読み込む",
|
||||
|
||||
"s_sz": "サイズ",
|
||||
"s_dt": "日付",
|
||||
"s_rd": "パス",
|
||||
"s_fn": "名前",
|
||||
"s_ta": "タグ",
|
||||
"s_ua": "Up@",
|
||||
"s_ad": "詳細.",
|
||||
"s_s1": "最小 MiB",
|
||||
"s_s2": "最大 MiB",
|
||||
"s_d1": "古い. iso8601",
|
||||
"s_d2": "新しい. iso8601",
|
||||
"s_u1": "アップロード後",
|
||||
"s_u2": "および/または前",
|
||||
"s_r1": "パスに含まれる (スペース区切り)",
|
||||
"s_f1": "名前に含まれる (-nopeで否定)",
|
||||
"s_t1": "タグに含まれる (^=開始、終了=$)",
|
||||
"s_a1": "特定のメタデータプロパティ",
|
||||
|
||||
"md_eshow": "レンダリングできません ",
|
||||
"md_off": "[📜<em>readme</em>] 無効 [⚙️] -- ドキュメントを非表示",
|
||||
|
||||
"badreply": "サーバーからの応答を解析できませんでした",
|
||||
|
||||
"xhr403": "403: アクセスが拒否されました\n\nF5キーを押してみてください。ログアウトしている可能性があります",
|
||||
"xhr0": "不明(サーバーへの接続が失われたか、サーバーがオフラインになっている可能性があります)",
|
||||
"cf_ok": "申し訳ありません -- DD" + wah + "oS 保護が作動し\n\n約30秒で再開されます\n\n何も起こらない場合はF5キーを押してページを再読み込みしてください",
|
||||
"tl_xe1": "サブフォルダを一覧表示できませんでした:\n\nエラー ",
|
||||
"tl_xe2": "404: フォルダーが見つかりません",
|
||||
"fl_xe1": "フォルダ内のファイルを一覧表示できませんでした:\n\nエラー ",
|
||||
"fl_xe2": "404: フォルダーが見つかりません",
|
||||
"fd_xe1": "サブフォルダを作成できませんでした:\n\nエラー ",
|
||||
"fd_xe2": "404: 親フォルダが見つかりません",
|
||||
"fsm_xe1": "メッセージを送信できませんでした:\n\nエラー ",
|
||||
"fsm_xe2": "404: 親フォルダが見つかりません",
|
||||
"fu_xe1": "サーバーから投稿取り消しリストを読み込めませんでした:\n\nエラー ",
|
||||
"fu_xe2": "404: ファイルが見つかりません??",
|
||||
|
||||
"fz_tar": "非圧縮gnu-tarファイル(Linux / Mac)",
|
||||
"fz_pax": "非圧縮pax形式のtar(遅い)",
|
||||
"fz_targz": "gzip圧縮レベル3のgnu-tar$N$Nこれは通常非常に遅いので$N代わりに非圧縮tarを使用してください。",
|
||||
"fz_tarxz": "xz圧縮レベル1のgnu-tar$N$Nこれは通常非常に遅いので$N代わりに非圧縮のtarを使用してください。",
|
||||
"fz_zip8": "UTF8ファイル名のzip形式(Windows7以前では動作が不安定になる可能性があります)",
|
||||
"fz_zipd": "非常に古いソフトウェア用の従来のcp437ファイル名のzip",
|
||||
"fz_zipc": "cp437はcrc32を早期に計算します$NMS-DOS PKZIP v2.04g用(1993年10月)$N(ダウンロードを開始するまでの処理に時間がかかります)",
|
||||
|
||||
"un_m1": "最近アップロードした動画を削除したり未完成の動画を中止したりできます。",
|
||||
"un_upd": "更新",
|
||||
"un_m4": "または以下のファイルを共有する:",
|
||||
"un_ulist": "表示",
|
||||
"un_ucopy": "コピー",
|
||||
"un_flt": "任意のフィルター: URLには以下を含める必要があります",
|
||||
"un_fclr": "フィルターをクリア",
|
||||
"un_derr": '未投稿の削除に失敗しました:\n',
|
||||
"un_f5": '何かが壊れています。リロードするかF5キーを押してみてください。',
|
||||
"un_uf5": "申し訳ありませんが、このアップロードを中止するにはページを更新する必要があります(例:F5キーまたはCtrl+Rキーを押す)",
|
||||
"un_nou": '<b>警告:</b> サーバーが混雑しているため未完了のアップロードを表示できません; しばらくしてから「更新」リンクをクリックしてください',
|
||||
"un_noc": '<b>警告:</b> 完全にアップロードされたファイルの未投稿化はサーバー設定で有効化 / 許可されていません',
|
||||
"un_max": "最初の2000件のファイルを表示中 (フィルターを使用)",
|
||||
"un_avail": "{0}件の最近のアップロードを削除できます<br />未完了のものは{1}件中止できます",
|
||||
"un_m2": "アップロード日時順に並べ替え; 新しい順:",
|
||||
"un_no1": "冗談だよ!アップロードされたものはどれも最新じゃない",
|
||||
"un_no2": "冗談だよ!そのフィルターに一致するアップロードに最新のものはありません",
|
||||
"un_next": "次の{0}件のファイルを削除します",
|
||||
"un_abrt": "中止",
|
||||
"un_del": "削除",
|
||||
"un_m3": "最近のアップロードを読み込み中...",
|
||||
"un_busy": "{0}件のファイルを削除中...",
|
||||
"un_clip": "{0}件のリンクをクリップボードにコピーしました",
|
||||
|
||||
"u_https1": "あなたはするべき",
|
||||
"u_https2": "httpsに切り替える",
|
||||
"u_https3": "パフォーマンス向上のため",
|
||||
"u_ancient": '現在のブラウザは驚くほど古いです -- <a href="#" onclick="goto(\'bup\')">代わりにbup</a>を使った方がいいかもしれません',
|
||||
"u_nowork": "Firefox 53以降、Chrome 57以降、またはiOS 11以降が必要です",
|
||||
"tail_2old": "Firefox 105以降、Chrome 71以降、またはiOS 14.5以降が必要です",
|
||||
"u_nodrop": '現在のブラウザは古すぎてドラッグ&ドロップによるアップロードに対応していません',
|
||||
"u_notdir": "それはフォルダではありません!\n\nブラウザが古すぎです、\n代わりにドラッグドロップを試してください",
|
||||
"u_uri": "他のブラウザウィンドウから画像をドラッグアンドドロップするには、\n大きなアップロードボタンにドロップしてください",
|
||||
"u_enpot": '<a href="#">potato UI</a>に切り替える (アップロード速度が向上する可能性があります)',
|
||||
"u_depot": '<a href="#">fancy UI</a>に切り替える(アップロード速度が低下する可能性があります)',
|
||||
"u_gotpot": 'アップロード速度を向上させるためにポテトUIに切り替えました。\n\n同意しない場合は遠慮なく元に戻してください!',
|
||||
"u_pott": "<p>ファイル: <b>{0}</b> 完了済み, <b>{1}</b> 失敗, <b>{2}</b> ビジー, <b>{3}</b> キュー内</p>",
|
||||
"u_ever": "これは基本的なアップローダーです; up2kは少なくとも以下が必要です<br>chrome 21 // firefox 13 // edge 12 // opera 12 // safari 5.1",
|
||||
"u_su2k": 'これは基本的なアップローダーです; <a href="#" id="u2yea">up2k</a>の方が優れています',
|
||||
"u_uput": '速度を最適化(チェックサムをスキップ)',
|
||||
"u_ewrite": 'このフォルダへの書き込み権限がありません',
|
||||
"u_eread": 'このフォルダーへの読み取りアクセス権がありません',
|
||||
"u_enoi": 'サーバー設定でファイル検索が有効になっていません',
|
||||
"u_enoow": "ここでは上書きは機能しません; 削除権限が必要です",
|
||||
"u_badf": 'これらの {0}件のファイル(合計 {1}件中)はファイルシステムの権限が原因でスキップされた可能性があります:\n\n',
|
||||
"u_blankf": 'これらの {0}件のファイル(合計 {1}件中)は空白です; それでもアップロードしますか?\n\n',
|
||||
"u_applef": 'これらの {0}件のファイル(合計 {1}件中)はおそらく不要です;\n次のファイルをスキップするには<code>OK/Enter</code>を押してください、\n除外しない場合は<code>キャンセル/ESC</code>を押してそれらもアップロードしてください:\n\n',
|
||||
"u_just1": '\nファイルを1つだけ選択した方がうまくいくかもしれません',
|
||||
"u_ff_many": "<b>Linux / MacOS / Android,</b>を使用している場合この量のファイルにより<a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=1790500\" target=\"_blank\">Firefoxがクラッシュする<em>可能性</em></a>があります\nその場合はもう一度お試しください(または Chrome を使用してください)。",
|
||||
"u_up_life": "このアップロードは {0}後に\nサーバーから削除されます。",
|
||||
"u_asku": 'これらの{0}件のファイルを<code>{1}</code>にアップロードします',
|
||||
"u_unpt": "左上のボタン🧯を使ってこのアップロードを取り消し / 削除できます",
|
||||
"u_bigtab": '{0}件のファイルを表示しようとしています\n\nブラウザがクラッシュする可能性がありますが、よろしいですか?',
|
||||
"u_scan": 'ファイルをスキャン中...',
|
||||
"u_dirstuck": 'ディレクトリ走査が次の {0}件のアイテムへのアクセス中に停止しました; スキップします:',
|
||||
"u_etadone": '完了 ({0}, {1}件のファイル)',
|
||||
"u_etaprep": '(アップロード準備中)',
|
||||
"u_hashdone": 'ハッシュ化完了',
|
||||
"u_hashing": 'ハッシュ',
|
||||
"u_hs": 'ハンドシェイク中...',
|
||||
"u_started": "ファイルをアップロード中です; 参照 [🚀]",
|
||||
"u_dupdefer": "複製; 他のすべてのファイルの処理完了後に処理されます",
|
||||
"u_actx": "他のウィンドウ/タブに切り替えるときに<br />パフォーマンスの低下を防ぐにはこのテキストをクリックしてください",
|
||||
"u_fixed": "OK! 修正しました 👍",
|
||||
"u_cuerr": "{0} / {1} のチャンクのアップロードに失敗しました;\nおそらく無害、継続中\n\nファイル: {2}",
|
||||
"u_cuerr2": "サーバーがアップロードを拒否しました({0} / {1}のチャンク);\n後で再試行します\n\nファイル: {2}\n\nエラー ",
|
||||
"u_ehstmp": "再試行します; 右下を参照",
|
||||
"u_ehsfin": "サーバーがアップロードの完了リクエストを拒否しました; 再試行中...",
|
||||
"u_ehssrch": "サーバーは検索実行リクエストを拒否しました; 再試行中...",
|
||||
"u_ehsinit": "サーバーはアップロード開始リクエストを拒否しました; 再試行中...",
|
||||
"u_eneths": "アップロードハンドシェイク中にネットワークエラーが発生しました; 再試行中...",
|
||||
"u_enethd": "ターゲットの存在をテスト中にネットワークエラーが発生しました; 再試行中...",
|
||||
"u_cbusy": "ネットワークの不具合後サーバーが再び信頼するのを待っています...",
|
||||
"u_ehsdf": "サーバーのディスク容量が不足しました!\n\n誰かが十分な空き領域を確保して続行できるようになるまで\n再試行を続けます",
|
||||
"u_emtleak1": "お使いのウェブブラウザでメモリリークが発生している可能性があります;\nお願いします",
|
||||
"u_emtleak2": ' <a href="{0}">httpsに切り替える(推奨)</a>もしくは',
|
||||
"u_emtleak3": ' ',
|
||||
"u_emtleakc": '次を試してください:\n<ul><li><code>F5</code>を押してページを更新してください</li><li>次に <code>mt</code>を無効にします <code>⚙️ settings</code></li>ボタンをクリックし<li>もう一度アップロードしてみてください</li></ul>アップロードは少し遅くなりますが、仕方ないでしょう。\nご迷惑をおかけして申し訳ありません!\n\n追記: chrome v107ではこの問題が<a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1354816" target="_blank">修正されました</a>',
|
||||
"u_emtleakf": '次を試してください:\n<ul><li><code>F5</code>を押してページを更新してください</li><li>アップロードUIで<code>🥔</code>(ポテト)を有効にして<li>もう一度アップロードを試してください</li></ul>\n追記: firefoxは<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790500" target="_blank">バグ修正が行われることを期待しています</a>',
|
||||
"u_s404": "サーバー上にファイルが見つかりません",
|
||||
"u_expl": "説明",
|
||||
"u_maxconn": "ほとんどのブラウザではこの数が6に制限されていますが、Firefoxでは<code>about:config</code>の<code>connections-per-server</code>でこの数を増やすことができます",
|
||||
"u_tu": '<p class="warn">警告: ターボが有効になっている場合、<span> クライアントは不完全なアップロードを検出して再開できない可能性があります; ターボボタンのツールチップを見る</span></p>',
|
||||
"u_ts": '<p class="warn">警告: ターボが有効になっている場合、<span> 検索結果が間違っている可能性があります; ターボボタンのツールチップを見る</span></p>',
|
||||
"u_turbo_c": "サーバー設定でターボが無効になっています",
|
||||
"u_turbo_g": "このボリューム内でディレクトリ一覧表示の権限がないため\nターボを無効化しています",
|
||||
"u_life_cfg": '<input id="lifem" p="60" />分後に自動削除(もしくは<input id="lifeh" p="3600" />時間)',
|
||||
"u_life_est": 'アップロードは削除されます <span id="lifew" tt="local time">---</span>',
|
||||
"u_life_max": 'このフォルダーの最大保存期間が\n{0}に設定されています。',
|
||||
"u_unp_ok": '{0}に対して未投稿が許可されています',
|
||||
"u_unp_ng": '未投稿は許可されません',
|
||||
"ue_ro": 'このフォルダのアクセス権限は読み取り専用です\n\n',
|
||||
"ue_nl": '現在ログインしていません',
|
||||
"ue_la": '現在"{0}"としてログインしています',
|
||||
"ue_sr": '現在ファイル検索モードです\n\n虫眼鏡 🔎(大きな検索ボタンの横)をクリックしてアップロードモードに切り替え、もう一度アップロードしてみてください。\n\n申し訳ありません',
|
||||
"ue_ta": 'もう一度アップロードしてみてください。今度は動作するはずです。',
|
||||
"ue_ab": "このファイルはすでに別のフォルダにアップロード中です。それが完了するまでこのファイルを他の場所にアップロードすることはできません。\n\n左上の🧯を使用して最初のアップロードを中止して忘れることができます。",
|
||||
"ur_1uo": "OK: ファイルのアップロードに成功しました",
|
||||
"ur_auo": "OK: {0}件すべてのファイルが正常にアップロードされました",
|
||||
"ur_1so": "OK: ファイルがサーバー上で見つかりました",
|
||||
"ur_aso": "OK: {0}件すべてのファイルがサーバー上で見つかりました",
|
||||
"ur_1un": "アップロードに失敗しました。申し訳ありません。",
|
||||
"ur_aun": "{0}件すべてのファイルのアップロードに失敗しました。申し訳ありません。",
|
||||
"ur_1sn": "サーバー上にファイルが見つかりません",
|
||||
"ur_asn": "サーバー上に {0}件のファイルが見つかりませんでした",
|
||||
"ur_um": "完了;\n{0}件のアップロードはOKです,\n{1}件のアップロードに失敗しました。申し訳ありません。",
|
||||
"ur_sm": "完了;\n{0}件のファイルがサーバー上に見つかりました,\n{1}件のファイルがサーバー上に見つかりませんでした",
|
||||
|
||||
"rc_opn": "開く",
|
||||
"rc_ply": "再生",
|
||||
"rc_pla": "オーディオとして再生",
|
||||
"rc_txt": "ファイルビューアで開く",
|
||||
"rc_md": "markdownエディターで開く",
|
||||
"rc_dl": "ダウンロード",
|
||||
"rc_zip": "圧縮してダウンロード",
|
||||
"rc_cpl": "リンクをコピー",
|
||||
"rc_del": "削除",
|
||||
"rc_cut": "切り取り",
|
||||
"rc_cpy": "コピー",
|
||||
"rc_pst": "貼り付け",
|
||||
"rc_nfo": "新しいフォルダ",
|
||||
"rc_nfi": "新しいファイル",
|
||||
"rc_sal": "すべて選択",
|
||||
"rc_sin": "選択を反転",
|
||||
|
||||
"lang_set": "変更を反映させるために更新しますか?",
|
||||
|
||||
"splash": {
|
||||
"a1": "更新",
|
||||
"b1": "やあ、見知らぬ人 <small>(あなたはログインしていません)</small>",
|
||||
"c1": "ログアウト",
|
||||
"d1": "dump stack", // トピックノート: "d2" はこのボタンのツールチップです
|
||||
"d2": "すべてのアクティブなスレッドの状態を表示します",
|
||||
"e1": "cfgの再読み込み",
|
||||
"e2": "設定ファイル(アカウント/ボリューム/ボリュームフラグ)を再読み込みして、$Nすべてのe2dsボリュームを再スキャンします$N$N注: グローバル設定の変更を$N有効にするには完全な再起動が必要です",
|
||||
"f1": "閲覧可能:",
|
||||
"g1": "アップロード加納:",
|
||||
"cc1": "その他:",
|
||||
"h1": "k304を無効化", // トピックノート: "j1" はk304が何であるかを説明します
|
||||
"i1": "k304を有効化",
|
||||
"j1": "k304 を有効にすると、HTTP 304ごとにクライアントが切断されバグのあるプロキシがスタックするのを防ぐことができます(突然ページが読み込まれなくなるなど)<em>ただし</em>全体的に速度が低下します",
|
||||
"k1": "クライアント設定をリセット",
|
||||
"l1": "詳しくはログインしてください:",
|
||||
"ls3": "ログイン",
|
||||
"lu4": "ユーザー名",
|
||||
"lp4": "パスワード",
|
||||
"lo3": "「{0}」をどこからでもログアウトする",
|
||||
"lo2": "これによりすべてのブラウザでセッションが終了します",
|
||||
"m1": "おかえりなさい、", // トピックノート: "おかえりなさい、ユーザー名"
|
||||
"n1": "404 not found ┐( ´ -`)┌",
|
||||
"o1": 'あるいはアクセスできないかもしれません -- パスワードを試すか <a href="' + SR + '/?h">ホームに戻ってください</a>',
|
||||
"p1": "403 forbiddena ~┻━┻",
|
||||
"q1": 'パスワードを使うか <a href="' + SR + '/?h">ホームに戻ってください</a>',
|
||||
"r1": "ホームに戻る",
|
||||
".s1": "再スキャン",
|
||||
"t1": "アクション", // トピックノート: これは"再スキャン"ボタンの上のヘッダーです
|
||||
"u2": "最後のサーバー書き込みからの時間$N(アップロード / 名前変更 / ...)$N$N17d = 17日$N1h23 = 1時間23分$N4m56 = 4分56秒",
|
||||
"v1": "接続",
|
||||
"v2": "このサーバーをローカルHDDとして使用する",
|
||||
"w1": "httpsへ切り替え",
|
||||
"x1": "パスワードの変更",
|
||||
"y1": "共有の編集", // トピックノート: ユーザーが共有することを決定したフォルダのリストを表示します
|
||||
"z1": "この共有のロックを解除する:", // トピックノート: 隠し共有を表示するためのパスワードプロンプト
|
||||
"ta1": "最初に新しいパスワードを入力してください",
|
||||
"ta2": "確認のため新しいパスワードを再入力してください:",
|
||||
"ta3": "タイプミスを発見しました; もう一度試してください",
|
||||
"nop": "エラー: パスワードは空白にできません",
|
||||
"nou": "エラー: ユーザー名とパスワードは空白にできません",
|
||||
"aa1": "受信ファイル:",
|
||||
"ab1": "no304を無効化",
|
||||
"ac1": "no304を有効化",
|
||||
"ad1": "no304を有効にするとすべてのキャッシュが無効になります; k304 では不十分な場合はこちらをお試しください。これにより膨大な量のネットワークトラフィックが無駄になります!",
|
||||
"ae1": "アクティブなダウンロード:",
|
||||
"af1": "最近のアップロードを表示",
|
||||
"ag1": "idpキャッシュを表示", // トピックノート: IdPユーザーを管理できるページへのリンクです
|
||||
}
|
||||
};
|
||||
|
|
@ -334,6 +334,7 @@ Ls.kor = {
|
|||
"mm_eunk": "알 수 없는 오류",
|
||||
"mm_e404": "오디오를 재생할 수 없습니다; 오류 404: 파일을 찾을 수 없습니다.",
|
||||
"mm_e403": "오디오를 재생할 수 없습니다; 오류 403: 접근이 거부되었습니다.\n\nF5를 눌러 새로고침 해보세요, 로그아웃되었을 수 있습니다",
|
||||
"mm_e415": "오디오를 재생할 수 없습니다; 오류 415: 파일 변환에 실패했습니다; 서버 로그를 확인하세요.", //m
|
||||
"mm_e500": "오디오를 재생할 수 없습니다; 오류 500: 서버 로그를 확인하세요.",
|
||||
"mm_e5xx": "오디오를 재생할 수 없습니다; 서버 오류 ",
|
||||
"mm_nof": "주변에서 더 이상 오디오 파일을 찾을 수 없습니다",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.kor = {
|
|||
"rc_md": "텍스트 편집기에서 열기", //m
|
||||
"rc_dl": "다운로드", //m
|
||||
"rc_zip": "압축 파일로 다운로드", //m
|
||||
"rc_cpl": "링크 복사", //m
|
||||
"rc_del": "삭제", //m
|
||||
"rc_cut": "잘라내기", //m
|
||||
"rc_cpy": "복사", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.nld = {
|
|||
"mm_eunk": "Onbekende fout",
|
||||
"mm_e404": "Kan audio niet afspelen; fout 404: Bestand niet gevonden..",
|
||||
"mm_e403": "Kan audio niet afspelen; fout 403: Toegang geweigerd.\n\nProbeer op F5 te drukken om opnieuw te laden, misschien ben je uitgelogd",
|
||||
"mm_e415": "Kan geen audio afspelen; fout 415: Bestandsconversie mislukt; controleer serverlogs.", //m
|
||||
"mm_e500": "Kan geen audio afspelen; fout 500: Controleer serverlogs.",
|
||||
"mm_e5xx": "Kan geen audio afspelen; serverfout ",
|
||||
"mm_nof": "Geen audiobestanden meer vinden in de buurt",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.nld = {
|
|||
"rc_md": "Openen in teksteditor", //m
|
||||
"rc_dl": "Downloaden", //m
|
||||
"rc_zip": "Downloaden als archief", //m
|
||||
"rc_cpl": "Link kopiëren", //m
|
||||
"rc_del": "Verwijderen", //m
|
||||
"rc_cut": "Knippen", //m
|
||||
"rc_cpy": "Kopiëren", //m
|
||||
|
|
|
|||
|
|
@ -331,6 +331,7 @@ Ls.nno = {
|
|||
"mm_eunk": "Ukjent feil",
|
||||
"mm_e404": "Avspeling feilet: Fil ikkje funnet.",
|
||||
"mm_e403": "Avspeling feilet: Høve nekta.\n\nKanskje du blei logget ut?\nPrøv å trykk F5 for å laste sida på nytt.",
|
||||
"mm_e415": "Avspeling feilet: Kunne ikkje konvertere fila, sjekk serverloggen.",
|
||||
"mm_e500": "Avspeling feilet: Rusk i maskineriet, sjekk serverloggen.",
|
||||
"mm_e5xx": "Avspeling feilet: ",
|
||||
"mm_nof": "finn ikkje flere songer i nærheita",
|
||||
|
|
@ -644,6 +645,7 @@ Ls.nno = {
|
|||
"rc_md": "opne i tekstredigerar",
|
||||
"rc_dl": "Last ned",
|
||||
"rc_zip": "Last ned som arkiv",
|
||||
"rc_cpl": "kopier lenke",
|
||||
"rc_del": "slett",
|
||||
"rc_cut": "klipp ut",
|
||||
"rc_cpy": "kopier",
|
||||
|
|
|
|||
|
|
@ -331,6 +331,7 @@ Ls.nor = {
|
|||
"mm_eunk": "Ukjent feil",
|
||||
"mm_e404": "Avspilling feilet: Fil ikke funnet.",
|
||||
"mm_e403": "Avspilling feilet: Tilgang nektet.\n\nKanskje du ble logget ut?\nPrøv å trykk F5 for å laste siden på nytt.",
|
||||
"mm_e415": "Avspilling feilet: Kunne ikke konvertere filen, sjekk serverloggen.",
|
||||
"mm_e500": "Avspilling feilet: Rusk i maskineriet, sjekk serverloggen.",
|
||||
"mm_e5xx": "Avspilling feilet: ",
|
||||
"mm_nof": "finner ikke flere sanger i nærheten",
|
||||
|
|
@ -644,6 +645,7 @@ Ls.nor = {
|
|||
"rc_md": "åpne i teksteditor",
|
||||
"rc_dl": "Last ned",
|
||||
"rc_zip": "Last ned som arkiv",
|
||||
"rc_cpl": "kopier lenke",
|
||||
"rc_del": "slett",
|
||||
"rc_cut": "klipp ut",
|
||||
"rc_cpy": "kopier",
|
||||
|
|
|
|||
|
|
@ -337,6 +337,7 @@ Ls.pol = {
|
|||
"mm_eunk": "Nieznany błąd",
|
||||
"mm_e404": "Nie można odtworzyć; błąd 404: Nie znaleziono pliku.",
|
||||
"mm_e403": "Nie można odtworzyć; błąd 403: Odmowa dostępu.\n\nSpróbuj przeładować stronę (F5), może cię wylogowało",
|
||||
"mm_e415": "Nie można odtworzyć; błąd 415: Konwersja pliku nie powiodła się; sprawdź logi serwera.", //m
|
||||
"mm_e500": "Nie można odtworzyć; błąd 500: Sprawdź logi serwera.",
|
||||
"mm_e5xx": "Nie można odtworzyć; błąd serwera",
|
||||
"mm_nof": "nie znaleziono więcej plików audio",
|
||||
|
|
@ -650,6 +651,7 @@ Ls.pol = {
|
|||
"rc_md": "otwórz w edytorze tekstu", //m
|
||||
"rc_dl": "pobierz", //m
|
||||
"rc_zip": "pobierz jako archiwum", //m
|
||||
"rc_cpl": "kopiuj link", //m
|
||||
"rc_del": "usuń", //m
|
||||
"rc_cut": "wytnij", //m
|
||||
"rc_cpy": "kopiuj", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.por = {
|
|||
"mm_eunk": "Erro Desconhecido",
|
||||
"mm_e404": "Não foi possível reproduzir áudio; erro 404: Arquivo não encontrado.",
|
||||
"mm_e403": "Não foi possível reproduzir áudio; erro 403: Acesso negado.\n\nTente pressionar F5 para recarregar, talvez você tenha saído da conta",
|
||||
"mm_e415": "Não foi possível reproduzir áudio; erro 415: Falha na conversão do ficheiro; verifique os logs do servidor.", //m
|
||||
"mm_e500": "Não foi possível reproduzir áudio; erro 500: Verifique os logs do servidor.",
|
||||
"mm_e5xx": "Não foi possível reproduzir áudio; erro do servidor ",
|
||||
"mm_nof": "não encontrando mais arquivos de áudio por perto",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.por = {
|
|||
"rc_md": "abrir no editor de texto", //m
|
||||
"rc_dl": "baixar", //m
|
||||
"rc_zip": "baixar como arquivo", //m
|
||||
"rc_cpl": "copiar link", //m
|
||||
"rc_del": "excluir", //m
|
||||
"rc_cut": "recortar", //m
|
||||
"rc_cpy": "copiar", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.rus = {
|
|||
"mm_eunk": "Неопознанная ошибка",
|
||||
"mm_e404": "Не удалось воспроизвести аудио; ошибка 404: Файл не найден.",
|
||||
"mm_e403": "Не удалось воспроизвести аудио; ошибка 403: Доступ запрещён.\n\nПопробуйте перезагрузить страницу, возможно, ваша сессия истекла",
|
||||
"mm_e415": "Не удалось воспроизвести аудио; ошибка 415: Сбой преобразования файла; проверьте логи сервера.", //m
|
||||
"mm_e500": "Не удалось воспроизвести аудио; ошибка 500: Проверьте логи сервера.",
|
||||
"mm_e5xx": "Не удалось воспроизвести аудио; ошибка сервера ",
|
||||
"mm_nof": "больше аудио-файлов не найдено",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.rus = {
|
|||
"rc_md": "открыть в текстовом редакторе", //m
|
||||
"rc_dl": "скачать", //m
|
||||
"rc_zip": "скачать как архив", //m
|
||||
"rc_cpl": "копировать ссылку", //m
|
||||
"rc_del": "удалить", //m
|
||||
"rc_cut": "вырезать", //m
|
||||
"rc_cpy": "копировать", //m
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@ Ls.spa = {
|
|||
"mm_eunk": "Error desconocido",
|
||||
"mm_e404": "No se pudo reproducir el audio; error 404: Archivo no encontrado.",
|
||||
"mm_e403": "No se pudo reproducir el audio; error 403: Acceso denegado.\n\nIntenta pulsar F5 para recargar, quizás se cerró tu sesión",
|
||||
"mm_e415": "No se pudo reproducir el audio; error 415: Falló la conversión del archivo; revisa los registros del servidor.", //m
|
||||
"mm_e500": "No se pudo reproducir el audio; error 500: Revisa los registros del servidor.",
|
||||
"mm_e5xx": "No se pudo reproducir el audio; error del servidor ",
|
||||
"mm_nof": "no se encuentran más archivos de audio cerca",
|
||||
|
|
@ -646,6 +647,7 @@ Ls.spa = {
|
|||
"rc_md": "abrir en el editor de texto", //m
|
||||
"rc_dl": "descargar", //m
|
||||
"rc_zip": "descargar como archivo", //m
|
||||
"rc_cpl": "copiar enlace", //m
|
||||
"rc_del": "eliminar", //m
|
||||
"rc_cut": "cortar", //m
|
||||
"rc_cpy": "copiar", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.swe = {
|
|||
"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_e415": "Kunde inte spela upp ljudfil; fel 415: Filkonvertering misslyckades; kolla serverloggen.", //m
|
||||
"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",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.swe = {
|
|||
"rc_md": "öppna i textredigerare", //m
|
||||
"rc_dl": "Ladda ner", //m
|
||||
"rc_zip": "Ladda ner som arkiv", //m
|
||||
"rc_cpl": "kopiera länk", //m
|
||||
"rc_del": "radera", //m
|
||||
"rc_cut": "klipp ut", //m
|
||||
"rc_cpy": "kopiera", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.tur = {
|
|||
"mm_eunk": "Bilinmeyen Hata",
|
||||
"mm_e404": "Ses oynatılamadı; hata 404: Dosya bulunamadı.",
|
||||
"mm_e403": "Ses oynatılamadı; hata 403: Erişim reddedildi.\n\nYeniden yüklemek için F5 tuşuna basın, oturumunuz kapanmış olabilir.",
|
||||
"mm_e415": "Ses oynatılamadı; hata 415: Dosya dönüştürme başarısız oldu; sunucu günlüklerini kontrol edin.", //m
|
||||
"mm_e500": "Ses oynatılamadı; hata 500: Sunucu günlüklerini kontrol edin.",
|
||||
"mm_e5xx": "Ses oynatılamadı; sunucu hatası ",
|
||||
"mm_nof": "yakınlarda başka ses dosyası bulunamadı",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.tur = {
|
|||
"rc_md": "metin düzenleyicide aç", //m
|
||||
"rc_dl": "i̇ndir", //m
|
||||
"rc_zip": "arşiv olarak indir", //m
|
||||
"rc_cpl": "bağlantıyı kopyala", //m
|
||||
"rc_del": "sil", //m
|
||||
"rc_cut": "kes", //m
|
||||
"rc_cpy": "kopyala", //m
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ Ls.ukr = {
|
|||
"mm_eunk": "Невідома помилка",
|
||||
"mm_e404": "Не вдалося відтворити аудіо; помилка 404: Файл не знайдено.",
|
||||
"mm_e403": "Не вдалося відтворити аудіо; помилка 403: Доступ заборонено.\n\nСпробуйте натиснути F5 для перезавантаження, можливо, ви вийшли з системи",
|
||||
"mm_e415": "Не вдалося відтворити аудіо; помилка 415: Не вдалося перетворити файл; перевірте логи сервера.", //m
|
||||
"mm_e500": "Не вдалося відтворити аудіо; помилка 500: Перевірте логи сервера.",
|
||||
"mm_e5xx": "Не вдалося відтворити аудіо; помилка сервера ",
|
||||
"mm_nof": "не знаходжу більше аудіо файлів поблизу",
|
||||
|
|
@ -647,6 +648,7 @@ Ls.ukr = {
|
|||
"rc_md": "відкрити в текстовому редакторі", //m
|
||||
"rc_dl": "завантажити", //m
|
||||
"rc_zip": "завантажити як архів", //m
|
||||
"rc_cpl": "копіювати посилання", //m
|
||||
"rc_del": "видалити", //m
|
||||
"rc_cut": "вирізати", //m
|
||||
"rc_cpy": "копіювати", //m
|
||||
|
|
|
|||
|
|
@ -112,7 +112,6 @@ Ls.vie = {
|
|||
|
||||
"ot_search": "tìm kiếm các tệp theo thuộc tính, đường dẫn / tên, tag nhạc hoặc bất kỳ sự kết hợp nào của chúng$N$N<code>foo bar</code> = phải chứa cả «foo» và «bar»,$N<code>foo -bar</code> = phải chứa «foo» nhưng không chứa «bar»,$N<code>^yana .opus$</code> = bắt đầu bằng «yana» và là tệp «opus»$N<code>"try unite"</code> = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N<code>2009-12-31</code> hoặc <code>2020-09-12 23:30:00</code>",
|
||||
|
||||
|
||||
"ot_unpost": "unpost: xoá các tệp đã tải lên gần đây hoặc huỷ những tệp đang tải dở",
|
||||
"ot_bup": "bup: trình tải lên cơ bản, hỗ trợ cả Netscape 4.0",
|
||||
"ot_mkdir": "mkdir: tạo thư mục mới",
|
||||
|
|
@ -198,13 +197,10 @@ Ls.vie = {
|
|||
"ul_flagblk": "tệp đã được thêm vào hàng chờ</b><br>tuy vậy đang có một tiến trình up2k đang chạy ở một tab khác<br>vui lòng đợi cho đến khi tiến trình đó hoàn tất hoặc bị hủy",
|
||||
"ul_btnlk": "cài đặt của máy chủ đã khóa tùy chọn ở trạng thái này",
|
||||
|
||||
|
||||
"udt_up": "Tải lên",
|
||||
"udt_srch": "Tìm kiếm",
|
||||
"udt_drop": "thả vào đây",
|
||||
|
||||
|
||||
|
||||
"u_nav_m": '<h6>chọn phương thức tải lên</h6><code>Enter</code> = Tệp (một hoặc nhiều)\n<code>ESC</code> = Một thư mục (kèm thư mục con)',
|
||||
"u_nav_b": '<a href="#" id="modal-ok">Tệp</a><a href="#" id="modal-ng">Một thư mục</a>',
|
||||
|
||||
|
|
@ -347,6 +343,7 @@ Ls.vie = {
|
|||
"mm_eunk": "Lỗi không xác định",
|
||||
"mm_e404": "Không thể phát âm thanh; lỗi 404: Không tìm thấy tệp.",
|
||||
"mm_e403": "Không thể phát âm thanh; lỗi 403: Từ chối truy cập.\n\nThử nhấn F5 để tải lại, có thể bạn đã đăng xuất",
|
||||
"mm_e415": "Không thể phát âm thanh; lỗi 415: Chuyển đổi tệp thất bại; kiểm tra nhật ký máy chủ.", //m
|
||||
"mm_e500": "Không thể phát âm thanh; lỗi 500: Kiểm tra nhật ký máy chủ.",
|
||||
"mm_e5xx": "Không thể phát âm thanh; lỗi máy chủ ",
|
||||
"mm_nof": "không tìm thấy thêm tệp âm thanh nào gần đó",
|
||||
|
|
@ -354,6 +351,7 @@ Ls.vie = {
|
|||
"mm_scank": "Đã tìm thấy bài nhạc tiếp theo:",
|
||||
"mm_uncache": "đã xoá bộ nhớ đệm; tất cả bài nhạc sẽ được tải lại khi phát tiếp",
|
||||
"mm_hnf": "bài nhạc này không còn tồn tại nữa",
|
||||
|
||||
"im_hnf": "hình ảnh này không còn tồn tại nữa",
|
||||
|
||||
"f_empty": 'thư mục này trống',
|
||||
|
|
@ -378,7 +376,6 @@ Ls.vie = {
|
|||
"fc_emore": "hãy chọn ít nhất một mục để cắt",
|
||||
"fcp_emore": "hãy chọn ít nhất một mục để sao chép vào bảng nhớ tạm",
|
||||
|
||||
|
||||
"fs_sc": "chia sẻ thư mục hiện tại",
|
||||
"fs_ss": "chia sẻ các tệp đã chọn",
|
||||
"fs_just1d": "bạn không thể chọn nhiều hơn một thư mục,\nhoặc trộn tệp và thư mục trong cùng một lựa chọn",
|
||||
|
|
@ -420,7 +417,6 @@ Ls.vie = {
|
|||
"fr_efail": "đổi tên thất bại:\n",
|
||||
"fr_nchg": "{0} tên mới đã bị chỉnh sửa do <code>win</code> và/hoặc <code>no /</code>\n\nTiếp tục với các tên đã chỉnh sửa?",
|
||||
|
||||
|
||||
"fd_ok": "hoàn tất xoá",
|
||||
"fd_err": "xoá gặp lỗi:\n",
|
||||
"fd_none": "không xóa được mục nào; có thể bị chặn bởi cấu hình máy chủ (xbd)?",
|
||||
|
|
@ -460,7 +456,6 @@ Ls.vie = {
|
|||
"nmd_i1": "hãy thêm cả phần mở rộng tệp bạn muốn, ví dụ <code>.md</code>",
|
||||
"nmd_i2": "bạn chỉ có thể tạo tệp <code>.md</code> vì bạn không có quyền xóa",
|
||||
|
||||
|
||||
"tv_load": "Đang tải tài liệu văn bản:\n\n{0}\n\n{1}% ({2} / {3} MiB)",
|
||||
"tv_xe1": "không thể tải tệp văn bản:\n\nlỗi ",
|
||||
"tv_xe2": "404, không tìm thấy tệp",
|
||||
|
|
@ -478,9 +473,6 @@ Ls.vie = {
|
|||
"tvt_ctail": "giải mã màu terminal (ansi escape codes)\">🌈",
|
||||
"tvt_ntail": "giới hạn scrollback (số byte văn bản được giữ trong bộ nhớ)",
|
||||
|
||||
|
||||
|
||||
|
||||
"m3u_add1": "đã thêm 1 bài vào danh sách phát m3u",
|
||||
"m3u_addn": "đã thêm {0} bài vào danh sách phát m3u",
|
||||
"m3u_clip": "danh sách phát m3u đã được chép vào bảng nhớ tạm\n\nbạn nên tạo một tệp văn bản mới tên bất kỳ.m3u rồi dán nội dung danh sách phát vào đó để có thể phát được",
|
||||
|
|
@ -524,7 +516,6 @@ Ls.vie = {
|
|||
"s_t1": "tag chứa (^=bắt đầu, kết thúc=$)",
|
||||
"s_a1": "thuộc tính metadata cụ thể",
|
||||
|
||||
|
||||
"md_eshow": "không thể tải",
|
||||
"md_off": "[📜<em>readme</em>] đã tắt trong [⚙️] -- tài liệu bị ẩn",
|
||||
|
||||
|
|
@ -576,7 +567,6 @@ Ls.vie = {
|
|||
"un_busy": "đang xóa {0} tệp...",
|
||||
"un_clip": "{0} liên kết đã chép vào bảng nhớ tạm",
|
||||
|
||||
|
||||
"u_https1": "bạn nên",
|
||||
"u_https2": "chuyển sang https",
|
||||
"u_https3": "để có hiệu suất tốt hơn",
|
||||
|
|
@ -691,6 +681,7 @@ Ls.vie = {
|
|||
"rc_md": "mở trong trình soạn thảo văn bản", //m
|
||||
"rc_dl": "tải xuống", //m
|
||||
"rc_zip": "tải xuống dưới dạng gói nén", //m
|
||||
"rc_cpl": "sao chép liên kết", //m
|
||||
"rc_del": "xóa", //m
|
||||
"rc_cut": "cắt", //m
|
||||
"rc_cpy": "sao chép", //m
|
||||
|
|
|
|||
|
|
@ -1,3 +1,57 @@
|
|||
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
|
||||
# 2026-0102-0007 `v1.20.0` sftp is fine too
|
||||
|
||||
## 🧪 new features
|
||||
|
||||
* sftp server 4714c2fa ec7ea309
|
||||
* included in [docker-images](https://hub.docker.com/u/copyparty) `im`, `iv`, `ac`, `dj`
|
||||
* not using docker? install the optional dependency [paramiko](https://pypi.org/project/paramiko/)
|
||||
* #1135 right-click menu (thx @stackxp and @Scotsguy!) 82c49609 05a44720
|
||||
* PUT can now append to existing files 63d8e5a0
|
||||
* new option [apnd-who](https://copyparty.eu/cli/#g-apnd-who) to configure who is allowed to do that
|
||||
* #1128 added option to skip uploading a file if the filename is already taken on the server (thx @Scotsguy!) fa32e159
|
||||
* #1127 descript.ion now also works for folders 2c26aecd
|
||||
* in file listings, `up_by` and `up_ip` (uploader info) can now be displayed for non-admin users by adding them to the [mte](https://copyparty.eu/cli/#g-mte) option 7bfd370b
|
||||
* #1120 display the disk-space quota instead of the underlying HDD size (thx @rabid-dev!) 511dc016 e0845b23
|
||||
* option to skip dotfiles/dotfolders when using download-as-zip 7d7a1510
|
||||
* #1124 button to skip files with a filename collision when copying/moving files 85639ad2
|
||||
* #1151 u2c ([commandline uploader](https://github.com/9001/copyparty/tree/hovudstraum/bin#u2cpy)): option to use basic-auth instead of the `PW` header (thx @Le0Developer!) 120fdfb2
|
||||
* the name of the `pw` url-param and http-header can be changed f81d80bc
|
||||
* mainly to force basic-auth, but perhaps also for other purposes
|
||||
* changing these will break support for many clients, so you probably want to keep the default
|
||||
|
||||
## 🩹 bugfixes
|
||||
|
||||
* image-viewer:
|
||||
* images now scale properly when rotated while the zoom feature is enabled c0e167fd
|
||||
* the current image rotation will now be applied to the next image as well 485c60cf c82a3cb2
|
||||
* groups announced by an IdP will now also apply for native (copyparty-config) users f08cb25c
|
||||
* windows: download-as-zip would flatten everything to a single folder 2d1d295a
|
||||
* #1157 [dirkeys](https://github.com/9001/copyparty/#dirkeys) did not work in grid-view d1ddcb19
|
||||
* #1123 the [ui-notree](https://copyparty.eu/cli/#g-ui-notree) option to simplify the UI would simplify a bit too much 4c73704c
|
||||
* don't add the trailing slash to a volume in the controlpanel when the volume is a file 80a37492
|
||||
* the link couldn't be clicked on Windows CE 4.20 using Internet Explorer 4.01
|
||||
|
||||
## 🔧 other changes
|
||||
|
||||
* #1158 updated german translation (thx @Scotsguy!) 3bf80c81
|
||||
* the `dotfiles` button now also toggles showing [unlisted](https://copyparty.eu/cli/#g-unlist) files e55e5a45
|
||||
* `/?h&ls` (the api to list volumes) now includes the user's permissions for each volume 1f6e8116
|
||||
* #1142 new option [dav-port](https://copyparty.eu/cli/#g-dav-port) to open a dedicated port for webdav clients 4642d323
|
||||
* workaround for certain clients which pretend to be webbrowsers
|
||||
* #1147 workaround for a buggy browser-extension 8551472b
|
||||
* detect (and panic) when a webbrowser has failed to load one of the javascript files af3f777e
|
||||
* replaces the confusing errormessage resulting from half of the code missing
|
||||
|
||||
## 🌠 fun facts
|
||||
|
||||
* it [turns out](https://github.com/9001/copyparty/#server-hall-of-fame) that copyparty runs just fine on [SGI IRIX](https://en.wikipedia.org/wiki/IRIX)! 39c3ccc2
|
||||
* there's a [photo of the server](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/sgi-o2.jpg?cache) and a [screenshot](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/sgi-o2.png?cache) as proof 😁
|
||||
* the [feature comparison](https://github.com/9001/copyparty/blob/hovudstraum/docs/versus.md#general) has been updated accordingly
|
||||
* this release was mostly coded at 39c3 (see photo above) and the release was [made at revspace](https://a.ocv.me/pub/g/2026/01/PXL_20260102_235328552.jpg)
|
||||
|
||||
|
||||
|
||||
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
|
||||
# 2025-1217-0014 `v1.19.23` bad apple x2
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
# p: 3939 # listen on another port
|
||||
# ipa: 10.89. # only allow connections from 10.89.*
|
||||
# ipa: 172.16.4.0/23 # ...or only 172.16.4.* and 172.16.5.*
|
||||
# ipa: lan # ...or allow LAN only; reject internet IPs
|
||||
# df: 16 # stop accepting uploads if less than 16 GB free disk space
|
||||
# ver # show copyparty version in the controlpanel
|
||||
# grid # show thumbnails/grid-view by default
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ f4b4e330995ebe96c0bd06e16e5b26062ece9473f06d369775aa68eab261dedcf32dfdd159acaa22
|
|||
00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
|
||||
8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl
|
||||
a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae packaging-25.0-py3-none-any.whl
|
||||
fa5d24c51e39760fc5121e56e9948384e03f62b66907ba313a6a803dd601832df62fb5066f3019620664d7cc6b0482e13000cd2d3d1553b709a56a347919565e pillow-12.0.0-cp313-cp313-win_amd64.whl
|
||||
c26171ef5f108553209f937e6839311dc6b232033564aa3aca1c623fea7342069d3e859189de9c5ed41ac62d618725cad4ce61094a69aa1311beaef375d43022 pillow-12.1.0-cp313-cp313-win_amd64.whl
|
||||
b9b98714dfca6fa80b0b3f222965724d63be9c54d19435d1fe768e07016913d6db8d6e043fcb185b55a9bd6fe370a80cf961814fc096046a5f4640d99ed575ef pyinstaller-6.15.0-py3-none-win_amd64.whl
|
||||
cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
|
||||
1735728ae50e003badc5266638e41a73358f2151405e7888b6dc45697c074a60e6e58c8507b49a3f42d8f4fe4005fbc225cd766ab6582cbf85aa79bab699c08f python-3.13.11-amd64.exe
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ fns=(
|
|||
MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
|
||||
mutagen-1.47.0-py3-none-any.whl
|
||||
packaging-25.0-py3-none-any.whl
|
||||
pillow-12.0.0-cp313-cp313-win_amd64.whl
|
||||
pillow-12.1.0-cp313-cp313-win_amd64.whl
|
||||
pyinstaller-6.15.0-py3-none-win_amd64.whl
|
||||
pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
|
||||
python-3.13.11-amd64.exe
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ copyparty/web/tl/fin.js,
|
|||
copyparty/web/tl/fra.js,
|
||||
copyparty/web/tl/grc.js,
|
||||
copyparty/web/tl/ita.js,
|
||||
copyparty/web/tl/jpn.js,
|
||||
copyparty/web/tl/kor.js,
|
||||
copyparty/web/tl/nld.js,
|
||||
copyparty/web/tl/nno.js,
|
||||
|
|
|
|||
|
|
@ -363,6 +363,7 @@ Ls.hmn = {
|
|||
"mm_eunk": "Unknown Errol",
|
||||
"mm_e404": "Could not play audio; error 404: File not found.",
|
||||
"mm_e403": "Could not play audio; error 403: Access denied.\n\nTry pressing F5 to reload, maybe you got logged out",
|
||||
"mm_e415": "Could not play audio; error 415: File transcoding failed; check server logs.",
|
||||
"mm_e500": "Could not play audio; error 500: Check server logs.",
|
||||
"mm_e5xx": "Could not play audio; server error ",
|
||||
"mm_nof": "not finding any more audio files nearby",
|
||||
|
|
@ -669,21 +670,22 @@ Ls.hmn = {
|
|||
"ur_um": "Finished;\n{0} uploads OK,\n{1} uploads failed, sorry",
|
||||
"ur_sm": "Finished;\n{0} files found on server,\n{1} files NOT found on server",
|
||||
|
||||
"rc_opn": "Open",
|
||||
"rc_ply": "Play",
|
||||
"rc_pla": "Play as audio",
|
||||
"rc_txt": "Open in file viewer",
|
||||
"rc_md": "Open in markdown editor",
|
||||
"rc_dl": "Download",
|
||||
"rc_zip": "Download as archive",
|
||||
"rc_del": "Delete",
|
||||
"rc_cut": "Cut",
|
||||
"rc_cpy": "Copy",
|
||||
"rc_pst": "Paste",
|
||||
"rc_nfo": "New folder",
|
||||
"rc_nfi": "New file",
|
||||
"rc_sal": "Select all",
|
||||
"rc_sin": "Invert selection",
|
||||
"rc_opn": "open",
|
||||
"rc_ply": "play",
|
||||
"rc_pla": "play as audio",
|
||||
"rc_txt": "open in textfile viewer",
|
||||
"rc_md": "open in text editor",
|
||||
"rc_dl": "download",
|
||||
"rc_zip": "download as archive",
|
||||
"rc_cpl": "copy link",
|
||||
"rc_del": "delete",
|
||||
"rc_cut": "cut",
|
||||
"rc_cpy": "copy",
|
||||
"rc_pst": "paste",
|
||||
"rc_nfo": "new folder",
|
||||
"rc_nfi": "new file",
|
||||
"rc_sal": "select all",
|
||||
"rc_sin": "invert selection",
|
||||
|
||||
"lang_set": "refresh to make the change take effect?",
|
||||
|
||||
|
|
@ -703,6 +705,11 @@ Ls.hmn = {
|
|||
"j1": "enabling k304 will disconnect your client on every HTTP 304, which can prevent some buggy proxies from getting stuck (suddenly not loading pages), <em>but</em> it will also make things slower in general",
|
||||
"k1": "reset client settings",
|
||||
"l1": "login for more:",
|
||||
"ls3": "login",
|
||||
"lu4": "username",
|
||||
"lp4": "password",
|
||||
"lo3": "logout “{0}” everywhere",
|
||||
"lo2": "ends the session on all browsers",
|
||||
"m1": "welcome back,", // TLNote: "welcome back, USERNAME"
|
||||
"n1": "404 not found ┐( ´ -`)┌",
|
||||
"o1": 'or maybe you don\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>',
|
||||
|
|
|
|||
|
|
@ -87,6 +87,11 @@ Ls.{lang3} = {{
|
|||
"j1": "enabling k304 will disconnect your client on every HTTP 304, which can prevent some buggy proxies from getting stuck (suddenly not loading pages), <em>but</em> it will also make things slower in general",
|
||||
"k1": "reset client settings",
|
||||
"l1": "login for more:",
|
||||
"ls3": "login",
|
||||
"lu4": "username",
|
||||
"lp4": "password",
|
||||
"lo3": "logout “{{0}}” everywhere",
|
||||
"lo2": "ends the session on all browsers",
|
||||
"m1": "welcome back,", // TLNote: "welcome back, USERNAME"
|
||||
"n1": "404 not found ┐( ´ -`)┌",
|
||||
"o1": 'or maybe you don\\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>',
|
||||
|
|
|
|||
Loading…
Reference in a new issue