Merge branch 'vnext' into sw

This commit is contained in:
Danny Coates 2018-07-13 12:27:39 -07:00
commit 23c347175a
No known key found for this signature in database
GPG key ID: 4C442633C62E00CB
48 changed files with 431 additions and 234 deletions

View file

@ -270,6 +270,7 @@ function download(id, keychain, onprogress, canceller) {
const blob = new Blob([xhr.response]);
resolve(blob);
});
xhr.addEventListener('progress', function(event) {
if (event.lengthComputable && event.target.status === 200) {
onprogress([event.loaded, event.total]);
@ -278,8 +279,10 @@ function download(id, keychain, onprogress, canceller) {
const auth = await keychain.authHeader();
xhr.open('get', `/api/download/${id}`);
xhr.setRequestHeader('Authorization', auth);
xhr.setRequestHeader('Connection', 'close');
xhr.responseType = 'blob';
xhr.send();
onprogress([0, 1]);
});
}

View file

@ -4,6 +4,7 @@ import app from './routes';
import locale from '../common/locales';
import fileManager from './fileManager';
import dragManager from './dragManager';
import pasteManager from './pasteManager';
import { canHasSend } from './utils';
import storage from './storage';
import metrics from './metrics';
@ -52,5 +53,6 @@ app.use(metrics);
app.use(fileManager);
app.use(dragManager);
app.use(experiments);
app.use(pasteManager);
app.mount('body');

25
app/pasteManager.js Normal file
View file

@ -0,0 +1,25 @@
/* global MAXFILESIZE */
import { bytes } from './utils';
export default function(state, emitter) {
window.addEventListener('paste', event => {
if (state.route !== '/' || state.uploading) return;
for (const item of event.clipboardData.items) {
if (!item.type.includes('image')) continue;
const file = item.getAsFile();
if (!file) continue; // Sometimes null
if (file.size > MAXFILESIZE) {
// eslint-disable-next-line no-alert
alert(state.translate('fileTooBig', { size: bytes(MAXFILESIZE) }));
continue;
}
emitter.emit('upload', { file, type: 'paste' });
return; // return here since only one file is allowed to be uploaded at a time
}
});
}

View file

@ -19,7 +19,8 @@ module.exports = function(file, state, emit) {
onclick=${copyClick}
src="${assets.get('copy-16.svg')}"
class="cursor--pointer"
title="${state.translate('copyUrlHover')}">
title="${state.translate('copyUrlHover')}"
tabindex="0">
<span hidden="true">
${state.translate('copiedUrl')}
</span>
@ -33,7 +34,8 @@ module.exports = function(file, state, emit) {
onclick=${showPopup}
src="${assets.get('close-16.svg')}"
class="cursor--pointer"
title="${state.translate('deleteButtonHover')}">
title="${state.translate('deleteButtonHover')}"
tabindex="0">
${deletePopup(
state.translate('deletePopupText'),
state.translate('deletePopupYes'),

View file

@ -6,8 +6,7 @@ module.exports = function(state) {
<div class="legalSection">
<a
href="https://www.mozilla.org"
class="legalSection__link"
role="presentation">
class="legalSection__link">
<img
class="legalSection__mozLogo"
src="${assets.get('mozilla-logo.svg')}"
@ -43,8 +42,7 @@ module.exports = function(state) {
<div class="socialSection">
<a
href="https://github.com/mozilla/send"
class="socialSection__link"
role="presentation">
class="socialSection__link">
<img
class="socialSection__icon"
src="${assets.get('github-icon.svg')}"
@ -52,8 +50,7 @@ module.exports = function(state) {
</a>
<a
href="https://twitter.com/FxTestPilot"
class="socialSection__link"
role="presentation">
class="socialSection__link">
<img
class="socialSection__icon"
src="${assets.get('twitter-icon.svg')}"

198
package-lock.json generated
View file

@ -4951,28 +4951,24 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"bundled": true,
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"bundled": true,
"dev": true
},
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"bundled": true,
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -4982,14 +4978,12 @@
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"bundled": true,
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"bundled": true,
"dev": true,
"requires": {
"balanced-match": "1.0.0",
@ -4998,40 +4992,34 @@
},
"chownr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
"integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
"bundled": true,
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"bundled": true,
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"bundled": true,
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"bundled": true,
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"bundled": true,
"dev": true,
"optional": true
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5040,29 +5028,25 @@
},
"deep-extend": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
"integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
"bundled": true,
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"bundled": true,
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"bundled": true,
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5071,15 +5055,13 @@
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"bundled": true,
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5095,8 +5077,7 @@
},
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5110,15 +5091,13 @@
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"bundled": true,
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.21",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
"integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5127,8 +5106,7 @@
},
"ignore-walk": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5137,8 +5115,7 @@
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5148,21 +5125,18 @@
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"bundled": true,
"dev": true
},
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"bundled": true,
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"bundled": true,
"dev": true,
"requires": {
"number-is-nan": "1.0.1"
@ -5170,15 +5144,13 @@
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"bundled": true,
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"bundled": true,
"dev": true,
"requires": {
"brace-expansion": "1.1.11"
@ -5186,14 +5158,12 @@
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"bundled": true,
"dev": true
},
"minipass": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz",
"integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==",
"bundled": true,
"dev": true,
"requires": {
"safe-buffer": "5.1.1",
@ -5202,8 +5172,7 @@
},
"minizlib": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
"integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5212,8 +5181,7 @@
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"bundled": true,
"dev": true,
"requires": {
"minimist": "0.0.8"
@ -5221,15 +5189,13 @@
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"bundled": true,
"dev": true,
"optional": true
},
"needle": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz",
"integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5240,8 +5206,7 @@
},
"node-pre-gyp": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz",
"integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5259,8 +5224,7 @@
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5270,15 +5234,13 @@
},
"npm-bundled": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz",
"integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==",
"bundled": true,
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz",
"integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5288,8 +5250,7 @@
},
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5301,21 +5262,18 @@
},
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"bundled": true,
"dev": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"bundled": true,
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"bundled": true,
"dev": true,
"requires": {
"wrappy": "1.0.2"
@ -5323,22 +5281,19 @@
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"bundled": true,
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"bundled": true,
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5348,22 +5303,19 @@
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"bundled": true,
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"bundled": true,
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
"integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5375,8 +5327,7 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"bundled": true,
"dev": true,
"optional": true
}
@ -5384,8 +5335,7 @@
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5400,8 +5350,7 @@
},
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5410,49 +5359,42 @@
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
"bundled": true,
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"bundled": true,
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"bundled": true,
"dev": true,
"optional": true
},
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
"bundled": true,
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"bundled": true,
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"bundled": true,
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"bundled": true,
"dev": true,
"requires": {
"code-point-at": "1.1.0",
@ -5462,8 +5404,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5472,8 +5413,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "2.1.1"
@ -5481,15 +5421,13 @@
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"bundled": true,
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz",
"integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5504,15 +5442,13 @@
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"bundled": true,
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
"integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
@ -5521,14 +5457,12 @@
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"bundled": true,
"dev": true
},
"yallist": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
"integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
"bundled": true,
"dev": true
}
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Göndərməyə hazır
uploadSvgAlt = Yüklə
uploadSuccessTimingHeader = Faylınızın keçidinin 1 endirmədən və ya 24 saatdan sonra vaxtı çıxacaq.
expireInfo = Faylınız üçün keçidin vaxtı { $downloadCount } sonra və ya { $timespan } tarixində keçəcək.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 endirmə
*[other] { $num } endirmə
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 saat
*[other] { $num } saat
}

