Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
137f474b69 | ||
|
|
8e14d3f8f7 | ||
|
|
07b7bc003a | ||
|
|
df691c1516 | ||
|
|
17e61bb09d | ||
|
|
14e21988b2 | ||
|
|
205de5a633 | ||
|
|
eabdc903b9 | ||
|
|
0628e71ec9 | ||
|
|
ebbcb38c7a | ||
|
|
5c1f535291 | ||
|
|
2c8e488611 | ||
|
|
6f3eac659c | ||
|
|
86bca790bc | ||
|
|
895d196876 | ||
|
|
3d8b38ffe4 | ||
|
|
fddc415c86 | ||
|
|
7a8e9b5de1 | ||
|
|
bbaeb44b26 | ||
|
|
a95f659474 | ||
|
|
4d311b134f | ||
|
|
5f90de577f | ||
|
|
3c32ce946a | ||
|
|
5ca89d0e0d | ||
|
|
781d1f5b0a | ||
|
|
ef9bfae319 | ||
|
|
7abbc60e17 | ||
|
|
15244e1a64 | ||
|
|
4b39d61ff4 | ||
|
|
74718d6361 | ||
|
|
ced640c24a | ||
|
|
cdaa92c86d | ||
|
|
57012f0660 | ||
|
|
6fde6e0a79 | ||
|
|
182bde30fa | ||
|
|
59e2267513 | ||
|
|
01a064ef7f | ||
|
|
9759338e6a | ||
|
|
5ac4560157 | ||
|
|
8e60ca1ac9 | ||
|
|
131a8b5564 | ||
|
|
663023a204 | ||
|
|
2b5c9dfb35 | ||
|
|
a9a34fdd0a | ||
|
|
1655094ce3 | ||
|
|
9ae7e3df11 | ||
|
|
0a31e2d521 | ||
|
|
b6849661a6 | ||
|
|
53e822964e | ||
|
|
b2f76d2df9 | ||
|
|
574a3ce894 | ||
|
|
c68f796891 | ||
|
|
c592f84d7d | ||
|
|
31faaf147e | ||
|
|
09c20f5933 | ||
|
|
fa4ab7bd5c | ||
|
|
de4a24a7f8 | ||
|
|
8f1c404724 | ||
|
|
1b975e7ba7 | ||
|
|
1d7473c489 | ||
|
|
a7d3992ba1 | ||
|
|
d81e9a76db | ||
|
|
0624e59776 | ||
|
|
546064a7ee | ||
|
|
9d49cc876c |
@@ -1,12 +1,8 @@
|
||||
node_modules
|
||||
.git
|
||||
.DS_Store
|
||||
static
|
||||
test
|
||||
scripts
|
||||
docs
|
||||
firefox
|
||||
assets
|
||||
docs
|
||||
public
|
||||
views
|
||||
webpack
|
||||
frontend
|
||||
test
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
public
|
||||
test/frontend/bundle.js
|
||||
dist
|
||||
assets
|
||||
firefox
|
||||
|
||||
6
.gitignore
vendored
@@ -1,6 +1,2 @@
|
||||
.DS_Store
|
||||
dist
|
||||
node_modules
|
||||
static/*
|
||||
!static/info.txt
|
||||
test/frontend/bundle.js
|
||||
dist
|
||||
|
||||
2
.prettierignore
Normal file
@@ -0,0 +1,2 @@
|
||||
dist
|
||||
assets/*.js
|
||||
218
CHANGELOG.md
Normal file
@@ -0,0 +1,218 @@
|
||||
## Change Log
|
||||
|
||||
### v1.1.1 (2017/08/17 01:29 +00:00)
|
||||
- [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates)
|
||||
- [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates)
|
||||
- [#515](https://github.com/mozilla/send/pull/515) removed jquery from upload.js (@dannycoates)
|
||||
- [#514](https://github.com/mozilla/send/pull/514) use async and removed jquery from download.js (@dannycoates)
|
||||
- [#513](https://github.com/mozilla/send/pull/513) use svg for progress (@dannycoates)
|
||||
- [#510](https://github.com/mozilla/send/pull/510) added precommit hook for format (@dannycoates)
|
||||
- [#502](https://github.com/mozilla/send/pull/502) extracted filelist into its own file (@dannycoates)
|
||||
- [#428](https://github.com/mozilla/send/pull/428) add twitter and open graph cards (@dannycoates, @johngruen)
|
||||
- [#506](https://github.com/mozilla/send/pull/506) 404 page (@varghesethomase)
|
||||
- [#508](https://github.com/mozilla/send/pull/508) fixes 478 (@abhinadduri)
|
||||
- [#504](https://github.com/mozilla/send/pull/504) fix japanese browse button (@johngruen)
|
||||
- [#503](https://github.com/mozilla/send/pull/503) Added editorconfig (@skystar-p)
|
||||
- [#499](https://github.com/mozilla/send/pull/499) use import/export in the frontend code (@dannycoates)
|
||||
- [#500](https://github.com/mozilla/send/pull/500) fixed build:css on windows (@dannycoates)
|
||||
- [#481](https://github.com/mozilla/send/pull/481) Cater for mobile and desktop (@pdehaan, @hubdotcom)
|
||||
- [#493](https://github.com/mozilla/send/pull/493) added webpack-dev-middleware (@dannycoates)
|
||||
- [#491](https://github.com/mozilla/send/pull/491) added missing exit event cases (@dannycoates)
|
||||
- [#492](https://github.com/mozilla/send/pull/492) make the site mostly work when cookies (localStorage) are disabled (@dannycoates)
|
||||
- [#490](https://github.com/mozilla/send/pull/490) set the mime type in the download blob (@dannycoates)
|
||||
- [#485](https://github.com/mozilla/send/pull/485) added progress to tab title when not in focus (@dannycoates)
|
||||
- [#474](https://github.com/mozilla/send/pull/474) Fixing bug #438 by adding role attribute to anchor tags and alt attribute images (@varghesethomase)
|
||||
- [#480](https://github.com/mozilla/send/pull/480) Increase font weight to 500 on <button>s and <label>s (@pdehaan)
|
||||
- [#419](https://github.com/mozilla/send/pull/419) Add autoprefixer and cssnano support (@pdehaan)
|
||||
|
||||
### v1.1.0 (2017/08/08 03:59 +00:00)
|
||||
- [#473](https://github.com/mozilla/send/pull/473) Sort contributors alphabetically to prevent churn (@pdehaan)
|
||||
- [#472](https://github.com/mozilla/send/pull/472) removed references to checksums in frontend tests (@abhinadduri)
|
||||
- [#470](https://github.com/mozilla/send/pull/470) removed the file sha256 hash (@dannycoates)
|
||||
- [#469](https://github.com/mozilla/send/pull/469) Increase mimimum node version to 8.2.0 (@ehuggett)
|
||||
- [#468](https://github.com/mozilla/send/pull/468) attach delete-file handler only after upload (@dannycoates)
|
||||
- [#466](https://github.com/mozilla/send/pull/466) added webpack (@dannycoates)
|
||||
- [#427](https://github.com/mozilla/send/pull/427) Extended system font list fixes:#408 (@gautamkrishnar)
|
||||
- [#448](https://github.com/mozilla/send/pull/448) Migrate width attribute to CSS (Fixes #436) (@nskins)
|
||||
- [#457](https://github.com/mozilla/send/pull/457) factored out progress into progress.js (@dannycoates)
|
||||
- [#452](https://github.com/mozilla/send/pull/452) refactored metrics (@dannycoates)
|
||||
- [#455](https://github.com/mozilla/send/pull/455) Add a few missing strings from es-CL and tr locales (@pdehaan)
|
||||
- [#444](https://github.com/mozilla/send/pull/444) Chain jQuery calls, do not use events alias and store selectors (@Johann-S)
|
||||
- [#416](https://github.com/mozilla/send/pull/416) WIP: use webcrypto-liner to support Safari 10 (@dannycoates)
|
||||
- [#451](https://github.com/mozilla/send/pull/451) Add rel noopener noreferrer to target='_blank' anchor elements (Fixes #439) (@boopeshmahendran)
|
||||
- [#449](https://github.com/mozilla/send/pull/449) Add X-UA-Compatible meta tag (@kenrick95)
|
||||
- [#433](https://github.com/mozilla/send/pull/433) Prevent download button from being clicked multiple times (@pdehaan)
|
||||
- [#432](https://github.com/mozilla/send/pull/432) Add contributors script (@pdehaan)
|
||||
- [#409](https://github.com/mozilla/send/pull/409) Handle copy clipboard disabled (@Johann-S)
|
||||
|
||||
### v1.0.4 (2017/08/03 23:05 +00:00)
|
||||
- [#418](https://github.com/mozilla/send/pull/418) _blank all footer links (@dannycoates)
|
||||
- [#386](https://github.com/mozilla/send/pull/386) fix percentage view on mobile layout (@ariestiyansyah)
|
||||
- [#414](https://github.com/mozilla/send/pull/414) Add link to FAQ in unsupported view (@pdehaan)
|
||||
- [#415](https://github.com/mozilla/send/pull/415) Only include Fira CSS on /unsupported/* route (@pdehaan)
|
||||
- [#412](https://github.com/mozilla/send/pull/412) throw key errors before download begins (@dannycoates)
|
||||
- [#404](https://github.com/mozilla/send/pull/404) Use async function instead of promise (#325) (@weihanglo)
|
||||
- [#406](https://github.com/mozilla/send/pull/406) Add noscript tag (@pdehaan)
|
||||
- [#325](https://github.com/mozilla/send/pull/325) Use async function instead of promise (#325) (@weihanglo)
|
||||
- [#325](https://github.com/mozilla/send/pull/325) Use async function instead of promise (#325) (@weihanglo)
|
||||
|
||||
### v1.0.3 (2017/08/02 23:59 +00:00)
|
||||
- [#402](https://github.com/mozilla/send/pull/402) filter the hash from error reports (@dannycoates)
|
||||
- [#400](https://github.com/mozilla/send/pull/400) fix link that breaks download by opening in new tab (@johngruen)
|
||||
- [#369](https://github.com/mozilla/send/pull/369) Add ESLint no-alert shame rule (@pdehaan)
|
||||
- [#396](https://github.com/mozilla/send/pull/396) add babel-polyfill (@dannycoates)
|
||||
- [#394](https://github.com/mozilla/send/pull/394) catch JSON.parse errors of storage metadata (@dannycoates)
|
||||
- [#367](https://github.com/mozilla/send/pull/367) Generate production locales using 'compare-locales' (@pdehaan)
|
||||
- [#392](https://github.com/mozilla/send/pull/392) Adjust hover behavior on send-logo (#382)
|
||||
Fixes: #382. (@weihanglo)
|
||||
- [#382](https://github.com/mozilla/send/pull/382) Adjust hover behavior on send-logo (#382) (@weihanglo)
|
||||
- [#382](https://github.com/mozilla/send/pull/382) Adjust hover behavior on send-logo (#382) (@weihanglo)
|
||||
- [#380](https://github.com/mozilla/send/pull/380) Add Pontoon URL to README (@pdehaan)
|
||||
|
||||
### v1.0.2 (2017/07/31 18:58 +00:00)
|
||||
- [#365](https://github.com/mozilla/send/pull/365) revert the IE fix to fix footer on chrome (@dannycoates)
|
||||
|
||||
### v1.0.1 (2017/07/31 17:28 +00:00)
|
||||
- [#353](https://github.com/mozilla/send/pull/353) redirect ie to /unsupported (@abhinadduri, @dannycoates)
|
||||
- [#360](https://github.com/mozilla/send/pull/360) Fix some linting nits (@pdehaan)
|
||||
- [#362](https://github.com/mozilla/send/pull/362) Adjusts category of unsupported event (fixes #350). (@chuckharmston)
|
||||
- [#355](https://github.com/mozilla/send/pull/355) Make order of uploaded files in list consistent (@pdehaan)
|
||||
- [#356](https://github.com/mozilla/send/pull/356) Get rid of console.log statements (@pdehaan)
|
||||
- [#358](https://github.com/mozilla/send/pull/358) Fix some missing .title attributes in dev-only locales (@pdehaan)
|
||||
- [#354](https://github.com/mozilla/send/pull/354) Remove /en-US/ from cookies link in footer (@pdehaan)
|
||||
- [#339](https://github.com/mozilla/send/pull/339) Show error page on firefox v49 and below (@ericawright, @abhinadduri)
|
||||
- [#346](https://github.com/mozilla/send/pull/346) Add docs/CODEOWNERS file (@pdehaan)
|
||||
- [#345](https://github.com/mozilla/send/pull/345) wrap long file names (@dnarcese)
|
||||
- [#344](https://github.com/mozilla/send/pull/344) don't wrap file list headers (@dnarcese)
|
||||
- [#327](https://github.com/mozilla/send/pull/327) Modify popup delete dialog (@youwenliang)
|
||||
- [#341](https://github.com/mozilla/send/pull/341) center percentage text on all browser versions (@dnarcese)
|
||||
- [#340](https://github.com/mozilla/send/pull/340) Remove duplicate entities in localized FTL files (@flodolo)
|
||||
- [#337](https://github.com/mozilla/send/pull/337) support v 50 and 51 by not allowing const in loops (@ericawright)
|
||||
- [#338](https://github.com/mozilla/send/pull/338) Remove duplicated strings in en-US, fix nn-NO file (@flodolo)
|
||||
- [#336](https://github.com/mozilla/send/pull/336) German(de): Fixed missing value for deleteFileButton (#336) (@flodolo)
|
||||
- [#334](https://github.com/mozilla/send/pull/334) fix functionality on firefox 50 and 51 (@dnarcese)
|
||||
|
||||
### v1.0.0 (2017/07/26 19:08 +00:00)
|
||||
- [#323](https://github.com/mozilla/send/pull/323) disable upload/download notifications (@dannycoates)
|
||||
- [#322](https://github.com/mozilla/send/pull/322) fix feedback button jump (@dnarcese)
|
||||
- [#320](https://github.com/mozilla/send/pull/320) fix German footer (@dnarcese)
|
||||
|
||||
### v0.2.2 (2017/07/26 04:50 +00:00)
|
||||
- [#314](https://github.com/mozilla/send/pull/314) added L10N_DEV environment variable for making all languages available (@dannycoates)
|
||||
- [#313](https://github.com/mozilla/send/pull/313) removing timeout limit for front end tests (@abhinadduri)
|
||||
- [#311](https://github.com/mozilla/send/pull/311) expired ids should reject instead of returning null (@dannycoates)
|
||||
- [#302](https://github.com/mozilla/send/pull/302) UX Refine WIP (@youwenliang)
|
||||
- [#310](https://github.com/mozilla/send/pull/310) if the download card is pressed, the expired card shows up properly (@abhinadduri)
|
||||
- [#269](https://github.com/mozilla/send/pull/269) refactored ftl file (@abhinadduri)
|
||||
- [#291](https://github.com/mozilla/send/pull/291) added legal page (@dannycoates)
|
||||
- [#307](https://github.com/mozilla/send/pull/307) don't show error page on upload cancel (@dnarcese)
|
||||
- [#299](https://github.com/mozilla/send/pull/299) use CIRCLE_TAG as version.json version if present (@dannycoates)
|
||||
|
||||
### v0.2.1 (2017/07/24 23:34 +00:00)
|
||||
- [#296](https://github.com/mozilla/send/pull/296) restyle delete popup (@dnarcese)
|
||||
- [#295](https://github.com/mozilla/send/pull/295) renamed environment variables to remove P2P_ prefix (@dannycoates)
|
||||
- [#294](https://github.com/mozilla/send/pull/294) dealing with invalid drag and drops (@abhinadduri)
|
||||
- [#297](https://github.com/mozilla/send/pull/297) added environment variable for expire time (@dannycoates)
|
||||
- [#292](https://github.com/mozilla/send/pull/292) Fixes289 (@abhinadduri)
|
||||
- [#288](https://github.com/mozilla/send/pull/288) fix: Don`t allow upload when not on the upload page. (@ericawright)
|
||||
- [#285](https://github.com/mozilla/send/pull/285) added messages for processing phases (@dannycoates)
|
||||
- [#267](https://github.com/mozilla/send/pull/267) make site responsive and add feedback link (@johngruen)
|
||||
- [#286](https://github.com/mozilla/send/pull/286) Update download progress bar color (@pdehaan)
|
||||
- [#281](https://github.com/mozilla/send/pull/281) Stop ESLint from linting the /public/ directory (@pdehaan)
|
||||
- [#280](https://github.com/mozilla/send/pull/280) created /unsupported page and added gcmCompliant to /download page (@dannycoates)
|
||||
- [#279](https://github.com/mozilla/send/pull/279) create separate js bundles for upload/download pages (@dannycoates)
|
||||
- [#268](https://github.com/mozilla/send/pull/268) Testpilot ga (@abhinadduri)
|
||||
|
||||
### v0.2.0 (2017/07/21 19:27 +00:00)
|
||||
- [#266](https://github.com/mozilla/send/pull/266) abort uploads over maxfilesize (@dannycoates)
|
||||
- [#264](https://github.com/mozilla/send/pull/264) Remove duplicate custom metric. (@chuckharmston)
|
||||
- [#259](https://github.com/mozilla/send/pull/259) add alert when uploading multiple files (@dnarcese)
|
||||
- [#262](https://github.com/mozilla/send/pull/262) sync download progress bar with percentage (@dnarcese)
|
||||
- [#258](https://github.com/mozilla/send/pull/258) better sync percent with progress bar (@dnarcese)
|
||||
- [#257](https://github.com/mozilla/send/pull/257) add a dynamic js script for page config (@dannycoates)
|
||||
- [#256](https://github.com/mozilla/send/pull/256) add file size limit message (@dnarcese)
|
||||
- [#253](https://github.com/mozilla/send/pull/253) Add favicon.ico version of the Send logo (@pdehaan)
|
||||
- [#254](https://github.com/mozilla/send/pull/254) Add nsp check to circle ci (@pdehaan)
|
||||
- [#245](https://github.com/mozilla/send/pull/245) Localization (@abhinadduri)
|
||||
- [#252](https://github.com/mozilla/send/pull/252) only allow drag and drop on upload page (@dnarcese)
|
||||
- [#250](https://github.com/mozilla/send/pull/250) make footer not overlap (@dnarcese)
|
||||
- [#251](https://github.com/mozilla/send/pull/251) minify all images (@ericawright)
|
||||
- [#249](https://github.com/mozilla/send/pull/249) change how the file upload box expands (@dnarcese)
|
||||
- [#246](https://github.com/mozilla/send/pull/246) remove P2P references. Fixes #224 (@clouserw)
|
||||
- [#242](https://github.com/mozilla/send/pull/242) Make only icons clickable in file list (@dnarcese)
|
||||
- [#236](https://github.com/mozilla/send/pull/236) add FAQ. Fixes #186 (@clouserw)
|
||||
- [#235](https://github.com/mozilla/send/pull/235) allow send another file link to open in new tab (@dnarcese)
|
||||
- [#234](https://github.com/mozilla/send/pull/234) fix download svg (@dnarcese)
|
||||
- [#232](https://github.com/mozilla/send/pull/232) escape filename in the ui (@dannycoates)
|
||||
- [#226](https://github.com/mozilla/send/pull/226) added functionality to cancel uploads (@abhinadduri)
|
||||
- [#231](https://github.com/mozilla/send/pull/231) move head and html tags to main template (@dnarcese)
|
||||
- [#228](https://github.com/mozilla/send/pull/228) add send logo (@dnarcese)
|
||||
- [#229](https://github.com/mozilla/send/pull/229) change learn more and github links (@dnarcese)
|
||||
- [#201](https://github.com/mozilla/send/pull/201) Adds metrics documentation (closes #5). (@chuckharmston)
|
||||
- [#223](https://github.com/mozilla/send/pull/223) change size of send another file links (@dnarcese)
|
||||
- [#222](https://github.com/mozilla/send/pull/222) add footer (@dnarcese)
|
||||
- [#197](https://github.com/mozilla/send/pull/197) fixes issues 195 and 192 (@abhinadduri)
|
||||
- [#204](https://github.com/mozilla/send/pull/204) added HSTS header (@dannycoates)
|
||||
- [#193](https://github.com/mozilla/send/pull/193) Frontend tests (@abhinadduri)
|
||||
- [#191](https://github.com/mozilla/send/pull/191) New ui! (@dnarcese)
|
||||
|
||||
### v0.1.4 (2017/07/12 18:21 +00:00)
|
||||
- [#189](https://github.com/mozilla/send/pull/189) Add CSP directives (@dannycoates)
|
||||
- [#188](https://github.com/mozilla/send/pull/188) fixes delete button error (@abhinadduri)
|
||||
- [#185](https://github.com/mozilla/send/pull/185) added loading, hashing, and encrypting events for uploader; decryptin… (@abhinadduri)
|
||||
- [#183](https://github.com/mozilla/send/pull/183) rename to 'Send' (@dannycoates)
|
||||
- [#184](https://github.com/mozilla/send/pull/184) Server tests (@abhinadduri)
|
||||
- [#178](https://github.com/mozilla/send/pull/178) fixed issues in branch title (@abhinadduri)
|
||||
- [#177](https://github.com/mozilla/send/pull/177) Gcm compliance (@abhinadduri)
|
||||
- [#106](https://github.com/mozilla/send/pull/106) Gcm (@abhinadduri, @dannycoates)
|
||||
- [#168](https://github.com/mozilla/send/pull/168) Show error page if upload fails (@dnarcese)
|
||||
- [#148](https://github.com/mozilla/send/pull/148) WIP: Add basic contribute.json (@pdehaan)
|
||||
- [#162](https://github.com/mozilla/send/pull/162) Fix dev server URL in README.md file (@pdehaan)
|
||||
- [#167](https://github.com/mozilla/send/pull/167) build docker image with new name (@relud)
|
||||
- [#164](https://github.com/mozilla/send/pull/164) Add word wraps to table (@dnarcese)
|
||||
- [#149](https://github.com/mozilla/send/pull/149) Add robots.txt (@pdehaan)
|
||||
- [#161](https://github.com/mozilla/send/pull/161) Hide table header on empty list (@dnarcese)
|
||||
- [#154](https://github.com/mozilla/send/pull/154) Remove expired uploads (@dnarcese)
|
||||
- [#146](https://github.com/mozilla/send/pull/146) Update README with some more details (@pdehaan)
|
||||
|
||||
### v0.1.2 (2017/06/24 03:38 +00:00)
|
||||
- [#138](https://github.com/mozilla/send/pull/138) remove notLocalHost (@dannycoates)
|
||||
|
||||
### v0.1.0 (2017/06/24 01:24 +00:00)
|
||||
- [#137](https://github.com/mozilla/send/pull/137) refactored docker build (@dannycoates)
|
||||
- [#132](https://github.com/mozilla/send/pull/132) Add /__version__ route (@pdehaan)
|
||||
- [#135](https://github.com/mozilla/send/pull/135) make dockerfile more dockerflowy (@dannycoates)
|
||||
- [#134](https://github.com/mozilla/send/pull/134) Load previous uploads (@dannycoates, @dnarcese)
|
||||
- [#131](https://github.com/mozilla/send/pull/131) added __heartbeat__ (@dannycoates)
|
||||
- [#133](https://github.com/mozilla/send/pull/133) Add LICENSE file (@pdehaan)
|
||||
- [#130](https://github.com/mozilla/send/pull/130) added sentry to server code (@abhinadduri)
|
||||
- [#124](https://github.com/mozilla/send/pull/124) Remove unused [dev]dependencies (@pdehaan)
|
||||
- [#119](https://github.com/mozilla/send/pull/119) Move cross-env to a dep (@pdehaan)
|
||||
- [#123](https://github.com/mozilla/send/pull/123) removed bitly integration (@abhinadduri)
|
||||
- [#122](https://github.com/mozilla/send/pull/122) fix docker build (@dannycoates)
|
||||
- [#121](https://github.com/mozilla/send/pull/121) added docker service to circle.yml (@dannycoates)
|
||||
- [#120](https://github.com/mozilla/send/pull/120) added sentry (@abhinadduri)
|
||||
- [#118](https://github.com/mozilla/send/pull/118) change docker image name and add builds for tags (@relud)
|
||||
- [#116](https://github.com/mozilla/send/pull/116) add /__lbheartbeat__ endpoint (@relud)
|
||||
- [#79](https://github.com/mozilla/send/pull/79) Optimize/minimize bundle.js for production (@pdehaan)
|
||||
- [#104](https://github.com/mozilla/send/pull/104) Fix a bunch of ESLint and HTMLLint errors (@pdehaan)
|
||||
- [#105](https://github.com/mozilla/send/pull/105) Progress bars (@dnarcese)
|
||||
- [#111](https://github.com/mozilla/send/pull/111) added in anonmyized ip google analytics (@abhinadduri)
|
||||
- [#110](https://github.com/mozilla/send/pull/110) added notifications (@abhinadduri)
|
||||
- [#103](https://github.com/mozilla/send/pull/103) added Dockerfile (@dannycoates)
|
||||
- [#100](https://github.com/mozilla/send/pull/100) Added Helmet Middleware (@abhinadduri)
|
||||
- [#99](https://github.com/mozilla/send/pull/99) Testing (@abhinadduri)
|
||||
- [#77](https://github.com/mozilla/send/pull/77) Fix the linter errors (@pdehaan)
|
||||
- [#54](https://github.com/mozilla/send/pull/54) Adding basic ESLint config (@pdehaan)
|
||||
- [#71](https://github.com/mozilla/send/pull/71) Drag & drop (@dnarcese)
|
||||
- [#72](https://github.com/mozilla/send/pull/72) Logging (@abhinadduri, @dannycoates)
|
||||
- [#45](https://github.com/mozilla/send/pull/45) S3 integration (@abhinadduri, @dannycoates)
|
||||
- [#46](https://github.com/mozilla/send/pull/46) Download page and share link UI (@dnarcese)
|
||||
- [#41](https://github.com/mozilla/send/pull/41) Added upload page and file list UI (@dnarcese)
|
||||
- [#40](https://github.com/mozilla/send/pull/40) Tweak the package.json file (@pdehaan)
|
||||
- [#43](https://github.com/mozilla/send/pull/43) added return (@abhinadduri)
|
||||
- [#42](https://github.com/mozilla/send/pull/42) changed to handle 404 during download, also removing progress listene… (@abhinadduri)
|
||||
- [#39](https://github.com/mozilla/send/pull/39) Refactor riff (@abhinadduri, @dannycoates)
|
||||
- [#36](https://github.com/mozilla/send/pull/36) added prettier for js formatting (@dannycoates)
|
||||
- [#28](https://github.com/mozilla/send/pull/28) Added a UI for the uploader end, made stylistic changes, implemented deleting (@abhinadduri)
|
||||
- [#25](https://github.com/mozilla/send/pull/25) Changed naming for some pages, no longer stores files by name on server (@abhinadduri)
|
||||
14
CONTRIBUTORS
@@ -2,15 +2,19 @@ Abhinav Adduri
|
||||
Alexander Slovesnik
|
||||
Amin Mahmudian
|
||||
Andreas Pettersson
|
||||
Arash Mousavi
|
||||
Balázs Meskó
|
||||
Belayet Hossain
|
||||
Bjørn I
|
||||
Boopesh Mahendran
|
||||
Chuck Harmston
|
||||
Cláudio Esperança
|
||||
Cynthia Pereira
|
||||
Daniel Thorn
|
||||
Daniela Arcese
|
||||
Danny Coates
|
||||
Emin Mastizada
|
||||
Enol
|
||||
Erica
|
||||
Erica Wright
|
||||
Fjoerfoks
|
||||
@@ -18,9 +22,13 @@ Francesco Lodolo
|
||||
Francesco Lodolo [:flod]
|
||||
Gautam krishna.R
|
||||
Håvar Henriksen
|
||||
Jae Hyeon Park
|
||||
Jakub Rychlý
|
||||
Jamie
|
||||
Jim Spentzos
|
||||
Johann-S
|
||||
John Gruen
|
||||
Jon Vadillo
|
||||
Jordi Serratosa
|
||||
Juraj Cigáň
|
||||
Kohei Yoshino
|
||||
@@ -48,12 +56,14 @@ Rok Žerdin
|
||||
Sahithi
|
||||
Sairam Raavi
|
||||
Sandro
|
||||
Schieck :)
|
||||
Selim Şumlu
|
||||
Slimane Amiri
|
||||
Théo Chevalier
|
||||
Tomáš Zelina
|
||||
Ton
|
||||
Tymur Faradzhev
|
||||
Varghese Thomas
|
||||
Victor Bychek
|
||||
Weihang Lo
|
||||
Wil Clouser
|
||||
@@ -69,10 +79,14 @@ erdem cobanoglu
|
||||
gautamkrishnar
|
||||
goofy
|
||||
hi
|
||||
jesferman1993
|
||||
josotrix
|
||||
kenrick95
|
||||
manxmensch
|
||||
ravmn
|
||||
reza.habibi2008
|
||||
siparon
|
||||
skystar-p
|
||||
xcffl
|
||||
Μιχάλης
|
||||
Марко Костић (Marko Kostić)
|
||||
|
||||
@@ -12,4 +12,4 @@ RUN npm install --production && npm cache clean --force
|
||||
ENV PORT=1443
|
||||
EXPOSE $PORT
|
||||
|
||||
CMD ["npm", "start"]
|
||||
CMD ["npm", "run", "prod"]
|
||||
|
||||
45
README.md
@@ -5,39 +5,66 @@
|
||||
|
||||
**Docs:** [Docker](docs/docker.md), [Metrics](docs/metrics.md)
|
||||
|
||||
---
|
||||
|
||||
## What it does
|
||||
|
||||
A file sharing experiment which allows you to send encrypted files to other users.
|
||||
|
||||
---
|
||||
|
||||
## Requirements
|
||||
|
||||
- [Node.js 8+](https://nodejs.org/)
|
||||
- [Redis server](https://redis.io/)
|
||||
- [Node.js 8.2+](https://nodejs.org/)
|
||||
- [Redis server](https://redis.io/) (optional for development)
|
||||
- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional)
|
||||
|
||||
**NOTE:** To run the project, make sure you have a Redis server running locally:
|
||||
---
|
||||
|
||||
## Development
|
||||
|
||||
To start an ephemeral development server run:
|
||||
|
||||
```sh
|
||||
$ redis-server /usr/local/etc/redis.conf
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
## How to use it
|
||||
Then browse to http://localhost:8080
|
||||
|
||||
---
|
||||
|
||||
## Commands
|
||||
|
||||
| Command | Description |
|
||||
|------------------|-------------|
|
||||
| `npm run dev` | Builds and starts the web server locally for development.
|
||||
| `npm run format` | Formats the frontend and server code using **prettier**.
|
||||
| `npm run lint` | Lints the CSS and JavaScript code.
|
||||
| `npm start` | Starts the Express web server.
|
||||
| `npm test` | Runs the suite of mocha tests.
|
||||
| `npm start` | Runs the server in development configuration.
|
||||
| `npm run build` | Builds the production assets.
|
||||
| `npm run prod` | Runs the server in production configuration.
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
The server is configured with environment variables. See [server/config.js](server/config.js) for all options and [docs/docker.md](docs/docker.md) for examples.
|
||||
|
||||
---
|
||||
|
||||
## Localization
|
||||
|
||||
Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language, or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests are always welcome! Feel free to check out the list of ["good first bugs"](https://github.com/mozilla/send/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+bug%22).
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
| ENVIRONMENT | URL
|
||||
@@ -46,6 +73,10 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs
|
||||
| Stage | <https://send.stage.mozaws.net/>
|
||||
| Development | <https://send.dev.mozaws.net/>
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
[Mozilla Public License Version 2.0](LICENSE)
|
||||
|
||||
---
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
env:
|
||||
browser: true
|
||||
node: false
|
||||
node: true
|
||||
|
||||
parserOptions:
|
||||
sourceType: module
|
||||
24
app/dragManager.js
Normal file
@@ -0,0 +1,24 @@
|
||||
export default function(state, emitter) {
|
||||
emitter.on('DOMContentLoaded', () => {
|
||||
document.body.addEventListener('dragover', event => {
|
||||
if (state.route === '/') {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
document.body.addEventListener('drop', event => {
|
||||
if (state.route === '/' && !state.transfer) {
|
||||
event.preventDefault();
|
||||
document.querySelector('.upload-window').classList.remove('ondrag');
|
||||
const target = event.dataTransfer;
|
||||
if (target.files.length === 0) {
|
||||
return;
|
||||
}
|
||||
if (target.files.length > 1 || target.files[0].size === 0) {
|
||||
return alert(state.translate('uploadPageMultipleFilesAlert'));
|
||||
}
|
||||
const file = target.files[0];
|
||||
emitter.emit('upload', { file, type: 'drop' });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
76
app/experiments.js
Normal file
@@ -0,0 +1,76 @@
|
||||
import hash from 'string-hash';
|
||||
|
||||
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.75 ? 0 : 1;
|
||||
},
|
||||
luckyNumber: function(state) {
|
||||
return luckyNumber(
|
||||
`${this.id}:${state.storage.get('testpilot_ga__cid')}`
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//Returns a number between 0 and 1
|
||||
function luckyNumber(str) {
|
||||
return hash(str) / 0xffffffff;
|
||||
}
|
||||
|
||||
function checkExperiments(state, emitter) {
|
||||
const all = Object.keys(experiments);
|
||||
const id = all.find(id => experiments[id].eligible(state));
|
||||
if (id) {
|
||||
const variant = experiments[id].variant(state);
|
||||
state.storage.enroll(id, variant);
|
||||
experiments[id].run(variant, state, emitter);
|
||||
}
|
||||
}
|
||||
|
||||
export default function initialize(state, emitter) {
|
||||
emitter.on('DOMContentLoaded', () => {
|
||||
const xp = experiments[state.query.x];
|
||||
if (xp) {
|
||||
xp.run(+state.query.v, state, emitter);
|
||||
}
|
||||
});
|
||||
|
||||
if (!state.storage.get('testpilot_ga__cid')) {
|
||||
// first ever visit. check again after cid is assigned.
|
||||
emitter.on('DOMContentLoaded', () => {
|
||||
checkExperiments(state, emitter);
|
||||
});
|
||||
} else {
|
||||
const enrolled = state.storage.enrolled;
|
||||
enrolled.forEach(([id, variant]) => {
|
||||
const xp = experiments[id];
|
||||
if (xp) {
|
||||
xp.run(variant, state, emitter);
|
||||
}
|
||||
});
|
||||
// single experiment per session for now
|
||||
if (enrolled.length === 0) {
|
||||
checkExperiments(state, emitter);
|
||||
}
|
||||
}
|
||||
}
|
||||
217
app/fileManager.js
Normal file
@@ -0,0 +1,217 @@
|
||||
/* global EXPIRE_SECONDS */
|
||||
import FileSender from './fileSender';
|
||||
import FileReceiver from './fileReceiver';
|
||||
import { copyToClipboard, delay, fadeOut, percent } from './utils';
|
||||
import * as metrics from './metrics';
|
||||
|
||||
function saveFile(file) {
|
||||
const dataView = new DataView(file.plaintext);
|
||||
const blob = new Blob([dataView], { type: file.type });
|
||||
const downloadUrl = URL.createObjectURL(blob);
|
||||
|
||||
if (window.navigator.msSaveBlob) {
|
||||
return window.navigator.msSaveBlob(blob, file.name);
|
||||
}
|
||||
const a = document.createElement('a');
|
||||
a.href = downloadUrl;
|
||||
a.download = file.name;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
URL.revokeObjectURL(downloadUrl);
|
||||
}
|
||||
|
||||
function openLinksInNewTab(links, should = true) {
|
||||
links = links || Array.from(document.querySelectorAll('a:not([target])'));
|
||||
if (should) {
|
||||
links.forEach(l => {
|
||||
l.setAttribute('target', '_blank');
|
||||
l.setAttribute('rel', 'noopener noreferrer');
|
||||
});
|
||||
} else {
|
||||
links.forEach(l => {
|
||||
l.removeAttribute('target');
|
||||
l.removeAttribute('rel');
|
||||
});
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
function exists(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
|
||||
resolve(xhr.status === 200);
|
||||
}
|
||||
};
|
||||
xhr.onerror = () => resolve(false);
|
||||
xhr.ontimeout = () => resolve(false);
|
||||
xhr.open('get', '/api/exists/' + id);
|
||||
xhr.timeout = 2000;
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
export default function(state, emitter) {
|
||||
let lastRender = 0;
|
||||
let updateTitle = false;
|
||||
|
||||
function render() {
|
||||
emitter.emit('render');
|
||||
}
|
||||
|
||||
async function checkFiles() {
|
||||
const files = state.storage.files;
|
||||
let rerender = false;
|
||||
for (const file of files) {
|
||||
const ok = await exists(file.id);
|
||||
if (!ok) {
|
||||
state.storage.remove(file.id);
|
||||
rerender = true;
|
||||
}
|
||||
}
|
||||
if (rerender) {
|
||||
render();
|
||||
}
|
||||
}
|
||||
|
||||
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('render', () => {
|
||||
lastRender = Date.now();
|
||||
});
|
||||
|
||||
emitter.on('delete', async ({ file, location }) => {
|
||||
try {
|
||||
metrics.deletedUpload({
|
||||
size: file.size,
|
||||
time: file.time,
|
||||
speed: file.speed,
|
||||
type: file.type,
|
||||
ttl: file.expiresAt - Date.now(),
|
||||
location
|
||||
});
|
||||
state.storage.remove(file.id);
|
||||
await FileSender.delete(file.id, file.deleteToken);
|
||||
} catch (e) {
|
||||
state.raven.captureException(e);
|
||||
}
|
||||
state.fileInfo = null;
|
||||
});
|
||||
|
||||
emitter.on('cancel', () => {
|
||||
state.transfer.cancel();
|
||||
});
|
||||
|
||||
emitter.on('upload', async ({ file, type }) => {
|
||||
const size = file.size;
|
||||
const sender = new FileSender(file);
|
||||
sender.on('progress', updateProgress);
|
||||
sender.on('encrypting', render);
|
||||
state.transfer = sender;
|
||||
render();
|
||||
const links = openLinksInNewTab();
|
||||
await delay(200);
|
||||
try {
|
||||
const start = Date.now();
|
||||
metrics.startedUpload({ size, type });
|
||||
const info = await sender.upload();
|
||||
const time = Date.now() - start;
|
||||
const speed = size / (time / 1000);
|
||||
metrics.completedUpload({ size, time, speed, type });
|
||||
await delay(1000);
|
||||
await fadeOut('upload-progress');
|
||||
info.name = file.name;
|
||||
info.size = size;
|
||||
info.type = type;
|
||||
info.time = time;
|
||||
info.speed = speed;
|
||||
info.createdAt = Date.now();
|
||||
info.url = `${info.url}#${info.secretKey}`;
|
||||
info.expiresAt = Date.now() + EXPIRE_SECONDS * 1000;
|
||||
state.fileInfo = info;
|
||||
state.storage.addFile(state.fileInfo);
|
||||
openLinksInNewTab(links, false);
|
||||
state.transfer = null;
|
||||
state.storage.totalUploads += 1;
|
||||
emitter.emit('pushState', `/share/${info.id}`);
|
||||
} catch (err) {
|
||||
state.transfer = null;
|
||||
if (err.message === '0') {
|
||||
//cancelled. do nothing
|
||||
metrics.cancelledUpload({ size, type });
|
||||
return render();
|
||||
}
|
||||
state.raven.captureException(err);
|
||||
metrics.stoppedUpload({ size, type, err });
|
||||
emitter.emit('replaceState', '/error');
|
||||
}
|
||||
});
|
||||
|
||||
emitter.on('download', async file => {
|
||||
const size = file.size;
|
||||
const url = `/api/download/${file.id}`;
|
||||
const receiver = new FileReceiver(url, file.key);
|
||||
receiver.on('progress', updateProgress);
|
||||
receiver.on('decrypting', render);
|
||||
state.transfer = receiver;
|
||||
const links = openLinksInNewTab();
|
||||
render();
|
||||
try {
|
||||
const start = Date.now();
|
||||
metrics.startedDownload({ size: file.size, ttl: file.ttl });
|
||||
const f = await receiver.download();
|
||||
const time = Date.now() - start;
|
||||
const speed = size / (time / 1000);
|
||||
await delay(1000);
|
||||
await fadeOut('download-progress');
|
||||
saveFile(f);
|
||||
state.storage.totalDownloads += 1;
|
||||
metrics.completedDownload({ size, time, speed });
|
||||
emitter.emit('pushState', '/completed');
|
||||
} catch (err) {
|
||||
// TODO cancelled download
|
||||
const location = err.message === 'notfound' ? '/404' : '/error';
|
||||
if (location === '/error') {
|
||||
state.raven.captureException(err);
|
||||
metrics.stoppedDownload({ size, err });
|
||||
}
|
||||
emitter.emit('replaceState', location);
|
||||
} finally {
|
||||
state.transfer = null;
|
||||
openLinksInNewTab(links, false);
|
||||
}
|
||||
});
|
||||
|
||||
emitter.on('copy', ({ url, location }) => {
|
||||
copyToClipboard(url);
|
||||
metrics.copiedLink({ location });
|
||||
});
|
||||
|
||||
setInterval(() => {
|
||||
// poll for rerendering the file list countdown timers
|
||||
if (
|
||||
state.route === '/' &&
|
||||
state.storage.files.length > 0 &&
|
||||
Date.now() - lastRender > 30000
|
||||
) {
|
||||
render();
|
||||
}
|
||||
}, 60000);
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import EventEmitter from 'events';
|
||||
import { hexToArray } from './utils';
|
||||
import Nanobus from 'nanobus';
|
||||
import { hexToArray, bytes } from './utils';
|
||||
|
||||
export default class FileReceiver extends EventEmitter {
|
||||
export default class FileReceiver extends Nanobus {
|
||||
constructor(url, k) {
|
||||
super();
|
||||
super('FileReceiver');
|
||||
this.key = window.crypto.subtle.importKey(
|
||||
'jwk',
|
||||
{
|
||||
@@ -19,6 +19,23 @@ export default class FileReceiver extends EventEmitter {
|
||||
['decrypt']
|
||||
);
|
||||
this.url = url;
|
||||
this.msg = 'fileSizeProgress';
|
||||
this.progress = [0, 1];
|
||||
}
|
||||
|
||||
get progressRatio() {
|
||||
return this.progress[0] / this.progress[1];
|
||||
}
|
||||
|
||||
get sizes() {
|
||||
return {
|
||||
partialSize: bytes(this.progress[0]),
|
||||
totalSize: bytes(this.progress[1])
|
||||
};
|
||||
}
|
||||
|
||||
cancel() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
downloadFile() {
|
||||
@@ -27,7 +44,8 @@ export default class FileReceiver extends EventEmitter {
|
||||
|
||||
xhr.onprogress = event => {
|
||||
if (event.lengthComputable && event.target.status !== 404) {
|
||||
this.emit('progress', [event.loaded, event.total]);
|
||||
this.progress = [event.loaded, event.total];
|
||||
this.emit('progress', this.progress);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -61,6 +79,7 @@ export default class FileReceiver extends EventEmitter {
|
||||
async download() {
|
||||
const key = await this.key;
|
||||
const file = await this.downloadFile();
|
||||
this.msg = 'decryptingFile';
|
||||
this.emit('decrypting');
|
||||
const plaintext = await window.crypto.subtle.decrypt(
|
||||
{
|
||||
@@ -71,6 +90,7 @@ export default class FileReceiver extends EventEmitter {
|
||||
key,
|
||||
file.data
|
||||
);
|
||||
this.msg = 'downloadFinish';
|
||||
return {
|
||||
plaintext,
|
||||
name: decodeURIComponent(file.name),
|
||||
@@ -1,10 +1,13 @@
|
||||
import EventEmitter from 'events';
|
||||
import { arrayToHex } from './utils';
|
||||
import Nanobus from 'nanobus';
|
||||
import { arrayToHex, bytes } from './utils';
|
||||
|
||||
export default class FileSender extends EventEmitter {
|
||||
export default class FileSender extends Nanobus {
|
||||
constructor(file) {
|
||||
super();
|
||||
super('FileSender');
|
||||
this.file = file;
|
||||
this.msg = 'importingFile';
|
||||
this.progress = [0, 1];
|
||||
this.cancelled = false;
|
||||
this.iv = window.crypto.getRandomValues(new Uint8Array(12));
|
||||
this.uploadXHR = new XMLHttpRequest();
|
||||
this.key = window.crypto.subtle.generateKey(
|
||||
@@ -17,13 +20,13 @@ export default class FileSender extends EventEmitter {
|
||||
);
|
||||
}
|
||||
|
||||
static delete(fileId, token) {
|
||||
static delete(id, token) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!fileId || !token) {
|
||||
if (!id || !token) {
|
||||
return reject();
|
||||
}
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('post', '/delete/' + fileId, true);
|
||||
xhr.open('POST', `/api/delete/${id}`);
|
||||
xhr.setRequestHeader('Content-Type', 'application/json');
|
||||
|
||||
xhr.onreadystatechange = () => {
|
||||
@@ -36,8 +39,22 @@ export default class FileSender extends EventEmitter {
|
||||
});
|
||||
}
|
||||
|
||||
get progressRatio() {
|
||||
return this.progress[0] / this.progress[1];
|
||||
}
|
||||
|
||||
get sizes() {
|
||||
return {
|
||||
partialSize: bytes(this.progress[0]),
|
||||
totalSize: bytes(this.progress[1])
|
||||
};
|
||||
}
|
||||
|
||||
cancel() {
|
||||
this.uploadXHR.abort();
|
||||
this.cancelled = true;
|
||||
if (this.msg === 'fileSizeProgress') {
|
||||
this.uploadXHR.abort();
|
||||
}
|
||||
}
|
||||
|
||||
readFile() {
|
||||
@@ -57,7 +74,7 @@ export default class FileSender extends EventEmitter {
|
||||
uploadFile(encrypted, keydata) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const file = this.file;
|
||||
const fileId = arrayToHex(this.iv);
|
||||
const id = arrayToHex(this.iv);
|
||||
const dataView = new DataView(encrypted);
|
||||
const blob = new Blob([dataView], { type: file.type });
|
||||
const fd = new FormData();
|
||||
@@ -67,41 +84,49 @@ export default class FileSender extends EventEmitter {
|
||||
|
||||
xhr.upload.addEventListener('progress', e => {
|
||||
if (e.lengthComputable) {
|
||||
this.emit('progress', [e.loaded, e.total]);
|
||||
this.progress = [e.loaded, e.total];
|
||||
this.emit('progress', this.progress);
|
||||
}
|
||||
});
|
||||
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||
if (xhr.status === 200) {
|
||||
this.progress = [1, 1];
|
||||
this.msg = 'notifyUploadDone';
|
||||
const responseObj = JSON.parse(xhr.responseText);
|
||||
return resolve({
|
||||
url: responseObj.url,
|
||||
fileId: responseObj.id,
|
||||
id: responseObj.id,
|
||||
secretKey: keydata.k,
|
||||
deleteToken: responseObj.delete
|
||||
});
|
||||
}
|
||||
reject(xhr.status);
|
||||
this.msg = 'errorPageHeader';
|
||||
reject(new Error(xhr.status));
|
||||
}
|
||||
};
|
||||
|
||||
xhr.open('post', '/upload', true);
|
||||
xhr.open('post', '/api/upload', true);
|
||||
xhr.setRequestHeader(
|
||||
'X-File-Metadata',
|
||||
JSON.stringify({
|
||||
id: fileId,
|
||||
id: id,
|
||||
filename: encodeURIComponent(file.name)
|
||||
})
|
||||
);
|
||||
xhr.send(fd);
|
||||
this.msg = 'fileSizeProgress';
|
||||
});
|
||||
}
|
||||
|
||||
async upload() {
|
||||
this.emit('loading');
|
||||
const key = await this.key;
|
||||
const plaintext = await this.readFile();
|
||||
if (this.cancelled) {
|
||||
throw new Error(0);
|
||||
}
|
||||
this.msg = 'encryptingFile';
|
||||
this.emit('encrypting');
|
||||
const encrypted = await window.crypto.subtle.encrypt(
|
||||
{
|
||||
@@ -112,6 +137,9 @@ export default class FileSender extends EventEmitter {
|
||||
key,
|
||||
plaintext
|
||||
);
|
||||
if (this.cancelled) {
|
||||
throw new Error(0);
|
||||
}
|
||||
const keydata = await window.crypto.subtle.exportKey('jwk', key);
|
||||
return this.uploadFile(encrypted, keydata);
|
||||
}
|
||||
51
app/main.js
Normal file
@@ -0,0 +1,51 @@
|
||||
import app from './routes';
|
||||
import log from 'choo-log';
|
||||
import locale from '../common/locales';
|
||||
import fileManager from './fileManager';
|
||||
import dragManager from './dragManager';
|
||||
import { canHasSend } from './utils';
|
||||
import assets from '../common/assets';
|
||||
import storage from './storage';
|
||||
import metrics from './metrics';
|
||||
import experiments from './experiments';
|
||||
import Raven from 'raven-js';
|
||||
|
||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
||||
}
|
||||
|
||||
app.use(log());
|
||||
|
||||
app.use((state, emitter) => {
|
||||
// init state
|
||||
state.transfer = null;
|
||||
state.fileInfo = null;
|
||||
state.translate = locale.getTranslator();
|
||||
state.storage = storage;
|
||||
state.raven = Raven;
|
||||
state.config = {
|
||||
uploadWindowStyle: 'upload-window',
|
||||
uploadButtonStyle: 'browse btn'
|
||||
};
|
||||
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'));
|
||||
if (!ok) {
|
||||
const reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm';
|
||||
emitter.emit('replaceState', `/unsupported/${reason}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.use(metrics);
|
||||
app.use(fileManager);
|
||||
app.use(dragManager);
|
||||
app.use(experiments);
|
||||
|
||||
app.mount('#page-one');
|
||||
@@ -1,12 +1,11 @@
|
||||
import testPilotGA from 'testpilot-ga/src/TestPilotGA';
|
||||
import Storage from './storage';
|
||||
const storage = new Storage();
|
||||
import storage from './storage';
|
||||
|
||||
let hasLocalStorage = false;
|
||||
try {
|
||||
hasLocalStorage = !!localStorage;
|
||||
hasLocalStorage = typeof localStorage !== 'undefined';
|
||||
} catch (e) {
|
||||
// don't care
|
||||
// when disabled, any mention of localStorage throws an error
|
||||
}
|
||||
|
||||
const analytics = new testPilotGA({
|
||||
@@ -15,19 +14,45 @@ const analytics = new testPilotGA({
|
||||
tid: window.GOOGLE_ANALYTICS_ID
|
||||
});
|
||||
|
||||
const category = location.pathname.includes('/download')
|
||||
? 'recipient'
|
||||
: 'sender';
|
||||
let appState = null;
|
||||
let experiment = null;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
addExitHandlers();
|
||||
addRestartHandlers();
|
||||
});
|
||||
export default function initialize(state, emitter) {
|
||||
appState = state;
|
||||
emitter.on('DOMContentLoaded', () => {
|
||||
addExitHandlers();
|
||||
experiment = storage.enrolled[0];
|
||||
sendEvent(category(), 'visit', {
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads
|
||||
});
|
||||
//TODO restart handlers... somewhere
|
||||
});
|
||||
}
|
||||
|
||||
function category() {
|
||||
switch (appState.route) {
|
||||
case '/':
|
||||
case '/share/:id':
|
||||
return 'sender';
|
||||
case '/download/:id/:key':
|
||||
case '/download/:id':
|
||||
case '/completed':
|
||||
return 'recipient';
|
||||
default:
|
||||
return 'other';
|
||||
}
|
||||
}
|
||||
|
||||
function sendEvent() {
|
||||
const args = Array.from(arguments);
|
||||
if (experiment && args[2]) {
|
||||
args[2].xid = experiment[0];
|
||||
args[2].xvar = experiment[1];
|
||||
}
|
||||
return (
|
||||
hasLocalStorage &&
|
||||
analytics.sendEvent.apply(analytics, arguments).catch(() => 0)
|
||||
hasLocalStorage && analytics.sendEvent.apply(analytics, args).catch(() => 0)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -62,11 +87,11 @@ function urlToMetric(url) {
|
||||
}
|
||||
|
||||
function setReferrer(state) {
|
||||
if (category === 'sender') {
|
||||
if (category() === 'sender') {
|
||||
if (state) {
|
||||
storage.referrer = `${state}-upload`;
|
||||
}
|
||||
} else if (category === 'recipient') {
|
||||
} else if (category() === 'recipient') {
|
||||
if (state) {
|
||||
storage.referrer = `${state}-download`;
|
||||
}
|
||||
@@ -87,10 +112,10 @@ function takeReferrer() {
|
||||
}
|
||||
|
||||
function startedUpload(params) {
|
||||
return sendEvent(category, 'upload-started', {
|
||||
return sendEvent('sender', 'upload-started', {
|
||||
cm1: params.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles + 1,
|
||||
cm6: storage.files.length + 1,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: params.type,
|
||||
cd5: takeReferrer()
|
||||
@@ -99,10 +124,10 @@ function startedUpload(params) {
|
||||
|
||||
function cancelledUpload(params) {
|
||||
setReferrer('cancelled');
|
||||
return sendEvent(category, 'upload-stopped', {
|
||||
return sendEvent('sender', 'upload-stopped', {
|
||||
cm1: params.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: params.type,
|
||||
cd2: 'cancelled'
|
||||
@@ -110,12 +135,12 @@ function cancelledUpload(params) {
|
||||
}
|
||||
|
||||
function completedUpload(params) {
|
||||
return sendEvent(category, 'upload-stopped', {
|
||||
return sendEvent('sender', 'upload-stopped', {
|
||||
cm1: params.size,
|
||||
cm2: params.time,
|
||||
cm3: params.speed,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: params.type,
|
||||
cd2: 'completed'
|
||||
@@ -123,20 +148,20 @@ function completedUpload(params) {
|
||||
}
|
||||
|
||||
function startedDownload(params) {
|
||||
return sendEvent(category, 'download-started', {
|
||||
return sendEvent('recipient', 'download-started', {
|
||||
cm1: params.size,
|
||||
cm4: params.ttl,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads
|
||||
});
|
||||
}
|
||||
|
||||
function stoppedDownload(params) {
|
||||
return sendEvent(category, 'download-stopped', {
|
||||
return sendEvent('recipient', 'download-stopped', {
|
||||
cm1: params.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'errored',
|
||||
cd6: params.err
|
||||
@@ -145,20 +170,20 @@ function stoppedDownload(params) {
|
||||
|
||||
function cancelledDownload(params) {
|
||||
setReferrer('cancelled');
|
||||
return sendEvent(category, 'download-stopped', {
|
||||
return sendEvent('recipient', 'download-stopped', {
|
||||
cm1: params.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'cancelled'
|
||||
});
|
||||
}
|
||||
|
||||
function stoppedUpload(params) {
|
||||
return sendEvent(category, 'upload-stopped', {
|
||||
return sendEvent('sender', 'upload-stopped', {
|
||||
cm1: params.size,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: params.type,
|
||||
cd2: 'errored',
|
||||
@@ -167,25 +192,25 @@ function stoppedUpload(params) {
|
||||
}
|
||||
|
||||
function completedDownload(params) {
|
||||
return sendEvent(category, 'download-stopped', {
|
||||
return sendEvent('recipient', 'download-stopped', {
|
||||
cm1: params.size,
|
||||
cm2: params.time,
|
||||
cm3: params.speed,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd2: 'completed'
|
||||
});
|
||||
}
|
||||
|
||||
function deletedUpload(params) {
|
||||
return sendEvent(category, 'upload-deleted', {
|
||||
return sendEvent(category(), 'upload-deleted', {
|
||||
cm1: params.size,
|
||||
cm2: params.time,
|
||||
cm3: params.speed,
|
||||
cm4: params.ttl,
|
||||
cm5: storage.totalUploads,
|
||||
cm6: storage.numFiles,
|
||||
cm6: storage.files.length,
|
||||
cm7: storage.totalDownloads,
|
||||
cd1: params.type,
|
||||
cd4: params.location
|
||||
@@ -193,19 +218,19 @@ function deletedUpload(params) {
|
||||
}
|
||||
|
||||
function unsupported(params) {
|
||||
return sendEvent(category, 'unsupported', {
|
||||
return sendEvent(category(), 'unsupported', {
|
||||
cd6: params.err
|
||||
});
|
||||
}
|
||||
|
||||
function copiedLink(params) {
|
||||
return sendEvent(category, 'copied', {
|
||||
return sendEvent('sender', 'copied', {
|
||||
cd4: params.location
|
||||
});
|
||||
}
|
||||
|
||||
function exitEvent(target) {
|
||||
return sendEvent(category, 'exited', {
|
||||
return sendEvent(category(), 'exited', {
|
||||
cd3: urlToMetric(target.currentTarget.href)
|
||||
});
|
||||
}
|
||||
@@ -219,21 +244,13 @@ function addExitHandlers() {
|
||||
});
|
||||
}
|
||||
|
||||
function restartEvent(state) {
|
||||
function restart(state) {
|
||||
setReferrer(state);
|
||||
return sendEvent(category, 'restarted', {
|
||||
return sendEvent(category(), 'restarted', {
|
||||
cd2: state
|
||||
});
|
||||
}
|
||||
|
||||
function addRestartHandlers() {
|
||||
const elements = Array.from(document.querySelectorAll('.send-new'));
|
||||
elements.forEach(el => {
|
||||
const state = el.getAttribute('data-state');
|
||||
el.addEventListener('click', restartEvent.bind(null, state));
|
||||
});
|
||||
}
|
||||
|
||||
export {
|
||||
copiedLink,
|
||||
startedUpload,
|
||||
@@ -245,5 +262,6 @@ export {
|
||||
cancelledDownload,
|
||||
stoppedDownload,
|
||||
completedDownload,
|
||||
restart,
|
||||
unsupported
|
||||
};
|
||||
9
app/routes/download.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const preview = require('../templates/preview');
|
||||
const download = require('../templates/download');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
if (state.transfer) {
|
||||
return download(state, emit);
|
||||
}
|
||||
return preview(state, emit);
|
||||
};
|
||||
9
app/routes/home.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const welcome = require('../templates/welcome');
|
||||
const upload = require('../templates/upload');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
if (state.transfer) {
|
||||
return upload(state, emit);
|
||||
}
|
||||
return welcome(state, emit);
|
||||
};
|
||||
17
app/routes/index.js
Normal file
@@ -0,0 +1,17 @@
|
||||
const choo = require('choo');
|
||||
const download = require('./download');
|
||||
|
||||
const app = choo();
|
||||
|
||||
app.route('/', require('./home'));
|
||||
app.route('/share/:id', require('../templates/share'));
|
||||
app.route('/download/:id', download);
|
||||
app.route('/download/:id/:key', download);
|
||||
app.route('/completed', require('../templates/completed'));
|
||||
app.route('/unsupported/:reason', require('../templates/unsupported'));
|
||||
app.route('/legal', require('../templates/legal'));
|
||||
app.route('/error', require('../templates/error'));
|
||||
app.route('/blank', require('../templates/blank'));
|
||||
app.route('*', require('../templates/notFound'));
|
||||
|
||||
module.exports = app;
|
||||
@@ -26,13 +26,34 @@ class Mem {
|
||||
}
|
||||
}
|
||||
|
||||
export default class Storage {
|
||||
class Storage {
|
||||
constructor() {
|
||||
try {
|
||||
this.engine = localStorage || new Mem();
|
||||
} catch (e) {
|
||||
this.engine = new Mem();
|
||||
}
|
||||
this._files = this.loadFiles();
|
||||
}
|
||||
|
||||
loadFiles() {
|
||||
const fs = [];
|
||||
for (let i = 0; i < this.engine.length; i++) {
|
||||
const k = this.engine.key(i);
|
||||
if (isFile(k)) {
|
||||
try {
|
||||
const f = JSON.parse(this.engine.getItem(k));
|
||||
if (!f.id) {
|
||||
f.id = f.fileId;
|
||||
}
|
||||
fs.push(f);
|
||||
} catch (err) {
|
||||
// obviously you're not a golfer
|
||||
this.engine.removeItem(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
return fs.sort((a, b) => a.createdAt - b.createdAt);
|
||||
}
|
||||
|
||||
get totalDownloads() {
|
||||
@@ -53,36 +74,21 @@ export default class Storage {
|
||||
set referrer(str) {
|
||||
this.engine.setItem('referrer', str);
|
||||
}
|
||||
|
||||
get files() {
|
||||
const fs = [];
|
||||
for (let i = 0; i < this.engine.length; i++) {
|
||||
const k = this.engine.key(i);
|
||||
if (isFile(k)) {
|
||||
try {
|
||||
fs.push(JSON.parse(this.engine.getItem(k)));
|
||||
} catch (err) {
|
||||
// obviously you're not a golfer
|
||||
this.engine.removeItem(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
return fs.sort((file1, file2) => {
|
||||
const creationDate1 = new Date(file1.creationDate);
|
||||
const creationDate2 = new Date(file2.creationDate);
|
||||
return creationDate1 - creationDate2;
|
||||
});
|
||||
get enrolled() {
|
||||
return JSON.parse(this.engine.getItem('experiments') || '[]');
|
||||
}
|
||||
|
||||
get numFiles() {
|
||||
let length = 0;
|
||||
for (let i = 0; i < this.engine.length; i++) {
|
||||
const k = this.engine.key(i);
|
||||
if (isFile(k)) {
|
||||
length += 1;
|
||||
}
|
||||
enroll(id, variant) {
|
||||
const enrolled = this.enrolled;
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
if (!enrolled.find(([i, v]) => i === id)) {
|
||||
enrolled.push([id, variant]);
|
||||
this.engine.setItem('experiments', JSON.stringify(enrolled));
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
get files() {
|
||||
return this._files;
|
||||
}
|
||||
|
||||
getFileById(id) {
|
||||
@@ -93,11 +99,21 @@ export default class Storage {
|
||||
}
|
||||
}
|
||||
|
||||
get(id) {
|
||||
return this.engine.getItem(id);
|
||||
}
|
||||
|
||||
remove(property) {
|
||||
if (isFile(property)) {
|
||||
this._files.splice(this._files.findIndex(f => f.id === property), 1);
|
||||
}
|
||||
this.engine.removeItem(property);
|
||||
}
|
||||
|
||||
addFile(id, file) {
|
||||
this.engine.setItem(id, JSON.stringify(file));
|
||||
addFile(file) {
|
||||
this._files.push(file);
|
||||
this.engine.setItem(file.id, JSON.stringify(file));
|
||||
}
|
||||
}
|
||||
|
||||
export default new Storage();
|
||||
9
app/templates/blank.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const html = require('choo/html');
|
||||
|
||||
module.exports = function(state) {
|
||||
const div = html`<div id="page-one"></div>`;
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
31
app/templates/completed.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const html = require('choo/html');
|
||||
const progress = require('./progress');
|
||||
const { fadeOut } = require('../utils');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
const div = html`
|
||||
<div id="download" class="fadeIn">
|
||||
<div id="download-progress">
|
||||
<div id="dl-title" class="title">${state.translate(
|
||||
'downloadFinish'
|
||||
)}</div>
|
||||
<div class="description"></div>
|
||||
${progress(1)}
|
||||
<div class="upload">
|
||||
<div class="progress-text"></div>
|
||||
</div>
|
||||
</div>
|
||||
<a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate(
|
||||
'sendYourFilesLink'
|
||||
)}</a>
|
||||
</div>
|
||||
`;
|
||||
|
||||
async function sendNew(e) {
|
||||
e.preventDefault();
|
||||
await fadeOut('download');
|
||||
emit('pushState', '/');
|
||||
}
|
||||
|
||||
return div;
|
||||
};
|
||||
28
app/templates/download.js
Normal file
@@ -0,0 +1,28 @@
|
||||
const html = require('choo/html');
|
||||
const progress = require('./progress');
|
||||
const { bytes } = require('../utils');
|
||||
|
||||
module.exports = function(state) {
|
||||
const transfer = state.transfer;
|
||||
const div = html`
|
||||
<div id="download-progress" class="fadeIn">
|
||||
<div id="dl-title" class="title">${state.translate(
|
||||
'downloadingPageProgress',
|
||||
{
|
||||
filename: state.fileInfo.name,
|
||||
size: bytes(state.fileInfo.size)
|
||||
}
|
||||
)}</div>
|
||||
<div class="description">${state.translate('downloadingPageMessage')}</div>
|
||||
${progress(transfer.progressRatio)}
|
||||
<div class="upload">
|
||||
<div class="progress-text">${state.translate(
|
||||
transfer.msg,
|
||||
transfer.sizes
|
||||
)}</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
return div;
|
||||
};
|
||||
10
app/templates/error.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
|
||||
module.exports = function(state) {
|
||||
return html`
|
||||
<div id="upload-error">
|
||||
<div class="title">${state.translate('errorPageHeader')}</div>
|
||||
<img id="upload-error-img" src="${assets.get('illustration_error.svg')}"/>
|
||||
</div>`;
|
||||
};
|
||||
84
app/templates/file.js
Normal file
@@ -0,0 +1,84 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
|
||||
function timeLeft(milliseconds) {
|
||||
const minutes = Math.floor(milliseconds / 1000 / 60);
|
||||
const hours = Math.floor(minutes / 60);
|
||||
const seconds = Math.floor((milliseconds / 1000) % 60);
|
||||
if (hours >= 1) {
|
||||
return `${hours}h ${minutes % 60}m`;
|
||||
} else if (hours === 0) {
|
||||
return `${minutes}m ${seconds}s`;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
module.exports = function(file, state, emit) {
|
||||
const ttl = file.expiresAt - Date.now();
|
||||
const remaining = timeLeft(ttl) || state.translate('linkExpiredAlt');
|
||||
const row = html`
|
||||
<tr id="${file.id}">
|
||||
<td class="overflow-col" title="${file.name}">${file.name}</td>
|
||||
<td class="center-col">
|
||||
<img onclick=${copyClick} src="${assets.get(
|
||||
'copy-16.svg'
|
||||
)}" class="icon-copy" title="${state.translate('copyUrlHover')}">
|
||||
<span class="text-copied" hidden="true">${state.translate(
|
||||
'copiedUrl'
|
||||
)}</span>
|
||||
</td>
|
||||
<td>${remaining}</td>
|
||||
<td class="center-col">
|
||||
<img onclick=${showPopup} src="${assets.get(
|
||||
'close-16.svg'
|
||||
)}" class="icon-delete" title="${state.translate('deleteButtonHover')}">
|
||||
<div class="popup">
|
||||
<div class="popuptext" onblur=${cancel} tabindex="-1">
|
||||
<div class="popup-message">${state.translate('deletePopupText')}</div>
|
||||
<div class="popup-action">
|
||||
<span class="popup-no" onclick=${cancel}>${state.translate(
|
||||
'deletePopupCancel'
|
||||
)}</span>
|
||||
<span class="popup-yes" onclick=${deleteFile}>${state.translate(
|
||||
'deletePopupYes'
|
||||
)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
function copyClick(e) {
|
||||
emit('copy', { url: file.url, location: 'upload-list' });
|
||||
const icon = e.target;
|
||||
const text = e.target.nextSibling;
|
||||
icon.hidden = true;
|
||||
text.hidden = false;
|
||||
setTimeout(() => {
|
||||
icon.hidden = false;
|
||||
text.hidden = true;
|
||||
}, 500);
|
||||
}
|
||||
|
||||
function showPopup() {
|
||||
const tr = document.getElementById(file.id);
|
||||
const popup = tr.querySelector('.popuptext');
|
||||
popup.classList.add('show');
|
||||
popup.focus();
|
||||
}
|
||||
|
||||
function cancel(e) {
|
||||
e.stopPropagation();
|
||||
const tr = document.getElementById(file.id);
|
||||
const popup = tr.querySelector('.popuptext');
|
||||
popup.classList.remove('show');
|
||||
}
|
||||
|
||||
function deleteFile() {
|
||||
emit('delete', { file, location: 'upload-list' });
|
||||
emit('render');
|
||||
}
|
||||
|
||||
return row;
|
||||
};
|
||||
32
app/templates/fileList.js
Normal file
@@ -0,0 +1,32 @@
|
||||
const html = require('choo/html');
|
||||
const file = require('./file');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
let table = '';
|
||||
if (state.storage.files.length) {
|
||||
table = html`
|
||||
<table id="uploaded-files">
|
||||
<thead>
|
||||
<tr>
|
||||
<th id="uploaded-file">${state.translate('uploadedFile')}</th>
|
||||
<th id="copy-file-list" class="center-col">${state.translate(
|
||||
'copyFileList'
|
||||
)}</th>
|
||||
<th id="expiry-file-list">${state.translate('expiryFileList')}</th>
|
||||
<th id="delete-file-list" class="center-col">${state.translate(
|
||||
'deleteFileList'
|
||||
)}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
${state.storage.files.map(f => file(f, state, emit))}
|
||||
</tbody>
|
||||
</table>
|
||||
`;
|
||||
}
|
||||
return html`
|
||||
<div id="file-list">
|
||||
${table}
|
||||
</div>
|
||||
`;
|
||||
};
|
||||
38
app/templates/legal.js
Normal file
@@ -0,0 +1,38 @@
|
||||
const html = require('choo/html');
|
||||
|
||||
function replaceLinks(str, urls) {
|
||||
let i = -1;
|
||||
const s = str.replace(/<a>([^<]+)<\/a>/g, (m, v) => {
|
||||
i++;
|
||||
return `<a href="${urls[i]}">${v}</a>`;
|
||||
});
|
||||
return [`<div class="description">${s}</div>`];
|
||||
}
|
||||
|
||||
module.exports = function(state) {
|
||||
const div = html`
|
||||
<div id="page-one">
|
||||
<div id="legal">
|
||||
<div class="title">${state.translate('legalHeader')}</div>
|
||||
${html(
|
||||
replaceLinks(state.translate('legalNoticeTestPilot'), [
|
||||
'https://testpilot.firefox.com/terms',
|
||||
'https://testpilot.firefox.com/privacy',
|
||||
'https://testpilot.firefox.com/experiments/send'
|
||||
])
|
||||
)}
|
||||
${html(
|
||||
replaceLinks(state.translate('legalNoticeMozilla'), [
|
||||
'https://www.mozilla.org/privacy/websites/',
|
||||
'https://www.mozilla.org/about/legal/terms/mozilla/'
|
||||
])
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
25
app/templates/notFound.js
Normal file
@@ -0,0 +1,25 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
|
||||
module.exports = function(state) {
|
||||
const div = html`
|
||||
<div id="page-one">
|
||||
<div id="download">
|
||||
<div class="title">${state.translate('expiredPageHeader')}</div>
|
||||
<div class="share-window">
|
||||
<img src="${assets.get('illustration_expired.svg')}" id="expired-img">
|
||||
</div>
|
||||
<div class="expired-description">${state.translate(
|
||||
'uploadPageExplainer'
|
||||
)}</div>
|
||||
<a class="send-new" href="/" data-state="notfound">${state.translate(
|
||||
'sendYourFilesLink'
|
||||
)}</a>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
70
app/templates/preview.js
Normal file
@@ -0,0 +1,70 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
const notFound = require('./notFound');
|
||||
const { bytes } = require('../utils');
|
||||
|
||||
function getFileFromDOM() {
|
||||
const el = document.getElementById('dl-file');
|
||||
if (!el) {
|
||||
return null;
|
||||
}
|
||||
const data = el.dataset;
|
||||
return {
|
||||
name: data.name,
|
||||
size: parseInt(data.size, 10),
|
||||
ttl: parseInt(data.ttl, 10)
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
state.fileInfo = state.fileInfo || getFileFromDOM();
|
||||
if (!state.fileInfo) {
|
||||
return notFound(state, emit);
|
||||
}
|
||||
state.fileInfo.id = state.params.id;
|
||||
state.fileInfo.key = state.params.key;
|
||||
const fileInfo = state.fileInfo;
|
||||
const size = bytes(fileInfo.size);
|
||||
const div = html`
|
||||
<div id="page-one">
|
||||
<div id="download">
|
||||
<div id="download-page-one">
|
||||
<div class="title">
|
||||
<span id="dl-file"
|
||||
data-name="${fileInfo.name}"
|
||||
data-size="${fileInfo.size}"
|
||||
data-ttl="${fileInfo.ttl}">${state.translate('downloadFileName', {
|
||||
filename: fileInfo.name
|
||||
})}</span>
|
||||
<span id="dl-filesize">${' ' +
|
||||
state.translate('downloadFileSize', { size })}</span>
|
||||
</div>
|
||||
<div class="description">${state.translate('downloadMessage')}</div>
|
||||
<img
|
||||
src="${assets.get('illustration_download.svg')}"
|
||||
id="download-img"
|
||||
alt="${state.translate('downloadAltText')}"/>
|
||||
<div>
|
||||
<button
|
||||
id="download-btn"
|
||||
class="btn"
|
||||
title="${state.translate('downloadButtonLabel')}"
|
||||
onclick=${download}>${state.translate(
|
||||
'downloadButtonLabel'
|
||||
)}</button>
|
||||
</div>
|
||||
</div>
|
||||
<a class="send-new" href="/">${state.translate('sendYourFilesLink')}</a>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
function download(event) {
|
||||
event.preventDefault();
|
||||
emit('download', fileInfo);
|
||||
}
|
||||
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
21
app/templates/progress.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const html = require('choo/html');
|
||||
|
||||
const radius = 73;
|
||||
const oRadius = radius + 10;
|
||||
const oDiameter = oRadius * 2;
|
||||
const circumference = 2 * Math.PI * radius;
|
||||
|
||||
module.exports = function(progressRatio) {
|
||||
const dashOffset = (1 - progressRatio) * circumference;
|
||||
const percent = Math.floor(progressRatio * 100);
|
||||
const div = html`
|
||||
<div class="progress-bar">
|
||||
<svg id="progress" width="${oDiameter}" height="${oDiameter}" viewPort="0 0 ${oDiameter} ${oDiameter}" version="1.1">
|
||||
<circle r="${radius}" cx="${oRadius}" cy="${oRadius}" fill="transparent"/>
|
||||
<circle id="bar" r="${radius}" cx="${oRadius}" cy="${oRadius}" fill="transparent" transform="rotate(-90 ${oRadius} ${oRadius})" stroke-dasharray="${circumference}" stroke-dashoffset="${dashOffset}"/>
|
||||
<text class="percentage" text-anchor="middle" x="50%" y="98"><tspan class="percent-number">${percent}</tspan><tspan class="percent-sign">%</tspan></text>
|
||||
</svg>
|
||||
</div>
|
||||
`;
|
||||
return div;
|
||||
};
|
||||
64
app/templates/share.js
Normal file
@@ -0,0 +1,64 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
const notFound = require('./notFound');
|
||||
const { allowedCopy, delay, fadeOut } = require('../utils');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
const file = state.storage.getFileById(state.params.id);
|
||||
if (!file) {
|
||||
return notFound(state, emit);
|
||||
}
|
||||
const div = html`
|
||||
<div id="share-link" class="fadeIn">
|
||||
<div class="title">${state.translate('uploadSuccessTimingHeader')}</div>
|
||||
<div id="share-window">
|
||||
<div id="copy-text">${state.translate('copyUrlFormLabelWithName', {
|
||||
filename: file.name
|
||||
})}</div>
|
||||
<div id="copy">
|
||||
<input id="link" type="url" value="${file.url}" readonly="true"/>
|
||||
<button id="copy-btn" class="btn" title="${state.translate(
|
||||
'copyUrlFormButton'
|
||||
)}" onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
|
||||
</div>
|
||||
<button id="delete-file" class="btn" title="${state.translate(
|
||||
'deleteFileButton'
|
||||
)}" onclick=${deleteFile}>${state.translate('deleteFileButton')}</button>
|
||||
<a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate(
|
||||
'sendAnotherFileLink'
|
||||
)}</a>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
async function sendNew(e) {
|
||||
e.preventDefault();
|
||||
await fadeOut('share-link');
|
||||
emit('pushState', '/');
|
||||
}
|
||||
|
||||
async function copyLink() {
|
||||
if (allowedCopy()) {
|
||||
emit('copy', { url: file.url, location: 'success-screen' });
|
||||
const input = document.getElementById('link');
|
||||
input.disabled = true;
|
||||
const copyBtn = document.getElementById('copy-btn');
|
||||
copyBtn.disabled = true;
|
||||
copyBtn.replaceChild(
|
||||
html`<img src="${assets.get('check-16.svg')}" class="icon-check">`,
|
||||
copyBtn.firstChild
|
||||
);
|
||||
await delay(2000);
|
||||
input.disabled = false;
|
||||
copyBtn.disabled = false;
|
||||
copyBtn.textContent = state.translate('copyUrlFormButton');
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteFile() {
|
||||
emit('delete', { file, location: 'success-screen' });
|
||||
await fadeOut('share-link');
|
||||
emit('pushState', '/');
|
||||
}
|
||||
return div;
|
||||
};
|
||||
50
app/templates/unsupported.js
Normal file
@@ -0,0 +1,50 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
|
||||
module.exports = function(state) {
|
||||
const msg =
|
||||
state.params.reason === 'outdated'
|
||||
? html`
|
||||
<div id="unsupported-browser">
|
||||
<div class="title">${state.translate('notSupportedHeader')}</div>
|
||||
<div class="description">${state.translate(
|
||||
'notSupportedOutdatedDetail'
|
||||
)}</div>
|
||||
<a id="update-firefox" href="https://support.mozilla.org/kb/update-firefox-latest-version">
|
||||
<img src="${assets.get(
|
||||
'firefox_logo-only.svg'
|
||||
)}" class="firefox-logo" alt="Firefox"/>
|
||||
<div class="unsupported-button-text">${state.translate(
|
||||
'updateFirefox'
|
||||
)}</div>
|
||||
</a>
|
||||
<div class="unsupported-description">${state.translate(
|
||||
'uploadPageExplainer'
|
||||
)}</div>
|
||||
</div>`
|
||||
: html`
|
||||
<div id="unsupported-browser">
|
||||
<div class="title">${state.translate('notSupportedHeader')}</div>
|
||||
<div class="description">${state.translate('notSupportedDetail')}</div>
|
||||
<div class="description"><a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-is-my-browser-not-supported">${state.translate(
|
||||
'notSupportedLink'
|
||||
)}</a></div>
|
||||
<a id="dl-firefox" href="https://www.mozilla.org/firefox/new/?scene=2">
|
||||
<img src="${assets.get(
|
||||
'firefox_logo-only.svg'
|
||||
)}" class="firefox-logo" alt="Firefox"/>
|
||||
<div class="unsupported-button-text">Firefox<br>
|
||||
<span>${state.translate('downloadFirefoxButtonSub')}</span>
|
||||
</div>
|
||||
</a>
|
||||
<div class="unsupported-description">${state.translate(
|
||||
'uploadPageExplainer'
|
||||
)}</div>
|
||||
</div>`;
|
||||
const div = html`<div id="page-one">${msg}</div>`;
|
||||
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
38
app/templates/upload.js
Normal file
@@ -0,0 +1,38 @@
|
||||
const html = require('choo/html');
|
||||
const progress = require('./progress');
|
||||
const { bytes } = require('../utils');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
const transfer = state.transfer;
|
||||
|
||||
const div = html`
|
||||
<div id="upload-progress" class="fadeIn">
|
||||
<div class="title" id="upload-filename">${state.translate(
|
||||
'uploadingPageProgress',
|
||||
{
|
||||
filename: transfer.file.name,
|
||||
size: bytes(transfer.file.size)
|
||||
}
|
||||
)}</div>
|
||||
<div class="description"></div>
|
||||
${progress(transfer.progressRatio)}
|
||||
<div class="upload">
|
||||
<div class="progress-text">${state.translate(
|
||||
transfer.msg,
|
||||
transfer.sizes
|
||||
)}</div>
|
||||
<button id="cancel-upload" title="${state.translate(
|
||||
'uploadingPageCancel'
|
||||
)}" onclick=${cancel}>${state.translate('uploadingPageCancel')}</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
function cancel() {
|
||||
const btn = document.getElementById('cancel-upload');
|
||||
btn.disabled = true;
|
||||
btn.textContent = state.translate('uploadCancelNotification');
|
||||
emit('cancel');
|
||||
}
|
||||
return div;
|
||||
};
|
||||
62
app/templates/welcome.js
Normal file
@@ -0,0 +1,62 @@
|
||||
const html = require('choo/html');
|
||||
const assets = require('../../common/assets');
|
||||
const fileList = require('./fileList');
|
||||
const { fadeOut } = require('../utils');
|
||||
|
||||
module.exports = function(state, emit) {
|
||||
const div = html`
|
||||
<div id="page-one" class="fadeIn">
|
||||
<div class="title">${state.translate('uploadPageHeader')}</div>
|
||||
<div class="description">
|
||||
<div>${state.translate('uploadPageExplainer')}</div>
|
||||
<a href="https://testpilot.firefox.com/experiments/send" class="link">${state.translate(
|
||||
'uploadPageLearnMore'
|
||||
)}</a>
|
||||
</div>
|
||||
<div class="${state.config
|
||||
.uploadWindowStyle}" ondragover=${dragover} ondragleave=${dragleave}>
|
||||
<div id="upload-img"><img src="${assets.get(
|
||||
'upload.svg'
|
||||
)}" title="${state.translate('uploadSvgAlt')}"/></div>
|
||||
<div id="upload-text">${state.translate('uploadPageDropMessage')}</div>
|
||||
<span id="file-size-msg"><em>${state.translate(
|
||||
'uploadPageSizeMessage'
|
||||
)}</em></span>
|
||||
<form method="post" action="upload" enctype="multipart/form-data">
|
||||
<label for="file-upload" id="browse" class="${state.config
|
||||
.uploadButtonStyle}" title="${state.translate(
|
||||
'uploadPageBrowseButton1'
|
||||
)}">${state.translate('uploadPageBrowseButton1')}</label>
|
||||
<input id="file-upload" type="file" name="fileUploaded" onchange=${upload} />
|
||||
</form>
|
||||
</div>
|
||||
${fileList(state, emit)}
|
||||
</div>
|
||||
`;
|
||||
|
||||
function dragover(event) {
|
||||
const div = document.querySelector('.upload-window');
|
||||
div.classList.add('ondrag');
|
||||
}
|
||||
|
||||
function dragleave(event) {
|
||||
const div = document.querySelector('.upload-window');
|
||||
div.classList.remove('ondrag');
|
||||
}
|
||||
|
||||
async function upload(event) {
|
||||
event.preventDefault();
|
||||
const target = event.target;
|
||||
const file = target.files[0];
|
||||
if (file.size === 0) {
|
||||
return;
|
||||
}
|
||||
await fadeOut('page-one');
|
||||
emit('upload', { file, type: 'click' });
|
||||
}
|
||||
|
||||
if (state.layout) {
|
||||
return state.layout(state, div);
|
||||
}
|
||||
return div;
|
||||
};
|
||||
@@ -35,47 +35,39 @@ function notify(str) {
|
||||
*/
|
||||
}
|
||||
|
||||
function gcmCompliant() {
|
||||
function loadShim(polyfill) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const shim = document.createElement('script');
|
||||
shim.src = polyfill;
|
||||
shim.addEventListener('load', () => resolve(true));
|
||||
shim.addEventListener('error', () => resolve(false));
|
||||
document.head.appendChild(shim);
|
||||
});
|
||||
}
|
||||
|
||||
async function canHasSend(polyfill) {
|
||||
try {
|
||||
return window.crypto.subtle
|
||||
.generateKey(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
length: 128
|
||||
},
|
||||
true,
|
||||
['encrypt', 'decrypt']
|
||||
)
|
||||
.then(key => {
|
||||
return window.crypto.subtle
|
||||
.encrypt(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
iv: window.crypto.getRandomValues(new Uint8Array(12)),
|
||||
additionalData: window.crypto.getRandomValues(new Uint8Array(6)),
|
||||
tagLength: 128
|
||||
},
|
||||
key,
|
||||
new ArrayBuffer(8)
|
||||
)
|
||||
.then(() => {
|
||||
return Promise.resolve();
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
return loadShim();
|
||||
});
|
||||
const key = await window.crypto.subtle.generateKey(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
length: 128
|
||||
},
|
||||
true,
|
||||
['encrypt', 'decrypt']
|
||||
);
|
||||
|
||||
await window.crypto.subtle.encrypt(
|
||||
{
|
||||
name: 'AES-GCM',
|
||||
iv: window.crypto.getRandomValues(new Uint8Array(12)),
|
||||
tagLength: 128
|
||||
},
|
||||
key,
|
||||
new ArrayBuffer(8)
|
||||
);
|
||||
return true;
|
||||
} catch (err) {
|
||||
return loadShim();
|
||||
}
|
||||
function loadShim() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const shim = document.createElement('script');
|
||||
shim.src = '/cryptofill.js';
|
||||
shim.addEventListener('load', resolve);
|
||||
shim.addEventListener('error', reject);
|
||||
document.head.appendChild(shim);
|
||||
});
|
||||
return loadShim(polyfill);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +99,8 @@ function copyToClipboard(str) {
|
||||
const LOCALIZE_NUMBERS = !!(
|
||||
typeof Intl === 'object' &&
|
||||
Intl &&
|
||||
typeof Intl.NumberFormat === 'function'
|
||||
typeof Intl.NumberFormat === 'function' &&
|
||||
typeof navigator === 'object'
|
||||
);
|
||||
|
||||
const UNITS = ['B', 'kB', 'MB', 'GB'];
|
||||
@@ -134,9 +127,22 @@ function allowedCopy() {
|
||||
return support ? document.queryCommandSupported('copy') : false;
|
||||
}
|
||||
|
||||
function delay(delay = 100) {
|
||||
return new Promise(resolve => setTimeout(resolve, delay));
|
||||
}
|
||||
|
||||
function fadeOut(id) {
|
||||
const classes = document.getElementById(id).classList;
|
||||
classes.remove('fadeIn');
|
||||
classes.add('fadeOut');
|
||||
return delay(300);
|
||||
}
|
||||
|
||||
const ONE_DAY_IN_MS = 86400000;
|
||||
|
||||
export {
|
||||
module.exports = {
|
||||
fadeOut,
|
||||
delay,
|
||||
allowedCopy,
|
||||
bytes,
|
||||
percent,
|
||||
@@ -144,7 +150,7 @@ export {
|
||||
arrayToHex,
|
||||
hexToArray,
|
||||
notify,
|
||||
gcmCompliant,
|
||||
canHasSend,
|
||||
isFile,
|
||||
ONE_DAY_IN_MS
|
||||
};
|
||||
|
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 257 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#4A4A4A" d="M9.414 8l5.293-5.293a1 1 0 0 0-1.414-1.414L8 6.586 2.707 1.293a1 1 0 0 0-1.414 1.414L6.586 8l-5.293 5.293a1 1 0 1 0 1.414 1.414L8 9.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 16 16"><path fill="#4A4A4A" d="M9.414 8l5.293-5.293a1 1 0 0 0-1.414-1.414L8 6.586 2.707 1.293a1 1 0 0 0-1.414 1.414L6.586 8l-5.293 5.293a1 1 0 1 0 1.414 1.414L8 9.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/></svg>
|
||||
|
Before Width: | Height: | Size: 286 B After Width: | Height: | Size: 287 B |
|
Before Width: | Height: | Size: 416 B After Width: | Height: | Size: 416 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 649 B After Width: | Height: | Size: 649 B |
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
@@ -1,6 +1,6 @@
|
||||
/*** index.html ***/
|
||||
html {
|
||||
background: url('../../public/resources/send_bg.svg');
|
||||
background: url('./send_bg.svg');
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
|
||||
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
|
||||
font-weight: 200;
|
||||
@@ -89,7 +89,7 @@ body {
|
||||
|
||||
.feedback {
|
||||
background-color: #0297f8;
|
||||
background-image: url('../../public/resources/feedback.svg');
|
||||
background-image: url('./feedback.svg');
|
||||
background-position: 2px 4px;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 18px;
|
||||
@@ -154,13 +154,43 @@ a {
|
||||
|
||||
/** page-one **/
|
||||
|
||||
.fadeOut {
|
||||
opacity: 0;
|
||||
animation: fadeout 200ms linear;
|
||||
}
|
||||
|
||||
@keyframes fadeout {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.fadeIn {
|
||||
opacity: 1;
|
||||
animation: fadein 200ms linear;
|
||||
}
|
||||
|
||||
@keyframes fadein {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 33px;
|
||||
line-height: 40px;
|
||||
margin: 20px auto;
|
||||
text-align: center;
|
||||
max-width: 520px;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
font-family: 'SF Pro Text', sans-serif;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
@@ -201,6 +231,14 @@ a {
|
||||
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 {
|
||||
color: #0094fb;
|
||||
text-decoration: none;
|
||||
@@ -214,10 +252,10 @@ a {
|
||||
font-size: 22px;
|
||||
color: #737373;
|
||||
margin: 20px 0 10px;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
font-family: 'SF Pro Text', sans-serif;
|
||||
}
|
||||
|
||||
#browse {
|
||||
.browse {
|
||||
background: #0297f8;
|
||||
border-radius: 5px;
|
||||
font-size: 15px;
|
||||
@@ -231,11 +269,16 @@ a {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
#browse:hover {
|
||||
.browse:hover {
|
||||
background-color: #0287e8;
|
||||
}
|
||||
|
||||
input[type="file"] {
|
||||
.browse-b {
|
||||
height: 60px;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
input[type='file'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -299,13 +342,24 @@ tbody {
|
||||
width: 12%;
|
||||
}
|
||||
|
||||
.overflow-col {
|
||||
text-overflow: ellipsis;
|
||||
max-width: 0;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.center-col {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.icon-delete,
|
||||
.icon-copy,
|
||||
.icon-check {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.icon-copy[disabled="disabled"] {
|
||||
.icon-copy[disabled='disabled'] {
|
||||
pointer-events: none;
|
||||
opacity: 0.3;
|
||||
}
|
||||
@@ -344,7 +398,7 @@ tbody {
|
||||
|
||||
/* Popup arrow */
|
||||
.popup .popuptext::after {
|
||||
content: "";
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -11px;
|
||||
left: 20px;
|
||||
@@ -431,12 +485,8 @@ tbody {
|
||||
}
|
||||
|
||||
.percentage {
|
||||
position: absolute;
|
||||
letter-spacing: -0.78px;
|
||||
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
|
||||
top: 58px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
@@ -449,7 +499,8 @@ tbody {
|
||||
|
||||
.percent-sign {
|
||||
font-size: 28.8px;
|
||||
color: rgb(104, 104, 104);
|
||||
stroke: none;
|
||||
fill: #686868;
|
||||
}
|
||||
|
||||
.upload {
|
||||
@@ -471,10 +522,18 @@ tbody {
|
||||
|
||||
#cancel-upload {
|
||||
color: #d70022;
|
||||
background: #fff;
|
||||
font-size: 15px;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#cancel-upload:disabled {
|
||||
text-decoration: none;
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
/** share-link **/
|
||||
#share-window {
|
||||
margin: 0 auto;
|
||||
@@ -482,6 +541,8 @@ tbody {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
max-width: 640px;
|
||||
}
|
||||
|
||||
#share-window-r > div {
|
||||
@@ -492,7 +553,7 @@ tbody {
|
||||
#copy {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
width: 640px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#copy-text {
|
||||
@@ -509,9 +570,9 @@ tbody {
|
||||
height: 56px;
|
||||
border: 1px solid #0297f8;
|
||||
border-radius: 6px 0 0 6px;
|
||||
font-size: 24px;
|
||||
font-size: 20px;
|
||||
color: #737373;
|
||||
font-family: 'SF Pro Display', sans-serif;
|
||||
font-family: 'SF Pro Text', sans-serif;
|
||||
letter-spacing: 0;
|
||||
line-height: 23px;
|
||||
font-weight: 300;
|
||||
@@ -546,7 +607,6 @@ tbody {
|
||||
background: #05a700;
|
||||
border: 1px solid #05a700;
|
||||
cursor: auto;
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
#delete-file {
|
||||
@@ -623,7 +683,7 @@ tbody {
|
||||
#update-firefox {
|
||||
margin-bottom: 181px;
|
||||
height: 80px;
|
||||
background: #12bc00;
|
||||
background: #98e02b;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
@@ -731,7 +791,7 @@ tbody {
|
||||
}
|
||||
|
||||
.legal-links {
|
||||
width: 81vw;
|
||||
max-width: 81vw;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 312 KiB After Width: | Height: | Size: 312 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 873 B After Width: | Height: | Size: 873 B |
|
Before Width: | Height: | Size: 336 B After Width: | Height: | Size: 336 B |
38
build/fluent_loader.js
Normal file
@@ -0,0 +1,38 @@
|
||||
const { MessageContext } = require('fluent');
|
||||
|
||||
function toJSON(map) {
|
||||
return JSON.stringify(Array.from(map));
|
||||
}
|
||||
|
||||
module.exports = function(source) {
|
||||
const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/;
|
||||
const result = localeExp.exec(this.resourcePath);
|
||||
const locale = result && result[1];
|
||||
// pre-parse the ftl
|
||||
const context = new MessageContext(locale);
|
||||
context.addMessages(source);
|
||||
if (!locale) {
|
||||
throw new Error(`couldn't find locale in: ${this.resourcePath}`);
|
||||
}
|
||||
return `
|
||||
module.exports = \`
|
||||
if (typeof window === 'undefined') {
|
||||
var fluent = require('fluent');
|
||||
}
|
||||
var ctx = new fluent.MessageContext('${locale}', {useIsolating: false});
|
||||
ctx._messages = new Map(${toJSON(context._messages)});
|
||||
function translate(id, data) {
|
||||
var msg = ctx.getMessage(id);
|
||||
if (typeof(msg) !== 'string' && !msg.val && msg.attrs) {
|
||||
msg = msg.attrs.title || msg.attrs.alt
|
||||
}
|
||||
return ctx.format(msg, data);
|
||||
}
|
||||
if (typeof window === 'undefined') {
|
||||
module.exports = translate;
|
||||
}
|
||||
else {
|
||||
window.translate = translate;
|
||||
}
|
||||
\``;
|
||||
};
|
||||
19
build/generate_asset_map.js
Normal file
@@ -0,0 +1,19 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function kv(f) {
|
||||
return `"${f}": require('../assets/${f}')`;
|
||||
}
|
||||
|
||||
module.exports = function() {
|
||||
const files = fs.readdirSync(path.join(__dirname, '..', 'assets'));
|
||||
const code = `module.exports = {
|
||||
"package.json": require('../package.json'),
|
||||
${files.map(kv).join(',\n')}
|
||||
};`;
|
||||
return {
|
||||
code,
|
||||
dependencies: files.map(f => require.resolve('../assets/' + f)),
|
||||
cacheable: false
|
||||
};
|
||||
};
|
||||
22
build/generate_l10n_map.js
Normal file
@@ -0,0 +1,22 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function kv(d) {
|
||||
return `"${d}": require('../public/locales/${d}/send.ftl')`;
|
||||
}
|
||||
|
||||
module.exports = function() {
|
||||
const dirs = fs.readdirSync(path.join(__dirname, '..', 'public', 'locales'));
|
||||
const code = `
|
||||
module.exports = {
|
||||
translate: function (id, data) { return window.translate(id, data) },
|
||||
${dirs.map(kv).join(',\n')}
|
||||
};`;
|
||||
return {
|
||||
code,
|
||||
dependencies: dirs.map(d =>
|
||||
require.resolve(`../public/locales/${d}/send.ftl`)
|
||||
),
|
||||
cacheable: false
|
||||
};
|
||||
};
|
||||
11
build/package_json_loader.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const commit = require('git-rev-sync').short();
|
||||
|
||||
module.exports = function(source) {
|
||||
const pkg = JSON.parse(source);
|
||||
const version = {
|
||||
commit,
|
||||
source: pkg.homepage,
|
||||
version: process.env.CIRCLE_TAG || `v${pkg.version}`
|
||||
};
|
||||
return `module.exports = '${JSON.stringify(version)}'`;
|
||||
};
|
||||
32
common/assets.js
Normal file
@@ -0,0 +1,32 @@
|
||||
const genmap = require('../build/generate_asset_map');
|
||||
const isServer = typeof genmap === 'function';
|
||||
const prefix = isServer ? '/' : '';
|
||||
let manifest = {};
|
||||
try {
|
||||
//eslint-disable-next-line node/no-missing-require
|
||||
manifest = require('../dist/manifest.json');
|
||||
} catch (e) {
|
||||
// use middleware
|
||||
}
|
||||
|
||||
const assets = isServer ? manifest : genmap;
|
||||
|
||||
function getAsset(name) {
|
||||
return prefix + assets[name];
|
||||
}
|
||||
|
||||
const instance = {
|
||||
get: getAsset,
|
||||
setMiddleware: function(middleware) {
|
||||
if (middleware) {
|
||||
instance.get = function getAssetWithMiddleware(name) {
|
||||
const f = middleware.fileSystem.readFileSync(
|
||||
middleware.getFilenameFromUrl('/manifest.json')
|
||||
);
|
||||
return prefix + JSON.parse(f)[name];
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = instance;
|
||||
51
common/locales.js
Normal file
@@ -0,0 +1,51 @@
|
||||
const gen = require('../build/generate_l10n_map');
|
||||
|
||||
const isServer = typeof gen === 'function';
|
||||
const prefix = isServer ? '/' : '';
|
||||
let manifest = {};
|
||||
try {
|
||||
//eslint-disable-next-line node/no-missing-require
|
||||
manifest = require('../dist/manifest.json');
|
||||
} catch (e) {
|
||||
// use middleware
|
||||
}
|
||||
|
||||
const locales = isServer ? manifest : gen;
|
||||
|
||||
function getLocale(name) {
|
||||
return prefix + locales[`public/locales/${name}/send.ftl`];
|
||||
}
|
||||
|
||||
function serverTranslator(name) {
|
||||
return require(`../dist/${locales[`public/locales/${name}/send.ftl`]}`);
|
||||
}
|
||||
|
||||
function browserTranslator() {
|
||||
return locales.translate;
|
||||
}
|
||||
|
||||
const translator = isServer ? serverTranslator : browserTranslator;
|
||||
|
||||
const instance = {
|
||||
get: getLocale,
|
||||
getTranslator: translator,
|
||||
setMiddleware: function(middleware) {
|
||||
if (middleware) {
|
||||
const _eval = require('require-from-string');
|
||||
instance.get = function getLocaleWithMiddleware(name) {
|
||||
const f = middleware.fileSystem.readFileSync(
|
||||
middleware.getFilenameFromUrl('/manifest.json')
|
||||
);
|
||||
return prefix + JSON.parse(f)[`public/locales/${name}/send.ftl`];
|
||||
};
|
||||
instance.getTranslator = function(name) {
|
||||
const f = middleware.fileSystem.readFileSync(
|
||||
middleware.getFilenameFromUrl(instance.get(name))
|
||||
);
|
||||
return _eval(f.toString());
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = instance;
|
||||
@@ -1,3 +1,14 @@
|
||||
## Setup
|
||||
|
||||
Before building the Docker image, you must build the production assets:
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
Then you can run either `docker build` or `docker-compose up`.
|
||||
|
||||
|
||||
## Environment variables:
|
||||
|
||||
| Name | Description
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
import Raven from 'raven-js';
|
||||
import { unsupported } from './metrics';
|
||||
|
||||
if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
|
||||
Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install();
|
||||
}
|
||||
|
||||
const ua = navigator.userAgent.toLowerCase();
|
||||
if (
|
||||
ua.indexOf('firefox') > -1 &&
|
||||
parseInt(ua.match(/firefox\/*([^\n\r]*)\./)[1], 10) <= 49
|
||||
) {
|
||||
unsupported({
|
||||
err: new Error('Firefox is outdated.')
|
||||
}).then(() => {
|
||||
location.replace('/unsupported/outdated');
|
||||
});
|
||||
}
|
||||
|
||||
export { Raven };
|
||||
@@ -1,119 +0,0 @@
|
||||
import { Raven } from './common';
|
||||
import FileReceiver from './fileReceiver';
|
||||
import { bytes, notify, gcmCompliant } from './utils';
|
||||
import Storage from './storage';
|
||||
import * as links from './links';
|
||||
import * as metrics from './metrics';
|
||||
import * as progress from './progress';
|
||||
|
||||
const storage = new Storage();
|
||||
function onUnload(size) {
|
||||
metrics.cancelledDownload({ size });
|
||||
}
|
||||
|
||||
async function download() {
|
||||
const downloadBtn = document.getElementById('download-btn');
|
||||
const downloadPanel = document.getElementById('download-page-one');
|
||||
const progressPanel = document.getElementById('download-progress');
|
||||
const file = document.getElementById('dl-file');
|
||||
const size = Number(file.getAttribute('data-size'));
|
||||
const ttl = Number(file.getAttribute('data-ttl'));
|
||||
const unloadHandler = onUnload.bind(null, size);
|
||||
const startTime = Date.now();
|
||||
const fileReceiver = new FileReceiver(
|
||||
'/assets' + location.pathname.slice(0, -1),
|
||||
location.hash.slice(1)
|
||||
);
|
||||
|
||||
downloadBtn.disabled = true;
|
||||
downloadPanel.hidden = true;
|
||||
progressPanel.hidden = false;
|
||||
metrics.startedDownload({ size, ttl });
|
||||
links.setOpenInNewTab(true);
|
||||
window.addEventListener('unload', unloadHandler);
|
||||
|
||||
fileReceiver.on('progress', data => {
|
||||
progress.setProgress({ complete: data[0], total: data[1] });
|
||||
});
|
||||
|
||||
let downloadEnd;
|
||||
fileReceiver.on('decrypting', () => {
|
||||
downloadEnd = Date.now();
|
||||
window.removeEventListener('unload', unloadHandler);
|
||||
fileReceiver.removeAllListeners('progress');
|
||||
document.l10n.formatValue('decryptingFile').then(progress.setText);
|
||||
});
|
||||
|
||||
try {
|
||||
const file = await fileReceiver.download();
|
||||
const endTime = Date.now();
|
||||
const time = endTime - startTime;
|
||||
const downloadTime = endTime - downloadEnd;
|
||||
const speed = size / (downloadTime / 1000);
|
||||
|
||||
links.setOpenInNewTab(false);
|
||||
storage.totalDownloads += 1;
|
||||
metrics.completedDownload({ size, time, speed });
|
||||
progress.setText(' ');
|
||||
document.l10n
|
||||
.formatValues('downloadNotification', 'downloadFinish')
|
||||
.then(translated => {
|
||||
notify(translated[0]);
|
||||
document.getElementById('dl-title').textContent = translated[1];
|
||||
document.querySelector('#download-progress .description').textContent =
|
||||
' ';
|
||||
});
|
||||
const dataView = new DataView(file.plaintext);
|
||||
const blob = new Blob([dataView], { type: file.type });
|
||||
const downloadUrl = URL.createObjectURL(blob);
|
||||
|
||||
const a = document.createElement('a');
|
||||
a.href = downloadUrl;
|
||||
if (window.navigator.msSaveBlob) {
|
||||
window.navigator.msSaveBlob(blob, file.name);
|
||||
return;
|
||||
}
|
||||
a.download = file.name;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
URL.revokeObjectURL(downloadUrl);
|
||||
} catch (err) {
|
||||
metrics.stoppedDownload({ size, err });
|
||||
|
||||
if (err.message === 'notfound') {
|
||||
location.reload();
|
||||
} else {
|
||||
progressPanel.hidden = true;
|
||||
downloadPanel.hidden = true;
|
||||
document.getElementById('upload-error').hidden = false;
|
||||
}
|
||||
Raven.captureException(err);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const file = document.getElementById('dl-file');
|
||||
const filename = file.getAttribute('data-filename');
|
||||
const b = Number(file.getAttribute('data-size'));
|
||||
const size = bytes(b);
|
||||
document.l10n.formatValue('downloadFileSize', { size }).then(str => {
|
||||
document.getElementById('dl-filesize').textContent = str;
|
||||
});
|
||||
document.l10n
|
||||
.formatValue('downloadingPageProgress', { filename, size })
|
||||
.then(str => {
|
||||
document.getElementById('dl-title').textContent = str;
|
||||
});
|
||||
|
||||
gcmCompliant()
|
||||
.then(() => {
|
||||
document
|
||||
.getElementById('download-btn')
|
||||
.addEventListener('click', download);
|
||||
})
|
||||
.catch(err => {
|
||||
metrics.unsupported({ err }).then(() => {
|
||||
location.replace('/unsupported/gcm');
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,163 +0,0 @@
|
||||
import FileSender from './fileSender';
|
||||
import Storage from './storage';
|
||||
import * as metrics from './metrics';
|
||||
import { allowedCopy, copyToClipboard, ONE_DAY_IN_MS } from './utils';
|
||||
import bel from 'bel';
|
||||
import copyImg from '../../public/resources/copy-16.svg';
|
||||
import closeImg from '../../public/resources/close-16.svg';
|
||||
|
||||
const HOUR = 1000 * 60 * 60;
|
||||
const storage = new Storage();
|
||||
let fileList = null;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
fileList = document.getElementById('file-list');
|
||||
toggleHeader();
|
||||
Promise.all(
|
||||
storage.files.map(file => {
|
||||
const id = file.fileId;
|
||||
return checkExistence(id).then(exists => {
|
||||
if (exists) {
|
||||
addFile(storage.getFileById(id));
|
||||
} else {
|
||||
storage.remove(id);
|
||||
}
|
||||
});
|
||||
})
|
||||
)
|
||||
.catch(err => console.error(err))
|
||||
.then(toggleHeader);
|
||||
});
|
||||
|
||||
function toggleHeader() {
|
||||
fileList.hidden = storage.files.length === 0;
|
||||
}
|
||||
|
||||
function timeLeft(milliseconds) {
|
||||
const minutes = Math.floor(milliseconds / 1000 / 60);
|
||||
const hours = Math.floor(minutes / 60);
|
||||
const seconds = Math.floor(milliseconds / 1000 % 60);
|
||||
if (hours >= 1) {
|
||||
return `${hours}h ${minutes % 60}m`;
|
||||
} else if (hours === 0) {
|
||||
return `${minutes}m ${seconds}s`;
|
||||
}
|
||||
return 'Expired';
|
||||
}
|
||||
|
||||
function addFile(file) {
|
||||
if (!file) {
|
||||
return;
|
||||
}
|
||||
file.creationDate = new Date(file.creationDate);
|
||||
const url = `${file.url}#${file.secretKey}`;
|
||||
const future = new Date();
|
||||
future.setTime(file.creationDate.getTime() + file.expiry);
|
||||
const countdown = future.getTime() - Date.now();
|
||||
|
||||
const row = bel`
|
||||
<tr>
|
||||
<td>${file.name}</td>
|
||||
<td>
|
||||
<span class="icon-docs" data-l10n-id="copyUrlHover"></span>
|
||||
<img onclick=${copyClick} src="${copyImg}" class="icon-copy" data-l10n-id="copyUrlHover">
|
||||
<span data-l10n-id="copiedUrl" class="text-copied" hidden="true"></span>
|
||||
</td>
|
||||
<td>${timeLeft(countdown)}</td>
|
||||
<td>
|
||||
<span class="icon-cancel-1" data-l10n-id="deleteButtonHover" title="Delete"></span>
|
||||
<img onclick=${showPopup} src="${closeImg}" class="icon-delete" data-l10n-id="deleteButtonHover" title="Delete">
|
||||
<div class="popup">
|
||||
<div class="popuptext" onclick=${stopProp} onblur=${cancel} tabindex="-1">
|
||||
<div class="popup-message" data-l10n-id="deletePopupText"></div>
|
||||
<div class="popup-action">
|
||||
<span class="popup-no" onclick=${cancel} data-l10n-id="deletePopupCancel"></span>
|
||||
<span class="popup-yes" onclick=${deleteFile} data-l10n-id="deletePopupYes"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
const popup = row.querySelector('.popuptext');
|
||||
const timeCol = row.querySelectorAll('td')[2];
|
||||
if (!allowedCopy()) {
|
||||
row.querySelector('.icon-copy').disabled = true;
|
||||
}
|
||||
|
||||
fileList.querySelector('tbody').appendChild(row);
|
||||
toggleHeader();
|
||||
poll();
|
||||
|
||||
function copyClick(e) {
|
||||
metrics.copiedLink({ location: 'upload-list' });
|
||||
copyToClipboard(url);
|
||||
const icon = e.target;
|
||||
const text = e.target.nextSibling;
|
||||
icon.hidden = true;
|
||||
text.hidden = false;
|
||||
setTimeout(() => {
|
||||
icon.hidden = false;
|
||||
text.hidden = true;
|
||||
}, 500);
|
||||
}
|
||||
|
||||
function poll() {
|
||||
const countdown = future.getTime() - Date.now();
|
||||
if (countdown <= 0) {
|
||||
storage.remove(file.fileId);
|
||||
row.parentNode.removeChild(row);
|
||||
toggleHeader();
|
||||
}
|
||||
timeCol.textContent = timeLeft(countdown);
|
||||
setTimeout(poll, countdown >= HOUR ? 60000 : 1000);
|
||||
}
|
||||
|
||||
function deleteFile() {
|
||||
FileSender.delete(file.fileId, file.deleteToken);
|
||||
const ttl = ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime());
|
||||
metrics.deletedUpload({
|
||||
size: file.size,
|
||||
time: file.totalTime,
|
||||
speed: file.uploadSpeed,
|
||||
type: file.typeOfUpload,
|
||||
location: 'upload-list',
|
||||
ttl
|
||||
});
|
||||
row.parentNode.removeChild(row);
|
||||
storage.remove(file.fileId);
|
||||
toggleHeader();
|
||||
}
|
||||
|
||||
function showPopup() {
|
||||
popup.classList.add('show');
|
||||
popup.focus();
|
||||
}
|
||||
|
||||
function cancel(e) {
|
||||
e.stopPropagation();
|
||||
popup.classList.remove('show');
|
||||
}
|
||||
|
||||
function stopProp(e) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
}
|
||||
|
||||
async function checkExistence(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
|
||||
resolve(xhr.status === 200);
|
||||
}
|
||||
};
|
||||
xhr.onerror = reject;
|
||||
xhr.ontimeout = reject;
|
||||
xhr.open('get', '/exists/' + id);
|
||||
xhr.timeout = 2000;
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
export { addFile };
|
||||
@@ -1,21 +0,0 @@
|
||||
let links = [];
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
links = Array.from(document.querySelectorAll('a:not([target])'));
|
||||
});
|
||||
|
||||
function setOpenInNewTab(bool) {
|
||||
if (bool === false) {
|
||||
links.forEach(l => {
|
||||
l.removeAttribute('target');
|
||||
l.removeAttribute('rel');
|
||||
});
|
||||
} else {
|
||||
links.forEach(l => {
|
||||
l.setAttribute('target', '_blank');
|
||||
l.setAttribute('rel', 'noopener noreferrer');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export { setOpenInNewTab };
|
||||
@@ -1,47 +0,0 @@
|
||||
import { bytes, percent } from './utils';
|
||||
|
||||
let percentText = null;
|
||||
let text = null;
|
||||
let title = null;
|
||||
let bar = null;
|
||||
let updateTitle = false;
|
||||
|
||||
const radius = 73;
|
||||
const circumference = 2 * Math.PI * radius;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
percentText = document.querySelector('.percent-number');
|
||||
text = document.querySelector('.progress-text');
|
||||
bar = document.getElementById('bar');
|
||||
title = document.querySelector('title');
|
||||
});
|
||||
|
||||
document.addEventListener('blur', function() {
|
||||
updateTitle = true;
|
||||
});
|
||||
|
||||
document.addEventListener('focus', function() {
|
||||
updateTitle = false;
|
||||
return title && (title.textContent = 'Firefox Send');
|
||||
});
|
||||
|
||||
function setProgress(params) {
|
||||
const ratio = params.complete / params.total;
|
||||
bar.setAttribute('stroke-dashoffset', (1 - ratio) * circumference);
|
||||
percentText.textContent = Math.floor(ratio * 100);
|
||||
if (updateTitle) {
|
||||
title.textContent = percent(ratio);
|
||||
}
|
||||
document.l10n
|
||||
.formatValue('fileSizeProgress', {
|
||||
partialSize: bytes(params.complete),
|
||||
totalSize: bytes(params.total)
|
||||
})
|
||||
.then(setText);
|
||||
}
|
||||
|
||||
function setText(str) {
|
||||
text.textContent = str;
|
||||
}
|
||||
|
||||
export { setProgress, setText };
|
||||
@@ -1,257 +0,0 @@
|
||||
/* global MAXFILESIZE EXPIRE_SECONDS */
|
||||
import { Raven } from './common';
|
||||
import FileSender from './fileSender';
|
||||
import {
|
||||
allowedCopy,
|
||||
bytes,
|
||||
copyToClipboard,
|
||||
notify,
|
||||
gcmCompliant,
|
||||
ONE_DAY_IN_MS
|
||||
} from './utils';
|
||||
import Storage from './storage';
|
||||
import * as metrics from './metrics';
|
||||
import * as progress from './progress';
|
||||
import * as fileList from './fileList';
|
||||
import checkImg from '../../public/resources/check-16.svg';
|
||||
|
||||
const storage = new Storage();
|
||||
|
||||
async function upload(event) {
|
||||
event.preventDefault();
|
||||
const pageOne = document.getElementById('page-one');
|
||||
const link = document.getElementById('link');
|
||||
const uploadWindow = document.querySelector('.upload-window');
|
||||
const uploadError = document.getElementById('upload-error');
|
||||
const uploadProgress = document.getElementById('upload-progress');
|
||||
const clickOrDrop = event.type === 'drop' ? 'drop' : 'click';
|
||||
|
||||
// don't allow upload if not on upload page
|
||||
if (pageOne.hidden) {
|
||||
return;
|
||||
}
|
||||
|
||||
storage.totalUploads += 1;
|
||||
|
||||
let file = '';
|
||||
if (clickOrDrop === 'drop') {
|
||||
if (!event.dataTransfer.files[0]) {
|
||||
uploadWindow.classList.remove('ondrag');
|
||||
return;
|
||||
}
|
||||
if (
|
||||
event.dataTransfer.files.length > 1 ||
|
||||
event.dataTransfer.files[0].size === 0
|
||||
) {
|
||||
uploadWindow.classList.remove('ondrag');
|
||||
document.l10n.formatValue('uploadPageMultipleFilesAlert').then(str => {
|
||||
alert(str);
|
||||
});
|
||||
return;
|
||||
}
|
||||
file = event.dataTransfer.files[0];
|
||||
} else {
|
||||
file = event.target.files[0];
|
||||
}
|
||||
|
||||
if (file.size > MAXFILESIZE) {
|
||||
return document.l10n
|
||||
.formatValue('fileTooBig', { size: bytes(MAXFILESIZE) })
|
||||
.then(alert);
|
||||
}
|
||||
|
||||
pageOne.hidden = true;
|
||||
uploadError.hidden = true;
|
||||
uploadProgress.hidden = false;
|
||||
document.l10n
|
||||
.formatValue('uploadingPageProgress', {
|
||||
size: bytes(file.size),
|
||||
filename: file.name
|
||||
})
|
||||
.then(str => {
|
||||
document.getElementById('upload-filename').textContent = str;
|
||||
});
|
||||
document.l10n.formatValue('importingFile').then(progress.setText);
|
||||
//don't allow drag and drop when not on page-one
|
||||
document.body.removeEventListener('drop', upload);
|
||||
|
||||
const fileSender = new FileSender(file);
|
||||
document.getElementById('cancel-upload').addEventListener('click', () => {
|
||||
fileSender.cancel();
|
||||
metrics.cancelledUpload({
|
||||
size: file.size,
|
||||
type: clickOrDrop
|
||||
});
|
||||
location.reload();
|
||||
});
|
||||
|
||||
let uploadStart;
|
||||
fileSender.on('progress', data => {
|
||||
uploadStart = uploadStart || Date.now();
|
||||
progress.setProgress({
|
||||
complete: data[0],
|
||||
total: data[1]
|
||||
});
|
||||
});
|
||||
|
||||
fileSender.on('encrypting', () => {
|
||||
document.l10n.formatValue('encryptingFile').then(progress.setText);
|
||||
});
|
||||
|
||||
let t;
|
||||
const startTime = Date.now();
|
||||
metrics.startedUpload({
|
||||
size: file.size,
|
||||
type: clickOrDrop
|
||||
});
|
||||
// For large files we need to give the ui a tick to breathe and update
|
||||
// before we kick off the FileSender
|
||||
setTimeout(() => {
|
||||
fileSender
|
||||
.upload()
|
||||
.then(info => {
|
||||
const endTime = Date.now();
|
||||
const time = endTime - startTime;
|
||||
const uploadTime = endTime - uploadStart;
|
||||
const speed = file.size / (uploadTime / 1000);
|
||||
const expiration = EXPIRE_SECONDS * 1000;
|
||||
|
||||
link.setAttribute('value', `${info.url}#${info.secretKey}`);
|
||||
|
||||
const copyText = document.getElementById('copy-text');
|
||||
copyText.setAttribute(
|
||||
'data-l10n-args',
|
||||
JSON.stringify({ filename: file.name })
|
||||
);
|
||||
copyText.setAttribute('data-l10n-id', 'copyUrlFormLabelWithName');
|
||||
|
||||
metrics.completedUpload({
|
||||
size: file.size,
|
||||
time,
|
||||
speed,
|
||||
type: clickOrDrop
|
||||
});
|
||||
|
||||
const fileData = {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
fileId: info.fileId,
|
||||
url: info.url,
|
||||
secretKey: info.secretKey,
|
||||
deleteToken: info.deleteToken,
|
||||
creationDate: new Date(),
|
||||
expiry: expiration,
|
||||
totalTime: time,
|
||||
typeOfUpload: clickOrDrop,
|
||||
uploadSpeed: speed
|
||||
};
|
||||
|
||||
document.getElementById('delete-file').addEventListener('click', () => {
|
||||
FileSender.delete(fileData.fileId, fileData.deleteToken).then(() => {
|
||||
const ttl =
|
||||
ONE_DAY_IN_MS - (Date.now() - fileData.creationDate.getTime());
|
||||
metrics
|
||||
.deletedUpload({
|
||||
size: fileData.size,
|
||||
time: fileData.totalTime,
|
||||
speed: fileData.uploadSpeed,
|
||||
type: fileData.typeOfUpload,
|
||||
location: 'success-screen',
|
||||
ttl
|
||||
})
|
||||
.then(() => {
|
||||
storage.remove(fileData.fileId);
|
||||
location.reload();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
storage.addFile(info.fileId, fileData);
|
||||
|
||||
pageOne.hidden = true;
|
||||
uploadProgress.hidden = true;
|
||||
uploadError.hidden = true;
|
||||
document.getElementById('share-link').hidden = false;
|
||||
|
||||
fileList.addFile(fileData);
|
||||
document.l10n.formatValue('notifyUploadDone').then(str => {
|
||||
notify(str);
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
// err is 0 when coming from a cancel upload event
|
||||
if (err === 0) {
|
||||
return;
|
||||
}
|
||||
// only show error page when the error is anything other than user cancelling the upload
|
||||
Raven.captureException(err);
|
||||
pageOne.hidden = true;
|
||||
uploadProgress.hidden = true;
|
||||
uploadError.hidden = false;
|
||||
window.clearTimeout(t);
|
||||
|
||||
metrics.stoppedUpload({
|
||||
size: file.size,
|
||||
type: clickOrDrop,
|
||||
err
|
||||
});
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
gcmCompliant()
|
||||
.then(function() {
|
||||
const pageOne = document.getElementById('page-one');
|
||||
const copyBtn = document.getElementById('copy-btn');
|
||||
const link = document.getElementById('link');
|
||||
const uploadWindow = document.querySelector('.upload-window');
|
||||
|
||||
pageOne.hidden = false;
|
||||
document.getElementById('file-upload').addEventListener('change', upload);
|
||||
|
||||
document.body.addEventListener('dragover', allowDrop);
|
||||
document.body.addEventListener('drop', upload);
|
||||
|
||||
// reset copy button
|
||||
copyBtn.disabled = !allowedCopy();
|
||||
copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton');
|
||||
|
||||
link.disabled = false;
|
||||
|
||||
// copy link to clipboard
|
||||
copyBtn.addEventListener('click', () => {
|
||||
if (allowedCopy() && copyToClipboard(link.getAttribute('value'))) {
|
||||
metrics.copiedLink({ location: 'success-screen' });
|
||||
|
||||
//disable button for 3s
|
||||
copyBtn.disabled = true;
|
||||
link.disabled = true;
|
||||
copyBtn.innerHTML = `<img src="${checkImg}" class="icon-check"></img>`;
|
||||
setTimeout(() => {
|
||||
copyBtn.disabled = !allowedCopy();
|
||||
copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton');
|
||||
link.disabled = false;
|
||||
}, 3000);
|
||||
}
|
||||
});
|
||||
|
||||
uploadWindow.addEventListener('dragover', () =>
|
||||
uploadWindow.classList.add('ondrag')
|
||||
);
|
||||
uploadWindow.addEventListener('dragleave', () =>
|
||||
uploadWindow.classList.remove('ondrag')
|
||||
);
|
||||
|
||||
// on file upload by browse or drag & drop
|
||||
|
||||
function allowDrop(ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
metrics.unsupported({ err }).then(() => {
|
||||
location.replace('/unsupported/gcm');
|
||||
});
|
||||
});
|
||||
});
|
||||
5417
package-lock.json
generated
203
package.json
@@ -1,87 +1,129 @@
|
||||
{
|
||||
"name": "firefox-send",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "1.1.2",
|
||||
"version": "1.2.0",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"dependencies": {
|
||||
"aws-sdk": "^2.98.0",
|
||||
"body-parser": "^1.17.2",
|
||||
"connect-busboy": "0.0.2",
|
||||
"convict": "^3.0.0",
|
||||
"express": "^4.15.3",
|
||||
"express-handlebars": "^3.0.0",
|
||||
"helmet": "^3.8.0",
|
||||
"mozlog": "^2.1.1",
|
||||
"raven": "^2.1.0",
|
||||
"redis": "^2.8.0"
|
||||
"repository": "mozilla/send",
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
"license": "MPL-2.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"precommit": "lint-staged",
|
||||
"clean": "rimraf dist",
|
||||
"build": "npm run clean && webpack -p",
|
||||
"lint": "npm-run-all lint:*",
|
||||
"lint:css": "stylelint 'assets/*.css'",
|
||||
"lint:js": "eslint .",
|
||||
"lint-locales": "node scripts/lint-locales",
|
||||
"lint-locales:dev": "npm run lint-locales",
|
||||
"lint-locales:prod": "npm run lint-locales -- --production",
|
||||
"format": "prettier '**/*.js' 'assets/*.css' --single-quote --write",
|
||||
"get-prod-locales": "node scripts/get-prod-locales",
|
||||
"get-prod-locales:write": "npm run get-prod-locales -- --write",
|
||||
"changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges",
|
||||
"contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS",
|
||||
"release": "npm-run-all contributors changelog",
|
||||
"test": "mocha test/unit",
|
||||
"start": "cross-env NODE_ENV=development webpack-dev-server",
|
||||
"prod": "node server/prod.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"asmcrypto.js": "0.0.11",
|
||||
"autoprefixer": "^7.1.2",
|
||||
"babel-core": "^6.25.0",
|
||||
"babel-loader": "^7.1.1",
|
||||
"babel-polyfill": "^6.23.0",
|
||||
"babel-preset-es2015": "^6.24.1",
|
||||
"babel-preset-stage-2": "^6.24.1",
|
||||
"bel": "^5.0.3",
|
||||
"browserify": "^14.4.0",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"cross-env": "^5.0.5",
|
||||
"css-loader": "^0.28.4",
|
||||
"css-mqpacker": "^6.0.1",
|
||||
"cssnano": "^3.10.0",
|
||||
"eslint": "^4.3.0",
|
||||
"eslint-plugin-mocha": "^4.11.0",
|
||||
"eslint-plugin-node": "^5.1.1",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"extract-loader": "^1.0.0",
|
||||
"file-loader": "^0.11.2",
|
||||
"git-rev-sync": "^1.9.1",
|
||||
"html-loader": "^0.5.1",
|
||||
"html-webpack-plugin": "^2.30.1",
|
||||
"husky": "^0.14.3",
|
||||
"l20n": "^5.0.0",
|
||||
"lint-staged": "^4.0.3",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mocha": "^3.4.2",
|
||||
"npm-run-all": "^4.0.2",
|
||||
"postcss-cli": "^4.1.0",
|
||||
"postcss-loader": "^2.0.6",
|
||||
"prettier": "^1.5.3",
|
||||
"proxyquire": "^1.8.0",
|
||||
"raven-js": "^3.17.0",
|
||||
"rimraf": "^2.6.1",
|
||||
"selenium-webdriver": "^3.5.0",
|
||||
"sinon": "^2.3.8",
|
||||
"stylelint": "^8.0.0",
|
||||
"stylelint-config-standard": "^17.0.0",
|
||||
"stylelint-no-unsupported-browser-features": "^1.0.0",
|
||||
"supertest": "^3.0.0",
|
||||
"testpilot-ga": "^0.3.0",
|
||||
"webcrypto-liner": "^0.1.25",
|
||||
"webpack": "^3.5.4",
|
||||
"webpack-dev-middleware": "^1.12.0"
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"prettier --single-quote --write",
|
||||
"eslint",
|
||||
"git add"
|
||||
],
|
||||
"*.css": [
|
||||
"prettier --single-quote --write",
|
||||
"stylelint",
|
||||
"git add"
|
||||
]
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.2.0"
|
||||
},
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
"license": "MPL-2.0",
|
||||
"repository": "mozilla/send",
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.4",
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-loader": "^7.1.2",
|
||||
"babel-plugin-yo-yoify": "^0.7.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"babel-preset-env": "^1.6.0",
|
||||
"babel-preset-es2015": "^6.24.1",
|
||||
"babel-preset-stage-2": "^6.24.1",
|
||||
"choo-log": "^7.2.1",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"cross-env": "^5.0.5",
|
||||
"css-loader": "^0.28.7",
|
||||
"css-mqpacker": "^6.0.1",
|
||||
"cssnano": "^3.10.0",
|
||||
"eslint": "^4.6.1",
|
||||
"eslint-plugin-mocha": "^4.11.0",
|
||||
"eslint-plugin-node": "^5.1.1",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"expose-loader": "^0.7.3",
|
||||
"extract-loader": "^1.0.1",
|
||||
"file-loader": "^0.11.2",
|
||||
"git-rev-sync": "^1.9.1",
|
||||
"github-changes": "^1.1.0",
|
||||
"html-loader": "^0.5.1",
|
||||
"husky": "^0.14.3",
|
||||
"lint-staged": "^4.1.3",
|
||||
"mocha": "^3.5.3",
|
||||
"nanobus": "^4.2.0",
|
||||
"npm-run-all": "^4.1.1",
|
||||
"postcss-loader": "^2.0.6",
|
||||
"prettier": "^1.6.1",
|
||||
"proxyquire": "^1.8.0",
|
||||
"raven-js": "^3.17.0",
|
||||
"redis-mock": "^0.20.0",
|
||||
"require-from-string": "^1.2.1",
|
||||
"rimraf": "^2.6.2",
|
||||
"selenium-webdriver": "^3.5.0",
|
||||
"sinon": "^3.2.1",
|
||||
"string-hash": "^1.1.3",
|
||||
"stylelint-config-standard": "^17.0.0",
|
||||
"stylelint-no-unsupported-browser-features": "^1.0.0",
|
||||
"supertest": "^3.0.0",
|
||||
"testpilot-ga": "^0.3.0",
|
||||
"val-loader": "^1.0.2",
|
||||
"webpack": "^3.5.6",
|
||||
"webpack-dev-server": "^2.8.0",
|
||||
"webpack-manifest-plugin": "^1.3.1",
|
||||
"webpack-unassert-loader": "^1.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"aws-sdk": "^2.114.0",
|
||||
"body-parser": "^1.18.1",
|
||||
"choo": "^6.0.1",
|
||||
"connect-busboy": "0.0.2",
|
||||
"convict": "^4.0.0",
|
||||
"express": "^4.15.4",
|
||||
"express-request-language": "^1.1.12",
|
||||
"fluent": "^0.4.1",
|
||||
"fluent-langneg": "^0.1.0",
|
||||
"helmet": "^3.8.1",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mozlog": "^2.1.1",
|
||||
"raven": "^2.1.2",
|
||||
"redis": "^2.8.0"
|
||||
},
|
||||
"availableLanguages": [
|
||||
"en-US",
|
||||
"ast",
|
||||
"az",
|
||||
"ca",
|
||||
"cak",
|
||||
"cs",
|
||||
"cy",
|
||||
"de",
|
||||
"dsb",
|
||||
"el",
|
||||
"en-US",
|
||||
"es-AR",
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"es-MX",
|
||||
"fa",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"hsb",
|
||||
@@ -107,40 +149,5 @@
|
||||
"vi",
|
||||
"zh-CN",
|
||||
"zh-TW"
|
||||
],
|
||||
"scripts": {
|
||||
"precommit": "lint-staged",
|
||||
"clean": "rimraf dist",
|
||||
"build": "npm-run-all build:*",
|
||||
"build:js": "webpack -p",
|
||||
"build:version": "node scripts/version",
|
||||
"contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS",
|
||||
"dev": "npm run clean && npm run build && npm start",
|
||||
"format": "prettier '{,frontend/src/,scripts/,server/,test/**/!(bundle)}*.{js,css}' --single-quote --write",
|
||||
"get-prod-locales": "node scripts/get-prod-locales",
|
||||
"get-prod-locales:write": "npm run get-prod-locales -- --write",
|
||||
"lint": "npm-run-all lint:*",
|
||||
"lint:css": "stylelint 'frontend/src/*.css'",
|
||||
"lint:js": "eslint .",
|
||||
"lint-locales": "node scripts/lint-locales",
|
||||
"lint-locales:dev": "npm run lint-locales",
|
||||
"lint-locales:prod": "npm run lint-locales -- --production",
|
||||
"start": "node server/server",
|
||||
"test": "cross-env NODE_ENV=test npm-run-all test:*",
|
||||
"test:unit": "mocha test/unit",
|
||||
"test:server": "mocha test/server",
|
||||
"test--browser": "browserify test/frontend/frontend.bundle.js -o test/frontend/bundle.js -d && node test/frontend/driver.js"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"prettier --single-quote --write",
|
||||
"eslint",
|
||||
"git add"
|
||||
],
|
||||
"*.css": [
|
||||
"prettier --single-quote --write",
|
||||
"stylelint",
|
||||
"git add"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@ const autoprefixer = require('autoprefixer');
|
||||
const cssnano = require('cssnano');
|
||||
const mqpacker = require('css-mqpacker');
|
||||
|
||||
const conf = require('./server/config');
|
||||
const config = require('./server/config');
|
||||
|
||||
const options = {
|
||||
plugins: [autoprefixer, mqpacker, cssnano]
|
||||
};
|
||||
|
||||
if (conf.env === 'development') {
|
||||
if (config.env === 'development') {
|
||||
options.map = { inline: true };
|
||||
}
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -8,9 +8,7 @@ uploadPageLearnMore = Deprendi más
|
||||
uploadPageDropMessage = Suelta equí'l to ficheru p'aniciar la xuba
|
||||
uploadPageSizeMessage = Pal meyor funcionamientu, lo meyor ye que'l to ficheru seya menor de 1GB
|
||||
uploadPageBrowseButton = Esbilla un ficheru nel to ordenador
|
||||
.title = Esbilla un ficheru nel to ordenador
|
||||
uploadPageBrowseButton1 = Esbilla un ficheru pa unviar
|
||||
.title = Esbilla un ficheru pa unviar
|
||||
uploadPageMultipleFilesAlert = Anguaño nun se sofita la xuba múltiple de ficheros o carpetes.
|
||||
uploadPageBrowseButtonTitle = Xubir ficheru
|
||||
uploadingPageProgress = Xubiendo { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Descifrando...
|
||||
notifyUploadDone = Finó la to xuba.
|
||||
uploadingPageMessage = Namái que'l ficheru xuba, sedrás a afitar les opciones de caducidá.
|
||||
uploadingPageCancel = Encaboxar xuba
|
||||
.title = Encaboxar xuba
|
||||
uploadCancelNotification = Encaboxóse la to xuba.
|
||||
uploadingPageLargeFileMessage = Esti ficheru ye grande y pue entardar daqué en xubir. ¡Paciencia!
|
||||
uploadingFileNotification = Avísame cuando se complete la xuba.
|
||||
uploadSuccessConfirmHeader = Preparáu pa unviar
|
||||
uploadSvgAlt
|
||||
.alt = Xubir
|
||||
uploadSvgAlt = Xubir
|
||||
uploadSuccessTimingHeader = L'enllaz del to ficheru caducará dempués d'una descarga o en 24 hores.
|
||||
copyUrlFormLabelWithName = Copia y comparti l'enllaz pa unviar el to ficheru: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar al cartafueyu
|
||||
.title = Copiar al cartafueyu
|
||||
copiedUrl = ¡Copióse!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Desaniciar ficheru
|
||||
.title = Desaniciar ficheru
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Unviar otru ficheru
|
||||
.title = Unviar otru ficheru
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Baxar
|
||||
downloadAltText = Baxar
|
||||
downloadFileName = Baxar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = El to collaciu unvióte un ficheru usando Firefox Send, un serviciu que te permite compartir ficheros con un enllaz seguru, priváu y cifráu que caduca automáticamente p'asegurar que les to coses nun queden siempres na rede.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Baxar
|
||||
.title = Baxar
|
||||
downloadNotification = Completóse la to descarga.
|
||||
downloadFinish = Descarga completada
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Prueba Firefox Send
|
||||
.title = Prueba Firefox Send
|
||||
downloadingPageProgress = Baxando { $filename } ({ $size })
|
||||
downloadingPageMessage = Dexa esta llingüeta abierta entrín vamos en cata del to ficheru y lu desciframos, por favor.
|
||||
errorAltText
|
||||
.alt = Fallu de xuba
|
||||
errorAltText = Fallu de xuba
|
||||
errorPageHeader = ¡Daqué foi mal!
|
||||
errorPageMessage = Hebo un fallu xubiendo'l ficheru.
|
||||
errorPageLink = Unviar otru ficheru
|
||||
fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enllaz caducáu
|
||||
linkExpiredAlt = Enllaz caducáu
|
||||
expiredPageHeader = ¡Esti enllaz caducó o enxamás nun esistó!
|
||||
notSupportedHeader = El to restolador nun ta sofitáu.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = L'usu de Firefox Send tamién ta suxetu al <a>Avisu de priv
|
||||
deletePopupText = ¿Desaniciar esti ficheru?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Encaboxar
|
||||
deleteButtonHover
|
||||
.title = Desaniciar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
deleteButtonHover = Desaniciar
|
||||
copyUrlHover = Copiar URL
|
||||
footerLinkLegal = Llegal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Tocante a Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Ətraflı öyrən
|
||||
uploadPageDropMessage = Yükləmək üçün faylınızı buraya daşıyın
|
||||
uploadPageSizeMessage = Xidmətin daha yaxşı işləməsi üçün faylınız 1 GB-dan az olmalıdır
|
||||
uploadPageBrowseButton = Kompüterinizdən fayl seçin
|
||||
.title = Kompüterinizdən fayl seçin
|
||||
uploadPageBrowseButton1 = Yüklənəcək faylı seçin
|
||||
.title = Yüklənəcək faylı seçin
|
||||
uploadPageMultipleFilesAlert = Birdən çox fayl və ya qovluq yükləmə hələlik dəstəklənmir.
|
||||
uploadPageBrowseButtonTitle = Fayl yüklə
|
||||
uploadingPageProgress = { $filename } ({ $size }) yüklənir
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Şifrə açılır...
|
||||
notifyUploadDone = Yükləməniz hazırdır.
|
||||
uploadingPageMessage = Faylınız yükləndikdən sonra vaxtı çıxma seçimlərini qura biləcəksiz.
|
||||
uploadingPageCancel = Yükləməni ləğv et
|
||||
.title = Yükləməni ləğv et
|
||||
uploadCancelNotification = Yükləməniz ləğv edildi.
|
||||
uploadingPageLargeFileMessage = Fayl böyükdür və yükləmək çox vaxt ala bilər. Səbirli olun!
|
||||
uploadingFileNotification = Yükləmə bitdiyində xəbər ver.
|
||||
uploadSuccessConfirmHeader = Göndərməyə hazır
|
||||
uploadSvgAlt
|
||||
.alt = Yüklə
|
||||
uploadSvgAlt = Yüklə
|
||||
uploadSuccessTimingHeader = Faylınızın keçidinin 1 endirmədən və ya 24 saatdan sonra vaxtı çıxacaq.
|
||||
copyUrlFormLabelWithName = Faylınızı göndərmək üçün keçidi köçürün: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Buferə köçür
|
||||
.title = Mübadilə buferinə köçür
|
||||
copiedUrl = Köçürüldü!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Faylı sil
|
||||
.title = Faylı sil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Başqa fayl göndər
|
||||
.title = Başqa fayl göndər
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Endir
|
||||
downloadAltText = Endir
|
||||
downloadFileName = { $filename } faylını endir
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Yoldaşınız Firefox Send ilə sizə fayl göndərir, fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silən fayl göndərmə xidməti.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Endir
|
||||
.title = Endir
|
||||
downloadNotification = Endirməniz tamamlandı.
|
||||
downloadFinish = Endirmə Tamamlandı
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } / { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send Yoxla
|
||||
.title = Firefox Send Yoxla
|
||||
downloadingPageProgress = { $filename } faylı ({ $size }) endirilir
|
||||
downloadingPageMessage = Lütfən faylı endirib şifrəsini açarkən vərəqi açıq buraxın.
|
||||
errorAltText
|
||||
.alt = Yükləmə xətası
|
||||
errorAltText = Yükləmə xətası
|
||||
errorPageHeader = Nəsə səhv getdi!
|
||||
errorPageMessage = Faylı yüklərkən xəta baş verdi.
|
||||
errorPageLink = Başqa fayl göndər
|
||||
fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır.
|
||||
linkExpiredAlt
|
||||
.alt = Keçidin vaxtı çıxıb
|
||||
linkExpiredAlt = Keçidin vaxtı çıxıb
|
||||
expiredPageHeader = Keçidin vaxtı çıxıb və ya heç vaxt olmayıb!
|
||||
notSupportedHeader = Səyyahınız dəstəklənmir.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Firefox Send saytının istifadəsi həmçinin Mozilla-nın
|
||||
deletePopupText = Fayl silinsin?
|
||||
deletePopupYes = Bəli
|
||||
deletePopupCancel = Ləğv et
|
||||
deleteButtonHover
|
||||
.title = Sil
|
||||
copyUrlHover
|
||||
.title = Keçidi Köçürt
|
||||
deleteButtonHover = Sil
|
||||
copyUrlHover = Keçidi Köçürt
|
||||
footerLinkLegal = Hüquqi
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot Haqqında
|
||||
|
||||
@@ -4,7 +4,6 @@ siteSubtitle = ওয়েব গবেষণা
|
||||
siteFeedback = প্রতিক্রিয়া
|
||||
uploadPageLearnMore = আরও জানুন
|
||||
uploadPageBrowseButton = আপনার কম্পিউটারে ফাইল নির্বাচন করুন
|
||||
.title = আপনার কম্পিউটারে ফাইল নির্বাচন করুন
|
||||
uploadPageBrowseButtonTitle = ফাইল আপলোড
|
||||
importingFile = ইম্পোর্ট হচ্ছে...
|
||||
verifyingFile = যাচাই হচ্ছে...
|
||||
@@ -12,33 +11,22 @@ encryptingFile = ইনক্রিপট হচ্ছে...
|
||||
decryptingFile = ডিক্রিপট হচ্ছে...
|
||||
notifyUploadDone = আপনার আপলোড সম্পন্ন হয়েছে।
|
||||
uploadingPageCancel = আপলোড বাতিল করুন
|
||||
.title = আপলোড বাতিল করুন
|
||||
uploadCancelNotification = আপনার অাপলোড বাতিল করা হয়েছে।
|
||||
uploadSuccessConfirmHeader = পাঠানোর জন্য প্রস্তুত
|
||||
uploadSvgAlt
|
||||
.alt = আপলোড
|
||||
// Note: Title text for button should be the same.
|
||||
uploadSvgAlt = আপলোড
|
||||
copyUrlFormButton = ক্লিপবোর্ডে কপি করুন
|
||||
.title = ক্লিপবোর্ডে কপি করুন
|
||||
copiedUrl = কপি করা হয়েছে!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = ফাইল মুছুন
|
||||
.title = ফাইল মুছুন
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = আরেকটি ফাইল পাঠান
|
||||
.title = আরেকটি ফাইল পাঠান
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = ডাউনলোড
|
||||
downloadAltText = ডাউনলোড
|
||||
downloadFileName = ডাউনলোড { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = ডাউনলোড
|
||||
.title = ডাউনলোড
|
||||
downloadNotification = আপনার ডাউনলোড সম্পন্ন হয়েছে।
|
||||
downloadFinish = ডাউনলোড সম্পন্ন
|
||||
errorAltText
|
||||
.alt = আপালোডে ত্রুটি
|
||||
errorAltText = আপালোডে ত্রুটি
|
||||
errorPageHeader = কোন সমস্যা হয়েছে!
|
||||
errorPageLink = আরেকটি ফাইল পাঠান
|
||||
updateFirefox = Firefox হালনাগাদ করুন
|
||||
@@ -53,10 +41,8 @@ legalHeader = শর্তাবলী এবং গোপনীয়তা
|
||||
deletePopupText = ফাইলটি মুছতে চান?
|
||||
deletePopupYes = হ্যাঁ
|
||||
deletePopupCancel = বাতিল
|
||||
deleteButtonHover
|
||||
.title = মুছে ফেলুন
|
||||
copyUrlHover
|
||||
.title = URL অনুলিপি করুন
|
||||
deleteButtonHover = মুছে ফেলুন
|
||||
copyUrlHover = URL অনুলিপি করুন
|
||||
footerLinkLegal = আইনগত
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot পরিচিতি
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Més informació
|
||||
uploadPageDropMessage = Arrossegueu el fitxer aquí per començar a pujar-lo
|
||||
uploadPageSizeMessage = Funciona millor quan els fitxers tenen menys d'1 GB
|
||||
uploadPageBrowseButton = Trieu un fitxer de l'ordinador
|
||||
.title = Trieu un fitxer de l'ordinador
|
||||
uploadPageBrowseButton1 = Seleccioneu el fitxer que voleu pujar
|
||||
.title = Seleccioneu el fitxer que voleu pujar
|
||||
uploadPageMultipleFilesAlert = Actualment no es permet pujar diversos fitxers ni una carpeta.
|
||||
uploadPageBrowseButtonTitle = Puja el fitxer
|
||||
uploadingPageProgress = S'està pujant { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = S'està desxifrant…
|
||||
notifyUploadDone = La pujada ha acabat.
|
||||
uploadingPageMessage = Quan s'hagi acabat de pujat el fitxer, podreu definir les opcions de caducitat.
|
||||
uploadingPageCancel = Cancel·la la pujada
|
||||
.title = Cancel·la la pujada
|
||||
uploadCancelNotification = La pujada s'ha cancel·lat.
|
||||
uploadingPageLargeFileMessage = Aquest fitxer és gros i pot trigar una estona a pujar. Espereu assegut…
|
||||
uploadingFileNotification = Notifica'm quan s'acabi de pujar.
|
||||
uploadSuccessConfirmHeader = Llest per enviar
|
||||
uploadSvgAlt
|
||||
.alt = Puja
|
||||
uploadSvgAlt = Puja
|
||||
uploadSuccessTimingHeader = L'enllaç al fitxer caducarà quan es baixi una vegada o d'aquí 24 hores.
|
||||
copyUrlFormLabelWithName = Copieu l'enllaç i compartiu-lo per enviar el fitxer: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copia al porta-retalls
|
||||
.title = Copia al porta-retalls
|
||||
copiedUrl = Copiat!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Suprimeix el fitxer
|
||||
.title = Suprimeix el fitxer
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Envieu un altre fitxer
|
||||
.title = Envieu un altre fitxer
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Baixa
|
||||
downloadAltText = Baixa
|
||||
downloadFileName = Baixeu { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Un amic us ha enviat un fitxer amb el Firefox Send, un servei que permet compartir fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Baixa
|
||||
.title = Baixa
|
||||
downloadNotification = La baixada ha acabat.
|
||||
downloadFinish = Ha acabat la baixada
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Proveu el Firefox Send
|
||||
.title = Proveu el Firefox Send
|
||||
downloadingPageProgress = S'està baixant { $filename } ({ $size })
|
||||
downloadingPageMessage = Deixeu aquesta pestanya oberta per tal que el fitxer es pugui baixar i desxifrar.
|
||||
errorAltText
|
||||
.alt = S'ha produït un error en pujar
|
||||
errorAltText = S'ha produït un error en pujar
|
||||
errorPageHeader = Hi ha hagut un problema
|
||||
errorPageMessage = S'ha produït un error en pujar el fitxer.
|
||||
errorPageLink = Envieu un altre fitxer
|
||||
fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = L'enllaç ha caducat
|
||||
linkExpiredAlt = L'enllaç ha caducat
|
||||
expiredPageHeader = Aquest enllaç ha caducat o no existeix.
|
||||
notSupportedHeader = El vostre navegador no és compatible.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = L'ús del Firefox Send també està subjecte a l'<a>Avís d
|
||||
deletePopupText = Voleu suprimir aquest fitxer?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancel·la
|
||||
deleteButtonHover
|
||||
.title = Suprimeix
|
||||
copyUrlHover
|
||||
.title = Copia l'URL
|
||||
deleteButtonHover = Suprimeix
|
||||
copyUrlHover = Copia l'URL
|
||||
footerLinkLegal = Avís legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Quant al Test Pilot
|
||||
|
||||
82
public/locales/cak/send.ftl
Normal file
@@ -0,0 +1,82 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = ajk'amaya'l solna'onem
|
||||
siteFeedback = Rutzijol
|
||||
uploadPageHeader = Kekomonïx Ichinan chuqa' Ewan Kisik'ixik taq Yakb'äl
|
||||
uploadPageExplainer = Ketaq taq yakb'äl rik'in jun ewan rusik'ixik, ichinan chuqa' jikon ximonel, ri ruyonil xtikis ruq'ijul richin ke ri' ri taq atzij man e okel ta pa k'amaya'l junelïk.
|
||||
uploadPageLearnMore = Tetamäx ch'aqa' chik
|
||||
uploadPageDropMessage = Tajik'a' pe ri ayakb'al wawe' richin nachäp kijotob'axik
|
||||
uploadPageSizeMessage = Richin chi ütz nel ri samaj, k'o ta chi ri yakb'äl man tik'o chi re ri 1GB
|
||||
uploadPageBrowseButton = Tacha' jun yakb'äl pan akematz'ib'
|
||||
uploadPageBrowseButton1 = Tacha' jun yakb'äl richin najotob'a'
|
||||
uploadPageMultipleFilesAlert = K'a man nuk'öch ta nijotob'äx jalajöj yakb'äl o jun molwuj.
|
||||
uploadPageBrowseButtonTitle = Tijotob'äx yakb'äl
|
||||
uploadingPageProgress = Tajin nijotob'äx { $filename } ({ $size })
|
||||
importingFile = Tajin nijik…
|
||||
verifyingFile = Tajin nijikib'äx...
|
||||
encryptingFile = Tajin newäx rusik'ixik...
|
||||
decryptingFile = Tajin netamäx rusik'ixik...
|
||||
notifyUploadDone = Xak'is rujotob'axik.
|
||||
uploadingPageMessage = Toq xtijotob'äx ri yakb'äl xkatikïr xtak'ëx pa taq cha'oj ri ruq'ijul xtik'is.
|
||||
uploadingPageCancel = Tiq'at jotob'anïk
|
||||
uploadCancelNotification = Xq'at ri ajotob'anik
|
||||
uploadingPageLargeFileMessage = Yalan nïm re yakb'äl re' ruma ri' toq xtiyoke' richin xtijote'. ¡Man tik'o ak'u'x!
|
||||
uploadingFileNotification = Tiya' pe rutzijol chwe toq xtitz'aqät rujotob'axik.
|
||||
uploadSuccessConfirmHeader = Ütz chik richin Nitaq
|
||||
uploadSvgAlt = Tijotob'äx
|
||||
uploadSuccessTimingHeader = Ri ruximonel yakb'äl xtik'is ruq'ijul toq xtiqasäx jumul o pa 24 ramaj.
|
||||
copyUrlFormLabelWithName = Tiwachib'ëx chuqa' tikomonïx ri ximonel richin nitaq ri ayakb'äl: { $filename }
|
||||
copyUrlFormButton = Tiwachib'ëx pa molwuj
|
||||
copiedUrl = ¡Xwachib'ëx!
|
||||
deleteFileButton = Tiyuj yakb'äl
|
||||
sendAnotherFileLink = Titaq jun chik yakb'äl
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = Tiqasäx
|
||||
downloadFileName = Tiqasäx { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Jun awachib'il xutäq jun yakb'äl chawe rik'in ri Firefox Send, jun samaj ri nuya' q'ij chawe ye'akomonij taq yakb'äl rik'in jun jikïl, ichinan chuqa' ewan rusik'ixik ximonel, ri nik'is ruq'ijul pa ruyonil richin chi ri taq awachinaq man junelïk ta e okel pa k'amab'ey.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Tiqasäx
|
||||
downloadNotification = Xtz'aqät ri aqasanik.
|
||||
downloadFinish = Xtz'aqät qasanïk
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } richin { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Titojtob'ëx Firefox Send
|
||||
downloadingPageProgress = Tajin niqasäx { $filename } ({ $size })
|
||||
downloadingPageMessage = Tijaq kan re ruwi' re' richin niqaqasaj ri yakb'äl chuqa' richin niqetamaj rusik'ixik.
|
||||
errorAltText = Xsach toq nijotob'äx
|
||||
errorPageHeader = ¡K'o ri man ütz ta xub'än!
|
||||
errorPageMessage = Xk'ulwachitäj jun sachoj toq tajin nijotob'äx ri yakb'äl.
|
||||
errorPageLink = Titaq jun chik yakb'äl
|
||||
fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o ta chi re ri { $size }.
|
||||
linkExpiredAlt = Xk'is ruq'ijul ri ximonel
|
||||
expiredPageHeader = ¡Xk'is ruq'ijul re ximonel re' o rik'in jub'a' majub'ey xk'oje'!
|
||||
notSupportedHeader = Man koch'el ta ri awokik'amaya'l.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = K'ayew ruma re okik'amaya'l re' man nuköch' ta ajk'amaya'l na'ob'äl nik'atzin chi re ri Firefox Send. K'o chi natojtob'ej jun chik okik'amaya'l. ¡Niqachilab'ej chawe ri Firefox!
|
||||
notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l?
|
||||
notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l.
|
||||
updateFirefox = Tik'ex ri Firefox
|
||||
downloadFirefoxButtonSub = Sipan Ruqasaxik
|
||||
uploadedFile = Yakb'äl
|
||||
copyFileList = Tiwachib'ëx URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Nik'is Ruq'ijul Pa
|
||||
deleteFileList = Tiyuj
|
||||
nevermindButton = Junam nub'än
|
||||
legalHeader = Ojqanem chuqa' Ichinanem
|
||||
legalNoticeTestPilot = Firefox Send k'a jun rutojtob'enik Test Pilot, chuqa' rutaqen rutzij ri <a>Rojqanem Samaj</a> chuqa' rik'in ri <a>Rutzijol Ichinanem</a>. Yatikïr nawetamaj ch'aq'a' chik chi rij re solna'oj re' chuqa' ri rumolik tzij <a>wawe'</a>.
|
||||
legalNoticeMozilla = Richin nokisäx ri ruxaq ruk'amaya'l Firefox Send k'o chi nitaqëx ri <a>Rutzijol Richinanem Ajk'amaya'l Ruxaq</a> chuqa' <a>Rojqanem rokisaxik Ajk'amaya'l Ruxaq</a>.
|
||||
deletePopupText = ¿La niyuj el re yakb'äl re'?
|
||||
deletePopupYes = Ja'
|
||||
deletePopupCancel = Tiq'at
|
||||
deleteButtonHover = Tiyuj
|
||||
copyUrlHover = Tiwachib'ëx URL
|
||||
footerLinkLegal = Taqanel tzijol
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Chi rij Test Pilot
|
||||
footerLinkPrivacy = Ichinanem
|
||||
footerLinkTerms = Taq ojqanem
|
||||
footerLinkCookies = Taq kaxlanwey
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Zjistit více
|
||||
uploadPageDropMessage = Přesunutím souboru sem spustíte jeho nahrávání
|
||||
uploadPageSizeMessage = Nahrávání funguje nejlépe pro soubory do velikosti 1 GB.
|
||||
uploadPageBrowseButton = Vybrat soubor z počítače
|
||||
.title = Výběr souboru z počítače
|
||||
uploadPageBrowseButton1 = Zvolte soubor k nahrání
|
||||
.title = Zvolte soubor k nahrání
|
||||
uploadPageMultipleFilesAlert = Nahrávání více souborů najednou nebo celých složek zatím není podporováno.
|
||||
uploadPageBrowseButtonTitle = Nahrát soubor
|
||||
uploadingPageProgress = Nahrávání souboru { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Probíhá dešifrování…
|
||||
notifyUploadDone = Nahrávání vašeho souboru bylo dokončeno.
|
||||
uploadingPageMessage = Po dokončení nahrávání můžete nastavit dobu expirace souboru.
|
||||
uploadingPageCancel = Zrušit nahrávání
|
||||
.title = Zrušit nahrávání
|
||||
uploadCancelNotification = Nahrávání vašeho souboru bylo zrušeno.
|
||||
uploadingPageLargeFileMessage = Tento soubor je veliký a jeho nahrávání může chvíli trvat. Posaďte se na chvilku.
|
||||
uploadingFileNotification = Upozornit, až bude nahrávání dokončeno.
|
||||
uploadSuccessConfirmHeader = Připraveno k odeslání
|
||||
uploadSvgAlt
|
||||
.alt = Nahrát
|
||||
uploadSvgAlt = Nahrát
|
||||
uploadSuccessTimingHeader = Platnost odkazu na váš soubor vyprší po jeho prvním stažení, nebo po 24 hodinách.
|
||||
copyUrlFormLabelWithName = Zkopírujte a sdílejte odkaz na váš soubor: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Zkopírovat do schránky
|
||||
.title = Zkopírovat do schránky
|
||||
copiedUrl = Zkopírováno!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Smazat soubor
|
||||
.title = Smazání souboru
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Poslat další soubor
|
||||
.title = Poslat další soubor
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Stáhnout
|
||||
downloadAltText = Stáhnout
|
||||
downloadFileName = Stáhnout { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromí a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky.
|
||||
downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromé a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Stáhnout
|
||||
.title = Stáhnout
|
||||
downloadNotification = Stahování bylo dokončeno.
|
||||
downloadFinish = Stahování dokončeno
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Vyzkoušejte Firefox Send
|
||||
.title = Vyzkoušejte Firefox Send
|
||||
downloadingPageProgress = Stahování { $filename } ({ $size })
|
||||
downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho.
|
||||
errorAltText
|
||||
.alt = Chyba při nahrávání souboru
|
||||
errorAltText = Chyba při nahrávání souboru
|
||||
errorPageHeader = Nastala chyba!
|
||||
errorPageMessage = Při nahrávání souboru se vyskytl problém.
|
||||
errorPageLink = Poslat další soubor
|
||||
fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Platnost odkazu vypršela
|
||||
linkExpiredAlt = Platnost odkazu vypršela
|
||||
expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval.
|
||||
notSupportedHeader = Váš prohlížeč není podporován.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Používání webové služby Firefox Send se řídí <a>Z
|
||||
deletePopupText = Smazat tento soubor?
|
||||
deletePopupYes = Ano
|
||||
deletePopupCancel = Zrušit
|
||||
deleteButtonHover
|
||||
.title = Smazat
|
||||
copyUrlHover
|
||||
.title = Kopírovat URL
|
||||
deleteButtonHover = Smazat
|
||||
copyUrlHover = Kopírovat URL
|
||||
footerLinkLegal = Právní informace
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = O programu Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Dysgu rhagor
|
||||
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.
|
||||
uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur
|
||||
.title = Dewiswch ffeil ar eich cyfrifiadur
|
||||
uploadPageBrowseButton1 = Dewiswch ffeil i'w llwytho i fyny
|
||||
.title = 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.
|
||||
uploadPageBrowseButtonTitle = Llwytho ffeil i fyny
|
||||
uploadingPageProgress = Llwytho $filename} i fyny ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Wrthi'n dadgryptio…
|
||||
notifyUploadDone = Mae eich llwytho wedi gorffen.
|
||||
uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod manylion dod i ben.
|
||||
uploadingPageCancel = Diddymu'r llwytho
|
||||
.title = Diddymu'r llwytho
|
||||
uploadCancelNotification = Cafodd eich llwytho ei ddiddymu.
|
||||
uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Arhoswch!
|
||||
uploadingFileNotification = Dweud wrtha i pan fydd y llwytho wedi gorffen.
|
||||
uploadSuccessConfirmHeader = Yn Barod i Anfon
|
||||
uploadSvgAlt
|
||||
.alt = 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.
|
||||
copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copïo i'r clipfwrdd
|
||||
.title = Copïo i'r clipfwrdd
|
||||
copiedUrl = Wedi eu copïo!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dileu ffeil
|
||||
.title = Dileu ffeil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Anfon ffeil arall
|
||||
.title = Anfon ffeil arall
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Llwytho i lawr
|
||||
downloadAltText = Llwytho i lawr
|
||||
downloadFileName = Llwytho i lawr { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Llwytho i Lawr
|
||||
.title = Llwytho i Lawr
|
||||
downloadNotification = Mae eich llwytho wedi gorffen
|
||||
downloadFinish = Llwytho wedi Gorffen
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } o { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Profwch Firefox Send
|
||||
.title = Profwch Firefox Send
|
||||
downloadingPageProgress = Llwytho i lawr { $filename } ({ $size })
|
||||
downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio.
|
||||
errorAltText
|
||||
.alt = Gwall llwytho
|
||||
errorAltText = Gwall llwytho
|
||||
errorPageHeader = Aeth rhywbeth o'i le!
|
||||
errorPageMessage = Bu gwall wrth lwytho'r ffeil.
|
||||
errorPageLink = Anfon ffeil arall
|
||||
fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Mae'r ddolen wedi dod i ben
|
||||
linkExpiredAlt = Mae'r ddolen wedi dod i ben
|
||||
expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed!
|
||||
notSupportedHeader = Nid yw eich porwr yn cael ei gynnal.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun <a>Hysby
|
||||
deletePopupText = Dileu'r ffeil?
|
||||
deletePopupYes = Iawn
|
||||
deletePopupCancel = Diddymu
|
||||
deleteButtonHover
|
||||
.title = Dileu
|
||||
copyUrlHover
|
||||
.title = Copïo'r URL
|
||||
deleteButtonHover = Dileu
|
||||
copyUrlHover = Copïo'r URL
|
||||
footerLinkLegal = Cyfreithiol
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ynghylch Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Mehr erfahren
|
||||
uploadPageDropMessage = Ziehen Sie eine Datei zum Hochladen hierher
|
||||
uploadPageSizeMessage = Dateien unter 1 GB sorgen für erhöhte Zuverlässigkeit des Betriebs
|
||||
uploadPageBrowseButton = Wählen Sie eine Datei auf Ihrem Computer aus
|
||||
.title = Wählen Sie eine Datei auf Ihrem Computer aus
|
||||
uploadPageBrowseButton1 = Datei zum Hochladen auswählen
|
||||
.title = Datei zum Hochladen auswählen
|
||||
uploadPageMultipleFilesAlert = Hochladen mehrerer Dateien oder eines Ordners wird derzeit nicht unterstützt.
|
||||
uploadPageBrowseButtonTitle = Datei hochladen
|
||||
uploadingPageProgress = { $filename } ({ $size }) wird hochgeladen
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Wird entschlüsselt…
|
||||
notifyUploadDone = Ihr Upload ist abgeschlossen.
|
||||
uploadingPageMessage = Sobald Ihre Datei hochgeladen wird, können Sie die Optionen zum Ablaufdatum auswählen.
|
||||
uploadingPageCancel = Hochladen abbrechen
|
||||
.title = Hochladen abbrechen
|
||||
uploadCancelNotification = Ihr Upload wurde abgebrochen.
|
||||
uploadingPageLargeFileMessage = Diese Datei ist groß, sodass das hochladen einige Zeit dauern könnte. Haben Sie Geduld!
|
||||
uploadingFileNotification = Mich benachrichtigen, wenn der Upload abgeschlossen ist.
|
||||
uploadSuccessConfirmHeader = Bereit zum Senden
|
||||
uploadSvgAlt
|
||||
.alt = Hochladen
|
||||
uploadSvgAlt = Hochladen
|
||||
uploadSuccessTimingHeader = Der Link zu Ihrer Datei läuft nach einem Download oder in 24 Stunden ab.
|
||||
copyUrlFormLabelWithName = Kopieren und teilen Sie den Link, um Ihre Datei zu senden: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = In Zwischenablage kopieren
|
||||
.title = In Zwischenablage kopieren
|
||||
copiedUrl = Kopiert!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Datei löschen
|
||||
.title = Datei löschen
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Eine weitere Datei senden
|
||||
.title = Eine weitere Datei senden
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Herunterladen
|
||||
downloadAltText = Herunterladen
|
||||
downloadFileName = { $filename } herunterladen
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Herunterladen
|
||||
.title = Herunterladen
|
||||
downloadNotification = Der Download wurde abgeschlossen.
|
||||
downloadFinish = Download abgeschlossen
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } von { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send ausprobieren
|
||||
.title = Firefox Send ausprobieren
|
||||
downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen
|
||||
downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird.
|
||||
errorAltText
|
||||
.alt = Fehler beim Hochladen
|
||||
errorAltText = Fehler beim Hochladen
|
||||
errorPageHeader = Ein Fehler ist aufgetreten!
|
||||
errorPageMessage = Beim Hochladen der Datei ist ein Fehler aufgetreten.
|
||||
errorPageLink = Eine weitere Datei senden
|
||||
fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein.
|
||||
linkExpiredAlt
|
||||
.alt = Link abgelaufen
|
||||
linkExpiredAlt = Link abgelaufen
|
||||
expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert!
|
||||
notSupportedHeader = Ihr Browser wird nicht unterstützt.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Die Nutzung der Website von Firefox Send unterliegt außerd
|
||||
deletePopupText = Diese Datei löschen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Abbrechen
|
||||
deleteButtonHover
|
||||
.title = Löschen
|
||||
copyUrlHover
|
||||
.title = Adresse kopieren
|
||||
deleteButtonHover = Löschen
|
||||
copyUrlHover = Adresse kopieren
|
||||
footerLinkLegal = Rechtliches
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Über Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Dalšne informacije
|
||||
uploadPageDropMessage = Śěgniśo swóju dataju sem, aby ju nagrał
|
||||
uploadPageSizeMessage = Wužywajśo nejlěpje dataje, kótarež su mjeńše ako 1 GB za lěpšu spušćobnosć.
|
||||
uploadPageBrowseButton = Wubjeŕśo dataju na swójom licadle
|
||||
.title = Wubjeŕśo dataju na swójom licadle
|
||||
uploadPageBrowseButton1 = Wubjeŕśo dataju za nagraśe
|
||||
.title = Wubjeŕśo dataju za nagraśe
|
||||
uploadPageMultipleFilesAlert = Nagrawanje někotarych datajow abo zarědnika se tuchylu njepódpěra.
|
||||
uploadPageBrowseButtonTitle = Dataju nagraś
|
||||
uploadingPageProgress = { $filename } ({ $size }) se nagrawa
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Dešifrěrujo se...
|
||||
notifyUploadDone = Wašo nagraśe jo dokóńcone.
|
||||
uploadingPageMessage = Gaž se waša dataja nagrawa, móžośo nastajenja spadnjenja póstajiś.
|
||||
uploadingPageCancel = Nagraśe pśetergnus
|
||||
.title = Nagraśe pśetergnus
|
||||
uploadCancelNotification = Wašo nagraśe jo se pśetergnuło.
|
||||
uploadingPageLargeFileMessage = Toś ta dataja jo wjelika a nagrawanje mógło chylku traś. Buźćo sćerpliwy!
|
||||
uploadingFileNotification = K wěsći daś, gaž nagraśe jo dokóńcone.
|
||||
uploadSuccessConfirmHeader = Gótowy za słanje
|
||||
uploadSvgAlt
|
||||
.alt = Nagraś
|
||||
uploadSvgAlt = Nagraś
|
||||
uploadSuccessTimingHeader = Wótkaz k wašej dataji pó 1 ześěgnjenju abo 24 góźinach spadnjo.
|
||||
copyUrlFormLabelWithName = Kopěrujśo a źělśo wótkaz, aby swóju dataju pósłał: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Do mjazywótkłada kopěrowaś
|
||||
.title = Do mjazywótkłada kopěrowaś
|
||||
copiedUrl = Kopěrowany!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dataju wulašowaś
|
||||
.title = Dataju wulašowaś
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Drugu dataju pósłaś
|
||||
.title = Drugu dataju pósłaś
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Ześěgnuś
|
||||
downloadAltText = Ześěgnuś
|
||||
downloadFileName = { $filename } ześěgnuś
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Ześěgnuś
|
||||
.title = Ześěgnuś
|
||||
downloadNotification = Wašo ześěgnjenje jo dokóńcone.
|
||||
downloadFinish = Ześěgnjenje dokóńcone
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send wopytaś
|
||||
.title = Firefox Send wopytaś
|
||||
downloadingPageProgress = { $filename } ({ $size }) se ześěgujo
|
||||
downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy.
|
||||
errorAltText
|
||||
.alt = Nagrawańska zmólka
|
||||
errorAltText = Nagrawańska zmólka
|
||||
errorPageHeader = Něco njejo se raźiło!
|
||||
errorPageMessage = Pśi nagrawanju dataje jo zmólka nastała.
|
||||
errorPageLink = Drugu dataju pósłaś
|
||||
fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś.
|
||||
linkExpiredAlt
|
||||
.alt = Wótkaz spadnjony
|
||||
linkExpiredAlt = Wótkaz spadnjony
|
||||
expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował!
|
||||
notSupportedHeader = Waš wobglědowak se njepódpěra.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Teke wužywanje websedła Firefox Send <a>pokazce priwatnos
|
||||
deletePopupText = Toś tu dataju lašowaś?
|
||||
deletePopupYes = Jo
|
||||
deletePopupCancel = Pśetergnuś
|
||||
deleteButtonHover
|
||||
.title = Wulašowaś
|
||||
copyUrlHover
|
||||
.title = URL kopěrowaś
|
||||
deleteButtonHover = Wulašowaś
|
||||
copyUrlHover = URL kopěrowaś
|
||||
footerLinkLegal = Pšawniske
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Wó Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Μάθετε περισσότερα
|
||||
uploadPageDropMessage = Εναποθέστε το αρχείο σας εδώ για έναρξη μεταφόρτωσης
|
||||
uploadPageSizeMessage = Για περισσότερο αξιόπιστη λειτουργία, προτείνεται να διατηρήσετε το αρχείο κάτω από 1GB
|
||||
uploadPageBrowseButton = Επιλέξτε αρχείο από τον υπολογιστή σας
|
||||
.title = Επιλέξτε αρχείο από τον υπολογιστή σας
|
||||
uploadPageBrowseButton1 = Επιλέξτε ένα αρχείο για μεταφόρτωση
|
||||
.title = Επιλέξτε ένα αρχείο για μεταφόρτωση
|
||||
uploadPageMultipleFilesAlert = Η μεταφόρτωση πολλαπλών αρχείων ή φακέλου δεν υποστηρίζεται αυτή τη στιγμή.
|
||||
uploadPageBrowseButtonTitle = Μεταφόρτωση αρχείου
|
||||
uploadingPageProgress = Μεταφόρτωση του { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Αποκρυπτογράφηση…
|
||||
notifyUploadDone = Η μεταφόρτωσή σας ολοκληρώθηκε.
|
||||
uploadingPageMessage = Αφού μεταφορτωθούν τα αρχεία σας, θα μπορείτε να ορίσετε επιλογές λήξης.
|
||||
uploadingPageCancel = Ακύρωση μεταφόρτωσης
|
||||
.title = Ακύρωση μεταφόρτωσης
|
||||
uploadCancelNotification = Η μεταφόρτωσή σας ακυρώθηκε.
|
||||
uploadingPageLargeFileMessage = Αυτό το αρχείο είναι μεγάλο και ίσως χρειαστεί λίγος αρκετός χρόνος για μεταφόρτωση. Χαλαρώστε!
|
||||
uploadingFileNotification = Ειδοποίηση όταν ολοκληρωθεί η μεταφόρτωση.
|
||||
uploadSuccessConfirmHeader = Έτοιμο για αποστολή
|
||||
uploadSvgAlt
|
||||
.alt = Μεταφόρτωση
|
||||
uploadSvgAlt = Μεταφόρτωση
|
||||
uploadSuccessTimingHeader = Ο σύνδεσμος του αρχείου σας θα λήξει έπειτα από 1 λήψη ή 24 ώρες.
|
||||
copyUrlFormLabelWithName = Αντιγράψτε και μοιραστείτε τον σύνδεσμο για αποστολή του αρχείου σας : { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Αντιγραφή στο πρόχειρο
|
||||
.title = Αντιγραφή στο πρόχειρο
|
||||
copiedUrl = Αντιγράφτηκε!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Διαγραφή αρχείου
|
||||
.title = Διαγραφή αρχείου
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Αποστολή άλλου αρχείου
|
||||
.title = Αποστολή άλλου αρχείου
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Λήψη
|
||||
downloadAltText = Λήψη
|
||||
downloadFileName = Λήψη του { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Ο/Η φίλος/-η σας, σάς στέλνει ένα αρχείο με τη βοήθεια του Firefox Send, μιας υπηρεσίας που επιτρέπει τον διαμοιρασμό αρχείων μέσω ενός ασφαλούς, ιδιωτικού και κρυπτογραφημένου συνδέσμου που λήγει αυτόματα, ώστε να είστε σίγουροι ότι τα αρχεία σας δεν θα παραμείνουν στο διαδίκτυο για πάντα.
|
||||
// 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 })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Δοκιμάστε το Firefox Send
|
||||
.title = Δοκιμάστε το Firefox Send
|
||||
downloadingPageProgress = Γίνεται λήψη του { $filename } ({ $size })
|
||||
downloadingPageMessage = Παρακαλώ αφήστε ανοικτή αυτή την καρτέλα όσο λαμβάνουμε και αποκρυπτογραφούμε το αρχείο σας.
|
||||
errorAltText
|
||||
.alt = Σφάλμα μεταφόρτωσης
|
||||
errorAltText = Σφάλμα μεταφόρτωσης
|
||||
errorPageHeader = Κάτι πήγε στραβά!
|
||||
errorPageMessage = Παρουσιάστηκε σφάλμα κατά τη μεταφόρτωση του αρχείου.
|
||||
errorPageLink = Αποστολή άλλου αρχείου
|
||||
fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Ο σύνδεσμος έληξε
|
||||
linkExpiredAlt = Ο σύνδεσμος έληξε
|
||||
expiredPageHeader = Αυτός ο σύνδεσμος έχει λήξει ή δεν υπήρξε ποτέ!
|
||||
notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Η χρήση της ιστοσελίδας Firefox Send υ
|
||||
deletePopupText = Διαγραφή αρχείου;
|
||||
deletePopupYes = Ναι
|
||||
deletePopupCancel = Ακύρωση
|
||||
deleteButtonHover
|
||||
.title = Διαγραφή
|
||||
copyUrlHover
|
||||
.title = Αντιγραφή URL
|
||||
deleteButtonHover = Διαγραφή
|
||||
copyUrlHover = Αντιγραφή URL
|
||||
footerLinkLegal = Νομικά
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Σχετικά με το Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Learn more
|
||||
uploadPageDropMessage = Drop your file here to start uploading
|
||||
uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB
|
||||
uploadPageBrowseButton = Select a file on your computer
|
||||
.title = Select a file on your computer
|
||||
uploadPageBrowseButton1 = Select a file to upload
|
||||
.title = Select a file to upload
|
||||
uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported.
|
||||
uploadPageBrowseButtonTitle = Upload file
|
||||
uploadingPageProgress = Uploading { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Decrypting…
|
||||
notifyUploadDone = Your upload has finished.
|
||||
uploadingPageMessage = Once your file uploads you will be able to set expiry options.
|
||||
uploadingPageCancel = Cancel upload
|
||||
.title = Cancel upload
|
||||
uploadCancelNotification = Your upload was cancelled.
|
||||
uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight!
|
||||
uploadingFileNotification = Notify me when the upload is complete.
|
||||
uploadSuccessConfirmHeader = Ready to Send
|
||||
uploadSvgAlt
|
||||
.alt = Upload
|
||||
uploadSvgAlt = Upload
|
||||
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
|
||||
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copy to clipboard
|
||||
.title = Copy to clipboard
|
||||
copiedUrl = Copied!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Delete file
|
||||
.title = Delete file
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Send another file
|
||||
.title = Send another file
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Download
|
||||
downloadAltText = Download
|
||||
downloadFileName = Download { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Download
|
||||
.title = Download
|
||||
downloadNotification = Your download has completed.
|
||||
downloadFinish = Download Complete
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } of { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Try Firefox Send
|
||||
.title = Try Firefox Send
|
||||
downloadingPageProgress = Downloading { $filename } ({ $size })
|
||||
downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it.
|
||||
errorAltText
|
||||
.alt = Upload error
|
||||
errorAltText = Upload error
|
||||
errorPageHeader = Something went wrong!
|
||||
errorPageMessage = There has been an error uploading the file.
|
||||
errorPageLink = Send another file
|
||||
fileTooBig = That file is too big to upload. It should be less than { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Link expired
|
||||
linkExpiredAlt = Link expired
|
||||
expiredPageHeader = This link has expired or never existed in the first place!
|
||||
notSupportedHeader = Your browser is not supported.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Use of the Firefox Send website is also subject to Mozilla
|
||||
deletePopupText = Delete this file?
|
||||
deletePopupYes = Yes
|
||||
deletePopupCancel = Cancel
|
||||
deleteButtonHover
|
||||
.title = Delete
|
||||
copyUrlHover
|
||||
.title = Copy URL
|
||||
deleteButtonHover = Delete
|
||||
copyUrlHover = Copy URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = About Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Conocer más
|
||||
uploadPageDropMessage = Arrastrá el archivo hasta acá para empezar a subir
|
||||
uploadPageSizeMessage = Para una operación más confiable, es mejor que el archivo tenga menos de 1GB
|
||||
uploadPageBrowseButton = Seleccioná un archivo en tu computadora
|
||||
.title = Seleccioná un archivo en tu computadora
|
||||
uploadPageBrowseButton1 = Seleccioná un archivo para subir
|
||||
.title = Seleccioná un archivo para subir
|
||||
uploadPageMultipleFilesAlert = Cargar múltiples archivos o una carpeta todavía no está soportado.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageProgress = Subiendo { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Descifrando…
|
||||
notifyUploadDone = La carga ha terminado.
|
||||
uploadingPageMessage = Una vez que se cargue el archivo podrás modificar las opciones de expiración.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = La subida fue cancelada.
|
||||
uploadingPageLargeFileMessage = El archivo es grande y puede tardar un rato en subir. ¡Quedate quieto!
|
||||
uploadingFileNotification = Notificarme cuando la subida se complete.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSvgAlt = Subir
|
||||
uploadSuccessTimingHeader = El enlace al archivo expirará después de 1 descarga o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copiá y compartí el enlace para enviar tu archivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar al portapapeles
|
||||
.title = Copiar al portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Borrar archivo
|
||||
.title = Borrar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadAltText = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que permite compartir archivos con un enlace cifrado, seguro y privado que expira automáticamente para asegurar que tus datos no quedan en línea para siempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = La descarga se completó.
|
||||
downloadFinish = Descarga completa
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Probá Firefox Send
|
||||
.title = Probá Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Dejá esta pestaña abierta mientras descargamos el archivo y lo desciframos.
|
||||
errorAltText
|
||||
.alt = Error de subida
|
||||
errorAltText = Error de subida
|
||||
errorPageHeader = ¡Algo falló!
|
||||
errorPageMessage = Hubo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace explirado
|
||||
linkExpiredAlt = Enlace explirado
|
||||
expiredPageHeader = ¡Este enlace ha expirado o nunca existió en primer lugar!
|
||||
notSupportedHeader = El navegador no está soportado.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto
|
||||
deletePopupText = ¿Borrar este archivo?
|
||||
deletePopupYes = Si
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Borrar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
deleteButtonHover = Borrar
|
||||
copyUrlHover = Copiar URL
|
||||
footerLinkLegal = Legales
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca de Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Aprender más
|
||||
uploadPageDropMessage = Suelta tu archivo aquí para empezar a subirlo
|
||||
uploadPageSizeMessage = Para una operación más confiable, es mejor mantener el tamaño del archivo bajo 1 GB
|
||||
uploadPageBrowseButton = Selecciona un archivo en tu computador
|
||||
.title = Selecciona un archivo en tu computador
|
||||
uploadPageBrowseButton1 = Selecciona un archivo a subir
|
||||
.title = Selecciona un archivo a subir
|
||||
uploadPageMultipleFilesAlert = Subir múltiples archivos o una carpeta actualmente no es posible.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageProgress = Subiendo { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Descifrando…
|
||||
notifyUploadDone = Tu subida ha terminado.
|
||||
uploadingPageMessage = Una vez que tu archivo sea subido podrás ajustar las opciones de expiración.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = Tu subida fue cancelada.
|
||||
uploadingPageLargeFileMessage = Este archivo es grande y puede tardar un rato en subir. ¡Aprovecha de hacer algo mientras!
|
||||
uploadingFileNotification = Notificarme cuando la subida sea completada.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSvgAlt = Subir
|
||||
uploadSuccessTimingHeader = El enlace a tu archivo expirará tras 1 descarga o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copia y comparte el enlace para enviar tu archivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar al portapapeles
|
||||
.title = Copiar al portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
.title = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadAltText = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que expira automáticamente para asegurar que tus cosas no queden en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = Tu descarga se completó.
|
||||
downloadFinish = Descarga completa
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Probar Firefox Send
|
||||
.title = Probar Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Por favor, deja esta pestaña abierta mientras recibimos tu archivo y lo desciframos.
|
||||
errorAltText
|
||||
.alt = Error de subida
|
||||
errorAltText = Error de subida
|
||||
errorPageHeader = ¡Algo se fue a las pailas!
|
||||
errorPageMessage = Hubo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace expirado
|
||||
linkExpiredAlt = Enlace expirado
|
||||
expiredPageHeader = ¡Este enlace ha expirado o quizá jamás existió!
|
||||
notSupportedHeader = Tu navegador no está soportado.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto
|
||||
deletePopupText = ¿Eliminar este archivo?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Eliminar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
deleteButtonHover = Eliminar
|
||||
copyUrlHover = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca de Test Pilot
|
||||
|
||||
@@ -2,15 +2,13 @@
|
||||
title = Firefox Send
|
||||
siteSubtitle = experimento web
|
||||
siteFeedback = Comentario
|
||||
uploadPageHeader = Compartir archivos encriptados y privados
|
||||
uploadPageExplainer = Envía archivos a través de un enlace encriptado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida.
|
||||
uploadPageHeader = Compartir archivos cifrados y privados
|
||||
uploadPageExplainer = Envía archivos a través de un enlace cifrado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida.
|
||||
uploadPageLearnMore = Descubre más
|
||||
uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo
|
||||
uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB
|
||||
uploadPageBrowseButton = Seleccionar un archivo en el equipo
|
||||
.title = Seleccionar un archivo en el equipo
|
||||
uploadPageBrowseButton1 = Seleccionar un archivo para subir
|
||||
.title = Seleccionar un archivo para subir
|
||||
uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageProgress = Subiendo { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Desencriptando...
|
||||
notifyUploadDone = La subida ha finalizado.
|
||||
uploadingPageMessage = Cuando se suba tu archivo podrás condigurar las opciones de caducidad.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = Se canceló la subida.
|
||||
uploadingPageLargeFileMessage = El archivo es grande y puede tardar unos minutos en subirse. ¡Tómatelo con calma!
|
||||
uploadingFileNotification = Notificarme cuando se complete la subida.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSvgAlt = Subir
|
||||
uploadSuccessTimingHeader = El enlace al archivo caducará tras descargarlo una vez o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar en el portapapeles
|
||||
.title = Copiar en el portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
.title = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadAltText = Descargar
|
||||
downloadFileName = Descargar { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
|
||||
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = Se completó la descarga.
|
||||
downloadFinish = Descarga completa
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Prueba Firefox Send
|
||||
.title = Prueba Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
|
||||
errorAltText
|
||||
.alt = Error en la subida
|
||||
errorAltText = Error en la subida
|
||||
errorPageHeader = ¡Se produjo un error!
|
||||
errorPageMessage = Se produjo un error al subir el archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace caducado
|
||||
linkExpiredAlt = Enlace caducado
|
||||
expiredPageHeader = ¡El enlace ha caducado o nunca existió!
|
||||
notSupportedHeader = Tu navegador no está admitido.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto
|
||||
deletePopupText = ¿Eliminar el archivo?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Eliminar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
deleteButtonHover = Eliminar
|
||||
copyUrlHover = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Sobre Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Saber más
|
||||
uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo
|
||||
uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB
|
||||
uploadPageBrowseButton = Selecciona un archivo de tu computadora
|
||||
.title = Selecciona un archivo de tu computadora
|
||||
uploadPageBrowseButton1 = Seleccionar un archivo para subir
|
||||
.title = Seleccionar un archivo para subir
|
||||
uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta.
|
||||
uploadPageBrowseButtonTitle = Subir archivo
|
||||
uploadingPageProgress = Subiendo { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Desencriptando...
|
||||
notifyUploadDone = La subida ha terminado.
|
||||
uploadingPageMessage = Una vez que tu archivo haya subido podrás configurar las opciones de caducidad.
|
||||
uploadingPageCancel = Cancelar subida
|
||||
.title = Cancelar subida
|
||||
uploadCancelNotification = Se canceló la subida.
|
||||
uploadingPageLargeFileMessage = Este archivo es grande y puede tomar un rato para que suba. ¡Mantente tranquilo!
|
||||
uploadingFileNotification = Avísame cuando la subida del archivo esté completa.
|
||||
uploadSuccessConfirmHeader = Listo para enviar
|
||||
uploadSvgAlt
|
||||
.alt = Subir
|
||||
uploadSvgAlt = Subir
|
||||
uploadSuccessTimingHeader = El enlace a tu archivo expirará después de una descarga o en 24 horas.
|
||||
copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: ($filename)
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copiar a portapapeles
|
||||
.title = Copiar a portapapeles
|
||||
copiedUrl = ¡Copiado!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Eliminar archivo
|
||||
.title = Eliminar archivo
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Enviar otro archivo
|
||||
.title = Enviar otro archivo
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Descargar
|
||||
downloadAltText = Descargar
|
||||
downloadFileName = Descargar ($filename)
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Descargar
|
||||
.title = Descargar
|
||||
downloadNotification = Tu descarga se ha completado
|
||||
downloadFinish = Descarga completa
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } de { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Prueba Firefox Send
|
||||
.title = Prueba Firefox Send
|
||||
downloadingPageProgress = Descargando { $filename } ({ $size })
|
||||
downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos.
|
||||
errorAltText
|
||||
.alt = Error en la subida
|
||||
errorAltText = Error en la subida
|
||||
errorPageHeader = ¡Algo salió mal!
|
||||
errorPageMessage = Ha ocurrido un error mientras subiamos tu archivo.
|
||||
errorPageLink = Enviar otro archivo
|
||||
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Enlace caducado
|
||||
linkExpiredAlt = Enlace caducado
|
||||
expiredPageHeader = ¡Este enlace ha caducado o nunca existió en primer lugar!
|
||||
notSupportedHeader = Tu navegador no está soportado.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto
|
||||
deletePopupText = ¿Eliminar este archivo?
|
||||
deletePopupYes = Sí
|
||||
deletePopupCancel = Cancelar
|
||||
deleteButtonHover
|
||||
.title = Eliminar
|
||||
copyUrlHover
|
||||
.title = Copiar URL
|
||||
deleteButtonHover = Eliminar
|
||||
copyUrlHover = Copiar URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Acerca de Test Pilot
|
||||
|
||||
80
public/locales/et/send.ftl
Normal file
@@ -0,0 +1,80 @@
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
title = Firefox Send
|
||||
siteSubtitle = veebieksperiment
|
||||
siteFeedback = Tagasiside
|
||||
uploadPageHeader = Privaatne ja krüpteeritud failiedastus
|
||||
uploadPageExplainer = Firefox Send võimaldab saata faile üle ohutu, privaatse ja krüpteeritud kanali. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks.
|
||||
uploadPageLearnMore = Rohkem teavet
|
||||
uploadPageDropMessage = Faili üleslaadimiseks lohista see siia
|
||||
uploadPageSizeMessage = Parima kogemuse saamiseks tasub faili suurus hoida alla 1GB
|
||||
uploadPageBrowseButton = Vali fail arvutist
|
||||
uploadPageBrowseButton1 = Vali fail üleslaadimiseks
|
||||
uploadPageMultipleFilesAlert = Mitme faili või kausta üleslaadimine pole praegu toetatud.
|
||||
uploadPageBrowseButtonTitle = Laadi fail üles
|
||||
uploadingPageProgress = Faili { $filename } ({ $size }) üleslaadimine
|
||||
importingFile = Importimine...
|
||||
verifyingFile = Kontrollimine…
|
||||
encryptingFile = Krüptimine…
|
||||
decryptingFile = Dekrüptimine...
|
||||
notifyUploadDone = Üleslaadimine on lõpetatud.
|
||||
uploadingPageMessage = Aegumise sätteid saab muuta siis, kui faili üles laaditakse.
|
||||
uploadingPageCancel = Katkesta üleslaadimine
|
||||
uploadCancelNotification = Üleslaadimine katkestati
|
||||
uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta.
|
||||
uploadSuccessConfirmHeader = Saatmiseks valmis
|
||||
uploadSvgAlt = Laadi üles
|
||||
uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel.
|
||||
copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename }
|
||||
copyUrlFormButton = Kopeeri vahemällu
|
||||
copiedUrl = Kopeeritud!
|
||||
deleteFileButton = Kustuta fail
|
||||
sendAnotherFileLink = Saada järgmine fail
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = Laadi alla
|
||||
downloadFileName = Laadi fail { $filename } alla
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Sulle on saadetud fail Firefox Sendiga - teenusega, mis lubab faile ohutult, privaatselt ja krüpteeritult jagada. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Laadi alla
|
||||
downloadNotification = Allalaadimine on lõpetatud.
|
||||
downloadFinish = Allalaadimine lõpetati
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize }/{ $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Proovi Firefox Sendi
|
||||
downloadingPageProgress = Faili { $filename } ({ $size }) allalaadimine
|
||||
downloadingPageMessage = Palun jäta see kaart lahti, kuni fail on alla laaditud ja dekrüptitud.
|
||||
errorAltText = Viga üleslaadimisel
|
||||
errorPageHeader = Midagi läks valesti!
|
||||
errorPageMessage = Faili üleslaadimisel esines viga.
|
||||
errorPageLink = Saada järgmine fail
|
||||
fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }.
|
||||
linkExpiredAlt = Link on aegunud
|
||||
expiredPageHeader = See link on aegunud või seda pole kunagi olnudki!
|
||||
notSupportedHeader = Sinu brauser pole toetatud.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = Kahjuks ei toeta see brauser veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead proovima teise brauseriga. Me soovitame Firefoxi!
|
||||
notSupportedLink = Miks mu brauser toetatud pole?
|
||||
notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama.
|
||||
updateFirefox = Uuenda Firefox
|
||||
downloadFirefoxButtonSub = Laadi alla tasuta
|
||||
uploadedFile = Fail
|
||||
copyFileList = Kopeeri URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Aegub
|
||||
deleteFileList = Kustuta
|
||||
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>.
|
||||
legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla <a>veebilehtede privaatsusreeglid</a> ja <a>veebilehtede teenusetingimused</a>.
|
||||
deletePopupText = Kas kustutada see fail?
|
||||
deletePopupYes = Jah
|
||||
deletePopupCancel = Loobu
|
||||
deleteButtonHover = Kustuta
|
||||
copyUrlHover = Kopeeri URL
|
||||
footerLinkLegal = Õiguslik teave
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilotist
|
||||
footerLinkPrivacy = Privaatsusest
|
||||
footerLinkTerms = Teenusetingimused
|
||||
footerLinkCookies = Küpsistest
|
||||
@@ -2,6 +2,63 @@
|
||||
title = Firefox Send
|
||||
siteSubtitle = آزمایش وب
|
||||
siteFeedback = بازخورد
|
||||
uploadPageHeader = اشتراکگذاری پروندهها، رمزنگاری شده و خصوصی
|
||||
uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند.
|
||||
uploadPageLearnMore = بیشتر بدانید
|
||||
uploadPageDropMessage = برای شروع بارگذاری پروندههای خود را اینجا بیاندازید
|
||||
uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پروندهتان کمتر از ۱ گیگابایت باشد
|
||||
uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید
|
||||
uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید
|
||||
uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمیشود.
|
||||
uploadPageBrowseButtonTitle = بارگذاری پرونده
|
||||
uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size })
|
||||
importingFile = در حال وارد کردن…
|
||||
verifyingFile = در حال تایید…
|
||||
encryptingFile = در حال رمزنگاری…
|
||||
decryptingFile = در حال رمزگشایی…
|
||||
notifyUploadDone = بارگذاری شما پایان یافت.
|
||||
uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید.
|
||||
uploadingPageCancel = لغو بارگذاری
|
||||
uploadCancelNotification = بارگذاری شما لغو شد
|
||||
uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید!
|
||||
uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده.
|
||||
uploadSuccessConfirmHeader = آماده برای ارسال
|
||||
uploadSvgAlt = بارگذاری
|
||||
uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد.
|
||||
copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename }
|
||||
copyUrlFormButton = رونوشت به کلیپبورد
|
||||
copiedUrl = رونوشت شد!
|
||||
deleteFileButton = حذف پرونده
|
||||
sendAnotherFileLink = ارسال پرونده دیگر
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText = دریافت
|
||||
downloadFileName = بارگیری { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است، این سرویس این امکان را به شما میدهد تا پروندههای خود را به صورت ایمن،خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = بارگیری
|
||||
downloadNotification = بارگیری شما کامل شد.
|
||||
downloadFinish = بارگیری کامل شد
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } از { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send را امتحان کنید
|
||||
downloadingPageProgress = دریافت { $filename } ({ $size })
|
||||
downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت میکنیم و کدگذاری میکنیم.
|
||||
errorAltText = خطا در بارگذاری
|
||||
errorPageHeader = چیزی دچار اشکال شده است!
|
||||
errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است.
|
||||
errorPageLink = پرونده دیگری ارسال کنید.
|
||||
fileTooBig = این پرونده بسیار حجیم است. حجم آن میبایستی کم تر { $size } باشد.
|
||||
linkExpiredAlt = پیوند منقضی شده است
|
||||
expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است!
|
||||
notSupportedHeader = مرورگر شما پشتیبانی نمیکند.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است !
|
||||
notSupportedLink = چرا مرورگر من پشتیبانی نمیکند؟
|
||||
notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت میبخشد را پشتیبانی نمیکند. شما نیاز دارید تا مرورگر خود را بروز کنید.
|
||||
updateFirefox = بروزرسانی فایرفاکس
|
||||
downloadFirefoxButtonSub = دریافت رایگان
|
||||
uploadedFile = پرونده
|
||||
copyFileList = رونوشت از نشانی
|
||||
@@ -10,13 +67,13 @@ expiryFileList = زمان انقضا
|
||||
deleteFileList = حذف
|
||||
nevermindButton = بیخیال
|
||||
legalHeader = شرایط و حریمخصوصی
|
||||
legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت میدهد و تحت عنوان خلبان آموزشی <a>شرایط و خدمات</a> و <a>موارد حریم خصوصی </a> کار میکند. شما میتوانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره میکنید را از <a> اینجا </a> کسب کنید.
|
||||
legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. <a>پایگاه اینترنتی نکات حریم شخصی </a> و <a> پایگاه اطلاع رسانی شرایط خدمات و استفاده </a>.
|
||||
deletePopupText = حذف این پرونده؟
|
||||
deletePopupYes = بله
|
||||
deletePopupCancel = انصراف
|
||||
deleteButtonHover
|
||||
.title = حذف
|
||||
copyUrlHover
|
||||
.title = رونوشت از نشانی
|
||||
deleteButtonHover = حذف
|
||||
copyUrlHover = رونوشت از نشانی
|
||||
footerLinkLegal = ملاحظات حقوقی
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = درباره Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = En savoir plus
|
||||
uploadPageDropMessage = Déposez votre fichier ici pour l’envoyer
|
||||
uploadPageSizeMessage = Pour un résultat fiable, il est conseillé d’utiliser des fichiers de taille inférieure à 1 Go
|
||||
uploadPageBrowseButton = Sélectionner un fichier sur l’ordinateur
|
||||
.title = Sélectionner un fichier sur l’ordinateur
|
||||
uploadPageBrowseButton1 = Choisir un fichier à envoyer
|
||||
.title = Choisir un fichier à envoyer
|
||||
uploadPageMultipleFilesAlert = L’envoi de plusieurs fichiers ou de dossiers n’est pas pris en charge pour le moment.
|
||||
uploadPageBrowseButtonTitle = Envoyer le fichier
|
||||
uploadingPageProgress = Envoi en cours de { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Déchiffrement…
|
||||
notifyUploadDone = L’envoi est terminé.
|
||||
uploadingPageMessage = Une fois l’envoi terminé, vous serez en mesure de régler les options d’expiration.
|
||||
uploadingPageCancel = Annuler l’envoi
|
||||
.title = Annuler l’envoi
|
||||
uploadCancelNotification = L’envoi a été annulé.
|
||||
uploadingPageLargeFileMessage = Ce fichier est volumineux et son envoi peut prendre un peu de temps.
|
||||
uploadingFileNotification = M’envoyer une notification lorsque l’envoi est terminé.
|
||||
uploadSuccessConfirmHeader = Paré à l’envoi
|
||||
uploadSvgAlt
|
||||
.alt = Envoyer
|
||||
uploadSvgAlt = Envoyer
|
||||
uploadSuccessTimingHeader = Le lien vers votre fichier expirera après le premier téléchargement ou au bout de 24 heures.
|
||||
copyUrlFormLabelWithName = Copiez et partagez le lien pour envoyer votre fichier : { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copier dans le presse-papiers
|
||||
.title = Copier dans le presse-papiers
|
||||
copiedUrl = Lien copié !
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Supprimer le fichier
|
||||
.title = Supprimer le fichier
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Envoyer un autre fichier
|
||||
.title = Envoyer un autre fichier
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Télécharger
|
||||
downloadAltText = Télécharger
|
||||
downloadFileName = Télécharger { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet d’envoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Télécharger
|
||||
.title = Télécharger
|
||||
downloadNotification = Le téléchargement est terminé.
|
||||
downloadFinish = Téléchargement terminé
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } sur { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Essayer Firefox Send
|
||||
.title = Essayer Firefox Send
|
||||
downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size })
|
||||
downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons.
|
||||
errorAltText
|
||||
.alt = Erreur lors de l’envoi
|
||||
errorAltText = Erreur lors de l’envoi
|
||||
errorPageHeader = Une erreur s’est produite.
|
||||
errorPageMessage = Une erreur s’est produite lors de l’envoi du fichier.
|
||||
errorPageLink = Envoyer un autre fichier
|
||||
fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit être inférieure à { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Le lien a expiré
|
||||
linkExpiredAlt = Le lien a expiré
|
||||
expiredPageHeader = Ce lien a expiré ou n’a jamais existé.
|
||||
notSupportedHeader = Votre navigateur n’est pas pris en charge.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = L’utilisation du site web Firefox Send est aussi soumise
|
||||
deletePopupText = Supprimer ce fichier ?
|
||||
deletePopupYes = Oui
|
||||
deletePopupCancel = Annuler
|
||||
deleteButtonHover
|
||||
.title = Supprimer
|
||||
copyUrlHover
|
||||
.title = Copier le lien
|
||||
deleteButtonHover = Supprimer
|
||||
copyUrlHover = Copier le lien
|
||||
footerLinkLegal = Mentions légales
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = À propos de Test Pilot
|
||||
|
||||
@@ -8,10 +8,10 @@ uploadPageLearnMore = Mear ynfo
|
||||
uploadPageDropMessage = Sleep jo bestân hjir hinne om opladen te starten
|
||||
uploadPageSizeMessage = Foar de meast betroubere wurking, is it it bêste om jo bestân lytser as 1 GB te hâlden
|
||||
uploadPageBrowseButton = Selektearje in bestân op jo kompjûter
|
||||
.title = Selektearje in bestân op jo kompjûter
|
||||
uploadPageBrowseButton1 = Selektearje in bestân om op te laden
|
||||
uploadPageMultipleFilesAlert = Opladen fan mear bestannen tagelyk of in map wurdt op dit stuit net stipe.
|
||||
uploadPageBrowseButtonTitle = Bestân oplade
|
||||
uploadingPageHeader = Jo bestân wurdt opladen
|
||||
uploadingPageProgress = { $filename } ({ $size }) wurdt oplaad
|
||||
importingFile = Ymportearje…
|
||||
verifyingFile = Ferifiearje…
|
||||
encryptingFile = Fersiferje…
|
||||
@@ -19,50 +19,39 @@ decryptingFile = Untsiferje…
|
||||
notifyUploadDone = Jo oplaad is foltôge.
|
||||
uploadingPageMessage = Sa gau as jo bestân opladen wurdt, kinne jo de opsjes foar de ferrindatum ynstelle.
|
||||
uploadingPageCancel = Opladen annulearje
|
||||
.title = Opladen annulearje
|
||||
uploadCancelNotification = Jo oplaad is annulearre.
|
||||
uploadingPageLargeFileMessage = Dit is in grut bestân en it opladen kin efkes duorje. In amerijke!
|
||||
uploadingFileNotification = Jou in melding as de oplaad foltôge is.
|
||||
uploadSuccessConfirmHeader = Ree om te ferstjoeren
|
||||
uploadSvgAlt
|
||||
.alt = Oplaad
|
||||
uploadSvgAlt = Oplaad
|
||||
uploadSuccessTimingHeader = De keppeling nei jo bestân sil nei 1 download ferrinne of nei 24 oeren.
|
||||
copyUrlFormLabelWithName = Kopiearje en diel de keppeling om jo bestân te ferstjoeren: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Nei klamboerd kopiearje
|
||||
.title = Nei klamboerd kopiearje
|
||||
copiedUrl = Kopiearre!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Bestân fuortsmite
|
||||
.title = Bestân fuortsmite
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Noch in bestân ferstjoere
|
||||
.title = Noch in bestân ferstjoere
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Downloade
|
||||
downloadAltText = Downloade
|
||||
downloadFileName = { $filename } downloade
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Downloade
|
||||
.title = Downloade
|
||||
downloadNotification = Jo download is foltôge.
|
||||
downloadFinish = Download foltôge
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } fan { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send probearje
|
||||
.title = Firefox Send probearje
|
||||
downloadingPageProgress = { $filename } ({ $size }) wurdt download
|
||||
downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje.
|
||||
errorAltText
|
||||
.alt = Oplaadflater
|
||||
errorAltText = Oplaadflater
|
||||
errorPageHeader = Der is wat misgien!
|
||||
errorPageMessage = Der is in flater bard wylst it opladen fan jo bestân.
|
||||
errorPageLink = Noch in bestân ferstjoere
|
||||
fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Keppeling ferrûn
|
||||
linkExpiredAlt = Keppeling ferrûn
|
||||
expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien!
|
||||
notSupportedHeader = Jo browser wurdt net stipe.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -83,10 +72,8 @@ legalNoticeMozilla = Gebrûk fan de Firefox Send-website falt ek ûnder it <a>We
|
||||
deletePopupText = Dit bestân fuortsmite
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Annulearje
|
||||
deleteButtonHover
|
||||
.title = Fuortsmite
|
||||
copyUrlHover
|
||||
.title = URL kopiearje
|
||||
deleteButtonHover = Fuortsmite
|
||||
copyUrlHover = URL kopiearje
|
||||
footerLinkLegal = Juridysk
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Oer Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Dalše informacije
|
||||
uploadPageDropMessage = Ćehńće swoju dataju sem, zo byšće ju nahrał
|
||||
uploadPageSizeMessage = Wužiwajće najlěpje dataje, kotrež su mjeńše hač 1 GB za lěpšu spušćomnosć.
|
||||
uploadPageBrowseButton = Wubjerće dataju na swojim ličaku
|
||||
.title = Wubjerće dataju na swojim ličaku
|
||||
uploadPageBrowseButton1 = Wubjerće dataju za nahraće
|
||||
.title = Wubjerće dataju za nahraće
|
||||
uploadPageMultipleFilesAlert = Nahrawanje wjacorych datajow abo rjadowaka so tuchwilu njepodpěruje.
|
||||
uploadPageBrowseButtonTitle = Dataju nahrać
|
||||
uploadingPageProgress = { $filename } ({ $size }) so nahrawa
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Dešifruje so...
|
||||
notifyUploadDone = Waše nahraće je dokónčene.
|
||||
uploadingPageMessage = Hdyž so waša dataja nahrawa, móžeće nastajenja spadnjenja postajić.
|
||||
uploadingPageCancel = Nahraće přetorhnyć
|
||||
.title = Nahraće přetorhnyć
|
||||
uploadCancelNotification = Waše nahraće je so přetorhnyło.
|
||||
uploadingPageLargeFileMessage = Tuta dataja je wulka a nahrawanje móhło chwilku trać. Budźće sćerpliwy!
|
||||
uploadingFileNotification = Zdźělić, hdyž nahraće je dokónčene.
|
||||
uploadSuccessConfirmHeader = Hotowy za słanje
|
||||
uploadSvgAlt
|
||||
.alt = Nahrać
|
||||
uploadSvgAlt = Nahrać
|
||||
uploadSuccessTimingHeader = Wotkaz k wašej dataji po 1 sćehnjenju abo 24 hodźinach spadnje.
|
||||
copyUrlFormLabelWithName = Kopěrujće a dźělće wotkaz, zo byšće swoju dataju pósłał: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Do mjezyskłada kopěrować
|
||||
.title = Do mjezyskłada kopěrować
|
||||
copiedUrl = Kopěrowany!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Dataju zhašeć
|
||||
.title = Dataju zhašeć
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Druhu dataju pósłać
|
||||
.title = Druhu dataju pósłać
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Sćahnyć
|
||||
downloadAltText = Sćahnyć
|
||||
downloadFileName = { $filename } sćahnyć
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Sćahnyć
|
||||
.title = Sćahnyć
|
||||
downloadNotification = Waše sćehnjenje je dokónčene.
|
||||
downloadFinish = Sćehnjenje dokónčene
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } z { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send wupruwować
|
||||
.title = Firefox Send wupruwować
|
||||
downloadingPageProgress = { $filename } ({ $size }) so sćahuje
|
||||
downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy.
|
||||
errorAltText
|
||||
.alt = Nahrawanski zmylk
|
||||
errorAltText = Nahrawanski zmylk
|
||||
errorPageHeader = Něšto je so nimokuliło!
|
||||
errorPageMessage = Při nahrawanju dataje je zmylk wustupił.
|
||||
errorPageLink = Druhu dataju pósłać
|
||||
fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size } być.
|
||||
linkExpiredAlt
|
||||
.alt = Wotkaz je spadnjeny
|
||||
linkExpiredAlt = Wotkaz je spadnjeny
|
||||
expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował!
|
||||
notSupportedHeader = Waš wobhladowak so njepodpěruje.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Tež wužiwanje websydła Firefox Send <a>pokazce priwatnos
|
||||
deletePopupText = Tutu dataju zhašeć?
|
||||
deletePopupYes = Haj
|
||||
deletePopupCancel = Přetorhnyć
|
||||
deleteButtonHover
|
||||
.title = Zhašeć
|
||||
copyUrlHover
|
||||
.title = URL kopěrować
|
||||
deleteButtonHover = Zhašeć
|
||||
copyUrlHover = URL kopěrować
|
||||
footerLinkLegal = Prawniske
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Wo Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Tudjon meg többet
|
||||
uploadPageDropMessage = Dobja ide a fájljait, és kezdjen feltölteni
|
||||
uploadPageSizeMessage = A megbízható működés érdekében a legjobb, ha a fájlok 1 GB-nál kisebbek maradnak
|
||||
uploadPageBrowseButton = Válasszon egy fájlt a számítógépén
|
||||
.title = Válasszon egy fájlt a számítógépén
|
||||
uploadPageBrowseButton1 = Válassza ki a feltöltendő fájlt
|
||||
.title = Válassza ki a feltöltendő fájlt
|
||||
uploadPageMultipleFilesAlert = Több fájl vagy mappa feltöltése pillanatnyilag nem támogatott.
|
||||
uploadPageBrowseButtonTitle = Fájl feltöltése
|
||||
uploadingPageProgress = { $filename } ({ $size }) feltöltése
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Visszafejtés…
|
||||
notifyUploadDone = A feltöltése befejeződött.
|
||||
uploadingPageMessage = Ha a fájl feltöltésre került, akkor megadhatja a lejárati beállításokat.
|
||||
uploadingPageCancel = Feltöltés megszakítása
|
||||
.title = Feltöltés megszakítása
|
||||
uploadCancelNotification = A feltöltés megszakításra került.
|
||||
uploadingPageLargeFileMessage = Ez a fájl nagy, és a feltöltése eltarthat egy ideig. Türelmét kérjük!
|
||||
uploadingFileNotification = Értesítsen, ha a feltöltés elkészült.
|
||||
uploadSuccessConfirmHeader = Küldésre kész
|
||||
uploadSvgAlt
|
||||
.alt = Feltöltés
|
||||
uploadSvgAlt = Feltöltés
|
||||
uploadSuccessTimingHeader = A fájl hivatkozása lejár 1 letöltés vagy 24 óra múlva.
|
||||
copyUrlFormLabelWithName = Másolja és ossza meg a hivatkozást a fájl küldéséhez: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Vágólapra másolás
|
||||
.title = Vágólapra másolás
|
||||
copiedUrl = Másolva!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Fájl törlése
|
||||
.title = Fájl törlése
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Még egy fájl küldése
|
||||
.title = Még egy fájl küldése
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Letöltés
|
||||
downloadAltText = Letöltés
|
||||
downloadFileName = { $filename } letöltése
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Letöltés
|
||||
.title = Letöltés
|
||||
downloadNotification = A letöltés befejeződött.
|
||||
downloadFinish = A letöltés befejeződött
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } / { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Próbálja ki a Firefox Sendet
|
||||
.title = Próbálja ki a Firefox Sendet
|
||||
downloadingPageProgress = { $filename } letöltése ({ $size })
|
||||
downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja.
|
||||
errorAltText
|
||||
.alt = Feltöltési hiba
|
||||
errorAltText = Feltöltési hiba
|
||||
errorPageHeader = Hiba történt!
|
||||
errorPageMessage = Hiba történt a fájl feltöltésekor.
|
||||
errorPageLink = Még egy fájl küldése
|
||||
fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell legyen.
|
||||
linkExpiredAlt
|
||||
.alt = A hivatkozás lejárt
|
||||
linkExpiredAlt = A hivatkozás lejárt
|
||||
expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett!
|
||||
notSupportedHeader = A böngésző nem támogatott.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = A Firefox Send weboldal használatakor a Mozilla <a>Webhely
|
||||
deletePopupText = Törli ezt a fájlt?
|
||||
deletePopupYes = Igen
|
||||
deletePopupCancel = Mégse
|
||||
deleteButtonHover
|
||||
.title = Törlés
|
||||
copyUrlHover
|
||||
.title = URL másolása
|
||||
deleteButtonHover = Törlés
|
||||
copyUrlHover = URL másolása
|
||||
footerLinkLegal = Jogi információk
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = A Tesztpilóta névjegye
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
title = Firefox Send
|
||||
siteSubtitle = eksperimen web
|
||||
siteFeedback = Saran
|
||||
uploadPageHeader = Pribadi, Berbagi Berkas Terenskripsi
|
||||
uploadPageHeader = Pribadi, Berbagi Berkas Terenskripsi
|
||||
uploadPageExplainer = Kirim berkas melalui tautan yang aman, pribadi, dan terenkripsi yang secara otomatis kedaluwarsa untuk memastikan berkas Anda tidak daring selamanya.
|
||||
uploadPageLearnMore = Pelajari lebih lanjut
|
||||
uploadPageDropMessage = Lepas berkas Anda di sini untuk mulai mengunggah
|
||||
uploadPageSizeMessage = Untuk pengoperasian yang paling andal, sebaiknya jaga berkas Anda di bawah 1GB
|
||||
uploadPageBrowseButton = Pilih berkas pada komputer Anda
|
||||
.title = Pilih berkas pada komputer Anda
|
||||
uploadPageMultipleFilesAlert = Saat ini belum mendukung pengunggahan beberapa berkas atau folder.
|
||||
uploadPageBrowseButtonTitle = Unggah berkas
|
||||
uploadingPageHeader = Mengunggah Berkas Anda
|
||||
@@ -19,50 +18,37 @@ decryptingFile = Mendekripsi...
|
||||
notifyUploadDone = Unggahan Anda telah selesai.
|
||||
uploadingPageMessage = Setelah berkas diunggah, Anda dapat mengatur pilihan kedaluwarsa.
|
||||
uploadingPageCancel = Batal unggah
|
||||
.title = Batal unggah
|
||||
uploadCancelNotification = Unggahan Anda dibatalkan.
|
||||
uploadingPageLargeFileMessage = Berkas ini berukuran besar dan mungkin perlu beberapa saat untuk mengunggahnya. Silakan tunggu!
|
||||
uploadingFileNotification = Beri tahu saya ketika unggahan telah selesai.
|
||||
uploadSuccessConfirmHeader = Siap untuk Dikirim
|
||||
uploadSvgAlt
|
||||
.alt = Unggah
|
||||
uploadSvgAlt = Unggah
|
||||
uploadSuccessTimingHeader = Tautan ke berkas Anda akan berakhir setelah 1 unduhan atau dalam 24 jam.
|
||||
copyUrlFormLabelWithName = Salin dan bagikan tautan untuk mengirim berkas Anda: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Salin ke papan klip
|
||||
.title = Salin ke papan klip
|
||||
copiedUrl = Tersalin!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Hapus berkas
|
||||
.title = Hapus berkas
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Kirim berkas lain
|
||||
.title = Kirim berkas lain
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Unduh
|
||||
downloadAltText = Unduh
|
||||
downloadFileName = Unduh { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Teman Anda mengirimkan berkas dengan Firefox Send, layanan yang memungkinkan Anda berbagi berkas dengan tautan yang aman, pribadi, dan terenkripsi yang secara otomatis berakhir untuk memastikan berkas Anda tidak daring selamanya.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Unduh
|
||||
.title = Unduh
|
||||
downloadNotification = Unduhan Anda telah selesai.
|
||||
downloadFinish = Unduhan Selesai
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Coba Firefox Send
|
||||
.title = Coba Firefox Send
|
||||
downloadingPageProgress = Mengunduh { $filename } ({ $size })
|
||||
downloadingPageMessage = Sila biarkan tab ini terbuka sementara kami memproses berkas Anda dan mendekripsinya.
|
||||
errorAltText
|
||||
.alt = Unggahan bermasalah
|
||||
errorAltText = Unggahan bermasalah
|
||||
errorPageHeader = Terjadi kesalahan!
|
||||
errorPageMessage = Terjadi kesalahan saat mengunggah berkas.
|
||||
errorPageLink = Kirim berkas lain
|
||||
fileTooBig = Berkas terlalu besar untuk diunggah. Harus kurang dari { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Tautan kedaluwarsa
|
||||
linkExpiredAlt = Tautan kedaluwarsa
|
||||
expiredPageHeader = Tautan ini telah kedaluwarsa atau tidak pernah ada!
|
||||
notSupportedHeader = Peramban Anda tidak mendukung.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -83,10 +69,8 @@ legalNoticeMozilla = Penggunaan situs Firefox Send juga merupakan subyek dari <a
|
||||
deletePopupText = Hapus berkas ini?
|
||||
deletePopupYes = Ya
|
||||
deletePopupCancel = Batal
|
||||
deleteButtonHover
|
||||
.title = Hapus
|
||||
copyUrlHover
|
||||
.title = Salin URL
|
||||
deleteButtonHover = Hapus
|
||||
copyUrlHover = Salin URL
|
||||
footerLinkLegal = Legal
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Tentang Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Ulteriori informazioni
|
||||
uploadPageDropMessage = Trascina qui un file per caricarlo
|
||||
uploadPageSizeMessage = Per evitare problemi è consigliabile caricare file di dimensione inferiore a 1 GB
|
||||
uploadPageBrowseButton = Seleziona un file sul computer
|
||||
.title = Seleziona un file sul computer
|
||||
uploadPageBrowseButton1 = Seleziona un file da caricare
|
||||
.title = Seleziona un file da caricare
|
||||
uploadPageMultipleFilesAlert = Il caricamento di più file o cartelle non è attualmente supportato.
|
||||
uploadPageBrowseButtonTitle = Carica file
|
||||
uploadingPageProgress = Caricamento { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Decrittazione in corso…
|
||||
notifyUploadDone = Caricamento completato.
|
||||
uploadingPageMessage = È possibile impostare le opzioni di scadenza del file al termine del caricamento.
|
||||
uploadingPageCancel = Annulla caricamento
|
||||
.title = Annulla caricamento
|
||||
uploadCancelNotification = Caricamento annullato.
|
||||
uploadingPageLargeFileMessage = Si tratta di un file di grandi dimensioni e potrebbe richiedere un po' di tempo.
|
||||
uploadingFileNotification = Invia una notifica quando il caricamento è completato.
|
||||
uploadSuccessConfirmHeader = Pronto per l’invio
|
||||
uploadSvgAlt
|
||||
.alt = Carica
|
||||
uploadSvgAlt = Carica
|
||||
uploadSuccessTimingHeader = Il link al file scadrà dopo 1 download o in 24 ore.
|
||||
copyUrlFormLabelWithName = Copia e condividi il link per inviare il tuo file: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Copia negli appunti
|
||||
.title = Copia negli appunti
|
||||
copiedUrl = Copiato
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Elimina file
|
||||
.title = Elimina file
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Invia un altro file
|
||||
.title = Invia un altro file
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Scarica
|
||||
downloadAltText = Scarica
|
||||
downloadFileName = Scarica { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Scarica
|
||||
.title = Scarica
|
||||
downloadNotification = Download completato.
|
||||
downloadFinish = Download completato
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } di { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Prova Firefox Send
|
||||
.title = Prova Firefox Send
|
||||
downloadingPageProgress = Download in corso di { $filename } ({ $size })
|
||||
downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato.
|
||||
errorAltText
|
||||
.alt = Errore durante il caricamento
|
||||
errorAltText = Errore durante il caricamento
|
||||
errorPageHeader = Si è verificato un errore.
|
||||
errorPageMessage = Si è verificato un errore durante il caricamento del file.
|
||||
errorPageLink = Invia un altro file
|
||||
fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferiore a { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Link scaduto
|
||||
linkExpiredAlt = Link scaduto
|
||||
expiredPageHeader = Questo link è scaduto oppure non è mai esistito.
|
||||
notSupportedHeader = Il browser in uso non è supportato.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = L’utilizzo del sito di Firefox Send è soggetto all’<a>
|
||||
deletePopupText = Eliminare questo file?
|
||||
deletePopupYes = Sì
|
||||
deletePopupCancel = Annulla
|
||||
deleteButtonHover
|
||||
.title = Elimina
|
||||
copyUrlHover
|
||||
.title = Copia indirizzo
|
||||
deleteButtonHover = Elimina
|
||||
copyUrlHover = Copia indirizzo
|
||||
footerLinkLegal = Note legali
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Informazioni su Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = 詳しくはこちら
|
||||
uploadPageDropMessage = ここにファイルをドロップしてアップロードを開始
|
||||
uploadPageSizeMessage = 確実に処理できるよう、ファイルサイズは 1 GB 以下にすることを推奨します。
|
||||
uploadPageBrowseButton = コンピューター上のファイルを選択
|
||||
.title = コンピューター上のファイルを選択
|
||||
uploadPageBrowseButton1 = アップロードするファイルを選択
|
||||
.title = アップロードするファイルを選択
|
||||
uploadPageMultipleFilesAlert = 今のところ複数ファイルやフォルダーのアップロードには対応していません。
|
||||
uploadPageBrowseButtonTitle = ファイルをアップロード
|
||||
uploadingPageProgress = { $filename } ({ $size }) をアップロード中
|
||||
@@ -21,52 +19,39 @@ decryptingFile = 復号化中...
|
||||
notifyUploadDone = アップロードが完了しました。
|
||||
uploadingPageMessage = ファイルのアップロード完了後に期限を設定できます。
|
||||
uploadingPageCancel = アップロードを中止
|
||||
.title = アップロードを中止
|
||||
uploadCancelNotification = アップロードは中止されました。
|
||||
uploadingPageLargeFileMessage = このファイルは大きいのでアップロードに多少時間が掛かるかもしれません。しばらくお待ちください。
|
||||
uploadingFileNotification = アップロード完了時に通知を受け取る
|
||||
uploadSuccessConfirmHeader = 送信準備完了
|
||||
uploadSvgAlt
|
||||
.alt = アップロード
|
||||
uploadSvgAlt = アップロード
|
||||
uploadSuccessTimingHeader = ファイルへのリンクは、1 回ダウンロードされた後、もしくは 24 時間以内に期限切れとなります。
|
||||
copyUrlFormLabelWithName = ファイルを送信するにはこのリンクをコピー、共有してください: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = クリップボードへコピー
|
||||
.title = クリップボードへコピー
|
||||
copiedUrl = コピー完了!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = ファイルを削除
|
||||
.title = ファイルを削除
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = 他のファイルを送信
|
||||
.title = 他のファイルを送信
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = ダウンロード
|
||||
downloadAltText = ダウンロード
|
||||
downloadFileName = { $filename } をダウンロード
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。
|
||||
// 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 })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send を試す
|
||||
.title = Firefox Send を試す
|
||||
downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています
|
||||
downloadingPageMessage = ファイルの取得と復号化が完了するまでこのタブを開いたままにしておいてください。
|
||||
errorAltText
|
||||
.alt = アップロードエラー
|
||||
errorAltText = アップロードエラー
|
||||
errorPageHeader = 何か問題が発生しました。
|
||||
errorPageMessage = ファイルのアップロード中に問題が発生しました。
|
||||
errorPageLink = 他のファイルを送信
|
||||
fileTooBig = このファイルは大きすぎるためアップロードできません。上限は { $size } です。
|
||||
linkExpiredAlt
|
||||
.alt = リンク期限切れ
|
||||
linkExpiredAlt = リンク期限切れ
|
||||
expiredPageHeader = このリンクは期限切れとなったか元々存在していません。
|
||||
notSupportedHeader = お使いのブラウザーには対応していません。
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Firefox Send のサイトの利用には、Mozilla の <a>
|
||||
deletePopupText = このファイルを削除しますか?
|
||||
deletePopupYes = はい
|
||||
deletePopupCancel = キャンセル
|
||||
deleteButtonHover
|
||||
.title = 削除
|
||||
copyUrlHover
|
||||
.title = URL をコピー
|
||||
deleteButtonHover = 削除
|
||||
copyUrlHover = URL をコピー
|
||||
footerLinkLegal = 法的情報
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot について
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Issin ugar
|
||||
uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali
|
||||
uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ
|
||||
uploadPageBrowseButton = Fren afaylu sef uselkim-ik
|
||||
.title = Fren afaylu seg uselkim-ik
|
||||
uploadPageBrowseButton1 = Fren afaylu ad tazneḍ
|
||||
.title = Fren afaylu ad tazneḍ
|
||||
uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan.
|
||||
uploadPageBrowseButtonTitle = Sali ifuyla
|
||||
uploadingPageProgress = Tuzna n { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Azmek...
|
||||
notifyUploadDone = Asali n ufaylu yemmed.
|
||||
uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara.
|
||||
uploadingPageCancel = Sefsex asali
|
||||
.title = Safsex Asali
|
||||
uploadCancelNotification = Asali-ik yefsex.
|
||||
uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi!
|
||||
uploadingFileNotification = Lɣu-yid ticki yemmed usali.
|
||||
uploadSuccessConfirmHeader = Ihegga i walluy
|
||||
uploadSvgAlt
|
||||
.alt = Sali
|
||||
uploadSvgAlt = Sali
|
||||
uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen.
|
||||
copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Sers ɣef afus
|
||||
.title = Sers ɣef afus
|
||||
copiedUrl = Yenɣel!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Kkes afaylu
|
||||
.title = Kkes afaylu
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Azen afaylu-nniḍen
|
||||
.title = Azen afaylu-nniḍen
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Sider
|
||||
downloadAltText = Sider
|
||||
downloadFileName = Sider { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Sider
|
||||
.title = Sider
|
||||
downloadNotification = Asider-ik yemmed.
|
||||
downloadFinish = Asider yemmed
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } seg { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Ɛreḍ Firefox Send
|
||||
.title = Ɛreḍ Firefox Send
|
||||
downloadingPageProgress = Asider n { $filename } ({ $size })
|
||||
downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen.
|
||||
errorAltText
|
||||
.alt = Tuccḍa n tuzna
|
||||
errorAltText = Tuccḍa n tuzna
|
||||
errorPageHeader = Yella wayen yeḍran!
|
||||
errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu.
|
||||
errorPageLink = Azen afaylu-nniḍen
|
||||
fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Aseɣwen yemmut
|
||||
linkExpiredAlt = Aseɣwen yemmut
|
||||
expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara!
|
||||
notSupportedHeader = Iminig-ik ur ittusefrak ara
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n <a> ilugan tba
|
||||
deletePopupText = Kkes afaylu-agi?
|
||||
deletePopupYes = Ih
|
||||
deletePopupCancel = Sefsex
|
||||
deleteButtonHover
|
||||
.title = Kkes
|
||||
copyUrlHover
|
||||
.title = Nɣel URL.
|
||||
deleteButtonHover = Kkes
|
||||
copyUrlHover = Nɣel URL.
|
||||
footerLinkLegal = Usḍif
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Ɣef Test Pilot
|
||||
|
||||
@@ -8,7 +8,8 @@ uploadPageLearnMore = 더 알아보기
|
||||
uploadPageDropMessage = 파일을 끌어 놓아 업로드 시작
|
||||
uploadPageSizeMessage = 확실한 작동을 위해서, 파일의 크기가 1GB보다 작은 것이 좋음
|
||||
uploadPageBrowseButton = 컴퓨터의 파일을 선택
|
||||
.title = 컴퓨터의 파일을 선택
|
||||
uploadPageBrowseButton1 = 업로드 할 파일 선택
|
||||
.title = 업로드 할 파일 선택
|
||||
uploadPageMultipleFilesAlert = 여러 개의 파일 또는 폴더를 업로드하는 것은 현재로선 지원되지 않습니다.
|
||||
uploadPageBrowseButtonTitle = 파일 업로드
|
||||
uploadingPageProgress = { $filename } ({ $size }) 업로드 중
|
||||
@@ -19,52 +20,39 @@ decryptingFile = 복호화 중…
|
||||
notifyUploadDone = 업로드가 완료되었습니다.
|
||||
uploadingPageMessage = 파일이 업로드 되고나서 만료 옵션을 설정할 수 있습니다.
|
||||
uploadingPageCancel = 업로드 취소
|
||||
.title = 업로드 취소
|
||||
uploadCancelNotification = 업로드가 취소되었습니다.
|
||||
uploadingPageLargeFileMessage = 이 파일은 크기가 커서 시간이 다소 걸릴 수 있습니다. 잠시만 기다려주세요!
|
||||
uploadingFileNotification = 업로드가 완료되면 알림을 표시해 주세요.
|
||||
uploadSuccessConfirmHeader = 보낼 준비 완료
|
||||
uploadSvgAlt
|
||||
.alt = 업로드
|
||||
uploadSvgAlt = 업로드
|
||||
uploadSuccessTimingHeader = 이 파일의 링크는 한 번의 다운로드 후 또는 24시간이 지난 뒤에 만료됩니다.
|
||||
copyUrlFormLabelWithName = 파일을 보내기 위해 이 링크를 복사하고 공유하세요: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = 클립보드에 복사
|
||||
.title = 클립보드에 복사
|
||||
copiedUrl = 복사 완료!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = 파일 삭제
|
||||
.title = 파일 삭제
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = 다른 파일 보내기
|
||||
.title = 다른 파일 보내기
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = 다운로드
|
||||
downloadAltText = 다운로드
|
||||
downloadFileName = { $filename } 다운로드
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = 당신의 친구가 Firefox Send를 통해 파일을 보내고 있습니다. 이 서비스는 안전하고, 개인적이며, 암호화된 링크를 통해 파일을 공유하는 서비스입니다. 사용자의 파일이 더 이상 온라인 상에 남지 않도록 링크는 자동적으로 만료됩니다.
|
||||
// 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 })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send 써보기
|
||||
.title = Firefox Send 써보기
|
||||
downloadingPageProgress = { $filename } ({ $size }) 다운로드 중
|
||||
downloadingPageMessage = 파일을 가져오고 복호화하는 동안 탭을 닫지 말아주세요.
|
||||
errorAltText
|
||||
.alt = 업로드 오류
|
||||
errorAltText = 업로드 오류
|
||||
errorPageHeader = 오류가 발생했습니다!
|
||||
errorPageMessage = 파일을 업로드하는 도중 오류가 발생했습니다.
|
||||
errorPageLink = 다른 파일 보내기
|
||||
fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야 합니다.
|
||||
linkExpiredAlt
|
||||
.alt = 링크가 만료됨
|
||||
linkExpiredAlt = 링크가 만료됨
|
||||
expiredPageHeader = 이 링크는 만료되었거나 애초부터 존재하지 않았습니다!
|
||||
notSupportedHeader = 이 브라우저는 지원되지 않습니다.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -85,10 +73,8 @@ legalNoticeMozilla = 또한, Firefox Send 웹사이트 사용에는 <a>웹사이
|
||||
deletePopupText = 이 파일을 지우시겠습니까?
|
||||
deletePopupYes = 예
|
||||
deletePopupCancel = 아니오
|
||||
deleteButtonHover
|
||||
.title = 삭제
|
||||
copyUrlHover
|
||||
.title = URL 복사
|
||||
deleteButtonHover = 삭제
|
||||
copyUrlHover = URL 복사
|
||||
footerLinkLegal = 법적 정보
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Test Pilot 정보
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Ketahui selanjutnya
|
||||
uploadPageDropMessage = Letakkan fail anda di sini untuk mulakan memuat naik
|
||||
uploadPageSizeMessage = Untuk operasi yang paling selamat, lebih baik pastikan fail anda itu kurang 1GB
|
||||
uploadPageBrowseButton = Pilih fail dalam komputer anda
|
||||
.title = Pilih fail dalam komputer anda
|
||||
uploadPageBrowseButton1 = Pilih fail untuk dimuat naik
|
||||
.title = Pilih fail untuk dimuat naik
|
||||
uploadPageMultipleFilesAlert = Memuat naik pelbagai fail atau satu folder masih belum disokong.
|
||||
uploadPageBrowseButtonTitle = Muat naik fail
|
||||
uploadingPageProgress = Memuat naik { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Mengenkripsi...
|
||||
notifyUploadDone = Muat naik anda sudah siap.
|
||||
uploadingPageMessage = Setelah siap fail anda dimuat naik, akan boleh tetapkan pilihan luput.
|
||||
uploadingPageCancel = Batal muat naik
|
||||
.title = Batal muat naik
|
||||
uploadCancelNotification = Muat naik anda dibatalkan.
|
||||
uploadingPageLargeFileMessage = Fail ini besar dan mungkin mengambil masa untuk dimuat naik. Tunggu!
|
||||
uploadingFileNotification = Maklumkan saya apabila muat naik selesai.
|
||||
uploadSuccessConfirmHeader = Sedia untuk Hantar
|
||||
uploadSvgAlt
|
||||
.alt = Muat naik
|
||||
uploadSvgAlt = Muat naik
|
||||
uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam.
|
||||
copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Salin ke Klipbod
|
||||
.title = Salin ke Klipbod
|
||||
copiedUrl = Disalin!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Hapus fail
|
||||
.title = Hapus fail
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Buang Fail
|
||||
sendAnotherFileLink = Hantar fail lain
|
||||
.title = Hantar fail lain
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Muat turun
|
||||
downloadAltText = Muat turun
|
||||
downloadFileName = Muat turun { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Muat turun
|
||||
.title = Muat turun
|
||||
downloadNotification = Muat turun anda sudah siap.
|
||||
downloadFinish = Muat turun Selesai
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } daripada { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Cuba Firefox Send
|
||||
.title = Cuba Firefox Send
|
||||
downloadingPageProgress = Memuat turun { $filename } ({ $size })
|
||||
downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya.
|
||||
errorAltText
|
||||
.alt = Ralat memuat naik
|
||||
errorAltText = Ralat memuat naik
|
||||
errorPageHeader = Ada sesuatu yang tidak kena!
|
||||
errorPageMessage = Ada ralat semasa memuat naik fail.
|
||||
errorPageLink = Hantar fail lain
|
||||
fileTooBig = Fail terlalu besar untuk dimuat naik. Perlu kurang daripada { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Pautan sudah luput
|
||||
linkExpiredAlt = Pautan sudah luput
|
||||
expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud!
|
||||
notSupportedHeader = Pelayar anda tidak disokong.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -79,18 +64,16 @@ uploadedFile = Fail
|
||||
copyFileList = Salin URL
|
||||
// expiryFileList is used as a column header
|
||||
expiryFileList = Luput Pada
|
||||
deleteFileList = Hapus
|
||||
deleteFileList = Buang
|
||||
nevermindButton = Tak apalah
|
||||
legalHeader = Terma & Privasi
|
||||
legalNoticeTestPilot = Firefox Send adalah eksperimen Ujian Perintis, dan tertakluk kepada <a>Terma Perkhidmatan</a> dan <a>Privacy Notice</a> Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data <a>di sini</a>.
|
||||
legalNoticeMozilla = Penggunaan laman web Firefox Send juga tertakluk kepada <a>Notis Privasi Laman web</a> dan <a>Terma Penggunaan Laman web</a> Mozilla.
|
||||
deletePopupText = Hapus fail ini?
|
||||
deletePopupText = Buang fail ini?
|
||||
deletePopupYes = Ya
|
||||
deletePopupCancel = Batal
|
||||
deleteButtonHover
|
||||
.title = Hapus
|
||||
copyUrlHover
|
||||
.title = Salin URL
|
||||
deleteButtonHover = Buang
|
||||
copyUrlHover = Salin URL
|
||||
footerLinkLegal = Perundangan
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Perihal Ujian Perintis
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Les mer
|
||||
uploadPageDropMessage = Slipp din fil her for å starte opplastingen
|
||||
uploadPageSizeMessage = For den mest problemfrie bruken, er det best å holde filen under 1 GB
|
||||
uploadPageBrowseButton = Velg en fil på din datamaskin
|
||||
.title = Velg en fil på din datamaskin
|
||||
uploadPageBrowseButton1 = Velg en fil til å laste opp
|
||||
.title = Velg en fil til å laste opp
|
||||
uploadPageMultipleFilesAlert = Opplasting av flere filer eller en mappe støttes ikke for øyeblikket.
|
||||
uploadPageBrowseButtonTitle = Last opp fil
|
||||
uploadingPageProgress = Laster opp { $filename } ({ $size })
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Dekrypterer...
|
||||
notifyUploadDone = Opplastingen din er ferdig.
|
||||
uploadingPageMessage = Når filopplastingen din er ferdig, kan du angi utløpsalternativer.
|
||||
uploadingPageCancel = Avbryt opplasting
|
||||
.title = Avbryt opplasting
|
||||
uploadCancelNotification = Din opplasting ble avbrutt
|
||||
uploadingPageLargeFileMessage = Denne filen er stor, og det kan ta litt tid å laste opp. Vent litt!
|
||||
uploadingFileNotification = Varsle meg når opplastingen er ferdig.
|
||||
uploadSuccessConfirmHeader = Klar til å sende
|
||||
uploadSvgAlt
|
||||
.alt = Last opp
|
||||
uploadSvgAlt = Last opp
|
||||
uploadSuccessTimingHeader = Lenken til filen din utløper etter 1 nedlasting eller om 24 timer.
|
||||
copyUrlFormLabelWithName = Kopier og del linken for å sende filen: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopier til utklippstavle
|
||||
.title = Kopier til utklippstavle
|
||||
copiedUrl = Kopiert!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Slett fil
|
||||
.title = Slett fil
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Send en annen fil
|
||||
.title = Send en annen fil
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Last ned
|
||||
downloadAltText = Last ned
|
||||
downloadFileName = Last ned { $filename }
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Last ned
|
||||
.title = Last ned
|
||||
downloadNotification = Nedlastingen er fullført.
|
||||
downloadFinish = Nedlastingen er fullført.
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } av { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Prøv Firefox Send
|
||||
.title = Prøv Firefox Send
|
||||
downloadingPageProgress = Laster ned { $filename } ({ $size })
|
||||
downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den.
|
||||
errorAltText
|
||||
.alt = Opplastingsfeil
|
||||
errorAltText = Opplastingsfeil
|
||||
errorPageHeader = Det oppstod en feil.
|
||||
errorPageMessage = Det har oppstått en feil under opplasting av filen.
|
||||
errorPageLink = Send en annen fil
|
||||
fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Lenke utløpt
|
||||
linkExpiredAlt = Lenke utløpt
|
||||
expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet!
|
||||
notSupportedHeader = Din nettleser er ikke støttet.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Bruk av Firefox Send-nettsiden er også underlagt Mozillas
|
||||
deletePopupText = Slette denne filen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Avbryt
|
||||
deleteButtonHover
|
||||
.title = Slett
|
||||
copyUrlHover
|
||||
.title = Kopier URL
|
||||
deleteButtonHover = Slett
|
||||
copyUrlHover = Kopier URL
|
||||
footerLinkLegal = Juridisk informasjon
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Om Test Pilot
|
||||
|
||||
@@ -8,9 +8,7 @@ uploadPageLearnMore = Meer info
|
||||
uploadPageDropMessage = Sleep uw bestand hiernaartoe om het te uploaden
|
||||
uploadPageSizeMessage = Voor de meest betrouwbare werking kunt u uw bestand het beste onder de 1 GB houden
|
||||
uploadPageBrowseButton = Selecteer een bestand op uw computer
|
||||
.title = Selecteer een bestand op uw computer
|
||||
uploadPageBrowseButton1 = Selecteer een bestand om te uploaden
|
||||
.title = Selecteer een bestand om te uploaden
|
||||
uploadPageMultipleFilesAlert = Het uploaden van meerdere bestanden of een map wordt momenteel niet ondersteund.
|
||||
uploadPageBrowseButtonTitle = bestand uploaden
|
||||
uploadingPageProgress = { $filename } ({ $size }) wordt geüpload
|
||||
@@ -21,52 +19,39 @@ decryptingFile = Ontcijferen…
|
||||
notifyUploadDone = Uw upload is voltooid.
|
||||
uploadingPageMessage = Zodra uw bestand wordt geüpload, kunt u vervalopties instellen.
|
||||
uploadingPageCancel = Uploaden annuleren
|
||||
.title = Uploaden annuleren
|
||||
uploadCancelNotification = Uw upload is geannuleerd.
|
||||
uploadingPageLargeFileMessage = Dit bestand is groot en het uploaden kan even duren. Even geduld…
|
||||
uploadingFileNotification = Mij waarschuwen zodra het uploaden is voltooid
|
||||
uploadSuccessConfirmHeader = Gereed voor verzending
|
||||
uploadSvgAlt
|
||||
.alt = Uploaden
|
||||
uploadSvgAlt = Uploaden
|
||||
uploadSuccessTimingHeader = De koppeling naar uw bestand zal na 1 download of 24 uur verlopen.
|
||||
copyUrlFormLabelWithName = Kopieer en deel de koppeling om uw bestand te verzenden: { $filename }
|
||||
// Note: Title text for button should be the same.
|
||||
copyUrlFormButton = Kopiëren naar klembord
|
||||
.title = Kopiëren naar klembord
|
||||
copiedUrl = Gekopieerd!
|
||||
// Note: Title text for button should be the same.
|
||||
deleteFileButton = Bestand verwijderen
|
||||
.title = Bestand verwijderen
|
||||
// Note: Title text for button should be the same.
|
||||
sendAnotherFileLink = Nog een bestand verzenden
|
||||
.title = Nog een bestand verzenden
|
||||
// Alternative text used on the download link/button (indicates an action).
|
||||
downloadAltText
|
||||
.alt = Downloaden
|
||||
downloadAltText = Downloaden
|
||||
downloadFileName = { $filename } downloaden
|
||||
downloadFileSize = ({ $size })
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
downloadMessage = Uw vriend(in) stuurt u een bestand met Firefox Send, een dienst waarmee u bestanden kunt verzenden met een veilige, private en versleutelde koppeling die automatisch verloopt, zodat u zeker weet dat uw zaken niet onbeperkt online blijven.
|
||||
// Text and title used on the download link/button (indicates an action).
|
||||
downloadButtonLabel = Downloaden
|
||||
.title = Downloaden
|
||||
downloadNotification = Uw download is voltooid.
|
||||
downloadFinish = Downloaden voltooid
|
||||
// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)".
|
||||
fileSizeProgress = ({ $partialSize } van { $totalSize })
|
||||
// Firefox Send is a brand name and should not be localized. Title text for button should be the same.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
sendYourFilesLink = Firefox Send proberen
|
||||
.title = Firefox Send proberen
|
||||
downloadingPageProgress = { $filename } ({ $size }) wordt gedownload
|
||||
downloadingPageMessage = Laat dit tabblad geopend terwijl uw bestand wordt opgehaald en ontcijferd.
|
||||
errorAltText
|
||||
.alt = Uploadfout
|
||||
errorAltText = Uploadfout
|
||||
errorPageHeader = Er is iets misgegaan!
|
||||
errorPageMessage = Er is een fout opgetreden bij het uploaden van het bestand.
|
||||
errorPageLink = Nog een bestand verzenden
|
||||
fileTooBig = Dat bestand is te groot om te worden geüpload. Het moet kleiner zijn dan { $size }.
|
||||
linkExpiredAlt
|
||||
.alt = Koppeling verlopen
|
||||
linkExpiredAlt = Koppeling verlopen
|
||||
expiredPageHeader = Deze koppeling is verlopen of heeft überhaupt nooit bestaan!
|
||||
notSupportedHeader = Uw browser wordt niet ondersteund.
|
||||
// Firefox Send is a brand name and should not be localized.
|
||||
@@ -87,10 +72,8 @@ legalNoticeMozilla = Gebruik van de Firefox Send-website is ook onderhevig aan d
|
||||
deletePopupText = Dit bestand verwijderen?
|
||||
deletePopupYes = Ja
|
||||
deletePopupCancel = Annuleren
|
||||
deleteButtonHover
|
||||
.title = Verwijderen
|
||||
copyUrlHover
|
||||
.title = URL kopiëren
|
||||
deleteButtonHover = Verwijderen
|
||||
copyUrlHover = URL kopiëren
|
||||
footerLinkLegal = Juridisch
|
||||
// Test Pilot is a proper name and should not be localized.
|
||||
footerLinkAbout = Over Test Pilot
|
||||
|
||||