Compare commits

...

30 commits

Author SHA1 Message Date
ed bc24604a83 dl-button: skip folders (would give html) 2026-01-12 18:46:47 +00:00
ed 266489113a fix unlistc* for filevols 2026-01-12 18:06:05 +00:00
Toast d5a8a34bca
NixOS: misc module documentation improvements (#1194)
* nixos: use mkPackageOption instead of mkOption for the package option

This gets rid of a warning when trying to build a system with
documentation.nixos.includeAllModules enabled

* nixos: don't include package path in option descriptions

See https://github.com/9001/copyparty/pull/1193, this actually fixes the issue

* nixos: fix formatting of services.copyparty.volumes.<name>.access

List will now show up properly on the nixos manual!

* nixos: add or improve inline code blocks in option descriptions
2026-01-12 16:43:18 +01:00
Toast 9d223d6ca7
nixos: use mkPackageOption instead of mkOption (#1193)
This gets rid of a warning when trying to build a system with
documentation.nixos.includeAllModules enabled
2026-01-11 23:08:57 +00:00
ed caf831fc28 fix ipu nullmapping; closes #1191
regression added in v1.19.21 / 79e1078671
2026-01-11 17:10:16 +00:00
ed ae56f3bdae readme: rephrase -j0 advice 2026-01-11 16:52:19 +01:00
stackxp 25a8b96fd1
rcm: add rename, some fixes (#1184)
Signed-off-by: stackxp <170874486+stackxp@users.noreply.github.com>
2026-01-11 16:45:39 +01:00
ed 7357d46f43 http415 on failed transcode; closes #1179 2026-01-10 22:38:23 +00:00
ed 3aebfabd5c mtag: truncate stderr 2026-01-10 22:16:50 +00:00
ed 8914f0af70 docs: suggest modern ipa syntax (#1181) 2026-01-09 20:45:00 +00:00
ed a9ae6d5131 update pkgs to 1.20.1 2026-01-09 00:57:31 +00:00
ed ecd4fcc1b3 v1.20.1 2026-01-09 00:52:35 +00:00
ed 738a419b2b append: only allow with reflink or !dedup;
un-dedup of target file is likely too expensive, and
relying on up2k.db to do it conditionally too dangerous
2026-01-09 00:29:44 +00:00
ed 3a16d3461d rcm: fix copy-link filekeys 2026-01-08 23:29:58 +00:00
ed 3a52096205 octalize 2026-01-08 23:27:59 +00:00
ed 87a5c22a34 per-protocol ip binds; closes #1176 2026-01-07 23:27:03 +00:00
ed 7d6e59f347 enable japanese translation 2026-01-07 22:35:12 +00:00
tkymmm b918b592ca
Add Japanese translation (#1174)
Signed-off-by: tkymmm <136296842+tkymmm@users.noreply.github.com>
2026-01-07 22:32:02 +00:00
ed cbeb439ad2 mtl new strings 2026-01-07 22:25:45 +00:00
ed 74a6ce1c1e i18n: update translation template 2026-01-07 22:17:00 +00:00
ed 2f4a30b620 sftp: fix default chmod (#1170) 2026-01-07 21:40:07 +00:00
ed 6c41bac6d2 sftp: fix nested write-only folders (could not browse) 2026-01-07 21:34:50 +00:00
ed 8c9e1016de sftp: allow ENOENT from rm (closes #1170);
some sftp clients will try to rm a file before creating it,
expecting ENOENT even in write-only folders
2026-01-07 20:58:23 +00:00
ed 9030828494 sftp: loosen stat restrictions (#1170);
some sftp clients always expect correct stat results, even in
write-only folders, so this slight info-leak must be allowed
2026-01-07 20:56:51 +00:00
ed 13055c6451 sftp: improve logging 2026-01-07 20:36:34 +00:00
ed 038af50777 shares: fix vmaxb 2026-01-05 18:32:39 +00:00
Raphaël Deschênes 7ffb1fd0ca
contrib/nginx: fix rp-loc example (#1167)
Signed-off-by: Raphaël Deschênes <raphdf201@hotmail.com>
2026-01-04 18:56:52 +00:00
ed 364f74a1bd iOS/ashell: fix howto + add beta 2026-01-04 12:39:39 +00:00
seaslug feabbf3e6a
rcm: gridview support (#1164) 2026-01-04 12:18:57 +00:00
ed 5b2c84752d update pkgs to 1.20.0 2026-01-02 23:09:37 +00:00
47 changed files with 1091 additions and 128 deletions

View file

@ -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 * 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 * `: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,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) * `: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) * `--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` * 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) * 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) * lots of connections (many users or heavy clients)
* simultaneous downloads and uploads saturating a 20gbps connection * simultaneous downloads and uploads saturating a 20gbps connection
* if `-e2d` is enabled, `-j2` gives 4x performance for directory listings; `-j4` gives 16x * 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 * 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) * 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 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: what this does:
* creates a basic [config file](#accounts-and-volumes) named `cpc` which you can edit with `vim cpc` * 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 * adds the command `cpp` to launch copyparty with that config file

View file

@ -6,7 +6,7 @@
# #
# to reverse-proxy a specific path/subpath/location below a domain # to reverse-proxy a specific path/subpath/location below a domain
# (rather than a complete subdomain), for example "/qw/er", you must # (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 / { # location / {
# proxy_pass http://cpp_tcp; # proxy_pass http://cpp_tcp;
# to this: # to this:

View file

@ -69,11 +69,8 @@ in
options.services.copyparty = { options.services.copyparty = {
enable = mkEnableOption "web-based file manager"; enable = mkEnableOption "web-based file manager";
package = mkOption { package = mkPackageOption pkgs "copyparty" {
type = types.package; extraDescription = ''
default = pkgs.copyparty;
defaultText = "pkgs.copyparty";
description = ''
Package of the application to run, exposed for overriding purposes. Package of the application to run, exposed for overriding purposes.
''; '';
}; };
@ -82,7 +79,7 @@ in
type = types.bool; type = types.bool;
default = true; default = true;
description = '' description = ''
Make a shell script wrapper called 'copyparty-hash' with all options set here, Make a shell script wrapper called {command}`copyparty-hash` with all options set here,
that launches the hashing cli. that launches the hashing cli.
''; '';
}; };
@ -117,9 +114,9 @@ in
type = types.attrs; type = types.attrs;
description = '' description = ''
Global settings to apply. Global settings to apply.
Directly maps to values in the [global] section of the copyparty config. Directly maps to values in the `[global]` section of the copyparty config.
Cannot set "c" or "hist", those are set by this module. Cannot set "c" or "hist", those are set by this module.
See `${getExe cfg.package} --help` for more details. See {command}`copyparty --help` for more details.
''; '';
default = { default = {
i = "127.0.0.1"; i = "127.0.0.1";
@ -138,7 +135,7 @@ in
globalExtraConfig = mkOption { globalExtraConfig = mkOption {
type = types.str; type = types.str;
default = ""; default = "";
description = "Appended to the end of the [global] section verbatim. This is useful for flags which are used in a repeating manner (e.g. ipu: 255.255.255.1=user) which can't be repeated in the settings = {} attribute set."; description = "Appended to the end of the `[global]` section verbatim. This is useful for flags which are used in a repeating manner (e.g. `ipu: 255.255.255.1=user`) which can't be repeated in the settings = {} attribute set.";
}; };
accounts = mkOption { accounts = mkOption {
@ -201,21 +198,21 @@ in
Attribute list of permissions and the users to apply them to. Attribute list of permissions and the users to apply them to.
The key must be a string containing any combination of allowed permission: The key must be a string containing any combination of allowed permission:
"r" (read): list folder contents, download files * "r" (read): list folder contents, download files
"w" (write): upload files; need "r" to see the uploads * "w" (write): upload files; need "r" to see the uploads
"m" (move): move files and folders; need "w" at destination * "m" (move): move files and folders; need "w" at destination
"d" (delete): permanently delete files and folders * "d" (delete): permanently delete files and folders
"g" (get): download files, but cannot see folder contents * "g" (get): download files, but cannot see folder contents
"G" (upget): "get", but can see filekeys of their own uploads * "G" (upget): "get", but can see filekeys of their own uploads
"h" (html): "get", but folders return their index.html * "h" (html): "get", but folders return their index.html
"a" (admin): can see uploader IPs, config-reload * "a" (admin): can see uploader IPs, config-reload
For example: "rwmd" For example: "rwmd"
The value must be one of: The value must be one of:
an account name, defined in `accounts` * an account name, defined in `accounts`
a list of account names * a list of account names
"*", which means "any account" * "*", which means "any account"
''; '';
example = literalExpression '' example = literalExpression ''
{ {
@ -230,7 +227,7 @@ in
type = types.attrs; type = types.attrs;
description = '' description = ''
Attribute list of volume flags to apply. Attribute list of volume flags to apply.
See `${getExe cfg.package} --help-flags` for more details. See {command}`copyparty --help-flags` for more details.
''; '';
example = literalExpression '' example = literalExpression ''
{ {

View file

@ -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. # NOTE: You generally shouldn't use this PKGBUILD on Arch, as it is mainly for testing purposes. Install copyparty using pacman instead.
pkgname=copyparty pkgname=copyparty
pkgver="1.19.23" pkgver="1.20.1"
pkgrel=1 pkgrel=1
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++" pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
arch=("any") 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") source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
backup=("etc/${pkgname}/copyparty.conf" ) backup=("etc/${pkgname}/copyparty.conf" )
sha256sums=("2d0c5d126ca2f4b78c40ae4d03cac191526d98e5072f4ace121601d2af40e3cf") sha256sums=("4f513ca9e3d1c11a7bb4e1a8a925dda2449b9565e91f6ef7cbe10367fa4e2935")
build() { build() {
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web" cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"

View file

@ -2,7 +2,7 @@
pkgname=copyparty pkgname=copyparty
pkgver=1.19.23 pkgver=1.20.1
pkgrel=1 pkgrel=1
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++" pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
arch=("any") 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") source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
backup=("/etc/${pkgname}.d/init" ) backup=("/etc/${pkgname}.d/init" )
sha256sums=("2d0c5d126ca2f4b78c40ae4d03cac191526d98e5072f4ace121601d2af40e3cf") sha256sums=("4f513ca9e3d1c11a7bb4e1a8a925dda2449b9565e91f6ef7cbe10367fa4e2935")
build() { build() {
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web" cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"

View file

@ -1,5 +1,5 @@
{ {
"url": "https://github.com/9001/copyparty/releases/download/v1.19.23/copyparty-1.19.23.tar.gz", "url": "https://github.com/9001/copyparty/releases/download/v1.20.1/copyparty-1.20.1.tar.gz",
"version": "1.19.23", "version": "1.20.1",
"hash": "sha256-LQxdEmyi9LeMQK5NA8rBkVJtmOUHL0rOEhYB0q9A488=" "hash": "sha256-T1E8qePRwRp7tOGoqSXdokSblWXpH273y+EDZ/pOKTU="
} }

View file

@ -6,7 +6,7 @@
# https://apps.apple.com/us/app/a-shell/id1473805438 # https://apps.apple.com/us/app/a-shell/id1473805438
# #
# step 2: copypaste the following command into a-Shell: # 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 # step 3: launch copyparty with this command: cpp
# #

View file

@ -107,6 +107,7 @@ web/tl/fin.js
web/tl/fra.js web/tl/fra.js
web/tl/grc.js web/tl/grc.js
web/tl/ita.js web/tl/ita.js
web/tl/jpn.js
web/tl/kor.js web/tl/kor.js
web/tl/nld.js web/tl/nld.js
web/tl/nno.js web/tl/nno.js

View file

@ -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("--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("--sftpv", action="store_true", help="verbose")
ap2.add_argument("--sftpvv", action="store_true", help="verboser") 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("--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-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) 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("--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("--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("--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("--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-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") 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): def add_tftp(ap):
ap2 = ap.add_argument_group("TFTP options (UDP only)") 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", 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("--tftp4", action="store_true", help="only listen on IPv4")
ap2.add_argument("--tftpv", action="store_true", help="verbose") ap2.add_argument("--tftpv", action="store_true", help="verbose")
ap2.add_argument("--tftpvv", action="store_true", help="verboser") ap2.add_argument("--tftpvv", action="store_true", help="verboser")
@ -1481,6 +1484,7 @@ def add_tftp(ap):
def add_smb(ap): def add_smb(ap):
ap2 = ap.add_argument_group("SMB/CIFS options") 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", 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("--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("--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") 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("--smbvv", action="store_true", help="verboser")
ap2.add_argument("--smbvvv", action="store_true", help="verbosest") ap2.add_argument("--smbvvv", action="store_true", help="verbosest")
def add_opds(ap): def add_opds(ap):
ap2 = ap.add_argument_group("OPDS options") 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", 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)") 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): def add_handlers(ap):
ap2 = ap.add_argument_group("handlers (see --help-handlers)") 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") 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): if getattr(al, k1):
setattr(al, k2, False) setattr(al, k2, False)
if not HAVE_IPV6 and al.i == "::": protos = "ftp tftp sftp smb".split()
al.i = "0.0.0.0" 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: try:
if "-" in al.p: if "-" in al.p:
lo, hi = [int(x) for x in al.p.split("-")] lo, hi = [int(x) for x in al.p.split("-")]

View file

@ -1,8 +1,8 @@
# coding: utf-8 # coding: utf-8
VERSION = (1, 20, 0) VERSION = (1, 20, 1)
CODENAME = "sftp is fine too" CODENAME = "sftp is fine too"
BUILD_DT = (2026, 1, 2) BUILD_DT = (2026, 1, 9)
S_VERSION = ".".join(map(str, VERSION)) S_VERSION = ".".join(map(str, VERSION))
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT) S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)

View file

@ -1829,7 +1829,7 @@ class AuthSrv(object):
if self.args.ipu and not self.args.have_idp_hdrs: if self.args.ipu and not self.args.have_idp_hdrs:
# syntax (CIDR=UNAME) is verified in load_ipu # syntax (CIDR=UNAME) is verified in load_ipu
zsl = [x.split("=", 1)[1] for x in self.args.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: if zsl:
t = "ERROR: unknown users in ipu: %s" % (zsl,) t = "ERROR: unknown users in ipu: %s" % (zsl,)
self.log(t, 1) self.log(t, 1)
@ -2650,6 +2650,13 @@ class AuthSrv(object):
self.log(t, 1) self.log(t, 1)
raise Exception(t) 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 # verify tags mentioned by -mt[mp] are used by -mte
local_mtp = {} local_mtp = {}
local_only_mtp = {} local_only_mtp = {}
@ -3030,6 +3037,7 @@ class AuthSrv(object):
shn.realpath = s_vfs.canonical(s_rem) shn.realpath = s_vfs.canonical(s_rem)
o_vn, _ = shn._get_share_src("") o_vn, _ = shn._get_share_src("")
shn.lim = o_vn.lim
shn.flags = o_vn.flags.copy() shn.flags = o_vn.flags.copy()
shn.dbpath = o_vn.dbpath shn.dbpath = o_vn.dbpath
shn.histpath = o_vn.histpath shn.histpath = o_vn.histpath

View file

@ -641,7 +641,7 @@ class Ftpd(object):
lgr = logging.getLogger("pyftpdlib") lgr = logging.getLogger("pyftpdlib")
lgr.setLevel(logging.DEBUG if self.args.ftpv else logging.INFO) lgr.setLevel(logging.DEBUG if self.args.ftpv else logging.INFO)
ips = self.args.i ips = self.args.ftp_i
if "::" in ips: if "::" in ips:
ips.append("0.0.0.0") ips.append("0.0.0.0")

View file

@ -160,6 +160,7 @@ H_CONN_KEEPALIVE = "Connection: Keep-Alive"
H_CONN_CLOSE = "Connection: Close" H_CONN_CLOSE = "Connection: Close"
RSS_SORT = {"m": "mt", "u": "at", "n": "fn", "s": "sz"} RSS_SORT = {"m": "mt", "u": "at", "n": "fn", "s": "sz"}
ACODE2_FMT = set(["opus", "owa", "caf", "mp3", "flac", "wav"])
A_FILE = os.stat_result( A_FILE = os.stat_result(
(0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101) (0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101)
@ -2553,6 +2554,8 @@ class HttpCli(object):
or (zs == "dw" and self.can_delete) or (zs == "dw" and self.can_delete)
): ):
pass pass
elif zs == "ndd":
raise Pebkac(400, "append is denied here due to non-reflink dedup")
else: else:
raise Pebkac(400, "you do not have permission to append") raise Pebkac(400, "you do not have permission to append")
zs = os.path.join(params["fdir"], fn) zs = os.path.join(params["fdir"], fn)
@ -5431,8 +5434,8 @@ class HttpCli(object):
if self.args.have_unlistc: if self.args.have_unlistc:
allvols = self.asrv.vfs.all_nodes allvols = self.asrv.vfs.all_nodes
rvol = [x for x in rvol if "unlistcr" not in allvols[x[1:-1]].flags] rvol = [x for x in rvol if "unlistcr" not in allvols[x.strip("/")].flags]
wvol = [x for x in wvol if "unlistcw" not in allvols[x[1:-1]].flags] wvol = [x for x in wvol if "unlistcw" not in allvols[x.strip("/")].flags]
fmt = self.uparam.get("ls", "") fmt = self.uparam.get("ls", "")
if not fmt and self.ua.startswith(("curl/", "fetch")): if not fmt and self.ua.startswith(("curl/", "fetch")):
@ -6684,6 +6687,8 @@ class HttpCli(object):
if th_fmt == "p": if th_fmt == "p":
raise Pebkac(404) raise Pebkac(404)
elif th_fmt in ACODE2_FMT:
raise Pebkac(415)
return self.tx_ico(rem) return self.tx_ico(rem)

View file

@ -286,10 +286,26 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.uname: str = ssh.uname # type: ignore self.uname: str = ssh.uname # type: ignore
self.args = self.hub.args self.args = self.hub.args
self.asrv: "AuthSrv" = self.hub.asrv self.asrv: "AuthSrv" = self.hub.asrv
self.v = self.args.sftpv
self.vv = self.args.sftpvv
if self.uname == LEELOO_DALLAS: if self.uname == LEELOO_DALLAS:
raise Exception("send her back") 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: def log(self, msg: str, c: Union[int, str] = 0) -> None:
self.hub.log("sftp:%s" % (self.ip,), msg, c) self.hub.log("sftp:%s" % (self.ip,), msg, c)
@ -353,29 +369,35 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _list_folder(self, path: str) -> list[SATTR] | int: def _list_folder(self, path: str) -> list[SATTR] | int:
if self.v:
self.log("ls(%s):" % (path,))
path = path.strip("/")
try: try:
ap, vn, rem = self.v2a(path, r=True) ap, vn, rem = self.v2a(path, r=True)
except Pebkac: except Pebkac:
try: try:
self.v2a(path, w=True) self.v2a(path, w=True)
self.log("ls(%s): [] (write-only)" % (path,))
return [] # display write-only folders as empty return [] # display write-only folders as empty
except: except:
pass 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 return SFTP_PERMISSION_DENIED
# list of accessible volumes # list of accessible volumes
ret = [] ret = []
zi = int(time.time()) zi = int(time.time())
vst = os.stat_result((16877, -1, -1, 1, 1000, 1000, 8, zi, zi, zi)) vst = os.stat_result((16877, -1, -1, 1, 1000, 1000, 8, zi, zi, zi))
for vn in self.asrv.vfs.all_vols.values(): prefix = path + "/"
if "/" in vn.vpath or not vn.vpath: for vn in self.asrv.vfs.all_nodes.values():
continue # only include toplevel-mounted vols if path and not vn.vpath.startswith(prefix):
try: continue # vn is parent
self.hub.asrv.vfs.get(vn.vpath, self.uname, True, False) vname = vn.vpath[len(prefix) :]
ret.append(SATTR.from_stat(vst, filename=vn.vpath)) if "/" in vname or not vname:
except: continue # only include vols at current level
pass ret.append(SATTR.from_stat(vst, filename=vn.vpath))
ret.sort(key=lambda x: x.filename) ret.sort(key=lambda x: x.filename)
self.log("ls(%s): vfs-vols; |%d|" % (path, len(ret)))
return ret return ret
_, vfs_ls, vfs_virt = vn.ls( _, vfs_ls, vfs_virt = vn.ls(
@ -394,6 +416,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
if self.uname not in vn.axs.udot: if self.uname not in vn.axs.udot:
ret = [x for x in ret if not x.filename.split("/")[-1].startswith(".")] ret = [x for x in ret if not x.filename.split("/")[-1].startswith(".")]
ret.sort(key=lambda x: x.filename) ret.sort(key=lambda x: x.filename)
self.log("ls(%s): |%d|" % (path, len(ret)))
return ret return ret
def stat(self, path: str) -> SATTR | int: def stat(self, path: str) -> SATTR | int:
@ -411,17 +434,25 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _stat(self, vp: str) -> SATTR | int: def _stat(self, vp: str) -> SATTR | int:
vp = vp.strip("/")
try: 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) st = bos.stat(ap)
self.log("stat(%s): %s" % (vp, st))
except: except:
if vp.strip("/") or self.asrv.vfs.realpath: if vp not in self.vis:
try: self.log("stat(%s): ENOENT" % (vp,))
self.v2a(vp, w=True)[0] return SFTP_NO_SUCH_FILE
except:
return SFTP_PERMISSION_DENIED
zi = int(time.time()) zi = int(time.time())
st = os.stat_result((16877, -1, -1, 1, 1000, 1000, 8, zi, zi, zi)) 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) return SATTR.from_stat(st)
def open(self, path: str, flags: int, attr: SATTR) -> paramiko.SFTPHandle | int: 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) ap = os.path.join(vn.realpath, rem)
vf = vn.flags vf = vn.flags
except Pebkac as ex: except Pebkac as ex:
t = "denied open file [%s], iflag=%s, attr=%s, read=%s, write=%s: %s" t = "denied open file [%s], iflag=%s, read=%s, write=%s: %s"
self.log(t % (vp, iflag, attr, rd, wr, ex)) self.log(t % (vp, iflag, rd, wr, ex))
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
self.log("open(%s, %x, %s)" % (vp, iflag, smode))
if wr: if wr:
try: try:
st = bos.stat(ap) st = bos.stat(ap)
@ -496,6 +529,8 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.log(t, 3) self.log(t, 3)
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
self.log("writing to [%s] => [%s]" % (vp, ap))
if wr and need_unlink: # type: ignore # !rm if wr and need_unlink: # type: ignore # !rm
assert td # type: ignore # !rm assert td # type: ignore # !rm
if td >= -1 and td <= self.args.ftp_wt: if td >= -1 and td <= self.args.ftp_wt:
@ -519,13 +554,16 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
chmod = getattr(attr, "st_mode", None) chmod = getattr(attr, "st_mode", None)
if chmod is 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: try:
fd = os.open(ap, iflag, chmod) fd = os.open(ap, iflag, chmod)
except OSError as ex: except OSError as ex:
t = "failed to os.open [%s] -> [%s] with iflag [%s] and chmod [%s]" t = "failed to os.open [%s] -> [%s] with iflag [%s] and chmod [%s]: %r"
self.log(t % (vp, ap, iflag, chmod), 3) self.log(t % (vp, ap, iflag, chmod, ex), 3)
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
if iflag & os.O_CREAT: if iflag & os.O_CREAT:
@ -534,8 +572,8 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
try: try:
f = os.fdopen(fd, smode) f = os.fdopen(fd, smode)
except OSError as ex: except OSError as ex:
t = "failed to os.fdpen [%s] -> [%s] with smode [%s]" t = "failed to os.fdpen [%s] -> [%s] with smode [%s]: %r"
self.log(t % (vp, ap, smode), 3) self.log(t % (vp, ap, smode, ex), 3)
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
ret = SFTP_FH(iflag) ret = SFTP_FH(iflag)
@ -552,17 +590,37 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _remove(self, vp: str) -> int: def _remove(self, vp: str) -> int:
self.log("rm(%s)" % (vp,))
if self.args.no_del: if self.args.no_del:
self.log("The delete feature is disabled in server config") self.log("The delete feature is disabled in server config")
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
try: try:
self.hub.up2k.handle_rm(self.uname, self.ip, [vp], [], False, False) self.hub.up2k.handle_rm(self.uname, self.ip, [vp], [], False, False)
self.log("rm(%s): ok" % (vp,))
return SFTP_OK return SFTP_OK
except Pebkac as ex: except Pebkac as ex:
t = "denied delete [%s]: %s" t = "denied delete [%s]: %s"
self.log(t % (vp, ex)) 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 return SFTP_PERMISSION_DENIED
except OSError as ex: except OSError as ex:
self.log("failed: rm(%s): %r" % (vp, ex))
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
def rename(self, oldpath: str, newpath: str) -> int: def rename(self, oldpath: str, newpath: str) -> int:
@ -573,6 +631,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _rename(self, svp: str, dvp: str) -> int: def _rename(self, svp: str, dvp: str) -> int:
self.log("mv(%s, %s)" % (svp, dvp))
if self.args.no_mv: if self.args.no_mv:
self.log("The rename/move feature is disabled in server config") self.log("The rename/move feature is disabled in server config")
svp = svp.strip("/") svp = svp.strip("/")
@ -585,6 +644,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.log(t % (svp, dvp, ex)) self.log(t % (svp, dvp, ex))
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
except OSError as ex: except OSError as ex:
self.log("mv(%s, %s): %r" % (svp, dvp, ex))
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
def mkdir(self, path: str, attr: SATTR) -> int: def mkdir(self, path: str, attr: SATTR) -> int:
@ -595,6 +655,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _mkdir(self, vp: str, attr: SATTR) -> int: def _mkdir(self, vp: str, attr: SATTR) -> int:
self.log("mkdir(%s)" % (vp,))
try: try:
vn, rem = self.asrv.vfs.get(vp, self.uname, False, True) vn, rem = self.asrv.vfs.get(vp, self.uname, False, True)
ap = os.path.join(vn.realpath, rem) ap = os.path.join(vn.realpath, rem)
@ -607,6 +668,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.log(t % (vp, ex)) self.log(t % (vp, ex))
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
except OSError as ex: except OSError as ex:
self.log("mkdir(%s): %r" % (vp, ex))
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
def rmdir(self, path: str) -> int: def rmdir(self, path: str) -> int:
@ -617,6 +679,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _rmdir(self, vp: str) -> int: def _rmdir(self, vp: str) -> int:
self.log("rmdir(%s)" % (vp,))
try: try:
vn, rem = self.asrv.vfs.get(vp, self.uname, False, False, will_del=True) vn, rem = self.asrv.vfs.get(vp, self.uname, False, False, will_del=True)
ap = os.path.join(vn.realpath, rem) ap = os.path.join(vn.realpath, rem)
@ -627,6 +690,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.log(t % (vp, ex)) self.log(t % (vp, ex))
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
except OSError as ex: except OSError as ex:
self.log("rmdir(%s): %r" % (vp, ex))
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
def chattr(self, path: str, attr: SATTR) -> int: def chattr(self, path: str, attr: SATTR) -> int:
@ -637,6 +701,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
return SFTP_FAILURE return SFTP_FAILURE
def _chattr(self, vp: str, attr: SATTR) -> int: def _chattr(self, vp: str, attr: SATTR) -> int:
self.log("chattr(%s, %s)" % (vp, attr))
try: try:
vn, rem = self.asrv.vfs.get(vp, self.uname, False, True, will_del=True) vn, rem = self.asrv.vfs.get(vp, self.uname, False, True, will_del=True)
ap = os.path.join(vn.realpath, rem) ap = os.path.join(vn.realpath, rem)
@ -647,6 +712,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface):
self.log(t % (vp, ex)) self.log(t % (vp, ex))
return SFTP_PERMISSION_DENIED return SFTP_PERMISSION_DENIED
except OSError as ex: except OSError as ex:
self.log("chattr(%s): %r" % (vp, ex))
return paramiko.SFTPServer.convert_errno(ex.errno) return paramiko.SFTPServer.convert_errno(ex.errno)
def symlink(self, target_path: str, path: str) -> int: def symlink(self, target_path: str, path: str) -> int:
@ -668,7 +734,7 @@ class Sftpd(object):
self.bound: list[str] = [] self.bound: list[str] = []
self.sessions = {} self.sessions = {}
ips = args.i ips = args.sftp_i
if "::" in ips: if "::" in ips:
ips.append("0.0.0.0") ips.append("0.0.0.0")
@ -714,7 +780,7 @@ class Sftpd(object):
for ip in ips: for ip in ips:
self._bind(ip) 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: def log(self, msg: str, c: Union[int, str] = 0) -> None:
self.hub.log("sftp", msg, c) self.hub.log("sftp", msg, c)

View file

@ -89,7 +89,7 @@ class SMB(object):
smbserver.isInFileJail = self._is_in_file_jail smbserver.isInFileJail = self._is_in_file_jail
self._disarm() 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: if not ip:
self.log("smb", "IPv6 not supported for SMB; listening on 0.0.0.0", 3) self.log("smb", "IPv6 not supported for SMB; listening on 0.0.0.0", 3)
ip = "0.0.0.0" ip = "0.0.0.0"

View file

@ -175,7 +175,7 @@ class Tftpd(object):
p1, p2 = [int(x) for x in self.args.tftp_pr.split("-")] p1, p2 = [int(x) for x in self.args.tftp_pr.split("-")]
ports = list(range(p1, p2 + 1)) ports = list(range(p1, p2 + 1))
ips = self.args.i ips = self.args.tftp_i
if "::" in ips: if "::" in ips:
ips.append("0.0.0.0") ips.append("0.0.0.0")

View file

@ -4182,6 +4182,7 @@ class Up2k(object):
st = bos.lstat(atop) st = bos.lstat(atop)
is_dir = stat.S_ISDIR(st.st_mode) is_dir = stat.S_ISDIR(st.st_mode)
except: except:
# NOTE: "file not found" *sftpd
raise Pebkac(400, "file not found on disk (already deleted?)") raise Pebkac(400, "file not found on disk (already deleted?)")
if "bcasechk" in vn.flags and not vn.casechk(rem, False): if "bcasechk" in vn.flags and not vn.casechk(rem, False):

View file

@ -352,6 +352,7 @@ HTTPCODE = {
411: "Length Required", 411: "Length Required",
412: "Precondition Failed", 412: "Precondition Failed",
413: "Payload Too Large", 413: "Payload Too Large",
415: "Unsupported Media Type",
416: "Requested Range Not Satisfiable", 416: "Requested Range Not Satisfiable",
422: "Unprocessable Entity", 422: "Unprocessable Entity",
423: "Locked", 423: "Locked",
@ -377,6 +378,7 @@ IMPLICATIONS = [
["tftpvv", "tftpv"], ["tftpvv", "tftpv"],
["nodupem", "nodupe"], ["nodupem", "nodupe"],
["no_dupe_m", "no_dupe"], ["no_dupe_m", "no_dupe"],
["sftpvv", "sftpv"],
["smbw", "smb"], ["smbw", "smb"],
["smb1", "smb"], ["smb1", "smb"],
["smbvvv", "smbvv"], ["smbvvv", "smbvv"],
@ -3655,7 +3657,11 @@ def retchk(
t = "error {} from [{}]".format(t, c) t = "error {} from [{}]".format(t, c)
if serr: 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: if logger:
logger(t, color) logger(t, color)

View file

@ -269,6 +269,7 @@ if (1)
"cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do", "cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do",
"cdt_hsort": "how many sorting rules (&lt;code&gt;,sorthref&lt;/code&gt;) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them", "cdt_hsort": "how many sorting rules (&lt;code&gt;,sorthref&lt;/code&gt;) 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_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_entree": "show navpane (directory tree sidebar)$NHotkey: B",
"tt_detree": "show breadcrumbs$NHotkey: B", "tt_detree": "show breadcrumbs$NHotkey: B",
@ -339,6 +340,7 @@ if (1)
"mm_eunk": "Unknown Errol", "mm_eunk": "Unknown Errol",
"mm_e404": "Could not play audio; error 404: File not found.", "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_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_e500": "Could not play audio; error 500: Check server logs.",
"mm_e5xx": "Could not play audio; server error ", "mm_e5xx": "Could not play audio; server error ",
"mm_nof": "not finding any more audio files nearby", "mm_nof": "not finding any more audio files nearby",
@ -358,6 +360,7 @@ if (1)
"f_anota": "only {0} of the {1} items were selected;\nto select the full folder, first scroll to the bottom", "f_anota": "only {0} of the {1} items were selected;\nto select the full folder, first scroll to the bottom",
"f_dls": 'the file links in the current folder have\nbeen changed into download links', "f_dls": 'the file links in the current folder have\nbeen changed into download links',
"f_dl_nd": 'skipping folder (use zip/tar download instead):\n',
"f_partial": "To safely download a file which is currently being uploaded, please click the file which has the same filename, but without the <code>.PARTIAL</code> file extension. Please press CANCEL or Escape to do this.\n\nPressing OK / Enter will ignore this warning and continue downloading the <code>.PARTIAL</code> scratchfile instead, which will almost definitely give you corrupted data.", "f_partial": "To safely download a file which is currently being uploaded, please click the file which has the same filename, but without the <code>.PARTIAL</code> file extension. Please press CANCEL or Escape to do this.\n\nPressing OK / Enter will ignore this warning and continue downloading the <code>.PARTIAL</code> scratchfile instead, which will almost definitely give you corrupted data.",
@ -649,7 +652,7 @@ if (1)
"rc_ply": "play", "rc_ply": "play",
"rc_pla": "play as audio", "rc_pla": "play as audio",
"rc_txt": "open in textfile viewer", "rc_txt": "open in textfile viewer",
"rc_md": "open in text editor", "rc_md": "open in markdown viewer",
"rc_dl": "download", "rc_dl": "download",
"rc_zip": "download as archive", "rc_zip": "download as archive",
"rc_cpl": "copy link", "rc_cpl": "copy link",
@ -657,6 +660,7 @@ if (1)
"rc_cut": "cut", "rc_cut": "cut",
"rc_cpy": "copy", "rc_cpy": "copy",
"rc_pst": "paste", "rc_pst": "paste",
"rc_rnm": "rename",
"rc_nfo": "new folder", "rc_nfo": "new folder",
"rc_nfi": "new file", "rc_nfi": "new file",
"rc_sal": "select all", "rc_sal": "select all",
@ -676,6 +680,7 @@ var LANGN = [
["fra", "français"], ["fra", "français"],
["grc", "Ελληνικά"], ["grc", "Ελληνικά"],
["ita", "Italiano"], ["ita", "Italiano"],
["jpn", "日本語"],
["kor", "한국어"], ["kor", "한국어"],
["nld", "Nederlands"], ["nld", "Nederlands"],
["nno", "Nynorsk"], ["nno", "Nynorsk"],
@ -988,7 +993,7 @@ ebi('op_cfg').innerHTML = (
' </div>\n' + ' </div>\n' +
'</div>\n' + '</div>\n' +
'<div><h3>' + L.cl_keytype + '</h3><div><select id="key_notation"></select></div></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 + ' &nbsp;' + (MOBILE ? '<a href="#" id="hcolsh">' + L.cl_hidec + '</a> / ' : '') + '<a href="#" id="hcolsr">' + L.cl_reset + '</a></h3><div id="hcols"></div></div>' '<div><h3>' + L.cl_hiddenc + ' &nbsp;' + (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 +1037,12 @@ ebi('rcm').innerHTML = (
'<a href="#" id="rzip">' + L.rc_zip + '</a>' '<a href="#" id="rzip">' + L.rc_zip + '</a>'
: '') + : '') +
'<div id="rs2" class="sep"></div>' + '<div id="rs2" class="sep"></div>' +
(has(perms, "move") ? (have_del ? '<a href="#" id="rdel">' + L.rc_del + '</a>' : '') +
'<a href="#" id="rdel">' + L.rc_del + '</a>' + (have_mv ? '<a href="#" id="rcut">' + L.rc_cut + '</a>' : '') +
'<a href="#" id="rcut">' + L.rc_cut + '</a>'
: '') +
'<a href="#" id="rcpy">' + L.rc_cpy + '</a>' + '<a href="#" id="rcpy">' + L.rc_cpy + '</a>' +
(has(perms, "write") ? (has(perms, "write") ?
'<a href="#" id="rpst">' + L.rc_pst + '</a>' + '<a href="#" id="rpst">' + L.rc_pst + '</a>' +
(have_mv ? '<a href="#" id="rrnm">' + L.rc_rnm + '</a>' : '') +
'<div id="rs3" class="sep"></div>' + '<div id="rs3" class="sep"></div>' +
'<a href="#" id="rnfo">' + L.rc_nfo + '</a>' + '<a href="#" id="rnfo">' + L.rc_nfo + '</a>' +
'<a href="#" id="rnfi">' + L.rc_nfi + '</a>' '<a href="#" id="rnfi">' + L.rc_nfi + '</a>'
@ -3280,6 +3284,7 @@ function evau_error(e) {
var em = '' + eplaya.error.message, var em = '' + eplaya.error.message,
mfile = '\n\nFile: «' + uricom_dec(eplaya.src.split('/').pop()) + '»', mfile = '\n\nFile: «' + uricom_dec(eplaya.src.split('/').pop()) + '»',
e500 = L.mm_e500, e500 = L.mm_e500,
e415 = L.mm_e415,
e404 = L.mm_e404, e404 = L.mm_e404,
e403 = L.mm_e403; e403 = L.mm_e403;
@ -3292,6 +3297,9 @@ function evau_error(e) {
if (em.startsWith('404: ')) if (em.startsWith('404: '))
err = e404; err = e404;
if (em.startsWith('415: '))
err = e415;
if (em.startsWith('500: ')) if (em.startsWith('500: '))
err = e500; err = e500;
@ -3308,6 +3316,7 @@ function evau_error(e) {
err = this.status == 403 ? e403 : err = this.status == 403 ? e403 :
this.status == 404 ? e404 : this.status == 404 ? e404 :
this.status == 415 ? e415 :
this.status == 500 ? e500 : this.status == 500 ? e500 :
L.mm_e5xx + this.status; L.mm_e5xx + this.status;
@ -8495,9 +8504,13 @@ var msel = (function () {
for (var a = 0, aa = links.length; a < aa; a++) { for (var a = 0, aa = links.length; a < aa; a++) {
var qhref = links[a].getAttribute('href'), var qhref = links[a].getAttribute('href'),
href = qhref.split('?')[0].replace(/\/$/, ""), href = qhref.split('?')[0],
item = {}; item = {};
if (href.endsWith('/')) {
href = href.slice(0, -1);
item.isd = true;
}
item.id = links[a].getAttribute('id'); item.id = links[a].getAttribute('id');
item.sel = clgot(links[a].closest('tr'), 'sel'); item.sel = clgot(links[a].closest('tr'), 'sel');
item.vp = href.indexOf('/') !== -1 ? href : vbase + href; item.vp = href.indexOf('/') !== -1 ? href : vbase + href;
@ -8660,7 +8673,10 @@ var msel = (function () {
ev(e); ev(e);
var sel = r.getsel(); var sel = r.getsel();
for (var a = 0; a < sel.length; a++) for (var a = 0; a < sel.length; a++)
dl_file(sel[a].vp + sel[a].q); if (sel[a].isd)
toast.warn(7, L.f_dl_nd + esc(sel[a].vp));
else
dl_file(sel[a].vp + sel[a].q);
}; };
r.render = function () { r.render = function () {
var tds = QSA('#files tbody td+td+td'), var tds = QSA('#files tbody td+td+td'),
@ -9473,19 +9489,23 @@ var rcm = (function () {
return {enabled: false} return {enabled: false}
var r = { var r = {
enabled: true enabled: true,
double: false
}; };
bcfg_bind(r, 'enabled', 'ren', true); bcfg_bind(r, 'enabled', 'ren', true);
bcfg_bind(r, 'double', 'rdb', false);
var menu = ebi('rcm'); var menu = ebi('rcm');
var selFile = { var nsFile = {
elem: null, elem: null,
type: null, type: null,
path: null, path: null,
url: null,
id: null, id: null,
relpath: null, relpath: null,
no_dsel: false no_dsel: false
}; };
var selFile = jcp(nsFile);
function mktemp(is_dir) { function mktemp(is_dir) {
var row = mknod('tr', 'temp', var row = mknod('tr', 'temp',
@ -9540,15 +9560,15 @@ var rcm = (function () {
switch(e.target.id.slice(1)) { switch(e.target.id.slice(1)) {
case 'opn': case 'opn':
var a = mknod('a'); var a = mknod('a');
a.href = selFile.path; a.href = selFile.url;
a.target = selFile.type == "dir" ? '' : '_blank'; a.target = selFile.type == "dir" ? '' : '_blank';
a.click(); a.click();
break; break;
case 'ply': selFile.type == 'gf' ? thegrid.imshow(selFile.relpath) : play('f-' + selFile.id); break; case 'ply': selFile.type == 'gf' ? thegrid.imshow(selFile.relpath) : play('f-' + selFile.id); break;
case 'pla': play('f-' + selFile.id); break; case 'pla': play('f-' + selFile.id); break;
case 'txt': location = '?doc=' + selFile.relpath; break; case 'txt': location = '?doc=' + selFile.relpath; break;
case 'md': location = selFile.path + '?v'; break; case 'md': location = selFile.path + (has(selFile.path, '?') ? '&v' : '?v'); break;
case 'cpl': cliptxt(location.protocol + '//' + location.host + selFile.path, function() {toast.ok(2, L.clipped)}); break; case 'cpl': cliptxt(selFile.url, function() {toast.ok(2, L.clipped)}); break;
case 'dl': ebi('seldl').click(); break; case 'dl': ebi('seldl').click(); break;
case 'zip': ebi('selzip').click(); break; case 'zip': ebi('selzip').click(); break;
case 'del': fileman.delete(); break; case 'del': fileman.delete(); break;
@ -9558,6 +9578,7 @@ var rcm = (function () {
fileman.paste(); fileman.paste();
fileman.clip = []; fileman.clip = [];
break; break;
case 'rnm': fileman.rename(); break;
case 'nfo': mktemp(true); break; case 'nfo': mktemp(true); break;
case 'nfi': mktemp(); break; case 'nfi': mktemp(); break;
case 'sal': case 'sal':
@ -9570,18 +9591,22 @@ var rcm = (function () {
}; };
} }
function show(x, y, target) { function show(x, y, target, isGrid) {
selFile.elem = selFile.type = selFile.path = selFile.id = selFile.relpath = null; selFile = jcp(nsFile);
selFile.no_dsel = false;
if (target) { if (target) {
var file = target.closest("#files tbody tr"); 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) { if (file) {
selFile.no_dsel = clgot(file, "sel"); selFile.no_dsel = clgot(file, "sel");
clmod(file, "sel", true); clmod(file, "sel", true);
selFile.elem = file; selFile.elem = file;
selFile.path = basenames(file.children[1].firstChild.href).split('?')[0]; selFile.url = file.children[1].firstChild.href;
selFile.relpath = selFile.path.split('/').slice(-1)[0]; 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("/")) if (noq_href(file.children[1].firstChild).endsWith("/"))
selFile.type = "dir"; selFile.type = "dir";
else { else {
@ -9591,6 +9616,7 @@ var rcm = (function () {
} }
} }
} }
console.log(selFile);
msel.selui(); msel.selui();
var has_sel = msel.getsel().length; var has_sel = msel.getsel().length;
@ -9601,7 +9627,7 @@ var rcm = (function () {
clmod(ebi('rpla'), 'hide', selFile.type != 'gf'); clmod(ebi('rpla'), 'hide', selFile.type != 'gf');
clmod(ebi('rtxt'), 'hide', !selFile.id); clmod(ebi('rtxt'), 'hide', !selFile.id);
clmod(ebi('rs1'), 'hide', !selFile.path); 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('rcpl'), 'hide', !selFile.path);
clmod(ebi('rdl'), 'hide', !has_sel); clmod(ebi('rdl'), 'hide', !has_sel);
clmod(ebi('rzip'), 'hide', !has_sel); clmod(ebi('rzip'), 'hide', !has_sel);
@ -9610,7 +9636,9 @@ var rcm = (function () {
clmod(ebi('rdel'), 'hide', !has_sel); clmod(ebi('rdel'), 'hide', !has_sel);
clmod(ebi('rcpy'), 'hide', !has_sel); clmod(ebi('rcpy'), 'hide', !has_sel);
clmod(ebi('rpst'), 'hide', !has_clip); 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.left = x + 5 + 'px';
menu.style.top = y + 5 + 'px'; menu.style.top = y + 5 + 'px';
@ -9618,26 +9646,30 @@ var rcm = (function () {
menu.focus(); menu.focus();
} }
r.hide = function (force) { r.hide = function(force) {
if (!menu.style.display || (!force && menu.contains(document.activeElement))) if (!menu.style.display || (!force && menu.contains(document.activeElement)))
return; return;
if (selFile.elem && !selFile.no_dsel) if (selFile.elem && !selFile.no_dsel) {
clmod(selFile.elem, "sel", false); clmod(selFile.elem, "sel", false);
selFile.elem = selFile.type = selFile.path = selFile.id = selFile.relpath = null; msel.selui();
selFile.no_dsel = false; }
selFile = jcp(nsFile);
menu.style.display = ''; menu.style.display = '';
} }
ebi('wrap').oncontextmenu = function(e) { 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; return true;
} }
else { if (selFile.elem && !selFile.no_dsel) {
ev(e); clmod(selFile.elem, "sel", false);
show(xscroll() + e.clientX, yscroll() + e.clientY, e.target); msel.selui();
return false;
} }
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)}; menu.onblur = function() {setTimeout(r.hide)};

View file

@ -334,6 +334,7 @@ Ls.chi = {
"mm_eunk": "未知错误", "mm_eunk": "未知错误",
"mm_e404": "无法播放音频;错误 404文件未找到。", "mm_e404": "无法播放音频;错误 404文件未找到。",
"mm_e403": "无法播放音频;错误 403访问被拒绝。\n\n尝试按 F5 重新加载,也许你已被注销", "mm_e403": "无法播放音频;错误 403访问被拒绝。\n\n尝试按 F5 重新加载,也许你已被注销",
"mm_e415": "无法播放音频;错误 415文件转码失败检查服务器日志。", //m
"mm_e500": "无法播放音频;错误 500检查服务器日志。", //m "mm_e500": "无法播放音频;错误 500检查服务器日志。", //m
"mm_e5xx": "无法播放音频;服务器错误", "mm_e5xx": "无法播放音频;服务器错误",
"mm_nof": "附近找不到更多音频文件", "mm_nof": "附近找不到更多音频文件",
@ -353,6 +354,7 @@ Ls.chi = {
"f_anota": "仅选择了 {0} 个项目,共 {1} 个;\n要选择整个文件夹请先滚动到底部", //m "f_anota": "仅选择了 {0} 个项目,共 {1} 个;\n要选择整个文件夹请先滚动到底部", //m
"f_dls": '当前文件夹中的文件链接已\n更改为下载链接', "f_dls": '当前文件夹中的文件链接已\n更改为下载链接',
"f_dl_nd": '跳过文件夹(请改用 zip/tar 下载):\n', //m
"f_partial": "要安全下载正在上传的文件,请点击没有 <code>.PARTIAL</code> 文件扩展名的同名文件。请按取消或 Escape 执行此操作。\n\n按 确定 / Enter 将忽略此警告并继续下载 <code>.PARTIAL</code> 临时文件,这几乎肯定会导致数据损坏。", "f_partial": "要安全下载正在上传的文件,请点击没有 <code>.PARTIAL</code> 文件扩展名的同名文件。请按取消或 Escape 执行此操作。\n\n按 确定 / Enter 将忽略此警告并继续下载 <code>.PARTIAL</code> 临时文件,这几乎肯定会导致数据损坏。",
@ -647,6 +649,7 @@ Ls.chi = {
"rc_md": "在文本编辑器中打开", //m "rc_md": "在文本编辑器中打开", //m
"rc_dl": "下载", //m "rc_dl": "下载", //m
"rc_zip": "下载为压缩包", //m "rc_zip": "下载为压缩包", //m
"rc_cpl": "复制链接", //m
"rc_del": "删除", //m "rc_del": "删除", //m
"rc_cut": "剪切", //m "rc_cut": "剪切", //m
"rc_cpy": "复制", //m "rc_cpy": "复制", //m

View file

@ -338,6 +338,7 @@ Ls.cze = {
"mm_eunk": "Neznámá chyba", "mm_eunk": "Neznámá chyba",
"mm_e404": "Nelze přehrát audio; chyba 404: Soubor nenalezen.", "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_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_e500": "Nelze přehrát audio; chyba 500: Zkontrolujte logy serveru.",
"mm_e5xx": "Nelze přehrát audio; chyba serveru ", "mm_e5xx": "Nelze přehrát audio; chyba serveru ",
"mm_nof": "žádné další audio soubory v okolí nenalezeny", "mm_nof": "žádné další audio soubory v okolí nenalezeny",
@ -357,6 +358,7 @@ Ls.cze = {
"f_anota": "pouze {0} z {1} položek bylo vybráno;\npro výběr celé složky nejprve přejděte na konec", "f_anota": "pouze {0} z {1} položek bylo vybráno;\npro výběr celé složky nejprve přejděte na konec",
"f_dls": 'odkazy na soubory v aktuální složce byly\nzměněny na odkazy ke stažení', "f_dls": 'odkazy na soubory v aktuální složce byly\nzměněny na odkazy ke stažení',
"f_dl_nd": 'přeskakuje se složka (místo toho použijte stažení zip/tar):\n', //m
"f_partial": "Pro bezpečné stažení souboru, který se aktuálně nahrává, klikněte prosím na soubor se stejným názvem, ale bez přípony <code>.PARTIAL</code>. Stiskněte prosím Zrušit nebo Escape.\n\nStisknutím OK / Enter ignorujete toto varování a pokračujete ve stahování <code>.PARTIAL</code> dočasného souboru, což téměř jistě vyústí jako poškozená data.", "f_partial": "Pro bezpečné stažení souboru, který se aktuálně nahrává, klikněte prosím na soubor se stejným názvem, ale bez přípony <code>.PARTIAL</code>. Stiskněte prosím Zrušit nebo Escape.\n\nStisknutím OK / Enter ignorujete toto varování a pokračujete ve stahování <code>.PARTIAL</code> dočasného souboru, což téměř jistě vyústí jako poškozená data.",
@ -651,6 +653,7 @@ Ls.cze = {
"rc_md": "otevřít v textovém editoru", //m "rc_md": "otevřít v textovém editoru", //m
"rc_dl": "stáhnout", //m "rc_dl": "stáhnout", //m
"rc_zip": "stáhnout jako archiv", //m "rc_zip": "stáhnout jako archiv", //m
"rc_cpl": "kopírovat odkaz", //m
"rc_del": "smazat", //m "rc_del": "smazat", //m
"rc_cut": "vyjmout", //m "rc_cut": "vyjmout", //m
"rc_cpy": "kopírovat", //m "rc_cpy": "kopírovat", //m

View file

@ -334,6 +334,7 @@ Ls.deu = {
"mm_eunk": "Unbekannter Fehler", "mm_eunk": "Unbekannter Fehler",
"mm_e404": "Konnte Datei nicht abspielen; Fehler 404: Datei nicht gefunden.", "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_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_e500": "Konnte Datei nicht abspielen; Fehler 500: Prüfe die Serverlogs.",
"mm_e5xx": "Konnte Datei nicht abspielen; Server Fehler ", "mm_e5xx": "Konnte Datei nicht abspielen; Server Fehler ",
"mm_nof": "finde keine weiteren Audiodateien in der Nähe", "mm_nof": "finde keine weiteren Audiodateien in der Nähe",
@ -353,6 +354,7 @@ Ls.deu = {
"f_anota": "nur {0} der {1} Elemente wurden ausgewählt;\num den gesamten Ordner auszuwählen, zuerst nach unten scrollen", "f_anota": "nur {0} der {1} Elemente wurden ausgewählt;\num den gesamten Ordner auszuwählen, zuerst nach unten scrollen",
"f_dls": 'die Dateilinks im aktuellen Ordner wurden\nin Downloadlinks geändert', "f_dls": 'die Dateilinks im aktuellen Ordner wurden\nin Downloadlinks geändert',
"f_dl_nd": 'ordner wird übersprungen (bitte zip/tar-download verwenden):\n', //m
"f_partial": "Um eine Datei sicher herunterzuladen, die gerade hochgeladen wird, klicke bitte die Datei mit dem gleichen Namen, aber ohne die <code>.PARTIAL</code>-Endung. Bitte drücke Abbrechen oder Escape, um dies zu tun.\n\nWenn du auf OK / Eingabe drückst, ignorierst du diese Warnung und lädst die <code>.PARTIAL</code>-Datei herunter, die ziemlich sicher beschädigte Daten enthält.", "f_partial": "Um eine Datei sicher herunterzuladen, die gerade hochgeladen wird, klicke bitte die Datei mit dem gleichen Namen, aber ohne die <code>.PARTIAL</code>-Endung. Bitte drücke Abbrechen oder Escape, um dies zu tun.\n\nWenn du auf OK / Eingabe drückst, ignorierst du diese Warnung und lädst die <code>.PARTIAL</code>-Datei herunter, die ziemlich sicher beschädigte Daten enthält.",
@ -647,6 +649,7 @@ Ls.deu = {
"rc_md": "im Texteditor öffnen", "rc_md": "im Texteditor öffnen",
"rc_dl": "herunterladen", "rc_dl": "herunterladen",
"rc_zip": "als Archiv herunterladen", "rc_zip": "als Archiv herunterladen",
"rc_cpl": "Link kopieren", //m
"rc_del": "löschen", "rc_del": "löschen",
"rc_cut": "ausschneiden", "rc_cut": "ausschneiden",
"rc_cpy": "kopieren", "rc_cpy": "kopieren",

View file

@ -334,6 +334,7 @@ Ls.epo = {
"mm_eunk": "Nekonata eraro", "mm_eunk": "Nekonata eraro",
"mm_e404": "Ne povas ludi aŭdiaĵon; eraro 404: Dosiero ne trovita.", "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_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_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_e5xx": "Ne povas ludi aŭdiaĵon; servila eraro ",
"mm_nof": "neniuj aŭdio-dosieroj trovitaj proksime", "mm_nof": "neniuj aŭdio-dosieroj trovitaj proksime",
@ -353,6 +354,7 @@ Ls.epo = {
"f_anota": "nur {0} de {1} eroj estis elektita;\nrulumi al la malsupro por elekti la tutan dosierujon", "f_anota": "nur {0} de {1} eroj estis elektita;\nrulumi al la malsupro por elekti la tutan dosierujon",
"f_dls": 'la ligiloj de dosieroj en ĉi tiu dosierujo estis\nanstataŭigitaj per elŝuto-ligiloj', "f_dls": 'la ligiloj de dosieroj en ĉi tiu dosierujo estis\nanstataŭigitaj per elŝuto-ligiloj',
"f_dl_nd": 'preterlasante dosierujon (uzu zip/tar-elŝuton anstataŭe):\n', //m
"f_partial": "Por sendifekta elŝuto de nune-alŝutata dosiero, elektu dosieron kun sama nomo, sed sen etendaĵo <code>.PARTIAL</code>. Bonvolu uzi la butonon \"Rezigni\" aŭ klavon ESK por fari tion.\n\nSe vi uzas OK / Enter, la provizora dosiero <code>.PARTIAL</code> estos elŝutita, kiu tre probable enhavas nekompletajn datumojn.", "f_partial": "Por sendifekta elŝuto de nune-alŝutata dosiero, elektu dosieron kun sama nomo, sed sen etendaĵo <code>.PARTIAL</code>. Bonvolu uzi la butonon \"Rezigni\" aŭ klavon ESK por fari tion.\n\nSe vi uzas OK / Enter, la provizora dosiero <code>.PARTIAL</code> estos elŝutita, kiu tre probable enhavas nekompletajn datumojn.",
@ -647,6 +649,7 @@ Ls.epo = {
"rc_md": "malfermi en tekstredaktilo", //m "rc_md": "malfermi en tekstredaktilo", //m
"rc_dl": "elŝuti", //m "rc_dl": "elŝuti", //m
"rc_zip": "elŝuti kiel arkivon", //m "rc_zip": "elŝuti kiel arkivon", //m
"rc_cpl": "kopii ligilon", //m
"rc_del": "forigi", //m "rc_del": "forigi", //m
"rc_cut": "eltondi", //m "rc_cut": "eltondi", //m
"rc_cpy": "kopii", //m "rc_cpy": "kopii", //m

View file

@ -334,6 +334,7 @@ Ls.fin = {
"mm_eunk": "Tuntematon virhe", "mm_eunk": "Tuntematon virhe",
"mm_e404": "Kappaletta ei voitu toistaa; virhe 404: Tiedostoa ei löydy.", "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_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_e500": "Kappaletta ei voitu toistaa; virhe 500: Tarkista palvelinlokit.",
"mm_e5xx": "Kappaletta ei voitu toistaa; palvelinvirhe ", "mm_e5xx": "Kappaletta ei voitu toistaa; palvelinvirhe ",
"mm_nof": "ei löydy enempää äänitiedostoja lähistöltä", "mm_nof": "ei löydy enempää äänitiedostoja lähistöltä",
@ -353,6 +354,7 @@ Ls.fin = {
"f_anota": "vain {0} / {1} kohdetta valittiin;\nvalitaksesi koko hakemiston, vieritä ensin loppuun", "f_anota": "vain {0} / {1} kohdetta valittiin;\nvalitaksesi koko hakemiston, vieritä ensin loppuun",
"f_dls": 'nykyisen hakemiston tiedostolinkit on\nvaihdettu latauslinkeiksi', "f_dls": 'nykyisen hakemiston tiedostolinkit on\nvaihdettu latauslinkeiksi',
"f_dl_nd": 'ohitetaan kansio (käytä zip/tar-latausta sen sijaan):\n', //m
"f_partial": "Ladataksesi turvallisesti tiedoston joka on parhaillaan latautumassa, klikkaa tiedostoa jolla on sama nimi mutta ilman <code>.PARTIAL</code> päätettä. Paina PERUUTA tai Escape tehdäksesi tämän.\n\nOK / Enter painaminen sivuuttaa tämän varoituksen ja jatkaa <code>.PARTIAL</code> väliaikaistiedoston lataamista, mikä todennäköisesti antaa sinulle vioittunutta dataa.", "f_partial": "Ladataksesi turvallisesti tiedoston joka on parhaillaan latautumassa, klikkaa tiedostoa jolla on sama nimi mutta ilman <code>.PARTIAL</code> päätettä. Paina PERUUTA tai Escape tehdäksesi tämän.\n\nOK / Enter painaminen sivuuttaa tämän varoituksen ja jatkaa <code>.PARTIAL</code> väliaikaistiedoston lataamista, mikä todennäköisesti antaa sinulle vioittunutta dataa.",
@ -647,6 +649,7 @@ Ls.fin = {
"rc_md": "avaa tekstieditorissa", //m "rc_md": "avaa tekstieditorissa", //m
"rc_dl": "Lataa", //m "rc_dl": "Lataa", //m
"rc_zip": "Lataa arkistona", //m "rc_zip": "Lataa arkistona", //m
"rc_cpl": "kopioi linkki", //m
"rc_del": "poista", //m "rc_del": "poista", //m
"rc_cut": "Leikkaa", //m "rc_cut": "Leikkaa", //m
"rc_cpy": "kopioi", //m "rc_cpy": "kopioi", //m

View file

@ -334,6 +334,7 @@ Ls.fra = {
"mm_eunk": "Erreur inconnue", "mm_eunk": "Erreur inconnue",
"mm_e404": "Impossible de lire l'audio ; erreur 404 : fichier introuvable.", "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_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_e500": "Impossible de lire l'audio ; erreur 500 : vérifiez les journaux du serveur.",
"mm_e5xx": "Impossible de lire l'audio ; erreur serveur ", "mm_e5xx": "Impossible de lire l'audio ; erreur serveur ",
"mm_nof": "Pas d'autres fichiers audio trouvés par ici", "mm_nof": "Pas d'autres fichiers audio trouvés par ici",
@ -353,6 +354,7 @@ Ls.fra = {
"f_anota": "seulement {0} des {1} elements sont selectioné;\npour selectioner le dossier entier, fait défiler jusqu'au fond", "f_anota": "seulement {0} des {1} elements sont selectioné;\npour selectioner le dossier entier, fait défiler jusqu'au fond",
"f_dls": 'le lien de fichier dans le répertoire actuel\nà été changé en lien de téléchargement', "f_dls": 'le lien de fichier dans le répertoire actuel\nà été changé en lien de téléchargement',
"f_dl_nd": 'dossier ignoré (utilisez le téléchargement zip/tar à la place):\n', //m
"f_partial": "Pour télécharger de façon sécurisée un fichier qui est entrain de se faire téléverser, cliquez sur le fichier qui a le même nom, mais sans l'extension de fichier <code>.PARTIAL</code>. Choisissez ANNULER ou appuiez sur la touche Échap pour faire cela.\n\nAppuyer sur OK / Entrée ignorera cet avertissement et continuera à télécharger le fichier temporaire <code>.PARTIAL</code> à la place, ce qui donnera presque certainement des données corrompues.", "f_partial": "Pour télécharger de façon sécurisée un fichier qui est entrain de se faire téléverser, cliquez sur le fichier qui a le même nom, mais sans l'extension de fichier <code>.PARTIAL</code>. Choisissez ANNULER ou appuiez sur la touche Échap pour faire cela.\n\nAppuyer sur OK / Entrée ignorera cet avertissement et continuera à télécharger le fichier temporaire <code>.PARTIAL</code> à la place, ce qui donnera presque certainement des données corrompues.",
@ -647,6 +649,7 @@ Ls.fra = {
"rc_md": "ouvrir dans léditeur de texte", //m "rc_md": "ouvrir dans léditeur de texte", //m
"rc_dl": "télécharger", //m "rc_dl": "télécharger", //m
"rc_zip": "télécharger comme archive", //m "rc_zip": "télécharger comme archive", //m
"rc_cpl": "copier le lien", //m
"rc_del": "supprimer", //m "rc_del": "supprimer", //m
"rc_cut": "couper", //m "rc_cut": "couper", //m
"rc_cpy": "copier", //m "rc_cpy": "copier", //m

View file

@ -334,6 +334,7 @@ Ls.grc = {
"mm_eunk": "Άγνωστο σφάλμα", "mm_eunk": "Άγνωστο σφάλμα",
"mm_e404": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 404: Το αρχείο δεν βρέθηκε.", "mm_e404": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 404: Το αρχείο δεν βρέθηκε.",
"mm_e403": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 403: Άρνηση πρόσβασης.\n\nΔοκίμασε F5 για επαναφόρτωση, ίσως να έχεις αποσυνδεθεί", "mm_e403": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 403: Άρνηση πρόσβασης.\n\nΔοκίμασε F5 για επαναφόρτωση, ίσως να έχεις αποσυνδεθεί",
"mm_e415": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 415: Απέτυχε η μετατροπή αρχείου; έλεγξε τα logs του διακομιστή.", //m
"mm_e500": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 500: Έλεγξε τα logs του διακομιστή.", "mm_e500": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα 500: Έλεγξε τα logs του διακομιστή.",
"mm_e5xx": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα διακομιστή", "mm_e5xx": "Αδύνατη η αναπαραγωγή ήχου; σφάλμα διακομιστή",
"mm_nof": "δεν βρέθηκαν άλλα αρχεία ήχου τριγύρω", "mm_nof": "δεν βρέθηκαν άλλα αρχεία ήχου τριγύρω",
@ -353,6 +354,7 @@ Ls.grc = {
"f_anota": "μόνο {0} από τα {1} αντικείμενα επιλέχθηκαν;\nγια να επιλέξεις ολόκληρο το φάκελο, κύλησε πρώτα μέχρι κάτω", "f_anota": "μόνο {0} από τα {1} αντικείμενα επιλέχθηκαν;\nγια να επιλέξεις ολόκληρο το φάκελο, κύλησε πρώτα μέχρι κάτω",
"f_dls": 'οι σύνδεσμοι αρχείων στον τρέχοντα φάκελο έχουν\nμετατραπεί σε συνδέσμους λήψης', "f_dls": 'οι σύνδεσμοι αρχείων στον τρέχοντα φάκελο έχουν\nμετατραπεί σε συνδέσμους λήψης',
"f_dl_nd": 'παράλειψη φακέλου (χρησιμοποιήστε λήψη zip/tar αντί γι αυτό):\n', //m
"f_partial": "Για να κατεβάσεις με ασφάλεια ένα αρχείο που ανεβαίνει, κλίκαρε το αρχείο με το ίδιο όνομα, αλλά χωρίς την κατάληξη <code>.PARTIAL</code>. Πάτα Άκυρο ή Escape για να σταματήσεις.\n\nΠάτα Εντάξει / Enter αν αγνοείς την προειδοποίηση και κατέβασε το <code>.PARTIAL</code> αρχείο, που σχεδόν σίγουρα θα είναι κατεστραμμένο.", "f_partial": "Για να κατεβάσεις με ασφάλεια ένα αρχείο που ανεβαίνει, κλίκαρε το αρχείο με το ίδιο όνομα, αλλά χωρίς την κατάληξη <code>.PARTIAL</code>. Πάτα Άκυρο ή Escape για να σταματήσεις.\n\nΠάτα Εντάξει / Enter αν αγνοείς την προειδοποίηση και κατέβασε το <code>.PARTIAL</code> αρχείο, που σχεδόν σίγουρα θα είναι κατεστραμμένο.",
@ -647,6 +649,7 @@ Ls.grc = {
"rc_md": "άνοιγμα στον επεξεργαστή κειμένου", //m "rc_md": "άνοιγμα στον επεξεργαστή κειμένου", //m
"rc_dl": "λήψη", //m "rc_dl": "λήψη", //m
"rc_zip": "λήψη ως αρχείο", //m "rc_zip": "λήψη ως αρχείο", //m
"rc_cpl": "ἀντίγραφε σύνδεσμον", //m
"rc_del": "διαγραφή", //m "rc_del": "διαγραφή", //m
"rc_cut": "αποκοπή", //m "rc_cut": "αποκοπή", //m
"rc_cpy": "αντιγραφή", //m "rc_cpy": "αντιγραφή", //m

View file

@ -334,6 +334,7 @@ Ls.ita = {
"mm_eunk": "Errore Sconosciuto", "mm_eunk": "Errore Sconosciuto",
"mm_e404": "Non è stato possibile riprodurre audio; errore 404: File non trovato.", "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_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_e500": "Non è stato possibile riprodurre audio; errore 500: Controlla i log del server.",
"mm_e5xx": "Non è stato possibile riprodurre audio; errore server ", "mm_e5xx": "Non è stato possibile riprodurre audio; errore server ",
"mm_nof": "non trovo altri file audio nelle vicinanze", "mm_nof": "non trovo altri file audio nelle vicinanze",
@ -353,6 +354,7 @@ Ls.ita = {
"f_anota": "solo {0} dei {1} elementi sono stati selezionati;\nper selezionare l'intera cartella, prima scorri fino in fondo", "f_anota": "solo {0} dei {1} elementi sono stati selezionati;\nper selezionare l'intera cartella, prima scorri fino in fondo",
"f_dls": 'i link dei file nella cartella corrente sono stati\ncambiati in link di download', "f_dls": 'i link dei file nella cartella corrente sono stati\ncambiati in link di download',
"f_dl_nd": 'cartella ignorata (usa invece il download zip/tar):\n', //m
"f_partial": "Per scaricare in sicurezza un file che è attualmente in fase di caricamento, clicca il file che ha lo stesso nome, ma senza l'estensione <code>.PARTIAL</code>. Premi ANNULLA o Escape per farlo.\n\nPremendo OK / Invio ignorerai questo avviso e continuerai a scaricare il file <code>.PARTIAL</code> scratch, che quasi sicuramente ti darà dati corrotti.", "f_partial": "Per scaricare in sicurezza un file che è attualmente in fase di caricamento, clicca il file che ha lo stesso nome, ma senza l'estensione <code>.PARTIAL</code>. Premi ANNULLA o Escape per farlo.\n\nPremendo OK / Invio ignorerai questo avviso e continuerai a scaricare il file <code>.PARTIAL</code> scratch, che quasi sicuramente ti darà dati corrotti.",
@ -647,6 +649,7 @@ Ls.ita = {
"rc_md": "apri nelleditor di testo", //m "rc_md": "apri nelleditor di testo", //m
"rc_dl": "scarica", //m "rc_dl": "scarica", //m
"rc_zip": "scarica come archivio", //m "rc_zip": "scarica come archivio", //m
"rc_cpl": "copia link", //m
"rc_del": "elimina", //m "rc_del": "elimina", //m
"rc_cut": "taglia", //m "rc_cut": "taglia", //m
"rc_cpy": "copia", //m "rc_cpy": "copia", //m

713
copyparty/web/tl/jpn.js Normal file
View file

@ -0,0 +1,713 @@
//末尾が //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&lt;code&gt;foo bar&lt;/code&gt; = «foo» と «bar» の両方を含める。$N&lt;code&gt;foo -bar&lt;/code&gt; = «foo» を含み、«bar» を含まない必要があります。$N&lt;code&gt;^yana .opus$&lt;/code&gt; = «yana» で始まり、«opus» ファイルである$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = «try unite» だけを含む$N$N日付形式は iso-8601。たとえば、$N&lt;code&gt;2009-12-31&lt;/code&gt; や &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;",
"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": "選択した項目を切り取る &lt;small&gt;(その後別の場所に貼り付ける)&lt;/small&gt;$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": "平均 &lt;em&gt;ハッシュ化&lt;/em&gt; 速度と完了予想時間",
"ut_etau": "平均 &lt;em&gt;アップロード&lt;/em&gt; 速度と完了予想時間",
"ut_etat": "平均 &lt;em&gt;合計&lt;/em&gt; 速度と完了予想時間",
"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>&quot;これはサーバー上で同じファイルサイズですか?&quot;</em>に置き換えます。そのため、ファイルの内容が異なる場合はアップロードされません。$N$Nアップロードが完了したらこれをオフにし、同じファイルを再度 &quot;アップロード&quot; してクライアントに検証させる必要があります。\">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に含めるソートルール (&lt;code&gt;,sorthref&lt;/code&gt;) の数。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&nbsp; カーソルは左余白です )",
"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": "キャッシュクリア &nbsp;(ブラウザが破損した曲のコピーをキャッシュしているために$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-webaiOS 17.5以降)\">owa",
"mt_c2caf": "opus-cafiOS 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": "シークバーの背景レベル0100を調整し$Nバッファリングの邪魔にならにようにする",
"mt_eq": "イコライザーとゲイン制御を有効にします;$N$Nブースト &lt;code&gt;0&lt;/code&gt; = 標準音量100%(変更なし)$N$N幅 &lt;code&gt;1 &nbsp;&lt;/code&gt; = 標準ステレオ(変更なし)$N幅 &lt;code&gt;0.5&lt;/code&gt; = 左右のクロスフィード50%$N幅 &lt;code&gt;0 &nbsp;&lt;/code&gt; = モノラル$N$Nブースト &lt;code&gt;-0.8&lt;/code&gt; &amp; 幅 &lt;code&gt;10&lt;/code&gt; = ボーカル除去 :^)$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$NWikipedia を参照してください。もっとわかりやすく説明されています)",
"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_dl_nd": 'フォルダーをスキップしています(代わりに zip/tar ダウンロードを使用してください):\n', //m
"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>&lt;&gt;:&quot;\\|?*</code>を日本語の全角文字に置き換える\">win",
"fr_slash": "<code>/</code>を新しいフォルダが作成されない文字に置き換える\">no /",
"fr_re": "元のファイル名に適用する正規表現検索パターン; キャプチャグループは、&lt;code&gt;(1)&lt;/code&gt; や &lt;code&gt;(2)&lt;/code&gt; のように、以下のフォーマットフィールドで参照することができるので、",
"fr_fmt": "foobar2000 を参考にしています:$N&lt;code&gt;(title)&lt;/code&gt; は曲名に置き換えられます。$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; はアーティストが空白の場合は[この]部分をスキップします。$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; はトラック番号を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": "ファイルの選択 &nbsp;(切り取り/コピー/削除/...$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&lt;em&gt;有効時: ファイル / フォルダをダブルクリックすると開きます&lt;/em&gt;$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": "パスに含まれる &nbsp;(スペース区切り)",
"s_f1": "名前に含まれる &nbsp;-nopeで否定",
"s_t1": "タグに含まれる &nbsp;^=開始、終了=$",
"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": "任意のフィルター:&nbsp; 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>ファイル: &nbsp; <b>{0}</b> 完了済み, &nbsp; <b>{1}</b> 失敗, &nbsp; <b>{2}</b> ビジー, &nbsp; <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!&nbsp; 修正しました 👍",
"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>次に&nbsp;<code>mt</code>を無効にします&nbsp; &nbsp;<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>&nbsp;クライアントは不完全なアップロードを検出して再開できない可能性があります; ターボボタンのツールチップを見る</span></p>',
"u_ts": '<p class="warn">警告: ターボが有効になっている場合、<span>&nbsp;検索結果が間違っている可能性があります; ターボボタンのツールチップを見る</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": "やあ、見知らぬ人 &nbsp; <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 &nbsp;┐( ´ -`)┌",
"o1": 'あるいはアクセスできないかもしれません -- パスワードを試すか <a href="' + SR + '/?h">ホームに戻ってください</a>',
"p1": "403 forbiddena &nbsp;~┻━┻",
"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ユーザーを管理できるページへのリンクです
}
};

View file

@ -334,6 +334,7 @@ Ls.kor = {
"mm_eunk": "알 수 없는 오류", "mm_eunk": "알 수 없는 오류",
"mm_e404": "오디오를 재생할 수 없습니다; 오류 404: 파일을 찾을 수 없습니다.", "mm_e404": "오디오를 재생할 수 없습니다; 오류 404: 파일을 찾을 수 없습니다.",
"mm_e403": "오디오를 재생할 수 없습니다; 오류 403: 접근이 거부되었습니다.\n\nF5를 눌러 새로고침 해보세요, 로그아웃되었을 수 있습니다", "mm_e403": "오디오를 재생할 수 없습니다; 오류 403: 접근이 거부되었습니다.\n\nF5를 눌러 새로고침 해보세요, 로그아웃되었을 수 있습니다",
"mm_e415": "오디오를 재생할 수 없습니다; 오류 415: 파일 변환에 실패했습니다; 서버 로그를 확인하세요.", //m
"mm_e500": "오디오를 재생할 수 없습니다; 오류 500: 서버 로그를 확인하세요.", "mm_e500": "오디오를 재생할 수 없습니다; 오류 500: 서버 로그를 확인하세요.",
"mm_e5xx": "오디오를 재생할 수 없습니다; 서버 오류 ", "mm_e5xx": "오디오를 재생할 수 없습니다; 서버 오류 ",
"mm_nof": "주변에서 더 이상 오디오 파일을 찾을 수 없습니다", "mm_nof": "주변에서 더 이상 오디오 파일을 찾을 수 없습니다",
@ -353,6 +354,7 @@ Ls.kor = {
"f_anota": "{1}개 항목 중 {0}개만 선택되었습니다.\n전체 폴더를 선택하려면 먼저 맨 아래로 스크롤하세요.", "f_anota": "{1}개 항목 중 {0}개만 선택되었습니다.\n전체 폴더를 선택하려면 먼저 맨 아래로 스크롤하세요.",
"f_dls": '현재 폴더의 파일 링크가\n다운로드 링크로 변경되었습니다', "f_dls": '현재 폴더의 파일 링크가\n다운로드 링크로 변경되었습니다',
"f_dl_nd": '폴더를 건너뜁니다 (대신 zip/tar 다운로드를 사용하세요):\n', //m
"f_partial": "현재 업로드 중인 파일을 안전하게 다운로드하려면, 파일 이름이 같지만 <code>.PARTIAL</code> 확장자가 없는 파일을 클릭하세요. 이 경고를 무시하려면 \"취소\" 또는 ESC를 누르세요.\n\n\"확인\"/Enter를 누르면 이 경고를 무시하고 <code>.PARTIAL</code> 임시 파일을 계속 다운로드하며, 이 경우 거의 확실히 손상된 데이터를 받게 됩니다.", "f_partial": "현재 업로드 중인 파일을 안전하게 다운로드하려면, 파일 이름이 같지만 <code>.PARTIAL</code> 확장자가 없는 파일을 클릭하세요. 이 경고를 무시하려면 \"취소\" 또는 ESC를 누르세요.\n\n\"확인\"/Enter를 누르면 이 경고를 무시하고 <code>.PARTIAL</code> 임시 파일을 계속 다운로드하며, 이 경우 거의 확실히 손상된 데이터를 받게 됩니다.",
@ -647,6 +649,7 @@ Ls.kor = {
"rc_md": "텍스트 편집기에서 열기", //m "rc_md": "텍스트 편집기에서 열기", //m
"rc_dl": "다운로드", //m "rc_dl": "다운로드", //m
"rc_zip": "압축 파일로 다운로드", //m "rc_zip": "압축 파일로 다운로드", //m
"rc_cpl": "링크 복사", //m
"rc_del": "삭제", //m "rc_del": "삭제", //m
"rc_cut": "잘라내기", //m "rc_cut": "잘라내기", //m
"rc_cpy": "복사", //m "rc_cpy": "복사", //m

View file

@ -334,6 +334,7 @@ Ls.nld = {
"mm_eunk": "Onbekende fout", "mm_eunk": "Onbekende fout",
"mm_e404": "Kan audio niet afspelen; fout 404: Bestand niet gevonden..", "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_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_e500": "Kan geen audio afspelen; fout 500: Controleer serverlogs.",
"mm_e5xx": "Kan geen audio afspelen; serverfout ", "mm_e5xx": "Kan geen audio afspelen; serverfout ",
"mm_nof": "Geen audiobestanden meer vinden in de buurt", "mm_nof": "Geen audiobestanden meer vinden in de buurt",
@ -353,6 +354,7 @@ Ls.nld = {
"f_anota": "Alleen {0} van de {1} items zijn geselecteerd;\nom de volledige map te selecteren, scrol je eerst naar beneden", "f_anota": "Alleen {0} van de {1} items zijn geselecteerd;\nom de volledige map te selecteren, scrol je eerst naar beneden",
"f_dls": 'de bestandslinks in de huidige map zijn veranderd in downloadlinks', "f_dls": 'de bestandslinks in de huidige map zijn veranderd in downloadlinks',
"f_dl_nd": 'map wordt overgeslagen (gebruik in plaats daarvan zip/tar-download):\n', //m
"f_partial": "Om een bestand dat momenteel wordt geüpload veilig te downloaden, klikt u op het bestand met dezelfde bestandsnaam, maar zonder de bestandsextensie <code>.PARTIAL</code>. Druk op Annuleren of Escape om dit te doen.\n\nAls u op OK / Enter drukt, wordt deze waarschuwing genegeerd en gaat u verder met het downloaden van het gedeeltelijke <code>.PARTIAL</code> scratchbestand, waardoor u vrijwel zeker beschadigde gegevens krijgt.", "f_partial": "Om een bestand dat momenteel wordt geüpload veilig te downloaden, klikt u op het bestand met dezelfde bestandsnaam, maar zonder de bestandsextensie <code>.PARTIAL</code>. Druk op Annuleren of Escape om dit te doen.\n\nAls u op OK / Enter drukt, wordt deze waarschuwing genegeerd en gaat u verder met het downloaden van het gedeeltelijke <code>.PARTIAL</code> scratchbestand, waardoor u vrijwel zeker beschadigde gegevens krijgt.",
@ -647,6 +649,7 @@ Ls.nld = {
"rc_md": "Openen in teksteditor", //m "rc_md": "Openen in teksteditor", //m
"rc_dl": "Downloaden", //m "rc_dl": "Downloaden", //m
"rc_zip": "Downloaden als archief", //m "rc_zip": "Downloaden als archief", //m
"rc_cpl": "Link kopiëren", //m
"rc_del": "Verwijderen", //m "rc_del": "Verwijderen", //m
"rc_cut": "Knippen", //m "rc_cut": "Knippen", //m
"rc_cpy": "Kopiëren", //m "rc_cpy": "Kopiëren", //m

View file

@ -331,6 +331,7 @@ Ls.nno = {
"mm_eunk": "Ukjent feil", "mm_eunk": "Ukjent feil",
"mm_e404": "Avspeling feilet: Fil ikkje funnet.", "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_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_e500": "Avspeling feilet: Rusk i maskineriet, sjekk serverloggen.",
"mm_e5xx": "Avspeling feilet: ", "mm_e5xx": "Avspeling feilet: ",
"mm_nof": "finn ikkje flere songer i nærheita", "mm_nof": "finn ikkje flere songer i nærheita",
@ -350,6 +351,7 @@ Ls.nno = {
"f_anota": "kun {0} av totalt {1} element blei markert;\nfor å velje alt må du bla åt bunnen av mappa først", "f_anota": "kun {0} av totalt {1} element blei markert;\nfor å velje alt må du bla åt bunnen av mappa først",
"f_dls": 'lenkane i denne mappa er no\nomgjort åt nedlastingsknappar', "f_dls": 'lenkane i denne mappa er no\nomgjort åt nedlastingsknappar',
"f_dl_nd": 'hoppar over mappe (bruk zip/tar-nedlasting i staden):\n',
"f_partial": "For å laste ned ei fil som enda ikkje er ferdig opplasta, klikk på filen som har same filnamn som denne, men uten <code>.PARTIAL</code> på slutten. Da vil serveren passe på at nedlastinga går bra. Derfor anbefalast det sterkt å trykkje AVBRYT eller Escape-tasten.\n\nViss du verkelig ønskjer å laste ned denne <code>.PARTIAL</code>-filen på ein ukontrollert måte, trykk OK / Enter for å ignorere denne advarselen. Slik vil du høgst sannsynleg motta korrupt data.", "f_partial": "For å laste ned ei fil som enda ikkje er ferdig opplasta, klikk på filen som har same filnamn som denne, men uten <code>.PARTIAL</code> på slutten. Da vil serveren passe på at nedlastinga går bra. Derfor anbefalast det sterkt å trykkje AVBRYT eller Escape-tasten.\n\nViss du verkelig ønskjer å laste ned denne <code>.PARTIAL</code>-filen på ein ukontrollert måte, trykk OK / Enter for å ignorere denne advarselen. Slik vil du høgst sannsynleg motta korrupt data.",
@ -644,6 +646,7 @@ Ls.nno = {
"rc_md": "opne i tekstredigerar", "rc_md": "opne i tekstredigerar",
"rc_dl": "Last ned", "rc_dl": "Last ned",
"rc_zip": "Last ned som arkiv", "rc_zip": "Last ned som arkiv",
"rc_cpl": "kopier lenke",
"rc_del": "slett", "rc_del": "slett",
"rc_cut": "klipp ut", "rc_cut": "klipp ut",
"rc_cpy": "kopier", "rc_cpy": "kopier",

View file

@ -331,6 +331,7 @@ Ls.nor = {
"mm_eunk": "Ukjent feil", "mm_eunk": "Ukjent feil",
"mm_e404": "Avspilling feilet: Fil ikke funnet.", "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_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_e500": "Avspilling feilet: Rusk i maskineriet, sjekk serverloggen.",
"mm_e5xx": "Avspilling feilet: ", "mm_e5xx": "Avspilling feilet: ",
"mm_nof": "finner ikke flere sanger i nærheten", "mm_nof": "finner ikke flere sanger i nærheten",
@ -350,6 +351,7 @@ Ls.nor = {
"f_anota": "kun {0} av totalt {1} elementer ble markert;\nfor å velge alt må du bla til bunnen av mappen først", "f_anota": "kun {0} av totalt {1} elementer ble markert;\nfor å velge alt må du bla til bunnen av mappen først",
"f_dls": 'linkene i denne mappen er nå\nomgjort til nedlastningsknapper', "f_dls": 'linkene i denne mappen er nå\nomgjort til nedlastningsknapper',
"f_dl_nd": 'hopper over mappe (bruk zip/tar-nedlasting i stedet):\n',
"f_partial": "For å laste ned en fil som enda ikke er ferdig opplastet, klikk på filen som har samme filnavn som denne, men uten <code>.PARTIAL</code> på slutten. Da vil serveren passe på at nedlastning går bra. Derfor anbefales det sterkt å trykke AVBRYT eller Escape-tasten.\n\nHvis du virkelig ønsker å laste ned denne <code>.PARTIAL</code>-filen på en ukontrollert måte, trykk OK / Enter for å ignorere denne advarselen. Slik vil du høyst sannsynlig motta korrupt data.", "f_partial": "For å laste ned en fil som enda ikke er ferdig opplastet, klikk på filen som har samme filnavn som denne, men uten <code>.PARTIAL</code> på slutten. Da vil serveren passe på at nedlastning går bra. Derfor anbefales det sterkt å trykke AVBRYT eller Escape-tasten.\n\nHvis du virkelig ønsker å laste ned denne <code>.PARTIAL</code>-filen på en ukontrollert måte, trykk OK / Enter for å ignorere denne advarselen. Slik vil du høyst sannsynlig motta korrupt data.",
@ -644,6 +646,7 @@ Ls.nor = {
"rc_md": "åpne i teksteditor", "rc_md": "åpne i teksteditor",
"rc_dl": "Last ned", "rc_dl": "Last ned",
"rc_zip": "Last ned som arkiv", "rc_zip": "Last ned som arkiv",
"rc_cpl": "kopier lenke",
"rc_del": "slett", "rc_del": "slett",
"rc_cut": "klipp ut", "rc_cut": "klipp ut",
"rc_cpy": "kopier", "rc_cpy": "kopier",

View file

@ -337,6 +337,7 @@ Ls.pol = {
"mm_eunk": "Nieznany błąd", "mm_eunk": "Nieznany błąd",
"mm_e404": "Nie można odtworzyć; błąd 404: Nie znaleziono pliku.", "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_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_e500": "Nie można odtworzyć; błąd 500: Sprawdź logi serwera.",
"mm_e5xx": "Nie można odtworzyć; błąd serwera", "mm_e5xx": "Nie można odtworzyć; błąd serwera",
"mm_nof": "nie znaleziono więcej plików audio", "mm_nof": "nie znaleziono więcej plików audio",
@ -356,6 +357,7 @@ Ls.pol = {
"f_anota": "{0} z {1} elementów zostało wybranych;\naby pokazać cały folder, zjedź na dół", "f_anota": "{0} z {1} elementów zostało wybranych;\naby pokazać cały folder, zjedź na dół",
"f_dls": 'linki do plików w aktualnym folderze\nzostały zmienione w linki pobierania', "f_dls": 'linki do plików w aktualnym folderze\nzostały zmienione w linki pobierania',
"f_dl_nd": 'pomijanie folderu (użyj zamiast tego pobierania zip/tar):\n', //m
"f_partial": "Aby bezpiecznie pobrać plik, który aktualnie jest przesyłany, wybierz plik o tej samej nazwie, lecz bez rozszerzenia <code>.PARTIAL</code>. Żeby to zrobić, naciśnij ANULUJ lub klawisz ESC.\n\nWciśnięcie OK / Enter zignoruje to ostrzeżenie i pobierze plik tymczasowy <code>.PARTIAL</code>, który prawie z pewnością będzie zepsuty", "f_partial": "Aby bezpiecznie pobrać plik, który aktualnie jest przesyłany, wybierz plik o tej samej nazwie, lecz bez rozszerzenia <code>.PARTIAL</code>. Żeby to zrobić, naciśnij ANULUJ lub klawisz ESC.\n\nWciśnięcie OK / Enter zignoruje to ostrzeżenie i pobierze plik tymczasowy <code>.PARTIAL</code>, który prawie z pewnością będzie zepsuty",
@ -650,6 +652,7 @@ Ls.pol = {
"rc_md": "otwórz w edytorze tekstu", //m "rc_md": "otwórz w edytorze tekstu", //m
"rc_dl": "pobierz", //m "rc_dl": "pobierz", //m
"rc_zip": "pobierz jako archiwum", //m "rc_zip": "pobierz jako archiwum", //m
"rc_cpl": "kopiuj link", //m
"rc_del": "usuń", //m "rc_del": "usuń", //m
"rc_cut": "wytnij", //m "rc_cut": "wytnij", //m
"rc_cpy": "kopiuj", //m "rc_cpy": "kopiuj", //m

View file

@ -334,6 +334,7 @@ Ls.por = {
"mm_eunk": "Erro Desconhecido", "mm_eunk": "Erro Desconhecido",
"mm_e404": "Não foi possível reproduzir áudio; erro 404: Arquivo não encontrado.", "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_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_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_e5xx": "Não foi possível reproduzir áudio; erro do servidor ",
"mm_nof": "não encontrando mais arquivos de áudio por perto", "mm_nof": "não encontrando mais arquivos de áudio por perto",
@ -353,6 +354,7 @@ Ls.por = {
"f_anota": "apenas {0} dos {1} itens foram selecionados;\npara selecionar a pasta inteira, primeiro role para o final", "f_anota": "apenas {0} dos {1} itens foram selecionados;\npara selecionar a pasta inteira, primeiro role para o final",
"f_dls": 'os links de arquivo na pasta atual foram\nalterados para links de download', "f_dls": 'os links de arquivo na pasta atual foram\nalterados para links de download',
"f_dl_nd": 'a ignorar pasta (use o download zip/tar em vez disso):\n', //m
"f_partial": "Para baixar com segurança um arquivo que está sendo enviado, por favor, clique no arquivo que tem o mesmo nome, mas sem a extensão <code>.PARTIAL</code>. Por favor, pressione CANCELAR ou Escape para fazer isso.\n\nPressionar OK / Enter irá ignorar este aviso e continuar baixando o arquivo temporário <code>.PARTIAL</code>, o que quase certamente lhe dará dados corrompidos.", "f_partial": "Para baixar com segurança um arquivo que está sendo enviado, por favor, clique no arquivo que tem o mesmo nome, mas sem a extensão <code>.PARTIAL</code>. Por favor, pressione CANCELAR ou Escape para fazer isso.\n\nPressionar OK / Enter irá ignorar este aviso e continuar baixando o arquivo temporário <code>.PARTIAL</code>, o que quase certamente lhe dará dados corrompidos.",
@ -647,6 +649,7 @@ Ls.por = {
"rc_md": "abrir no editor de texto", //m "rc_md": "abrir no editor de texto", //m
"rc_dl": "baixar", //m "rc_dl": "baixar", //m
"rc_zip": "baixar como arquivo", //m "rc_zip": "baixar como arquivo", //m
"rc_cpl": "copiar link", //m
"rc_del": "excluir", //m "rc_del": "excluir", //m
"rc_cut": "recortar", //m "rc_cut": "recortar", //m
"rc_cpy": "copiar", //m "rc_cpy": "copiar", //m

View file

@ -334,6 +334,7 @@ Ls.rus = {
"mm_eunk": "Неопознанная ошибка", "mm_eunk": "Неопознанная ошибка",
"mm_e404": "Не удалось воспроизвести аудио; ошибка 404: Файл не найден.", "mm_e404": "Не удалось воспроизвести аудио; ошибка 404: Файл не найден.",
"mm_e403": "Не удалось воспроизвести аудио; ошибка 403: Доступ запрещён.\n\nПопробуйте перезагрузить страницу, возможно, ваша сессия истекла", "mm_e403": "Не удалось воспроизвести аудио; ошибка 403: Доступ запрещён.\n\nПопробуйте перезагрузить страницу, возможно, ваша сессия истекла",
"mm_e415": "Не удалось воспроизвести аудио; ошибка 415: Сбой преобразования файла; проверьте логи сервера.", //m
"mm_e500": "Не удалось воспроизвести аудио; ошибка 500: Проверьте логи сервера.", "mm_e500": "Не удалось воспроизвести аудио; ошибка 500: Проверьте логи сервера.",
"mm_e5xx": "Не удалось воспроизвести аудио; ошибка сервера ", "mm_e5xx": "Не удалось воспроизвести аудио; ошибка сервера ",
"mm_nof": "больше аудио-файлов не найдено", "mm_nof": "больше аудио-файлов не найдено",
@ -353,6 +354,7 @@ Ls.rus = {
"f_anota": "только {0} из {1} файлов было выделено;\nчтобы выделить всё папку, отмотайте до низа", "f_anota": "только {0} из {1} файлов было выделено;\nчтобы выделить всё папку, отмотайте до низа",
"f_dls": 'ссылки на файлы в данной папке были\nзаменены ссылками на скачивание', "f_dls": 'ссылки на файлы в данной папке были\nзаменены ссылками на скачивание',
"f_dl_nd": 'пропуск папки (используйте загрузку zip/tar вместо этого):\n', //m
"f_partial": "Чтобы безопасно скачать файл, который в текущий момент загружается, нажмите на файл с таким же названием, но без расширения <code>.PARTIAL</code>. Пожалуйста, нажмите Отмена или ESC, чтобы сделать это.\n\nПри нажатии OK / Enter, вы скачаете этот временный файл, который с огромной вероятностью содержит лишь неполные данные.", "f_partial": "Чтобы безопасно скачать файл, который в текущий момент загружается, нажмите на файл с таким же названием, но без расширения <code>.PARTIAL</code>. Пожалуйста, нажмите Отмена или ESC, чтобы сделать это.\n\nПри нажатии OK / Enter, вы скачаете этот временный файл, который с огромной вероятностью содержит лишь неполные данные.",
@ -647,6 +649,7 @@ Ls.rus = {
"rc_md": "открыть в текстовом редакторе", //m "rc_md": "открыть в текстовом редакторе", //m
"rc_dl": "скачать", //m "rc_dl": "скачать", //m
"rc_zip": "скачать как архив", //m "rc_zip": "скачать как архив", //m
"rc_cpl": "копировать ссылку", //m
"rc_del": "удалить", //m "rc_del": "удалить", //m
"rc_cut": "вырезать", //m "rc_cut": "вырезать", //m
"rc_cpy": "копировать", //m "rc_cpy": "копировать", //m

View file

@ -333,6 +333,7 @@ Ls.spa = {
"mm_eunk": "Error desconocido", "mm_eunk": "Error desconocido",
"mm_e404": "No se pudo reproducir el audio; error 404: Archivo no encontrado.", "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_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_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_e5xx": "No se pudo reproducir el audio; error del servidor ",
"mm_nof": "no se encuentran más archivos de audio cerca", "mm_nof": "no se encuentran más archivos de audio cerca",
@ -352,6 +353,7 @@ Ls.spa = {
"f_anota": "solo {0} de los {1} elementos fueron seleccionados;\npara seleccionar la carpeta completa, primero desplázate hasta el final", "f_anota": "solo {0} de los {1} elementos fueron seleccionados;\npara seleccionar la carpeta completa, primero desplázate hasta el final",
"f_dls": "los enlaces a archivos en la carpeta actual se han\nconvertido en enlaces de descarga", "f_dls": "los enlaces a archivos en la carpeta actual se han\nconvertido en enlaces de descarga",
"f_dl_nd": 'omitiendo carpeta (use la descarga zip/tar en su lugar):\n', //m
"f_partial": "Para descargar de forma segura un archivo que se está subiendo actualmente, por favor haz clic en el archivo con el mismo nombre, pero sin la extensión <code>.PARTIAL</code>. Por favor, pulsa CANCELAR o Escape para hacer esto.\n\nPulsar ACEPTAR o Intro ignorará esta advertencia y continuará descargando el archivo temporal <code>.PARTIAL</code>, lo que casi con toda seguridad te dará datos corruptos.", "f_partial": "Para descargar de forma segura un archivo que se está subiendo actualmente, por favor haz clic en el archivo con el mismo nombre, pero sin la extensión <code>.PARTIAL</code>. Por favor, pulsa CANCELAR o Escape para hacer esto.\n\nPulsar ACEPTAR o Intro ignorará esta advertencia y continuará descargando el archivo temporal <code>.PARTIAL</code>, lo que casi con toda seguridad te dará datos corruptos.",
@ -646,6 +648,7 @@ Ls.spa = {
"rc_md": "abrir en el editor de texto", //m "rc_md": "abrir en el editor de texto", //m
"rc_dl": "descargar", //m "rc_dl": "descargar", //m
"rc_zip": "descargar como archivo", //m "rc_zip": "descargar como archivo", //m
"rc_cpl": "copiar enlace", //m
"rc_del": "eliminar", //m "rc_del": "eliminar", //m
"rc_cut": "cortar", //m "rc_cut": "cortar", //m
"rc_cpy": "copiar", //m "rc_cpy": "copiar", //m

View file

@ -334,6 +334,7 @@ Ls.swe = {
"mm_eunk": "Okänt Fel", "mm_eunk": "Okänt Fel",
"mm_e404": "Kunde inte spela upp ljudfil; fel 404: Filen hittades inte.", "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_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_e500": "Kunde inte spela upp ljudfil; fel 500: Kolla serverloggen.",
"mm_e5xx": "Kunde inte spela upp ljudfil; serverfel ", "mm_e5xx": "Kunde inte spela upp ljudfil; serverfel ",
"mm_nof": "hittade inga fler låtar i närheten", "mm_nof": "hittade inga fler låtar i närheten",
@ -353,6 +354,7 @@ Ls.swe = {
"f_anota": "endast {0} av {1} objekt valdes;\nför att välja hela mappen, skrolla först till botten av vyn", "f_anota": "endast {0} av {1} objekt valdes;\nför att välja hela mappen, skrolla först till botten av vyn",
"f_dls": 'fillänkarna i den öppna mappen har\nbytts till nedladdningslänkar', "f_dls": 'fillänkarna i den öppna mappen har\nbytts till nedladdningslänkar',
"f_dl_nd": 'hoppar över mapp (använd zip/tar-nedladdning istället):\n', //m
"f_partial": "För att säkert ladda ner en fil som för tillfället laddas upp, vänligen klicka på filen som har samma filnamn men utan <code>.PARTIAL</code>-filändelsen. Vänligen tryck Avbryt eller Escape för att göra detta.\n\nOm du bortser från denna varning och trycker OK eller Enter kommer den tillfälliga <code>.PARTIAL</code>-filen istället att laddas ner, vilket är nästan garanterat att ge dig korrumperad data.", "f_partial": "För att säkert ladda ner en fil som för tillfället laddas upp, vänligen klicka på filen som har samma filnamn men utan <code>.PARTIAL</code>-filändelsen. Vänligen tryck Avbryt eller Escape för att göra detta.\n\nOm du bortser från denna varning och trycker OK eller Enter kommer den tillfälliga <code>.PARTIAL</code>-filen istället att laddas ner, vilket är nästan garanterat att ge dig korrumperad data.",
@ -647,6 +649,7 @@ Ls.swe = {
"rc_md": "öppna i textredigerare", //m "rc_md": "öppna i textredigerare", //m
"rc_dl": "Ladda ner", //m "rc_dl": "Ladda ner", //m
"rc_zip": "Ladda ner som arkiv", //m "rc_zip": "Ladda ner som arkiv", //m
"rc_cpl": "kopiera länk", //m
"rc_del": "radera", //m "rc_del": "radera", //m
"rc_cut": "klipp ut", //m "rc_cut": "klipp ut", //m
"rc_cpy": "kopiera", //m "rc_cpy": "kopiera", //m

View file

@ -334,6 +334,7 @@ Ls.tur = {
"mm_eunk": "Bilinmeyen Hata", "mm_eunk": "Bilinmeyen Hata",
"mm_e404": "Ses oynatılamadı; hata 404: Dosya bulunamadı.", "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_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_e500": "Ses oynatılamadı; hata 500: Sunucu günlüklerini kontrol edin.",
"mm_e5xx": "Ses oynatılamadı; sunucu hatası ", "mm_e5xx": "Ses oynatılamadı; sunucu hatası ",
"mm_nof": "yakınlarda başka ses dosyası bulunamadı", "mm_nof": "yakınlarda başka ses dosyası bulunamadı",
@ -353,6 +354,7 @@ Ls.tur = {
"f_anota": "{1} dosyadan sadece {0} tanesi seçildi;\nTüm klasörü seçmek için önce en alta kaydırın.", "f_anota": "{1} dosyadan sadece {0} tanesi seçildi;\nTüm klasörü seçmek için önce en alta kaydırın.",
"f_dls": 'bu klasördeki dosya linkleri\nindirme linklerine dönüştürüldü', "f_dls": 'bu klasördeki dosya linkleri\nindirme linklerine dönüştürüldü',
"f_dl_nd": 'klasör atlanıyor (bunun yerine zip/tar indirmesini kullanın):\n', //m
"f_partial": "Mevcutta yüklenen bir dosyayı güvenli bir şekilde indirmek için lütfen aynı adlı ama <code>.PARTIAL</code> uzantısına sahip olmayan dosyaya tıklayın. Lütfen bunu yapmak için İPTAL veya Esc tuşuna basın.\n\nTamam / Enter tuşuna basmak, bu uyarıyı yok sayacak ve bunun yerine <code>.PARTIAL</code> geçici dosyasını indirmeye devam edecektir ki bu da elinize bozuk veriler sunacaktır.", "f_partial": "Mevcutta yüklenen bir dosyayı güvenli bir şekilde indirmek için lütfen aynı adlı ama <code>.PARTIAL</code> uzantısına sahip olmayan dosyaya tıklayın. Lütfen bunu yapmak için İPTAL veya Esc tuşuna basın.\n\nTamam / Enter tuşuna basmak, bu uyarıyı yok sayacak ve bunun yerine <code>.PARTIAL</code> geçici dosyasını indirmeye devam edecektir ki bu da elinize bozuk veriler sunacaktır.",
@ -647,6 +649,7 @@ Ls.tur = {
"rc_md": "metin düzenleyicide aç", //m "rc_md": "metin düzenleyicide aç", //m
"rc_dl": "i̇ndir", //m "rc_dl": "i̇ndir", //m
"rc_zip": "arşiv olarak indir", //m "rc_zip": "arşiv olarak indir", //m
"rc_cpl": "bağlantıyı kopyala", //m
"rc_del": "sil", //m "rc_del": "sil", //m
"rc_cut": "kes", //m "rc_cut": "kes", //m
"rc_cpy": "kopyala", //m "rc_cpy": "kopyala", //m

View file

@ -334,6 +334,7 @@ Ls.ukr = {
"mm_eunk": "Невідома помилка", "mm_eunk": "Невідома помилка",
"mm_e404": "Не вдалося відтворити аудіо; помилка 404: Файл не знайдено.", "mm_e404": "Не вдалося відтворити аудіо; помилка 404: Файл не знайдено.",
"mm_e403": "Не вдалося відтворити аудіо; помилка 403: Доступ заборонено.\n\nСпробуйте натиснути F5 для перезавантаження, можливо, ви вийшли з системи", "mm_e403": "Не вдалося відтворити аудіо; помилка 403: Доступ заборонено.\n\nСпробуйте натиснути F5 для перезавантаження, можливо, ви вийшли з системи",
"mm_e415": "Не вдалося відтворити аудіо; помилка 415: Не вдалося перетворити файл; перевірте логи сервера.", //m
"mm_e500": "Не вдалося відтворити аудіо; помилка 500: Перевірте логи сервера.", "mm_e500": "Не вдалося відтворити аудіо; помилка 500: Перевірте логи сервера.",
"mm_e5xx": "Не вдалося відтворити аудіо; помилка сервера ", "mm_e5xx": "Не вдалося відтворити аудіо; помилка сервера ",
"mm_nof": "не знаходжу більше аудіо файлів поблизу", "mm_nof": "не знаходжу більше аудіо файлів поблизу",
@ -353,6 +354,7 @@ Ls.ukr = {
"f_anota": "лише {0} з {1} елементів було вибрано;\nщоб вибрати всю папку, спочатку прокрутіть до низу", "f_anota": "лише {0} з {1} елементів було вибрано;\nщоб вибрати всю папку, спочатку прокрутіть до низу",
"f_dls": 'посилання на файли в поточній папці були\nзмінені на посилання для завантаження', "f_dls": 'посилання на файли в поточній папці були\nзмінені на посилання для завантаження',
"f_dl_nd": 'пропуск папки (скористайтеся завантаженням zip/tar замість цього):\n', //m
"f_partial": "Щоб безпечно завантажити файл, який зараз завантажується, будь ласка, клацніть на файл, який має таке саме ім'я, але без розширення <code>.PARTIAL</code>. Будь ласка, натисніть Скасувати або Escape, щоб зробити це.\n\nНатиснення Гаразд / Enter проігнорує це попередження і продовжить завантаження <code>.PARTIAL</code> робочого файлу замість цього, що майже напевно дасть вам пошкоджені дані.", "f_partial": "Щоб безпечно завантажити файл, який зараз завантажується, будь ласка, клацніть на файл, який має таке саме ім'я, але без розширення <code>.PARTIAL</code>. Будь ласка, натисніть Скасувати або Escape, щоб зробити це.\n\nНатиснення Гаразд / Enter проігнорує це попередження і продовжить завантаження <code>.PARTIAL</code> робочого файлу замість цього, що майже напевно дасть вам пошкоджені дані.",
@ -647,6 +649,7 @@ Ls.ukr = {
"rc_md": "відкрити в текстовому редакторі", //m "rc_md": "відкрити в текстовому редакторі", //m
"rc_dl": "завантажити", //m "rc_dl": "завантажити", //m
"rc_zip": "завантажити як архів", //m "rc_zip": "завантажити як архів", //m
"rc_cpl": "копіювати посилання", //m
"rc_del": "видалити", //m "rc_del": "видалити", //m
"rc_cut": "вирізати", //m "rc_cut": "вирізати", //m
"rc_cpy": "копіювати", //m "rc_cpy": "копіювати", //m

View file

@ -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&lt;code&gt;foo bar&lt;/code&gt; = phải chứa cả «foo» và «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = phải chứa «foo» nhưng không chứa «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = bắt đầu bằng «yana» và là tệp «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N&lt;code&gt;2009-12-31&lt;/code&gt; hoặc &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "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&lt;code&gt;foo bar&lt;/code&gt; = phải chứa cả «foo» và «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = phải chứa «foo» nhưng không chứa «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = bắt đầu bằng «yana» và là tệp «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N&lt;code&gt;2009-12-31&lt;/code&gt; hoặc &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;",
"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_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_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", "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_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", "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_up": "Tải lên",
"udt_srch": "Tìm kiếm", "udt_srch": "Tìm kiếm",
"udt_drop": "thả vào đây", "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_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>', "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_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_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_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_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_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 đó", "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_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_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", "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", "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', "f_empty": 'thư mục này trống',
@ -365,6 +363,7 @@ Ls.vie = {
"f_anota": "chỉ {0} trong {1} tệp được chọn;\nđể chọn toàn bộ thư mục, trước tiên hãy kéo xuống cuối", "f_anota": "chỉ {0} trong {1} tệp được chọn;\nđể chọn toàn bộ thư mục, trước tiên hãy kéo xuống cuối",
"f_dls": 'những đường dẫn đến tệp trong thư mục này\nđã được chuyển thành đường dẫn tải trực tiếp', "f_dls": 'những đường dẫn đến tệp trong thư mục này\nđã được chuyển thành đường dẫn tải trực tiếp',
"f_dl_nd": 'bỏ qua thư mục (hãy dùng tải zip/tar thay thế):\n', //m
"f_partial": "Để tải an toàn một tệp đang được tải lên, hãy bấm vào tệp có cùng tên nhưng *không* có phần mở rộng <code>.PARTIAL</code>. Hãy nhấn CANCEL hoặc Escape để thực hiện.\n\nNếu nhấn OK / Enter, cảnh báo sẽ bị bỏ qua và bạn sẽ tải tệp tạm <code>.PARTIAL</code> thay vào đó, gần như chắc chắn dẫn đến dữ liệu bị hỏng.", "f_partial": "Để tải an toàn một tệp đang được tải lên, hãy bấm vào tệp có cùng tên nhưng *không* có phần mở rộng <code>.PARTIAL</code>. Hãy nhấn CANCEL hoặc Escape để thực hiện.\n\nNếu nhấn OK / Enter, cảnh báo sẽ bị bỏ qua và bạn sẽ tải tệp tạm <code>.PARTIAL</code> thay vào đó, gần như chắc chắn dẫn đến dữ liệu bị hỏng.",
@ -378,7 +377,6 @@ Ls.vie = {
"fc_emore": "hãy chọn ít nhất một mục để cắt", "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", "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_sc": "chia sẻ thư mục hiện tại",
"fs_ss": "chia sẻ các tệp đã chọn", "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", "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 +418,6 @@ Ls.vie = {
"fr_efail": "đổi tên thất bại:\n", "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?", "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_ok": "hoàn tất xoá",
"fd_err": "xoá gặp lỗi:\n", "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)?", "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 +457,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_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", "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_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_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", "tv_xe2": "404, không tìm thấy tệp",
@ -478,9 +474,6 @@ Ls.vie = {
"tvt_ctail": "giải mã màu terminal (ansi escape codes)\">🌈", "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ớ)", "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_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_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", "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 +517,6 @@ Ls.vie = {
"s_t1": "tag chứa &nbsp; (^=bắt đầu, kết thúc=$)", "s_t1": "tag chứa &nbsp; (^=bắt đầu, kết thúc=$)",
"s_a1": "thuộc tính metadata cụ thể", "s_a1": "thuộc tính metadata cụ thể",
"md_eshow": "không thể tải", "md_eshow": "không thể tải",
"md_off": "[📜<em>readme</em>] đã tắt trong [⚙️] -- tài liệu bị ẩn", "md_off": "[📜<em>readme</em>] đã tắt trong [⚙️] -- tài liệu bị ẩn",
@ -576,7 +568,6 @@ Ls.vie = {
"un_busy": "đang xóa {0} tệp...", "un_busy": "đang xóa {0} tệp...",
"un_clip": "{0} liên kết đã chép vào bảng nhớ tạm", "un_clip": "{0} liên kết đã chép vào bảng nhớ tạm",
"u_https1": "bạn nên", "u_https1": "bạn nên",
"u_https2": "chuyển sang https", "u_https2": "chuyển sang https",
"u_https3": "để có hiệu suất tốt hơn", "u_https3": "để có hiệu suất tốt hơn",
@ -691,6 +682,7 @@ Ls.vie = {
"rc_md": "mở trong trình soạn thảo văn bản", //m "rc_md": "mở trong trình soạn thảo văn bản", //m
"rc_dl": "tải xuống", //m "rc_dl": "tải xuống", //m
"rc_zip": "tải xuống dưới dạng gói nén", //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_del": "xóa", //m
"rc_cut": "cắt", //m "rc_cut": "cắt", //m
"rc_cpy": "sao chép", //m "rc_cpy": "sao chép", //m

View file

@ -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 # 2025-1217-0014 `v1.19.23` bad apple x2

View file

@ -12,6 +12,8 @@
# p: 3939 # listen on another port # p: 3939 # listen on another port
# ipa: 10.89. # only allow connections from 10.89.* # 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 # df: 16 # stop accepting uploads if less than 16 GB free disk space
# ver # show copyparty version in the controlpanel # ver # show copyparty version in the controlpanel
# grid # show thumbnails/grid-view by default # grid # show thumbnails/grid-view by default

View file

@ -28,7 +28,7 @@ f4b4e330995ebe96c0bd06e16e5b26062ece9473f06d369775aa68eab261dedcf32dfdd159acaa22
00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl 00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl 8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl
a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae packaging-25.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 b9b98714dfca6fa80b0b3f222965724d63be9c54d19435d1fe768e07016913d6db8d6e043fcb185b55a9bd6fe370a80cf961814fc096046a5f4640d99ed575ef pyinstaller-6.15.0-py3-none-win_amd64.whl
cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
1735728ae50e003badc5266638e41a73358f2151405e7888b6dc45697c074a60e6e58c8507b49a3f42d8f4fe4005fbc225cd766ab6582cbf85aa79bab699c08f python-3.13.11-amd64.exe 1735728ae50e003badc5266638e41a73358f2151405e7888b6dc45697c074a60e6e58c8507b49a3f42d8f4fe4005fbc225cd766ab6582cbf85aa79bab699c08f python-3.13.11-amd64.exe

View file

@ -39,7 +39,7 @@ fns=(
MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
mutagen-1.47.0-py3-none-any.whl mutagen-1.47.0-py3-none-any.whl
packaging-25.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-6.15.0-py3-none-win_amd64.whl
pyinstaller_hooks_contrib-2025.8-py3-none-any.whl pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
python-3.13.11-amd64.exe python-3.13.11-amd64.exe

View file

@ -122,6 +122,7 @@ copyparty/web/tl/fin.js,
copyparty/web/tl/fra.js, copyparty/web/tl/fra.js,
copyparty/web/tl/grc.js, copyparty/web/tl/grc.js,
copyparty/web/tl/ita.js, copyparty/web/tl/ita.js,
copyparty/web/tl/jpn.js,
copyparty/web/tl/kor.js, copyparty/web/tl/kor.js,
copyparty/web/tl/nld.js, copyparty/web/tl/nld.js,
copyparty/web/tl/nno.js, copyparty/web/tl/nno.js,

View file

@ -363,6 +363,7 @@ Ls.hmn = {
"mm_eunk": "Unknown Errol", "mm_eunk": "Unknown Errol",
"mm_e404": "Could not play audio; error 404: File not found.", "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_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_e500": "Could not play audio; error 500: Check server logs.",
"mm_e5xx": "Could not play audio; server error ", "mm_e5xx": "Could not play audio; server error ",
"mm_nof": "not finding any more audio files nearby", "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_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", "ur_sm": "Finished;\n{0} files found on server,\n{1} files NOT found on server",
"rc_opn": "Open", "rc_opn": "open",
"rc_ply": "Play", "rc_ply": "play",
"rc_pla": "Play as audio", "rc_pla": "play as audio",
"rc_txt": "Open in file viewer", "rc_txt": "open in textfile viewer",
"rc_md": "Open in markdown editor", "rc_md": "open in text editor",
"rc_dl": "Download", "rc_dl": "download",
"rc_zip": "Download as archive", "rc_zip": "download as archive",
"rc_del": "Delete", "rc_cpl": "copy link",
"rc_cut": "Cut", "rc_del": "delete",
"rc_cpy": "Copy", "rc_cut": "cut",
"rc_pst": "Paste", "rc_cpy": "copy",
"rc_nfo": "New folder", "rc_pst": "paste",
"rc_nfi": "New file", "rc_nfo": "new folder",
"rc_sal": "Select all", "rc_nfi": "new file",
"rc_sin": "Invert selection", "rc_sal": "select all",
"rc_sin": "invert selection",
"lang_set": "refresh to make the change take effect?", "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", "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", "k1": "reset client settings",
"l1": "login for more:", "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" "m1": "welcome back,", // TLNote: "welcome back, USERNAME"
"n1": "404 not found &nbsp;┐( ´ -`)┌", "n1": "404 not found &nbsp;┐( ´ -`)┌",
"o1": 'or maybe you don\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>', "o1": 'or maybe you don\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>',

View file

@ -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", "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", "k1": "reset client settings",
"l1": "login for more:", "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" "m1": "welcome back,", // TLNote: "welcome back, USERNAME"
"n1": "404 not found &nbsp;┐( ´ -`)┌", "n1": "404 not found &nbsp;┐( ´ -`)┌",
"o1": 'or maybe you don\\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>', "o1": 'or maybe you don\\'t have access -- try a password or <a href="' + SR + '/?h">go home</a>',