Compare commits

..

29 Commits

Author SHA1 Message Date
Danny Coates
837747f8f7 bump version 2017-10-10 10:34:45 -07:00
Danny Coates
a8c32ae49c Merge pull request #583 from mozilla/beef
Promote the beefy UI to default
2017-10-10 10:27:10 -07:00
Danny Coates
32c5b414de use beefy ui 2017-10-10 10:20:49 -07:00
Danny Coates
12c81a22e8 updated deps 2017-10-10 10:08:11 -07:00
Danny Coates
0c5d0d4bb2 Merge pull request #581 from tiagomoraismorgado88/patch-4
introducing ToC to README.md
2017-10-09 14:10:12 -07:00
tiagomoraismorgado
234f9c624d introducing ToC to README.md
**this PR does basically aim at:**
- *introducing ToC to README.md file*
2017-10-06 20:03:14 +01:00
Danny Coates
da669b44ff Merge pull request #579 from mozilla/cancel
Hide cancel button when upload reaches 100%
2017-10-06 11:41:09 -07:00
Danny Coates
3c39f5f085 Merge pull request #580 from mozilla/favicon
Change Favicon in to look better in a variety of cases
2017-10-06 11:40:06 -07:00
Erica Wright
6de91b5872 Change Favicon in to look better in a variety of cases 2017-10-06 11:24:17 -04:00
Rhoslyn Prys
ff9a0979f6 Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-10-05 16:13:35 +00:00
Erica Wright
e1e8af2489 Hide cancel button when upload reached 100% 2017-10-04 16:34:41 -04:00
Erica
1eb000f615 Merge pull request #571 from ehuggett/svg-logo
Centre logo
2017-10-04 13:25:35 -04:00
ehuggett
e20fd97e59 Centre logo by using transform (not optimal) 2017-10-04 00:05:45 +01:00
Erica
d10ceacd67 Merge pull request #574 from ehuggett/tab-upload
Make upload button focusable (accessibility/tab navigation)
2017-10-02 20:15:37 -04:00
ehuggett
208c28ee01 Make upload button focusable (accessibility/tab navigation) 2017-10-02 23:04:55 +01:00
Danny Coates
cdd1bb3c29 updated deps 2017-10-02 13:03:56 -07:00
Danny Coates
3d9c4fa320 added .nsprc 2017-10-02 12:04:03 -07:00
Danny Coates
9c4d18ef3b updated deps 2017-10-02 11:44:35 -07:00
Juraj Cigáň
ce9ff3959f Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-09-30 17:51:09 +00:00
eljuno
51aef4e1e5 Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2017-09-28 18:50:47 +00:00
hello
90247059d0 Pontoon: Update Hebrew (he) localization of Test Pilot: Firefox Send
Localization authors:
- Yaron Shahrabani <sh.yaron@gmail.com>
- hello <hello@ira.abramov.org>
2017-09-27 18:11:56 +00:00
Danny Coates
c97abb46ed bump version 2017-09-26 10:29:26 -07:00
Danny Coates
b8f5e371c7 updated deps 2017-09-26 10:23:30 -07:00
Danny Coates
401311a05f updated deps. removed choo-log 2017-09-20 13:09:33 -07:00
Sahithi
652b8e4e15 Pontoon: Update Telugu (te) localization of Test Pilot: Firefox Send
Localization authors:
- Sahithi <sahithi.thinker@gmail.com>
2017-09-19 11:31:21 +00:00
Merike Sell
99b7e7c0f1 Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Merike Sell <merikes@gmail.com>
2017-09-16 12:52:29 +00:00
Danny Coates
81442bb6f2 set default server states for fira and fileInfo 2017-09-14 12:15:08 -07:00
Danny Coates
137f474b69 fixed A/B test control group selection 2017-09-14 10:02:47 -07:00
Danny Coates
8e14d3f8f7 QA bug fixes 2017-09-13 12:01:55 -07:00
37 changed files with 1739 additions and 1105 deletions

3
.nsprc Normal file
View File

@@ -0,0 +1,3 @@
{
"exceptions": ["https://nodesecurity.io/advisories/534"]
}

2
.prettierignore Normal file
View File