View file

@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized.
# Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteSubtitle = ওয়েব গবেষণা
siteFeedback = প্রতিক্রিয়া
@ -15,11 +15,13 @@ uploadingPageCancel = আপলোড বাতিল করুন
uploadCancelNotification = আপনার অাপলোড বাতিল করা হয়েছে।
uploadSuccessConfirmHeader = পাঠানোর জন্য প্রস্তুত
uploadSvgAlt = আপলোড
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 ডাউনলোড
*[other] { $num } ডাউনলোডগুলো
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ঘন্টা
*[other] { $num } ঘন্টা
}
@ -27,20 +29,20 @@ copyUrlFormButton = ক্লিপবোর্ডে কপি করুন
copiedUrl = কপি করা হয়েছে!
deleteFileButton = ফাইল মুছুন
sendAnotherFileLink = আরেকটি ফাইল পাঠান
// Alternative text used on the download link/button (indicates an action).
# Alternative text used on the download link/button (indicates an action).
downloadAltText = ডাউনলোড
downloadsFileList = ডাউনলোডগুলো
// Used as header in a column indicating the amount of time left before a
// download link expires (e.g. "10h 5m")
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = সময়
// Used as header in a column indicating the number of times a file has been
// downloaded
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = ডাউনলোড { $filename }
downloadFileSize = ({ $size })
unlockInputLabel = পাসওয়ার্ড লিখুন
unlockInputPlaceholder = পাসওয়ার্ড
unlockButtonLabel = আনলক করুন
// Text and title used on the download link/button (indicates an action).
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = ডাউনলোড
downloadNotification = আপনার ডাউনলোড সম্পন্ন হয়েছে।
downloadFinish = ডাউনলোড সম্পন্ন
@ -53,7 +55,7 @@ updateFirefox = Firefox হালনাগাদ করুন
downloadFirefoxButtonSub = বিনামূল্যে ডাউনলোড
uploadedFile = ফাইল
copyFileList = URL অনুলিপি করুন
// expiryFileList is used as a column header
# expiryFileList is used as a column header
expiryFileList = মেয়াদোত্তীর্ণ তারিখ
deleteFileList = মুছে ফেলুন
nevermindButton = কিছু মনে করবেন না
@ -64,7 +66,7 @@ deletePopupCancel = বাতিল
deleteButtonHover = মুছে ফেলুন
copyUrlHover = URL অনুলিপি করুন
footerLinkLegal = আইনগত
// Test Pilot is a proper name and should not be localized.
# Test Pilot is a proper name and should not be localized.
footerLinkAbout = Test Pilot পরিচিতি
footerLinkPrivacy = গোপনীয়তা
footerLinkTerms = শর্তাবলী

