diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e0b65771..63d78c8b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,10 +7,9 @@ assignees: '9001' --- -NOTE: + ### Describe the bug a description of what the bug is @@ -45,5 +44,11 @@ if the issue is possibly on the client-side, then mention some of the following: * OS version: * browser version: +### The rest of the stack +if you are connecting directly to copyparty then that's cool, otherwise please mention everything else between copyparty and the browser (reverseproxy, tunnels, etc.) + +### Server log +if the issue might be server-related, include everything that appears in the copyparty log during startup, and also anything else you think might be relevant + ### Additional context any other context about the problem here diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 2df6b4bb..390943c9 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,9 +7,9 @@ assignees: '9001' --- -NOTE: + **is your feature request related to a problem? Please describe.** a description of what the problem is, for example, `I'm always frustrated when [...]` or `Why is it not possible to [...]` diff --git a/README.md b/README.md index adcba825..8b9dee9e 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ made in Norway 🇳🇴 * [nix package](#nix-package) - `nix profile install github:9001/copyparty` * [nixos module](#nixos-module) * [browser support](#browser-support) - TLDR: yes +* [server hall of fame](#server-hall-of-fame) - unexpected things that run copyparty * [client examples](#client-examples) - interact with copyparty using non-browser clients * [folder sync](#folder-sync) - sync folders to/from copyparty * [mount as drive](#mount-as-drive) - a remote copyparty server as a local filesystem @@ -193,7 +194,7 @@ some recommended options: * `-e2ts` enables audio metadata indexing (needs either FFprobe or Mutagen) * `-v /mnt/music:/music:r:rw,foo -a foo:bar` shares `/mnt/music` as `/music`, `r`eadable by anyone, and read-write for user `foo`, password `bar` * replace `:r:rw,foo` with `:r,foo` to only make the folder readable by `foo` and nobody else - * see [accounts and volumes](#accounts-and-volumes) (or `--help-accounts`) for the syntax and other permissions + * see [accounts and volumes](#accounts-and-volumes) (or [`--help-accounts`](https://copyparty.eu/cli/#accounts-help-page)) for the syntax and other permissions ### mirrors @@ -450,6 +451,12 @@ upgrade notes * CopyParty? * nope! the name is either copyparty (all-lowercase) or Copyparty -- it's [one word](https://en.wiktionary.org/wiki/copyparty) after all :> +* what is a volflag? + * per-volume configuration; many (not all) global-options can be set as volflags, and most (not all) volflags can be set as global-options; [complete list of volflags](https://copyparty.eu/cli/#flags-help-page) + +* what is a volume? + * a mapping from a URL (`/music/`) to a folder on your server's local filesystem (`C:\Users\ed\Music`) which can then be accessed through copyparty, depending on the permissions and options you set on it -- see [accounts and volumes](#accounts-and-volumes) + * can I change the 🌲 spinning pine-tree loading animation? * [yeah...](https://github.com/9001/copyparty/tree/hovudstraum/docs/rice#boring-loader-spinner) :-( @@ -497,7 +504,7 @@ per-folder, per-user permissions - if your setup is getting complex, consider m * much easier to manage, and you can modify the config at runtime with `systemctl reload copyparty` or more conveniently using the `[reload cfg]` button in the control-panel (if the user has `a`/admin in any volume) * changes to the `[global]` config section requires a restart to take effect -a quick summary can be seen using `--help-accounts` +a quick summary can be seen using [`--help-accounts`](https://copyparty.eu/cli/#accounts-help-page) configuring accounts/volumes with arguments: * `-a usr:pwd` adds account `usr` with password `pwd` @@ -1262,7 +1269,7 @@ see [./srv/expand/](./srv/expand/) for usage and examples * and `PREADME.md` / `preadme.md` is shown above directory listings unless `--no-readme` or `.prologue.html` -* `README.md` and `*logue.html` can contain placeholder values which are replaced server-side before embedding into directory listings; see `--help-exp` +* `README.md` and `*logue.html` can contain placeholder values which are replaced server-side before embedding into directory listings; see [`--help-exp`](https://copyparty.eu/cli/#exp-help-page) ## searching @@ -1292,10 +1299,9 @@ using arguments or config files, or a mix of both: * or click the `[reload cfg]` button in the control-panel if the user has `a`/admin in any volume * changes to the `[global]` config section requires a restart to take effect -**NB:** as humongous as this readme is, there is also a lot of undocumented features. Run copyparty with `--help` to see all available global options; all of those can be used in the `[global]` section of config files, and everything listed in `--help-flags` can be used in volumes as volflags. +**NB:** as humongous as this readme is, there is also a lot of undocumented features. Run copyparty with [`--help`](https://copyparty.eu/cli/) (or click that link) to see all available global options; all of those can be used in the `[global]` section of config files, and everything listed in [`--help-flags`](https://copyparty.eu/cli/#flags-help-page) can be used in volumes as volflags (per-volume configuration). * if running in docker/podman, try this: `docker run --rm -it copyparty/ac --help` -* or see this: https://ocv.me/copyparty/helptext.html -* or if you prefer plaintext, https://ocv.me/copyparty/helptext.txt +* or if you prefer plaintext, https://copyparty.eu/helptext.txt ## zeroconf @@ -1782,6 +1788,8 @@ notes: * `:c,magic` enables filetype detection for nameless uploads, same as `--magic` * needs https://pypi.org/project/python-magic/ `python3 -m pip install --user -U python-magic` * on windows grab this instead `python3 -m pip install --user -U python-magic-bin` +* `cachectl` changes how webbrowser will cache responses (the `Cache-Control` response-header); default is `no-cache` which will prevent repeated downloading of the same file unless necessary (browser will ask copyparty if the file has changed) + * adding `?cache` to a link will override this with "fully cache this for 69 seconds"; `?cache=321` is 321 seconds, and `?cache=i` is 7 days ## database location @@ -1888,7 +1896,7 @@ trigger a program on uploads, renames etc ([examples](./bin/hooks/)) you can set hooks before and/or after an event happens, and currently you can hook uploads, moves/renames, and deletes -there's a bunch of flags and stuff, see `--help-hooks` +there's a bunch of flags and stuff, see [`--help-hooks`](https://copyparty.eu/cli/#hooks-help-page) if you want to write your own hooks, see [devnotes](./docs/devnotes.md#event-hooks) @@ -2411,6 +2419,8 @@ it comes with a [systemd service](./contrib/systemd/copyparty@.service) as well after installing, start either the system service or the user service and navigate to http://127.0.0.1:3923 for further instructions (unless you already edited the config files, in which case you are good to go, probably) +> to start the systemd service, either do `systemctl start --user copyparty` to start it as your own user, or `systemctl start copyparty@bob` to use unix-user `bob` + ## fedora package @@ -2623,6 +2633,15 @@ quick summary of more eccentric web-browsers trying to view a directory index:
' + el.innerHTML + '';
+ try {
+ el = QS('#doc>code');
+ el.className = 'language-json';
+ Prism.highlightElement(el);
+ }
+ catch (ex) { }
+ btn.setAttribute('download', ebi('docname').innerHTML);
+ btn.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(jt));
+ };
+
r.mktree = function () {
var top = get_evpath().slice(SR.length),
crumbs = linksplit(top).join('/'),
@@ -5187,6 +5240,7 @@ var showfile = (function () {
'\n' +
@@ -5206,6 +5260,7 @@ var showfile = (function () {
ebi('prevdoc').onclick = function () { tree_neigh(-1); };
ebi('nextdoc').onclick = function () { tree_neigh(1); };
ebi('seldoc').onclick = r.tglsel;
+ ebi('ppjdoc').onclick = r.ppj;
bcfg_bind(r, 'wrap', 'wrapdoc', true, r.tglwrap);
bcfg_bind(r, 'taildoc', 'taildoc', false, r.tgltail);
bcfg_bind(r, 'tail2end', 'tail2end', true);
@@ -5880,6 +5935,7 @@ var ahotkeys = function (e) {
return;
var k = (e.key || e.code) + '', pos = -1, n,
+ sh = e.shiftKey,
ae = document.activeElement,
aet = ae && ae != document.body ? ae.nodeName.toLowerCase() : '';
@@ -6002,7 +6058,7 @@ var ahotkeys = function (e) {
if (k == '?')
return hkhelp();
- if (!e.shiftKey && ctrl(e)) {
+ if (!sh && ctrl(e)) {
var sel = window.getSelection && window.getSelection() || {};
sel = sel && !sel.isCollapsed && sel.direction != 'none';
@@ -6021,7 +6077,16 @@ var ahotkeys = function (e) {
return;
}
- if (e.shiftKey && kl != 'a' && kl != 'd')
+ if (showfile.active()) {
+ if (!sh && kl == 's')
+ return showfile.tglsel() || true;
+ if (!sh && kl == 'e' && ebi('editdoc').style.display != 'none')
+ return ebi('editdoc').click() || true;
+ if (sh && kl == 'j')
+ return showfile.ppj(e) || true;
+ }
+
+ if (sh && kl != 'a' && kl != 'd')
return;
if (/^[0-9]$/.test(k))
@@ -6070,7 +6135,7 @@ var ahotkeys = function (e) {
if (k == 'F2')
return fileman.rename();
- if (!treectl.hidden && (!e.shiftKey || !thegrid.en)) {
+ if (!treectl.hidden && (!sh || !thegrid.en)) {
if (kl == 'a')
return QS('#twig').click();
@@ -6078,13 +6143,6 @@ var ahotkeys = function (e) {
return QS('#twobytwo').click();
}
- if (showfile.active()) {
- if (kl == 's')
- showfile.tglsel();
- if (kl == 'e' && ebi('editdoc').style.display != 'none')
- ebi('editdoc').click();
- }
-
if (mp && mp.au && !mp.au.paused) {
if (kl == 's')
return sel_song();
@@ -6600,6 +6658,9 @@ var treectl = (function () {
mentered = null,
treesz = clamp(icfg_get('treesz', 16), 10, 50);
+ if (/[?&]dlni\b/.exec(sloc0))
+ swrite('dlni', /[?&]dlni=0\b/.exec(sloc0) ? 0 : 1);
+
var resort = function () {
ENATSORT = NATSORT && clgot(ebi('nsort'), 'on');
treectl.gentab(get_evpath(), treectl.lsc);
@@ -6608,6 +6669,7 @@ var treectl = (function () {
bcfg_bind(r, 'idxh', 'idxh', idxh, setidxh);
bcfg_bind(r, 'dyn', 'dyntree', true, onresize);
bcfg_bind(r, 'csel', 'csel', dgsel);
+ bcfg_bind(r, 'dlni', 'dlni', dlni, resort);
bcfg_bind(r, 'dots', 'dotfiles', see_dots, function (v) {
r.goto();
setck('dots=' + (v ? 'y' : ''));
@@ -7157,6 +7219,14 @@ var treectl = (function () {
dth3x = res.dth3x;
dk = res.dk;
+ dlni = res.dlni;
+ if (!sread('dlni'))
+ clmod(ebi('dlni'), 'on', treectl.dlni = dlni);
+
+ dgrid = res.dgrid;
+ if (!sread('griden'))
+ clmod(ebi('griden'), 'on', thegrid.en = dgrid);
+
srvinf = res.srvinf;
if (rtt !== null)
srvinf += (srvinf ? ' // rtt: ' : 'rtt: ') + rtt;
@@ -7343,6 +7413,11 @@ var treectl = (function () {
html.push('');
html = html.join('\n');
set_files_html(html);
+ if (r.dlni) {
+ var o = QSA('#files a[id]');
+ for (var a = 0, aa = o.length; a < aa; a++)
+ o[a].setAttribute('download', '');
+ }
if (r.trunc) {
r.setlazy(plain);
if (!r.ask) {
@@ -7463,7 +7538,7 @@ var treectl = (function () {
catch (ex) { }
};
- r.showmore = function (n) {
+ r.showmore = function (n, cb) {
window.removeEventListener('scroll', r.tscroll);
console.log('nvis {0} -> {1}'.format(r.nvis, n));
r.nvis = n;
@@ -7473,6 +7548,8 @@ var treectl = (function () {
setTimeout(function () {
r.gentab(get_evpath(), r.lsc);
ebi('wrap').style.opacity = CLOSEST ? 'unset' : 1;
+ if (cb)
+ cb();
}, 1);
};
@@ -8169,7 +8246,12 @@ var settheme = (function () {
freshen();
};
- freshen();
+ var m = /[?&]theme=([0-9]+)/.exec(sloc0);
+ if (m)
+ r.go(parseInt(m[1]));
+ else
+ freshen();
+
return r;
})();
@@ -9380,14 +9462,3 @@ function reload_browser() {
msel.render();
}
treectl.hydrate();
-
-if (!fullui && (window.ui_nombar || /[?&]nombar\b/.exec(sloc0))) ebi('ops').style.display = 'none';
-if (!fullui && (window.ui_noacci || /[?&]noacci\b/.exec(sloc0))) ebi('acc_info').style.display = 'none';
-if (!fullui && (window.ui_nosrvi || /[?&]nosrvi\b/.exec(sloc0))) ebi('srv_info').style.display = 'none';
-if (!fullui && (window.ui_nocpla || /[?&]nocpla\b/.exec(sloc0))) ebi('goh').style.display = 'none';
-if (!fullui && (window.ui_nolbar || /[?&]nolbar\b/.exec(sloc0))) ebi('wfp').style.display = 'none';
-if (!fullui && (window.ui_noctxb || /[?&]noctxb\b/.exec(sloc0))) ebi('wtoggle').style.display = 'none';
-if (!fullui && (window.ui_norepl || /[?&]norepl\b/.exec(sloc0))) ebi('repl').style.display = 'none';
-
-var m = /[?&]theme=([0-9]+)/.exec(sloc0);
-if (m) settheme.go(parseInt(m[1]));
diff --git a/copyparty/web/md.html b/copyparty/web/md.html
index 1dfed659..f2148a91 100644
--- a/copyparty/web/md.html
+++ b/copyparty/web/md.html
@@ -22,7 +22,8 @@
editor
.txt", //m
+ "nmd_i1": "还可以添加需要的文件扩展名,例如 .md", //m
"nmd_i2": "由于没有删除权限,你只能创建 .md 文件", //m
"tv_load": "加载文本文件:\n\n{0}\n\n{1}% ({2} 的 {3} MiB 已加载)",
@@ -449,6 +452,7 @@ Ls.chi = {
"tvt_prev": "显示上一个文档$N快捷键: i\">⬆ 上一个",
"tvt_next": "显示下一个文档$N快捷键: K\">⬇ 下一个",
"tvt_sel": "选择文件 (用于剪切/删除/...)$N快捷键: S\">选择",
+ "tvt_j": "美化json$N快捷键: shift-J\">j", //m
"tvt_edit": "在文本编辑器中打开文件$N快捷键: E\">✏️ 编辑",
"tvt_tail": "监视文件更改,并实时显示新增的行\">📡 跟踪", //m
"tvt_wrap": "自动换行\">↵", //m
@@ -674,6 +678,8 @@ Ls.chi = {
"ta1": "请先输入新密码",
"ta2": "重复以确认新密码:",
"ta3": "发现拼写错误;请重试",
+ "nop": "错误:密码不能为空", //m
+ "nou": "错误:用户名和/或密码不能为空", //m
"aa1": "正在接收的文件:", //m
"ab1": "关闭 k304",
"ac1": "开启 k304",
diff --git a/copyparty/web/tl/cze.js b/copyparty/web/tl/cze.js
index cfe65526..75006c9e 100644
--- a/copyparty/web/tl/cze.js
+++ b/copyparty/web/tl/cze.js
@@ -84,6 +84,8 @@ Ls.cze = {
["M", "zavřít textový soubor"],
["E", "upravit textový soubor"],
["S", "vybrat soubor (pro vyjmutí/kopírování/přejmenování)"],
+ ["Y", "stáhnout textový soubor"], //m
+ ["⇧ J", "zkrášlit json"], //m
]
],
@@ -227,6 +229,7 @@ Ls.cze = {
"ct_ttips": '◔ ◡ ◔">ℹ️ nápovědy',
"ct_thumb": 'v zobrazení mřížky přepnout ikony nebo náhledy$NKlávesová zkratka: T">🖼️ náhledy',
"ct_csel": 'použít CTRL a SHIFT pro výběr souborů v zobrazení mřížky">výběr',
+ "ct_dl": 'vynutit stažení (nezobrazovat inline) při kliknutí na soubor">dl', //m
"ct_ihop": 'když se zavře prohlížeč obrázků, posunout dolů k naposledy zobrazenému souboru">g⮯',
"ct_dots": 'zobrazit skryté soubory (pokud to server povoluje)">dotfiles',
"ct_qdel": 'při mazání souborů požádat o potvrzení jen jednou">rychlé mazání',
@@ -441,7 +444,7 @@ Ls.cze = {
"fcp_both_b": 'KopírovatNahrát',
"mk_noname": "napište název do textového pole vlevo předtím než to uděláte :p",
- "nmd_i1": "můžeš také přidat příponu souboru, například .txt", //m
+ "nmd_i1": "můžeš také přidat příponu souboru, například .md", //m
"nmd_i2": "můžeš vytvářet pouze .md soubory, protože nemáš oprávnění mazat", //m
"tv_load": "Načítání textového dokumentu:\n\n{0}\n\n{1}% ({2} z {3} MiB načteno)",
@@ -453,6 +456,7 @@ Ls.cze = {
"tvt_prev": "zobrazit předchozí dokument$NKlávesová zkratka: i\">⬆ předchozí",
"tvt_next": "zobrazit následující dokument$NKlávesová zkratka: K\">⬇ další",
"tvt_sel": "vybrat soubor ( pro vyjmutí / kopírování / mazání / ... )$NKlávesová zkratka: S\">výběr",
+ "tvt_j": "zkrášlit json$NKlávesová zkratka: shift-J\">j", //m
"tvt_edit": "otevřít soubor v textovém editoru$NKlávesová zkratka: E\">✏️ upravit",
"tvt_tail": "sledovat soubor pro změny; zobrazit nové řádky v reálném čase\">📡 sledovat",
"tvt_wrap": "zalamování slov\">↵",
@@ -678,11 +682,14 @@ Ls.cze = {
"ta1": "nejprve vyplňte své nové heslo",
"ta2": "zopakujte pro potvrzení nového hesla:",
"ta3": "nalezen překlep; zkuste to prosím znovu",
+ "nop": "CHYBA: Heslo nesmí být prázdné", //m
+ "nou": "CHYBA: Uživatelské jméno a/nebo heslo nesmí být prázdné", //m
"aa1": "příchozí soubory:",
"ab1": "deaktivovat no304",
"ac1": "povolit no304",
"ad1": "povolení no304 deaktivuje veškeré mezipaměti; zkuste to, pokud k304 nestačilo. To ovšem zapříčíní obrovské množství síťového provozu!",
"ae1": "aktivní stahování:",
"af1": "zobrazit nedávné nahrávání",
+ "ag1": "zobrazit známé uživatele IdP", //m
}
};
diff --git a/copyparty/web/tl/deu.js b/copyparty/web/tl/deu.js
index 4ef76896..62c4d001 100644
--- a/copyparty/web/tl/deu.js
+++ b/copyparty/web/tl/deu.js
@@ -84,6 +84,8 @@ Ls.deu = {
["M", "Textdatei schliessen"],
["E", "Textdatei bearbeiten"],
["S", "Textdatei auswählen (für Ausschneiden / Kopieren / Umbenennen)"],
+ ["Y", "Textdatei herunterladen"], //m
+ ["⇧ J", "json verschönern"], //m
]
],
@@ -223,6 +225,7 @@ Ls.deu = {
"ct_ttips": '◔ ◡ ◔">ℹ️ Tooltips',
"ct_thumb": 'In Raster-Ansicht, zwischen Icons und Vorschau wechseln$NHotkey: T">🖼️ Vorschaubilder',
"ct_csel": 'Benutze STRG und UMSCHALT für Dateiauswahl in Raster-Ansicht">sel',
+ "ct_dl": 'Herunterladen erzwingen (nicht inline anzeigen), wenn eine datei angeklickt wird">dl', //m
"ct_ihop": 'Wenn die Bildanzeige geschlossen ist, scrolle runter zu den zuletzt angesehenen Dateien">g⮯',
"ct_dots": 'Verstecke Dateien anzeigen (wenn erlaubt durch Server)">dotfiles',
"ct_qdel": 'Nur einmal fragen, wenn mehrere Dateien gelöscht werden">qdel',
@@ -437,7 +440,7 @@ Ls.deu = {
"fcp_both_b": 'KopierenHochladen',
"mk_noname": "Tipp' mal vorher lieber einen Namen in das Textfeld links, bevor du das machst :p",
- "nmd_i1": "Fügen Sie auch die gewünschte Dateiendung hinzu, z. B. .txt", //m
+ "nmd_i1": "Fügen Sie auch die gewünschte Dateiendung hinzu, z. B. .md", //m
"nmd_i2": "Sie können nur .md-Dateien erstellen, da Ihnen die Löschberechtigung fehlt", //m
"tv_load": "Textdatei wird geladen:\n\n{0}\n\n{1}% ({2} von {3} MiB geladen)",
@@ -449,6 +452,7 @@ Ls.deu = {
"tvt_prev": "Vorheriges Dokument zeigen$NHotkey: i\">⬆ vorh.",
"tvt_next": "Nächstes Dokument zeigen$NHotkey: K\">⬇ nächst.",
"tvt_sel": "Wählt diese Datei aus ( zum Ausschneiden / Kopieren / Löschen / ... )$NHotkey: S\">ausw.",
+ "tvt_j": "json verschönern$NHotkey: shift-J\">j", //m
"tvt_edit": "Datei im Texteditor zum Bearbeiten öffnen$NHotkey: E\">✏️ bearb.",
"tvt_tail": "Datei auf Veränderungen überwachen; Neue Zeilen werden in Echtzeit angezeigt\">📡 folgen",
"tvt_wrap": "Zeilenumbruch\">↵",
@@ -674,11 +678,14 @@ Ls.deu = {
"ta1": "Trage zuerst dein Passwort ein",
"ta2": "Wiederhole dein Passwort zur Bestätigung:",
"ta3": "Da stimmt etwas nicht; probier's nochmal",
+ "nop": "FEHLER: Passwort darf nicht leer sein", //m
+ "nou": "FEHLER: Benutzername und/oder Passwort dürfen nicht leer sein", //m
"aa1": "Eingehende Dateien:",
"ab1": "no304 deaktivieren",
"ac1": "no304 aktivieren",
"ad1": "Das Aktivieren von no304 deaktiviert jegliche Form von Caching; probier dies, wenn k304 nicht genug war. Dies verschwendet eine grosse Menge Netzwerk-Traffic!",
"ae1": "Aktive Downloads:",
"af1": "Zeige neue Uploads",
+ "ag1": "Bekannte IdP-Benutzer anzeigen", //m
}
};
diff --git a/copyparty/web/tl/epo.js b/copyparty/web/tl/epo.js
index c5a310c5..0d254491 100644
--- a/copyparty/web/tl/epo.js
+++ b/copyparty/web/tl/epo.js
@@ -84,6 +84,8 @@ Ls.epo = {
["M", "fermi dosieron"],
["E", "redakti dosieron"],
["S", "elekti dosieron (por eltondado/kopiado/alinomado)"],
+ ["Y", "elŝuti tekstodosieron"], //m
+ ["⇧ J", "beligi json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.epo = {
"ct_ttips": '◔ ◡ ◔">ℹ️ ŝpruchelpiloj',
"ct_thumb": 'dum krado-vido, baskuli montradon de simboloj aŭ bildetoj$NFulmoklavo: T">🖼️ bildetoj',
"ct_csel": 'uzi STIR kaj MAJ por elekti dosierojn en krado-vido">elekto',
+ "ct_dl": 'devigi elŝuton (ne montri enkadre) kiam dosiero estas alklakita">dl', //m
"ct_ihop": 'montri la lastan viditan bildo-dosieron post fermado de bildo-vidilo">g⮯',
"ct_dots": 'montri kaŝitajn dosierojn (se servilo permesas)">kaŝitaj',
"ct_qdel": 'peti konfirmon nur unufoje antaŭ forigado">rapid-forig.',
@@ -437,7 +440,7 @@ Ls.epo = {
"fcp_both_b": 'KopiiAlŝuti',
"mk_noname": "tajpu nomon en tekstokampo maldekstre antaŭ vi faras ĉi tion :p",
- "nmd_i1": "vi povas aldoni la deziratan sufikson, ekzemple .txt", //m
+ "nmd_i1": "vi povas aldoni la deziratan sufikson, ekzemple .md", //m
"nmd_i2": "vi povas krei nur .md-dosierojn ĉar vi ne havas forigan permeson", //m
"tv_load": "Ŝargado de teksto-dokumento:\n\n{0}\n\n{1}% ({2} da {3} MiB ŝargita)",
@@ -449,6 +452,7 @@ Ls.epo = {
"tvt_prev": "montri malsekvan dokumenton$NFulmoklavo: i\">⬆ malsekva",
"tvt_next": "montri sekvan dokumenton$NFulmoklavo: K\">⬇ sekva",
"tvt_sel": "elekti dosieron ( por eltondado / kopiado / forigado / ... )$NFulmoklavo: S\">elekti",
+ "tvt_j": "beligi json$NFulmoklavo: shift-J\">j", //m
"tvt_edit": "malfermi dosieron en teksto-redaktilo$NFulmoklavo: E\">✏️ redakti",
"tvt_tail": "observi ŝanĝojn en dosiero; novaj linioj estos tuje montritaj\">📡 gvati",
"tvt_wrap": "linifaldo\">↵",
@@ -674,6 +678,8 @@ Ls.epo = {
"ta1": "entajpu novan pasvorton unue",
"ta2": "retajpu por konfirmi:",
"ta3": "tajpo-eraro; bonvolu provu denove",
+ "nop": "ERARO: Pasvorto ne povas esti malplena", //m
+ "nou": "ERARO: Uzantnomo kaj/aŭ pasvorto ne povas esti malplena", //m
"aa1": "aktivaj alŝutoj:",
"ab1": "malŝalti no304-on",
"ac1": "ŝalti no304-on",
diff --git a/copyparty/web/tl/fin.js b/copyparty/web/tl/fin.js
index cd396221..8e493341 100644
--- a/copyparty/web/tl/fin.js
+++ b/copyparty/web/tl/fin.js
@@ -84,6 +84,8 @@ Ls.fin = {
["M", "sulje tekstitiedosto"],
["E", "muokkaa tekstitiedostoa"],
["S", "valitse tiedosto (leikkausta/kopiointia/uudelleennimeämistä varten)"],
+ ["Y", "lataa tekstitiedosto"], //m
+ ["⇧ J", "kaunista json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.fin = {
"ct_ttips": '◔ ◡ ◔">ℹ️ vihjelaatikot',
"ct_thumb": 'valitse kuvakkeiden / pienoiskuvien välillä kuvanäkymässä $NPikanäppäin: T">🖼️ pienoiskuvat',
"ct_csel": 'käytä CTRL ja SHIFT tiedostojen valintaan kuvanäkymässä">valitse',
+ "ct_dl": 'pakota lataus (älä näytä upotettuna), kun tiedostoa napsautetaan">dl', //m
"ct_ihop": 'kun kuvakatselin suljetaan, vieritä alas viimeksi katsottuun tiedostoon">g⮯',
"ct_dots": 'näytä piilotetut tiedostot (jos palvelin sallii)">piilotiedostot',
"ct_qdel": 'kysy vahvistusta vain kerran tiedostoja poistaessa">qdel',
@@ -437,7 +440,7 @@ Ls.fin = {
"fcp_both_b": 'KopioiLähetä',
"mk_noname": "kirjoita nimi vasemmalla olevaan tekstikenttään ennen kuin teet tuon :p",
- "nmd_i1": "voit myös lisätä haluamasi tiedostopäätteen, esimerkiksi .txt", //m
+ "nmd_i1": "voit myös lisätä haluamasi tiedostopäätteen, esimerkiksi .md", //m
"nmd_i2": "voit luoda vain .md-tiedostoja, koska sinulla ei ole poistolupaa", //m
"tv_load": "Ladataan tekstidokumenttia:\n\n{0}\n\n{1}% ({2} / {3} Mt ladattu)",
@@ -449,6 +452,7 @@ Ls.fin = {
"tvt_prev": "näytä edellinen dokumentti$NPikanäppäin: i\">⬆ edell",
"tvt_next": "näytä seuraava dokumentti$NPikanäppäin: K\">⬇ seur",
"tvt_sel": "valitse tiedosto ( leikkausta / kopiointia / poistoa / ... varten )$NPikanäppäin: S\">val",
+ "tvt_j": "kaunista json$NPikanäppäin: shift-J\">j", //m
"tvt_edit": "avaa tiedosto tekstieditorissa$NPikanäppäin: E\">✏️ muokkaa",
"tvt_tail": "seuraa tiedoston muutoksia; näytä uudet rivit reaaliaikaisesti\">📡 seuraa",
"tvt_wrap": "rivitys\">↵",
@@ -674,6 +678,8 @@ Ls.fin = {
"ta1": "täytä ensin uusi salasana",
"ta2": "toista vahvistaaksesi uuden salasanan:",
"ta3": "löytyi kirjoitusvirhe; yritä uudelleen",
+ "nop": "VIRHE: Salasana ei voi olla tyhjä", //m
+ "nou": "VIRHE: Käyttäjänimi ja/tai salasana ei voi olla tyhjä", //m
"aa1": "saapuvat:",
"ab1": "poista no304 käytöstä",
"ac1": "ota no304 käyttöön",
diff --git a/copyparty/web/tl/fra.js b/copyparty/web/tl/fra.js
index 5fabeccb..e95625ce 100644
--- a/copyparty/web/tl/fra.js
+++ b/copyparty/web/tl/fra.js
@@ -84,6 +84,8 @@ Ls.fra = {
["M", "fermer le fichier texte"],
["E", "modifier le fichier texte"],
["S", "sélectioner le fichier (pour le couper/copier/renommer)"],
+ ["Y", "télécharger le fichier texte"], //m
+ ["⇧ J", "embellir json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.fra = {
"ct_ttips": '◔ ◡ ◔">ℹ️ infobulles',
"ct_thumb": 'vue en grille, activer les icônes ou les miniatures$NHotkey: T">🖼️ minia',
"ct_csel": 'utiliser CTRL et MAJ pour selectioner des fichiers en vue en grille">sel',
+ "ct_dl": 'forcer le téléchargement (ne pas afficher en ligne) lorsqu’un fichier est cliqué">dl', //m
"ct_ihop": 'quand le visionneuse d\'image est fermé, faire defiller vers le bas jusqu\'au dernier fichier">g⮯',
"ct_dots": 'voir les fichiers caché (si le serveur le permet)">dotfiles',
"ct_qdel": 'ne demander qu\'une confirmation lors de la suppression de fichiers>qdel',
@@ -437,7 +440,7 @@ Ls.fra = {
"fcp_both_b": 'CopierTéléverser',
"mk_noname": "entrez un nom dans le champ de texte à gauche avant de faire ça :p",
- "nmd_i1": "ajoutez aussi l’extension souhaitée, par exemple .txt", //m
+ "nmd_i1": "ajoutez aussi l’extension souhaitée, par exemple .md", //m
"nmd_i2": "vous ne pouvez créer que des fichiers .md car vous n’avez pas la permission d’effacer", //m
"tv_load": "Chargement du document texte:\n\n{0}\n\n{1}% ({2} de {3} MiB chargés)",
@@ -449,6 +452,7 @@ Ls.fra = {
"tvt_prev": "montrer le document précédent$NHotkey: i\">⬆ précédent",
"tvt_next": "montrer le document suivant$NHotkey: K\">⬇ suivant",
"tvt_sel": "sélectionner le fichier ( pour couper / copier / supprimer / … )$NHotkey: S\">sel",
+ "tvt_j": "embellir json$NHotkey: shift-J\">j", //m
"tvt_edit": "ouvrir le fichier dans l'éditeur de texte$NHotkey: E\">✏️ modifier",
"tvt_tail": "surveiller le fichier pour les changements; montrer les nouvelles lignes en temps réel\">📡 suivre",
"tvt_wrap": "retour à la ligne\">↵",
@@ -674,11 +678,14 @@ Ls.fra = {
"ta1": "entrez d'abord votre nouveau mot de passe",
"ta2": "répétez pour confirmer le nouveau mot de passe :",
"ta3": "une faute de frappe a été détectée ; veuillez réessayer.",
+ "nop": "ERREUR : Le mot de passe ne peut pas être vide", //m
+ "nou": "ERREUR : Le nom d’utilisateur et/ou le mot de passe ne peut pas être vide", //m
"aa1": "fichiers entrants :",
"ab1": "désactiver no304",
"ac1": "activer no304",
"ad1": "l'activation de no304 désactivera toute mise en cache ; essayez ceci si k304 n'était pas suffisant. Cela va générer un trafic réseau considérable !",
"ae1": "téléchargements actifs :",
"af1": "afficher les derniers téléchargements",
+ "ag1": "afficher les utilisateurs IdP connus", //m
}
};
diff --git a/copyparty/web/tl/grc.js b/copyparty/web/tl/grc.js
index 987fc37f..c730d317 100644
--- a/copyparty/web/tl/grc.js
+++ b/copyparty/web/tl/grc.js
@@ -83,7 +83,9 @@ Ls.grc = {
["I/K", "προηγούμενο/επόμενο αρχείο"],
["M", "κλείσιμο αρχείου"],
["E", "επεξεργασία αρχείου"],
- ["S", "επιλογή αρχείου (για αποκοπή/αντιγραφή/μετονομασία)"]
+ ["S", "επιλογή αρχείου (για αποκοπή/αντιγραφή/μετονομασία)"],
+ ["Y", "λήψη αρχείου κειμένου"], //m
+ ["⇧ J", "ομορφοποίηση json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.grc = {
"ct_ttips": '◔ ◡ ◔">ℹ️ συμβουλές εργαλείων',
"ct_thumb": 'σε προβολή πλέγματος, εναλλαγή εικονιδίων ή μικρογραφιών$NΠλήκτρο συντόμευσης: T">🖼️ μικρογραφίες',
"ct_csel": 'χρησιμοποίησε CTRL και SHIFT για επιλογή αρχείων σε προβολή πλέγματος">επιλογή',
+ "ct_dl": 'εξαναγκασμός λήψης (να μην εμφανίζεται ενσωματωμένα) όταν γίνεται κλικ σε ένα αρχείο">dl', //m
"ct_ihop": 'όταν η προβολή εικόνων κλείνει, κάνε scroll στο τελευταίο προβαλλόμενο αρχείο">g⮯',
"ct_dots": 'εμφάνιση κρυφών αρχείων (αν το επιτρέπει ο server)">dotfiles',
"ct_qdel": 'όταν διαγράφεις αρχεία, ζήτα επιβεβαίωση μόνο μία φορά">γρήγορη διαγραφή',
@@ -437,7 +440,7 @@ Ls.grc = {
"fcp_both_b": 'ΑντιγραφήΜεταφόρτωση',
"mk_noname": "γράψε ένα όνομα στο πεδίο κειμένου αριστερά πριν το κάνεις :p",
- "nmd_i1": "μπορείτε επίσης να προσθέσετε την κατάληξη που θέλετε, όπως .txt", //m
+ "nmd_i1": "μπορείτε επίσης να προσθέσετε την κατάληξη που θέλετε, όπως .md", //m
"nmd_i2": "μπορείτε να δημιουργήσετε μόνο αρχεία .md επειδή δεν έχετε δικαίωμα διαγραφής", //m
"tv_load": "Φόρτωση αρχείου κειμένου:\n\n{0}\n\n{1}% ({2} από {3} MiB φορτωμένα)",
@@ -449,6 +452,7 @@ Ls.grc = {
"tvt_prev": "προβολή προηγούμενου εγγράφου$NΣυντόμευση: i\">⬆ προηγούμενο",
"tvt_next": "προβολή επόμενου εγγράφου$NΣυντόμευση: K\">⬇ επόμενο",
"tvt_sel": "επέλεξε αρχείο (για αποκοπή / αντιγραφή / διαγραφή / ...)$NΣυντόμευση: S\">επιλογή",
+ "tvt_j": "ομορφοποίηση json$NΣυντόμευση: shift-J\">j", //m
"tvt_edit": "άνοιγμα αρχείου στον επεξεργαστή κειμένου$NΣυντόμευση: E\">✏️ επεξεργασία",
"tvt_tail": "παρακολούθηση αρχείου για αλλαγές; εμφάνιση νέων γραμμών σε πραγματικό χρόνο\">📡 παρακολούθηση",
"tvt_wrap": "αναδίπλωση λέξεων\">↵",
@@ -674,11 +678,14 @@ Ls.grc = {
"ta1": "συμπλήρωσε πρώτα το νέο σου κωδικό",
"ta2": "επανέλαβε για να επιβεβαιώσεις το νέο κωδικό:",
"ta3": "βρέθηκε τυπογραφικό λάθος· δοκίμασε ξανά",
+ "nop": "ΣΦΑΛΜΑ: Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός", //m
+ "nou": "ΣΦΑΛΜΑ: Το όνομα χρήστη και/ή ο κωδικός πρόσβασης δεν μπορεί να είναι κενό", //m
"aa1": "εισερχόμενα αρχεία:",
"ab1": "απενεργοποίηση no304",
"ac1": "ενεργοποίηση no304",
"ad1": "η ενεργοποίηση του no304 θα απενεργοποιήσει όλη την προσωρινή αποθήκευση· δοκίμασέ το αν το k304 δεν ήταν αρκετό. Προσοχή, θα σπαταλήσει τεράστιο όγκο δικτυακής κίνησης!",
"ae1": "ενεργές μεταφορτώσεις:",
"af1": "προβολή πρόσφατων μεταφορτώσεων",
+ "ag1": "εμφάνιση γνωστών χρηστών IdP", //m
}
};
diff --git a/copyparty/web/tl/ita.js b/copyparty/web/tl/ita.js
index 63712d5f..465f44e3 100644
--- a/copyparty/web/tl/ita.js
+++ b/copyparty/web/tl/ita.js
@@ -84,6 +84,8 @@ Ls.ita = {
["M", "chiudi file di testo"],
["E", "modifica file di testo"],
["S", "seleziona file (per taglia/copia/rinomina)"],
+ ["Y", "scarica il file di testo"], //m
+ ["⇧ J", "abbellire json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.ita = {
"ct_ttips": '◔ ◡ ◔">ℹ️ tooltip',
"ct_thumb": 'nella vista griglia, alterna icone o miniature$NTasto rapido: T">🖼️ miniature',
"ct_csel": 'usa CTRL e SHIFT per la selezione file nella vista griglia">sel',
+ "ct_dl": 'forza il download (non visualizzare inline) quando si clicca su un file">dl', //m
"ct_ihop": 'quando il visualizzatore immagini è chiuso, scorri fino all\'ultimo file visualizzato">g⮯',
"ct_dots": 'mostra file nascosti (se il server lo permette)">dotfile',
"ct_qdel": 'quando elimini file, chiedi conferma solo una volta">qdel',
@@ -437,7 +440,7 @@ Ls.ita = {
"fcp_both_b": 'CopiaCarica',
"mk_noname": "scrivi un nome nel campo di testo a sinistra prima di farlo :p",
- "nmd_i1": "puoi anche aggiungere l’estensione che vuoi, per esempio .txt", //m
+ "nmd_i1": "puoi anche aggiungere l’estensione che vuoi, per esempio .md", //m
"nmd_i2": "puoi creare solo file .md perché non hai il permesso di eliminare", //m
"tv_load": "Caricando documento di testo:\n\n{0}\n\n{1}% ({2} di {3} MiB caricati)",
@@ -449,6 +452,7 @@ Ls.ita = {
"tvt_prev": "mostra documento precedente$NTasto rapido: i\">⬆ prec",
"tvt_next": "mostra documento successivo$NTasto rapido: K\">⬇ succ",
"tvt_sel": "seleziona file ( per taglia / copia / elimina / ... )$NTasto rapido: S\">sel",
+ "tvt_j": "abbellire json$NTasto rapido: shift-J\">j", //m
"tvt_edit": "apri file nell'editor di testo$NTasto rapido: E\">✏️ modifica",
"tvt_tail": "monitora file per cambiamenti; mostra nuove righe in tempo reale\">📡 segui",
"tvt_wrap": "a capo parola\">↵",
@@ -674,6 +678,8 @@ Ls.ita = {
"ta1": "devi prima inserire una nuova password",
"ta2": "ripeti per confermare la nuova password:",
"ta3": "errore di digitazione; riprova",
+ "nop": "ERRORE: La password non può essere vuota", //m
+ "nou": "ERRORE: Il nome utente e/o la password non possono essere vuoti", //m
"aa1": "in arrivo:",
"ab1": "disattiva no304",
"ac1": "attiva no304",
diff --git a/copyparty/web/tl/kor.js b/copyparty/web/tl/kor.js
index 19446466..454ad9b2 100644
--- a/copyparty/web/tl/kor.js
+++ b/copyparty/web/tl/kor.js
@@ -84,6 +84,8 @@ Ls.kor = {
["M", "텍스트 파일 닫기"],
["E", "텍스트 파일 편집"],
["S", "파일 선택 (잘라내기/복사/이름 바꾸기용)"],
+ ["Y", "텍스트 파일 다운로드"], //m
+ ["⇧ J", "json 미화"], //m
]
],
@@ -223,6 +225,7 @@ Ls.kor = {
"ct_ttips": '◔ ◡ ◔">ℹ️ 도움말',
"ct_thumb": '그리드 보기에서 아이콘 또는 미리보기 이미지 전환$N단축키: T">🖼️ 미리보기',
"ct_csel": '그리드 보기에서 CTRL과 SHIFT를 사용하여 파일 선택">선택',
+ "ct_dl": '파일을 클릭하면 다운로드를 강제로 수행 (인라인으로 표시하지 않음)">dl', //m
"ct_ihop": '이미지 뷰어를 닫으면 마지막으로 본 파일로 스크롤">g⮯',
"ct_dots": '숨김 파일 표시 (서버가 허용하는 경우)">숨김파일',
"ct_qdel": '파일 삭제 시 한 번만 확인 요청">빠른삭제',
@@ -437,7 +440,7 @@ Ls.kor = {
"fcp_both_b": '복사업로드',
"mk_noname": "왼쪽 텍스트 필드에 이름을 먼저 입력해주세요 :p",
- "nmd_i1": "원하는 파일 확장자를 추가할 수 있습니다. 예: .txt", //m
+ "nmd_i1": "원하는 파일 확장자를 추가할 수 있습니다. 예: .md", //m
"nmd_i2": "삭제 권한이 없어서 .md 파일만 만들 수 있습니다", //m
"tv_load": "텍스트 문서 불러오는 중:\n\n{0}\n\n{1}% ({3} MiB 중 {2} MiB 로드됨)",
@@ -449,6 +452,7 @@ Ls.kor = {
"tvt_prev": "이전 문서 보기$N단축키: i\">⬆ 이전",
"tvt_next": "다음 문서 보기$N단축키: K\">⬇ 다음",
"tvt_sel": "파일 선택 (잘라내기/복사/삭제/...용)$N단축키: S\">선택",
+ "tvt_j": "json 미화$N단축키: shift-J\">j", //m
"tvt_edit": "텍스트 편집기에서 파일 열기$N단축키: E\">✏️ 편집",
"tvt_tail": "파일 변경 사항 모니터링; 실시간으로 새 줄 표시\">📡 팔로우",
"tvt_wrap": "자동 줄 바꿈\">↵",
@@ -674,6 +678,8 @@ Ls.kor = {
"ta1": "새 비밀번호를 먼저 입력하세요",
"ta2": "새 비밀번호 확인을 위해 다시 입력하세요:",
"ta3": "오타가 있습니다. 다시 시도해주세요",
+ "nop": "오류: 비밀번호를 비워 둘 수 없습니다", //m
+ "nou": "오류: 사용자 이름 및/또는 비밀번호를 비워 둘 수 없습니다", //m
"aa1": "수신 중인 파일:",
"ab1": "no304 비활성화",
"ac1": "no304 활성화",
diff --git a/copyparty/web/tl/nld.js b/copyparty/web/tl/nld.js
index 870a0991..8f494479 100644
--- a/copyparty/web/tl/nld.js
+++ b/copyparty/web/tl/nld.js
@@ -84,6 +84,8 @@ Ls.nld = {
["M", "sluit tekst bestand"],
["E", "bewerk tekst bestand"],
["S", "selecteer bestand (voor knip/kopie/hernoem)"],
+ ["Y", "tekst bestand downloaden"], //m
+ ["⇧ J", "json verfraaien"], //m
]
],
@@ -223,6 +225,7 @@ Ls.nld = {
"ct_ttips": '◔ ◡ ◔">ℹ️ tooltips',
"ct_thumb": 'In grid-overzicht, wissel tussen iconen of thumbnails$NHotkey: T">🖼️ thumbs',
"ct_csel": 'Gebruik CTRL en SHIFT voor de bestand selectie in grid-overzicht>sel',
+ "ct_dl": 'download afdwingen (niet inline weergeven) wanneer op een bestand wordt geklikt">dl', //m
"ct_ihop": 'Als je afbeeldingviewer afsluit, scroll omlaag naar de laatst bekeken bestand">g⮯',
"ct_dots": 'Laat verborgen bestanden zien (als de server dat toestaat)">dotfiles',
"ct_qdel": 'Waneeer je een bestand verwijderd, vraag eenmalig om bevestiging">qdel',
@@ -437,7 +440,7 @@ Ls.nld = {
"fcp_both_b": 'KopieerUpload',
"mk_noname": "Voer een naam in het tekstveld aan de linkerkant voordat je verder gaat :p",
- "nmd_i1": "Voeg ook de gewenste extensie toe, bijvoorbeeld .txt", //m
+ "nmd_i1": "Voeg ook de gewenste extensie toe, bijvoorbeeld .md", //m
"nmd_i2": "Je kunt alleen .md-bestanden maken omdat je geen verwijderrechten hebt", //m
"tv_load": "Tekstdocument laden:\n\n{0}\n\n{1}% ({2} van de {3} MiB geladen)",
@@ -449,6 +452,7 @@ Ls.nld = {
"tvt_prev": "Vorig document tonen$NHotkey: i\">⬆ prev",
"tvt_next": "Volgende document tonen$NHotkey: K\">⬇ next",
"tvt_sel": "Selecteer bestand ( voor knip / verplaats / verwijder / ... )$NHotkey: S\">sel",
+ "tvt_j": "json verfraaien$NHotkey: shift-J\">j", //m
"tvt_edit": "Bestand openen in teksteditor$NHotkey: E\">✏️ bewerk",
"tvt_tail": "Bestand controleren op wijzigingen; nieuwe regels in realtime weergeven\">📡 volgen",
"tvt_wrap": "Automatische terugloop\">↵",
@@ -674,6 +678,8 @@ Ls.nld = {
"ta1": "Je moet eerst een nieuw wachtwoord invoeren",
"ta2": "Herhaal om nieuw wachtwoord te bevestigen:",
"ta3": "Typefout gevonden; probeer het opnieuw",
+ "nop": "FOUT: Wachtwoord mag niet leeg zijn", //m
+ "nou": "FOUT: Gebruikersnaam en/of wachtwoord mag niet leeg zijn", //m
"aa1": "Inkomend:",
"ab1": "Schakel nr. 304 uit",
"ac1": "Schakel nr. 304 in",
diff --git a/copyparty/web/tl/nno.js b/copyparty/web/tl/nno.js
index 6966ee90..41829abb 100644
--- a/copyparty/web/tl/nno.js
+++ b/copyparty/web/tl/nno.js
@@ -82,6 +82,7 @@ Ls.nno = {
["E", "redigér tekstdokument"],
["S", "markér fil (for F2/ctrl-x/...)"],
["Y", "last ned tekstfil"],
+ ["⇧ J", "formattér json"],
]
],
@@ -221,6 +222,7 @@ Ls.nno = {
"ct_ttips": 'vis hjelpetekst ved å holde musa over ting">ℹ️ tips',
"ct_thumb": 'vis miniatyrbilder i staden for ikon$NSnarvei: T">🖼️ bilder',
"ct_csel": 'bruk tastane CTRL og SHIFT for markering av filer i ikonvising">merk',
+ "ct_dl": 'last ned filer (ikkje vis i nettleseren)">dl',
"ct_ihop": 'bla ned åt sist viste bilde når bildevisaren lukkast">g⮯',
"ct_dots": 'vis skjulte filer (gitt at serveren tillèt det)">.synlig',
"ct_qdel": 'sletteknappen spør berre éin gong om stadfesting">hurtig🗑️',
@@ -435,7 +437,7 @@ Ls.nno = {
"fcp_both_b": 'KopiérLast opp',
"mk_noname": "skriv inn eit namn i tekstboksa åt venstre først :p",
- "nmd_i1": "leggja også til filendinga du vil, til dømes .txt", //m
+ "nmd_i1": "leggja også til filendinga du vil, til dømes .md", //m
"nmd_i2": "du kan berre laga .md-filer fordi du ikkje har delete-tilgang", //m
"tv_load": "Lastar inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lasta ned)",
@@ -447,6 +449,7 @@ Ls.nno = {
"tvt_prev": "vis førre dokument$NSnarvei: i\">⬆ forr.",
"tvt_next": "vis neste dokument$NSnarvei: K\">⬇ neste",
"tvt_sel": "markér fila ( for utklipp / sletting / ... )$NSnarvei: S\">merk",
+ "tvt_j": "formattér json$NSnarvei: shift-J\">j",
"tvt_edit": "redigér fila$NSnarvei: E\">✏️ endre",
"tvt_tail": "overvak fila for endringar og vis nye linjer i sanntid\">📡 følg",
"tvt_wrap": "tekstbryting\">↵",
@@ -672,6 +675,8 @@ Ls.nno = {
"ta1": "du må skrive eit nytt passord først",
"ta2": "gjenta for å stadfeste nytt passord:",
"ta3": "fant ein skrivefeil; vennligst prøv igjen",
+ "nop": "FEIL: Passord kan ikkje vere tomt",
+ "nou": "FEIL: Brukarnamn og passord må fyllast ut",
"aa1": "innkommande:",
"ab1": "skru av no304",
"ac1": "skru på no304",
diff --git a/copyparty/web/tl/nor.js b/copyparty/web/tl/nor.js
index 12967339..f943b3b8 100644
--- a/copyparty/web/tl/nor.js
+++ b/copyparty/web/tl/nor.js
@@ -82,6 +82,7 @@ Ls.nor = {
["E", "rediger tekstdokument"],
["S", "marker fil (for F2/ctrl-x/...)"],
["Y", "last ned tekstfil"],
+ ["⇧ J", "formattér json"],
]
],
@@ -221,6 +222,7 @@ Ls.nor = {
"ct_ttips": 'vis hjelpetekst ved å holde musen over ting">ℹ️ tips',
"ct_thumb": 'vis miniatyrbilder istedenfor ikoner$NSnarvei: T">🖼️ bilder',
"ct_csel": 'bruk tastene CTRL og SHIFT for markering av filer i ikonvisning">merk',
+ "ct_dl": 'last ned filer (ikke vis i nettleseren)">dl',
"ct_ihop": 'bla ned til sist viste bilde når bildeviseren lukkes">g⮯',
"ct_dots": 'vis skjulte filer (gitt at serveren tillater det)">.synlig',
"ct_qdel": 'sletteknappen spør bare én gang om bekreftelse">hurtig🗑️',
@@ -435,7 +437,7 @@ Ls.nor = {
"fcp_both_b": 'KopiérLast opp',
"mk_noname": "skriv inn et navn i tekstboksen til venstre først :p",
- "nmd_i1": "legg også til ønsket filtype, for eksempel .txt", //m
+ "nmd_i1": "legg også til ønsket filtype, for eksempel .md", //m
"nmd_i2": "du kan bare lage .md-filer fordi du ikke har delete-tilgang", //m
"tv_load": "Laster inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lastet ned)",
@@ -447,6 +449,7 @@ Ls.nor = {
"tvt_prev": "vis forrige dokument$NSnarvei: i\">⬆ forr.",
"tvt_next": "vis neste dokument$NSnarvei: K\">⬇ neste",
"tvt_sel": "markér filen ( for utklipp / sletting / ... )$NSnarvei: S\">merk",
+ "tvt_j": "formattér json$NSnarvei: shift-J\">j",
"tvt_edit": "redigér filen$NSnarvei: E\">✏️ endre",
"tvt_tail": "overvåk filen for endringer og vis nye linjer i sanntid\">📡 følg",
"tvt_wrap": "tekstbryting\">↵",
@@ -672,6 +675,8 @@ Ls.nor = {
"ta1": "du må skrive et nytt passord først",
"ta2": "gjenta for å bekrefte nytt passord:",
"ta3": "fant en skrivefeil; vennligst prøv igjen",
+ "nop": "FEIL: Passord kan ikke være blankt",
+ "nou": "FEIL: Både brukernavn og passord må angis",
"aa1": "innkommende:",
"ab1": "skru av no304",
"ac1": "skru på no304",
diff --git a/copyparty/web/tl/pol.js b/copyparty/web/tl/pol.js
index 86d8a983..d564b4bb 100644
--- a/copyparty/web/tl/pol.js
+++ b/copyparty/web/tl/pol.js
@@ -84,6 +84,8 @@ Ls.pol = {
["M", "zamknij plik"],
["E", "edytuj plik"],
["S", "wybierz plik (do wycięcia/skopiowania/zmiany nazwy)"],
+ ["Y", "pobierz plik tekstowy"], //m
+ ["⇧ J", "upiększ json"], //m
]
],
@@ -226,6 +228,7 @@ Ls.pol = {
"ct_ttips": '◔ ◡ ◔">ℹ️ podpowiedzi',
"ct_thumb": 'w widoku siatki, przełącz ikony i miniaturki$NSkrót: T">🖼️ miniaturki',
"ct_csel": 'użyj CTRL i SHIFT do wybierania plików w widoku siatki">wybierz',
+ "ct_dl": 'wymuś pobieranie (nie wyświetlaj inline) po kliknięciu pliku">dl', //m
"ct_ihop": 'przejdź do ostatniego pliku po zamknięciu przeglądarki obrazów">g⮯',
"ct_dots": 'pokaż ukryte pliki (jeśli pozwala serwer)">ukryte',
"ct_qdel": 'pytaj o potwierdzenie przy usuwaniu tylko raz">pyt. us.',
@@ -440,7 +443,7 @@ Ls.pol = {
"fcp_both_b": 'KopiujPrześlij',
"mk_noname": "wpisz nazwę do pola po lewej zanim to zrobisz :p",
- "nmd_i1": "możesz też dodać wybrane rozszerzenie, np. .txt", //m
+ "nmd_i1": "możesz też dodać wybrane rozszerzenie, np. .md", //m
"nmd_i2": "możesz tworzyć tylko pliki .md, ponieważ nie masz uprawnień do usuwania", //m
"tv_load": "Wczytywanie pliku tekstowego:\n\n{0}\n\n{1}% (wczytano {2} z {3} MiB)",
@@ -452,6 +455,7 @@ Ls.pol = {
"tvt_prev": "pokaż poprzedni dokument$NSkrót: i\">⬆ poprzedni",
"tvt_next": "pokaż następny dokument$NSkrót: K\">⬇ następny",
"tvt_sel": "wybierz plik ( do wycięcia / skopiowania / usunięcia / itp. )$NSkrót: S\">wyb",
+ "tvt_j": "upiększ json$NSkrót: shift-J\">j", //m
"tvt_edit": "otwórz plik w edytorze tekstu$NSkrót: E\">✏️ edytuj",
"tvt_tail": "śledź zmiany w pliku; pokazuj nowe linie w czasie rzeczywistym\">📡 śledź",
"tvt_wrap": "zawijaj tekst\">↵",
@@ -677,6 +681,8 @@ Ls.pol = {
"ta1": "najpierw wprowadź nowe hasło",
"ta2": "powtórz hasło dla potwierdzenia:",
"ta3": "znaleziono literówkę, spróbuj ponownie",
+ "nop": "BŁĄD: Hasło nie może być puste", //m
+ "nou": "BŁĄD: Nazwa użytkownika i/lub hasło nie może być puste", //m
"aa1": "pliki przychodzące:",
"ab1": "wyłącz no304",
"ac1": "włącz no304",
diff --git a/copyparty/web/tl/por.js b/copyparty/web/tl/por.js
index 6e2d45b0..aef5cdd5 100644
--- a/copyparty/web/tl/por.js
+++ b/copyparty/web/tl/por.js
@@ -84,6 +84,8 @@ Ls.por = {
["M", "fechar arquivo de texto"],
["E", "editar arquivo de texto"],
["S", "selecionar arquivo (para recortar/copiar/renomear)"],
+ ["Y", "baixar arquivo de texto"], //m
+ ["⇧ J", "embelezar json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.por = {
"ct_ttips": '◔ ◡ ◔">ℹ️ dicas de ferramentas',
"ct_thumb": 'na visualização de grade, alternar entre ícones ou miniaturas$NHotkey: T">🖼️ miniaturas',
"ct_csel": 'usar CTRL e SHIFT para seleção de arquivo na visualização de grade">sel',
+ "ct_dl": 'forçar download (não exibir inline) ao clicar em um arquivo">dl', //m
"ct_ihop": 'quando o visualizador de imagens for fechado, rolar para o último arquivo visualizado">g⮯',
"ct_dots": 'mostrar arquivos ocultos (se o servidor permitir)">dotfiles',
"ct_qdel": 'ao excluir arquivos, pedir confirmação apenas uma vez">qdel',
@@ -437,7 +440,7 @@ Ls.por = {
"fcp_both_b": 'CopiarEnviar',
"mk_noname": "digite um nome no campo de texto à esquerda antes de fazer isso :p",
- "nmd_i1": "também pode adicionar a extensão desejada, por exemplo .txt", //m
+ "nmd_i1": "também pode adicionar a extensão desejada, por exemplo .md", //m
"nmd_i2": "só pode criar ficheiros .md porque não tem permissão para apagar", //m
"tv_load": "Carregando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB carregados)",
@@ -449,6 +452,7 @@ Ls.por = {
"tvt_prev": "mostrar documento anterior$NHotkey: i\">⬆ anterior",
"tvt_next": "mostrar próximo documento$NHotkey: K\">⬇ próximo",
"tvt_sel": "selecionar arquivo ( para recortar / copiar / excluir / ... )$NHotkey: S\">sel",
+ "tvt_j": "embelezar json$NHotkey: shift-J\">j", //m
"tvt_edit": "abrir arquivo no editor de texto$NHotkey: E\">✏️ editar",
"tvt_tail": "monitorar arquivo para alterações; mostrar novas linhas em tempo real\">📡 seguir",
"tvt_wrap": "quebra de linha\">↵",
@@ -674,6 +678,8 @@ Ls.por = {
"ta1": "primeiro digite sua nova senha",
"ta2": "repita para confirmar a nova senha:",
"ta3": "há um erro; por favor, tente novamente",
+ "nop": "ERRO: A senha não pode estar em branco", //m
+ "nou": "ERRO: O nome de usuário e/ou a senha não podem estar em branco", //m
"aa1": "arquivos de entrada:",
"ab1": "desativar no304",
"ac1": "ativar no304",
diff --git a/copyparty/web/tl/rus.js b/copyparty/web/tl/rus.js
index 7c7f005b..2578f15a 100644
--- a/copyparty/web/tl/rus.js
+++ b/copyparty/web/tl/rus.js
@@ -84,6 +84,8 @@ Ls.rus = {
["M", "закрыть файл"],
["E", "отредактировать файл"],
["S", "выделить файл"],
+ ["Y", "скачать текстовый файл"], //m
+ ["⇧ J", "приукрасить json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.rus = {
"ct_ttips": '◔ ◡ ◔">ℹ️ подсказки',
"ct_thumb": 'переключение между иконками и миниатюрами в режиме сетки$NГорячая клавиша: T">🖼️ миниат.',
"ct_csel": 'держите CTRL или SHIFT для выделения файлов в режиме сетки">выбор',
+ "ct_dl": 'принудительная загрузка (не показывать встроенно) при щелчке по файлу">dl', //m
"ct_ihop": 'показывать последний открытый файл после закрытия просмотрщика изображений">g⮯',
"ct_dots": 'показывать скрытые файлы (если есть доступ)">скрыт.',
"ct_qdel": 'спрашивать подтверждение только один раз перед удалением файлов">быстр. удал.',
@@ -437,7 +440,7 @@ Ls.rus = {
"fcp_both_b": 'СкопироватьЗагрузить',
"mk_noname": "введите имя в текстовое поле слева перед тем, как это делать :p",
- "nmd_i1": "вы также можете указать нужное расширение, например .txt", //m
+ "nmd_i1": "вы также можете указать нужное расширение, например .md", //m
"nmd_i2": "вы можете создавать только файлы .md, так как у вас нет разрешения на удаление", //m
"tv_load": "Загружаю текстовый документ:\n\n{0}\n\n{1}% ({2} из {3} МиБ загружено)",
@@ -449,6 +452,7 @@ Ls.rus = {
"tvt_prev": "показать предыдущий документ$NГорячая клавиша: i\">⬆ пред",
"tvt_next": "показать следующий документ$NГорячая клавиша: K\">⬇ след",
"tvt_sel": "выбрать документ ( для вырезания / копирования / удаления / ... )$NГорячая клавиша: S\">выд",
+ "tvt_j": "приукрасить json$NГорячая клавиша: shift-J\">j", //m
"tvt_edit": "открыть документ в текстовом редакторе$NГорячая клавиша: E\">✏️ изменить",
"tvt_tail": "проверять файл на изменения; показывать новые строки в реальном времени\">📡 обновлять",
"tvt_wrap": "перенос слов\">↵",
@@ -674,6 +678,8 @@ Ls.rus = {
"ta1": "сначала введите свой новый пароль",
"ta2": "повторите новый пароль:",
"ta3": "опечатка; попробуйте снова",
+ "nop": "ОШИБКА: Пароль не может быть пустым", //m
+ "nou": "ОШИБКА: Имя пользователя и/или пароль не могут быть пустыми", //m
"aa1": "входящие файлы:",
"ab1": "отключить no304",
"ac1": "включить no304",
diff --git a/copyparty/web/tl/spa.js b/copyparty/web/tl/spa.js
index 27b13163..c2864003 100644
--- a/copyparty/web/tl/spa.js
+++ b/copyparty/web/tl/spa.js
@@ -83,7 +83,9 @@ Ls.spa = {
["I/K", "anterior/siguiente archivo"],
["M", "cerrar archivo"],
["E", "editar archivo"],
- ["S", "seleccionar archivo (para cortar/copiar/renombrar)"]
+ ["S", "seleccionar archivo (para cortar/copiar/renombrar)"],
+ ["Y", "descargar archivo de texto"], //m
+ ["⇧ J", "embellecer json"], //m
]
],
@@ -222,6 +224,7 @@ Ls.spa = {
"ct_ttips": '◔ ◡ ◔">ℹ️ tooltips',
"ct_thumb": 'en vista de cuadrícula, alternar iconos o miniaturas$NAtajo: T">🖼️ miniaturas',
"ct_csel": 'usa CTRL y SHIFT para seleccionar archivos en la vista de cuadrícula">sel',
+ "ct_dl": 'forzar descarga (no mostrar en línea) al hacer clic en un archivo">dl', //m
"ct_ihop": 'al cerrar el visor de imágenes, desplazarse hasta el último archivo visto">g⮯',
"ct_dots": 'mostrar archivos ocultos (si el servidor lo permite)">archivos ocultos',
"ct_qdel": 'al eliminar archivos, pedir confirmación solo una vez">elim. rápida',
@@ -436,7 +439,7 @@ Ls.spa = {
"fcp_both_b": "CopiarSubir",
"mk_noname": "escribe un nombre en el campo de texto de la izquierda antes de hacer eso :p",
- "nmd_i1": "también puedes añadir la extensión que quieras, por ejemplo .txt", //m
+ "nmd_i1": "también puedes añadir la extensión que quieras, por ejemplo .md", //m
"nmd_i2": "solo puedes crear archivos .md porque no tienes permiso para borrar", //m
"tv_load": "Cargando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB cargados)",
@@ -448,6 +451,7 @@ Ls.spa = {
"tvt_prev": "mostrar documento anterior$NAtajo: i\">⬆ ant",
"tvt_next": "mostrar siguiente documento$NAtajo: K\">⬇ sig",
"tvt_sel": "seleccionar archivo ( para cortar / copiar / eliminar / ... )$NAtajo: S\">sel",
+ "tvt_j": "embellecer json$NAtajo: shift-J\">j", //m
"tvt_edit": "abrir archivo en editor de texto$NAtajo: E\">✏️ editar",
"tvt_tail": "monitorizar cambios en el archivo; mostrar nuevas líneas en tiempo real\">📡 seguir",
"tvt_wrap": "ajuste de línea\">↵",
@@ -673,6 +677,8 @@ Ls.spa = {
"ta1": "primero escribe tu nueva contraseña",
"ta2": "repite para confirmar la nueva contraseña:",
"ta3": "hay un error; por favor, inténtalo de nuevo",
+ "nop": "ERROR: La contraseña no puede estar vacía", //m
+ "nou": "ERROR: El nombre de usuario y/o la contraseña no pueden estar vacíos", //m
"aa1": "archivos entrantes:",
"ab1": "desactivar no304",
"ac1": "activar no304",
diff --git a/copyparty/web/tl/swe.js b/copyparty/web/tl/swe.js
index 34daf87a..3ffd8eed 100644
--- a/copyparty/web/tl/swe.js
+++ b/copyparty/web/tl/swe.js
@@ -84,6 +84,8 @@ Ls.swe = {
["M", "stäng textfil"],
["E", "redigera textfil"],
["S", "välj fil"],
+ ["Y", "ladda ner textfil"], //m
+ ["⇧ J", "försköna json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.swe = {
"ct_ttips": '◔ ◡ ◔">ℹ️ tips',
"ct_thumb": 'växla mellan miniatyrer och ikoner i rutnätsvyn$NSnabbtangent: T">🖼️ miniatyrer',
"ct_csel": 'använd CTRL och SKIFT för urval av filer i rutnätsvyn">val',
+ "ct_dl": 'tvinga nedladdning (visa inte inline) när en fil klickas">dl', //m
"ct_ihop": 'skrolla till den senast visade filen när bildvisaren stängs">g⮯',
"ct_dots": 'visa dolda filer (om servern tillåter detta)">dolda',
"ct_qdel": 'bekräfta endast en gång när filer raderas">srad',
@@ -437,7 +440,7 @@ Ls.swe = {
"fcp_both_b": 'KopieraLadda upp',
"mk_noname": "skriv ett namn i fältet till vänster först :p",
- "nmd_i1": "lägg också till filändelsen du vill ha, till exempel .txt", //m
+ "nmd_i1": "lägg också till filändelsen du vill ha, till exempel .md", //m
"nmd_i2": "du kan bara skapa .md-filer eftersom du inte har borttagningsbehörighet", //m
"tv_load": "Laddar textfil:\n\n{0}\n\n{1}% ({2} av {3} MiB laddat)",
@@ -449,6 +452,7 @@ Ls.swe = {
"tvt_prev": "visa föregående fil$NSnabbtangent: i\">⬆ föreg.",
"tvt_next": "visa nästa fil$NSnabbtangent: K\">⬇ nästa",
"tvt_sel": "välj fil ( för klipp / kopiera / radera / ... )$NSnabbtangent: S\">välj",
+ "tvt_j": "försköna json$NSnabbtangent: shift-J\">j", //m
"tvt_edit": "öppna fil i textredigerare$NSnabbtangent: E\">✏️ redigera",
"tvt_tail": "övervaka filen; visa nya rader i realtid\">📡 övervaka",
"tvt_wrap": "automatisk radbrytning\">↵",
@@ -674,6 +678,8 @@ Ls.swe = {
"ta1": "fyll i ditt nya lösenord",
"ta2": "upprepa det nya lösenordet:",
"ta3": "det blev fel; vänligen försök igen",
+ "nop": "FEL: Lösenordet får inte vara tomt", //m
+ "nou": "FEL: Användarnamn och/eller lösenord får inte vara tomt", //m
"aa1": "inkommande filer:",
"ab1": "avaktivera no304",
"ac1": "aktivera no304",
diff --git a/copyparty/web/tl/tur.js b/copyparty/web/tl/tur.js
index fe44438a..2aafd3d7 100644
--- a/copyparty/web/tl/tur.js
+++ b/copyparty/web/tl/tur.js
@@ -84,6 +84,8 @@ Ls.tur = {
["M", "metin dosyasını kapat"],
["E", "metin dosyasını düzenle"],
["S", "dosyayı seç (kes/kopyala/yeniden adlandır)"],
+ ["Y", "metin dosyasını indir"], //m
+ ["⇧ J", "json güzelleştir"], //m
]
],
@@ -223,6 +225,7 @@ Ls.tur = {
"ct_ttips": '◔ ◡ ◔">ℹ️ ipuçları',
"ct_thumb": 'ızgara görünümünde, simgeler ve küçük resimler arasında geçiş yapın$NKısayol: T">🖼️ küçük resimler',
"ct_csel": 'ızgara görünümünde dosya seçimi için CTRL ve SHIFT tuşlarını kullanın">seç',
+ "ct_dl": 'dosyaya tıklandığında indirmeyi zorla (satır içinde görüntüleme)">dl', //m
"ct_ihop": 'resim görüntüleyici kapatıldığında, en son görüntülenen dosyaya kaydırın">g⮯',
"ct_dots": 'gizli dosyaları göster (sunucu izin veriyorsa)">nokta dosyaları',
"ct_qdel": 'dosyaları silerken yalnız bir kez onay isteyin">qdel',
@@ -437,7 +440,7 @@ Ls.tur = {
"fcp_both_b": 'KopyalaYükle',
"mk_noname": "bunu yapmadan önce soldaki boşluğa bir şeyler yazsana :p",
- "nmd_i1": "ayrıca istediğin dosya uzantısını ekleyebilirsin, örneğin .txt", //m
+ "nmd_i1": "ayrıca istediğin dosya uzantısını ekleyebilirsin, örneğin .md", //m
"nmd_i2": "silme iznin olmadığı için yalnızca .md dosyaları oluşturabilirsin", //m
"tv_load": "Metin belgesi yükleniyor:\n\n{0}\n\n{1}% ({2} of {3} MiB yüklendi)",
@@ -449,6 +452,7 @@ Ls.tur = {
"tvt_prev": "önceki belgeyi göster$NKısayol: i\">⬆ önceki",
"tvt_next": "sonraki belgeyi göster$NKısayol: K\">⬇ sonraki",
"tvt_sel": "dosyayı seç$NKısayol: S\">seç",
+ "tvt_j": "json güzelleştir$NKısayol: shift-J\">j", //m
"tvt_edit": "dosyayı metin düzenleyicisinde aç$NKısayol: E\">✏️ düzenle",
"tvt_tail": "dosyalardaki değişiklikleri izle; yeni satırları gerçek zamanlı göster\">📡 takip",
"tvt_wrap": "kelime sarma\">↵",
@@ -669,11 +673,14 @@ Ls.tur = {
"ta1": "ilk önce yeni şifreyi doldur",
"ta2": "yeni şifreyi onaylamak için tekrar girin:",
"ta3": "bir yazım hatası bulundu; lütfen tekrar deneyin",
+ "nop": "HATA: Parola boş olamaz", //m
+ "nou": "HATA: Kullanıcı adı ve/veya parola boş olamaz", //m
"aa1": "gelen dosyalar:",
"ab1": "no304'ü devre dışı bırak",
"ac1": "no304'ü etkinleştir",
"ad1": "no304'ü etkinleştirmek, tüm önbelleği devre dışı bırakır; bunu k304 yeterli olmadıysa deneyin. Bu, büyük miktarda ağ trafiği israf edecektir!",
"ae1": "aktif indirmeler:",
"af1": "son yüklemeleri göster",
+ "ag1": "bilinen IdP kullanıcılarını göster", //m
}
};
diff --git a/copyparty/web/tl/ukr.js b/copyparty/web/tl/ukr.js
index f542494a..9d336516 100644
--- a/copyparty/web/tl/ukr.js
+++ b/copyparty/web/tl/ukr.js
@@ -84,6 +84,8 @@ Ls.ukr = {
["M", "закрити текстовий файл"],
["E", "редагувати текстовий файл"],
["S", "вибрати файл (для вирізання/копіювання/перейменування)"],
+ ["Y", "завантажити текстовий файл"], //m
+ ["⇧ J", "прикрасити json"], //m
]
],
@@ -223,6 +225,7 @@ Ls.ukr = {
"ct_ttips": '◔ ◡ ◔">ℹ️ підказки',
"ct_thumb": 'у режимі сітки, перемкнути іконки або мініатюри$NГаряча клавіша: T">🖼️ мініатюри',
"ct_csel": 'використовувати CTRL і SHIFT для вибору файлів у режимі сітки">вибір',
+ "ct_dl": 'примусове завантаження (не показувати вбудовано) під час натискання на файл">dl', //m
"ct_ihop": 'коли переглядач зображень закрито, прокрутити вниз до останнього переглянутого файлу">g⮯',
"ct_dots": 'показати приховані файли (якщо сервер дозволяє)">приховані файли',
"ct_qdel": 'при видаленні файлів, запитати підтвердження лише один раз">швидке видалення',
@@ -437,7 +440,7 @@ Ls.ukr = {
"fcp_both_b": 'СкопіюватиЗавантажити',
"mk_noname": "введіть ім'я в текстове поле зліва перед тим, як робити це :p",
- "nmd_i1": "ви також можете додати потрібне розширення, наприклад .txt", //m
+ "nmd_i1": "ви також можете додати потрібне розширення, наприклад .md", //m
"nmd_i2": "ви можете створювати тільки файли .md, оскільки не маєте дозволу на видалення", //m
"tv_load": "Завантаження текстового документа:\n\n{0}\n\n{1}% ({2} з {3} MiB завантажено)",
@@ -449,6 +452,7 @@ Ls.ukr = {
"tvt_prev": "показати попередній документ$NГаряча клавіша: i\">⬆ попер",
"tvt_next": "показати наступний документ$NГаряча клавіша: K\">⬇ наст",
"tvt_sel": "вибрати файл ( для вирізання / копіювання / видалення / ... )$NГаряча клавіша: S\">вибр",
+ "tvt_j": "прикрасити json$NГаряча клавіша: shift-J\">j", //m
"tvt_edit": "відкрити файл в текстовому редакторі$NГаряча клавіша: E\">✏️ редагувати",
"tvt_tail": "моніторити файл на зміни; показувати нові рядки в реальному часі\">📡 слідкувати",
"tvt_wrap": "перенесення слів\">↵",
@@ -674,6 +678,8 @@ Ls.ukr = {
"ta1": "спочатку заповніть ваш новий пароль",
"ta2": "повторіть для підтвердження нового пароля:",
"ta3": "описка; спробуйте знову",
+ "nop": "ПОМИЛКА: Пароль не може бути порожнім", //m
+ "nou": "ПОМИЛКА: Ім’я користувача та/або пароль не можуть бути порожніми", //m
"aa1": "вхідні файли:",
"ab1": "вимкнути no304",
"ac1": "увімкнути no304",
diff --git a/copyparty/web/tl/vie.js b/copyparty/web/tl/vie.js
new file mode 100644
index 00000000..32cde8b9
--- /dev/null
+++ b/copyparty/web/tl/vie.js
@@ -0,0 +1,730 @@
+Ls.vie = {
+ "tt": "Tiếng Việt",
+
+ "cols": {
+ "c": "nút hành động",
+ "dur": "thời lượng",
+ "q": "chất lượng / bitrate",
+ "Ac": "codec âm thanh",
+ "Vc": "codec video",
+ "Fmt": "định dạng / container",
+ "Ahash": "checksum âm thanh",
+ "Vhash": "checksum video",
+ "Res": "độ phân giải",
+ "T": "loại tệp",
+ "aq": "chất lượng âm thanh / bitrate",
+ "vq": "chất lượng video / bitrate",
+ "pixfmt": "subsampling / pixel structure",
+ "resw": "độ phân giải ngang",
+ "resh": "độ phân giải dọc",
+ "chs": "kênh âm thanh",
+ "hz": "tốc độ lấy mẫu",
+ },
+
+ "hks": [
+ [
+ "misc",
+ ["ESC", "đóng nhiều mục"],
+
+ "file-manager",
+ ["G", "chuyển đổi chế độ xem danh sách / lưới"],
+ ["T", "chuyển đổi ảnh thu nhỏ / biểu tượng"],
+ ["⇧ A/D", "kích thước ảnh thu nhỏ"],
+ ["ctrl-K", "xoá mục đã chọn"],
+ ["ctrl-X", "cắt mục đã chọn vào bảng nhớ tạm"],
+ ["ctrl-C", "sao chép mục đã chọn vào bảng nhớ tạm"],
+ ["ctrl-V", "dán (di chuyển/sao chép) tại đây"],
+ ["Y", "tải xuống mục đã chọn"],
+ ["F2", "đổi tên mục đã chọn"],
+
+ "file-list-sel",
+ ["space", "chuyển đổi chọn tệp"],
+ ["↑/↓", "di chuyển con trỏ chọn"],
+ ["ctrl ↑/↓", "di chuyển con trỏ và khung nhìn"],
+ ["⇧ ↑/↓", "chọn tệp trước / sau"],
+ ["ctrl-A", "chọn tất cả tệp / thư mục"],
+ ], [
+ "navigation",
+ ["B", "chuyển đổi đường dẫn / thanh điều hướng"],
+ ["I/K", "thư mục trước / sau"],
+ ["M", "thư mục cha (hoặc thu gọn hiện tại)"],
+ ["V", "chuyển đổi thư mục / tệp văn bản trong thanh điều hướng"],
+ ["A/D", "kích thước thanh điều hướng"],
+ ], [
+ "audio-player",
+ ["J/L", "bài trước / sau"],
+ ["U/O", "lùi / tiến 10 giây"],
+ ["0..9", "nhảy đến 0%..90%"],
+ ["P", "phát/tạm dừng (cũng khởi động)"],
+ ["S", "chọn bài đang phát"],
+ ["Y", "tải xuống bài hát"],
+ ], [
+ "image-viewer",
+ ["J/L, ←/→", "ảnh trước / sau"],
+ ["Home/End", "ảnh đầu / cuối"],
+ ["F", "toàn màn hình"],
+ ["R", "xoay theo chiều kim đồng hồ"],
+ ["⇧ R", "xoay ngược chiều kim đồng hồ"],
+ ["S", "chọn ảnh"],
+ ["Y", "tải xuống ảnh"],
+ ], [
+ "video-player",
+ ["U/O", "lùi / tiến 10 giây"],
+ ["P/K/Space", "phát/tạm dừng"],
+ ["C", "tiếp tục phát bài tiếp theo"],
+ ["V", "vòng lặp"],
+ ["M", "tắt tiếng"],
+ ["[ and ]", "đặt khoảng lặp"],
+ ], [
+ "textfile-viewer",
+ ["I/K", "tệp trước / sau"],
+ ["M", "đóng tệp văn bản"],
+ ["E", "chỉnh sửa tệp văn bản"],
+ ["S", "chọn tệp (để cắt/sao chép/đổi tên)"],
+ ]
+ ],
+
+ "m_ok": "OK",
+ "m_ng": "Hủy",
+
+ "enable": "Bật",
+ "danger": "NGUY HIỂM",
+ "clipped": "đã sao chép vào bảng nhớ tạm",
+
+ "ht_s1": "giây",
+ "ht_s2": "giây",
+ "ht_m1": "phút",
+ "ht_m2": "phút",
+ "ht_h1": "giờ",
+ "ht_h2": "giờ",
+ "ht_d1": "ngày",
+ "ht_d2": "ngày",
+ "ht_and": " và ",
+
+ "goh": "bảng điều khiển",
+ "gop": 'thư mục trước">trước',
+ "gou": 'thư mục cha">lên',
+ "gon": 'thư mục sau">tiếp',
+ "logout": "Đăng xuất ",
+ "login": "Đăng nhập",
+ "access": "quyền truy cập",
+ "ot_close": "đóng menu con",
+
+ "ot_search": "tìm kiếm các tệp theo thuộc tính, đường dẫn / tên, tag nhạc hoặc bất kỳ sự kết hợp nào của chúng$N$N<code>foo bar</code> = phải chứa cả «foo» và «bar»,$N<code>foo -bar</code> = phải chứa «foo» nhưng không chứa «bar»,$N<code>^yana .opus$</code> = bắt đầu bằng «yana» và là tệp «opus»$N<code>"try unite"</code> = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N<code>2009-12-31</code> hoặc <code>2020-09-12 23:30:00</code>",
+
+
+ "ot_unpost": "unpost: xoá các tệp đã tải lên gần đây hoặc huỷ những tệp đang tải dở",
+ "ot_bup": "bup: trình tải lên cơ bản, hỗ trợ cả Netscape 4.0",
+ "ot_mkdir": "mkdir: tạo thư mục mới",
+ "ot_md": "new-file: tạo tệp văn bản mới",
+ "ot_msg": "msg: gửi tin nhắn đến nhật ký máy chủ",
+ "ot_mp": "tuỳ chọn trình phát phương tiện",
+ "ot_cfg": "tuỳ chọn cấu hình",
+ "ot_u2i": 'up2k: tải tệp lên (nếu bạn có quyền ghi) hoặc chuyển sang chế độ tìm kiếm để xem chúng có tồn tại ở đâu đó trên máy chủ không$N$Ntải lên có thế tiếp tục nếu bị gián đoạn, chạy đa luồng và giữ nguyên dấu thời gian tệp, nhưng tiêu tốn nhiều CPU hơn [🎈] (trình tải lên cơ bản)📻copy sau)",
+ "wt_m3uc": "sao chép danh sách phát m3u vào bảng nhớ tạm",
+ "wt_grid": "chuyển đổi chế độ xem danh sách / lưới $NPhím tắt: G",
+ "wt_prev": "bài trước$NPhím tắt: J",
+ "wt_play": "phát / tạm dừng$NPhím tắt: P",
+ "wt_next": "bài sau$NPhím tắt: L",
+
+ "ul_par": "tải lên song song:",
+ "ut_rand": "ngẫu nhiên hoá tên tệp",
+ "ut_u2ts": "sao chép dấu thời gian chỉnh sửa cuối$Ntừ hệ thống tệp của bạn lên máy chủ\">📅",
+ "ut_ow": "ghi đè các tệp đã có trên máy chủ?$N🛡️: không bao giờ (sẽ tạo tên tệp mới)$N🕒: ghi đè nếu tệp trên máy chủ cũ hơn$N♻️: luôn ghi đè nếu hai tệp khác nhau",
+ "ut_mt": "tiếp tục hash các tệp khác trong khi tải lên$N$NCó thể tắt nếu CPU hoặc HDD của bạn bị nghẽn",
+ "ut_ask": 'yêu cầu xác nhận trước khi bắt đầu tải lên">💭',
+ "ut_pot": "cải thiện tốc độ tải lên trên các thiết bị chậm$Nbằng cách đơn giản hoá giao diện người dùng",
+ "ut_srch": "không tải lên, chỉ kiểm tra xem tệp$Nđã tồn tại trên máy chủ hay chưa (sẽ quét toàn bộ thư mục bạn có quyền đọc)",
+ "ut_par": "tạm dừng tải lên bằng cách đặt thành 0$N$NTăng lên nếu kết nối chậm hoặc độ trễ cao$N$NGiữ ở mức 1 khi dùng LAN hoặc nếu ổ cứng máy chủ bị nghẽn",
+ "ul_btn": "thả tệp / thư mụcEnter = Tệp (một hoặc nhiều)\nESC = Một thư mục (kèm thư mục con)',
+ "u_nav_b": 'TệpMột thư mục',
+
+ // settings / config:
+ "cl_opts": "tuỳ chọn",
+ "cl_hfsz": "kích thước tệp",
+ "cl_themes": "giao diện",
+ "cl_langs": "ngôn ngữ",
+ "cl_ziptype": "định dạng nén",
+ "cl_uopts": "tuỳ chọn up2k",
+ "cl_favico": "favicon",
+ "cl_bigdir": "thư mục lớn",
+ "cl_hsort": "#sắp xếp",
+ "cl_keytype": "ghi chú bàn phím",
+ "cl_hiddenc": "cột đã ẩn",
+ "cl_hidec": "ẩn",
+ "cl_reset": "đặt lại",
+ "cl_hpick": "chạm vào tiêu đề cột để ẩn trong bảng bên dưới",
+ "cl_hcancel": "đã hủy việc ẩn cột",
+
+ // settings / tuỳ chọn
+ "ct_grid": '田 chế độ lưới',
+ "ct_ttips": '༼ ◕_◕ ༽">ℹ️ tooltips',
+ "ct_thumb": 'ở chế độ lưới, chuyển biểu tượng hoặc hình thu nhỏ$NPhím tắt: T">🖼️ ảnh thu nhỏ',
+ "ct_csel": 'dùng CTRL và SHIFT để chọn tệp trong chế độ lưới">sel',
+ "ct_dl": 'cưỡng chế tải xuống (không hiện thị trong dòng) khi nhấp vào tệp">dl',
+ "ct_ihop": 'khi đóng trình xem ảnh, cuộn xuống tệp đã xem gần nhất">g⮯',
+ "ct_dots": 'hiển thị tệp ẩn (nếu máy chủ cho phép)">dotfiles',
+ "ct_qdel": 'khi xóa tệp, chỉ hỏi xác nhận một lần">qdel',
+ "ct_dir1st": 'sắp xếp thư mục trước tệp">📁 first',
+ "ct_nsort": 'sắp xếp tự nhiên (cho tên tệp có số ở đầu)">nsort',
+ "ct_utc": 'hiển thị mọi thời gian theo UTC">UTC',
+ "ct_readme": 'hiển thị README.md trong danh sách thư mục">📜 readme',
+ "ct_idxh": 'hiển thị index.html thay cho danh sách thư mục">htm',
+ "ct_sbars": 'hiển thị thanh cuộn">⟊',
+
+ // tuỳ chọn up2k
+ "cut_umod": "nếu tệp đã tồn tại trên máy chủ, cập nhật dấu thời gian chỉnh sửa cuối của máy chủ cho khớp với tệp cục bộ của bạn (yêu cầu quyền ghi và xóa)\">re📅",
+
+ "cut_turbo": "nút YOLO, bạn gần như KHÔNG nên bật tuỳ chọn này:$N$Ndùng khi bạn đang tải lên một lượng tệp rất lớn và phải khởi động lại vì lý do nào đó, và muốn tiếp tục tải càng sớm sàng tốt$N$Ntuỳ chọn này thay thế kiểm tra hash bằng kiểm tra "kích thước tệp ở trên máy chủ có giống nhau không" nên nếu nội dung tệp khác nhau thì sẽ KHÔNG được tải lên$N$Nbạn nên tắt tuỳ chọn này sau khi tải lên xong, và "tải lên" lại các tệp đó để xác minh\">turbo",
+
+ "cut_datechk": "không có tác dụng trừ khi nút turbo được bật$N$Ngiảm mức độ yolo một chút; kiểm tra xem dấu thời gian tệp trên máy chủ có khớp với của bạn không$N$Nnên về lý thuyết có thể phát hiện phần lớn tệp chưa xong hoặc bị lỗi, nhưng không thể thay thế cho việc chạy xác minh sau khi tắt turbo\">date-chk",
+
+ "cut_u2sz": "kích thước (tính theo MiB) của mỗi khối tải lên; dùng kích thước khối lớn khi truyền ở khoảng cách lục địa. Hãy thử giá trị nhỏ hơn với kết nối không ổn định",
+
+ "cut_flag": "đảm bảo chỉ một tab được tải lên tại một thời điểm $N -- tab khác cũng cần bật tùy chọn này $N -- tác dụng trong các tab cùng tên miền",
+
+ "cut_az": "tải tệp theo thứ tự bảng chữ cái thay vì tệp nhỏ trước$N$Ntải lên theo thứ tự bảng chữ cái giúp dễ quan sát nếu có vấn đề trên máy chủ, nhưng làm tốc độ tải chậm hơn trên mạng cáp quang hoặc LAN",
+
+ "cut_nag": "thông báo của hệ điều hành khi tải lên hoàn tất$N(chỉ khi trình duyệt hoặc tab không hoạt động)",
+ "cut_sfx": "âm báo khi tải lên hoàn tất$N(chỉ khi trình duyệt hoặc tab không hoạt động)",
+
+ "cut_mt": "dùng đa luồng để tăng tốc hash tệp$N$dùng web workers và cần $nhiều RAM hơn (tối đa thêm 512 MiB)$N$làm cho https nhanh hơn 30%, http nhanh hơn 4.5 lần\">mt",
+
+ "cut_wasm": "dùng wasm thay vì bộ hash tích hợp của trình duyệt; nhanh hơn trên trình duyệt chromium nhưng làm tăng tải CPU, và nhiều bản chrome cũ có lỗi khiến trình duyệt dùng hết RAM và treo nếu bật tuỳ chọn này\">wasm",
+
+ // favicon
+ "cft_text": "chuỗi favicon (để trống và làm mới trang để tắt)",
+ "cft_fg": "màu chữ",
+ "cft_bg": "màu nền",
+
+ // big dirs
+ "cdt_lim": "số tệp tối đa hiển thị trong thư mục",
+ "cdt_ask": "khi cuộn xuống cuối,$Nthay vì tải thêm tệp,$Nhỏi người dùng muốn làm gì",
+ "cdt_hsort": "số lượng luật sắp xếp(<code>,sorthref</code>) được đưa vào URL media. Đặt bằng 0 cũng sẽ bỏ qua các quy tắc sắp xếp trong liên kết media khi nhấp vào chúng",
+
+ "tt_entree": "hiển thị thanh điều hướng (cây thư mục)$NPhím tắt: B",
+ "tt_detree": "hiển thị đường dẫn$NPhím tắt: B",
+ "tt_visdir": "cuộn đến thư mục đã chọn",
+ "tt_ftree": "chuyển đổi cây thư mục / tệp văn bản$NPhím tắt: V",
+ "tt_pdock": "hiển thị thư mục cha trong thanh ghim trên cùng",
+ "tt_dynt": "tự mở rộng khi cây mở rộng",
+ "tt_wrap": "ngắt dòng",
+ "tt_hover": "hiện thị dòng tràn khi rê chuột$N( không cuộn được nếu $N con trỏ chuột nằm ngoài cột trái )",
+
+ "ml_pmode": "ở cuối thư mục...",
+ "ml_btns": "lệnh",
+ "ml_tcode": "mã hoá lại",
+ // chắc là phần nhạc
+ "ml_tcode2": "mã hoá lại thành",
+ "ml_tint": "tô màu",
+ "ml_eq": "bộ cân bằng âm thanh",
+ "ml_drc": "bộ nén dải động",
+
+ // nhạc
+
+ "mt_loop": "lặp lại một bài\">🔁",
+ "mt_one": "dừng sau một bài\">1️⃣",
+ "mt_shuf": "trộn các bài trong thư mụcr\">🔀",
+ "mt_aplay": "tự động phát nếu có ID bài trong link bạn nhấp để truy cập máy chủ$N$Ntắt tuỳ chọn sẽ ngăn URL của trang cập nhật theo ID bài khi phát nhạc, tránh tự động phát nếu cài đặt mất nhưng URL còn\">a▶",
+ "mt_preload": "bắt đầu tải bài hát tiếp theo khi gần hết bài để phát liền mạch\">preload",
+ "mt_prescan": "chuyển đến thư mục tiếp theo trước khi bài cuối cùng $Nkết thúc, giúp giữ trình duyệt hoạt động $N và không dừng phát nhạc\">nav",
+ "mt_fullpre": "cố gắng tải trước toàn bộ bài;$N✅ bật với kết nối không ổn định,$N❌ tắt với kết nối chậm\">full",
+ "mt_fau": "trên điện thoại, ngăn nhạc dừng nếu bài tiếp theo tải chậm (có thể gây lỗi hiển thị tag nhạc)\">☕️",
+ "mt_waves": "thanh tiến trình bài hát dạng sóng:$Nhiển thị biên độ âm thanh trong thanh tiến trình\">~s",
+ "mt_npclip": "hiển thị nút để sao chép bài đang phát\">/np",
+ "mt_m3u_c": "hiển thị nút để sao chép $Nnhững bài đã chọn dưới dạng danh sách phát m3u8\">📻",
+ "mt_octl": "tích hợp hệ điều hành (phím tắt media / OSD)\">os-ctl",
+ "mt_oseek": "cho phép tìm kiếm qua tích hợp hệ điều hành$N$Nlưu ý: trên một số thiết bị (iphone), $Nthao tác này sẽ thay thế nút bài hát tiếp theo\">seek",
+ "mt_oscv": "hiển thị bài album trên OSD\">art",
+ "mt_follow": "giữ bài đang phát trong tầm nhìn\">🎯",
+ "mt_compact": "giao diện điều khiển thu gọn\">⟎",
+ "mt_uncache": "xoá bộ nhớ đệm (thử nếu trình duyệt lưu trữ đệm $Nmột bản nhạc bị lỗi và không thể phát)\">uncache",
+ "mt_mloop": "lặp trong thư mục đang mở\">🔁 loop",
+ "mt_mnext": "tải thư mục tiếp theo và tiếp tục\">📂 next",
+ "mt_mstop": "dừng phát\">⏸ stop",
+ "mt_cflac": "chuyển flac / wav sang {0}\">flac",
+ "mt_caac": "chuyển aac / m4a sang {0}\">aac",
+ "mt_coth": "chuyển mọi loại khác (trừ mp3) thành {0}\">oth",
+ "mt_c2opus": "lựa chọn tốt nhất cho máy tính, laptop, android\">opus",
+ "mt_c2owa": "opus-weba, cho iOS 17.5 trở lên\">owa",
+ "mt_c2caf": "opus-caf, cho iOS 11 đến 17\">caf",
+ "mt_c2mp3": "dùng trên thiết bị cũ\">mp3",
+ "mt_c2flac": "chất lượng âm thanh tốt nhất, nhưng tệp tải xuống lớn\">flac",
+ "mt_c2wav": "phát không nén (tệp còn lớn hơn nữa)\">wav",
+ "mt_c2ok": "lựa chọn hợp lý",
+ "mt_c2nd": "không phải định dạng khuyến nghị cho thiết bị, nhưng hãy thử nếu bạn muốn",
+ "mt_c2ng": "thiết bị dường như không hỗ trợ định dạng này, nhưng hãy thử nếu bạn muốn",
+ "mt_xowa": "có một vài lỗi trên iOS ngăn phát nền với định dạng này; vui lòng dùng caf hoặc mp3",
+ "mt_tint": "mức nền (0-100) trên thanh tiến trình",
+
+ "mt_eq": "bật bộ cân bằng âm thanh và bộ tăng ích;$N$Nboost <code>0 </code> = âm lượng chuẩn 100% (không chỉnh)$N$Nwidth <code>1 </code> = stereo chuẩn (không chỉnh)$Nwidth <code>0.5</code> = 50% pha trái-phải$Nwidth <code>0 </code> = mono$N$Nboost <code>-0.8</code> & width <code>10</code> = loại bỏ lời hát :^)$N$Nbật EQ giúp cho album được phát liền mạch không ngắt quãng, nên giữ các giá trị bằng 0 (trừ width = 1) nếu bạn không muốn thay đổi âm thanh gốc",
+
+ "mt_drc": "bật bộ nén dải động (làm phẳng âm lượng / brickwaller); cũng bật EQ để cân bằng, nên đặt tất cả EQ trừ 'width' = 0 nếu không muốn$N$Ngiảm âm thanh trên THRESHOLD dB; với mỗi RATIO dB vượt THRESHOLD thì có 1 dB đầu ra, ví dụ tresh -24 và ratio 12 => âm lượng không vượt -22 dB, có thể tăng EQ boost lên 0.8 hoặc 1.8 với ATK 0 và RLS lớn 90 (chỉ Firefox; RLS max 1 trên browser khác)$N$NXem Wikipedia để hiểu chi tiết hơn",
+
+ "mb_play": "phát",
+ "mm_hashplay": "phát bản nhạc này?",
+ "mm_m3u": "bấm Enter/OK để phát\nbấm ESC/Cancel để chỉnh sửa",
+ "mp_breq": "cần firefox 82+ hoặc chrome 73+ hoặc iOS 15+",
+ "mm_bload": "đang tải...",
+ "mm_bconv": "đang chuyển đổi sang {0}, vui lòng chờ...",
+ "mm_opusen": "trình duyệt không hỗ trợ tệp aac / m4a;\nchuyển sang định dạng opus hiện đã được bật",
+ "mm_playerr": "phát lỗi: ",
+ "mm_eabrt": "Việc phát nhạc đã bị huỷ",
+ "mm_enet": "Kết nối Internet không ổn định",
+ "mm_edec": "Tệp này dường như đã bị hỏng??",
+ "mm_esupp": "Trình duyệt của bạn không nhận dạng được định dạng tệp này.",
+ "mm_eunk": "Lỗi không xác định",
+ "mm_e404": "Không thể phát âm thanh; lỗi 404: Không tìm thấy tệp.",
+ "mm_e403": "Không thể phát âm thanh; lỗi 403: Từ chối truy cập.\n\nThử nhấn F5 để tải lại, có thể bạn đã đăng xuất",
+ "mm_e500": "Không thể phát âm thanh; lỗi 500: Kiểm tra nhật ký máy chủ.",
+ "mm_e5xx": "Không thể phát âm thanh; lỗi máy chủ ",
+ "mm_nof": "không tìm thấy thêm tệp âm thanh nào gần đó",
+ "mm_prescan": "Đang tìm bài nhạc tiếp theo để phát...",
+ "mm_scank": "Đã tìm thấy bài nhạc tiếp theo:",
+ "mm_uncache": "đã xoá bộ nhớ đệm; tất cả bài nhạc sẽ được tải lại khi phát tiếp",
+ "mm_hnf": "bài nhạc này không còn tồn tại nữa",
+ "im_hnf": "hình ảnh này không còn tồn tại nữa",
+
+ "f_empty": 'thư mục này trống',
+ "f_chide": 'ẩn cột «{0}»\n\bạn có thế hiện lại nó trong tuỳ chọn cấu hình',
+ "f_bigtxt": "tệp này nặng {0} MiB -- xác nhận xem dưới dạng văn bản?",
+ "f_bigtxt2": "chỉ xem phần cuối của tệp? điều này cũng sẽ bật theo dõi, hiển thị các dòng văn bản mới được thêm vào theo thời gian thực",
+ "fbd_more": '',
+ "fbd_all": '',
+ "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_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 .PARTIAL. 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 .PARTIAL thay vào đó, gần như chắc chắn dẫn đến dữ liệu bị hỏng.",
+
+ "ft_paste": "dán {0} mục$NPhím tắt: ctrl-V",
+ "fr_eperm": "không thể đổi tên:\nbạn không có quyền “move” trong thư mục này",
+ "fd_eperm": "không thể xóa:\nbạn không có quyền “delete” trong thư mục này",
+ "fc_eperm": "không thể cắt:\nbạn không có quyền “move” trong thư mục này",
+ "fp_eperm": "không thể dán:\nbạn không có quyền “write” trong thư mục này",
+ "fr_emore": "hãy chọn ít nhất một mục để đổi tên",
+ "fd_emore": "hãy chọn ít nhất một mục để xóa",
+ "fc_emore": "hãy chọn ít nhất một mục để cắt",
+ "fcp_emore": "hãy chọn ít nhất một mục để sao chép vào bảng nhớ tạm",
+
+
+ "fs_sc": "chia sẻ thư mục hiện tại",
+ "fs_ss": "chia sẻ các tệp đã chọn",
+ "fs_just1d": "bạn không thể chọn nhiều hơn một thư mục,\nhoặc trộn tệp và thư mục trong cùng một lựa chọn",
+ "fs_abrt": "❌ hủy",
+ "fs_rand": "🎲 tên ngẫu nhiên",
+ "fs_go": "✅ tạo liên kết chia sẻ",
+ "fs_name": "tên",
+ "fs_src": "nguồn",
+ "fs_pwd": "mật khẩu",
+ "fs_exp": "hết hạn",
+ "fs_tmin": "phút",
+ "fs_thrs": "giờ",
+ "fs_tdays": "ngày",
+ "fs_never": "vĩnh viễn",
+ "fs_pname": "tên liên kết tùy chọn; sẽ dùng tên ngẫu nhiên nếu để trống",
+ "fs_tsrc": "tệp hoặc thư mục cần chia sẻ",
+ "fs_ppwd": "mật khẩu tùy chọn",
+ "fs_w8": "đang tạo liên kết chia sẻ...",
+ "fs_ok": "nhấn Enter/OK để chép vào bảng nhớ tạm\nnhấn ESC/Cancel để đóng",
+
+ "frt_dec": "có thể sửa một số trường hợp tên tệp bị lỗi\">url-decode",
+ "frt_rst": "khôi phục tên gốc\">↺ reset",
+ "frt_abrt": "hủy và đóng cửa sổ này\">❌ cancel",
+ "frb_apply": "ÁP DỤNG ĐỔI TÊN",
+ "fr_adv": "đổi tên theo lô / metadata / pattern\">advanced",
+ "fr_case": "regex phân biệt hoa thường\">case",
+ "fr_win": "tên tương thích Windows; thay <>:"\\|?* bằng ký tự fullwidth tiếng Nhật\">win",
+ "fr_slash": "thay / bằng ký tự khác để tránh tạo thư mục mới\">no /",
+ "fr_re": "regex áp dụng lên tên gốc; các nhóm bắt có thể được tham chiếu trong trường định dạng bên dưới như <code>(1)</code>, <code>(2)</code> ...",
+ "fr_fmt": "lấy cảm hứng từ foobar2000:$N<code>(title)</code> được thay bằng tên bài hát,$N<code>[(artist) - ](title)</code> bỏ qua phần trong ngoặc nếu artist trống,$N<code>$lpad((tn),2,0)</code> thêm số 0 để tracknumber đủ 2 chữ số",
+ "fr_pdel": "xóa",
+ "fr_pnew": "lưu dưới tên mới",
+ "fr_pname": "nhập tên cho preset mới",
+ "fr_aborted": "đã hủy",
+ "fr_lold": "tên cũ",
+ "fr_lnew": "tên mới",
+ "fr_tags": "tag của các tệp đã chọn (chỉ xem, không chỉnh sửa):",
+ "fr_busy": "đang đổi tên {0} mục...\n\n{1}",
+ "fr_efail": "đổi tên thất bại:\n",
+ "fr_nchg": "{0} tên mới đã bị chỉnh sửa do win và/hoặc no /\n\nTiếp tục với các tên đã chỉnh sửa?",
+
+
+ "fd_ok": "hoàn tất xoá",
+ "fd_err": "xoá gặp lỗi:\n",
+ "fd_none": "không xóa được mục nào; có thể bị chặn bởi cấu hình máy chủ (xbd)?",
+ "fd_busy": "đang xóa {0} mục...\n\n{1}",
+ "fd_warn1": "XÓA {0} mục này?",
+ "fd_warn2": "Cảnh báo cuối! Không thể hoàn tác. Xóa?",
+
+ "fc_ok": "đã cắt {0} mục",
+ "fc_warn": "đã cắt {0} mục\n\nnhưng: chỉ tab trình duyệt này có thể dán\n(vì lựa chọn quá lớn)",
+
+ "fcc_ok": "đã sao chép {0} mục vào bảng nhớ tạm",
+ "fcc_warn": "đã sao chép {0} mục vào bảng nhớ tạm\n\nnhưng: chỉ tab trình duyệt này có thể dán\n(vì lựa chọn quá lớn)",
+
+ "fp_apply": "dùng các tên này",
+ "fp_ecut": "hãy cắt hoặc sao chép một số tệp / thư mục trước khi dán / di chuyển\n\nlưu ý: bạn có thể cắt / dán giữa các tab trình duyệt khác nhau",
+ "fp_ename": "{0} mục không thể được di chuyển vào đây vì tên đã tồn tại. Hãy đặt tên mới bên dưới để tiếp tục, hoặc để trống để bỏ qua:",
+ "fcp_ename": "{0} mục không thể được sao chép vào đây vì tên đã tồn tại. Hãy đặt tên mới bên dưới để tiếp tục, hoặc để trống để bỏ qua:",
+ "fp_emore": "vẫn còn xung đột tên tệp cần xử lý",
+ "fp_ok": "di chuyển OK",
+ "fcp_ok": "sao chép OK",
+ "fp_busy": "đang di chuyển {0} mục...\n\n{1}",
+ "fcp_busy": "đang sao chép {0} mục...\n\n{1}",
+ "fp_abrt": "đang hủy...",
+ "fp_err": "di chuyển thất bại:\n",
+ "fcp_err": "sao chép thất bại:\n",
+ "fp_confirm": "di chuyển {0} mục này vào đây?",
+ "fcp_confirm": "sao chép {0} mục này vào đây?",
+ "fp_etab": "không đọc được bảng nhớ tạm từ tab trình duyệt khác",
+ "fp_name": "đang tải lên tệp từ thiết bị. Hãy đặt tên cho tệp:",
+ "fp_both_m": "Enter = Di chuyển {0} tệp từ «{1}»\nESC = Tải lên {2} tệp từ thiết bị",
+ "fcp_both_m": "Enter = Sao chép {0} tệp từ «{1}»\nESC = Tải lên {2} tệp từ thiết bị",
+ "fp_both_b": "Di chuyểnTải lên",
+ "fcp_both_b": "Sao chépTải lên",
+
+ "mk_noname": "hãy nhập tên vào ô bên trái trước khi thực hiện :p",
+ "nmd_i1": "hãy thêm cả phần mở rộng tệp bạn muốn, ví dụ .md",
+ "nmd_i2": "bạn chỉ có thể tạo tệp .md vì bạn không có quyền xóa",
+
+
+ "tv_load": "Đang tải tài liệu văn bản:\n\n{0}\n\n{1}% ({2} / {3} MiB)",
+ "tv_xe1": "không thể tải tệp văn bản:\n\nlỗi ",
+ "tv_xe2": "404, không tìm thấy tệp",
+ "tv_lst": "danh sách các tệp văn bản trong",
+ "tvt_close": "quay lại chế độ xem thư mục$NPhím tắt: M (hoặc Esc)\">❌ close",
+ "tvt_dl": "tải xuống tệp này$NPhím tắt: Y\">💾 download",
+ "tvt_prev": "hiển thị tài liệu trước đó$NPhím tắt: I\">⬆ prev",
+ "tvt_next": "hiển thị tài liệu kế tiếp$NPhím tắt: K\">⬇ next",
+ "tvt_sel": "chọn tệp (để cắt / sao chép / xóa / ...)$NPhím tắt: S\">sel",
+ "tvt_j": "chuẩn hóa json$NPhím tắt: shift-J\">j",
+ "tvt_edit": "mở tệp trong trình soạn thảo văn bản$NPhím tắt: E\">✏️ edit",
+ "tvt_tail": "theo dõi thay đổi của tệp; hiển thị dòng mới theo thời gian thực\">📡 follow",
+ "tvt_wrap": "ngắt dòng\">↵",
+ "tvt_atail": "khóa cuộn ở cuối trang\">⚓",
+ "tvt_ctail": "giải mã màu terminal (ansi escape codes)\">🌈",
+ "tvt_ntail": "giới hạn scrollback (số byte văn bản được giữ trong bộ nhớ)",
+
+
+
+
+ "m3u_add1": "đã thêm 1 bài vào danh sách phát m3u",
+ "m3u_addn": "đã thêm {0} bài vào danh sách phát m3u",
+ "m3u_clip": "danh sách phát m3u đã được chép vào bảng nhớ tạm\n\nbạn nên tạo một tệp văn bản mới tên bất kỳ.m3u rồi dán nội dung danh sách phát vào đó để có thể phát được",
+
+ "gt_vau": "không hiện video, chỉ phát âm thanh\">🎧",
+ "gt_msel": "bật chọn nhiều; ctrl-click để ghi đè$N$N<em>khi bật: nhấn đúp để mở tệp / thư mục</em>$N$NPhím tắt: S\">multiselect",
+ "gt_crop": "cắt chính giữa ảnh\">crop",
+
+ "gt_3x": "ảnh độ nét cao\">3x",
+ "gt_zoom": "zoom",
+ "gt_chop": "chop",
+ "gt_sort": "sắp xếp theo",
+ "gt_name": "tên",
+ "gt_sz": "dung lượng",
+ "gt_ts": "ngày",
+ "gt_ext": "loại",
+ "gt_c1": "rút ngắn tên tệp hơn (hiện ít hơn)",
+ "gt_c2": "rút ngắn tên tệp ít hơn (hiện nhiều hơn)",
+
+ "sm_w8": "đang tìm...",
+ "sm_prev": "kết quả bên dưới là từ lần tìm trước:\n ",
+ "sl_close": "đóng kết quả tìm kiếm",
+ "sl_hits": "hiển thị {0} kết quả",
+ "sl_moar": "tải thêm",
+
+ "s_sz": "dung lượng",
+ "s_dt": "ngày",
+ "s_rd": "đường dẫn",
+ "s_fn": "tên",
+ "s_ta": "tag",
+ "s_ua": "up@",
+ "s_ad": "nâng cao",
+ "s_s1": "tối thiểu MiB",
+ "s_s2": "tối đa MiB",
+ "s_d1": "ngày tối thiểu (iso8601)",
+ "s_d2": "ngày tối đa (iso8601)",
+ "s_u1": "tải lên sau",
+ "s_u2": "và/hoặc trước",
+ "s_r1": "đường dẫn chứa (cách nhau bằng dấu cách)",
+ "s_f1": "tên chứa (thêm -nope để phủ định)",
+ "s_t1": "tag chứa (^=bắt đầu, kết thúc=$)",
+ "s_a1": "thuộc tính metadata cụ thể",
+
+
+ "md_eshow": "không thể tải",
+ "md_off": "[📜readme] đã tắt trong [⚙️] -- tài liệu bị ẩn",
+
+ "badreply": "Không thể phân tích phản hồi từ máy chủ",
+
+ "xhr403": "403: Access denied\n\nhãy thử nhấn F5, có thể bạn đã bị đăng xuất",
+ "xhr0": "không rõ (có thể mất kết nối với máy chủ hoặc máy chủ đang offline)",
+ "cf_ok": "rất tiếc, lớp bảo vệ DD" + wah + "oS đã kích hoạt\n\nmọi thứ sẽ tiếp tục sau khoảng 30 giây\n\nnếu không có gì xảy ra, hãy nhấn F5 để tải lại trang",
+ "tl_xe1": "không thể liệt kê thư mục con:\n\nlỗi ",
+ "tl_xe2": "404: Không tìm thấy thư mục",
+ "fl_xe1": "không thể liệt kê tệp trong thư mục:\n\nlỗi ",
+ "fl_xe2": "404: Không tìm thấy thư mục",
+ "fd_xe1": "không thể tạo thư mục con:\n\nlỗi ",
+ "fd_xe2": "404: Không tìm thấy thư mục cha",
+ "fsm_xe1": "không thể gửi tin nhắn:\n\nlỗi ",
+ "fsm_xe2": "404: Không tìm thấy thư mục cha",
+ "fu_xe1": "không tải được danh sách unpost từ máy chủ:\n\nlỗi ",
+ "fu_xe2": "404: Không tìm thấy tệp??",
+
+ "fz_tar": "file gnu-tar không nén (linux / mac)",
+ "fz_pax": "file tar định dạng pax không nén (chậm hơn)",
+ "fz_targz": "gnu-tar với nén gzip mức 3$N$Nthường rất chậm nên$Nhãy dùng tar không nén",
+ "fz_tarxz": "gnu-tar với nén xz mức 1$N$Nthường rất chậm nên$Nhãy dùng tar không nén",
+ "fz_zip8": "zip với tên tệp utf8 (có thể lỗi trên windows 7 và cũ hơn)",
+ "fz_zipd": "zip với tên tệp cp437 truyền thống, dành cho phần mềm rất cũ",
+ "fz_zipc": "cp437 với crc32 tính sớm,$Ndành cho MS-DOS PKZIP v2.04g (tháng 10/1993)$N(mất thời gian xử lý lâu hơn trước khi tải xuống bắt đầu)",
+
+ "un_m1": "bạn có thể xóa các lần upload gần đây (hoặc hủy những mục chưa hoàn tất) bên dưới",
+ "un_upd": "làm mới",
+ "un_m4": "hoặc chia sẻ các tệp hiển thị bên dưới:",
+ "un_ulist": "hiện",
+ "un_ucopy": "chép",
+ "un_flt": "bộ lọc tùy chọn: đường dẫn phải chứa",
+ "un_fclr": "xóa bộ lọc",
+ "un_derr": "xóa unpost thất bại:\n",
+ "un_f5": "có gì đó lỗi rồi, hãy thử tải lại trang hoặc nhấn F5",
+ "un_uf5": "xin lỗi nhưng bạn cần tải lại trang (ví dụ nhấn F5 hoặc CTRL-R) trước khi có thể hủy upload này",
+ "un_nou": "cảnh báo: máy chủ đang bận nên không thể hiển thị các upload chưa hoàn tất; hãy bấm “làm mới” sau một lúc",
+ "un_noc": "cảnh báo: unpost cho các tệp đã upload xong không được bật hoặc không được phép trong cấu hình máy chủ",
+ "un_max": "đang hiển thị 2000 tệp đầu tiên (hãy dùng bộ lọc)",
+ "un_avail": "có thể xóa {0} tải lên gần đâytệp: {0} hoàn tất, {1} lỗi, {2} đang chạy, {3} chờ
", + + "u_ever": "đây là trình tải lên cơ bản; up2k yêu cầuOK/Enter để BỎ QUA,\nNhấn Cancel/ESC để giữ lại và tải lên:\n\n",
+
+ "u_just1": "\nCó thể sẽ hoạt động tốt hơn nếu bạn chỉ chọn một tệp",
+ "u_ff_many": "nếu bạn dùng Linux / macOS / Android thì số lượng tệp này có thể làm Firefox crash\nnếu xảy ra, vui lòng thử lại hoặc dùng Chrome",
+
+ "u_up_life": "Tệp tải lên sẽ bị xóa khỏi máy chủ\n{0} sau khi hoàn tất",
+ "u_asku": "tải {0} tệp này lên {1}",
+ "u_unpt": "bạn có thể hoàn tác hoặc xóa lần tải lên này bằng biểu tượng ở góc trên bên trái 🧯",
+
+ "u_bigtab": "sắp hiển thị {0} tệp\n\nviệc này có thể làm trình duyệt treo, bạn có chắc không?",
+ "u_scan": "Đang quét tệp...",
+ "u_dirstuck": "bộ lặp thư mục bị treo khi truy cập {0} mục sau; sẽ bỏ qua:",
+ "u_etadone": "Hoàn tất ({0}, {1} tệp)",
+ "u_etaprep": "(đang chuẩn bị tải lên)",
+ "u_hashdone": "hash hoàn tất",
+ "u_hashing": "hash",
+ "u_hs": "đang bắt tay...",
+ "u_started": "tệp đang được tải lên; xem biểu tượng [🚀]",
+ "u_dupdefer": "bị trùng; sẽ xử lý sau khi hoàn tất các tệp khác",
+
+ "u_actx": "nhấn vào dòng này để tránh giảm hiệu suất khi chuyển cửa sổ hoặc tab",
+ "u_fixed": "OK; đã sửa 👍",
+
+ "u_cuerr": "không tải được phần {0}/{1};\ncó thể không nghiêm trọng, tiếp tục\n\ntệp: {2}",
+ "u_cuerr2": "máy chủ từ chối phần tải {0}/{1};\nsẽ thử lại sau\n\ntệp: {2}\n\nlỗi ",
+ "u_ehstmp": "sẽ thử lại; xem góc dưới bên phải",
+ "u_ehsfin": "máy chủ từ chối yêu cầu hoàn tất tải lên; đang thử lại...",
+ "u_ehssrch": "máy chủ từ chối yêu cầu tìm kiếm; đang thử lại...",
+ "u_ehsinit": "máy chủ từ chối yêu cầu bắt đầu tải lên; đang thử lại...",
+ "u_eneths": "lỗi mạng khi thực hiện bắt tay; đang thử lại...",
+ "u_enethd": "lỗi mạng khi kiểm tra tồn tại mục tiêu; đang thử lại...",
+ "u_cbusy": "chờ máy chủ cho phép tiếp tục sau sự cố mạng...",
+ "u_ehsdf": "máy chủ hết dung lượng!\n\nsẽ tiếp tục thử trong trường hợp có ai đó giải phóng dung lượng",
+
+ "u_emtleak1": "có dấu hiệu cho thấy trình duyệt có thể bị rò rỉ bộ nhớ;\nvui lòng",
+ "u_emtleak2": " chuyển sang https (khuyến nghị) hoặc ",
+ "u_emtleak3": " ",
+ "u_emtleakc": "thử cách sau:\nF5 để tải lại trangmt trong ⚙️ cài đặtF5 để tải lại trang🥔 (potato) trong giao diện tải lênconnections-per-server trong about:config",
+
+ "u_tu": "CẢNH BÁO: turbo đang bật client có thể không nhận diện và tiếp tục tải lại tệp chưa hoàn tất; xem tooltip nút turbo
", + "u_ts": "CẢNH BÁO: turbo đang bật kết quả tìm kiếm có thể không chính xác; xem tooltip nút turbo
", + + "u_turbo_c": "turbo bị tắt trong cấu hình máy chủ", + "u_turbo_g": "đang tắt turbo vì bạn không có quyền liệt kê thư mục trong phân vùng này", + + "u_life_cfg": "tự xóa sau phút (hoặc giờ)", + "u_life_est": "tệp sẽ bị xóa ---", + "u_life_max": "thư mục này áp dụng\nthời gian tồn tại tối đa {0}", + + "u_unp_ok": "cho phép unpost trong {0}", + "u_unp_ng": "không cho phép unpost", + + "ue_ro": "bạn chỉ có quyền đọc thư mục này\n\n", + "ue_nl": "bạn chưa đăng nhập", + "ue_la": "bạn đang đăng nhập với tài khoản \"{0}\"", + "ue_sr": "bạn đang ở chế độ tìm kiếm tệp\n\nhãy chuyển sang chế độ tải lên bằng cách nhấn biểu tượng kính lúp 🔎 (bên cạnh nút SEARCH), rồi thử lại\n\nxin lỗi", + "ue_ta": "hãy thử tải lên lại; giờ có thể được", + "ue_ab": "tệp này đang được tải lên ở thư mục khác và cần hoàn tất trước khi có thể tải lên nơi khác.\n\nBạn có thể hủy và quên tiến trình ban đầu bằng biểu tượng ở góc trên bên trái 🧯", + + "ur_1uo": "OK: tệp đã tải lên thành công", + "ur_auo": "OK: toàn bộ {0} tệp đã tải lên thành công", + "ur_1so": "OK: đã tìm thấy tệp trên máy chủ", + "ur_aso": "OK: đã tìm thấy toàn bộ {0} tệp trên máy chủ", + + "ur_1un": "Tải lên thất bại", + "ur_aun": "{0} lần tải lên đều thất bại", + + "ur_1sn": "KHÔNG tìm thấy tệp trên máy chủ", + "ur_asn": "{0} tệp KHÔNG tìm thấy trên máy chủ", + + "ur_um": "Hoàn tất\n{0} tải lên thành công,\n{1} tải lên thất bại", + "ur_sm": "Hoàn tất\n{0} tệp tìm thấy trên máy chủ,\n{1} tệp KHÔNG tìm thấy", + + "lang_set": "tải lại trang để áp dụng thay đổi ngôn ngữ", + + "splash": { + "a1": "tải lại", + "b1": "xin chào khách (bạn chưa đăng nhập)", + "c1": "đăng xuất", + "d1": "ghi lại ngăn xếp", + "d2": "hiển thị trạng thái của tất cả các luồng đang hoạt động", + "e1": "tải lại cấu hình", + "e2": "tải lại các tệp cấu hình (tài khoản/ổ đĩa/cờ ổ đĩa),$Nvà quét lại tất cả các ổ đĩa e2ds$N$Nchú ý: bất kỳ thay đổi nào đối với cài đặt toàn cục$Ncần khởi động lại hoàn toàn để có hiệu lực", + "f1": "bạn có thể duyệt:", + "g1": "bạn có thể tải lên:", + "cc1": "thứ khác:", + "h1": "vô hiệu hoá k304", + "i1": "bật k304", + "j1": "bật k304 sẽ ngắt kết nối client của bạn trên mỗi HTTP 304, tùy chọn này có thể ngăn một số proxy bị lỗi kẹt (đột ngột không tải được trang), nhưng nó cũng sẽ làm mọi thứ chậm hơn", + "k1": "đặt lại cài đặt client", + "l1": "đăng nhập để có thêm:", + "m1": "chào mừng trở lại,", + "n1": "404 không tìm thấy ┐( ´ -`)┌", + "o1": 'hoặc có thể bạn không có quyền truy cập -- thử mật khẩu hoặc về trang chủ', + "p1": "403 bị cấm ~┻━┻", + "q1": 'sử dụng mật khẩu hoặc về trang chủ', + "r1": "về trang chủ", + ".s1": "quét lại", + "t1": "hành động", + "u2": "thời gian kể từ lần ghi máy chủ cuối cùng$N( tải lên / đổi tên / ... )$N$N17d = 17 ngày$N1h23 = 1 giờ 23 phút$N4m56 = 4 phút 56 giây", + "v1": "kết nối", + "v2": "sử dụng máy chủ này như một ổ cứng cục bộ", + "w1": "chuyển sang https", + "x1": "đổi mật khẩu", + "y1": "chỉnh sửa chia sẻ", + "z1": "mở khóa chia sẻ này:", + "ta1": "điền mật khẩu mới:", + "ta2": "nhập lại mật khẩu mới:", + "ta3": "mật khẩu không khớp, xin hãy thử lại", + "nop": "LỖI: Mật khẩu không được để trống", //m + "nou": "LỖI: Tên người dùng và/hoặc mật khẩu không được để trống", //m + "aa1": "tệp đến", + "ab1": "vô hiệu hóa no304", + "ac1": "bật no304", + "ad1": "bật no304 sẽ vô hiệu hóa tất cả bộ nhớ đệm; hãy thử tùy chọn này nếu k304 không đủ. Tùy chọn này sẽ làm lãng phí một lượng lớn lưu lượng mạng!", + "ae1": "tải xuống đang hoạt động:", + "af1": "hiển thị các tệp đã tải lên gần đây", + "ag1": "hiển thị người dùng IdP đã biết", //m + } +}; diff --git a/docs/changelog.md b/docs/changelog.md index 2b5a8b95..66269f92 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,84 @@ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +# 2025-1202-2047 `v1.19.21` tadaimback + +## 🧪 new features + +* [hooks](https://github.com/9001/copyparty/tree/hovudstraum/bin/hooks#readme) now behave more usefully/predictably; 889bd324 + * hooks returning `0` will run the next hook (if any), and let the initiating action proceed if no other hooks object + * hooks returning `100` will stop processing successive hooks, but return success, letting the initiating action proceed + * hooks returning anything else will stop processing successive hooks (like the documentation always said) and also fail the initiating action (if hook is checked) + * zmq hooks can now respond with json, doing relocations and all that stuff +* new mtag plugin, [geotag.py](https://github.com/9001/copyparty/blob/hovudstraum/bin/mtag/geotag.py): read image geotags with exiftool ([demo](https://a.ocv.me/pub/blog/j8/11/)) 1c15c0d5 ac085b81 +* #972 markdown-links are rewritten to open in the markdown-viewer 278a0d85 +* #794 add json beautifier / minifier + * ...in the textfile-editor fd8c5bfc + * ...in the textfile-viewer 89cab5b5 +* #1058 ui-option and server-config to force download instead of showing files inline a9174e5d +* option `stats-u` to grant access to prometheus-metrics based on username, not just permissions b427d780 + +## 🩹 bugfixes + +* #1003 u2c.py (commandline uploader) did not install correctly on archlinux and/or pypi 9385daea +* #1035 uploader could fail to initialize if: 98701b78 + * the `mt` button (webworkers) was enabled in the settings tab + * **and** the network was severely strained during intial page load +* possible deadlock on shutdown if thumbnailer queue was hella busy fb9f0441 +* #971 windows: fix deadlock on startup if trying to use a nonexistant driveletter as a volume 945b2276 +* #1022 js-panic if audio playback is set to stay-in-folder a28503e8 +* links to ongoing file transfers in the controlpanel could 404 (thx @Habetdin!) 77f74ddb f4d67ff0 +* video scrubbing on iOS dba7c5d4 +* #1054 audio volume slider could skip one percent (thx @shermanhlc!) ca6d3a5c +* detect invalid config: + * #959 panic if `ipu` user doesn't exist 79e10786 + * panic if share config overlaps with a volume cedfc444 +* #943 + +## 🔧 other changes + +* the "new-markdown" feature was repurposed into "new-file", accepting any file extension 7d62335c +* #1023 the option to grant delete-access when creating a share was removed due to never having been implemented in the backend 04ac7fbd +* #1012 rephrased the controlpanel login-text when logged in to avoid confusion 7a291403 +* add hints that the serverlog is a good place to look in some situations c424a55d +* all thumbnail types and combinations can now be pregenerated a359b89e +* #1030 add debug if cfssl is misbehaving ec00dc18 +* #871 `grid` volflag is applied during navigation if user has not set a preference a9378a8e +* cosmetic: + * show column number in markdown editor b9aacba1 + * reduced grid margins in theme2 e469bc94 + * reduced redirect delay after logging in f7e7b03f + * controlpanel greeting in some fail-early responses acde21d4 + * update hooks to ignore the new upload-queue-empty message 3f4b79ff +* docs: + * #1032 fix typo in example docker idp config (thx @tuetenk0pp!) 867237d0 + * warn that using/changing `-j` is usually a bad idea cad15fbf + * add hotlink anchors to https://copyparty.eu/cli/ 7f9c139e +* nixos: + * #868 option to install from git-head (thx @shelvacu!) c7345308 + * #962 support idp volumes (thx @nicomem!) 904c984b + * #963 use configured chmod-d when creating volumes (thx @nicomem!) 3242145e +* copyparty.exe: update to python 3.13.10, pillow 12.0 cdffde78 + +## 🌠 fun facts + +* copyparty has been observed running [on a wristwatch](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/clockyparty.jpg) and on an [android tv-box](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/aallwinner.jpg) running in big-endian mode, so copyparty is [BE-certified](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/be-ready.png) +* also... **it's december!** [you know what that means](https://a.ocv.me/pub/demo/music/.bonus/#af-55d4554d) :^) + + + +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +# 2025-1102-0109 `v1.19.20` november + +## 🧪 new features + +* #961 the `/?shares` listing now shows the list of filenames for each share 2cc53ea15181f750b4367e6cd20dfebd0bcb3bee + +## 🩹 bugfixes + +* #967 per-volume md/lg sandbox rules are now applied during navigation db60951d9fa5b17c8190e8b3ab4ceb422a9d2701 + * if a volume has `no-sb-lg` or `no-sb-md` set then it'll apply when navigating into that volume, and vice-versa + + + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ # 2025-1025-1918 `v1.19.19` copyparty.eu マークII diff --git a/docs/synology-dsm.md b/docs/synology-dsm.md index b9388b53..60e6adcf 100644 --- a/docs/synology-dsm.md +++ b/docs/synology-dsm.md @@ -40,6 +40,7 @@ open the Package Center and install `Text Editor` (by Synology Inc.) to create a rss, daw, ver # some other nice-to-have features #dedup # you may want this, or maybe not hist: /cfg/hist # don't pollute the shared-folder + unlist: ^@eaDir # hide the synology "@eaDir" folders name: synology # shows in the browser, can be anything [accounts] @@ -49,10 +50,6 @@ open the Package Center and install `Text Editor` (by Synology Inc.) to create a /w # the "/w" docker-volume (the shared-folder) accs: A: ed # give Admin to username ed - -# hide the synology system files by creating a hidden volume -[/@eaDir] - /w/@eaDir ``` if you ever change the copyparty config file, then [restart the container](https://ocv.me/copyparty/doc/pics/dsm71-02.png) to make the changes take effect diff --git a/scripts/deps-docker/Dockerfile b/scripts/deps-docker/Dockerfile index 18570e2d..6ea7966e 100644 --- a/scripts/deps-docker/Dockerfile +++ b/scripts/deps-docker/Dockerfile @@ -3,7 +3,7 @@ WORKDIR /z ENV ver_asmcrypto=c72492f4a66e17a0e5dd8ad7874de354f3ccdaa5 \ ver_hashwasm=4.12.0 \ ver_marked=4.3.0 \ - ver_dompf=3.2.7 \ + ver_dompf=3.3.1 \ ver_mde=2.18.0 \ ver_codemirror=5.65.18 \ ver_fontawesome=5.13.0 \ diff --git a/scripts/docker/Dockerfile.dj b/scripts/docker/Dockerfile.dj index b377537b..68d56dd2 100644 --- a/scripts/docker/Dockerfile.dj +++ b/scripts/docker/Dockerfile.dj @@ -18,7 +18,7 @@ RUN apk add -U !pyc \ py3-magic \ vips-jxl vips-heif vips-poppler vips-magick \ py3-numpy fftw libsndfile \ - vamp-sdk vamp-sdk-libs \ + vamp-sdk vamp-sdk-libs keyfinder-cli \ libraw py3-numpy cython \ && apk add -t .bd \ bash wget gcc g++ make cmake patchelf \ diff --git a/scripts/pyinstaller/deps.sha512 b/scripts/pyinstaller/deps.sha512 index 3ec760f9..3b49e889 100644 --- a/scripts/pyinstaller/deps.sha512 +++ b/scripts/pyinstaller/deps.sha512 @@ -28,8 +28,8 @@ f4b4e330995ebe96c0bd06e16e5b26062ece9473f06d369775aa68eab261dedcf32dfdd159acaa22 00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl 8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae packaging-25.0-py3-none-any.whl -3e39ea6e16b502d99a2e6544579095d0f7c6097761cd85135d5e929b9dec1b32e80669a846f94ee8c2cca9be2f5fe728625d09453988864c04e16bb8445c3f91 pillow-11.3.0-cp313-cp313-win_amd64.whl +fa5d24c51e39760fc5121e56e9948384e03f62b66907ba313a6a803dd601832df62fb5066f3019620664d7cc6b0482e13000cd2d3d1553b709a56a347919565e pillow-12.0.0-cp313-cp313-win_amd64.whl b9b98714dfca6fa80b0b3f222965724d63be9c54d19435d1fe768e07016913d6db8d6e043fcb185b55a9bd6fe370a80cf961814fc096046a5f4640d99ed575ef pyinstaller-6.15.0-py3-none-win_amd64.whl cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl -419f499560f09b770060ef336926f5bf2776b5c33937969ce75d1e3263735de1ed6eb2199ae88797cba0e4cb17de4a235beec4d7985f993ecb3de7320c482917 python-3.13.9-amd64.exe +1735728ae50e003badc5266638e41a73358f2151405e7888b6dc45697c074a60e6e58c8507b49a3f42d8f4fe4005fbc225cd766ab6582cbf85aa79bab699c08f python-3.13.11-amd64.exe 2a0420f7faaa33d2132b82895a8282688030e939db0225ad8abb95a47bdb87b45318f10985fc3cee271a9121441c1526caa363d7f2e4a4b18b1a674068766e87 setuptools-80.9.0-py3-none-any.whl diff --git a/scripts/pyinstaller/notes.txt b/scripts/pyinstaller/notes.txt index 92ab8748..e6ae3cd9 100644 --- a/scripts/pyinstaller/notes.txt +++ b/scripts/pyinstaller/notes.txt @@ -39,10 +39,10 @@ fns=( MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl mutagen-1.47.0-py3-none-any.whl packaging-25.0-py3-none-any.whl - pillow-11.3.0-cp313-cp313-win_amd64.whl + pillow-12.0.0-cp313-cp313-win_amd64.whl pyinstaller-6.15.0-py3-none-win_amd64.whl pyinstaller_hooks_contrib-2025.8-py3-none-any.whl - python-3.13.9-amd64.exe + python-3.13.11-amd64.exe setuptools-80.9.0-py3-none-any.whl ) [ $w7 ] && fns+=( diff --git a/scripts/sfx.ls b/scripts/sfx.ls index 59a13916..73e362cf 100644 --- a/scripts/sfx.ls +++ b/scripts/sfx.ls @@ -99,7 +99,6 @@ copyparty/web/md2.js, copyparty/web/mde.css, copyparty/web/mde.html, copyparty/web/mde.js, -copyparty/web/msg.css, copyparty/web/msg.html, copyparty/web/opds.xml, copyparty/web/rups.css, @@ -133,6 +132,7 @@ copyparty/web/tl/spa.js, copyparty/web/tl/swe.js, copyparty/web/tl/tur.js, copyparty/web/tl/ukr.js, +copyparty/web/tl/vie.js, copyparty/web/ui.css, copyparty/web/up2k.js, copyparty/web/util.js, diff --git a/scripts/tl.js b/scripts/tl.js index 7c9010f7..39b6542c 100644 --- a/scripts/tl.js +++ b/scripts/tl.js @@ -113,6 +113,8 @@ Ls.hmn = { ["M", "close textfile"], ["E", "edit textfile"], ["S", "select file (for cut/copy/rename)"], + ["Y", "download textfile"], + ["⇧ J", "beautify json"], ] ], @@ -252,6 +254,7 @@ Ls.hmn = { "ct_ttips": '◔ ◡ ◔">ℹ️ tooltips', "ct_thumb": 'in grid-view, toggle icons or thumbnails$NHotkey: T">🖼️ thumbs', "ct_csel": 'use CTRL and SHIFT for file selection in grid-view">sel', + "ct_dl": 'force download (don\'t display inline) when a file is clicked">dl', "ct_ihop": 'when the image viewer is closed, scroll down to the last viewed file">g⮯', "ct_dots": 'show hidden files (if server permits)">dotfiles', "ct_qdel": 'when deleting files, only ask for confirmation once">qdel', @@ -478,6 +481,7 @@ Ls.hmn = { "tvt_prev": "show previous document$NHotkey: i\">⬆ prev", "tvt_next": "show next document$NHotkey: K\">⬇ next", "tvt_sel": "select file ( for cut / copy / delete / ... )$NHotkey: S\">sel", + "tvt_j": "beautify json$NHotkey: shift-J\">j", "tvt_edit": "open file in text editor$NHotkey: E\">✏️ edit", "tvt_tail": "monitor file for changes; show new lines in real time\">📡 follow", "tvt_wrap": "word-wrap\">↵", @@ -698,11 +702,14 @@ Ls.hmn = { "ta1": "fill in your new password first", "ta2": "repeat to confirm new password:", "ta3": "found a typo; please try again", + "nop": "ERROR: Password cannot be blank", + "nou": "ERROR: Username and/or password cannot be blank", "aa1": "incoming files:", "ab1": "disable no304", "ac1": "enable no304", "ad1": "enabling no304 will disable all caching; try this if k304 wasn't enough. This will waste a huge amount of network traffic!", "ae1": "active downloads:", "af1": "show recent uploads", + "ag1": "view idp cache", // TLNote: is a link to a page where IdP users can be managed } }; diff --git a/scripts/tl.py b/scripts/tl.py index ca890d12..39893445 100755 --- a/scripts/tl.py +++ b/scripts/tl.py @@ -105,12 +105,15 @@ Ls.{lang3} = {{ "ta1": "fill in your new password first", "ta2": "repeat to confirm new password:", "ta3": "found a typo; please try again", + "nop": "ERROR: Password cannot be blank", + "nou": "ERROR: Username and/or password cannot be blank", "aa1": "incoming files:", "ab1": "disable no304", "ac1": "enable no304", "ad1": "enabling no304 will disable all caching; try this if k304 wasn't enough. This will waste a huge amount of network traffic!", "ae1": "active downloads:", "af1": "show recent uploads", + "ag1": "view idp cache", // TLNote: is a link to a page where IdP users can be managed }} }}; """ diff --git a/tests/test_hooks.py b/tests/test_hooks.py index 63a525df..6b366023 100644 --- a/tests/test_hooks.py +++ b/tests/test_hooks.py @@ -78,6 +78,41 @@ class TestHooks(tu.TC): h, b = self.curl(url_dl) self.assertEqual(b, "ok %s\n" % (url_up)) + def test2(self): + hooktxt = "import sys\nopen('h%d','wb').close()\nsys.exit(%d)\n" + for hooktype in ("xbu", "xau"): + for upfun in (self.put, self.bup): + self.reset() + for n in [0, 1, 100]: + with open("h%d.py" % (n,), "wb") as f: + f.write((hooktxt % (n, n)).encode("utf-8")) + vcfg = [ + "012:012:A:c,H=c,h0.py:c,H=c,h1.py:c,H=c,h100.py", + "021:021:A:c,H=c,h0.py:c,H=c,h100.py:c,H=c,h1.py", + "120:120:A:c,H=c,h1.py:c,H=c,h100.py:c,H=c,h0.py", + "30:30:A:c,H=c,enoent.py:c,H=c,h100.py", # not-exist + ] + vcfg = [x.replace("H", hooktype) for x in vcfg] + self.args = Cfg(v=vcfg, a=["o:o"], e2d=True) + self.asrv = AuthSrv(self.args, self.log) + self.cinit() + scenarios = ( + ("012", False, True, True, False), + ("021", True, True, False, True), + ("120", False, False, True, False), + ("30", False, False, False, False), + ) + for (vp, ok, h0, h1, h2) in scenarios: + for zs in ("h0", "h1", "h100"): + if os.path.exists(zs): + os.unlink(zs) + vp = "%s/f" % (vp,) + h, b = upfun(vp) + self.assertEqual(ok, os.path.exists(vp)) + self.assertEqual(h0, os.path.exists("h0")) + self.assertEqual(h1, os.path.exists("h1")) + self.assertEqual(h2, os.path.exists("h100")) + def makehook(self, hs): with open("h.py", "wb") as f: f.write(hs.encode("utf-8")) diff --git a/tests/util.py b/tests/util.py index 0ab2a0e4..184caae4 100644 --- a/tests/util.py +++ b/tests/util.py @@ -143,7 +143,7 @@ class Cfg(Namespace): def __init__(self, a=None, v=None, c=None, **ka0): ka = {} - ex = "allow_flac allow_wav chpw cookie_lax daw dav_auth dav_mac dav_rt e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only http_no_tcp ih ihead localtime log_badxml magic md_no_br nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_dupe_m no_fnugg no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_u2abrt no_zip no_zls nrand nsort nw og og_no_head og_s_title ohead opds q rand re_dirsz reflink rm_partial rmagic rss smb srch_dbg srch_excl srch_icase stats ui_noacci ui_nocpla ui_noctxb ui_nolbar ui_nombar ui_nonav ui_notree ui_norepl ui_nosrvi uqe usernames vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs" + ex = "allow_flac allow_wav chpw cookie_lax daw dav_auth dav_mac dav_rt dlni e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only http_no_tcp ih ihead localtime log_badxml magic md_no_br nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_dupe_m no_fnugg no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_u2abrt no_zip no_zls nrand nsort nw og og_no_head og_s_title ohead opds q rand re_dirsz reflink rm_partial rmagic rss smb srch_dbg srch_excl srch_icase stats ui_noacci ui_nocpla ui_noctxb ui_nolbar ui_nombar ui_nonav ui_notree ui_norepl ui_nosrvi uqe usernames vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs" ka.update(**{k: False for k in ex.split()}) ex = "dav_inf dedup dotpart dotsrch hook_v no_dhash no_fastboot no_fpool no_htp no_rescan no_sendfile no_ses no_snap no_up_list no_voldump wram re_dhash see_dots plain_ip" @@ -158,16 +158,16 @@ class Cfg(Namespace): ex = "hash_mt hsortn qdel safe_dedup scan_pr_r scan_pr_s scan_st_r srch_time tail_fd tail_rate th_spec_p u2abort u2j u2sz unp_who" ka.update(**{k: 1 for k in ex.split()}) - ex = "ac_convt au_vol dl_list du_iwho mtab_age reg_cap s_thead s_tbody tail_tmax tail_who th_convt ups_who ver_iwho zip_who" + ex = "ac_convt au_vol dl_list du_iwho mtab_age reg_cap s_thead s_tbody tail_tmax tail_who th_convt th_qv ups_who ver_iwho zip_who" ka.update(**{k: 9 for k in ex.split()}) ex = "ctl_re db_act forget_ip idp_cookie idp_store k304 loris no304 nosubtle qr_pin qr_wait re_maxage rproxy rsp_jtr rsp_slp s_wr_slp snap_wri theme themes turbo u2ow zipmaxn zipmaxs" ka.update(**{k: 0 for k in ex.split()}) - ex = "ah_alg bname chdir chmod_f chpw_db doctitle df exit favico ipa html_head html_head_d html_head_s idp_login idp_logout lg_sba lg_sbf log_fk md_sba md_sbf name og_desc og_site og_th og_title og_title_a og_title_v og_title_i opds_exts shr tcolor textfiles txt_eol ufavico ufavico_h unlist vname xff_src zipmaxt R RS SR" + ex = "ah_alg bname chdir chmod_f chpw_db doctitle df epilogues exit favico ipa ipar html_head html_head_d html_head_s idp_login idp_logout lg_sba lg_sbf log_date log_fk md_sba md_sbf name og_desc og_site og_th og_title og_title_a og_title_v og_title_i opds_exts preadmes prologues readmes shr tcolor textfiles txt_eol ufavico ufavico_h unlist vname xff_src zipmaxt R RS SR" ka.update(**{k: "" for k in ex.split()}) - ex = "ban_403 ban_404 ban_422 ban_pw ban_pwc ban_url dont_ban spinner" + ex = "ban_403 ban_404 ban_422 ban_pw ban_pwc ban_url dont_ban cachectl rss_fmt_d rss_fmt_t spinner" ka.update(**{k: "no" for k in ex.split()}) ex = "ext_th grp idp_h_usr idp_hm_usr ipr on403 on404 qr_file xac xad xar xau xban xbc xbd xbr xbu xiu xm" @@ -193,6 +193,7 @@ class Cfg(Namespace): du_who="all", dk_salt="b" * 16, fk_salt="a" * 16, + fsnt="lin", grp_all="acct", idp_gsep=re.compile("[|:;+,]"), iobuf=256 * 1024, @@ -208,6 +209,7 @@ class Cfg(Namespace): mv_retry="0/0", rm_retry="0/0", rotf_tz="UTC", + rss_sort="m", s_rd_sz=256 * 1024, s_wr_sz=256 * 1024, shr_who="auth", @@ -353,6 +355,7 @@ class VHttpConn(object): self.ico = Ico(args) self.ipr = None self.ipa_nm = None + self.ipar_nm = None self.lf_url = None self.log_func = log self.log_src = "a"