@@ -0,0 +1,2 @@
dist
assets/*.js

View File

@@ -7,6 +7,20 @@
--- ---
## Table of Contents
* [What it does](#what-it-does)
* [Requirements](#requirements)
* [Development](#development)
* [Commands](#commands)
* [Configuration](#configuration)
* [Localization](#localization)
* [Contributing](#contributing)
* [Testing](#testing)
* [License](#license)
---
## What it does ## What it does
A file sharing experiment which allows you to send encrypted files to other users. A file sharing experiment which allows you to send encrypted files to other users.

View File

@@ -1,38 +1,9 @@
import hash from 'string-hash'; import hash from 'string-hash';
const experiments = { const experiments = {};
'5YHCzn2CQTmBwWwTmZupBA': {
id: '5YHCzn2CQTmBwWwTmZupBA',
run: function(variant, state, emitter) {
state.experiment = {
xid: this.id,
xvar: variant
};
// Beefy UI
if (variant === 1) {
state.config.uploadWindowStyle = 'upload-window upload-window-b';
state.config.uploadButtonStyle = 'btn browse browse-b';
} else {
state.config.uploadWindowStyle = 'upload-window';
state.config.uploadButtonStyle = 'btn browse';
}
emitter.emit('render');
},
eligible: function(state) {
return this.luckyNumber(state) >= 0.5;
},
variant: function(state) {
return this.luckyNumber(state) < 0.5 ? 0 : 1;
},
luckyNumber: function(state) {
return luckyNumber(
`${this.id}:${state.storage.get('testpilot_ga__cid')}`
);
}
}
};
//Returns a number between 0 and 1 //Returns a number between 0 and 1
// eslint-disable-next-line no-unused-vars
function luckyNumber(str) { function luckyNumber(str) {
return hash(str) / 0xffffffff; return hash(str) / 0xffffffff;
} }
@@ -51,7 +22,7 @@ export default function initialize(state, emitter) {
emitter.on('DOMContentLoaded', () => { emitter.on('DOMContentLoaded', () => {
const xp = experiments[state.query.x]; const xp = experiments[state.query.x];
if (xp) { if (xp) {
xp.run(state.query.v, state, emitter); xp.run(+state.query.v, state, emitter);
} }
}); });

View File

@@ -1,7 +1,7 @@
/* global EXPIRE_SECONDS */ /* global EXPIRE_SECONDS */
import FileSender from './fileSender'; import FileSender from './fileSender';
import FileReceiver from './fileReceiver'; import FileReceiver from './fileReceiver';
import { copyToClipboard, delay, fadeOut } from './utils'; import { copyToClipboard, delay, fadeOut, percent } from './utils';
import * as metrics from './metrics'; import * as metrics from './metrics';
function saveFile(file) { function saveFile(file) {
@@ -54,6 +54,7 @@ function exists(id) {
export default function(state, emitter) { export default function(state, emitter) {
let lastRender = 0; let lastRender = 0;
let updateTitle = false;
function render() { function render() {
emitter.emit('render'); emitter.emit('render');
@@ -74,7 +75,21 @@ export default function(state, emitter) {
} }
} }
emitter.on('DOMContentLoaded', checkFiles); function updateProgress() {
if (updateTitle) {
emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio));
}
render();
}
emitter.on('DOMContentLoaded', () => {
document.addEventListener('blur', () => (updateTitle = true));
document.addEventListener('focus', () => {
updateTitle = false;
emitter.emit('DOMTitleChange', 'Firefox Send');
});
checkFiles();
});
emitter.on('navigate', checkFiles); emitter.on('navigate', checkFiles);
@@ -107,7 +122,7 @@ export default function(state, emitter) {
emitter.on('upload', async ({ file, type }) => { emitter.on('upload', async ({ file, type }) => {
const size = file.size; const size = file.size;
const sender = new FileSender(file); const sender = new FileSender(file);
sender.on('progress', render); sender.on('progress', updateProgress);
sender.on('encrypting', render); sender.on('encrypting', render);
state.transfer = sender; state.transfer = sender;
render(); render();
@@ -120,6 +135,7 @@ export default function(state, emitter) {
const time = Date.now() - start; const time = Date.now() - start;
const speed = size / (time / 1000); const speed = size / (time / 1000);
metrics.completedUpload({ size, time, speed, type }); metrics.completedUpload({ size, time, speed, type });
document.getElementById('cancel-upload').hidden = 'hidden';
await delay(1000); await delay(1000);
await fadeOut('upload-progress'); await fadeOut('upload-progress');
info.name = file.name; info.name = file.name;
@@ -153,7 +169,7 @@ export default function(state, emitter) {
const size = file.size; const size = file.size;
const url = `/api/download/${file.id}`; const url = `/api/download/${file.id}`;
const receiver = new FileReceiver(url, file.key); const receiver = new FileReceiver(url, file.key);
receiver.on('progress', render); receiver.on('progress', updateProgress);
receiver.on('decrypting', render); receiver.on('decrypting', render);
state.transfer = receiver; state.transfer = receiver;
const links = openLinksInNewTab(); const links = openLinksInNewTab();

View File

@@ -1,5 +1,4 @@
import app from './routes'; import app from './routes';
import log from 'choo-log';
import locale from '../common/locales'; import locale from '../common/locales';
import fileManager from './fileManager'; import fileManager from './fileManager';
import dragManager from './dragManager'; import dragManager from './dragManager';
@@ -14,8 +13,6 @@ if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
} }
app.use(log());
app.use((state, emitter) => { app.use((state, emitter) => {
// init state // init state
state.transfer = null; state.transfer = null;
@@ -23,11 +20,14 @@ app.use((state, emitter) => {
state.translate = locale.getTranslator(); state.translate = locale.getTranslator();
state.storage = storage; state.storage = storage;
state.raven = Raven; state.raven = Raven;
state.config = {
uploadWindowStyle: 'upload-window',
uploadButtonStyle: 'browse btn'
};
emitter.on('DOMContentLoaded', async () => { emitter.on('DOMContentLoaded', async () => {
if (
/firefox/i.test(navigator.userAgent) &&
parseInt(navigator.userAgent.match(/firefox\/*([^\n\r]*)\./i)[1], 10) <=
49
) {
return emitter.emit('replaceState', '/unsupported/outdated');
}
const ok = await canHasSend(assets.get('cryptofill.js')); const ok = await canHasSend(assets.get('cryptofill.js'));
if (!ok) { if (!ok) {
const reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm'; const reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm';

View File

@@ -4,7 +4,7 @@ const assets = require('../../common/assets');
function timeLeft(milliseconds) { function timeLeft(milliseconds) {
const minutes = Math.floor(milliseconds / 1000 / 60); const minutes = Math.floor(milliseconds / 1000 / 60);
const hours = Math.floor(minutes / 60); const hours = Math.floor(minutes / 60);
const seconds = Math.floor(milliseconds / 1000 % 60); const seconds = Math.floor((milliseconds / 1000) % 60);
if (hours >= 1) { if (hours >= 1) {
return `${hours}h ${minutes % 60}m`; return `${hours}h ${minutes % 60}m`;
} else if (hours === 0) { } else if (hours === 0) {

View File

@@ -40,11 +40,16 @@ module.exports = function(state, emit) {
state.translate('downloadFileSize', { size })}</span> state.translate('downloadFileSize', { size })}</span>
</div> </div>
<div class="description">${state.translate('downloadMessage')}</div> <div class="description">${state.translate('downloadMessage')}</div>
<img src="${assets.get( <img
'illustration_download.svg' src="${assets.get('illustration_download.svg')}"
)}" id="download-img" alt="${state.translate('downloadAltText')}"/> id="download-img"
alt="${state.translate('downloadAltText')}"/>
<div> <div>
<button id="download-btn" class="btn" onclick=${download}>${state.translate( <button
id="download-btn"
class="btn"
title="${state.translate('downloadButtonLabel')}"
onclick=${download}>${state.translate(
'downloadButtonLabel' 'downloadButtonLabel'
)}</button> )}</button>
</div> </div>

View File

@@ -17,13 +17,13 @@ module.exports = function(state, emit) {
})}</div> })}</div>
<div id="copy"> <div id="copy">
<input id="link" type="url" value="${file.url}" readonly="true"/> <input id="link" type="url" value="${file.url}" readonly="true"/>
<button id="copy-btn" class="btn" onclick=${copyLink}>${state.translate( <button id="copy-btn" class="btn" title="${state.translate(
'copyUrlFormButton' 'copyUrlFormButton'
)}</button> )}" onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
</div> </div>
<button id="delete-file" class="btn" onclick=${deleteFile}>${state.translate( <button id="delete-file" class="btn" title="${state.translate(
'deleteFileButton' 'deleteFileButton'
)}</button> )}" onclick=${deleteFile}>${state.translate('deleteFileButton')}</button>
<a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate( <a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate(
'sendAnotherFileLink' 'sendAnotherFileLink'
)}</a> )}</a>

View File

@@ -21,9 +21,9 @@ module.exports = function(state, emit) {
transfer.msg, transfer.msg,
transfer.sizes transfer.sizes
)}</div> )}</div>
<button id="cancel-upload" onclick=${cancel}>${state.translate( <button id="cancel-upload" title="${state.translate(
'uploadingPageCancel' 'uploadingPageCancel'
)}</button> )}" onclick=${cancel}>${state.translate('uploadingPageCancel')}</button>
</div> </div>
</div> </div>
`; `;

View File

@@ -13,8 +13,7 @@ module.exports = function(state, emit) {
'uploadPageLearnMore' 'uploadPageLearnMore'
)}</a> )}</a>
</div> </div>
<div class="${state.config <div class="upload-window" ondragover=${dragover} ondragleave=${dragleave}>
.uploadWindowStyle}" ondragover=${dragover} ondragleave=${dragleave}>
<div id="upload-img"><img src="${assets.get( <div id="upload-img"><img src="${assets.get(
'upload.svg' 'upload.svg'
)}" title="${state.translate('uploadSvgAlt')}"/></div> )}" title="${state.translate('uploadSvgAlt')}"/></div>
@@ -23,11 +22,10 @@ module.exports = function(state, emit) {
'uploadPageSizeMessage' 'uploadPageSizeMessage'
)}</em></span> )}</em></span>
<form method="post" action="upload" enctype="multipart/form-data"> <form method="post" action="upload" enctype="multipart/form-data">
<label for="file-upload" id="browse" class="${state.config <input id="file-upload" type="file" name="fileUploaded" onchange=${upload} onfocus=${onfocus} onblur=${onblur} />
.uploadButtonStyle}">${state.translate( <label for="file-upload" id="browse" class="btn browse" title="${state.translate(
'uploadPageBrowseButton1' 'uploadPageBrowseButton1'
)}</label> )}">${state.translate('uploadPageBrowseButton1')}</label>
<input id="file-upload" type="file" name="fileUploaded" onchange=${upload} />
</form> </form>
</div> </div>
${fileList(state, emit)} ${fileList(state, emit)}
@@ -44,6 +42,14 @@ module.exports = function(state, emit) {
div.classList.remove('ondrag'); div.classList.remove('ondrag');
} }
function onfocus(event) {
event.target.classList.add('has-focus');
}
function onblur(event) {
event.target.classList.remove('has-focus');
}
async function upload(event) { async function upload(event) {
event.preventDefault(); event.preventDefault();
const target = event.target; const target = event.target;

BIN
assets/favicon-120.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
assets/favicon-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
assets/favicon-144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
assets/favicon-152.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
assets/favicon-167.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
assets/favicon-180.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
assets/favicon-195.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
assets/favicon-196.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
assets/favicon-228.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
assets/favicon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
assets/favicon-96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -205,7 +205,7 @@ a {
} }
.upload-window { .upload-window {
border: 1px dashed rgba(0, 148, 251, 0.5); border: 3px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto; margin: 0 auto;
height: 255px; height: 255px;
border-radius: 4px; border-radius: 4px;
@@ -219,7 +219,7 @@ a {
} }
.upload-window.ondrag { .upload-window.ondrag {
border: 3px dashed rgba(0, 148, 251, 0.5); border: 5px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto; margin: 0 auto;
height: 251px; height: 251px;
transform: scale(1.04); transform: scale(1.04);
@@ -231,14 +231,6 @@ a {
text-align: center; text-align: center;
} }
.upload-window-b {
border: 3px dashed rgba(0, 148, 251, 0.5);
}
.upload-window-b.ondrag {
border: 5px dashed rgba(0, 148, 251, 0.5);
}
.link { .link {
color: #0094fb; color: #0094fb;
text-decoration: none; text-decoration: none;
@@ -258,10 +250,10 @@ a {
.browse { .browse {
background: #0297f8; background: #0297f8;
border-radius: 5px; border-radius: 5px;
font-size: 15px; font-size: 20px;
color: #fff; color: #fff;
min-width: 240px; min-width: 240px;
height: 44px; height: 60px;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@@ -273,13 +265,18 @@ a {
background-color: #0287e8; background-color: #0287e8;
} }
.browse-b { input[type='file'] {
height: 60px; opacity: 0;
font-size: 20px; overflow: hidden;
position: absolute;
z-index: -1;
} }
input[type="file"] { input[type='file'].has-focus + #browse,
display: none; input[type='file']:focus + #browse {
background-color: #0287e8;
outline: 1px dotted #000;
outline: -webkit-focus-ring-color auto 5px;
} }
#file-size-msg { #file-size-msg {
@@ -359,7 +356,7 @@ tbody {
cursor: pointer; cursor: pointer;
} }
.icon-copy[disabled="disabled"] { .icon-copy[disabled='disabled'] {
pointer-events: none; pointer-events: none;
opacity: 0.3; opacity: 0.3;
} }
@@ -398,7 +395,7 @@ tbody {
/* Popup arrow */ /* Popup arrow */
.popup .popuptext::after { .popup .popuptext::after {
content: ""; content: '';
position: absolute; position: absolute;
bottom: -11px; bottom: -11px;
left: 20px; left: 20px;

View File

@@ -1 +1 @@
<svg width="30" height="27" viewBox="0 0 30 27" xmlns="http://www.w3.org/2000/svg"><title>send logo</title><g stroke="#3E3D40" fill="none" fill-rule="evenodd"><path d="M22.364 19.989l-2.153-2.103a2.046 2.046 0 0 0-2.665-.151l3.402 3.323a.531.531 0 0 1 0 .766l-2.466 2.408a.563.563 0 0 1-.784 0l-3.398-3.32a1.932 1.932 0 0 0 .188 2.564l2.153 2.103c.788.77 2.066.77 2.855 0l2.868-2.802a1.94 1.94 0 0 0 0-2.788M8.77 14.745a.534.534 0 0 0 0 .766l3.399 3.32a2.05 2.05 0 0 1-2.625-.184l-2.153-2.102a1.94 1.94 0 0 1 0-2.79l2.869-2.801a2.052 2.052 0 0 1 2.854 0l2.153 2.103c.73.713.775 1.83.154 2.603l-3.401-3.323a.565.565 0 0 0-.784 0L8.77 14.745zm9.464 5.682a.777.777 0 0 1 0 1.118.822.822 0 0 1-1.144 0l-5.6-5.47a.777.777 0 0 1 0-1.118.822.822 0 0 1 1.144 0l5.6 5.47z" stroke-width=".618" fill="#3E3D40"/><path d="M6.065 20.606c-2.913-1.586-3.988-3.656-3.988-6.468 0-2.81 2.265-6.425 5.786-6.289.1.004.55-.006.649 0 .895-3.27 2.508-6.353 6.898-6.353 4.557 0 7.336 3.716 6.75 7.785.08-.005 1.232.17 1.31.186 3.096.644 4.915 3.275 4.915 5.18 0 1.905-.107 3.029-2.023 4.947" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g></svg> <svg width="30" height="27" viewBox="0 0 30 27" xmlns="http://www.w3.org/2000/svg"><title>send logo</title><g stroke="#3E3D40" fill="none" fill-rule="evenodd" transform="translate(-0.231,0.11948695)"><path d="M22.364 19.989l-2.153-2.103a2.046 2.046 0 0 0-2.665-.151l3.402 3.323a.531.531 0 0 1 0 .766l-2.466 2.408a.563.563 0 0 1-.784 0l-3.398-3.32a1.932 1.932 0 0 0 .188 2.564l2.153 2.103c.788.77 2.066.77 2.855 0l2.868-2.802a1.94 1.94 0 0 0 0-2.788M8.77 14.745a.534.534 0 0 0 0 .766l3.399 3.32a2.05 2.05 0 0 1-2.625-.184l-2.153-2.102a1.94 1.94 0 0 1 0-2.79l2.869-2.801a2.052 2.052 0 0 1 2.854 0l2.153 2.103c.73.713.775 1.83.154 2.603l-3.401-3.323a.565.565 0 0 0-.784 0L8.77 14.745zm9.464 5.682a.777.777 0 0 1 0 1.118.822.822 0 0 1-1.144 0l-5.6-5.47a.777.777 0 0 1 0-1.118.822.822 0 0 1 1.144 0l5.6 5.47z" stroke-width=".618" fill="#3E3D40"/><path d="M6.065 20.606c-2.913-1.586-3.988-3.656-3.988-6.468 0-2.81 2.265-6.425 5.786-6.289.1.004.55-.006.649 0 .895-3.27 2.508-6.353 6.898-6.353 4.557 0 7.336 3.716 6.75 7.785.08-.005 1.232.17 1.31.186 3.096.644 4.915 3.275 4.915 5.18 0 1.905-.107 3.029-2.023 4.947" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

10
browserconfig.xml Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src=“favicon-76.png”/>
<square150x150logo src="favicon-228.png"/>
<TileColor>#0297F8</TileColor>
</tile>
</msapplication>
</browserconfig>

2402
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "firefox-send", "name": "firefox-send",
"description": "File Sharing Experiment", "description": "File Sharing Experiment",
"version": "1.2.0", "version": "1.2.4",
"author": "Mozilla (https://mozilla.org)", "author": "Mozilla (https://mozilla.org)",
"repository": "mozilla/send", "repository": "mozilla/send",
"homepage": "https://github.com/mozilla/send/", "homepage": "https://github.com/mozilla/send/",
@@ -17,7 +17,7 @@
"lint-locales": "node scripts/lint-locales", "lint-locales": "node scripts/lint-locales",
"lint-locales:dev": "npm run lint-locales", "lint-locales:dev": "npm run lint-locales",
"lint-locales:prod": "npm run lint-locales -- --production", "lint-locales:prod": "npm run lint-locales -- --production",
"format": "prettier '!(dist|node_modules|assets)/**/*.js' 'assets/*.css' --single-quote --write", "format": "prettier '**/*.js' 'assets/*.css' --single-quote --write",
"get-prod-locales": "node scripts/get-prod-locales", "get-prod-locales": "node scripts/get-prod-locales",
"get-prod-locales:write": "npm run get-prod-locales -- --write", "get-prod-locales:write": "npm run get-prod-locales -- --write",
"changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges",
@@ -43,69 +43,68 @@
"node": ">=8.2.0" "node": ">=8.2.0"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^7.1.2", "autoprefixer": "^7.1.5",
"babel-core": "^6.26.0", "babel-core": "^6.26.0",
"babel-loader": "^7.1.2", "babel-loader": "^7.1.2",
"babel-plugin-yo-yoify": "^0.7.0", "babel-plugin-yo-yoify": "^1.0.1",
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.0", "babel-preset-env": "^1.6.0",
"babel-preset-es2015": "^6.24.1", "babel-preset-es2015": "^6.24.1",
"babel-preset-stage-2": "^6.24.1", "babel-preset-stage-2": "^6.24.1",
"choo-log": "^7.2.1", "copy-webpack-plugin": "^4.1.1",
"copy-webpack-plugin": "^4.0.1",
"cross-env": "^5.0.5", "cross-env": "^5.0.5",
"css-loader": "^0.28.5", "css-loader": "^0.28.7",
"css-mqpacker": "^6.0.1", "css-mqpacker": "^6.0.1",
"cssnano": "^3.10.0", "cssnano": "^3.10.0",
"eslint": "^4.5.0", "eslint": "^4.8.0",
"eslint-plugin-mocha": "^4.11.0", "eslint-plugin-mocha": "^4.11.0",
"eslint-plugin-node": "^5.1.1", "eslint-plugin-node": "^5.2.0",
"eslint-plugin-security": "^1.4.0", "eslint-plugin-security": "^1.4.0",
"expose-loader": "^0.7.3", "expose-loader": "^0.7.3",
"extract-loader": "^1.0.1", "extract-loader": "^1.0.1",
"file-loader": "^0.11.2", "file-loader": "^1.1.5",
"git-rev-sync": "^1.9.1", "git-rev-sync": "^1.9.1",
"github-changes": "^1.1.0", "github-changes": "^1.1.0",
"html-loader": "^0.5.1", "html-loader": "^0.5.1",
"husky": "^0.14.3", "husky": "^0.14.3",
"lint-staged": "^4.0.4", "lint-staged": "^4.2.3",
"mocha": "^3.5.0", "mocha": "^3.5.3",
"nanobus": "^4.2.0", "nanobus": "^4.2.0",
"npm-run-all": "^4.0.2", "npm-run-all": "^4.1.1",
"postcss-loader": "^2.0.6", "postcss-loader": "^2.0.6",
"prettier": "^1.5.3", "prettier": "^1.7.4",
"proxyquire": "^1.8.0", "proxyquire": "^1.8.0",
"raven-js": "^3.17.0", "raven-js": "^3.18.1",
"redis-mock": "^0.20.0", "redis-mock": "^0.20.0",
"require-from-string": "^1.2.1", "require-from-string": "^2.0.1",
"rimraf": "^2.6.1", "rimraf": "^2.6.2",
"selenium-webdriver": "^3.5.0", "selenium-webdriver": "^3.6.0",
"sinon": "^3.2.1", "sinon": "^4.0.1",
"string-hash": "^1.1.3", "string-hash": "^1.1.3",
"stylelint-config-standard": "^17.0.0", "stylelint-config-standard": "^17.0.0",
"stylelint-no-unsupported-browser-features": "^1.0.0", "stylelint-no-unsupported-browser-features": "^1.0.1",
"supertest": "^3.0.0", "supertest": "^3.0.0",
"testpilot-ga": "^0.3.0", "testpilot-ga": "^0.3.0",
"val-loader": "^1.0.2", "val-loader": "^1.0.2",
"webpack": "^3.5.5", "webpack": "^3.6.0",
"webpack-dev-server": "^2.7.1", "webpack-dev-server": "^2.9.1",
"webpack-manifest-plugin": "^1.3.1", "webpack-manifest-plugin": "^1.3.2",
"webpack-unassert-loader": "^1.2.0" "webpack-unassert-loader": "^1.2.0"
}, },
"dependencies": { "dependencies": {
"aws-sdk": "^2.103.0", "aws-sdk": "^2.130.0",
"body-parser": "^1.17.2", "body-parser": "^1.18.2",
"choo": "^6.0.0", "choo": "^6.4.2",
"connect-busboy": "0.0.2", "connect-busboy": "0.0.2",
"convict": "^4.0.0", "convict": "^4.0.1",
"express": "^4.15.4", "express": "^4.16.2",
"express-request-language": "^1.1.12", "express-request-language": "^1.1.12",
"fluent": "^0.4.1", "fluent": "^0.4.1",
"fluent-langneg": "^0.1.0", "fluent-langneg": "^0.1.0",
"helmet": "^3.8.1", "helmet": "^3.8.2",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"mozlog": "^2.1.1", "mozlog": "^2.1.1",
"raven": "^2.1.2", "raven": "^2.2.1",
"redis": "^2.8.0" "redis": "^2.8.0"
}, },
"availableLanguages": [ "availableLanguages": [
@@ -123,6 +122,7 @@
"es-CL", "es-CL",
"es-ES", "es-ES",
"es-MX", "es-MX",
"et",
"fa", "fa",
"fr", "fr",
"fy-NL", "fy-NL",

View File

@@ -2,14 +2,14 @@
title = Firefox Send title = Firefox Send
siteSubtitle = arbrawf gwe siteSubtitle = arbrawf gwe
siteFeedback = Adborth siteFeedback = Adborth
uploadPageHeader = Rhannu Ffeiliau wedi eu Hamgryptio Preifat uploadPageHeader = Rhannu Ffeiliau wedi eu Hamgryptio yn Breifat
uploadPageExplainer = Anfon ffeiliau drwy ddolen diogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich pethau'n bodoli ar lein am byth. uploadPageExplainer = Anfon ffeiliau drwy ddolen diogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich pethau'n bodoli ar lein am byth.
uploadPageLearnMore = Dysgu rhagor uploadPageLearnMore = Dysgu rhagor
uploadPageDropMessage = Gollyngwch eich ffeiliau yma i gychwyn llwytho i fyny uploadPageDropMessage = Gollyngwch eich ffeiliau yma i gychwyn llwytho i fyny
uploadPageSizeMessage = Mae'n well cadw maint y ffeiliau o dan 1GB er mwyn iddo weithio ar ei orau. uploadPageSizeMessage = Mae'n well cadw maint y ffeiliau o dan 1GB er mwyn iddo weithio ar ei orau.
uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur
uploadPageBrowseButton1 = Dewiswch ffeil i'w llwytho i fyny uploadPageBrowseButton1 = Dewiswch ffeil i'w llwytho i fyny
uploadPageMultipleFilesAlert = Nid yw llwytho nifer lluosog o ffeilia neu ffolder yn cael ei gynnal ar hyn o bryd. uploadPageMultipleFilesAlert = Nid yw llwytho nifer lluosog o ffeiliau neu ffolder yn cael ei gynnal ar hyn o bryd.
uploadPageBrowseButtonTitle = Llwytho ffeil i fyny uploadPageBrowseButtonTitle = Llwytho ffeil i fyny
uploadingPageProgress = Llwytho $filename} i fyny ({ $size }) uploadingPageProgress = Llwytho $filename} i fyny ({ $size })
importingFile = Mewnforio… importingFile = Mewnforio…
@@ -17,13 +17,13 @@ verifyingFile = Wrthi'n gwirio…
encryptingFile = Wrthi'n amgryptio… encryptingFile = Wrthi'n amgryptio…
decryptingFile = Wrthi'n dadgryptio… decryptingFile = Wrthi'n dadgryptio…
notifyUploadDone = Mae eich llwytho wedi gorffen. notifyUploadDone = Mae eich llwytho wedi gorffen.
uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod manylion dod i ben. uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod y manylion dod i ben.
uploadingPageCancel = Diddymu'r llwytho uploadingPageCancel = Diddymu'r llwytho
uploadCancelNotification = Cafodd eich llwytho ei ddiddymu. uploadCancelNotification = Cafodd eich llwytho ei ddiddymu.
uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Arhoswch! uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Amynedd!
uploadingFileNotification = Dweud wrtha i pan fydd y llwytho wedi gorffen. uploadingFileNotification = Dweud pan fydd y llwytho wedi gorffen.
uploadSuccessConfirmHeader = Yn Barod i Anfon uploadSuccessConfirmHeader = Yn Barod i Anfon
uploadSvgAlt = LLwytho i Fyny uploadSvgAlt = Llwytho i Fyny
uploadSuccessTimingHeader = Bydd y ddolen i'ch ffeil y dod i ben ar ôl 1 llwytho neu o fewn 24 awr. uploadSuccessTimingHeader = Bydd y ddolen i'ch ffeil y dod i ben ar ôl 1 llwytho neu o fewn 24 awr.
copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename } copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename }
copyUrlFormButton = Copïo i'r clipfwrdd copyUrlFormButton = Copïo i'r clipfwrdd
@@ -43,7 +43,7 @@ downloadFinish = Llwytho wedi Gorffen
// 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 } o { $totalSize }) fileSizeProgress = ({ $partialSize } o { $totalSize })
// Firefox Send is a brand name and should not be localized. // Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Profwch Firefox Send sendYourFilesLink = Rhowch gynnig ar Firefox Send
downloadingPageProgress = Llwytho i lawr { $filename } ({ $size }) downloadingPageProgress = Llwytho i lawr { $filename } ({ $size })
downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio. downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio.
errorAltText = Gwall llwytho errorAltText = Gwall llwytho
@@ -55,9 +55,9 @@ linkExpiredAlt = Mae'r ddolen wedi dod i ben
expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed! expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed!
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal. notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
// Firefox Send is a brand name and should not be localized. // Firefox Send is a brand name and should not be localized.
notSupportedDetail = Yn anffodus nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox! notSupportedDetail = Yn anffodus, nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox!
notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal? notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal?
notSupportedOutdatedDetail = Yn anffodus nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr. notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr.
updateFirefox = Diweddaru Firefox updateFirefox = Diweddaru Firefox
downloadFirefoxButtonSub = Llwytho i Lawr am Ddim downloadFirefoxButtonSub = Llwytho i Lawr am Ddim
uploadedFile = Ffeil uploadedFile = Ffeil
@@ -67,7 +67,7 @@ expiryFileList = Daw i ben ymhen
deleteFileList = Dileu deleteFileList = Dileu
nevermindButton = Dim ots nevermindButton = Dim ots
legalHeader = Amodau a Phreifatrwydd legalHeader = Amodau a Phreifatrwydd
legalNoticeTestPilot = Ar hyn o mae Firefox Send yn arbrawf o fewn rhaglen Test Pilot ac yn destun <a>Amodau Gwasanaeth</a> a <a>Hysbysiad Preifatrwydd</a> Test Pilot . Gallwch ddysgu rhagor am yr arbrawf a'i gasglu data <a>yma</a>. legalNoticeTestPilot = Ar hyn o mae Firefox Send yn arbrawf o fewn rhaglen Test Pilot ac yn destun <a>Amodau Gwasanaeth</a> a <a>Hysbysiad Preifatrwydd</a> Test Pilot . Gallwch ddysgu rhagor am yr arbrawf a'r data mae'n ei gasglu <a>yma</a>.
legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun <a>Hysbysiad Preifatrwydd Gwefannau</a> ac <a>Amodau Defnydd Gwefannau</a> Mozilla. legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun <a>Hysbysiad Preifatrwydd Gwefannau</a> ac <a>Amodau Defnydd Gwefannau</a> Mozilla.
deletePopupText = Dileu'r ffeil? deletePopupText = Dileu'r ffeil?
deletePopupYes = Iawn deletePopupYes = Iawn

View File

@@ -21,6 +21,7 @@ uploadingPageMessage = Aegumise sätteid saab muuta siis, kui faili üles laadit
uploadingPageCancel = Katkesta üleslaadimine uploadingPageCancel = Katkesta üleslaadimine
uploadCancelNotification = Üleslaadimine katkestati uploadCancelNotification = Üleslaadimine katkestati
uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta. uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta.
uploadingFileNotification = Teavita mind üleslaadimise lõppemisest.
uploadSuccessConfirmHeader = Saatmiseks valmis uploadSuccessConfirmHeader = Saatmiseks valmis
uploadSvgAlt = Laadi üles uploadSvgAlt = Laadi üles
uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel. uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel.
@@ -64,6 +65,7 @@ copyFileList = Kopeeri URL
// expiryFileList is used as a column header // expiryFileList is used as a column header
expiryFileList = Aegub expiryFileList = Aegub
deleteFileList = Kustuta deleteFileList = Kustuta
nevermindButton = Ära pane tähele
legalHeader = Tingimused ja privaatsusreeglid legalHeader = Tingimused ja privaatsusreeglid
legalNoticeTestPilot = Firefox Send on praegu Test Piloti eksperiment ja sellele rakenduvad Test Piloti <a>teenusetingimused</a> ning <a>privaatsusreeglid</a>. Rohkem teavet selle eksperimendi ja kogutavate andmete kohta leiab <a>siit</a>. legalNoticeTestPilot = Firefox Send on praegu Test Piloti eksperiment ja sellele rakenduvad Test Piloti <a>teenusetingimused</a> ning <a>privaatsusreeglid</a>. Rohkem teavet selle eksperimendi ja kogutavate andmete kohta leiab <a>siit</a>.
legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla <a>veebilehtede privaatsusreeglid</a> ja <a>veebilehtede teenusetingimused</a>. legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla <a>veebilehtede privaatsusreeglid</a> ja <a>veebilehtede teenusetingimused</a>.

View File

@@ -0,0 +1,73 @@
// Firefox Send is a brand name and should not be localized.
title = Firefox Send
siteSubtitle = ניסוי אינטרנט
siteFeedback = משוב
uploadPageHeader = שיתוף קבצים פרטי, מוצפן
uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח.
uploadPageLearnMore = מידע נוסף
uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה
uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב
uploadPageBrowseButton1 = נא לבחור קובץ להעלאה
uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע.
uploadPageBrowseButtonTitle = העלאת קובץ
uploadingPageProgress = { $filename } ({ $size }) בהעלאה
importingFile = מתבצע ייבוא...
verifyingFile = מתבצע אימות…
encryptingFile = מתבצעת הצפנה...
decryptingFile = מתבצע פענוח...
notifyUploadDone = ההעלאה שלך הסתיימה
uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה.
uploadCancelNotification = ההעלאה שלך בוטלה.
uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות!
uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה.
uploadSuccessConfirmHeader = מוכן לשליחה
uploadSvgAlt
.alt = להעלות
uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות.
copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename }
copiedUrl = הועתק!
deleteFileButton = מחיקת קובץ
.title = מחיקת קובץ
sendAnotherFileLink = שליחת קובץ נוסף
.title = שליחת קובץ נוסף
// Alternative text used on the download link/button (indicates an action).
downloadAltText
.alt = הורדה
downloadFileName = ההורדה נכשלה
downloadFileSize = ({ $size })
// 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)".
fileSizeProgress = ({ $partialSize } מתוך { $totalSize })
downloadingPageProgress = בהורדה: { $filename } ({ $size })
errorAltText
.alt = תקלה בהעלאה
errorPageHeader = משהו השתבש!
errorPageLink = שליחת קובץ נוסף
fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }.
linkExpiredAlt
.alt = קישור פג
notSupportedHeader = הדפדפן שלך לא נתמך.
notSupportedLink = למה אין תמיכה בדפדפן שלי?
downloadFirefoxButtonSub = הורדה בחינם
uploadedFile = קובץ
copyFileList = העתקת כתובת
// expiryFileList is used as a column header
expiryFileList = יפוג בעוד
deleteFileList = מחיקה
nevermindButton = לא משנה
legalHeader = תנאי שירות ופרטיות
deletePopupText = למחוק דף זה?
deletePopupYes = כן
deletePopupCancel = ביטול
deleteButtonHover
.title = מחיקה
copyUrlHover
.title = העתקת קישור
footerLinkLegal = מידע משפטי
footerLinkPrivacy = פרטיות
footerLinkTerms = תנאי שימוש
footerLinkCookies = קובצי עוגיות

View File

@@ -8,9 +8,11 @@ uploadPageLearnMore = Pelajari lebih lanjut
uploadPageDropMessage = Lepas berkas Anda di sini untuk mulai mengunggah uploadPageDropMessage = Lepas berkas Anda di sini untuk mulai mengunggah
uploadPageSizeMessage = Untuk pengoperasian yang paling andal, sebaiknya jaga berkas Anda di bawah 1GB uploadPageSizeMessage = Untuk pengoperasian yang paling andal, sebaiknya jaga berkas Anda di bawah 1GB
uploadPageBrowseButton = Pilih berkas pada komputer Anda uploadPageBrowseButton = Pilih berkas pada komputer Anda
uploadPageBrowseButton1 = Pilih berkas untuk diunggah
.title = Pilih berkas untuk diunggah
uploadPageMultipleFilesAlert = Saat ini belum mendukung pengunggahan beberapa berkas atau folder. uploadPageMultipleFilesAlert = Saat ini belum mendukung pengunggahan beberapa berkas atau folder.
uploadPageBrowseButtonTitle = Unggah berkas uploadPageBrowseButtonTitle = Unggah berkas
uploadingPageHeader = Mengunggah Berkas Anda uploadingPageProgress = Mengunggah { $filename } ({ $size })
importingFile = Mengimpor… importingFile = Mengimpor…
verifyingFile = Memverifikasi… verifyingFile = Memverifikasi…
encryptingFile = Mengenkripsi... encryptingFile = Mengenkripsi...
@@ -39,6 +41,8 @@ downloadMessage = Teman Anda mengirimkan berkas dengan Firefox Send, layanan yan
downloadButtonLabel = Unduh downloadButtonLabel = Unduh
downloadNotification = Unduhan Anda telah selesai. downloadNotification = Unduhan Anda telah selesai.
downloadFinish = Unduhan Selesai downloadFinish = Unduhan Selesai
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
fileSizeProgress = ({ $partialSize } dari { $totalSize })
// Firefox Send is a brand name and should not be localized. // Firefox Send is a brand name and should not be localized.
sendYourFilesLink = Coba Firefox Send sendYourFilesLink = Coba Firefox Send
downloadingPageProgress = Mengunduh { $filename } ({ $size }) downloadingPageProgress = Mengunduh { $filename } ({ $size })

View File

@@ -35,7 +35,7 @@ downloadAltText = Prevziať
downloadFileName = Prevziať { $filename } downloadFileName = Prevziať { $filename }
downloadFileSize = ({ $size }) downloadFileSize = ({ $size })
// Firefox Send is a brand name and should not be localized. // Firefox Send is a brand name and should not be localized.
downloadMessage = Váš priateľ vám odoslal súbor pomocou služby Firefox Sync - táto vám umožňuje zdieľať súbory pomocou bezpečného, súkromného a zašifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory neostanú na internete naveky. downloadMessage = Váš priateľ vám odoslal súbor pomocou služby Firefox Send - táto vám umožňuje zdieľať súbory pomocou bezpečného, súkromného a zašifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory neostanú na internete naveky.
// 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 = Prevziať downloadButtonLabel = Prevziať
downloadNotification = Vaše preberanie bolo dokončené. downloadNotification = Vaše preberanie bolo dokončené.

View File

@@ -48,6 +48,7 @@ linkExpiredAlt = లంకె గడువు ముగిసింది
expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు! expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు!
notSupportedHeader = మీ విహారిణికి మద్దతు లేదు. notSupportedHeader = మీ విహారిణికి మద్దతు లేదు.
notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు? notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు?
notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి.
updateFirefox = Firefoxను నవీకరించు updateFirefox = Firefoxను నవీకరించు
downloadFirefoxButtonSub = ఉచిత దిగుమతులు downloadFirefoxButtonSub = ఉచిత దిగుమతులు
uploadedFile = దస్త్రం uploadedFile = దస్త్రం

View File

@@ -31,9 +31,39 @@ module.exports = function(state, body = '') {
<title>${state.title}</title> <title>${state.title}</title>
<link rel="stylesheet" type="text/css" href="${assets.get('main.css')}" /> <link rel="stylesheet" type="text/css" href="${assets.get('main.css')}" />
<link rel="icon" type="image/png" href="${assets.get(
'favicon-32x32.png' <!-- generic favicons -->
)}" sizes="32x32" /> <link rel="icon" href="${assets.get('favicon-32.png')}" sizes="32x32">
<link rel="icon" href="${assets.get('favicon-96.png')}" sizes="96x96">
<link rel="icon" href="${assets.get('favicon-128.png')}" sizes="128x128">
<link rel="icon" href="${assets.get('favicon-228.png')}" sizes="228x228">
<!-- Android -->
<link rel="shortcut icon" href="${assets.get(
'favicon-196.png'
)}" sizes="196x196">
<!-- iOS -->
<link rel="apple-touch-icon" href="${assets.get(
'favicon-120.png'
)}" sizes="120x120">
<link rel="apple-touch-icon" href="${assets.get(
'favicon-152.png'
)}" sizes="152x152">
<link rel="apple-touch-icon" href="${assets.get(
'favicon-180.png'
)}" sizes="180x180">
<!-- Windows 8 IE 10-->
<meta name="msapplication-TileColor" content="#FFFFFF">
<meta name="msapplication-TileImage" content="${assets.get(
'favicon-144.png'
)}">
<!— Windows 8.1 + IE11 and above —>
<meta name="msapplication-config" content="/browserconfig.xml"/>
${firaTag} ${firaTag}
<script defer src="/jsconfig.js"></script> <script defer src="/jsconfig.js"></script>
<script defer src="${assets.get('runtime.js')}"></script> <script defer src="${assets.get('runtime.js')}"></script>

View File

@@ -15,10 +15,8 @@ module.exports = function(req) {
storage: { storage: {
files: [] files: []
}, },
config: { fira: false,
uploadWindowStyle: 'upload-window', fileInfo: {},
uploadButtonStyle: 'browse btn'
},
layout layout
}; };
}; };

View File

@@ -54,7 +54,9 @@ describe('Server integration tests', function() {
} }
it('Responds with a 200 when the service is up', function() { it('Responds with a 200 when the service is up', function() {
return request(server).get('/').expect(200); return request(server)
.get('/')
.expect(200);
}); });
it('Rejects with a 404 when a file id is not valid', function() { it('Rejects with a 404 when a file id is not valid', function() {
@@ -89,7 +91,9 @@ describe('Server integration tests', function() {
}); });
it('Responds with a 200 if a file exists', function() { it('Responds with a 200 if a file exists', function() {
return request(server).get('/exists/' + fileId).expect(200); return request(server)
.get('/exists/' + fileId)
.expect(200);
}); });
it('Exists in the redis server', function() { it('Exists in the redis server', function() {
@@ -107,7 +111,9 @@ describe('Server integration tests', function() {
}); });
it('Fails delete if the id is invalid', function() { it('Fails delete if the id is invalid', function() {
return request(server).post('/delete/1').expect(404); return request(server)
.post('/delete/1')
.expect(404);
}); });
it('Successfully deletes if the id is valid and the delete token matches', function( it('Successfully deletes if the id is valid and the delete token matches', function(
@@ -129,7 +135,9 @@ describe('Server integration tests', function() {
}); });
it('Responds with a 404 if a file does not exist', function() { it('Responds with a 404 if a file does not exist', function() {
return request(server).get('/exists/notfound').expect(404); return request(server)
.get('/exists/notfound')
.expect(404);
}); });
it('Uploads properly after a delete', function(done) { it('Uploads properly after a delete', function(done) {
@@ -150,21 +158,25 @@ describe('Server integration tests', function() {
}); });
it('Responds with a 200 for the download page', function() { it('Responds with a 200 for the download page', function() {
return request(server).get('/download/' + fileId).expect(200); return request(server)
.get('/download/' + fileId)
.expect(200);
}); });
it('Downloads a file properly', function() { it('Downloads a file properly', function() {
return request(server).get('/assets/download/' + fileId).then(res => { return request(server)
assert(res.header.hasOwnProperty('content-disposition')); .get('/assets/download/' + fileId)
assert(res.header.hasOwnProperty('content-type')); .then(res => {
assert(res.header.hasOwnProperty('content-length')); assert(res.header.hasOwnProperty('content-disposition'));
assert(res.header.hasOwnProperty('x-file-metadata')); assert(res.header.hasOwnProperty('content-type'));
assert.equal( assert(res.header.hasOwnProperty('content-length'));
res.header['content-disposition'], assert(res.header.hasOwnProperty('x-file-metadata'));
'attachment; filename=test_upload.txt' assert.equal(
); res.header['content-disposition'],
assert.equal(res.header['content-type'], 'application/octet-stream'); 'attachment; filename=test_upload.txt'
}); );
assert.equal(res.header['content-type'], 'application/octet-stream');
});
}); });
it('The file is deleted after one download', function() { it('The file is deleted after one download', function() {