View file

@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Spremno za slanje
uploadSvgAlt = Otpremi
uploadSuccessTimingHeader = Veza prema vašoj datoteci će isteći nakon prvog preuzimanja ili za 24 sata.
expireInfo = Link za vašu datoteku će isteći nakon { $downloadCount } ili { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 preuzimanja
[few] { $num } preuzimanja
*[other] { $num } preuzimanja
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 sat
[few] { $num } sata
*[other] { $num } sati

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Ütz chik richin Nitaq
uploadSvgAlt = Tijotob'äx
uploadSuccessTimingHeader = Ri ruximonel yakb'äl xtik'is ruq'ijul toq xtiqasäx jumul o pa 24 ramaj.
expireInfo = Ri ruximöy ayakb'al xtik'is ruq'ijul chi rij ri { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 qasanïk
*[other] { $num } taq qasanïk
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ramaj
*[other] { $num } taq ramaj
}

View file

@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Připraveno k odeslání
uploadSvgAlt = Nahrát
uploadSuccessTimingHeader = Platnost odkazu na váš soubor vyprší po jeho prvním stažení, nebo po 24 hodinách.
expireInfo = Platnost odkazu na váš soubor vyprší po { $downloadCount } nebo { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] jednom stažení
[few] { $num } staženích
*[other] { $num } staženích
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] jedné hodině
[few] { $num } hodinách
*[other] { $num } hodinách
@ -88,8 +90,8 @@ expiryFileList = Platnost vyprší za
deleteFileList = Smazat
nevermindButton = Nevadí
legalHeader = Podmínky a ochrana soukromí
legalNoticeTestPilot = Firefox Send je ve fázi experimentu projektu Test Pilot a platí tak pro něj stejné <a>Podmínky používání</a> a <a>Zásady ochrany soukromí</a>. Více o tomto experimentu a sbíraných datech se dozvíte <a>zde</a>.
legalNoticeMozilla = Používání webové služby Firefox Send se řídí <a>Zásadami ochrany soukromí</a> a <a>Podmínkami používání</a> webových stránek Mozilly.
legalNoticeTestPilot = Firefox Send je ve fázi experimentu projektu Test Pilot a platí tak pro něj stejné <a>Podmínky používání</a> a <a>Zásady ochrany osobních údajů</a>. Více o tomto experimentu a sbíraných datech se dozvíte <a>zde</a>.
legalNoticeMozilla = Používání webové služby Firefox Send se řídí <a>Zásadami ochrany osobních údajů</a> a <a>Podmínkami používání</a> webových stránek Mozilly.
deletePopupText = Smazat tento soubor?
deletePopupYes = Ano
deletePopupCancel = Zrušit

View file

@ -26,13 +26,15 @@ uploadSuccessConfirmHeader = Gótowy za słanje
uploadSvgAlt = Nagraś
uploadSuccessTimingHeader = Wótkaz k wašej dataji pó 1 ześěgnjenju abo 24 góźinach spadnjo.
expireInfo = Wótkaz k wašej dataji pó { $downloadCount } abo { $timespan } spadnjo.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 ześěgnjenje
[two] { $num } ześěgnjeni
[few] { $num } ześěgnjenja
*[other] { $num } ześěgnjenjow
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 góźina
[two] { $num } góźinje
[few] { $num } góźiny

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Έτοιμο για αποστολή
uploadSvgAlt = Μεταφόρτωση
uploadSuccessTimingHeader = Ο σύνδεσμος του αρχείου σας θα λήξει έπειτα από 1 λήψη ή 24 ώρες.
expireInfo = Ο σύνδεσμος για το αρχείο σας θα λήξει μετά από { $downloadCount } ή { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 λήψη
*[other] { $num } λήψεις
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ώρα
*[other] { $num } ώρες
}

