Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
837747f8f7 | ||
|
|
a8c32ae49c | ||
|
|
32c5b414de | ||
|
|
12c81a22e8 | ||
|
|
0c5d0d4bb2 | ||
|
|
234f9c624d | ||
|
|
da669b44ff | ||
|
|
3c39f5f085 | ||
|
|
6de91b5872 | ||
|
|
ff9a0979f6 | ||
|
|
e1e8af2489 | ||
|
|
1eb000f615 | ||
|
|
e20fd97e59 | ||
|
|
d10ceacd67 | ||
|
|
208c28ee01 | ||
|
|
cdd1bb3c29 | ||
|
|
3d9c4fa320 | ||
|
|
9c4d18ef3b | ||
|
|
ce9ff3959f | ||
|
|
51aef4e1e5 | ||
|
|
90247059d0 | ||
|
|
c97abb46ed | ||
|
|
b8f5e371c7 | ||
|
|
401311a05f | ||
|
|
652b8e4e15 | ||
|
|
99b7e7c0f1 | ||
|
|
81442bb6f2 | ||
|
|
137f474b69 | ||
|
|
8e14d3f8f7 |
3
.nsprc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"exceptions": ["https://nodesecurity.io/advisories/534"]
|
||||||
|
}
|
||||||
2
.prettierignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
dist
|
||||||
|
assets/*.js
|
||||||
14
README.md
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
14
app/main.js
@@ -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';
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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
|
After Width: | Height: | Size: 4.9 KiB |
BIN
assets/favicon-128.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
assets/favicon-144.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
assets/favicon-152.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
assets/favicon-167.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
assets/favicon-180.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
assets/favicon-195.png
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
BIN
assets/favicon-196.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
assets/favicon-228.png
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
BIN
assets/favicon-32.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
BIN
assets/favicon-96.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
60
package.json
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>.
|
||||||
|
|||||||
73
public/locales/he/send.ftl
Normal 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 = קובצי עוגיות
|
||||||
@@ -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 })
|
||||||
|
|||||||
@@ -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é.
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ linkExpiredAlt = లంకె గడువు ముగిసింది
|
|||||||
expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు!
|
expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు!
|
||||||
notSupportedHeader = మీ విహారిణికి మద్దతు లేదు.
|
notSupportedHeader = మీ విహారిణికి మద్దతు లేదు.
|
||||||
notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు?
|
notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు?
|
||||||
|
notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి.
|
||||||
updateFirefox = Firefoxను నవీకరించు
|
updateFirefox = Firefoxను నవీకరించు
|
||||||
downloadFirefoxButtonSub = ఉచిత దిగుమతులు
|
downloadFirefoxButtonSub = ఉచిత దిగుమతులు
|
||||||
uploadedFile = దస్త్రం
|
uploadedFile = దస్త్రం
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -15,10 +15,8 @@ module.exports = function(req) {
|
|||||||
storage: {
|
storage: {
|
||||||
files: []
|
files: []
|
||||||
},
|
},
|
||||||
config: {
|
fira: false,
|
||||||
uploadWindowStyle: 'upload-window',
|
fileInfo: {},
|
||||||
uploadButtonStyle: 'browse btn'
|
|
||||||
},
|
|
||||||
layout
|
layout
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||