hfs 0.53.0 → 0.53.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- System.register(["./index-legacy-5MEl9EM8.js"],(function(h,t){"use strict";var i,s;return{setters:[function(h){i=h.g,s=h.c}],execute:function(){function t(h,t){for(var i=function(){var i=t[s];if("string"!=typeof i&&!Array.isArray(i)){var r=function(t){if("default"!==t&&!(t in h)){var s=Object.getOwnPropertyDescriptor(i,t);s&&Object.defineProperty(h,t,s.get?s:{enumerable:!0,get:function(){return i[t]}})}};for(var e in i)r(e)}},s=0;s<t.length;s++)i();return Object.freeze(Object.defineProperty(h,Symbol.toStringTag,{value:"Module"}))}var r={exports:{}};
1
+ System.register(["./index-legacy-BehBxMeJ.js"],(function(h,t){"use strict";var i,s;return{setters:[function(h){i=h.g,s=h.c}],execute:function(){function t(h,t){for(var i=function(){var i=t[s];if("string"!=typeof i&&!Array.isArray(i)){var r=function(t){if("default"!==t&&!(t in h)){var s=Object.getOwnPropertyDescriptor(i,t);s&&Object.defineProperty(h,t,s.get?s:{enumerable:!0,get:function(){return i[t]}})}};for(var e in i)r(e)}},s=0;s<t.length;s++)i();return Object.freeze(Object.defineProperty(h,Symbol.toStringTag,{value:"Module"}))}var r={exports:{}};
2
2
  /*
3
3
  * [js-sha512]{@link https://github.com/emn178/js-sha512}
4
4
  *
@@ -8,7 +8,7 @@
8
8
  </head>
9
9
  <body>
10
10
  <div id="root">Wait for loading or <a href="?get=basic">use basic interface now</a></div>
11
- <script crossorigin id="vite-legacy-polyfill" src="/assets/polyfills-legacy-31b7nyOi.js"></script>
12
- <script crossorigin id="vite-legacy-entry" data-src="/assets/index-legacy-5MEl9EM8.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
11
+ <script crossorigin id="vite-legacy-polyfill" src="/assets/polyfills-legacy-DMrMt_pQ.js"></script>
12
+ <script crossorigin id="vite-legacy-entry" data-src="/assets/index-legacy-BehBxMeJ.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
13
13
  </body>
14
14
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hfs",
3
- "version": "0.53.0",
3
+ "version": "0.53.2",
4
4
  "description": "HTTP File Server",
5
5
  "keywords": [
6
6
  "file server",
@@ -69,7 +69,7 @@
69
69
  ]
70
70
  },
71
71
  "dependencies": {
72
- "@koa/router": "^12.0.1",
72
+ "@koa/router": "^13.0.1",
73
73
  "@node-rs/crc32": "^1.6.0",
74
74
  "@rejetto/kvstorage": "^0.12.2",
75
75
  "acme-client": "^5.3.1",
@@ -87,12 +87,12 @@
87
87
  "limiter": "^2.1.0",
88
88
  "lodash": "^4.17.21",
89
89
  "minimist": "^1.2.6",
90
- "nat-upnp-rejetto": "^2.0.2",
90
+ "nat-upnp-rejetto": "^2.1.0",
91
91
  "open": "^8.4.0",
92
92
  "qr-creator": "^1.0.0",
93
93
  "picomatch": "^3.0.1",
94
94
  "tssrp6a": "^3.0.0",
95
- "unzip-stream": "^0.3.1",
95
+ "unzip-stream": "^0.3.4",
96
96
  "valtio": "^1.10.3",
97
97
  "yaml": "^2.0.0-10"
98
98
  },
@@ -1,7 +1,7 @@
1
1
  // other plugins can use ctx.state.download_counter_ignore to mark downloads that shouldn't be counted
2
2
 
3
3
  exports.description = "Counts downloads for each file, and displays the total in the list or file menu"
4
- exports.version = 6 // new format
4
+ exports.version = 6.1 // fix
5
5
  exports.apiRequired = 8.89 // openDb
6
6
 
7
7
  exports.config = {
@@ -43,7 +43,7 @@ exports.init = async api => {
43
43
  : ctx.state.originalStream?.getArchiveEntries?.().filter(x => x.at(-1) !== '/').map(x => key + uri2key(x))
44
44
  if (!entries) return
45
45
  for (const k of entries)
46
- db.put(k, db.getSync(k) + 1)
46
+ db.put(k, db.getSync(k) + 1 || 1)
47
47
  })
48
48
  },
49
49
  onDirEntry({ entry, listUri }) {
@@ -8,6 +8,6 @@
8
8
 
9
9
  HFS.onEvent('fileMenu', ({ entry, props }) => {
10
10
  if (!entry.isFolder)
11
- props.push([label, entry.hits || 0])
11
+ props.push({ id: 'download-counter', label, value: entry.hits || 0 })
12
12
  })
13
13
  }
package/src/api.net.js CHANGED
@@ -46,18 +46,21 @@ const apis = {
46
46
  async map_port({ external, internal }) {
47
47
  const { upnp, externalPort, internalPort } = await (0, nat_1.getNatInfo)();
48
48
  if (!upnp)
49
- return new apiMiddleware_1.ApiError(const_1.HTTP_SERVICE_UNAVAILABLE, 'upnp failed');
49
+ return new apiMiddleware_1.ApiError(const_1.HTTP_SERVICE_UNAVAILABLE, "upnp failed");
50
50
  if (!internalPort)
51
- return new apiMiddleware_1.ApiError(const_1.HTTP_FAILED_DEPENDENCY, 'no internal port');
51
+ return new apiMiddleware_1.ApiError(const_1.HTTP_FAILED_DEPENDENCY, "no internal port");
52
52
  if (externalPort)
53
53
  try {
54
54
  await nat_1.upnpClient.removeMapping({ public: { host: '', port: externalPort } });
55
55
  }
56
56
  catch (e) {
57
- return new apiMiddleware_1.ApiError(const_1.HTTP_SERVER_ERROR, 'removeMapping failed: ' + String(e));
57
+ return new apiMiddleware_1.ApiError(const_1.HTTP_SERVER_ERROR, "removeMapping failed: " + String(e));
58
58
  }
59
59
  if (external) // must use the object form of 'public' to work around a bug of the library
60
- await nat_1.upnpClient.createMapping({ private: internal || internalPort, public: { host: '', port: external }, description: 'hfs', ttl: 0 });
60
+ await nat_1.upnpClient.createMapping({ private: internal || internalPort, public: { host: '', port: external }, description: 'hfs', ttl: 0 })
61
+ .catch(res => {
62
+ throw new apiMiddleware_1.ApiError(res.errorCode || res.statusCode, res.errorCode === 718 ? "Port not available" : res.errorDescription || "unknown error");
63
+ });
61
64
  return {};
62
65
  },
63
66
  async self_check({ url }) {
package/src/api.vfs.js CHANGED
@@ -221,12 +221,12 @@ const apis = {
221
221
  const url = h.srv.name + '://localhost:' + h.port;
222
222
  for (const k of ['*', 'Directory']) {
223
223
  await reg('add', WINDOWS_REG_KEY.replace('*', k), '/ve', '/f', '/d', 'Add to HFS (new)');
224
- await reg('add', WINDOWS_REG_KEY.replace('*', k) + '\\command', '/ve', '/f', '/d', `powershell -Command "
224
+ await reg('add', WINDOWS_REG_KEY.replace('*', k) + '\\command', '/ve', '/f', '/d', `powershell -WindowStyle Hidden -Command "
225
225
  $wsh = New-Object -ComObject Wscript.Shell;
226
226
  $j = @{parent=@'\n${parent}\n'@; source=@'\n%1\n'@} | ConvertTo-Json -Compress
227
227
  $j = [System.Text.Encoding]::UTF8.GetBytes($j);
228
228
  try {
229
- $res = Invoke-WebRequest -Uri '${url}/~/api/add_vfs' -Method POST -Headers @{ 'x-hfs-anti-csrf' = '1' } -ContentType 'application/json' -TimeoutSec 1 -Body $j;
229
+ $res = Invoke-WebRequest -Uri '${url}/~/api/add_vfs' -Method POST -Headers @{ 'x-hfs-anti-csrf' = '1' } -ContentType 'application/json' -TimeoutSec 2 -Body $j;
230
230
  $json = $res.Content | ConvertFrom-Json; $link = $json.link; $link | Set-Clipboard;
231
231
  $wsh.Popup('The link is ready to be pasted');
232
232
  } catch { $wsh.Popup('Server is down', 0, 'Error', 16); }"`);
package/src/basicWeb.js CHANGED
@@ -46,7 +46,7 @@ function basicWeb(ctx, node) {
46
46
  stream.push(`<title>${adminApis_1.title.get()}</title><body>`);
47
47
  stream.push((0, customHtml_1.getSection)('basicHeader'));
48
48
  const u = (0, auth_1.getCurrentUsername)(ctx);
49
- const links = u ? { [`//LOGOUT%00:@${ctx.get('host')}/?get=logout`]: `Logout (${u})` } : { '/?get=login': "Login" };
49
+ const links = u ? { [`//LOGOUT%00:@${ctx.host}/?get=logout`]: `Logout (${u})` } : { '/?get=login': "Login" };
50
50
  stream.push(lodash_1.default.map(links, (v, k) => a(k, v)).join(' ') + '\n<ul>\n');
51
51
  if (ctx.state.originalPath.length > 1)
52
52
  stream.push('<li>' + a('..' + force, '..') + '\n');
package/src/const.js CHANGED
@@ -45,7 +45,7 @@ exports.DEV = process.env.DEV || exports.argv.dev ? 'DEV' : '';
45
45
  exports.ORIGINAL_CWD = process.cwd();
46
46
  exports.HFS_STARTED = new Date();
47
47
  const PKG_PATH = (0, path_1.join)(__dirname, '..', 'package.json');
48
- exports.BUILD_TIMESTAMP = "2024-07-19T14:05:43.478Z";
48
+ exports.BUILD_TIMESTAMP = "2024-10-25T17:06:39.884Z";
49
49
  const pkg = JSON.parse(fs.readFileSync(PKG_PATH, 'utf8'));
50
50
  exports.VERSION = pkg.version;
51
51
  exports.RUNNING_BETA = exports.VERSION.includes('-');
@@ -66,10 +66,8 @@ console.log('started', exports.HFS_STARTED.toLocaleString(), exports.DEV);
66
66
  console.log('version', exports.VERSION || '-');
67
67
  console.log('build', exports.BUILD_TIMESTAMP || '-');
68
68
  const winExe = exports.IS_WINDOWS && process.execPath.match(/(?<!node)\.exe$/i);
69
- if (exports.argv.cwd)
70
- process.chdir(exports.argv.cwd);
71
- else if (!winExe) { // still considering whether to use this behavior with Windows users, who may be less accustomed to it
72
- const dir = (0, path_1.join)((0, os_1.homedir)(), '.hfs');
69
+ const dir = exports.argv.cwd || !winExe && (0, path_1.join)((0, os_1.homedir)(), '.hfs'); // still considering whether to use this behavior with Windows users, who may be less accustomed to it
70
+ if (dir) {
73
71
  try {
74
72
  (0, fs_1.mkdirSync)(dir);
75
73
  }
package/src/cross.js CHANGED
@@ -351,7 +351,7 @@ function isEqualLax(a, b) {
351
351
  return a == b //eslint-disable-line
352
352
  || (a && b && typeof a === 'object' && typeof b === 'object'
353
353
  && Object.entries(a).every(([k, v]) => isEqualLax(v, b[k]))
354
- && Object.entries(b).every(([k, v]) => Object.hasOwn(a, k) || isEqualLax(v, a[k])));
354
+ && Object.entries(b).every(([k, v]) => k in a || isEqualLax(v, a[k])));
355
355
  }
356
356
  exports.isEqualLax = isEqualLax;
357
357
  function xlate(input, table) {
@@ -364,7 +364,7 @@ function isIpLocalHost(ip) {
364
364
  }
365
365
  exports.isIpLocalHost = isIpLocalHost;
366
366
  function isIpLan(ip) {
367
- return /^(?:10\..*|172\.(1[6-9]|2\d|3[01])\..*|192\.168\..*)$/.test(ip);
367
+ return /^(?:10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|fe80::)/.test(ip);
368
368
  }
369
369
  exports.isIpLan = isIpLan;
370
370
  function ipForUrl(ip) {
@@ -382,7 +382,7 @@ async function promiseBestEffort(promises) {
382
382
  }
383
383
  exports.promiseBestEffort = promiseBestEffort;
384
384
  function pathEncode(s) {
385
- return encodeURI(s).replace(/#/g, encodeURIComponent);
385
+ return encodeURI(s).replace(/#/g, escape);
386
386
  }
387
387
  exports.pathEncode = pathEncode;
388
388
  //unused function pathDecode(s: string) { return decodeURI(s).replace(/%23/g, '#') }
package/src/github.js CHANGED
@@ -100,7 +100,8 @@ async function downloadPlugin(repo, { branch = '', overwrite = false } = {}) {
100
100
  await (0, promises_1.rename)(tempInstallPath, installPath)
101
101
  .catch(e => { throw e.code !== 'ENOENT' ? e : new apiMiddleware_1.ApiError(const_1.HTTP_NOT_ACCEPTABLE, "missing main file"); });
102
102
  if (wasEnabled)
103
- void (0, plugins_1.startPlugin)(folder); // don't wait, in case it fails to start
103
+ void (0, plugins_1.startPlugin)(folder) // don't wait, in case it fails to start
104
+ .catch(() => { }); // it will possibly fail (with 'miss') because the plugin has probably not been loaded yet.
104
105
  return folder;
105
106
  }
106
107
  }
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const hfs_lang_it_json_1 = __importDefault(require("./hfs-lang-it.json"));
7
7
  const hfs_lang_zh_json_1 = __importDefault(require("./hfs-lang-zh.json"));
8
8
  const hfs_lang_ru_json_1 = __importDefault(require("./hfs-lang-ru.json"));
9
+ const hfs_lang_ro_json_1 = __importDefault(require("./hfs-lang-ro.json"));
9
10
  const hfs_lang_sr_json_1 = __importDefault(require("./hfs-lang-sr.json"));
10
11
  const hfs_lang_ko_json_1 = __importDefault(require("./hfs-lang-ko.json"));
11
12
  const hfs_lang_ms_json_1 = __importDefault(require("./hfs-lang-ms.json"));
@@ -20,4 +21,7 @@ const hfs_lang_de_json_1 = __importDefault(require("./hfs-lang-de.json"));
20
21
  const hfs_lang_fi_json_1 = __importDefault(require("./hfs-lang-fi.json"));
21
22
  const hfs_lang_hu_json_1 = __importDefault(require("./hfs-lang-hu.json"));
22
23
  const hfs_lang_ja_json_1 = __importDefault(require("./hfs-lang-ja.json"));
23
- exports.default = { it: hfs_lang_it_json_1.default, zh: hfs_lang_zh_json_1.default, ru: hfs_lang_ru_json_1.default, sr: hfs_lang_sr_json_1.default, ko: hfs_lang_ko_json_1.default, ms: hfs_lang_ms_json_1.default, 'zh-tw': hfs_lang_zh_tw_json_1.default, fr: hfs_lang_fr_json_1.default, 'pt-br': hfs_lang_pt_br_json_1.default, vi: hfs_lang_vi_json_1.default, es: hfs_lang_es_json_1.default, nl: hfs_lang_nl_json_1.default, el: hfs_lang_el_json_1.default, de: hfs_lang_de_json_1.default, fi: hfs_lang_fi_json_1.default, hu: hfs_lang_hu_json_1.default, ja: hfs_lang_ja_json_1.default };
24
+ const hfs_lang_tr_json_1 = __importDefault(require("./hfs-lang-tr.json"));
25
+ const hfs_lang_th_json_1 = __importDefault(require("./hfs-lang-th.json"));
26
+ const hfs_lang_uk_json_1 = __importDefault(require("./hfs-lang-uk.json"));
27
+ exports.default = { it: hfs_lang_it_json_1.default, zh: hfs_lang_zh_json_1.default, ru: hfs_lang_ru_json_1.default, sr: hfs_lang_sr_json_1.default, ko: hfs_lang_ko_json_1.default, ms: hfs_lang_ms_json_1.default, 'zh-tw': hfs_lang_zh_tw_json_1.default, fr: hfs_lang_fr_json_1.default, 'pt-br': hfs_lang_pt_br_json_1.default, vi: hfs_lang_vi_json_1.default, es: hfs_lang_es_json_1.default, nl: hfs_lang_nl_json_1.default, el: hfs_lang_el_json_1.default, de: hfs_lang_de_json_1.default, fi: hfs_lang_fi_json_1.default, hu: hfs_lang_hu_json_1.default, ja: hfs_lang_ja_json_1.default, ro: hfs_lang_ro_json_1.default, tr: hfs_lang_tr_json_1.default, th: hfs_lang_th_json_1.default, uk: hfs_lang_uk_json_1.default };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "author": "Pultsari & Win_7",
3
3
  "version": 1.2,
4
- "hfs_version": "0.53.0b8",
4
+ "hfs_version": "0.54.0a1",
5
5
  "translate": {
6
6
  "Select": "Valitse",
7
7
  "n_files": "{n,plural,one{# tiedosto} other{# tiedostoa}}",
@@ -143,7 +143,7 @@
143
143
  "clipboard_list": "Kohteet leikepöydällä:",
144
144
  "Close": "Sulje",
145
145
  "Folder": "Kansio",
146
- "Web page": "Verkko sivu",
146
+ "Web page": "Verkkosivu",
147
147
  "Link": "Linkki",
148
148
  "Auto-play": "Auto-toisto",
149
149
  "autoplay_seconds": "Sekunteja odottaa kuvissa",
@@ -163,6 +163,8 @@
163
163
  "to_clipboard_source_tooltip": "Mene kansioon jossa leikepöydän kohteet sijaitsevat",
164
164
  "more_items": "{n} lisää kohdetta",
165
165
  "Show details": "Näytä yksityiskohdat",
166
- "upload_conflict": "on jo olemassa"
166
+ "upload_conflict": "on jo olemassa",
167
+ "Logged in": "Kirjauduttu sisään",
168
+ "Logged out": "Kirjauduttu ulos"
167
169
  }
168
170
  }
@@ -1,14 +1,14 @@
1
1
  {
2
- "author": "unknown",
3
- "version": 0.3,
4
- "hfs_version": "0.52.0",
2
+ "author": "killersolyom",
3
+ "version": 0.4,
4
+ "hfs_version": "0.53.0",
5
5
  "translate": {
6
6
  "Select": "Kiválasztás",
7
7
  "n_files": "{n,többes szám,egy{# file} egyéb{# file}}",
8
8
  "n_folders": "{n,többes szám,egy{# folder} egyéb{# folder}}",
9
9
  "filter_count": "{n,többes szám, egy{# filtered} egyéb{# filtered}}",
10
10
  "select_count": "{n,többes szám, egy{# selected} egyéb{# selected}}",
11
- "filter_placeholder": "Kulcsszó a fájlok és mappák szűréséhez",
11
+ "filter_placeholder": "Kulcsszó fájlok és mappák szűréséhez",
12
12
  "Select some files": "Válasszon ki néhány fájlt",
13
13
  "zip_checkboxes": "Használja a jelölőnégyzeteket a fájlok kiválasztásához, majd újra használhatja a Zip-et",
14
14
  "zip_tooltip_selected": "A kiválasztott elemek letöltése egyetlen zip-fájlként",
@@ -29,11 +29,12 @@
29
29
  "Searching": "Keresés",
30
30
  "Searched": "Keresett",
31
31
  "Clear search": "Keresés törlése",
32
- "Interrupted": "Megszakított",
33
- "stopped_before": "megállt_előtte",
32
+ "Interrupted": "Megszakadt",
33
+ "stopped_before": "A keresés megszakadt mielőtt bármit is találat volna.",
34
34
  "empty_list": "Üres mappa",
35
35
  "filter_negy": "Nincs szűrő",
36
- "Admin-panel": "Adminisztrációs panel",
36
+ "filter_none": "Nincs találat ezzel a szűrő beállítással",
37
+ "Admin-panel": "Admin panel",
37
38
  "Login": "Bejelentkezés",
38
39
  "Username": "Felhasználónév",
39
40
  "Password": "Jelszó",
@@ -42,18 +43,18 @@
42
43
  "login_bad_cookies": "A cookie-k nem működnek - a bejelentkezés sikertelen",
43
44
  "User panel": "Felhasználói panel",
44
45
  "Change password": "Jelszó módosítása",
45
- "enter_pass": "Új jelszó megadása",
46
- "enter_pass2": "Adja meg újra ugyanazt az új jelszót",
47
- "pass2_mismatch": "A megadott második jelszó nem egyezett meg az elsővel. A művelet megszakadt.",
48
- "password_changed": "Jelszó megváltoztatása",
46
+ "enter_pass": "Írja be az új jelszavát",
47
+ "enter_pass2": "Írja be az új jelszavát még egyszer",
48
+ "pass2_mismatch": "A megadott jelszavak nem egyeznek meg! A művelet megszakadt.",
49
+ "password_changed": "Jelszó megváltoztatva",
49
50
  "Logout": "Kijelentkezés",
50
51
  "connection error": "csatlakozási hiba",
51
52
  "Full timestamp:": "Teljes időbélyeg:",
52
53
  "Search was interrupted": "A keresés megszakadt",
53
- "Stop list": "Stop lista",
54
- "download_starting": "A letöltésnek hamarosan elkezdődik",
54
+ "Stop list": "Betöltés megszakítása",
55
+ "download_starting": "A letöltés hamarosan elkezdődik",
55
56
  "wrong_account": "A(z) {u} fióknak nincs hozzáférése, próbálkozzon egy másikkal",
56
- "no_upload_here": "Nincs feltöltési engedély az aktuális mappához",
57
+ "no_upload_here": "Nincs feltöltési engedélye az aktuális mappához",
57
58
  "Create folder": "Mappa létrehozása",
58
59
  "Pick files": "Fájlok kiválasztása",
59
60
  "Pick folder": "Mappa kiválasztása",
@@ -118,11 +119,11 @@
118
119
  "Switch zoom mode": "Nagyítás módra váltás",
119
120
  "Full screen": "Teljes képernyő",
120
121
  "File Show help": "File Nézet segítség",
121
- "showHelpMain": "Néhány művelethez használhatod a billentyűzetet:",
122
+ "showHelpMain": "A következő műveletekhez használhatod a billentyűzetet:",
122
123
  "showHelp_space": "szóköz",
123
- "showHelp_←/→_body": "ugrás az előző/következő fájlra",
124
- "showHelp_↑/↓_body": "hosszú képek görgetése",
125
- "showHelp_space_body": "kiválasztás",
124
+ "showHelp_←/→_body": "Ugrás az előző/következő fájlra",
125
+ "showHelp_↑/↓_body": "Hosszú képek görgetése",
126
+ "showHelp_space_body": "Kiválasztás",
126
127
  "showHelp_D_body": "letöltés",
127
128
  "showHelp_Z_body": "nagyitó módra váltás",
128
129
  "showHelp_F_body": "teljes képernyő",
@@ -157,6 +158,13 @@
157
158
  "Overwrite policy": "Felülírási irányelv",
158
159
  "Rename to avoid overwriting": "Átnevez, hogy elkerülje a felülírást",
159
160
  "Overwrite existing files": "Létező fájlok felülírása",
160
- "Menu": "Menü"
161
+ "Menu": "Menü",
162
+ "clipboard": "Vágólap ({content})",
163
+ "to_clipboard_source_tooltip": "Ugrorás a mappába ahova a vágólap tartalma mutat",
164
+ "more_items": "{n} több elem(ek)",
165
+ "Show details": "Részletek mutatása",
166
+ "upload_conflict": "Már létezik",
167
+ "Logged in": "Bejelentkezett",
168
+ "Logged out": "Kijelentkezett"
161
169
  }
162
170
  }
@@ -0,0 +1,166 @@
1
+ {
2
+ "author": "Ovidiu",
3
+ "version": 1.0,
4
+ "hfs_version": "0.53.0",
5
+ "translate": {
6
+ "Select": "Selectează",
7
+ "n_files": "{n,plural,one{# fișier} other{# fișiere}}",
8
+ "n_folders": "{n,plural,one{# folder} other{# foldere}}",
9
+ "filter_count": "{n,plural, one{# filtrat} other{# filtrate}}",
10
+ "select_count": "{n,plural, one{# selectat} other{# selectate}}",
11
+ "filter_placeholder": "Tastează aici pentru a filtra lista de mai jos (caută după cuvinte cheie)",
12
+ "Select some files": "Selectează câteva fișiere",
13
+ "zip_checkboxes": "Folosește căsuțele de selectare pentru a alege fișierele, apoi poți folosi Zip din nou",
14
+ "zip_tooltip_selected": "Descarcă elementele selectate ca un singur fișier zip",
15
+ "zip_tooltip_whole": "Descarcă întreaga listă (nefiltrată) ca un singur fișier zip. Dacă selectezi câteva elemente, doar acelea vor fi descărcate.",
16
+ "zip_confirm_search": "Ești sigur că vrei să descarci TOATE rezultatele acestei căutări sub formă de arhivă ZIP?",
17
+ "zip_confirm_folder": "Ești sigur că vrei să descarci ÎNTREGUL folder sub formă de arhivă ZIP?",
18
+ "select_tooltip": "Selecția se aplică pentru \"Zip\" și \"Șterge\" (când sunt disponibile), dar poți, de asemenea, filtra lista",
19
+ "delete_hint": "Pentru a șterge, prima dată fă clic pe Selectează",
20
+ "delete_confirm": "Ștergi {n,plural, one{# element} other{# elemente}}?",
21
+ "delete_completed": "Ștergere: {n} completată",
22
+ "delete_failed": ", {n,plural, one{# eșuat} other{# eșuate}}",
23
+ "delete_select": "Selectează ceva de șters",
24
+ "Delete": "Șterge",
25
+ "Options": "Opțiuni",
26
+ "Search": "Căutare",
27
+ "Zip": "Zip",
28
+ "search_msg": "Caută în acest folder și în sub-foldere",
29
+ "Searching": "Căutare",
30
+ "Searched": "Căutat",
31
+ "Clear search": "Șterge căutarea",
32
+ "Interrupted": "Intrerupt",
33
+ "stopped_before": "Oprit înainte de a găsi ceva",
34
+ "empty_list": "Lista este goală. Nu este nimic aici",
35
+ "filter_none": "Niciun rezultat pentru filtrul aplicat",
36
+ "Admin-panel": "Panoul de administrare",
37
+ "Login": "Autentificare",
38
+ "Username": "Nume utilizator",
39
+ "Password": "Parolă",
40
+ "login_untrusted": "Autentificare anulată: identitatea serverului nu poate fi de încredere",
41
+ "login_bad_credentials": "Numele de utilizator sau parola sunt incorecte. Te rugăm să re-efectuezi logarea.",
42
+ "login_bad_cookies": "Cookies nefuncționale - autentificare eșuată",
43
+ "User panel": "Panoul utilizatorului",
44
+ "Change password": "Schimbă parola",
45
+ "enter_pass": "Introdu noua parolă",
46
+ "enter_pass2": "RE-introdu aceeași parolă nouă",
47
+ "pass2_mismatch": "A doua parolă introdusă nu se potrivește cu prima. Procedura a fost anulată.",
48
+ "password_changed": "Parola a fost schimbată cu succes",
49
+ "Logout": "Deconectare",
50
+ "connection error": "eroare de conexiune",
51
+ "Full timestamp:": "Marcaj complet de timp:",
52
+ "Search was interrupted": "Căutarea a fost întreruptă",
53
+ "Stop list": "Oprire listă",
54
+ "download_starting": "Descărcarea ar trebui să înceapă acum",
55
+ "wrong_account": "Contul {u} nu are acces, încearcă alt cont care are drepturi.",
56
+ "no_upload_here": "Nicio permisiune de încărcare pentru folderul curent",
57
+ "Create folder": "Creează folder",
58
+ "Pick files": "Selectează fișiere",
59
+ "Pick folder": "Selectează folder",
60
+ "send_files": "Trimite {n,plural,one{# fișier} other{# fișiere}}, {size}",
61
+ "Clear": "Șterge",
62
+ "failed_upload": "Nu s-a putut încărca {name}",
63
+ "confirm_resume": "Continuă încărcarea?",
64
+ "file too large": "Fișierul este prea mare",
65
+ "Enter folder name": "Introdu numele folderului",
66
+ "Successfully created": "Creat cu succes",
67
+ "enter_folder": "Intră în folder",
68
+ "folder_exists": "Există deja un folderul cu același nume",
69
+ "Sort by:": "Sortați după: {by}",
70
+ "name": "nume",
71
+ "extension": "extensie",
72
+ "size": "dimensiune",
73
+ "time": "dată",
74
+ "Invert order": "Inversează ordinea",
75
+ "Folders first": "Folderele mai întâi",
76
+ "Numeric names": "Nume numerice",
77
+ "theme:": "temă:",
78
+ "auto": "automat",
79
+ "light": "luminos",
80
+ "dark": "întunecat",
81
+ "parent folder": "Folder sursă",
82
+ "home": "acasă",
83
+ "Continue": "Continuă",
84
+ "Confirm": "Confirmă",
85
+ "Don't": "Nu",
86
+ "Warning": "Atenție",
87
+ "Error": "Eroare",
88
+ "Info": "Informații",
89
+ "Unauthorized": "Neautorizat",
90
+ "Forbidden": "Interzis",
91
+ "Not found": "Nu a fost găsit",
92
+ "Server error": "Eroare de server",
93
+ "Upload": "Încărcare",
94
+ "upload_concluded": "Încărcare încheiată:",
95
+ "upload_finished": "{n} terminat ({size})",
96
+ "upload_errors": "{n} eșuat",
97
+ "upload_file_rejected": "Unele fișiere nu au fost acceptate",
98
+ "File menu": "Meniu fișier",
99
+ "Folder menu": "Meniu folder",
100
+ "Name": "Nume",
101
+ "file_open": "Deschide",
102
+ "Download": "Descarcă",
103
+ "Missing permission": "Permisiune lipsă",
104
+ "Reload": "Reîncarcă",
105
+ "Get list": "Obține lista",
106
+ "Skip existing files": "Sari peste fișierele deja existente",
107
+ "Size": "Dimensiune",
108
+ "Timestamp": "Data încărcării",
109
+ "Show": "Arată",
110
+ "Loading failed": "Încărcare eșuată",
111
+ "Rename": "Redenumește",
112
+ "Tiles mode:": "Dimensiunea iconițelor:",
113
+ "off": "0",
114
+ "Operation successful": "Operațiune reușită",
115
+ "Uploader": "Încărcător",
116
+ "Download counter": "Contor descărcări",
117
+ "Switch zoom mode": "Comută pe modul zoom",
118
+ "Full screen": "Ecran complet",
119
+ "File Show help": "Ajutor afișare fișier",
120
+ "showHelpMain": "Poți folosi tastatura pentru anumite acțiuni:",
121
+ "showHelp_←/→": "←/→",
122
+ "showHelp_↑/↓": "↑/↓",
123
+ "showHelp_space": "spațiu",
124
+ "showHelp_←/→_body": "Mergi la fișierul anterior/următor",
125
+ "showHelp_↑/↓_body": "Derulează imagini înalte",
126
+ "Destination": "Destinație",
127
+ "in_queue": "{n} în așteptare",
128
+ "enter_comment": "Comentariu pentru {name}",
129
+ "Comment": "Comentariu",
130
+ "upload_dd_hint": "Poți încărca fișiere făcând drag&drop pe lista de fișiere",
131
+ "Upload not available": "Încărcarea nu este disponibilă",
132
+ "Cut": "Decupează",
133
+ "n_items": "{n,plural, one{# element} other{# elemente}}",
134
+ "good_bad": "{good} mutat, {bad} eșuat",
135
+ "after_cut": "Selecția ta este acum în clipboard.\nMergi în folderul destinație pentru a lipi.",
136
+ "Cancel clipboard": "Anulează clipboard",
137
+ "to_clipboard_source": "Înapoi la folderul sursă",
138
+ "Paste": "Lipește",
139
+ "clipboard_list": "Elemente în clipboard:",
140
+ "Close": "Închide",
141
+ "Folder": "Folder",
142
+ "Web page": "Pagini web",
143
+ "Link": "Link",
144
+ "Auto-play": "Redare automată",
145
+ "autoplay_seconds": "Redare automată pe interval de secunde",
146
+ "Select all": "Selectează tot",
147
+ "go_first": "Mergi la primul element",
148
+ "go_last": "Mergi la ultimul element",
149
+ "Shuffle": "Amestecă",
150
+ "Repeat": "Repetă",
151
+ "showHelpListShortcut": "Din lista de fișiere, fă clic ținând apăsat {key} pentru a arăta rapid",
152
+ "Invalid value": "Valoare invalidă",
153
+ "upload_skipped": "{n} sărit",
154
+ "Overwrite policy": "Politică de suprascriere",
155
+ "Rename to avoid overwriting": "Redenumește pentru a evita suprascrierea",
156
+ "Overwrite existing files": "Suprascrie fișierele existente",
157
+ "Menu": "Meniu",
158
+ "clipboard": "Clipboard ({content})",
159
+ "to_clipboard_source_tooltip": "Mergi la folderul unde se află conținutul clipboard-ului",
160
+ "more_items": "{n} mai multe element(e)",
161
+ "Show details": "Arată detalii",
162
+ "upload_conflict": "deja există",
163
+ "Logged in": "Autentificat cu succes",
164
+ "Logged out": "Deconectat cu succes"
165
+ }
166
+ }