View file

@ -0,0 +1,121 @@
# Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteSubtitle = web experiment
siteFeedback = Feedback
uploadPageHeader = Private, Encrypted File Sharing
uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
uploadPageLearnMore = Learn more
uploadPageDropMessage = Drop your file here to start uploading
uploadPageSizeMessage = For the most reliable operation, its best to keep your file under 1GB
uploadPageBrowseButton = Select a file on your computer
uploadPageBrowseButton1 = Select a file to upload
uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported.
uploadPageBrowseButtonTitle = Upload file
uploadingPageProgress = Uploading { $filename } ({ $size })
importingFile = Importing…
verifyingFile = Verifying…
encryptingFile = Encrypting…
decryptingFile = Decrypting…
notifyUploadDone = Your upload has finished.
uploadingPageMessage = Once your file uploads you will be able to set expiry options.
uploadingPageCancel = Cancel upload
uploadCancelNotification = Your upload was cancelled.
uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight!
uploadingFileNotification = Notify me when the upload is complete.
uploadSuccessConfirmHeader = Ready to Send
uploadSvgAlt = Upload
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
expireInfo = The link to your file will expire after { $downloadCount } or { $timespan }.
downloadCount =
{ $num ->
[one] 1 download
*[other] { $num } downloads
}
timespanHours =
{ $num ->
[one] 1 hour
*[other] { $num } hours
}
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
copyUrlFormButton = Copy to clipboard
copiedUrl = Copied!
deleteFileButton = Delete file
sendAnotherFileLink = Send another file
# Alternative text used on the download link/button (indicates an action).
downloadAltText = Download
downloadsFileList = Downloads
# Used as header in a column indicating the amount of time left before a
# download link expires (e.g. "10h 5m")
timeFileList = Time
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = Download { $filename }
downloadFileSize = ({ $size })
unlockInputLabel = Enter Password
unlockInputPlaceholder = Password
unlockButtonLabel = Unlock
downloadFileTitle = Download Encrypted File
# Firefox Send is a brand name and should not be localized.
downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = Download
downloadNotification = Your download has completed.
downloadFinish = Download Complete
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } of { $totalSize })
# Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Try Firefox Send
downloadingPageProgress = Downloading { $filename } ({ $size })
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
errorAltText = Upload error
errorPageHeader = Something went wrong!
errorPageMessage = There has been an error uploading the file.
errorPageLink = Send another file
fileTooBig = That file is too big to upload. It should be less than { $size }.
linkExpiredAlt = Link expired
expiredPageHeader = This link has expired or never existed in the first place!
notSupportedHeader = Your browser is not supported.
# Firefox Send is a brand name and should not be localized.
notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. Youll need to try another browser. We recommend Firefox!
notSupportedLink = Why is my browser not supported?
notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. Youll need to update your browser.
updateFirefox = Update Firefox
downloadFirefoxButtonSub = Free Download
uploadedFile = File
copyFileList = Copy URL
# expiryFileList is used as a column header
expiryFileList = Expires In
deleteFileList = Delete
nevermindButton = Never mind
legalHeader = Terms & Privacy
legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot <a>Terms of Service</a> and <a>Privacy Notice</a>. You can learn more about this experiment and its data collection <a>here</a>.
legalNoticeMozilla = Use of the Firefox Send website is also subject to Mozillas <a>Websites Privacy Notice</a> and <a>Websites Terms of Use</a>.
deletePopupText = Delete this file?
deletePopupYes = Yes
deletePopupCancel = Cancel
deleteButtonHover = Delete
copyUrlHover = Copy URL
footerLinkLegal = Legal
# Test Pilot is a proper name and should not be localized.
footerLinkAbout = About Test Pilot
footerLinkPrivacy = Privacy
footerLinkTerms = Terms
footerLinkCookies = Cookies
requirePasswordCheckbox = Require a password to download this file
addPasswordButton = Add password
changePasswordButton = Change
passwordTryAgain = Incorrect password. Try again.
reportIPInfringement = Report IP Infringement
javascriptRequired = Firefox Send requires JavaScript
whyJavascript = Why does Firefox Send require JavaScript?
enableJavascript = Please enable JavaScript and try again.
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Password set
# A short status message shown when the user enters a long password
maxPasswordLength = Maximum password length: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = This password could not be set

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Listo para enviar
uploadSvgAlt = Subir
uploadSuccessTimingHeader = El enlace al archivo expirará después de 1 descarga o en 24 horas.
expireInfo = El enlace a tu archivo expirará después de { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 descarga
*[other] { $num } descargas
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hora
*[other] { $num } horas
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Listo para enviar
uploadSvgAlt = Subir
uploadSuccessTimingHeader = El enlace a tu archivo expirará tras 1 descarga o en 24 horas.
expireInfo = El enlace a tu archivo expirará después de { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 descarga
*[other] { $num } descargas
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hora
*[other] { $num } horas
}

View file

@ -12,7 +12,7 @@ uploadPageBrowseButton1 = Seleccionar un archivo para subir
uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta.
uploadPageBrowseButtonTitle = Subir archivo
uploadingPageProgress = Subiendo { $filename } ({ $size })
importingFile = Imporando...
importingFile = Importando...
verifyingFile = Comprobando...
encryptingFile = Encriptando...
decryptingFile = Desencriptando...
@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Listo para enviar
uploadSvgAlt = Subir
uploadSuccessTimingHeader = El enlace al archivo caducará tras descargarlo una vez o en 24 horas.
expireInfo = El enlace al archivo expirará tras { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 descarga
*[other] { $num } descargas
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hora
*[other] { $num } horas
}
@ -86,7 +88,7 @@ expiryFileList = Caduca en
deleteFileList = Eliminar
nevermindButton = Da igual
legalHeader = Términos y privacidad
legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujero a las <a>Condiciones del servicio</a> y al <a>Aviso de privacidad</a> de Test Pilot.
legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujero a las <a>Condiciones del servicio</a> y al <a>Aviso de privacidad</a> de Test Pilot. <a>Aquí</a> podrás descubrir más sobre este experimento y su recopilación de datos.
legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al <a>Aviso de privacidad sobre sitios web</a> y a los <a>Términos de uso sobre sitios web</a>.
deletePopupText = ¿Eliminar el archivo?
deletePopupYes = Sí

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Saatmiseks valmis
uploadSvgAlt = Laadi üles
uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel.
expireInfo = Link failile aegub peale { $downloadCount } või { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] üht allalaadimist
*[other] { $num } allalaadimist
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] üht tundi
*[other] { $num } tundi
}

View file

@ -26,6 +26,16 @@ uploadSuccessConfirmHeader = آماده برای ارسال
uploadSvgAlt = بارگذاری
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد.
downloadCount =
{ $num ->
[one] ۱ بارگیری
*[other] { $num } بارگیری
}
timespanHours =
{ $num ->
[one] ۱ ساعت
*[other] { $num } ساعت
}
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
copyUrlFormButton = رونوشت به کلیپ‌بورد
copiedUrl = رونوشت شد!

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Ree om te ferstjoeren
uploadSvgAlt = Oplaad
uploadSuccessTimingHeader = De keppeling nei jo bestân sil nei 1 download ferrinne of nei 24 oeren.
expireInfo = De keppeling nei jo bestân sil nei { $downloadCount } of { $timespan } ferrinne.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 download
*[other] { $num } downloads
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 oer
*[other] { $num } oeren
}

View file

@ -1,4 +1,4 @@
// Firefox Send is a brand name and should not be localized.
# Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteSubtitle = ניסוי אינטרנט
siteFeedback = משוב
@ -21,7 +21,7 @@ uploadCancelNotification = ההעלאה שלך בוטלה.
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
uploadSuccessConfirmHeader = מוכן לשליחה
uploadSvgAlt
uploadSvgAlt =
.alt = להעלות
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
@ -30,32 +30,34 @@ deleteFileButton = מחיקת קובץ
.title = מחיקת קובץ
sendAnotherFileLink = שליחת קובץ נוסף
.title = שליחת קובץ נוסף
// Alternative text used on the download link/button (indicates an action).
downloadAltText
# Alternative text used on the download link/button (indicates an action).
downloadAltText =
.alt = הורדה
# Used as header in a column indicating the number of times a file has been
# downloaded
downloadFileName = ההורדה נכשלה
downloadFileSize = ({ $size })
// Text and title used on the download link/button (indicates an action).
# Text and title used on the download link/button (indicates an action).
downloadButtonLabel = הורדה
.title = הורדה
downloadNotification = ההורדה הושלמה.
downloadFinish = ההורדה הושלמה
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
downloadingPageProgress = בהורדה: { $filename } ({ $size })
errorAltText
errorAltText =
.alt = תקלה בהעלאה
errorPageHeader = משהו השתבש!
errorPageLink = שליחת קובץ נוסף
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
linkExpiredAlt
linkExpiredAlt =
.alt = קישור פג
notSupportedHeader = הדפדפן שלך לא נתמך.
notSupportedLink = למה אין תמיכה בדפדפן שלי?
downloadFirefoxButtonSub = הורדה בחינם
uploadedFile = קובץ
copyFileList = העתקת כתובת
// expiryFileList is used as a column header
# expiryFileList is used as a column header
expiryFileList = יפוג בעוד
deleteFileList = מחיקה
nevermindButton = לא משנה
@ -63,9 +65,9 @@ legalHeader = תנאי שירות ופרטיות
deletePopupText = למחוק דף זה?
deletePopupYes = כן
deletePopupCancel = ביטול
deleteButtonHover
deleteButtonHover =
.title = מחיקה
copyUrlHover
copyUrlHover =
.title = העתקת קישור
footerLinkLegal = מידע משפטי
footerLinkPrivacy = פרטיות

View file

@ -26,13 +26,15 @@ uploadSuccessConfirmHeader = Hotowy za słanje
uploadSvgAlt = Nahrać
uploadSuccessTimingHeader = Wotkaz k wašej dataji po 1 sćehnjenju abo 24 hodźinach spadnje.
expireInfo = Wotkaz k wašej dataji po { $downloadCount } abo { $timespan } spadnje.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 sćehnjenje
[two] { $num } sćehnjeni
[few] { $num } sćehnjenja
*[other] { $num } sćehnjenjow
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hodźina
[two] { $num } hodźinje
[few] { $num } hodźiny

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Küldésre kész
uploadSvgAlt = Feltöltés
uploadSuccessTimingHeader = A fájl hivatkozása lejár 1 letöltés vagy 24 óra múlva.
expireInfo = A fájlhoz tartozó hivatkozás { $downloadCount } vagy { $timespan } múlva lejár.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 letöltés
*[other] { $num } letöltés
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 óra
*[other] { $num } óra
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Preste a inviar
uploadSvgAlt = Cargamento
uploadSuccessTimingHeader = Le ligamine a tu file expirara post un discargamento o in 24 horas.
expireInfo = Le ligamine a tu file expirara post { $downloadCount } o { $timespan }
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] discargamento
*[other] discargamentos
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] hora
*[other] horas
}

View file

@ -112,5 +112,9 @@ enableJavascript = Silakan aktifkan JavaScript dan coba lagi.
expiresHoursMinutes = { $hours }j { $minutes }m
# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m"
expiresMinutes = { $minutes }m
# A short status message shown when a password is successfully set
passwordIsSet = Sandi diatur
# A short status message shown when the user enters a long password
maxPasswordLength = Panjang sandi maksimal: { $length }
# A short status message shown when there was an error setting the password
passwordSetError = Tidak bisa menyetel sandi ini

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Pronto per linvio
uploadSvgAlt = Carica
uploadSuccessTimingHeader = Il link al file scadrà dopo 1 download o in 24 ore.
expireInfo = Il link a questo file scadrà dopo { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 download
*[other] { $num } download
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ora
*[other] { $num } ore
}

View file

@ -26,10 +26,12 @@ uploadSuccessConfirmHeader = 送信準備完了
uploadSvgAlt = アップロード
uploadSuccessTimingHeader = ファイルへのリンクは、1 回ダウンロードされた後、もしくは 24 時間以内に期限切れとなります。
expireInfo = このファイルへのリンクは { $downloadCount } あるいは { $timespan } 後に期限切れとなります。
downloadCount = { $num ->
downloadCount =
{ $num ->
*[other] { $num } 回のダウンロード
}
timespanHours = { $num ->
timespanHours =
{ $num ->
*[other] { $num } 時間
}
copyUrlFormLabelWithName = ファイルを送信するにはこのリンクをコピー、共有してください: { $filename }

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Ihegga i walluy
uploadSvgAlt = Sali
uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen.
expireInfo = Aseɣwen icudden ar ufaylu-inek ad yemmet send { $downloadCount } naɣ { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 usider
*[other] { $num } isidar
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 usrag
*[other] { $num } isragen
}

View file

@ -26,10 +26,12 @@ uploadSuccessConfirmHeader = Sedia untuk Hantar
uploadSvgAlt = Muat naik
uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam.
expireInfo = Pautan ke fail anda akan luput selepas { $downloadCount } atau { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
*[other] { $num } muat turun
}
timespanHours = { $num ->
timespanHours =
{ $num ->
*[other] { $num } jam
}
copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename }

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Klar til å sende
uploadSvgAlt = Last opp
uploadSuccessTimingHeader = Lenken til filen din utløper etter 1 nedlasting eller om 24 timer.
expireInfo = Lenken til filen din vil gå ut etter { $downloadCount } eller { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 nedlasting
*[other] { $num } nedlastinger
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 time
*[other] { $num } timer
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Gereed voor verzending
uploadSvgAlt = Uploaden
uploadSuccessTimingHeader = De koppeling naar uw bestand zal na 1 download of 24 uur verlopen.
expireInfo = De koppeling naar uw bestand zal na { $downloadCount } of { $timespan } verlopen.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 download
*[other] { $num } downloads
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 uur
*[other] { $num } uur
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Klår til å senda
uploadSvgAlt = Last opp
uploadSuccessTimingHeader = Lenka til fila di går ut etter 1 nedlasting eller om 24 timar.
expireInfo = Lenka til fila di vil gå ut etter { $downloadCount } eller { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 nedlasting
*[other] { $num } nedlastingar
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 time
*[other] { $num } timar
}

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Pronto para enviar
uploadSvgAlt = Enviado
uploadSuccessTimingHeader = O link para o seu arquivo expirará após 1 download ou em 24 horas.
expireInfo = O link para o seu arquivo expirará após { $downloadCount } ou { $timepan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 download
*[other] { $num } downloads
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hora
*[other] { $num } horas
}

View file

@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Pripravené na odoslanie
uploadSvgAlt = Nahrať
uploadSuccessTimingHeader = Platnosť odkazu vyprší po 1 prevzatí alebo po uplynutí 24 hodín.
expireInfo = Platnosť odkazu na váš súbor vyprší po { $downloadCount } alebo po { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 prevzatí
[few] { $num } prevzatiach
*[other] { $num } prevzatiach
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 hodine
[few] { $num } hodinách
*[other] { $num } hodinách

View file

@ -26,13 +26,15 @@ uploadSuccessConfirmHeader = Pripravljeno za pošiljanje
uploadSvgAlt = Naloži
uploadSuccessTimingHeader = Povezava do vaše datoteke bo potekla po enem prenosu ali v 24 urah.
expireInfo = Povezava do vaše datoteke bo potekla čez { $downloadCount } ali { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 prenos
[two] { $num } prenosa
[few] { $num } prenosi
*[other] { $num } prenosov
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ura
[two] { $num } uri
[few] { $num } ure

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Gati për Dërgim
uploadSvgAlt = Ngarkoje
uploadSuccessTimingHeader = Lidhja për te kartela juaj do të skadojë pas 1 shkarkimi ose pas 24 orësh.
expireInfo = Lidhja për te kartela juaj do të skadojë pas { $downloadCount } ose { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 shkarkimi
*[other] { $num } shkarkimesh
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 ore
*[other] { $num } orësh
}

View file

@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Спреман за слање
uploadSvgAlt = Отпреми
uploadSuccessTimingHeader = Веза ка вашој датотеци ће истећи након једног преузимања или након 24 сата.
expireInfo = Веза ка вашој датотеци ће истећи након { $downloadCount } или { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] преузимања
[few] преузимања
*[other] преузимања
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] сата
[few] сата
*[other] сати

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Klar för att skicka
uploadSvgAlt = Ladda upp
uploadSuccessTimingHeader = Länken till din fil upphör att gälla efter 1 nedladdning eller om 24 timmar.
expireInfo = Länken till din fil upphör att gälla efter { $downloadCount } eller { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 nedladdning
*[other] { $num } nedladdningar
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 timme
*[other] { $num } timmar
}

View file

@ -7,6 +7,7 @@ uploadPageDropMessage = ఎగుమతిని ప్రారంభించ
uploadPageSizeMessage = అత్యంత నమ్మకమైన కార్యం కోసం, మీ ఫైలును 1GB కంటే తక్కువగా ఉంచడం ఉత్తమం
uploadPageBrowseButton = మీ కంప్యూటర్లో ఒక ఫైలును ఎంచుకోండి
uploadPageBrowseButton1 = ఎక్కించటానికి ఒక ఫైలును ఎంచుకోండి
uploadPageMultipleFilesAlert = పలు ఫైళ్ళను లేదా సంయచాన్ని ఎక్కించడానికి ప్రస్తుతం తోడ్పాటు లేదు.
uploadPageBrowseButtonTitle = ఫైలును ఎగుమతి చేయండి
uploadingPageProgress = { $filename } ({ $size }) ఎక్కుతోంది
importingFile = దిగుమతవుతోంది...
@ -64,6 +65,7 @@ errorAltText = ఎగుమతిలో లోపం
errorPageHeader = ఏదో తప్పిదం జరిగింది!
errorPageMessage = ఫైల్ను ఎగుమతి చేయడంలో లోపం ఉంది.
errorPageLink = మరో ఫైలును పంపండి
fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి.
linkExpiredAlt = లంకె గడువు ముగిసింది
expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు!
notSupportedHeader = మీ విహారిణికి మద్దతు లేదు.

View file

@ -26,11 +26,13 @@ uploadSuccessConfirmHeader = Handa nang Ipadala
uploadSvgAlt = I-upload
uploadSuccessTimingHeader = Mag-e-expire ang link sa iyong file pagkatapos ng 1 pag-download o sa loob ng 24 na oras.
expireInfo = Mag-e-expire ang link sa iyong file pagkatapos ng { $downloadCount } o { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 pag-download
*[other] { $num } na mga pag-download
}
timespanHours = { $num ->
timespanHours =
{ $num ->
*[one] 1 oras
}
copyUrlFormLabelWithName = Kopyahin at ibahagi ang link upang ipadala ang iyong file: { $filename }

View file

@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Готовий до надсилання
uploadSvgAlt = Вивантажити
uploadSuccessTimingHeader = Час дії цього посилання закінчиться після 1 завантаження, або через 24 години.
expireInfo = Посилання на ваш файл стане недійсним після { $downloadCount } файла, або через { $timespan }.
downloadCount = { $num ->
downloadCount =
{ $num ->
[one] 1 завантаження
[few] { $num } завантаження
*[other] { $num } завантажень
}
timespanHours = { $num ->
timespanHours =
{ $num ->
[one] 1 година
[few] { $num } години
*[other] { $num } годин

View file

@ -26,10 +26,12 @@ uploadSuccessConfirmHeader = 准备好发送
uploadSvgAlt = 上传
uploadSuccessTimingHeader = 您的文件的链接将在首次下载或 24 小时后过期。
expireInfo = 指向该文件的链接将在 { $downloadCount } 或 { $timespan } 后过期。
downloadCount = { $num ->
downloadCount =
{ $num ->
*[other] { $num } 次下载
}
timespanHours = { $num ->
timespanHours =
{ $num ->
*[other] { $num } 小时
}
copyUrlFormLabelWithName = 复制并分享链接以发送您的文件:{ $filename }

View file

@ -26,10 +26,12 @@ uploadSuccessConfirmHeader = 準備好傳送
uploadSvgAlt = 上傳
uploadSuccessTimingHeader = 您的檔案鏈結將會在首次下載,或 24 小時後失效。
expireInfo = 檔案鏈結將在 { $downloadCount }或 { $timespan }後失效。
downloadCount = { $num ->
downloadCount =
{ $num ->
*[other] { $num } 次下載
}
timespanHours = { $num ->
timespanHours =
{ $num ->
*[other] { $num } 小時
}
copyUrlFormLabelWithName = 複製並分享鏈結來傳送您的檔案: { $filename }

View file

@ -14,8 +14,17 @@ module.exports = async function(req, res) {
'WWW-Authenticate': `send-v1 ${req.nonce}`
});
const file_stream = storage.get(id);
let cancelled = false;
file_stream.on('end', async () => {
req.on('close', () => {
cancelled = true;
file_stream.destroy();
});
file_stream.on('close', async () => {
if (cancelled) {
return;
}
const dl = meta.dl + 1;
const dlimit = meta.dlimit;
try {
@ -28,6 +37,7 @@ module.exports = async function(req, res) {
log.info('StorageError:', id);
}
});
file_stream.pipe(res);
} catch (e) {
res.sendStatus(404);

View file

@ -135,6 +135,27 @@ describe('Upload / Download flow', function() {
}
});
it('can cancel and not increase download count', async function() {
const fs = new FileSender(blob);
const file = await fs.upload();
const fr = new FileReceiver({
secretKey: file.toJSON().secretKey,
id: file.id,
nonce: file.keychain.nonce,
requiresPassword: false
});
await fr.getMetadata();
fr.once('progress', () => fr.cancel());
try {
await fr.download(noSave);
assert.fail('not cancelled');
} catch (e) {
await file.updateDownloadCount();
assert.equal(file.dtotal, 0);
}
});
it('can allow multiple downloads', async function() {
const fs = new FileSender(blob);
const file = await fs.upload();

View file

@ -1,8 +1,8 @@
selenium==3.12.0
selenium==3.13.0
flake8==3.5.0
flake8-isort==2.5
PyPOM==2.0.0
pytest==3.6.0
pytest-html==1.18.0
pytest==3.6.3
pytest-html==1.19.0
pytest-selenium==1.13.0
pytest-xdist==1.22.2